Compare commits

...

3 Commits

11 changed files with 310 additions and 31 deletions

View File

@ -59,6 +59,30 @@ bool MAX3010X_soft_reset(void)
return i2c_write_reg(MAX3010X_I2C_ADDR, MAX3010X_MODE_CFG_REG, data);
}
bool MAX3010X_shutdown(void)
{
uint8_t data;
if(!i2c_read_reg(MAX3010X_I2C_ADDR, MAX3010X_MODE_CFG_REG, &data)) return false;
// We set the shutdown bit and write the data back to the register
data |= 1 << MAX3010X_MODE_CFG_SHDN_BIT_POS;
return i2c_write_reg(MAX3010X_I2C_ADDR, MAX3010X_MODE_CFG_REG, data);
}
bool MAX3010X_wakeup(void)
{
uint8_t data;
if(!i2c_read_reg(MAX3010X_I2C_ADDR, MAX3010X_MODE_CFG_REG, &data)) return false;
// We clear the shutdown bit and write the data back to the register
data &= ~(1 << MAX3010X_MODE_CFG_SHDN_BIT_POS);
return i2c_write_reg(MAX3010X_I2C_ADDR, MAX3010X_MODE_CFG_REG, data);
}
bool MAX3010X_set_FIFO_average(MAX3010X_Sample_Average_e sampleAverage)
{
uint8_t data;
@ -84,6 +108,112 @@ bool MAX3010X_enable_FIFO_rollover(bool enabled)
return i2c_write_reg(MAX3010X_I2C_ADDR, MAX3010X_FIFO_CFG_REG, data);
}
bool MAX3010X_set_LED_mode(MAX3010X_LED_Mode_e LEDMode)
{
uint8_t data;
if(!i2c_read_reg(MAX3010X_I2C_ADDR, MAX3010X_MODE_CFG_REG, &data)) return false;
data &= 0xF8;
data |= LEDMode;
return i2c_write_reg(MAX3010X_I2C_ADDR, MAX3010X_MODE_CFG_REG, data);
}
bool MAX3010X_set_ADC_range(MAX3010X_ADC_Range_e ADCRange)
{
uint8_t data;
if(!i2c_read_reg(MAX3010X_I2C_ADDR, MAX3010X_SPO2_CFG_REG, &data)) return false;
data &= 0x9F;
data |= ADCRange << 5;
return i2c_write_reg(MAX3010X_I2C_ADDR, MAX3010X_SPO2_CFG_REG, data);
}
bool MAX3010X_set_sample_rate(MAX3010X_Sample_Rate_e sampleRate)
{
uint8_t data;
if(!i2c_read_reg(MAX3010X_I2C_ADDR, MAX3010X_SPO2_CFG_REG, &data)) return false;
data &= 0xE3;
data |= sampleRate << 2;
return i2c_write_reg(MAX3010X_I2C_ADDR, MAX3010X_SPO2_CFG_REG, data);
}
bool MAX3010X_set_pulse_width(MAX3010X_LED_Pulse_Width_e LEDPulseWidth)
{
uint8_t data;
if(!i2c_read_reg(MAX3010X_I2C_ADDR, MAX3010X_SPO2_CFG_REG, &data)) return false;
data &= 0xFC;
data |= LEDPulseWidth;
return i2c_write_reg(MAX3010X_I2C_ADDR, MAX3010X_SPO2_CFG_REG, data);
}
bool MAX3010X_set_pulse_amplitude_red(uint8_t powerLevel)
{
return i2c_write_reg(MAX3010X_I2C_ADDR, MAX3010X_LED1_PULSE_AMP_REG, powerLevel);
}
bool MAX3010X_set_pulse_amplitude_IR(uint8_t powerLevel)
{
return i2c_write_reg(MAX3010X_I2C_ADDR, MAX3010X_LED2_PULSE_AMP_REG, powerLevel);
}
bool MAX3010X_set_multi_LED_mode_slot(uint8_t slot, MAX3010X_SLOT_LED_e slotLED)
{
uint8_t data;
switch(slot)
{
case 1:
if(!i2c_read_reg(MAX3010X_I2C_ADDR, MAX3010X_MULTI_LED_MODE_CTRL_SLOT1_2_REG, &data)) return false;
data &= 0xF8;
data |= slotLED;
return i2c_write_reg(MAX3010X_I2C_ADDR, MAX3010X_MULTI_LED_MODE_CTRL_SLOT1_2_REG, data);
case 2:
if(!i2c_read_reg(MAX3010X_I2C_ADDR, MAX3010X_MULTI_LED_MODE_CTRL_SLOT1_2_REG, &data)) return false;
data &= 0x8F;
data |= slotLED << 4;
return i2c_write_reg(MAX3010X_I2C_ADDR, MAX3010X_MULTI_LED_MODE_CTRL_SLOT1_2_REG, data);
case 3:
if(!i2c_read_reg(MAX3010X_I2C_ADDR, MAX3010X_MULTI_LED_MODE_CTRL_SLOT3_4_REG, &data)) return false;
data &= 0xF8;
data |= slotLED;
return i2c_write_reg(MAX3010X_I2C_ADDR, MAX3010X_MULTI_LED_MODE_CTRL_SLOT3_4_REG, data);
case 4:
if(!i2c_read_reg(MAX3010X_I2C_ADDR, MAX3010X_MULTI_LED_MODE_CTRL_SLOT3_4_REG, &data)) return false;
data &= 0x8F;
data |= slotLED << 4;
return i2c_write_reg(MAX3010X_I2C_ADDR, MAX3010X_MULTI_LED_MODE_CTRL_SLOT3_4_REG, data);
default:
return false;
}
}
bool MAX3010X_clear_FIFO(void)
{
if(!i2c_write_reg(MAX3010X_I2C_ADDR, MAX3010X_FIFO_WR_PTR_REG, 0x00)) return false;
if(!i2c_write_reg(MAX3010X_I2C_ADDR, MAX3010X_FIFO_OVERFLOW_CNT_REG, 0x00)) return false;
if(!i2c_write_reg(MAX3010X_I2C_ADDR, MAX3010X_FIFO_RD_PTR_REG, 0x00)) return false;
return true;
}
bool MAX3010X_configure(uint8_t powerLevel, MAX3010X_Sample_Average_e sampleAverage, MAX3010X_LED_Mode_e LEDMode, MAX3010X_Sample_Rate_e sampleRate, MAX3010X_LED_Pulse_Width_e LEDPulseWidth, MAX3010X_ADC_Range_e ADCRange)
{
if(!MAX3010X_soft_reset()) return false;
@ -92,5 +222,24 @@ bool MAX3010X_configure(uint8_t powerLevel, MAX3010X_Sample_Average_e sampleAver
if(!MAX3010X_enable_FIFO_rollover(true)) return false;
if(!MAX3010X_set_LED_mode(LEDMode)) return false;
if(!MAX3010X_set_ADC_range(ADCRange)) return false;
if(!MAX3010X_set_sample_rate(sampleRate)) return false;
if(!MAX3010X_set_pulse_width(LEDPulseWidth)) return false;
if(!MAX3010X_set_pulse_amplitude_red(powerLevel)) return false;
if(!MAX3010X_set_pulse_amplitude_IR(powerLevel)) return false;
if(!MAX3010X_set_multi_LED_mode_slot(1, MAX3010X_SLOT_LED_RED)) return false;
if(LEDMode > MAX3010X_LED_MODE_RED_ONLY)
if(!MAX3010X_set_multi_LED_mode_slot(2, MAX3010X_SLOT_LED_IR)) return false;
if(!MAX3010X_clear_FIFO()) return false;
return true;
}

View File

@ -46,6 +46,13 @@ typedef enum MAX3010X_ADC_Range
MAX3010X_ADC_RANGE_16384 = 0x03,
} MAX3010X_ADC_Range_e;
typedef enum MAX3010X_SLOT_LED
{
MAX3010X_SLOT_LED_NONE = 0x00,
MAX3010X_SLOT_LED_RED = 0x01,
MAX3010X_SLOT_LED_IR = 0x02,
} MAX3010X_SLOT_LED_e;
/**
* @brief Initializes the MAX3010X sensor. This must be called before any other API functions.
@ -58,10 +65,30 @@ bool MAX3010X_init(void);
bool MAX3010X_soft_reset(void);
bool MAX3010X_shutdown(void);
bool MAX3010X_wakeup(void);
bool MAX3010X_set_FIFO_average(MAX3010X_Sample_Average_e sampleAverage);
bool MAX3010X_enable_FIFO_rollover(bool enabled);
bool MAX3010X_set_LED_mode(MAX3010X_LED_Mode_e LEDMode);
bool MAX3010X_set_ADC_range(MAX3010X_ADC_Range_e ADCRange);
bool MAX3010X_set_sample_rate(MAX3010X_Sample_Rate_e sampleRate);
bool MAX3010X_set_pulse_width(MAX3010X_LED_Pulse_Width_e LEDPulseWidth);
bool MAX3010X_set_pulse_amplitude_red(uint8_t powerLevel);
bool MAX3010X_set_pulse_amplitude_IR(uint8_t powerLevel);
bool MAX3010X_set_multi_LED_mode_slot(uint8_t slot, MAX3010X_SLOT_LED_e slotLED);
bool MAX3010X_clear_FIFO(void);
bool MAX3010X_configure(uint8_t powerLevel, MAX3010X_Sample_Average_e sampleAverage, MAX3010X_LED_Mode_e LEDMode, MAX3010X_Sample_Rate_e sampleRate, MAX3010X_LED_Pulse_Width_e LEDPulseWidth, MAX3010X_ADC_Range_e ADCRange);
#endif //MAX3010X_H

View File

@ -349,7 +349,7 @@ void altimeter_screen_create(AltimeterScreen_t * const altimeterScreen)
}
altimeterScreen->display = lv_obj_create(NULL);
lv_obj_set_style_bg_color(altimeterScreen->display, lv_color_make(0xFF,0xFF,0xFF), LV_PART_MAIN);/*
lv_obj_set_style_bg_color(altimeterScreen->display, lv_color_white(), LV_PART_MAIN);/*
lv_obj_set_style_radius(altimeterScreen->display, LV_RADIUS_CIRCLE, LV_PART_MAIN);*/
if(altimeterScreen->inner_circle)

View File

@ -127,7 +127,7 @@ void find_my_phone_screen_create(FindMyPhoneScreen_t * const findMyPhoneScreen)
findMyPhoneScreen->display = NULL;
}
findMyPhoneScreen->display = lv_obj_create(NULL);
lv_obj_set_style_bg_color(findMyPhoneScreen->display, lv_color_make(0xFF,0xFF,0xFF), LV_PART_MAIN);
lv_obj_set_style_bg_color(findMyPhoneScreen->display, lv_color_white(), LV_PART_MAIN);
if(findMyPhoneScreen->innerCircle)
{
@ -138,7 +138,7 @@ void find_my_phone_screen_create(FindMyPhoneScreen_t * const findMyPhoneScreen)
findMyPhoneScreen->innerCircle = lv_obj_create(findMyPhoneScreen->display);
lv_obj_center(findMyPhoneScreen->innerCircle);
lv_obj_set_size(findMyPhoneScreen->innerCircle, 240, 240);
lv_obj_set_style_bg_color(findMyPhoneScreen->innerCircle, lv_color_make(0xFF,0xFF,0xFF), LV_PART_MAIN);
lv_obj_set_style_bg_color(findMyPhoneScreen->innerCircle, lv_color_white(), LV_PART_MAIN);
lv_obj_set_style_radius(findMyPhoneScreen->innerCircle, LV_RADIUS_CIRCLE, LV_PART_MAIN);
lv_obj_set_style_border_width(findMyPhoneScreen->innerCircle, 15, LV_PART_MAIN);

View File

@ -31,6 +31,6 @@ void find_my_phone_screen_notify_BLE_connection_state(FindMyPhoneScreen_t * cons
void find_my_phone_screen_create(FindMyPhoneScreen_t * const findMyPhoneScreen);
void find_my__phone_screen_destroy(FindMyPhoneScreen_t * const findMyPhoneScreen);
void find_my_phone_screen_destroy(FindMyPhoneScreen_t * const findMyPhoneScreen);
#endif //FIND_PHONE_SCREEN_H

View File

@ -21,6 +21,7 @@
#include "compass_screen.h"
#include "altimeter_screen.h"
#include "find_my_phone_screen.h"
#include "music_player_screen.h"
/*********************
@ -79,6 +80,7 @@ CompassScreen_t compassScreen;
SettingsScreen_t settingsScreen;
AltimeterScreen_t altimeterScreen;
FindMyPhoneScreen_t findMyPhoneScreen;
MusicPlayerScreen_t musicPlayerScreen;
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int nCmdShow)
{
@ -108,6 +110,7 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLi
find_my_phone_screen_init(&findMyPhoneScreen);
find_my_phone_screen_register_BLE_command_send_cb(&findMyPhoneScreen, &(sendMyFindPhoneBLECommandCb));
find_my_phone_screen_notify_BLE_connection_state(&findMyPhoneScreen, true);
music_player_screen_init(&musicPlayerScreen);
altimeter_screen_register_measurement_cb(&altimeterScreen, &(alti_meas_cb));

View File

@ -6,6 +6,7 @@
#include "compass_screen.h"
#include "altimeter_screen.h"
#include "find_my_phone_screen.h"
#include "music_player_screen.h"
#define array_size(array) (sizeof(array)/sizeof(array[0]))
@ -25,6 +26,12 @@ static void menu_item_cb(lv_event_t *e)
}
break;
case 2:
{
extern MusicPlayerScreen_t musicPlayerScreen;
music_player_screen_create(&musicPlayerScreen);
//lv_scr_load_anim(watchFace.display, LV_SCR_LOAD_ANIM_FADE_ON, 400, 0, true);
lv_scr_load_anim(musicPlayerScreen.display, LV_SCR_LOAD_ANIM_MOVE_LEFT, 400, 0, true);
}
break;
case 3:
{
@ -142,7 +149,7 @@ void menu_screen_create(MenuScreen_t * const menuScreen)
common_screen_header_component(menuScreen->display, "Menu", 50);
lv_obj_t *scroll_item_container = lv_obj_create(menuScreen->display);
lv_obj_set_style_bg_color(scroll_item_container, lv_color_make(0xFF,0xFF,0xFF), LV_PART_MAIN);
lv_obj_set_style_bg_color(scroll_item_container, lv_color_white(), LV_PART_MAIN);
lv_obj_set_size(scroll_item_container, lv_pct(100), 240-50);
lv_obj_set_pos(scroll_item_container, 0, 50);
lv_obj_set_style_pad_all(scroll_item_container, 0, LV_PART_MAIN);

View File

@ -1 +0,0 @@
#include "music_control_screen.h"

View File

@ -1,25 +0,0 @@
#ifndef MUSIC_CONTROL_SCREEN_H
#define MUSIC_CONTROL_SCREEN_H
#include "lvgl.h"
typedef void (*SendMusicPlaybackCtrlCb_t)(void);
typedef struct MusicControlScreen
{
//Can be erased attributes
lv_obj_t *display;
//Should not be erased attributes
} MusicControlScreen_t;
void music_control_screen_init(MusicControlScreen_t * const musicControlScreen);
void music_control_screen_register_BLE_command_send_cb(MusicControlScreen_t * const musicControlScreen, SendMusicPlaybackCtrlCb_t sendMusicPlaybackCtrlCb);
void music_control_screen_set_playing_music_title(MusicControlScreen_t * const musicControlScreen, const char *title);
void music_control_screen_create(MusicControlScreen_t * const musicControlScreen);
void music_control_screen_destroy(MusicControlScreen_t * const musicControlScreen);
#endif // MUSIC_CONTROL_SCREEN_H

View File

@ -0,0 +1,93 @@
#include "music_player_screen.h"
#include "menu_screen.h"
static void gesture_event_cb(lv_event_t *e)
{
MusicPlayerScreen_t *musicPlayerScreen = e->user_data;
lv_dir_t gesture;
switch(gesture = lv_indev_get_gesture_dir(lv_indev_get_act()))
{
case LV_DIR_LEFT:
LV_LOG_USER("GESTURE : LEFT");
break;
case LV_DIR_RIGHT:
LV_LOG_USER("GESTURE : RIGHT");
// We create the menu screen and switch to it
extern MenuScreen_t menuScreen;
menu_screen_create(&menuScreen);
lv_scr_load_anim(menuScreen.display, LV_SCR_LOAD_ANIM_MOVE_RIGHT, 400, 0, true);
break;
case LV_DIR_TOP:
LV_LOG_USER("GESTURE : TOP");
break;
case LV_DIR_BOTTOM:
LV_LOG_USER("GESTURE : BOTTOM");
break;
default:
LV_LOG_USER("GESTURE : %u", gesture);
}
}
static void cleanup_event_cb(lv_event_t *e)
{
MusicPlayerScreen_t *musicPlayerScreen = e->user_data;
music_player_screen_destroy(musicPlayerScreen);
LV_LOG_USER("cleanup");
}
void music_player_screen_init(MusicPlayerScreen_t * const musicPlayerScreen)
{
if(!musicPlayerScreen)
{
LV_LOG_ERROR("NULL pointer given !");
return;
}
memset(musicPlayerScreen, 0, sizeof(MusicPlayerScreen_t));
}
void music_player_screen_register_music_playback_control_cb(MusicPlayerScreen_t * const musicPlayerScreen, MusicPlaybackCtrlCb_t musicPlaybackCtrlCb)
{
if(!musicPlayerScreen)
{
LV_LOG_ERROR("NULL pointer given !");
return;
}
musicPlayerScreen->musicPlaybackCtrlCb = musicPlaybackCtrlCb;
}
void music_player_screen_create(MusicPlayerScreen_t * const musicPlayerScreen)
{
if(!musicPlayerScreen)
{
LV_LOG_ERROR("NULL pointer given !");
return;
}
if(musicPlayerScreen->display)
{
LV_LOG_ERROR("display should be NULL here !");
lv_obj_del(musicPlayerScreen->display);
musicPlayerScreen->display = NULL;
}
musicPlayerScreen->display = lv_obj_create(NULL);
lv_obj_set_style_bg_color(musicPlayerScreen->display, lv_color_black(), LV_PART_MAIN);
//We register the event callback to handle gestures
lv_obj_add_event_cb(musicPlayerScreen->display, &(gesture_event_cb), LV_EVENT_GESTURE, musicPlayerScreen);
//We register the event callback to handle the cleanup
lv_obj_add_event_cb(musicPlayerScreen->display, &(cleanup_event_cb), LV_EVENT_DELETE, musicPlayerScreen);
}
void music_player_screen_destroy(MusicPlayerScreen_t * const musicPlayerScreen)
{
if(!musicPlayerScreen)
{
LV_LOG_ERROR("NULL pointer given !");
return;
}
memset(musicPlayerScreen, 0, offsetof(MusicPlayerScreen_t, musicPlaybackCtrlCb));
}

View File

@ -0,0 +1,26 @@
#ifndef MUSIC_PLAYER_SCREEN_H
#define MUSIC_PLAYER_SCREEN_H
#include "lvgl.h"
typedef void (*MusicPlaybackCtrlCb_t)(void);
typedef struct MusicPlayerScreen
{
//Can be erased attributes
lv_obj_t *display;
//Should not be erased attributes
MusicPlaybackCtrlCb_t musicPlaybackCtrlCb;
} MusicPlayerScreen_t;
void music_player_screen_init(MusicPlayerScreen_t * const musicPlayerScreen);
void music_player_screen_register_music_playback_control_cb(MusicPlayerScreen_t * const musicPlayerScreen, MusicPlaybackCtrlCb_t musicPlaybackCtrlCb);
void music_player_screen_set_playing_music_title(MusicPlayerScreen_t * const musicPlayerScreen, const char *title);
void music_player_screen_create(MusicPlayerScreen_t * const musicPlayerScreen);
void music_player_screen_destroy(MusicPlayerScreen_t * const musicPlayerScreen);
#endif // MUSIC_PLAYER_SCREEN_H