From 204c2442e1b1d3e83675b9bdd518650cac627a7d Mon Sep 17 00:00:00 2001 From: anschrammh Date: Tue, 29 Apr 2025 12:57:59 +0200 Subject: [PATCH] Implemented the newly created settings_screen interface callbacks and freeing the default LVGL screen when loading the first screen --- src/W800_SDK_v1.00.10/app/gfx/gfx_task.c | 75 +++++++++++++++++++++--- 1 file changed, 67 insertions(+), 8 deletions(-) diff --git a/src/W800_SDK_v1.00.10/app/gfx/gfx_task.c b/src/W800_SDK_v1.00.10/app/gfx/gfx_task.c index b5aba3a..f048c01 100644 --- a/src/W800_SDK_v1.00.10/app/gfx/gfx_task.c +++ b/src/W800_SDK_v1.00.10/app/gfx/gfx_task.c @@ -6,6 +6,8 @@ #include "lv_port_indev.h" #include "lv_port_tick.h" #include "FreeRTOS.h" +/* Needed to retrieve FreeRTOS version */ +#include "task.h" #include "wm_include.h" #include "lcd.h" #include "watch_face.h" @@ -379,12 +381,51 @@ static void getBatteryVoltageCb(uint16_t *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; + if(field_x && field_y && field_z) + { + watch_peripherals_axes_t axes = watch_peripherals_magnetometer_raw_data_read(); + *field_x = axes.mag.x; + *field_y = axes.mag.y; + *field_z = axes.mag.z; + } - *temperature = watch_peripherals_magnetometer_temperature_read(); + if(temperature) + *temperature = watch_peripherals_magnetometer_temperature_read(); +} + +static void getAccelerometerRawDataCb(int16_t *accel_x, int16_t *accel_y, int16_t *accel_z, float *temperature, uint32_t *step_count) +{ + + if(accel_x && accel_y && accel_z) + { + watch_peripherals_axes_t axes; + if(!watch_peripherals_accelerometer_accel_read(&axes)) + { + APP_LOG_DEBUG("Failed to read accelerations"); + } + else + { + *accel_x = axes.accel.x; + *accel_y = axes.accel.y; + *accel_z = axes.accel.z; + } + } + + if(temperature) + { + if(!watch_peripherals_accelerometer_temperature_read(temperature)) + { + APP_LOG_DEBUG("Failed to read accelerometer's temperature"); + } + } + + if(step_count) + { + if(!watch_peripherals_accelerometer_step_count_read(step_count)) + { + APP_LOG_DEBUG("Failed to read step counts"); + } + } } static void getBMP280DataCb(float *temperature, float *pressure) @@ -393,6 +434,21 @@ static void getBMP280DataCb(float *temperature, float *pressure) *pressure = watch_peripherals_pressure_sensor_get_pressure(temperature) / 100.0; } +static void getComponentVersionCb(const char **version, ComponentVersion_e component) +{ + switch(component) + { + case COMPONENT_FREERTOS: + *version = (const char *)STRINGIFY_VALUE(tskKERNEL_VERSION_MAJOR)"."STRINGIFY_VALUE(tskKERNEL_VERSION_MINOR)"."STRINGIFY_VALUE(tskKERNEL_VERSION_BUILD); + break; + case COMPONENT_LVGL: + *version = (const char *)STRINGIFY_VALUE(LVGL_VERSION_MAJOR)"."STRINGIFY_VALUE(LVGL_VERSION_MINOR)"."STRINGIFY_VALUE(LVGL_VERSION_PATCH); + break; + default: + break; + } +} + static void saveSettingsToFlashCb(void) { // Only enable the settings save feature if we compile in SMART_WATCH_PCB_RELEASE mode @@ -451,7 +507,9 @@ SettingsScreenAPIInterface_t settingsScreenAPIInterface = .getBLEDevicePairingKeyCb = &(getBLEDevicePairingKeyCb), .getBatteryVoltageCb = &(getBatteryVoltageCb), .getMagnetometerRawDataCb = &(getMagnetometerRawDataCb), + .getAccelerometerRawDataCb = &(getAccelerometerRawDataCb), .getBMP280DataCb = &(getBMP280DataCb), + .getComponentVersionCb = &(getComponentVersionCb), .saveSettingsCb = &(saveSettingsToFlashCb), .factoryResetCb = &(performFactoryResetCb), }; @@ -632,13 +690,13 @@ static void settings_screen_on_state_change_cb(SettingsScreenState_e settingsScr switch(settingsScreenState) { case SETTINGS_SCREEN_STATE_OPENED: - if(settingsScreenCategory == SETTINGS_SCREEN_CATEGORY_ABOUT) + if(settingsScreenCategory == SETTINGS_SCREEN_CATEGORY_SENSORS) { watch_peripherals_magnetometer_power_mode_set(QMC5883L_Mode_Control_Continuous); } break; case SETTINGS_SCREEN_STATE_CLOSED: - if(settingsScreenCategory == SETTINGS_SCREEN_CATEGORY_ABOUT) + if(settingsScreenCategory == SETTINGS_SCREEN_CATEGORY_SENSORS) { watch_peripherals_magnetometer_power_mode_set(QMC5883L_Mode_Control_Standby); } @@ -817,7 +875,8 @@ void gfx_task(void *param) watch_face_register_step_counter_indicator_cb(&watchFace, &(step_count_cb)); watch_face_create(&watchFace); - lv_scr_load(watchFace.display); + /* Using this function to load the first screen allows to free the default screen obj */ + lv_scr_load_anim(watchFace.display, LV_SCR_LOAD_ANIM_NONE, 0U, 0U, true); //QMC5883L_set_calibration_data(-900, 2500, -1400, 1400, 2300, 7500, 0.0);