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