Browse Source

添加 低电量相关逻辑

master
zhaohe 1 year ago
parent
commit
8306008ba0
  1. 2
      README.md
  2. 2
      app/app.uvprojx
  3. 2
      app/src/ble_cmd_process_service.c
  4. 4
      app/src/board/board.h
  5. 9
      app/src/board/board_light_ctrl.c
  6. 19
      app/src/one_conduction_main.c

2
README.md

@ -11,7 +11,7 @@ TODO
4. 添加连接状态指示灯 OK 4. 添加连接状态指示灯 OK
4. 修改屏幕显示位置 OK (不改了) 4. 修改屏幕显示位置 OK (不改了)
6. 调整ADC放大倍数 (不修改,显示默认放大1.8倍,中心方法)
6. 调整ADC放大倍数 (不修改,显示默认放大1.8倍,中心方法) OK
5. 充电中,限制用户操作 ,充电时,不测量,但没有任何提示。OK 5. 充电中,限制用户操作 ,充电时,不测量,但没有任何提示。OK
7. 开机时进行低电量检测 OK 7. 开机时进行低电量检测 OK
3. 修改心率采样ADC参考电压 OK 3. 修改心率采样ADC参考电压 OK

2
app/app.uvprojx

@ -313,7 +313,7 @@
</ArmAdsMisc> </ArmAdsMisc>
<Cads> <Cads>
<interw>1</interw> <interw>1</interw>
<Optim>4</Optim>
<Optim>1</Optim>
<oTime>0</oTime> <oTime>0</oTime>
<SplitLS>0</SplitLS> <SplitLS>0</SplitLS>
<OneElfS>1</OneElfS> <OneElfS>1</OneElfS>

2
app/src/ble_cmd_process_service.c

@ -302,7 +302,7 @@ void ble_cmder_process_rx(uint8_t* rx, int len) {
receipt->drop_state1 = 0x00; receipt->drop_state1 = 0x00;
receipt->device_state0.sampling_state = (ds_now_state() == kdevice_state_sampling); receipt->device_state0.sampling_state = (ds_now_state() == kdevice_state_sampling);
receipt->device_state0.report_state = m_realtime_report_state; receipt->device_state0.report_state = m_realtime_report_state;
receipt->device_state0.low_battery = (BoardBattery_get_battery_level() < APP_LOW_BATTERY_LIMIT);
receipt->device_state0.low_battery = (BoardBattery_get_battery_level() < APP_LOW_BATTERY_WARNING_LIMIT);
receipt->device_state0.full_storge = (sample_data_mgr_storage_is_full()); receipt->device_state0.full_storge = (sample_data_mgr_storage_is_full());
receipt->device_state1 = 0; receipt->device_state1 = 0;

4
app/src/board/board.h

@ -43,5 +43,7 @@
#define APP_BATTERY_PROTECT_LEVEL 2 // 低于此电量不能开机,保护电池 #define APP_BATTERY_PROTECT_LEVEL 2 // 低于此电量不能开机,保护电池
#define APP_AUTO_STANDY_BATTERY_LEVEL 10 // 低于此电量自动待机,保持时钟 #define APP_AUTO_STANDY_BATTERY_LEVEL 10 // 低于此电量自动待机,保持时钟
#define APP_WORK_BATTERY_LEVEL 13 // Main初始化时候和从standy切换到work的时候,检查这个电量
#define APP_WORK_BATTERY_LEVEL 15 // Main初始化时候和从standy切换到work的时候,检查这个电量
#define APP_LOW_BATTERY_WARNING_LIMIT 20 // #define APP_LOW_BATTERY_WARNING_LIMIT 20 //
#define LOW_BATTERY_REMINDER_DELAY_MS 3000

9
app/src/board/board_light_ctrl.c

@ -56,7 +56,7 @@ void BoardLight_toggleGreenLightState() { BoardLight_setGreenLightState(!m_board
void BoardLight_setGreenLightState(bool state) { void BoardLight_setGreenLightState(bool state) {
m_boardlight_greenlightstate = state; m_boardlight_greenlightstate = state;
if (state) { if (state) {
light_ctrl.seq_values.channel_0 = 80; // top_value
light_ctrl.seq_values.channel_0 = 95; // top_value
nrfx_pwm_simple_playback(&light_ctrl.driver, &light_ctrl.seq, 1, NRF_DRV_PWM_FLAG_LOOP); nrfx_pwm_simple_playback(&light_ctrl.driver, &light_ctrl.seq, 1, NRF_DRV_PWM_FLAG_LOOP);
} else { } else {
nrfx_pwm_stop(&light_ctrl.driver, true); nrfx_pwm_stop(&light_ctrl.driver, true);
@ -102,10 +102,16 @@ void BoardLight_Init() {
static bool m_boardlight_loaded = false; static bool m_boardlight_loaded = false;
void BoardLight_load() { void BoardLight_load() {
if (m_boardlight_loaded) {
return;
}
m_boardlight_loaded = true; m_boardlight_loaded = true;
BoardLight_setGreenLightState(false); BoardLight_setGreenLightState(false);
} }
void BoardLight_unload() { void BoardLight_unload() {
if (!m_boardlight_loaded) {
return;
}
m_boardlight_loaded = false; m_boardlight_loaded = false;
app_timer_stop(m_green_light_effect_tmr); app_timer_stop(m_green_light_effect_tmr);
BoardLight_setGreenLightEffect(kLightEffect_close); BoardLight_setGreenLightEffect(kLightEffect_close);
@ -116,7 +122,6 @@ void BoardLight_setGreenLightEffect(LightEffect_t effect) {
if (m_light_effect == effect) return; if (m_light_effect == effect) return;
m_light_effect = effect; m_light_effect = effect;
switch (effect) { switch (effect) {
case kLightEffect_close: case kLightEffect_close:
app_timer_stop(m_green_light_effect_tmr); app_timer_stop(m_green_light_effect_tmr);

19
app/src/one_conduction_main.c

@ -91,7 +91,7 @@ void ENTER_DEEP_SLEEP() {
BoardEcgSensor_set_sence_state(); BoardEcgSensor_set_sence_state();
BoardBattery_sence_gpio_init_before_sleep(); BoardBattery_sence_gpio_init_before_sleep();
// nrf_sdh_disable_request(); // nrf_sdh_disable_request();
app_timer_stop_all();
app_timer_pause();
nrf_sdh_suspend(); nrf_sdh_suspend();
sd_power_system_off(); sd_power_system_off();
NVIC_SystemReset(); NVIC_SystemReset();
@ -159,6 +159,8 @@ static void app_event_listener(void* p_event_data, uint16_t event_size) {
/******************************************************************************* /*******************************************************************************
* * * *
*******************************************************************************/ *******************************************************************************/
static uint32_t lasttrypoweron_time = 0;
if (ds_now_state() == kdevice_state_standby) { if (ds_now_state() == kdevice_state_standby) {
// --> // -->
if (BoardBattery_get_charging_state()) { if (BoardBattery_get_charging_state()) {
@ -166,11 +168,15 @@ static void app_event_listener(void* p_event_data, uint16_t event_size) {
} }
// --> // -->
else if (BoardEcgSensor_plod_get_connected_state()) {
else if (BoardEcgSensor_plod_get_connected_state() && znordic_haspassed_ms(lasttrypoweron_time) >= LOW_BATTERY_REMINDER_DELAY_MS) {
lasttrypoweron_time = znordic_getpower_on_ms();
if (BoardBattery_get_battery_level() > APP_WORK_BATTERY_LEVEL) { if (BoardBattery_get_battery_level() > APP_WORK_BATTERY_LEVEL) {
state_machine__change_to_poweroning_state(); state_machine__change_to_poweroning_state();
} else { } else {
BoardLight_load();
BoardLight_blockFlash(3, 100); BoardLight_blockFlash(3, 100);
BoardLight_unload();
} }
} }
@ -225,8 +231,8 @@ static void app_event_listener(void* p_event_data, uint16_t event_size) {
} }
} }
//
else if (BoardBattery_get_battery_level() < APP_AUTO_STANDY_BATTERY_LEVEL) {
//
else if (BoardBattery_get_battery_level() < APP_AUTO_STANDY_BATTERY_LEVEL && ds_cur_state_haspassed_ms() > 3000) {
state_machine__change_to_standby_state(); state_machine__change_to_standby_state();
} }
// ZLOGI("bt:%d plod:%d has_disc:%d state:%d", zdatachannel_is_connected(), BoardEcgSensor_plod_get_connected_state_after_filter(), plod_state_has_disconnected_ms(), ds_cur_state_haspassed_ms()); // ZLOGI("bt:%d plod:%d has_disc:%d state:%d", zdatachannel_is_connected(), BoardEcgSensor_plod_get_connected_state_after_filter(), plod_state_has_disconnected_ms(), ds_cur_state_haspassed_ms());
@ -389,6 +395,7 @@ static void app_event_listener(void* p_event_data, uint16_t event_size) {
*******************************************************************************/ *******************************************************************************/
void one_conduction_main() { void one_conduction_main() {
ZLOGI("one_conduction_main");
BoardBeepCtrl_init(); BoardBeepCtrl_init();
AppEvent_regListener(app_event_listener); AppEvent_regListener(app_event_listener);
@ -398,11 +405,15 @@ void one_conduction_main() {
BoardLight_load(); BoardLight_load();
BoardBattery_load(); BoardBattery_load();
#if 1
if (BoardBattery_get_battery_level() < APP_WORK_BATTERY_LEVEL) { if (BoardBattery_get_battery_level() < APP_WORK_BATTERY_LEVEL) {
BoardLight_blockFlash(3, 100); BoardLight_blockFlash(3, 100);
// ,使 // ,使
app_timer_pause();
nrf_delay_ms(LOW_BATTERY_REMINDER_DELAY_MS);
ENTER_DEEP_SLEEP(); ENTER_DEEP_SLEEP();
} }
#endif
ZERROR_CHECK(app_timer_create(&m_state_machine_driver_tmr, APP_TIMER_MODE_REPEATED, state_machine_driver_tmr_cb)); ZERROR_CHECK(app_timer_create(&m_state_machine_driver_tmr, APP_TIMER_MODE_REPEATED, state_machine_driver_tmr_cb));
ZERROR_CHECK(app_timer_start(m_state_machine_driver_tmr, APP_TIMER_TICKS(300), NULL)); ZERROR_CHECK(app_timer_start(m_state_machine_driver_tmr, APP_TIMER_TICKS(300), NULL));

Loading…
Cancel
Save