diff --git a/README.md b/README.md index 287272a..4d07a27 100644 --- a/README.md +++ b/README.md @@ -1,106 +1,43 @@ # one_lead_ecg -``` - -开发板功耗测试: - 1. 连接无通信: - (20-75)*1.25 170ua - (50-75)*1.25 100ua - - 2. 慢广播: - 8HZ-RTC/2s一次广播 平局功耗18ua,广播时800ua - - 3. 不广播: - 8HZ-RTC 平局功耗11ua 每8s一次500us的高功耗 - 320HZ-RTC 平局功耗71ua 每8s一次500us的高功耗 - - 4. 深度睡眠 : 3ua - -最精简程序(不初始化任何外设) - 单导联 3.2v 162ua - 开发板 3ua - - - 什么都不开:320 - 打开zapp定时器,和慢广播后: 320->330 - 系统初始化: 260->270 - 屏幕:10ma - - -20240509功耗测量: - 采集时候:9ma - 停止采集:3ma - 待机:190ua +``` +build_app.bat 编译应用程序 +build_bootloader.bat 编译bootloader +flash_with_id.bat 烧录程序携带ID -... - -``` -程序烧录 - .\scripter\build_app.bat ; .\scripter\flash.bat ``` ``` - onCommand - startCapture(inMainPage) - pushStartCaptureEvent - stopCapture(inCapturePage) - pushStopCaptureEvent - - onConnect - loadDevice - onDisconnect - unloadDevice - - onCharging(inIdlePage) - changePageToChanging - - onChargEnd(inChangePage) - changePageToPowerOff - unloadDevice - - -State - standby - onConnected - loadDevice - onChanger - loadDevice and changeTo chargPage - welcomPage - - mainPage - onChange - onStartCapture - capture - onData - onStopCapture - onError - changeToErrorPage(time) - pushDelayEvent() - onErrorPageOvertime - - charging - onChargeEnd - -功耗管理: - 待机状态: - 电池管理-待机状态 - 电池管理-开机状态 - 其他:失能 +0. 调试指示灯 +1. 指示灯控制 +2. 读取按键 +3. 串口日志 + + +手持-蓝牙 +main: + 1.启动广播 + 2.初始化串口 + 3.测试硬件 + 按键 + 指示灯 + 电池电量 - 开机状态: - 全部使能 - - -状态切换: - prepare: - - +台面-蓝牙 +main: + 2. 串口 + 3. IO状态输出 + 5. 蓝牙收发消息 + +... ``` +1. 调试串口修改位置 + 1. 在sdk_config.h + + -``` -nrfjprog --readcode flash.hex ``` \ No newline at end of file diff --git a/app/app.uvoptx b/app/app.uvoptx index af01a7a..ddb60a1 100644 --- a/app/app.uvoptx +++ b/app/app.uvoptx @@ -148,7 +148,24 @@ UL2CM3(-S0 -C0 -P0 -FD20000000 -FC4000 -FN2 -FF0nrf52xxx -FS00 -FL0200000 -FF1nrf52xxx_uicr -FS110001000 -FL11000 -FP0($$Device:nRF52833_xxAA$Flash\nrf52xxx.flm) -FP1($$Device:nRF52833_xxAA$Flash\nrf52xxx_uicr.flm)) - + + + 0 + 0 + 80 + 1 +
174592
+ 0 + 0 + 0 + 0 + 0 + 1 + .\src\main.c + + \\app\src/main.c\80 +
+
0 diff --git a/app/config/sdk_config.h b/app/config/sdk_config.h index ade6ff1..51dc7a4 100644 --- a/app/config/sdk_config.h +++ b/app/config/sdk_config.h @@ -1,13 +1,12 @@ #pragma once -#define NRF_LOG_ENABLED 0 +#define NRF_LOG_ENABLED 1 #define NRF_LOG_BACKEND_UART_ENABLED 1 #define NRF_LOG_BACKEND_UART_TX_PIN 41 -// #define NRF_LOG_BACKEND_UART_TX_PIN 6 #define APP_TIMER_CONFIG_USE_SCHEDULER 0 -// #define NRF_LOG_BACKEND_UART_BAUDRATE 121634816 // 400800 baud -#define NRF_LOG_BACKEND_UART_BAUDRATE 268435456 // 1000000 baud +#define NRF_LOG_BACKEND_UART_BAUDRATE 121634816 // 400800 baud +// #define NRF_LOG_BACKEND_UART_BAUDRATE 268435456 // 1000000 baud #define NRF_DFU_APP_DATA_AREA_SIZE 8192 diff --git a/app/src/app_basic_service/basic/state.h b/app/src/app_basic_service/basic/state.h index 25b95d4..3b36de9 100644 --- a/app/src/app_basic_service/basic/state.h +++ b/app/src/app_basic_service/basic/state.h @@ -5,33 +5,18 @@ #include "aproject_config/config.h" typedef enum { kstate_standby, - kstate_welcomPage, - kstate_mainPage, - kstate_capture, - kstate_capture_end, - kstate_prepare_capture, - kstate_charging, - kstate_test, + kstate_working_ble_connected, + kstate_working_ble_disconnected, } device_state_t; static const char* device_state_to_str(device_state_t ds) { switch (ds) { case kstate_standby: return "kstate_standby"; - case kstate_welcomPage: - return "kstate_welcomPage"; - case kstate_mainPage: - return "kstate_mainPage"; - case kstate_capture: - return "kstate_capture"; - case kstate_capture_end: - return "kstate_capture_end"; - case kstate_prepare_capture: - return "kstate_prepare_capture"; - case kstate_charging: - return "kstate_charging"; - case kstate_test: - return "kstate_test"; + case kstate_working_ble_connected: + return "kstate_working_ble_connected"; + case kstate_working_ble_disconnected: + return "kstate_working_ble_disconnected"; default: return "unknown"; } diff --git a/app/src/main.c b/app/src/main.c index 9af7164..3396a1e 100644 --- a/app/src/main.c +++ b/app/src/main.c @@ -64,7 +64,7 @@ void app_error_fault_handler(uint32_t id, uint32_t pc, uint32_t info) { int main() { zapp_early_init(); - znordic_init(); + znordic_init_without_wd(); zapp_init(); /******************************************************************************* diff --git a/app/src/one_conduction_main.c b/app/src/one_conduction_main.c index ddd53e2..e206e75 100644 --- a/app/src/one_conduction_main.c +++ b/app/src/one_conduction_main.c @@ -34,21 +34,8 @@ static uint16_t m_capture_prepare_progress = 0; /*********************************************************************************************************************** * 蓝牙连接事件处理 * ***********************************************************************************************************************/ - -static void process_on_connect(void* arg) { - if (zapp_state_machine_now_state() == kstate_standby) { - zapp_state_machine_change_state(kstate_welcomPage); - } - - if (m_poweron_flag) { - light_ctrl_set_green_light_effect(kLightEffect_slowFlash); - } -} -static void process_on_disconnect(void* arg) { - if (m_poweron_flag) { - light_ctrl_set_green_light_effect(kLightEffect_quickFlash); - } -} +static void process_on_connect(void* arg); +static void process_on_disconnect(void* arg); void on_zble_event(zble_event_t* event) { if (event->eventType == kzble_event_connected) { @@ -78,357 +65,19 @@ void one_conduction_process_rx_packet(uint8_t* rx, int len) { ZLOGI("rx cmd:%d index:%d datalen:%d", cmd, rxheader->frame_index, len - sizeof(ify_hrs_packet_t)); NRF_LOG_HEXDUMP_INFO(rx, len); - - if (cmd == ify_hrs_cmd_read_device_version) { - device_version_info_receipt_t* receipt = (device_version_info_receipt_t*)txheader->data; - uint16_t sendlen = sizeof(ify_hrs_packet_t) + sizeof(device_version_info_receipt_t); - - receipt->blestack_version = device_info_read_blestack_version(); - receipt->bootloader_version = device_info_read_bootloader_version(); - receipt->firmware_version = device_info_read_firmware_version(); - receipt->hardware_version = device_info_read_hardware_version(); - zdatachannel_data_send2((uint8_t*)txheader, sendlen); - } - - else if (cmd == ify_hrs_cmd_read_sensor_info) { - sensor_info_receipt_t* receipt = (sensor_info_receipt_t*)txheader->data; - uint16_t sendlen = sizeof(ify_hrs_packet_t) + sizeof(sensor_info_receipt_t); - - receipt->sensor_num = 1; - receipt->sensor_precision = SAMPLE_PRECISION; - receipt->sensor_sample_rate = SAMPLE_RATE / 10; - receipt->sensor0_pos = kifyhrs_sensor_pos_none; - receipt->sensor1_pos = kifyhrs_sensor_pos_none; - receipt->sensor2_pos = kifyhrs_sensor_pos_none; - - zdatachannel_data_send2((uint8_t*)txheader, sendlen); - } - - else if (cmd == ify_hrs_cmd_read_sn) { - read_sn_receipt_t* receipt = (read_sn_receipt_t*)txheader->data; - uint16_t sendlen = sizeof(ify_hrs_packet_t) + sizeof(read_sn_receipt_t); - device_info_read_sn((sn_t*)&receipt->sn); - zdatachannel_data_send2((uint8_t*)txheader, sendlen); - } - - else if (cmd == ify_hrs_cmd_reset) { - NVIC_SystemReset(); - } - - else if (cmd == ify_hrs_cmd_read_time) { - read_time_receipt_t* receipt = (read_time_receipt_t*)txheader->data; - uint16_t sendlen = sizeof(ify_hrs_packet_t) + sizeof(read_time_receipt_t); - static ztm_t ztm; - znordic_rtc_gettime(&ztm); - - receipt->year = (ztm.tm_year + 1900 - 2000); - receipt->month = ztm.tm_mon + 1; - receipt->day = ztm.tm_mday; - receipt->hour = ztm.tm_hour; - receipt->minute = ztm.tm_min; - receipt->second = ztm.tm_sec; - zdatachannel_data_send2((uint8_t*)txheader, sendlen); - } - - else if (cmd == ify_hrs_cmd_sync_time) { - sync_time_cmd_t* cmd = (sync_time_cmd_t*)rxheader->data; - uint16_t sendlen = sizeof(ify_hrs_packet_t); - device_info_write_active_flag(true); - znordic_rtc_settime(cmd->year + 2000, cmd->month, cmd->day, cmd->hour, cmd->minute, cmd->second); - zdatachannel_data_send2((uint8_t*)txheader, sendlen); - } - - /*********************************************************************************************************************** - * 基础指令 * - ***********************************************************************************************************************/ - - else if (cmd == ify_hrs_cmd_read_device_state) { - device_state_receipt_t* receipt = (device_state_receipt_t*)txheader->data; - uint16_t sendlen = sizeof(ify_hrs_packet_t) + sizeof(device_state_receipt_t); - - receipt->drop_state0 = (0); - receipt->drop_state1 = 0x00; - receipt->device_state0.sampling_state = (zapp_state_machine_now_state() == kstate_capture); - receipt->device_state0.report_state = 0; - receipt->device_state0.low_battery = (0 < APP_LOW_BATTERY_WARNING_LIMIT); - receipt->device_state0.full_storge = false; - - receipt->device_state1 = 0; - receipt->powerlevel = battery_mgr_service_get_battery_level(); - receipt->storage_item_num = 0; - - zdatachannel_data_send2((uint8_t*)txheader, sendlen); - } - - else if (cmd == ify_hrs_cmd_start_realtime_preview) { - if (zapp_state_machine_now_state() != kstate_mainPage && zapp_state_machine_now_state() != kstate_welcomPage) { - send_error_receipt(rxheader, kifyhrs_ecode_invalid_state); - return; - } - static app_event_t event; - event.eventType = kappevent_start_capture; - - zapp_ebus_push_event(&event); - send_success_receipt(rxheader, 0); - } - - else if (cmd == ify_hrs_cmd_stop_realtime_preview) { - if (zapp_state_machine_now_state() != kstate_capture) { - send_error_receipt(rxheader, kifyhrs_ecode_invalid_state); - return; - } - - static app_event_t event; - event.eventType = kappevent_stop_capture; - - zapp_ebus_push_event(&event); - send_success_receipt(rxheader, 0); - } - - /*********************************************************************************************************************** - * 测试 * - ***********************************************************************************************************************/ - else if (cmd == ify_hrs_cmd_set_ecg_in_test_mode) { - int32_t testmode = *(int32_t*)rxheader->data; - ecg_service_set_in_test_mode(testmode); - send_success_receipt(rxheader, 0); - } - - else if (cmd == ify_hrs_cmd_set_ecg_report_data_in_raw_mode) { - int32_t testmode = *(int32_t*)rxheader->data; - ecg_service_set_report_data_in_raw_mode(testmode); - send_success_receipt(rxheader, 0); - } - - else if (cmd == ify_hrs_cmd_ecg_subic_read_reg) { - uint8_t addr = *(uint8_t*)rxheader->data; - uint8_t val = ecg_service_subic_read_reg(addr); - txheader->data[0] = val; - zdatachannel_data_send2((uint8_t*)txheader, sizeof(ify_hrs_packet_t) + 1); - } - - else if (cmd == ify_hrs_cmd_ecg_subic_write_reg) { - uint8_t addr = *(uint8_t*)rxheader->data; - uint8_t val = *(uint8_t*)(rxheader->data + 1); - ecg_service_subic_write_reg(addr, val); - send_success_receipt(rxheader, 0); - } - - else { - send_error_receipt(rxheader, kifyhrs_ecode_cmd_not_support); - } } /*********************************************************************************************************************** * 事件处理 * ***********************************************************************************************************************/ -// extern int32_t maxval; -// extern int32_t minval; -// extern int32_t nowval100; +static void process_on_connect(void* arg) { ZLOGI("ble connected"); } +static void process_on_disconnect(void* arg) { ZLOGI("ble disconnected"); } + void on_zapp_ebus_event(void* p_event_data, uint16_t event_size) { if (!p_event_data) return; app_event_t* p_event = (app_event_t*)p_event_data; - - if (p_event->eventType == kappevent_tmr_1s_scheduler_event) { - // ZLOGI("tmr event. %d %d %d", nowval100, minval, maxval); - // ZLOGI("tmr event."); - } - - app_event_type_t event = p_event->eventType; - - if (zapp_state_machine_now_state() == kstate_standby) { - /** - * @brief - * 1. 充电切换到充电状态 - */ - - if (event == kappevent_state_machine_state_enter) { - /** - * @brief 关机 - */ - ZLOGI("power off"); - dsp_mgr_change_page(kpage_poweroff); - - battery_mgr_service_change_state_to_standy(); - - beep_unload(); - light_ctrl_unload(); - dsp_mgr_unload(); - ecg_service_unload(); - - // battery_mgr_service_change_state_to_standy(); - hardware_power_mgr_main_power_supply_set(false); - m_poweron_flag = false; - - } else if (event == kappevent_state_machine_state_exit) { - /** - * @brief 开机 - */ - ZLOGI("power on"); - hardware_power_mgr_main_power_supply_set(true); - battery_mgr_service_change_state_to_poweron(); - beep_load(); - light_ctrl_load(); - dsp_mgr_load(); - ecg_service_load(); - m_poweron_flag = true; - - if (zble_module_is_connected()) { - light_ctrl_set_green_light_effect(kLightEffect_slowFlash); - } - - } else { - if (p_event->eventType == kappevent_battery_start_charge) { - zapp_state_machine_change_state(kstate_charging); - } else if (!device_info_get_active_flag() && zapp_state_machine_haspassed_ms() >= 60000) { - ZLOGI_BLOCK("rtc not setted, power system off"); - ZERROR_CHECK(sd_power_system_off()); - } - } - - } else if (zapp_state_machine_now_state() == kstate_welcomPage) { - /** - * @brief - * 延迟1.5s切换到主页面 - */ - - if (event == kappevent_state_machine_state_enter) { - dsp_mgr_change_page(kpage_welcome); - } else if (event == kappevent_state_machine_state_exit) { - } else { - if (p_event->eventType == kappevent_start_capture) { - zapp_state_machine_change_state(kstate_prepare_capture); - } else if (zapp_state_machine_haspassed_ms() >= 2000) { - zapp_state_machine_change_state(kstate_mainPage); - beep_set_effect(POWER_ON_EFFECT); - } - } - - } else if (zapp_state_machine_now_state() == kstate_mainPage) { - /** - * @brief - * 1. 断开连接->切换到关机状态 - * 2. 开始采集指令->切换到采集状态 - * 3. 充电中事件->切换到充电状态 - * - */ - if (event == kappevent_state_machine_state_enter) { - dsp_mgr_change_page(kpage_main); - } else if (event == kappevent_state_machine_state_exit) { - } else { - if (zble_module_has_disconnected_ms() >= 3000) { - zapp_state_machine_change_state(kstate_standby); - } else if (event == kappevent_start_capture) { - zapp_state_machine_change_state(kstate_prepare_capture); - } else if (event == kappevent_battery_start_charge) { - zapp_state_machine_change_state(kstate_charging); - } - } - - } else if (zapp_state_machine_now_state() == kstate_prepare_capture) { - /** - * @brief - * 1. 停止采集指令->切换到MainPage - * 2. 断开连接 ->切换到关机状态 - * 3. 检查leadoff状态 - */ - if (event == kappevent_state_machine_state_enter) { - m_capture_prepare_progress = 0; - dsp_mgr_change_page(kpage_sample_prepare); - ecg_service_start_capture(); - beep_set_effect(START_SAMPLE_EFFECT); - } else if (event == kappevent_state_machine_state_exit) { - } else { - zapp_state_machine_change_state(kstate_capture); - -#if 0 - if (zble_module_has_disconnected_ms() >= 5000) { - ecg_service_stop_capture(); - zapp_state_machine_change_state(kstate_standby); - } else if (event == kappevent_stop_capture) { - ecg_service_stop_capture(); - zapp_state_machine_change_state(kstate_mainPage); - } else { - if (event == kappevent_tmr_1s_scheduler_event) { - if (!ecg_leadoff_detect() && zapp_state_machine_haspassed_ms() > 1500) { - m_capture_prepare_progress++; - if (m_capture_prepare_progress < 4) { - dsp_mgr_page_sample_prepare_set_progress(m_capture_prepare_progress); - } else { - /** - * @brief 开始采集 - */ - zapp_state_machine_change_state(kstate_capture); - beep_set_effect(POWER_ON_EFFECT); - } - } else { - m_capture_prepare_progress = 0; - dsp_mgr_page_sample_prepare_set_progress(m_capture_prepare_progress); - } - } - } -#endif - } - - } else if (zapp_state_machine_now_state() == kstate_capture) { - /** - * @brief - * 1. 停止采集指令->切换到MainPage - * 2. 断开连接 ->切换到关机状态 - */ - if (event == kappevent_state_machine_state_enter) { - ecg_service_start_capture(); - dsp_mgr_change_page(kpage_sampling); - } else if (event == kappevent_state_machine_state_exit) { - ecg_service_stop_capture(); - beep_set_effect(STOP_SAMPLE_EFFECT); - } else { - if (zble_module_has_disconnected_ms() >= 2000) { - zapp_state_machine_change_state(kstate_capture_end); - } else if (event == kappevent_stop_capture) { - zapp_state_machine_change_state(kstate_capture_end); - } else if (event == kecg_data_report_event) { - report_ecg_data(p_event); - } - } - - } else if (zapp_state_machine_now_state() == kstate_capture_end) { - if (event == kappevent_state_machine_state_enter) { - dsp_mgr_change_page(kpage_sampling_end); - } else if (event == kappevent_state_machine_state_exit) { - } else { - if (zapp_state_machine_haspassed_ms() > 2000) { - zapp_state_machine_change_state(kstate_mainPage); - } - } - } - - else if (zapp_state_machine_now_state() == kstate_charging) { - /** - * @brief - * 1. 充电结束事件->切换到待机 - */ - if (event == kappevent_state_machine_state_enter) { - dsp_mgr_change_page(kpage_charging_page); - } else if (event == kappevent_state_machine_state_exit) { - } else { - if (event == kappevent_battery_end_charge) { - if (!zble_module_is_connected()) { - zapp_state_machine_change_state(kstate_standby); - } else { - zapp_state_machine_change_state(kstate_mainPage); - } - } - } - - } else if (zapp_state_machine_now_state() == kstate_test) { - // extern int32_t maxval; - // extern int32_t minval; - extern uint8_t m_leadoff_raw_state; - - ZLOGI("tmr event. %d %x", ecg_leadoff_detect(), m_leadoff_raw_state); - } + ZLOGI("event:%d", p_event->eventType) } /*********************************************************************************************************************** @@ -461,18 +110,18 @@ void one_conduction_main() { zapp_state_machine_reg_state_change_listener(on_state_change); zble_module_reglistener(on_zble_event); - adc_mgr_init(); - hardware_power_mgr_init(); + // adc_mgr_init(); + // hardware_power_mgr_init(); - battery_mgr_service_init(); - battery_mgr_service_load(); + // battery_mgr_service_init(); + // battery_mgr_service_load(); - light_ctrl_init(); - beep_init(); - dsp_mgr_init(); - ecg_service_init(); + // light_ctrl_init(); + // beep_init(); + // dsp_mgr_init(); + // ecg_service_init(); - // zapp_state_machine_change_state(kstate_capture); + zapp_state_machine_change_state(kstate_standby); zble_module_start_adv(); zapp_start_schedule(); diff --git a/scripter/build_app.bat b/scripter/build_app.bat index eb65bbb..709007d 100644 --- a/scripter/build_app.bat +++ b/scripter/build_app.bat @@ -1,13 +1,15 @@ @echo off +md output + @REM 编译app call scripter\keil_build.bat app\app.uvprojx app\_build\app.hex del output\app_whole.hex del output\app.zip -del output\one_lead_ecg_ads1291.zip -del output\one_lead_ecg_ads1291.hex +del output\hand_acid_remoter.zip +del output\hand_acid_remoter.hex @REM 检查是否编译成功 if not exist app\_build\app.hex ( @@ -59,5 +61,5 @@ del output\settings.hex del output\app.hex -copy /y output\app.zip output\one_lead_ecg_ads1291.zip -copy /y output\app_whole.hex output\one_lead_ecg_ads1291.hex +copy /y output\app.zip output\hand_acid_remoter.zip +copy /y output\app_whole.hex output\hand_acid_remoter.hex diff --git a/scripter/build_dynamic_electrocardiograph_ble_server.bat b/scripter/build_dynamic_electrocardiograph_ble_server.bat deleted file mode 100644 index 8b72e6d..0000000 --- a/scripter/build_dynamic_electrocardiograph_ble_server.bat +++ /dev/null @@ -1,32 +0,0 @@ - -set UV_PRO_PATH=dynamic_electrocardiograph_ble_server\ble_app_uart_c_pca10100_s122.uvprojx -set BUILD_RESULT=dynamic_electrocardiograph_ble_server\_build\dynamic_electrocardiograph_ble_server.hex - - -call scripter\keil_build.bat ^ - %UV_PRO_PATH% ^ - %BUILD_RESULT% - -if not exist %BUILD_RESULT% ( - echo EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE - echo E 编译 %UV_PRO_PATH% 失败 - echo EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE - exit /b 1 -) - -@REM 打包 -mergehex --merge ^ - res/s140_nrf52_7.2.0_softdevice.hex ^ - %BUILD_RESULT% ^ - --output output/dynamic_electrocardiograph_ble_server.hex - -if %errorlevel% neq 0 ( - echo EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE - echo E 打包失败 - echo EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE - exit /b 1 -) - -@REM 烧录 -nrfjprog --eraseall -f NRF52 %全擦除% -nrfjprog --program output/dynamic_electrocardiograph_ble_server.hex --verify -f NRF52 %烧录% \ No newline at end of file