diff --git a/app/app.uvoptx b/app/app.uvoptx
index 8161b10..427b1cc 100644
--- a/app/app.uvoptx
+++ b/app/app.uvoptx
@@ -147,7 +147,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
+ 19
+ 1
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ .\src\main.c
+
+
+
+
0
diff --git a/app/src/app_ble_service.c b/app/src/app_ble_service.c
index 8d089a7..9d09638 100644
--- a/app/src/app_ble_service.c
+++ b/app/src/app_ble_service.c
@@ -21,8 +21,12 @@ static bool m_realtime_report_state = false; // 实时
static uint8_t m_txbuf[128];
static uint8_t m_reportbuf[128];
+APP_TIMER_DEF(m_record_upload_tmr); // 数据上报定时器
+APP_TIMER_DEF(m_record_upload_finish_packet_report_tmr); // 数据上报完成上报定时器
+
static void prvf_process_ble_rx_data(void* p_event_data, uint16_t event_size);
static void process_ble_rx_data(void* p_event_data, uint16_t event_size);
+static void RecordUpload_tmr_cb(void* p_context);
/*******************************************************************************
* 蓝牙服务注册 *
@@ -139,6 +143,125 @@ void prvf_report_sample_data(uint32_t frameIndex, uint32_t data, uint32_t data2,
}
/*******************************************************************************
+ * 记录读取服务 *
+ *******************************************************************************/
+
+static int m_upload_fd;
+static uint8_t m_datacache[256];
+static int m_remaindatalen = 0;
+static uint32_t m_report_data_sumcheckcode = 0;
+static bool m_isupload_data_state = false;
+
+void RecordUpload_report_finish_event(uint32_t sumcheckcode) {
+ ify_hrs_packet_t* txheader = (ify_hrs_packet_t*)m_txbuf;
+ uint16_t sendlen = sizeof(ify_hrs_packet_t) + 4;
+
+ txheader->cmd = ify_hrs_report_record_upload_end; // 6A
+ txheader->frame_index = 0;
+ txheader->frame_type = kifyhrs_pt_report;
+
+ // txheader->data[0] = errorcode;
+ *(uint32_t*)txheader->data = sumcheckcode;
+
+ zdatachannel_data_send2(m_txbuf, sendlen);
+ return;
+}
+
+int RecordUpload_ble_stop_upload_record() {
+ m_isupload_data_state = false;
+ app_timer_stop(m_record_upload_tmr);
+ return 0;
+}
+/**
+ * @brief 数据上报定时器回调
+ *
+ * @param p_context
+ */
+static void RecordUpload_finish_packet_report_tmr_cb(void* p_context) { //
+ RecordUpload_report_finish_event(m_report_data_sumcheckcode);
+}
+
+static void RecordUpload_tmr_cb(void* p_context) { //
+
+ if (!m_isupload_data_state) return;
+
+ // sample_data_mgr_read
+ if (m_remaindatalen == 0) {
+ memset(m_datacache, 0, sizeof(m_datacache));
+ int32_t rdsize = SampleDataMgr_read(m_upload_fd, m_datacache, sizeof(m_datacache));
+ if (rdsize <= 0) {
+ ZLOGI("read file end,stop upload");
+ ZERROR_CHECK(app_timer_start(m_record_upload_finish_packet_report_tmr, APP_TIMER_TICKS(30), (void*)m_report_data_sumcheckcode));
+ RecordUpload_ble_stop_upload_record();
+ return;
+ }
+ m_remaindatalen = rdsize;
+ }
+ if (m_remaindatalen == 0) {
+ return;
+ }
+
+ int32_t mtusize = zble_module_get_mtu_size();
+ mtusize = mtusize < 128 ? mtusize : 128;
+
+ uint8_t* data = m_datacache + (sizeof(m_datacache) - m_remaindatalen);
+ int len = m_remaindatalen > mtusize ? mtusize : m_remaindatalen;
+
+ ZLOGI("upload %d %d %d", len, m_remaindatalen, mtusize);
+ if (!zdatachannel_is_connected()) {
+ ZLOGI("ble is disconnected,stop upload");
+ RecordUpload_ble_stop_upload_record();
+ return;
+ }
+
+ uint32_t suc = zdatachannel_block_data_send2(data, len);
+ if (suc != NRF_SUCCESS) {
+ if (suc == NRF_ERROR_INVALID_STATE) {
+ // 未使能notify
+ ZLOGI("ble unenable notify,stop upload");
+ RecordUpload_ble_stop_upload_record();
+ return;
+ } else if (suc == NRF_ERROR_BUSY || suc == NRF_ERROR_RESOURCES) {
+ // 等待下次发送
+ return;
+ } else {
+ ZLOGI("ble send error,stop upload %x", suc);
+ RecordUpload_ble_stop_upload_record();
+ return;
+ }
+ }
+ for (uint32_t i = 0; i < len; i++) {
+ m_report_data_sumcheckcode += data[i];
+ }
+ m_remaindatalen -= len;
+}
+
+int RecordUpload_start(sample_data_filename_t* recordid) {
+ //
+ // 启动
+ //
+ SampleDataMgr_changeToLocalMode();
+
+ m_upload_fd = SampleDataMgr_open(recordid, kwrflag_read_only);
+ if (m_upload_fd <= 0) {
+ return kifyhrs_ecode_no_record_find;
+ }
+
+ ZERROR_CHECK(app_timer_start(m_record_upload_tmr, APP_TIMER_TICKS(2), NULL));
+ m_isupload_data_state = true;
+ m_remaindatalen = 0;
+ m_report_data_sumcheckcode = 0;
+ return 0;
+}
+int RecordUpload_stop_upload() {
+ m_isupload_data_state = false;
+ SampleDataMgr_changeToExtMode();
+ app_timer_stop(m_record_upload_tmr);
+ return 0;
+}
+bool RecordUpload_is_uploading() { return m_isupload_data_state; }
+
+/*******************************************************************************
* 消息处理 *
*******************************************************************************/
static void process_ble_rx_data(void* p_event_data, uint16_t event_size) { //
@@ -152,16 +275,13 @@ static void prvf_process_ble_rx_data(void* p_event_data, uint16_t len) {
ify_hrs_cmd_t cmd = (ify_hrs_cmd_t)rxheader->cmd;
memset(m_txbuf, 0, sizeof(m_txbuf));
- ZLOGI("rx:");
- NRF_LOG_HEXDUMP_INFO(p_event_data, len);
ZLOGI("rx cmd:%d index:%d datalen:%d", cmd, rxheader->frame_index, len - sizeof(ify_hrs_packet_t));
+ NRF_LOG_HEXDUMP_INFO(p_event_data, len);
txheader->cmd = rxheader->cmd;
txheader->frame_index = rxheader->frame_index;
txheader->frame_type = kifyhrs_pt_cmd_receipt;
- NRF_LOG_HEXDUMP_INFO(rxheader->data, len - sizeof(ify_hrs_packet_t));
-
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);
@@ -232,6 +352,12 @@ static void prvf_process_ble_rx_data(void* p_event_data, uint16_t len) {
else if (cmd == ify_hrs_cmd_start_capture) {
// hwss_start_capture();
+
+ if (RecordUpload_is_uploading()) {
+ ZLOGI("uploading,can not start capture");
+ send_error_receipt(rxheader, kifyhrs_ecode_device_busy);
+ }
+
DeviceCtrl_startSample();
send_success_receipt(rxheader, 0);
}
@@ -307,7 +433,31 @@ static void prvf_process_ble_rx_data(void* p_event_data, uint16_t len) {
else if (cmd == ify_hrs_cmd_start_upload_record) {
// 指令 12-上传采集记录
- send_error_receipt(rxheader, kifyhrs_ecode_cmd_not_support);
+ // send_error_receipt(rxheader, kifyhrs_ecode_cmd_not_support);
+
+ start_upload_record_cmd_t* cmd = (start_upload_record_cmd_t*)rxheader->data;
+
+ static sample_data_filename_t filename;
+ memset(&filename, 0, sizeof(filename));
+ memcpy(&filename, cmd->record_id, sizeof(cmd->record_id));
+
+ // 采样时不支持
+ if (DeviceCtrl_now_state() != kdevice_state_ready) {
+ send_error_receipt(rxheader, kifyhrs_ecode_device_busy);
+ return;
+ }
+
+ int ecode = RecordUpload_start(&filename);
+ if (0 == 0) {
+ send_success_receipt(rxheader, 0);
+ } else {
+ send_error_receipt(rxheader, 0);
+ }
+ }
+
+ else if (cmd == ify_hrs_cmd_stop_upload_record) {
+ RecordUpload_stop_upload();
+ send_success_receipt(rxheader, 0);
}
else if (cmd == ify_hrs_cmd_enter_ota) {
@@ -358,7 +508,7 @@ static void app_event_listener(void* p_event_data, uint16_t event_size) { //
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);
+ prvf_try_report_sensor_drop_event(drop0, drop1);
}
} else if (event->eventType == kevent_sample_stop_event) {
@@ -375,4 +525,13 @@ static void app_event_listener(void* p_event_data, uint16_t event_size) { //
}
}
-void AppBleService_init() { AppEvent_regListener(app_event_listener); }
+bool m_ble_cmder_is_inited = false;
+void AppBleService_init() {
+ AppEvent_regListener(app_event_listener);
+
+ if (!m_ble_cmder_is_inited) {
+ ZERROR_CHECK(app_timer_create(&m_record_upload_tmr, APP_TIMER_MODE_REPEATED, RecordUpload_tmr_cb));
+ ZERROR_CHECK(app_timer_create(&m_record_upload_finish_packet_report_tmr, APP_TIMER_MODE_SINGLE_SHOT, RecordUpload_finish_packet_report_tmr_cb));
+ }
+ m_ble_cmder_is_inited = true;
+}
diff --git a/app/src/sample_data_manager_service.c b/app/src/sample_data_manager_service.c
index 505c0cf..b2c49cf 100644
--- a/app/src/sample_data_manager_service.c
+++ b/app/src/sample_data_manager_service.c
@@ -109,11 +109,21 @@ void SampleDataMgr_changeToExtMode() {
static FIL m_default_file_handler;
static bool m_is_open;
-int32_t SampleDataMgr_open(sample_data_filename_t* filename, wrflag_t flag) {
- FRESULT ff_result = f_open(&m_default_file_handler, (const TCHAR*)"0.bin", FA_CREATE_ALWAYS | FA_READ | FA_WRITE);
- ZASSERT(ff_result == FR_OK);
- m_is_open = true;
- return 1;
+
+int32_t SampleDataMgr_open(sample_data_filename_t* filename, wrflag_t flag) {
+ if (flag == kwrflag_write_only) {
+ FRESULT ff_result = f_open(&m_default_file_handler, (const TCHAR*)"0.bin", FA_CREATE_ALWAYS | FA_READ | FA_WRITE);
+ ZASSERT(ff_result == FR_OK);
+ m_is_open = true;
+ return 1;
+ } else {
+ FRESULT ff_result = f_open(&m_default_file_handler, (const TCHAR*)"0.bin", FA_READ);
+ if (ff_result != FR_OK) {
+ return -1;
+ }
+ m_is_open = true;
+ return 1;
+ }
}
int32_t SampleDataMgr_close(int32_t fd) {
ZASSERT(m_is_open);
diff --git a/libznordic b/libznordic
index abd42bc..dd5788e 160000
--- a/libznordic
+++ b/libznordic
@@ -1 +1 @@
-Subproject commit abd42bcb1415ad3178e4f876c5274f820856351c
+Subproject commit dd5788e214bada44f7f8906702a52fed9b3a91ae