Compare commits
11 Commits
d78956f12b
...
1859f31275
Author | SHA1 | Date | |
---|---|---|---|
|
1859f31275 | ||
|
13b3ecfacf | ||
|
17d8c9949d | ||
|
ef0abe0ab7 | ||
|
fcc152f64d | ||
|
552644a412 | ||
|
5ea4d8fb38 | ||
|
5f7ac5a1d1 | ||
|
03f86ea483 | ||
|
2df2f332bf | ||
|
8ea47fb03c |
@ -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
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
*/
|
||||
|
@ -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));
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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);
|
||||
|
||||
|
||||
|
||||
/**
|
||||
|
@ -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. *///???????????????
|
||||
|
||||
|
@ -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 :");
|
||||
|
@ -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)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user