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