|
|
@ -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; |
|
|
|
} |