Added a lot of settings handling callbacks, added the code to test the BMA456 step counter feature and it seems to work just fine
This commit is contained in:
parent
721db527ce
commit
beb7a86af1
@ -17,6 +17,9 @@
|
|||||||
#include "watch_peripherals.h"
|
#include "watch_peripherals.h"
|
||||||
#include "watch_settings.h"
|
#include "watch_settings.h"
|
||||||
|
|
||||||
|
#include "ble_modem.h"
|
||||||
|
#include "ble_service.h"
|
||||||
|
|
||||||
static void date_time_cb(struct tm * const dateTime)
|
static void date_time_cb(struct tm * const dateTime)
|
||||||
{
|
{
|
||||||
if(!dateTime)return;
|
if(!dateTime)return;
|
||||||
@ -24,11 +27,7 @@ static void date_time_cb(struct tm * const dateTime)
|
|||||||
//APP_LOG_DEBUG("RTC time : %d:%d:%d", dateTime->tm_hour, dateTime->tm_min, dateTime->tm_sec);
|
//APP_LOG_DEBUG("RTC time : %d:%d:%d", dateTime->tm_hour, dateTime->tm_min, dateTime->tm_sec);
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint8_t battery_percentage = 100;
|
static uint8_t _battery_percentage = 100;
|
||||||
static uint8_t battery_indicator_cb(void)
|
|
||||||
{
|
|
||||||
return battery_percentage;
|
|
||||||
}
|
|
||||||
|
|
||||||
WatchFace_t watchFace;
|
WatchFace_t watchFace;
|
||||||
MenuScreen_t menuScreen;
|
MenuScreen_t menuScreen;
|
||||||
@ -39,7 +38,25 @@ struct bma4_dev bma;
|
|||||||
struct bma4_accel_config accel_conf;
|
struct bma4_accel_config accel_conf;
|
||||||
struct bma456w_wrist_wear_wakeup_params setting;
|
struct bma456w_wrist_wear_wakeup_params setting;
|
||||||
struct bma4_int_pin_config pin_config;
|
struct bma4_int_pin_config pin_config;
|
||||||
|
|
||||||
|
struct
|
||||||
|
{
|
||||||
uint16_t int_status;
|
uint16_t int_status;
|
||||||
|
bool battery_controller_status;
|
||||||
|
} _interrupts_statuses = {.int_status = 0, .battery_controller_status = false};
|
||||||
|
|
||||||
|
|
||||||
|
/* This call back is automatically called by the watch face when it wants to refresh the battery */
|
||||||
|
static void battery_indicator_cb(uint8_t *levelInPercent, BatteryState_e *batteryState)
|
||||||
|
{
|
||||||
|
*levelInPercent = _battery_percentage;
|
||||||
|
*batteryState = watch_peripherals_get_battery_controller_status();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void battery_controller_status_on_change_cb(battery_controller_status_e old, battery_controller_status_e new)
|
||||||
|
{
|
||||||
|
_interrupts_statuses.battery_controller_status = true;
|
||||||
|
}
|
||||||
|
|
||||||
static void setGetBrightnessCb(uint8_t *brightness, SettingMode_e mode)
|
static void setGetBrightnessCb(uint8_t *brightness, SettingMode_e mode)
|
||||||
{
|
{
|
||||||
@ -49,7 +66,10 @@ static void setGetBrightnessCb(uint8_t *brightness, SettingMode_e mode)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
persistency_get_settings()->display.display_brightness = *brightness;
|
// Updates the settings in the watch settings structure
|
||||||
|
watch_settings_display_set_brightness(*brightness);
|
||||||
|
|
||||||
|
// Physically apply the setting to the hardware
|
||||||
watch_peripherals_set_brightness(*brightness);
|
watch_peripherals_set_brightness(*brightness);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -102,7 +122,7 @@ static void setDisplayVibrationDuration(uint8_t *duration, SettingMode_e mode)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
persistency_get_settings()->display.display_vibrate_on_touch_duration = *duration;
|
watch_settings_display_set_vibrate_on_touch_duration(*duration);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -114,7 +134,7 @@ static void setDisplayVibrationStrength(uint8_t *strength, SettingMode_e mode)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
persistency_get_settings()->display.display_vibrate_on_touch_strength = *strength;
|
watch_settings_display_set_vibrate_on_touch_strength(*strength);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -126,7 +146,7 @@ static void setTimeoutCb(uint8_t *timeout, SettingMode_e mode)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
persistency_get_settings()->display.display_delay_before_sleep = *timeout;
|
watch_settings_display_set_delay_before_sleep(*timeout);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -138,7 +158,7 @@ static void setOrientationCb(uint8_t *orientation, SettingMode_e mode)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
persistency_get_settings()->display.display_orientation = *orientation;
|
watch_settings_display_set_orientation(*orientation);
|
||||||
watch_peripherals_set_orientation(*orientation);
|
watch_peripherals_set_orientation(*orientation);
|
||||||
// Forces to redraw the full screen to avoid strange artifacts
|
// Forces to redraw the full screen to avoid strange artifacts
|
||||||
lv_obj_invalidate(lv_scr_act());
|
lv_obj_invalidate(lv_scr_act());
|
||||||
@ -153,10 +173,26 @@ static void setBLEEnabledCb(bool *enabled, SettingMode_e mode)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
persistency_get_settings()->connectivity.connectivity_ble_enabled = *enabled;
|
watch_settings_connectivity_set_ble_enabled(*enabled);
|
||||||
|
//Let's turn the BLE on or OFF here
|
||||||
|
if(*enabled)
|
||||||
|
{
|
||||||
|
if(!ble_modem_on(true))
|
||||||
|
APP_LOG_ERROR("Failed to start BLE modem with service");
|
||||||
|
else
|
||||||
|
watch_face_set_bluetooth_indicator(&watchFace, BLUETOOTH_STATE_ON);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(!ble_modem_off())
|
||||||
|
APP_LOG_ERROR("Failed to stop BLE modem with service");
|
||||||
|
else
|
||||||
|
watch_face_set_bluetooth_indicator(&watchFace, BLUETOOTH_STATE_OFF);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* This may never get implemented due to power consumption */
|
||||||
static void setWiFiEnabledCb(bool *enabled, SettingMode_e mode)
|
static void setWiFiEnabledCb(bool *enabled, SettingMode_e mode)
|
||||||
{
|
{
|
||||||
if(SETTING_MODE_GET == mode)
|
if(SETTING_MODE_GET == mode)
|
||||||
@ -165,7 +201,7 @@ static void setWiFiEnabledCb(bool *enabled, SettingMode_e mode)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
persistency_get_settings()->connectivity.connectivity_wifi_enabled = *enabled;
|
watch_settings_connectivity_set_wifi_enabled(*enabled);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -177,21 +213,46 @@ static void setLanguageCb(uint8_t *language, SettingMode_e mode)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
persistency_get_settings()->languageAndUI.language = *language;
|
watch_settings_language_and_UI_set_language(*language);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void saveSettingsToFlash(void)
|
||||||
|
{
|
||||||
|
/*if(!persistency_save_settings_to_flash())
|
||||||
|
{
|
||||||
|
APP_LOG_ERROR("Failed to save watch settings to flash");
|
||||||
|
}*/
|
||||||
|
}
|
||||||
|
|
||||||
|
static void performFactoryReset()
|
||||||
|
{
|
||||||
|
// Reload factory settings
|
||||||
|
persistency_factory_reset();
|
||||||
|
|
||||||
|
if(!persistency_save_settings_to_flash())
|
||||||
|
{
|
||||||
|
APP_LOG_ERROR("Failed to save factory reset settings to flash");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// We do a hardware reset of the watch
|
||||||
|
tls_sys_reset();
|
||||||
|
}
|
||||||
|
|
||||||
SettingsScreenAPIInterface_t settingsScreenAPIInterface =
|
SettingsScreenAPIInterface_t settingsScreenAPIInterface =
|
||||||
{
|
{
|
||||||
.setTimeSettingsCb = setTimeCb,
|
.setTimeSettingsCb = &(setTimeCb),
|
||||||
.setBrightnessSettingsCb = setGetBrightnessCb,
|
.setBrightnessSettingsCb = &(setGetBrightnessCb),
|
||||||
.setTimeoutSettingsCb = setTimeoutCb,
|
.setTimeoutSettingsCb = &(setTimeoutCb),
|
||||||
.setDisplayVibrationDurationSettingsCb = setDisplayVibrationDuration,
|
.setDisplayVibrationDurationSettingsCb = &(setDisplayVibrationDuration),
|
||||||
.setDisplayVibrationStrengthSettingsCb = setDisplayVibrationStrength,
|
.setDisplayVibrationStrengthSettingsCb = &(setDisplayVibrationStrength),
|
||||||
.setOrientationSettingsCb = setOrientationCb,
|
.setOrientationSettingsCb = &(setOrientationCb),
|
||||||
.setBLEEnabledSettingsCb = setBLEEnabledCb,
|
.setBLEEnabledSettingsCb = &(setBLEEnabledCb),
|
||||||
.setWiFiEnabledSettingsCb = setWiFiEnabledCb,
|
.setWiFiEnabledSettingsCb = &(setWiFiEnabledCb),
|
||||||
.setLanguageSettingsCb = setLanguageCb,
|
.setLanguageSettingsCb = &(setLanguageCb),
|
||||||
|
.saveSettingsCb = &(saveSettingsToFlash),
|
||||||
|
.factoryResetCb = &(performFactoryReset),
|
||||||
};
|
};
|
||||||
|
|
||||||
static uint16_t angle_with_offset(uint16_t angle, uint16_t offset)
|
static uint16_t angle_with_offset(uint16_t angle, uint16_t offset)
|
||||||
@ -223,6 +284,21 @@ static void delay_us(uint32_t period, void *intf_ptr)
|
|||||||
tls_os_time_delay(pdMS_TO_TICKS(period / 1000));
|
tls_os_time_delay(pdMS_TO_TICKS(period / 1000));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void ble_service_state_change_cb(ble_service_state_e ble_service_state)
|
||||||
|
{
|
||||||
|
switch(ble_service_state)
|
||||||
|
{
|
||||||
|
case BLE_SERVICE_MODE_CONNECTED:
|
||||||
|
watch_face_set_bluetooth_indicator(&watchFace, BLUETOOTH_STATE_CONNECTED);
|
||||||
|
break;
|
||||||
|
case BLE_SERVICE_MODE_ADVERTISING:
|
||||||
|
watch_face_set_bluetooth_indicator(&watchFace, BLUETOOTH_STATE_ON);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void scan_result_cb(void)
|
static void scan_result_cb(void)
|
||||||
{
|
{
|
||||||
size_t buffer_size = sizeof(struct tls_scan_bss_format2_t) + sizeof(struct tls_bss_info_format2_t) * 10;
|
size_t buffer_size = sizeof(struct tls_scan_bss_format2_t) + sizeof(struct tls_bss_info_format2_t) * 10;
|
||||||
@ -262,11 +338,26 @@ static void scan_result_cb(void)
|
|||||||
|
|
||||||
void gfx_task(void *param)
|
void gfx_task(void *param)
|
||||||
{
|
{
|
||||||
APP_LOG_TRACE("starting");
|
APP_LOG_TRACE("GFX task starting");
|
||||||
|
|
||||||
/* Init and load watch settings using the persistency layer */
|
/* Init and load watch settings using the persistency layer */
|
||||||
persistency_init();
|
persistency_init();
|
||||||
|
|
||||||
|
if(!persistency_load_settings_from_flash())
|
||||||
|
{
|
||||||
|
APP_LOG_ERROR("Failed to retrieve watch settings from flash");
|
||||||
|
}
|
||||||
|
|
||||||
|
//persistency_debug();
|
||||||
|
|
||||||
|
/* Let's init the watch peripherals driver (vibration motor + battery voltage sense) */
|
||||||
|
watch_peripherals_init(27);
|
||||||
|
watch_peripherals_register_battery_controller_status_change_cb(&(battery_controller_status_on_change_cb));
|
||||||
|
|
||||||
|
/* Make the first battery voltage reading here */
|
||||||
|
uint16_t battery_voltage = watch_peripherals_get_battery_voltage(battery_unit_mv);
|
||||||
|
_battery_percentage = battery_voltage_to_percentage(battery_voltage);
|
||||||
|
|
||||||
/* Check whether the RTC is running or not, if not, then the board was reset
|
/* Check whether the RTC is running or not, if not, then the board was reset
|
||||||
So we start the RTC */
|
So we start the RTC */
|
||||||
if(!tls_is_rtc_running())
|
if(!tls_is_rtc_running())
|
||||||
@ -299,7 +390,7 @@ void gfx_task(void *param)
|
|||||||
lv_scr_load(watchFace.display);
|
lv_scr_load(watchFace.display);
|
||||||
|
|
||||||
/* Let's init the I2C interface */
|
/* Let's init the I2C interface */
|
||||||
i2c_init(I2C_SDA, I2C_SCL, 100000);
|
i2c_init(I2C_SDA, I2C_SCL, I2C_CLOCK_SPEED);
|
||||||
|
|
||||||
uint8_t aliveCounter = 0;
|
uint8_t aliveCounter = 0;
|
||||||
|
|
||||||
@ -374,7 +465,7 @@ void gfx_task(void *param)
|
|||||||
else
|
else
|
||||||
APP_LOG_INFO("BMA456 accel en failed");
|
APP_LOG_INFO("BMA456 accel en failed");
|
||||||
|
|
||||||
bma456w_feature_enable(BMA456W_WRIST_WEAR_WAKEUP, 1, &bma);
|
bma456w_feature_enable(BMA456W_WRIST_WEAR_WAKEUP, BMA4_ENABLE, &bma);
|
||||||
|
|
||||||
bma456w_get_wrist_wear_wakeup_param_config(&setting, &bma);
|
bma456w_get_wrist_wear_wakeup_param_config(&setting, &bma);
|
||||||
|
|
||||||
@ -401,19 +492,21 @@ void gfx_task(void *param)
|
|||||||
else
|
else
|
||||||
APP_LOG_INFO("BMA456 set pin conf failed");
|
APP_LOG_INFO("BMA456 set pin conf failed");
|
||||||
|
|
||||||
/* Let's init the watch peripherals driver (vibration motor + battery voltage sense) */
|
/* Configure BMA's step counter */
|
||||||
watch_peripherals_init(27);
|
if(bma456w_feature_enable(BMA456W_STEP_CNTR, BMA4_ENABLE, &bma) == BMA4_OK)
|
||||||
/* Make the first battery voltage reading here */
|
APP_LOG_INFO("BMA456 step cnter feature enable ok");
|
||||||
uint16_t battery_voltage = watch_peripherals_get_battery_voltage(battery_unit_mv);
|
else
|
||||||
battery_percentage = battery_voltage_to_percentage(battery_voltage);
|
APP_LOG_INFO("BMA456 step cnter feature enable failed");
|
||||||
watch_face_set_battery_indicator(&watchFace, battery_percentage);
|
|
||||||
|
/* Configure and register BLE stack and services callbacks */
|
||||||
|
ble_service_register_state_change_cb(&(ble_service_state_change_cb));
|
||||||
|
|
||||||
/* Once we are done with the initializing steps we
|
/* Once we are done with the initializing steps we
|
||||||
don't forget to turn the backlight on ! */
|
don't forget to turn the backlight on ! */
|
||||||
watch_peripherals_set_brightness(persistency_get_settings()->display.display_brightness);
|
watch_peripherals_set_brightness(persistency_get_settings()->display.display_brightness);
|
||||||
|
|
||||||
/* Enable WiFi hotspot scanning for antenna performance test purposes */
|
/* Enable WiFi hotspot scanning for antenna performance test purposes */
|
||||||
tls_wifi_scan_result_cb_register(&(scan_result_cb));
|
//tls_wifi_scan_result_cb_register(&(scan_result_cb));
|
||||||
|
|
||||||
extern LCDConfig_t LCDConfig;
|
extern LCDConfig_t LCDConfig;
|
||||||
float temperature = 0;
|
float temperature = 0;
|
||||||
@ -441,27 +534,33 @@ void gfx_task(void *param)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
uint8_t rslt = bma456w_read_int_status(&int_status, &bma);
|
uint8_t rslt = bma456w_read_int_status(&_interrupts_statuses.int_status, &bma);
|
||||||
if(rslt != BMA4_OK)
|
if(rslt != BMA4_OK)
|
||||||
APP_LOG_DEBUG("Failed to read int status");
|
APP_LOG_DEBUG("Failed to read int status");
|
||||||
|
|
||||||
if((BMA4_OK == rslt) && (int_status & BMA456W_WRIST_WEAR_WAKEUP_INT))
|
if((BMA4_OK == rslt) && (_interrupts_statuses.int_status & BMA456W_WRIST_WEAR_WAKEUP_INT))
|
||||||
{
|
{
|
||||||
APP_LOG_DEBUG("Wrist tilt");
|
APP_LOG_DEBUG("Wrist tilt");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(++aliveCounter % 200 == 0)
|
if(++aliveCounter % 200 == 0)
|
||||||
{
|
{
|
||||||
|
uint32_t steps = 0;
|
||||||
|
if(bma456w_step_counter_output(&steps, &bma) != BMA4_OK)
|
||||||
|
APP_LOG_DEBUG("Failed to read step counts");
|
||||||
|
|
||||||
|
watch_face_set_step_count(&watchFace, steps);
|
||||||
|
|
||||||
pressure = BMP280_get_pressure(&temperature);
|
pressure = BMP280_get_pressure(&temperature);
|
||||||
BMP280_trigger_measurement();
|
BMP280_trigger_measurement();
|
||||||
battery_voltage = watch_peripherals_get_battery_voltage(battery_unit_mv);
|
battery_voltage = watch_peripherals_get_battery_voltage(battery_unit_mv);
|
||||||
battery_percentage = battery_voltage_to_percentage(battery_voltage);
|
_battery_percentage = battery_voltage_to_percentage(battery_voltage);
|
||||||
APP_LOG_DEBUG("GFX thread, temp : %0.2f °C, press : %0.2f hPa, bat(%d) : %u mV <-> %u %%",
|
APP_LOG_DEBUG("GFX thread, temp : %0.2f °C, press : %0.2f hPa, battery(%s) : %u mV <-> %u %%",
|
||||||
temperature,
|
temperature,
|
||||||
pressure/100,
|
pressure/100,
|
||||||
watch_peripherals_get_battery_controller_status(),
|
battery_controller_status_2_str(watch_peripherals_get_battery_controller_status()),
|
||||||
battery_voltage,
|
battery_voltage,
|
||||||
battery_percentage);
|
_battery_percentage);
|
||||||
|
|
||||||
//APP_LOG_DEBUG("Scanning WiFi : %d", tls_wifi_scan());
|
//APP_LOG_DEBUG("Scanning WiFi : %d", tls_wifi_scan());
|
||||||
|
|
||||||
@ -512,5 +611,15 @@ void gfx_task(void *param)
|
|||||||
APP_LOG_DEBUG("CPU 160Mhz");
|
APP_LOG_DEBUG("CPU 160Mhz");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Handle any interrupts status */
|
||||||
|
if(_interrupts_statuses.battery_controller_status)
|
||||||
|
{
|
||||||
|
_interrupts_statuses.battery_controller_status = false;
|
||||||
|
//Let's refresh the battery percentage as well:
|
||||||
|
battery_voltage = watch_peripherals_get_battery_voltage(battery_unit_mv);
|
||||||
|
_battery_percentage = battery_voltage_to_percentage(battery_voltage);
|
||||||
|
watch_face_set_battery_indicator(&watchFace, _battery_percentage, watch_peripherals_get_battery_controller_status());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user