diff --git a/README.md b/README.md index 0fe9dca..32bde89 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ TODO 4. 添加连接状态指示灯 OK 4. 修改屏幕显示位置 OK (不改了) -6. 调整ADC放大倍数 (不修改,显示默认放大1.8倍,中心方法) +6. 调整ADC放大倍数 (不修改,显示默认放大1.8倍,中心方法) OK 5. 充电中,限制用户操作 ,充电时,不测量,但没有任何提示。OK 7. 开机时进行低电量检测 OK 3. 修改心率采样ADC参考电压 OK diff --git a/app/app.uvprojx b/app/app.uvprojx index fd4babf..edfd69e 100644 --- a/app/app.uvprojx +++ b/app/app.uvprojx @@ -313,7 +313,7 @@ 1 - 4 + 1 0 0 1 diff --git a/app/src/ble_cmd_process_service.c b/app/src/ble_cmd_process_service.c index decf887..447b9bf 100644 --- a/app/src/ble_cmd_process_service.c +++ b/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->device_state0.sampling_state = (ds_now_state() == kdevice_state_sampling); 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_state1 = 0; diff --git a/app/src/board/board.h b/app/src/board/board.h index 8519527..c603d7a 100644 --- a/app/src/board/board.h +++ b/app/src/board/board.h @@ -43,5 +43,7 @@ #define APP_BATTERY_PROTECT_LEVEL 2 // 低于此电量不能开机,保护电池 #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 LOW_BATTERY_REMINDER_DELAY_MS 3000 diff --git a/app/src/board/board_light_ctrl.c b/app/src/board/board_light_ctrl.c index ad9c957..9879b6f 100644 --- a/app/src/board/board_light_ctrl.c +++ b/app/src/board/board_light_ctrl.c @@ -56,7 +56,7 @@ void BoardLight_toggleGreenLightState() { BoardLight_setGreenLightState(!m_board void BoardLight_setGreenLightState(bool state) { m_boardlight_greenlightstate = 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); } else { nrfx_pwm_stop(&light_ctrl.driver, true); @@ -102,10 +102,16 @@ void BoardLight_Init() { static bool m_boardlight_loaded = false; void BoardLight_load() { + if (m_boardlight_loaded) { + return; + } m_boardlight_loaded = true; BoardLight_setGreenLightState(false); } void BoardLight_unload() { + if (!m_boardlight_loaded) { + return; + } m_boardlight_loaded = false; app_timer_stop(m_green_light_effect_tmr); BoardLight_setGreenLightEffect(kLightEffect_close); @@ -116,7 +122,6 @@ void BoardLight_setGreenLightEffect(LightEffect_t effect) { if (m_light_effect == effect) return; m_light_effect = effect; - switch (effect) { case kLightEffect_close: app_timer_stop(m_green_light_effect_tmr); diff --git a/app/src/one_conduction_main.c b/app/src/one_conduction_main.c index 11e5fb0..d1e07aa 100644 --- a/app/src/one_conduction_main.c +++ b/app/src/one_conduction_main.c @@ -91,7 +91,7 @@ void ENTER_DEEP_SLEEP() { BoardEcgSensor_set_sence_state(); BoardBattery_sence_gpio_init_before_sleep(); // nrf_sdh_disable_request(); - app_timer_stop_all(); + app_timer_pause(); nrf_sdh_suspend(); sd_power_system_off(); 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 (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) { state_machine__change_to_poweroning_state(); } else { + BoardLight_load(); BoardLight_blockFlash(3, 100); + BoardLight_unload(); } } @@ -179,7 +185,7 @@ static void app_event_listener(void* p_event_data, uint16_t event_size) { if (!znordic_rtc_has_setted()) { ENTER_DEEP_SLEEP(); } - if(APP_BATTERY_PROTECT_LEVEL > BoardBattery_get_battery_level()){ + if (APP_BATTERY_PROTECT_LEVEL > BoardBattery_get_battery_level()) { ENTER_DEEP_SLEEP(); } } @@ -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(); } // 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() { + ZLOGI("one_conduction_main"); BoardBeepCtrl_init(); AppEvent_regListener(app_event_listener); @@ -398,11 +405,15 @@ void one_conduction_main() { BoardLight_load(); BoardBattery_load(); +#if 1 if (BoardBattery_get_battery_level() < APP_WORK_BATTERY_LEVEL) { BoardLight_blockFlash(3, 100); // 系统进入深度睡眠,进入深度睡眠前,使能唤醒引脚 + app_timer_pause(); + nrf_delay_ms(LOW_BATTERY_REMINDER_DELAY_MS); 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_start(m_state_machine_driver_tmr, APP_TIMER_TICKS(300), NULL));