Compare commits

...

11 Commits

Author SHA1 Message Date
anschrammh
1859f31275 Updated lvgl simulation files 2023-04-20 13:16:51 +02:00
anschrammh
13b3ecfacf Changed log write frequency 2023-04-20 13:16:03 +02:00
anschrammh
17d8c9949d Added new data to save to flash and new accessor functions, work is still in progress ! 2023-04-20 13:15:15 +02:00
anschrammh
ef0abe0ab7 Added new informations in the about section (raw magnetometer data, raw pressure and temperature and more). 2023-04-20 13:14:05 +02:00
anschrammh
fcc152f64d Changed some core logic, now sending the watch's battery information when connected every 5 minutes to the phone so that gadget bridge can draw and update the battery graph. Added annd implemented a few callbacks used by the watch_settings screen 2023-04-20 13:13:06 +02:00
anschrammh
552644a412 Minor date number placement rework 2023-04-20 13:09:51 +02:00
anschrammh
5ea4d8fb38 Re enabled the tick hook function in FreeRTOS used by the millis function 2023-04-20 13:09:28 +02:00
anschrammh
5f7ac5a1d1 Introduced a new event which can be passed to the calling application : BLE_SERVICE_MODE_UNSUBSCRIBED, added a function to the API allowing to set the battery service level (still need to check if a device is subscribed to the characteristic to send the new value ot it). 2023-04-20 13:08:23 +02:00
anschrammh
03f86ea483 Finished to implement the millis api? It uses the FreeRTOS tick hook function to keep track of running time. 2023-04-20 13:01:50 +02:00
anschrammh
2df2f332bf Exposed the magnetometer's internal temperature sensor reading. It is not precise and not accurate, but interesting 2023-04-20 12:57:44 +02:00
anschrammh
8ea47fb03c Added description comment 2023-04-20 12:56:05 +02:00
17 changed files with 316 additions and 65 deletions

View File

@ -99,6 +99,10 @@
#define VIBRATION_MOTOR_ENABLE WM_IO_PB_00
#define VIBRATION_MOTOR_PWM_CHANNEL (0)
/**
* @brief BLE advertised device name
*
*/
#define BLE_DEVICE_NAME "MDBT42Q_W800SW"
#endif //APP_CONFIG_H

View File

@ -397,6 +397,11 @@ QMC5883L_MData_t watch_peripherals_magnetometer_raw_data_read(void)
return QMC5883L_get_MFields_raw();
}
float watch_peripherals_magnetometer_temperature_read()
{
return QMC5883L_get_temperature();
}
bool watch_peripherals_magnetometer_power_mode_set(QMC5883L_Mode_Control_e mode_control)
{
return QMC5883L_set_power_mode(mode_control);
@ -447,7 +452,7 @@ static BMA4_INTF_RET_TYPE _bma4_i2c_write(uint8_t reg_addr, const uint8_t *read_
return !i2c_write(dev_address, reg_addr, read_data, len);
}
// TODO: Rework the delay_us function to rather use a timer and have real µs resolution and not ms ...
static void _bma4_delay_us(uint32_t period, void *intf_ptr)
{
(void) intf_ptr;

View File

@ -129,6 +129,8 @@ uint16_t watch_peripherals_magnetometer_azimuth_read(bool *is_data_available);
QMC5883L_MData_t watch_peripherals_magnetometer_raw_data_read(void);
float watch_peripherals_magnetometer_temperature_read();
bool watch_peripherals_magnetometer_power_mode_set(QMC5883L_Mode_Control_e mode_control);
bool watch_peripherals_pressure_sensor_init(void);

View File

@ -3,6 +3,12 @@
static uint32_t _elapsed_ms = 0;
void vApplicationTickHook(void)
{
/* One tick is 2 ms because configTICK_RATE_HZ = 500. */
_elapsed_ms += 2;
}
void us_delay(uint32_t us)
{
struct tls_timer_cfg timer_config =
@ -55,6 +61,11 @@ void ms_delay(uint32_t ms)
tls_timer_destroy(timer_id);
}
void ms_increment(uint32_t increment)
{
_elapsed_ms += increment;
}
uint32_t elapsed_ms(void)
{
return _elapsed_ms;

View File

@ -18,7 +18,14 @@ void us_delay(uint32_t us);
void ms_delay(uint32_t ms);
/**
* @brief Returns the current milli seconds count elapsed since the start of the program.
* @brief Manually increment the millisecond counter.
*
* @param increment amount of milliseconds to add to the current @ref elapsed_ms count.
*/
void ms_increment(uint32_t increment);
/**
* @brief Returns the current milliseconds count elapsed since the start of the program.
*
* @return uint32_t the elapsed time in ms
*/

View File

@ -38,7 +38,8 @@ static struct ble_gap_event_listener ble_gap_event_listener;
static int battery_level_char_access_cb(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg);
static uint16_t battery_level_char_handle = 0;
static uint8_t battery_level_value = 42;
// Default battery value set to 100%
static uint8_t _battery_level_value = 100;
static int gatt_nus_char_access_cb(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg);
@ -304,7 +305,7 @@ bool ble_service_update_connection_parameters(
gap_params_to_apply.min_ce_len = min_ce_len;
gap_params_to_apply.max_ce_len = max_ce_len;
if ((status = ble_gap_update_params(ble_device_conn_handle, &gap_params_to_apply)) != BLE_HS_ENOERR)
if((status = ble_gap_update_params(ble_device_conn_handle, &gap_params_to_apply)) != BLE_HS_ENOERR)
{
TLS_BT_APPL_TRACE_ERROR("%s, ble_gap_update_params failed %s" NEW_LINE, __FUNCTION__, tls_bt_rc_2_str(status));
return false;
@ -352,6 +353,12 @@ void ble_service_register_nus_data_rx_cb(nus_data_rx_fn_t nus_data_rx_cb)
{
_ble_service_nus_data_rx_cb = nus_data_rx_cb;
}
void ble_service_set_battery_value(uint8_t value)
{
_battery_level_value = value > 100 ? 100 : value;
}
/**
* PRIVATE FUNCTION DEFINITION
* Used for the internal workings of the service
@ -661,10 +668,19 @@ static int ble_gap_event_cb(struct ble_gap_event *event, void *arg)
event->subscribe.prev_notify
);
if(gatt_nus_char_tx_handle == event->subscribe.attr_handle && (event->subscribe.cur_notify || event->subscribe.cur_indicate))
if(gatt_nus_char_tx_handle == event->subscribe.attr_handle)
{
//We call the state change callback if registered
if(_ble_service_state_change_cb)_ble_service_state_change_cb(BLE_SERVICE_MODE_SUBSCRIBED);
if(event->subscribe.cur_notify || event->subscribe.cur_indicate)
{
//We call the state change callback if registered
if(_ble_service_state_change_cb)_ble_service_state_change_cb(BLE_SERVICE_MODE_SUBSCRIBED);
}
else if(!event->subscribe.cur_notify && !event->subscribe.cur_indicate)
{
//We call the state change callback if registered
if(_ble_service_state_change_cb)_ble_service_state_change_cb(BLE_SERVICE_MODE_UNSUBSCRIBED);
}
}
break;
case BLE_GAP_EVENT_MTU:
@ -733,7 +749,7 @@ static int battery_level_char_access_cb(uint16_t conn_handle, uint16_t attr_hand
if(attr_handle == battery_level_char_handle)
{
TLS_BT_APPL_TRACE_VERBOSE("battery level reading"NEW_LINE);
if((status = os_mbuf_append(ctxt->om, &battery_level_value, sizeof(battery_level_value))) != BLE_HS_ENOERR)
if((status = os_mbuf_append(ctxt->om, &_battery_level_value, sizeof(_battery_level_value))) != BLE_HS_ENOERR)
{
TLS_BT_APPL_TRACE_ERROR("%s, battery level os_mbuf : %s"NEW_LINE, __FUNCTION__, tls_bt_rc_2_str(status));
}

View File

@ -16,6 +16,7 @@ typedef enum
BLE_SERVICE_MODE_ADVERTISING,
BLE_SERVICE_MODE_CONNECTED,
BLE_SERVICE_MODE_SUBSCRIBED,
BLE_SERVICE_MODE_UNSUBSCRIBED,
BLE_SERVICE_MODE_INDICATING,
BLE_SERVICE_MODE_EXITING
} ble_service_state_e;
@ -124,4 +125,11 @@ bool ble_service_send_nus_data(const uint8_t *data, uint16_t length);
*/
void ble_service_register_nus_data_rx_cb(nus_data_rx_fn_t nus_data_rx_cb);
/**
* @brief Sets the battery level in percents sent by the BLE battery service
*
* @param value the battery level to set in percents
*/
void ble_service_set_battery_value(uint8_t value);
#endif //BLE_APP_H

View File

@ -26,6 +26,7 @@ static void date_time_cb(struct tm * const dateTime)
}
bool _is_in_ble_sleep_mode = false;
bool _is_ble_device_subscribed = false;
static void _perform_deferred_display_wake_up_set_timestamp(void);
static void _perform_deferred_display_wake_up(uint8_t deferred_time_in_ms);
@ -203,7 +204,7 @@ static void setWristTiltCb(bool *enabled, SettingMode_e mode)
else
{
watch_peripherals_accelerometer_wrist_wakeup_enable(*enabled);
watch_settings_display_set_wrist_wakeup(*enabled);
watch_settings_display_wrist_wakeup_enabled(*enabled);
}
}
@ -269,6 +270,22 @@ static void getBatteryVoltageCb(uint16_t *battery_voltage)
*battery_voltage = _battery_stats.battery_voltage;
}
static void getMagnetometerRawDataCb(int16_t *field_x, int16_t *field_y, int16_t *field_z, float *temperature)
{
QMC5883L_MData_t raw_data = watch_peripherals_magnetometer_raw_data_read();
*field_x = raw_data.MFieldX;
*field_y = raw_data.MFieldY;
*field_z = raw_data.MFieldZ;
*temperature = watch_peripherals_magnetometer_temperature_read();
}
static void getBMP280DataCb(float *temperature, float *pressure)
{
/* We want hPa's */
*pressure = watch_peripherals_pressure_sensor_get_pressure(temperature) / 100.0;
}
static void saveSettingsToFlashCb(void)
{
/*if(!persistency_save_settings_to_flash())
@ -308,6 +325,8 @@ SettingsScreenAPIInterface_t settingsScreenAPIInterface =
.setLanguageSettingsCb = &(setLanguageCb),
.getBLEDeviceNameCb = &(getBLEDeviceNameCb),
.getBatteryVoltageCb = &(getBatteryVoltageCb),
.getMagnetometerRawDataCb = &(getMagnetometerRawDataCb),
.getBMP280DataCb = &(getBMP280DataCb),
.saveSettingsCb = &(saveSettingsToFlashCb),
.factoryResetCb = &(performFactoryResetCb),
};
@ -362,11 +381,15 @@ static void ble_service_state_change_cb(ble_service_state_e ble_service_state)
watch_face_set_bluetooth_indicator(&watchFace, BLUETOOTH_STATE_ON);
break;
case BLE_SERVICE_MODE_SUBSCRIBED:
_is_ble_device_subscribed = true;
/* We also set the current watch firmware version */
gadget_bridge_send_firmware_version(FIRMWARE_VERSION, NULL);
/* We send the current battery level and battery state (charging or not)*/
gadget_bridge_send_battery_status(_battery_stats.battery_percentage, _battery_stats.battery_voltage/1000.0, watch_peripherals_get_battery_controller_status() != BATTERY_CONTROLLER_STATUS_DISCHARGING);
break;
case BLE_SERVICE_MODE_UNSUBSCRIBED:
_is_ble_device_subscribed = false;
break;
default:
break;
}
@ -492,7 +515,9 @@ void gfx_task(void *param)
float temperature = 0;
float pressure = 0;
uint32_t update_tick = 0;
uint32_t ble_info_update_ms = 0;
uint32_t main_data_update = 0;
for(;;)
{
@ -500,7 +525,6 @@ void gfx_task(void *param)
if(!_is_in_ble_sleep_mode)
{
lv_timer_handler();
tls_os_time_delay(5);
if(compass_screen_is_in_use(&compassScreen))
{
@ -520,23 +544,6 @@ void gfx_task(void *param)
compass_screen_set_temperature(&compassScreen, temperature);
}
/* To rework */
if(lv_tick_elaps(update_tick) > 5000)
{
pressure = watch_peripherals_pressure_sensor_get_pressure(&temperature);
_battery_stats.battery_voltage = watch_peripherals_get_battery_voltage(battery_unit_mv);
_battery_stats.battery_percentage = battery_voltage_to_percentage(_battery_stats.battery_voltage);
APP_LOG_DEBUG("GFX thread, temp : %0.2f °C, press : %0.2f hPa, battery(%s) : %u mV <-> %u %%",
temperature,
pressure/100,
battery_controller_status_2_str(watch_peripherals_get_battery_controller_status()),
_battery_stats.battery_voltage,
_battery_stats.battery_percentage);
update_tick = lv_tick_get();
}
/* Throttle CPU freq down when inactive to save power or to increase responsiveness */
tls_sys_clk clk;
tls_sys_clk_get(&clk);
@ -559,14 +566,15 @@ void gfx_task(void *param)
/* Will wake the display up after some ms to avoid seeing the second hand jumping */
_perform_deferred_display_wake_up(30);
tls_os_time_delay(pdMS_TO_TICKS(6));
}
else
{
/* Increase task IDLE time */
tls_os_time_delay(50);
tls_os_time_delay(pdMS_TO_TICKS(100));
}
/* Handle inactivity periods : */
if( persistency_get_settings()->display.display_delay_before_sleep != 0 &&
lv_disp_get_inactive_time(NULL) > (persistency_get_settings()->display.display_delay_before_sleep * 5 * 1000))
@ -588,7 +596,7 @@ void gfx_task(void *param)
do
{
/* We set the pmu timer 0 to wake up every now and then to perform some background tasks before we go back to sleep again */
tls_pmu_timer0_start(5);
tls_pmu_timer0_start(15*60);
/* We clear any potentiential user wakeup source */
watch_peripherals_wakeup_source_is_user();
@ -605,8 +613,7 @@ void gfx_task(void *param)
}
/* Perform the periodic background tasks */
ms_delay(5);
APP_LOG_INFO("Periodic timer wakeup !");
ms_delay(1);APP_LOG_INFO("Periodic timer wakeup !");
} while (watch_peripherals_wakeup_source_is_timer());
@ -619,9 +626,27 @@ void gfx_task(void *param)
lcd_on(&LCDConfig, false);
_perform_deferred_display_wake_up_set_timestamp();
}
// Necessary to not enter the if condition over and over again
lv_disp_trig_activity(NULL);
}
if(elapsed_ms() - main_data_update > 10000)
{
main_data_update = elapsed_ms();
pressure = watch_peripherals_pressure_sensor_get_pressure(&temperature);
_battery_stats.battery_voltage = watch_peripherals_get_battery_voltage(battery_unit_mv);
_battery_stats.battery_percentage = battery_voltage_to_percentage(_battery_stats.battery_voltage);
APP_LOG_DEBUG("GFX thread, temp : %0.2f °C, press : %0.2f hPa, battery(%s) : %u mV <-> %u %%",
temperature,
pressure/100,
battery_controller_status_2_str(watch_peripherals_get_battery_controller_status()),
_battery_stats.battery_voltage,
_battery_stats.battery_percentage);
}
/* Handle any interrupts status */
if(_interrupts_statuses.battery_controller_status)
@ -631,9 +656,25 @@ void gfx_task(void *param)
_battery_stats.battery_voltage = watch_peripherals_get_battery_voltage(battery_unit_mv);
_battery_stats.battery_percentage = battery_voltage_to_percentage(_battery_stats.battery_voltage);
watch_face_set_battery_indicator(&watchFace, _battery_stats.battery_percentage, watch_peripherals_get_battery_controller_status());
// Also send the information over BLE to GadgetBridge
if(_is_ble_device_subscribed)
{
gadget_bridge_send_battery_status(_battery_stats.battery_percentage, _battery_stats.battery_voltage/1000.0, watch_peripherals_get_battery_controller_status() != BATTERY_CONTROLLER_STATUS_DISCHARGING);
}
}
bool wrist_tilt = false , touch_screen_touch = false;
/* Send battery voltage and current charging state to gadget bridge every 5 minutes */
if(elapsed_ms() - ble_info_update_ms > 5 * 60 * 1000)
{
ble_info_update_ms = elapsed_ms();
if(_is_ble_device_subscribed)
{
gadget_bridge_send_battery_status(_battery_stats.battery_percentage, _battery_stats.battery_voltage/1000.0, watch_peripherals_get_battery_controller_status() != BATTERY_CONTROLLER_STATUS_DISCHARGING);
}
}
bool wrist_tilt = false ,touch_screen_touch = false;
if((wrist_tilt = watch_peripherals_accelerometer_wrist_wakeup_interrupt()) || ((touch_screen_touch = lv_port_indev_touched()) && _is_in_ble_sleep_mode))
{
if(wrist_tilt)

View File

@ -26,6 +26,8 @@ static void update_menu_list_item_text(lv_obj_t *menu_list_item, const char *tex
static void _simulate_side_screen_item_click(SettingsScreen_t * const settingsScreen, lv_obj_t *item);
static void _set_rtc_time_to_label(SettingsScreen_t * const settingsScreen);
static void _set_battery_voltage_to_label(SettingsScreen_t * const settingsScreen);
static void _set_magnetometer_data_to_label(SettingsScreen_t * const settingsScreen);
static void _set_bmp280_data_to_label(SettingsScreen_t * const settingsScreen);
static void _reset_switch_pointers(SettingsScreen_t * const settingsScreen);
static void _enable_time_and_date_rollers(bool enabled, SettingsScreen_t * const settingsScreen);
@ -253,8 +255,16 @@ static void factory_reset_cb(lv_event_t *e)
static void about_refresh_timer_cb(lv_timer_t *timer)
{
SettingsScreen_t *settingsScreen = timer->user_data;
_set_rtc_time_to_label(settingsScreen);
_set_battery_voltage_to_label(settingsScreen);
static uint8_t timer_divider = 6;
if(timer_divider++ == 6)
{
_set_rtc_time_to_label(settingsScreen);
_set_battery_voltage_to_label(settingsScreen);
_set_bmp280_data_to_label(settingsScreen);
timer_divider = 0;
}
_set_magnetometer_data_to_label(settingsScreen);
}
static void load_time_and_date_side_screen(SettingsScreen_t *settingsScreen)
@ -589,9 +599,45 @@ static void load_about_side_screen(SettingsScreen_t *settingsScreen)
lv_obj_align_to(settingsScreen->currentTime.current_time_label, rtc_time, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 5);
_set_rtc_time_to_label(settingsScreen);
lv_obj_t *magnetometer_data = lv_label_create(settingsScreen->side_screen);
lv_label_set_text_static(magnetometer_data, "Magnetometer :");
lv_obj_align_to(magnetometer_data, settingsScreen->currentTime.current_time_label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 5);
/* Display the magnetometer raw data with refresh */
settingsScreen->magnetometer_x.label = lv_label_create(settingsScreen->side_screen);
lv_obj_set_style_text_color(settingsScreen->magnetometer_x.label, lv_color_make(130, 130, 130), LV_PART_MAIN);
lv_obj_align_to(settingsScreen->magnetometer_x.label, magnetometer_data, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 5);
settingsScreen->magnetometer_y.label = lv_label_create(settingsScreen->side_screen);
lv_obj_set_style_text_color(settingsScreen->magnetometer_y.label, lv_color_make(130, 130, 130), LV_PART_MAIN);
lv_obj_align_to(settingsScreen->magnetometer_y.label, settingsScreen->magnetometer_x.label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 5);
settingsScreen->magnetometer_z.label = lv_label_create(settingsScreen->side_screen);
lv_obj_set_style_text_color(settingsScreen->magnetometer_z.label, lv_color_make(130, 130, 130), LV_PART_MAIN);
lv_obj_align_to(settingsScreen->magnetometer_z.label, settingsScreen->magnetometer_y.label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 5);
settingsScreen->magnetometer_temperature.label = lv_label_create(settingsScreen->side_screen);
lv_obj_set_style_text_color(settingsScreen->magnetometer_temperature.label, lv_color_make(130, 130, 130), LV_PART_MAIN);
lv_obj_align_to(settingsScreen->magnetometer_temperature.label, settingsScreen->magnetometer_z.label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 5);
_set_magnetometer_data_to_label(settingsScreen);
lv_obj_t *bmp280_data = lv_label_create(settingsScreen->side_screen);
lv_label_set_text_static(bmp280_data, "Pressure & temp :");
lv_obj_align_to(bmp280_data, settingsScreen->magnetometer_temperature.label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 5);
/* Display pressure and temperature sensor data with refresh */
settingsScreen->bmp280_pressure.label = lv_label_create(settingsScreen->side_screen);
lv_obj_set_style_text_color(settingsScreen->bmp280_pressure.label, lv_color_make(130, 130, 130), LV_PART_MAIN);
lv_obj_align_to(settingsScreen->bmp280_pressure.label, bmp280_data, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 5);
settingsScreen->bmp280_temperature.label = lv_label_create(settingsScreen->side_screen);
lv_obj_set_style_text_color(settingsScreen->bmp280_temperature.label, lv_color_make(130, 130, 130), LV_PART_MAIN);
lv_obj_align_to(settingsScreen->bmp280_temperature.label, settingsScreen->bmp280_pressure.label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 5);
_set_bmp280_data_to_label(settingsScreen);
lv_obj_t *battery_label = lv_label_create(settingsScreen->side_screen);
lv_label_set_text_static(battery_label, "Battery Voltage :");
lv_obj_align_to(battery_label, settingsScreen->currentTime.current_time_label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 5);
lv_obj_align_to(battery_label, settingsScreen->bmp280_temperature.label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 5);
settingsScreen->batteryVoltage.batteryVoltageLabel = lv_label_create(settingsScreen->side_screen);
_set_battery_voltage_to_label(settingsScreen);
@ -617,7 +663,7 @@ static void load_about_side_screen(SettingsScreen_t *settingsScreen)
lv_timer_del(settingsScreen->about_refresh_timer);
settingsScreen->about_refresh_timer = NULL;
}
settingsScreen->about_refresh_timer = lv_timer_create(&(about_refresh_timer_cb), 1000, settingsScreen);
settingsScreen->about_refresh_timer = lv_timer_create(&(about_refresh_timer_cb), 150, settingsScreen);
}
static void menu_list_item_event_handler(lv_event_t * e)
@ -786,6 +832,37 @@ static void _set_battery_voltage_to_label(SettingsScreen_t * const settingsScree
lv_label_set_text_static(settingsScreen->batteryVoltage.batteryVoltageLabel, settingsScreen->batteryVoltage.batteryVoltageText);
}
static void _set_magnetometer_data_to_label(SettingsScreen_t * const settingsScreen)
{
int16_t field_x = 0, field_y = 0, field_z = 0;
float temperature = 0.0;
if(settingsScreen->settingsScreenAPIInterface.getMagnetometerRawDataCb) settingsScreen->settingsScreenAPIInterface.getMagnetometerRawDataCb(&field_x, &field_y, &field_z, &temperature);
sprintf(settingsScreen->magnetometer_x.text, "x: %d", field_x);
lv_label_set_text_static(settingsScreen->magnetometer_x.label, settingsScreen->magnetometer_x.text);
sprintf(settingsScreen->magnetometer_y.text, "y: %d", field_y);
lv_label_set_text_static(settingsScreen->magnetometer_y.label, settingsScreen->magnetometer_y.text);
sprintf(settingsScreen->magnetometer_z.text, "z: %d", field_z);
lv_label_set_text_static(settingsScreen->magnetometer_z.label, settingsScreen->magnetometer_z.text);
sprintf(settingsScreen->magnetometer_temperature.text, "%.2f °C", temperature);
lv_label_set_text_static(settingsScreen->magnetometer_temperature.label, settingsScreen->magnetometer_temperature.text);
}
static void _set_bmp280_data_to_label(SettingsScreen_t * const settingsScreen)
{
float pressure = 0.0, temperature = 0.0;
if(settingsScreen->settingsScreenAPIInterface.getBMP280DataCb) settingsScreen->settingsScreenAPIInterface.getBMP280DataCb(&temperature, &pressure);
sprintf(settingsScreen->bmp280_pressure.text, "%.2f hPa", pressure);
lv_label_set_text_static(settingsScreen->bmp280_pressure.label, settingsScreen->bmp280_pressure.text);
sprintf(settingsScreen->bmp280_temperature.text, "%.2f °C", temperature);
lv_label_set_text_static(settingsScreen->bmp280_temperature.label, settingsScreen->bmp280_temperature.text);
}
static void _reset_switch_pointers(SettingsScreen_t * const settingsScreen)
{
settingsScreen->auto_set_time_switch = NULL;

View File

@ -25,6 +25,8 @@ typedef struct SettingsScreenAPIInterface
void (*setLanguageSettingsCb)(uint8_t *language, SettingMode_e mode);
void (*getBLEDeviceNameCb)(const char **dev_name);
void (*getBatteryVoltageCb)(uint16_t *battery_voltage);
void (*getMagnetometerRawDataCb)(int16_t *field_x, int16_t *field_y, int16_t *field_z, float *temperature);
void (*getBMP280DataCb)(float *temperature, float *pressure);
void (*saveSettingsCb)(void);
void (*factoryResetCb)(void);
} SettingsScreenAPIInterface_t;
@ -67,6 +69,18 @@ typedef struct SettingsScreen
lv_obj_t *batteryVoltageLabel;
char batteryVoltageText[8];
} batteryVoltage;
struct
{
lv_obj_t *label;
char text[11];
} magnetometer_x, magnetometer_y, magnetometer_z, magnetometer_temperature, bmp280_temperature;
struct
{
lv_obj_t *label;
char text[13];
} bmp280_pressure;
/* Main screen */
lv_obj_t *display;

View File

@ -372,7 +372,7 @@ void watch_face_create(WatchFace_t * const watchFace)
}
watchFace->dateWindow.dateWindowWidget = lv_label_create(watchFace->display);
lv_label_set_text_static(watchFace->dateWindow.dateWindowWidget, watchFace->dateWindow.dateWindowText);
lv_obj_set_pos(watchFace->dateWindow.dateWindowWidget, 182,112);
lv_obj_set_pos(watchFace->dateWindow.dateWindowWidget, 182,111);
if(watchFace->hourHand.handImg)
{

View File

@ -52,6 +52,6 @@ void user_task_main(void *param)
tls_mem_free(buf);
}
tls_os_time_delay_until(&time_ref, pdMS_TO_TICKS(5000));
tls_os_time_delay_until(&time_ref, pdMS_TO_TICKS(7000));
}
}

View File

@ -31,8 +31,8 @@ static const WatchSettings_t defaultWatchSettings =
.notification = {
.notification_vibration_duration = 3,
.notification_vibration_strength = 6,
.vibrate_on_email = true,
.vibrate_on_sms = true,
.notification_vibrate_on_email = true,
.notification_vibrate_on_sms = true,
},
.connectivity = {
.connectivity_ble_enabled = false,
@ -93,7 +93,7 @@ void watch_settings_display_set_orientation(LCDOrientation_e orientation)
_params_changed = true;
}
void watch_settings_display_set_wrist_wakeup(bool wakeup)
void watch_settings_display_wrist_wakeup_enabled(bool wakeup)
{
watchSettings.display.display_wrist_wakeup = wakeup;
_params_changed = true;
@ -141,8 +141,11 @@ void watch_settings_language_and_UI_set_language(TranslationLanguage_e language)
_params_changed = true;
}
void watch_settings_activity_step_counter_enabled(bool enabled)
{
watchSettings.activity.activity_step_counter_en = enabled;
_params_changed = true;
}
void persistency_init(void)
{

View File

@ -6,13 +6,13 @@
#include "translation.h"
/**
* @brief The address in flash storage where the settings are saved
* @brief The address in flash storage where the settings are saved.
*
*/
#define WATCH_SETTINGS_FLASH_STORAGE_ADDRESS (0x1E0000)
/**
* @brief Time and Date Settings
* @brief Time and Date Settings.
*
*/
typedef struct TimeAndDate
@ -23,7 +23,7 @@ typedef struct TimeAndDate
} TimeAndDate_t;
/**
* @brief Display Settings
* @brief Display Settings.
*
*/
typedef struct Display
@ -37,28 +37,28 @@ typedef struct Display
} Display_t;
/**
* @brief Activity settings
* @brief Activity settings.
*
*/
typedef struct Activity
{
uint32_t activity_step_counter_en:1;
uint32_t activity_step_counter_en:1; // Not yet used
} Activity_t;
/**
* @brief Notification Settings
* @brief Notification Settings.
*
*/
typedef struct Notification
{
uint32_t vibrate_on_sms:1,
vibrate_on_email:1,
uint32_t notification_vibrate_on_sms:1,
notification_vibrate_on_email:1,
notification_vibration_strength:3,
notification_vibration_duration:3;
} Notification_t;
/**
* @brief Connectivity Settings
* @brief Connectivity Settings.
*
*/
typedef struct Connectivity
@ -68,9 +68,9 @@ typedef struct Connectivity
} Connectivity_t;
/**
* @brief Language and UI Settings
* @brief Language and UI Settings.
*
* @note Languages : English, French and German will be available
* @note Languages : English, French and German will be available.
*
*/
typedef struct LanguageAndUI
@ -79,7 +79,24 @@ typedef struct LanguageAndUI
} LanguageAndUI_t;
/**
* @brief Main setting structure
* @brief Watch sensor calibration data if there are any.
*
* @note For the moment, only the magnetometer have some.
*
*/
typedef struct SensorCalibrationData
{
int16_t sensor_calibration_data_magnetometer_x_min;
int16_t sensor_calibration_data_magnetometer_x_max;
int16_t sensor_calibration_data_magnetometer_y_min;
int16_t sensor_calibration_data_magnetometer_y_max;
int16_t sensor_calibration_data_magnetometer_z_min;
int16_t sensor_calibration_data_magnetometer_z_max;
float sensor_calibration_data_magnetometer_temperature_offset;
} SensorCalibrationData_t;
/**
* @brief Main setting structure.
*
*/
typedef struct WatchSettings
@ -91,6 +108,7 @@ typedef struct WatchSettings
Connectivity_t connectivity;
LanguageAndUI_t languageAndUI;
Activity_t activity;
SensorCalibrationData_t sensorCalibrationData;
} WatchSettings_t;
/**
@ -140,7 +158,7 @@ void watch_settings_display_set_orientation(LCDOrientation_e orientation);
*
* @param wakeup
*/
void watch_settings_display_set_wrist_wakeup(bool wakeup);
void watch_settings_display_wrist_wakeup_enabled(bool wakeup);
/**
* @brief
@ -191,6 +209,13 @@ void watch_settings_connectivity_set_wifi_enabled(bool enabled);
*/
void watch_settings_language_and_UI_set_language(TranslationLanguage_e language);
/**
* @brief
*
* @param enabled
*/
void watch_settings_activity_step_counter_enabled(bool enabled);
/**

View File

@ -70,7 +70,7 @@
#define configUSE_PREEMPTION 1
#define configUSE_IDLE_HOOK 1 //ʹ<>ÿ<EFBFBD><C3BF>й<EFBFBD><D0B9><EFBFBD>
#define configUSE_TICK_HOOK 0
#define configUSE_TICK_HOOK 1
#define configCPU_CLOCK_HZ ( ( unsigned long ) 40000000 ) /* =12.0MHz xtal multiplied by 5 using the PLL. *///???????????????

View File

@ -407,16 +407,16 @@ static void load_about_side_screen(SettingsScreen_t *settingsScreen)
lv_obj_set_style_text_color(version_label, lv_color_make(130, 130, 130), LV_PART_MAIN);
lv_obj_align_to(version_label, firmware_label, LV_ALIGN_OUT_RIGHT_MID, 7, 0);
lv_obj_t* compile_label = lv_label_create(settingsScreen->side_screen);
lv_obj_t *compile_label = lv_label_create(settingsScreen->side_screen);
lv_label_set_text_static(compile_label, "Compile date :");
lv_obj_align_to(compile_label, firmware_label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 5);
lv_obj_t* compile_date_label = lv_label_create(settingsScreen->side_screen);
lv_obj_t *compile_date_label = lv_label_create(settingsScreen->side_screen);
lv_label_set_text_static(compile_date_label, FIRMWARE_TIME_DATE);
lv_obj_set_style_text_color(compile_date_label, lv_color_make(130, 130, 130), LV_PART_MAIN);
lv_obj_align_to(compile_date_label, compile_label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 5);
lv_obj_t* rtc_time = lv_label_create(settingsScreen->side_screen);
lv_obj_t *rtc_time = lv_label_create(settingsScreen->side_screen);
lv_label_set_text_static(rtc_time, "RTC :");
lv_obj_align_to(rtc_time, compile_date_label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 5);
@ -426,14 +426,52 @@ static void load_about_side_screen(SettingsScreen_t *settingsScreen)
lv_obj_set_style_text_color(settingsScreen->currentTime.current_time_label, lv_color_make(130, 130, 130), LV_PART_MAIN);
lv_obj_align_to(settingsScreen->currentTime.current_time_label, rtc_time, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 5);
lv_obj_t *magnetometer_data = lv_label_create(settingsScreen->side_screen);
lv_label_set_text_static(magnetometer_data, "Magnetometer :");
lv_obj_align_to(magnetometer_data, settingsScreen->currentTime.current_time_label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 5);
lv_obj_t *magnetometer_data_x = lv_label_create(settingsScreen->side_screen);
lv_obj_set_style_text_color(magnetometer_data_x, lv_color_make(130, 130, 130), LV_PART_MAIN);
lv_label_set_text_static(magnetometer_data_x, "x: 1456");
lv_obj_align_to(magnetometer_data_x, magnetometer_data, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 3);
lv_obj_t *magnetometer_data_y = lv_label_create(settingsScreen->side_screen);
lv_obj_set_style_text_color(magnetometer_data_y, lv_color_make(130, 130, 130), LV_PART_MAIN);
lv_label_set_text_static(magnetometer_data_y, "y: -456");
lv_obj_align_to(magnetometer_data_y, magnetometer_data_x, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 3);
lv_obj_t *magnetometer_data_z = lv_label_create(settingsScreen->side_screen);
lv_obj_set_style_text_color(magnetometer_data_z, lv_color_make(130, 130, 130), LV_PART_MAIN);
lv_label_set_text_static(magnetometer_data_z, "z: -20");
lv_obj_align_to(magnetometer_data_z, magnetometer_data_y, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 3);
lv_obj_t *magnetometer_data_temp = lv_label_create(settingsScreen->side_screen);
lv_obj_set_style_text_color(magnetometer_data_temp, lv_color_make(130, 130, 130), LV_PART_MAIN);
lv_label_set_text_static(magnetometer_data_temp, "21.52 °C");
lv_obj_align_to(magnetometer_data_temp, magnetometer_data_z, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 3);
lv_obj_t *bmp280 = lv_label_create(settingsScreen->side_screen);
lv_label_set_text_static(bmp280, "Pressure & temp :");
lv_obj_align_to(bmp280, magnetometer_data_temp, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 5);
lv_obj_t *bmp280_temperature = lv_label_create(settingsScreen->side_screen);
lv_obj_set_style_text_color(bmp280_temperature, lv_color_make(130, 130, 130), LV_PART_MAIN);
lv_label_set_text_static(bmp280_temperature, "20.42 °C");
lv_obj_align_to(bmp280_temperature, bmp280, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 3);
lv_obj_t *bmp280_pressure = lv_label_create(settingsScreen->side_screen);
lv_obj_set_style_text_color(bmp280_pressure, lv_color_make(130, 130, 130), LV_PART_MAIN);
lv_label_set_text_static(bmp280_pressure, "9525 hPa");
lv_obj_align_to(bmp280_pressure, bmp280_temperature, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 3);
lv_obj_t *battery_label = lv_label_create(settingsScreen->side_screen);
lv_label_set_text_static(battery_label, "Battery Voltage :");
lv_obj_align_to(battery_label, settingsScreen->currentTime.current_time_label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 5);
lv_obj_align_to(battery_label, bmp280_pressure, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 5);
lv_obj_t *battery_voltage = lv_label_create(settingsScreen->side_screen);
lv_label_set_text_static(battery_voltage, "4277 mV");
lv_obj_set_style_text_color(battery_voltage, lv_color_make(130, 130, 130), LV_PART_MAIN);
lv_obj_align_to(battery_voltage, battery_label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 5);
lv_obj_align_to(battery_voltage, battery_label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 3);
label = lv_label_create(settingsScreen->side_screen);
lv_label_set_text_static(label, "Factory Reset :");

View File

@ -368,7 +368,7 @@ void watch_face_create(WatchFace_t * const watchFace)
}
watchFace->dateWindow.dateWindowWidget = lv_label_create(watchFace->display);
lv_label_set_text_static(watchFace->dateWindow.dateWindowWidget, watchFace->dateWindow.dateWindowText);
lv_obj_set_pos(watchFace->dateWindow.dateWindowWidget, 182,112);
lv_obj_set_pos(watchFace->dateWindow.dateWindowWidget, 182,111);
if(watchFace->hourHand.handImg)
{