diff --git a/app/app.uvoptx b/app/app.uvoptx index d3ea4eb..8161b10 100644 --- a/app/app.uvoptx +++ b/app/app.uvoptx @@ -119,6 +119,10 @@ 0 + DLGUARM + + + 0 ARMRTXEVENTFLAGS -L70 -Z18 -C0 -M0 -T1 @@ -143,24 +147,7 @@ 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 - 125 - 1 -
207178
- 0 - 0 - 0 - 0 - 0 - 1 - .\src\device_ctrl_service.c - - \\nrf52833_xxaa\src/device_ctrl_service.c\125 -
-
+ 0 diff --git a/app/src/app_ble_service.c b/app/src/app_ble_service.c index 846d78f..8d089a7 100644 --- a/app/src/app_ble_service.c +++ b/app/src/app_ble_service.c @@ -329,7 +329,16 @@ static void prvf_process_ble_rx_data(void* p_event_data, uint16_t len) { send_error_receipt(rxheader, kifyhrs_ecode_cmd_not_support); } } - +static const char* dropstate(uint8_t drop0, uint8_t drop1) { + static char state[128]; + sprintf(state, "drop0:%d%d%d%d-%d%d%d%d drop1:%d%d%d%d-%d%d%d%d", // + drop0 & 0x80 ? 1 : 0, drop0 & 0x40 ? 1 : 0, drop0 & 0x20 ? 1 : 0, drop0 & 0x10 ? 1 : 0, // + drop0 & 0x08 ? 1 : 0, drop0 & 0x04 ? 1 : 0, drop0 & 0x02 ? 1 : 0, drop0 & 0x01 ? 1 : 0, // + drop1 & 0x80 ? 1 : 0, drop1 & 0x40 ? 1 : 0, drop1 & 0x20 ? 1 : 0, drop1 & 0x10 ? 1 : 0, // + drop1 & 0x08 ? 1 : 0, drop1 & 0x04 ? 1 : 0, drop1 & 0x02 ? 1 : 0, drop1 & 0x01 ? 1 : 0 // + ); + return state; +} void AppBleService_onServiceInitCB() { ZLOGI("init zdatachannel service"); static zdatachannel_init_t zdatachannle_init; @@ -342,6 +351,16 @@ static void app_event_listener(void* p_event_data, uint16_t event_size) { // app_event_t* event = (app_event_t*)p_event_data; if (event->eventType == kevent_sensor_drop) { prvf_try_report_sensor_drop_event(event->val.sensor_drop.drop0, event->val.sensor_drop.drop1); + } else if (event->eventType == kevent_tmr_scheduler) { + static int cnt = 0; + cnt++; + if (DeviceCtrl_now_state() == kdevice_state_sampling && cnt % 10 == 0) { + uint8_t drop0 = hwss_get_drop_state0(); + uint8_t drop1 = hwss_get_drop_state1(); + ZLOGI("[%d] drop %s", znordic_getpower_on_ms(), dropstate(drop0, drop1)); + prvf_try_report_sensor_drop_event(drop0,drop1); + } + } else if (event->eventType == kevent_sample_stop_event) { prvf_try_report_sample_end_event(); } else if (event->eventType == kevent_capture_little_data_block_event) { diff --git a/app/src/board/board.h b/app/src/board/board.h index 3780cb8..e1f7875 100644 --- a/app/src/board/board.h +++ b/app/src/board/board.h @@ -15,10 +15,10 @@ /** * @brief SDCARD */ -#define SDCARD_SPI_SCK_PIN 4 // SDCARD SCK -#define SDCARD_SPI_CS_PIN 5 // SDCARD CS -#define SDCARD_SPI_MISO_PIN 11 // SDCARD MISO -#define SDCARD_SPI_MOSI_PIN 17 // SDCARD MOSI +#define SDCARD_SPI_SCK_PIN 4 // SDCARD SCK CLK +#define SDCARD_SPI_CS_PIN 5 // SDCARD CS DATA3 +#define SDCARD_SPI_MISO_PIN 11 // SDCARD MISO DATA0 +#define SDCARD_SPI_MOSI_PIN 17 // SDCARD MOSI CMD #define SDCARD_USBDRIVER_IC_JUNCTION_CTRL_NOE_PIN 1 // flash连接控制引脚 #define SDCARD_USBDRIVER_IC_RESET_PIN 28 // flash复位引脚 @@ -40,12 +40,12 @@ /******************************************************************************* * 按键 * *******************************************************************************/ -#define BUTTON_PIN 0 +#define BUTTON_PIN 18 /******************************************************************************* * 蜂鸣器 * *******************************************************************************/ -#define BEEP_PIN 18 +#define BEEP_PIN 0 /******************************************************************************* * 电池电量 * @@ -64,7 +64,7 @@ #define SAMPLE_PRECISION 24 #define APP_MAX_EVEN_SIZE MAX(APP_TIMER_SCHED_EVENT_DATA_SIZE, sizeof(app_event_t)) -#define APP_EVENT_QUEUE_SIZE 20 +#define APP_EVENT_QUEUE_SIZE 100 #define APP_AUTO_SLEEP_TIMEOUT_MS (10 * 1000) #define APP_BYTE_EACH_FRAME 9 diff --git a/app/src/board/board_sdcard_driver.c b/app/src/board/board_sdcard_driver.c index a1ad682..3945135 100644 --- a/app/src/board/board_sdcard_driver.c +++ b/app/src/board/board_sdcard_driver.c @@ -146,7 +146,7 @@ void Board_sdcardConnectToInternal() { * @brief 挂载SD卡 */ DSTATUS disk_state = STA_NOINIT; - for (uint32_t retries = 3; retries && disk_state; --retries) { + for (uint32_t retries = 10; retries && disk_state; --retries) { disk_state = disk_initialize(0); } if (disk_state != 0) { diff --git a/app/src/device_ctrl_service.c b/app/src/device_ctrl_service.c index 1056ef3..9b092a7 100644 --- a/app/src/device_ctrl_service.c +++ b/app/src/device_ctrl_service.c @@ -57,7 +57,7 @@ static void zble_event_listener(zble_event_t* ble_event) { // * 事件处理 * *******************************************************************************/ static bool m_ispoweron = false; -static bool m_drop_state_triggered = false; +//static bool m_drop_state_triggered = false; static void poweroff() { if (!m_ispoweron) return; BoardBeepCtrl_unload(); @@ -65,7 +65,7 @@ static void poweroff() { BoardBattery_unload(); BoardButton_unload(); SampleDataMgr_unloadDriver(); - hwss_unload(); + // hwss_unload(); DeviceCtrl_change_to_state(kdevice_state_standby); zble_module_stop_adv(); BoardLight_setGreenLightEffect(kLightEffect_close); @@ -88,7 +88,6 @@ static void poweron() { BoardBattery_load(); BoardButton_load(); SampleDataMgr_loadDriver(); - hwss_load(); DeviceCtrl_change_to_state(kdevice_state_ready); zble_module_start_adv(); BoardLight_setGreenLightEffect(kLightEffect_slowFlash); @@ -119,6 +118,7 @@ static void prvf_change_to_ready_state() { DeviceCtrl_change_to_state(kdevice_state_ready); BoardBeepCtrl_setEffect(kBoardBeepEffect_oneShortBeep); } +#if 0 static const char* dropstate(uint8_t drop0, uint8_t drop1) { static char state[128]; sprintf(state, "drop0:%d%d%d%d-%d%d%d%d drop1:%d%d%d%d-%d%d%d%d", // @@ -129,6 +129,7 @@ static const char* dropstate(uint8_t drop0, uint8_t drop1) { ); return state; } +#endif static void prvf_change_to_sample_state() { // if (m_device_state == kdevice_state_sampling) { return; @@ -138,12 +139,12 @@ static void prvf_change_to_sample_state() { // static void app_event_listener(void* p_event_data, uint16_t event_size) { // app_event_t* event = (app_event_t*)p_event_data; - static bool inited; - if (!inited) { - nrf_gpio_cfg_input(BUTTON_PIN, NRF_GPIO_PIN_NOPULL); - inited = true; - } - ZLOGI("button %d", nrf_gpio_pin_read(BUTTON_PIN)); + //static bool inited; + // if (!inited) { + // nrf_gpio_cfg_input(BUTTON_PIN, NRF_GPIO_PIN_NOPULL); + // inited = true; + // } + // ZLOGI("button %d", nrf_gpio_pin_read(BUTTON_PIN)); /******************************************************************************* * 状态无关事件处理 * @@ -175,6 +176,7 @@ static void app_event_listener(void* p_event_data, uint16_t event_size) { // ZLOGI("start sample"); // SD卡连接到单片机 SampleDataMgr_changeToLocalMode(); + hwss_load(); // 创建文件 m_sample_data_fd = SampleDataMgr_open(cratefilename(), kwrflag_write_only); ZASSERT(m_sample_data_fd > 0); @@ -204,7 +206,7 @@ static void app_event_listener(void* p_event_data, uint16_t event_size) { // uint8_t drop1 = hwss_get_drop_state1(); if ((drop0 || drop1) && event->eventType == kevent_tmr_scheduler) { - ZLOGI("[%d] drop %s", znordic_getpower_on_ms(), dropstate(drop0, drop1)); + // ZLOGI("[%d] drop %s", znordic_getpower_on_ms(), dropstate(drop0, drop1)); } bool stopcapture = false; @@ -223,6 +225,8 @@ static void app_event_listener(void* p_event_data, uint16_t event_size) { // SampleDataMgr_changeToExtMode(); // 停止采集 hwss_stop_capture(); + // 卸载心电采集服务 + hwss_unload(); // 切换到待机状态 prvf_change_to_ready_state(); @@ -272,6 +276,10 @@ void DeviceCtrl_init() { // 切换到待机状态 prvf_change_to_ready_state(); + // BoardBeepCtrl_init(); + // BoardBeepCtrl_load(); + // BoardBeepCtrl_setEffect(kBoardBeepEffect_continuousShortBeep); + 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(100), NULL)); // 200HZ采样 } diff --git a/app/src/heart_wave_sample_service.c b/app/src/heart_wave_sample_service.c index 22ea6e3..a792c0c 100644 --- a/app/src/heart_wave_sample_service.c +++ b/app/src/heart_wave_sample_service.c @@ -41,6 +41,9 @@ static adscfg_t m_prvads1cfg[] = // {0x25, 0x00}, {0x26, 0x00}, {0x27, 0x08}, {0x28, 0x40}, {0x29, 0x00}, {0x2a, 0x00}, {0x2b, 0x00}, {0x2c, 0x00}, {0x2d, 0x00}, {0x2e, 0x33}, {0x2f, 0x30}, {0x30, 0x00}, {0x31, 0x00}, {0x32, 0x00}, {0x33, 0x00}, {0x34, 0x00}, {0x35, 0x00}, {0x36, 0x00}, {0x37, 0x00}, {0x38, 0x00}, {0x39, 0x00}, {0x3a, 0x00}, {0x3b, 0x00}, {0x3c, 0x00}, {0x3d, 0x00}, {0x3e, 0x00}, {0x3f, 0x00}, {0x40, 0xff}, {0x50, 0x00}, {0x60, 0x00}, {0x62, 0x00}, }; + +static adscfg_t m_prvads0cfg_cache[65]; +static adscfg_t m_prvads1cfg_cache[65]; /******************************************************************************* * VARIABLE * *******************************************************************************/ @@ -72,7 +75,7 @@ volatile static bool m_drop_state_triggered = false; *******************************************************************************/ // READY_PIN 中断回调函数 -static void ads1293_ready_pin_irq(nrfx_gpiote_pin_t pin, nrf_gpiote_polarity_t action); +//static void ads1293_ready_pin_irq(nrfx_gpiote_pin_t pin, nrf_gpiote_polarity_t action); // 缓冲区切换BUFFER static void prvf_buffer_switch(void); @@ -196,6 +199,38 @@ static void ads1293_spi_writereg_and_check(ads1293_t* ads, uint8_t addr, uint8_t } } +static void tryloadcfg_from_fatfs(const char* file, adscfg_t* cfg, uint16_t cfgsize, uint16_t* cfg_ret_size) { + // + *cfg_ret_size = 0; + + static FIL fd; + FRESULT ff_result = f_open(&fd, (const TCHAR*)file, FA_READ); + if (ff_result != FR_OK) { + ZLOGE("open %s failed\n", file); + return; + } + + char line[128]; + int niterm = 0; + f_gets(line, 128, &fd); + + while (f_gets(line, 128, &fd)) { + uint32_t addr; + uint32_t value; + sscanf(line, "%x,%x", &addr, &value); + cfg[niterm].add = addr; + cfg[niterm].data = value; + niterm++; + + if (niterm >= cfgsize) { + break; + } + } + *cfg_ret_size = niterm; + ZLOGI("load %s cfg size:%d\n", file, niterm); + f_close(&fd); +} + static void ads1293_init() { /******************************************************************************* * SPI初始化 * @@ -232,11 +267,43 @@ static void ads1293_init() { ads1293_spi_writereg(&m_ads1293_0, TI_ADS1293_CONFIG_REG, 0); - for (uint16_t i = 0; i < ZARRAY_SIZE(m_prvads0cfg); i++) { - ads1293_spi_writereg_and_check(&m_ads1293_0, m_prvads0cfg[i].add, m_prvads0cfg[i].data); + uint16_t cfgsize = 0; + tryloadcfg_from_fatfs("0.cfg", m_prvads0cfg_cache, ZARRAY_SIZE(m_prvads0cfg_cache), &cfgsize); + if (cfgsize > 0) { + ZLOGI("load 0.cfg from fatfs\n"); + + if (memcmp(m_prvads0cfg_cache, m_prvads0cfg, sizeof(m_prvads0cfg)) != 0) { + ZLOGI("0.cfg is different from default\n"); + } else { + ZLOGI("0.cfg is same as default\n"); + } + + for (uint16_t i = 0; i < cfgsize; i++) { + ads1293_spi_writereg_and_check(&m_ads1293_0, m_prvads0cfg_cache[i].add, m_prvads0cfg_cache[i].data); + } + } else { + for (uint16_t i = 0; i < ZARRAY_SIZE(m_prvads0cfg); i++) { + ads1293_spi_writereg_and_check(&m_ads1293_0, m_prvads0cfg[i].add, m_prvads0cfg[i].data); + } } - for (uint16_t i = 0; i < ZARRAY_SIZE(m_prvads1cfg); i++) { - ads1293_spi_writereg_and_check(&m_ads1293_1, m_prvads1cfg[i].add, m_prvads1cfg[i].data); + + tryloadcfg_from_fatfs("1.cfg", m_prvads1cfg_cache, ZARRAY_SIZE(m_prvads1cfg_cache), &cfgsize); + if (cfgsize > 0) { + ZLOGI("load 1.cfg from fatfs\n"); + + if (memcmp(m_prvads1cfg_cache, m_prvads1cfg, sizeof(m_prvads1cfg)) != 0) { + ZLOGI("1.cfg is different from default\n"); + } else { + ZLOGI("1.cfg is same as default\n"); + } + + for (uint16_t i = 0; i < cfgsize; i++) { + ads1293_spi_writereg_and_check(&m_ads1293_1, m_prvads1cfg_cache[i].add, m_prvads1cfg_cache[i].data); + } + } else { + for (uint16_t i = 0; i < ZARRAY_SIZE(m_prvads1cfg); i++) { + ads1293_spi_writereg_and_check(&m_ads1293_1, m_prvads1cfg[i].add, m_prvads1cfg[i].data); + } } /** @@ -259,7 +326,7 @@ void ads1293_sample_one_frame(); void nrfx_timer_event_handler(nrf_timer_event_t event_type, void* p_context) { // ads1293_sample_one_frame(); } -static void ads1293_ready_pin_irq(nrfx_gpiote_pin_t pin, nrf_gpiote_polarity_t action) { ads1293_sample_one_frame(); } +//static void ads1293_ready_pin_irq(nrfx_gpiote_pin_t pin, nrf_gpiote_polarity_t action) { ads1293_sample_one_frame(); } static void ads1293_sample_one_frame() { if (!m_work_flag) { return; diff --git a/sdk b/sdk index 4518670..20c99a0 160000 --- a/sdk +++ b/sdk @@ -1 +1 @@ -Subproject commit 45186701cdfa870204e0975dbf12a0feb50be71d +Subproject commit 20c99a0fe48fe28d0443e4f4429b9fcb9b3c0462