diff --git a/README.md b/README.md index f1dfd34..0b421f4 100644 --- a/README.md +++ b/README.md @@ -221,6 +221,17 @@ TODO: 2. 如果要实现不丢数据,需要在eeprom中存储文件扇区信息,同时由于扇区的大小大于256字节,所以需要优化eeprom的写入函数。 单导蓝牙使用注意事项: + + 1. 开机后 + 开启广播 + 2. 关机 + 关闭广播 + 关机条件: + 1. 蓝牙断开 + 2. 设备未操作 + 3. 30s内无任何蓝牙指令(连接) + + 1. 蓝牙的广播的启停独立控制和设备开机关机逻辑分开 开启广播:开机时候,如果当前没有开启广播,则打开广播 关闭广播: 关机后30s内无连接关闭广播 diff --git a/app/app.uvoptx b/app/app.uvoptx index 0c3dc85..2b07cb9 100644 --- a/app/app.uvoptx +++ b/app/app.uvoptx @@ -619,6 +619,18 @@ 0 0 + + 1 + 22 + 1 + 0 + 0 + 0 + .\src\basic\device_info_mgr.c + device_info_mgr.c + 0 + 0 + @@ -629,7 +641,7 @@ 0 2 - 22 + 23 1 0 0 @@ -649,7 +661,7 @@ 0 3 - 23 + 24 1 0 0 @@ -661,7 +673,7 @@ 3 - 24 + 25 1 0 0 @@ -681,7 +693,7 @@ 0 4 - 25 + 26 1 0 0 @@ -701,7 +713,7 @@ 0 5 - 26 + 27 1 0 0 @@ -713,7 +725,7 @@ 5 - 27 + 28 1 0 0 @@ -725,7 +737,7 @@ 5 - 28 + 29 1 0 0 @@ -737,7 +749,7 @@ 5 - 29 + 30 1 0 0 @@ -749,7 +761,7 @@ 5 - 30 + 31 1 0 0 @@ -761,7 +773,7 @@ 5 - 31 + 32 1 0 0 @@ -773,7 +785,7 @@ 5 - 32 + 33 1 0 0 @@ -785,7 +797,7 @@ 5 - 33 + 34 1 0 0 @@ -805,7 +817,7 @@ 0 6 - 34 + 35 1 0 0 @@ -825,7 +837,7 @@ 0 7 - 35 + 36 1 0 0 @@ -837,7 +849,7 @@ 7 - 36 + 37 1 0 0 @@ -849,7 +861,7 @@ 7 - 37 + 38 1 0 0 @@ -861,7 +873,7 @@ 7 - 38 + 39 1 0 0 @@ -873,7 +885,7 @@ 7 - 39 + 40 1 0 0 @@ -885,7 +897,7 @@ 7 - 40 + 41 1 0 0 @@ -897,7 +909,7 @@ 7 - 41 + 42 1 0 0 @@ -909,7 +921,7 @@ 7 - 42 + 43 1 0 0 @@ -921,7 +933,7 @@ 7 - 43 + 44 1 0 0 @@ -933,7 +945,7 @@ 7 - 44 + 45 1 0 0 @@ -945,7 +957,7 @@ 7 - 45 + 46 1 0 0 @@ -957,7 +969,7 @@ 7 - 46 + 47 1 0 0 @@ -969,7 +981,7 @@ 7 - 47 + 48 1 0 0 @@ -981,7 +993,7 @@ 7 - 48 + 49 1 0 0 @@ -993,7 +1005,7 @@ 7 - 49 + 50 1 0 0 @@ -1005,7 +1017,7 @@ 7 - 50 + 51 1 0 0 @@ -1017,7 +1029,7 @@ 7 - 51 + 52 1 0 0 @@ -1029,7 +1041,7 @@ 7 - 52 + 53 1 0 0 @@ -1041,7 +1053,7 @@ 7 - 53 + 54 1 0 0 @@ -1053,7 +1065,7 @@ 7 - 54 + 55 1 0 0 @@ -1073,7 +1085,7 @@ 0 8 - 55 + 56 1 0 0 @@ -1085,7 +1097,7 @@ 8 - 56 + 57 1 0 0 @@ -1097,7 +1109,7 @@ 8 - 57 + 58 1 0 0 @@ -1109,7 +1121,7 @@ 8 - 58 + 59 1 0 0 @@ -1121,7 +1133,7 @@ 8 - 59 + 60 1 0 0 @@ -1133,7 +1145,7 @@ 8 - 60 + 61 1 0 0 @@ -1145,7 +1157,7 @@ 8 - 61 + 62 1 0 0 @@ -1157,7 +1169,7 @@ 8 - 62 + 63 1 0 0 @@ -1169,7 +1181,7 @@ 8 - 63 + 64 1 0 0 @@ -1181,7 +1193,7 @@ 8 - 64 + 65 1 0 0 @@ -1193,7 +1205,7 @@ 8 - 65 + 66 1 0 0 @@ -1205,7 +1217,7 @@ 8 - 66 + 67 1 0 0 @@ -1217,7 +1229,7 @@ 8 - 67 + 68 1 0 0 @@ -1229,7 +1241,7 @@ 8 - 68 + 69 1 0 0 @@ -1241,7 +1253,7 @@ 8 - 69 + 70 1 0 0 @@ -1253,7 +1265,7 @@ 8 - 70 + 71 1 0 0 @@ -1265,7 +1277,7 @@ 8 - 71 + 72 1 0 0 @@ -1277,7 +1289,7 @@ 8 - 72 + 73 1 0 0 @@ -1289,7 +1301,7 @@ 8 - 73 + 74 1 0 0 @@ -1301,7 +1313,7 @@ 8 - 74 + 75 1 0 0 @@ -1313,7 +1325,7 @@ 8 - 75 + 76 1 0 0 @@ -1325,7 +1337,7 @@ 8 - 76 + 77 1 0 0 @@ -1337,7 +1349,7 @@ 8 - 77 + 78 1 0 0 @@ -1349,7 +1361,7 @@ 8 - 78 + 79 1 0 0 @@ -1361,7 +1373,7 @@ 8 - 79 + 80 1 0 0 @@ -1373,7 +1385,7 @@ 8 - 80 + 81 1 0 0 @@ -1385,7 +1397,7 @@ 8 - 81 + 82 1 0 0 @@ -1405,7 +1417,7 @@ 0 9 - 82 + 83 1 0 0 @@ -1417,7 +1429,7 @@ 9 - 83 + 84 1 0 0 @@ -1429,7 +1441,7 @@ 9 - 84 + 85 1 0 0 @@ -1441,7 +1453,7 @@ 9 - 85 + 86 1 0 0 @@ -1453,7 +1465,7 @@ 9 - 86 + 87 1 0 0 @@ -1465,7 +1477,7 @@ 9 - 87 + 88 1 0 0 @@ -1485,7 +1497,7 @@ 0 10 - 88 + 89 1 0 0 @@ -1497,7 +1509,7 @@ 10 - 89 + 90 1 0 0 @@ -1509,7 +1521,7 @@ 10 - 90 + 91 1 0 0 @@ -1529,7 +1541,7 @@ 0 11 - 91 + 92 1 0 0 @@ -1541,7 +1553,7 @@ 11 - 92 + 93 1 0 0 @@ -1553,7 +1565,7 @@ 11 - 93 + 94 1 0 0 @@ -1573,7 +1585,7 @@ 0 12 - 94 + 95 1 0 0 @@ -1593,7 +1605,7 @@ 0 13 - 95 + 96 1 0 0 @@ -1605,7 +1617,7 @@ 13 - 96 + 97 1 0 0 diff --git a/app/app.uvprojx b/app/app.uvprojx index cea356e..a696e6c 100644 --- a/app/app.uvprojx +++ b/app/app.uvprojx @@ -488,6 +488,11 @@ 1 .\src\one_conduction\ble_cmd_process_service.c + + device_info_mgr.c + 1 + .\src\basic\device_info_mgr.c + @@ -4322,6 +4327,11 @@ 1 .\src\one_conduction\ble_cmd_process_service.c + + device_info_mgr.c + 1 + .\src\basic\device_info_mgr.c + diff --git a/app/src/basic/zdatachannel_service.c b/app/src/basic/zdatachannel_service.c index 8d3f214..3868763 100644 --- a/app/src/basic/zdatachannel_service.c +++ b/app/src/basic/zdatachannel_service.c @@ -174,7 +174,7 @@ uint32_t zdatachannel_init(zdatachannel_t *p_nus, zdatachannel_init_t const *p_n } uint32_t zdatachannel_data_send(uint8_t *p_data, uint16_t *p_length) { - ret_code_t err_code; + ble_gatts_hvx_params_t hvx_params; if (!p_datachannel->cmd_tx_channel_is_notification_enabled) { @@ -196,7 +196,7 @@ uint32_t zdatachannel_data_send(uint8_t *p_data, uint16_t *p_length) { } uint32_t zdatachannel_block_data_send(uint8_t *p_data, uint16_t *p_length) { - ret_code_t err_code; + ble_gatts_hvx_params_t hvx_params; if (!p_datachannel->datablock_tx_channel_is_notification_enabled) { diff --git a/app/src/basic/zdatachannel_service.h b/app/src/basic/zdatachannel_service.h index 9d3f8a3..bdd9d7f 100644 --- a/app/src/basic/zdatachannel_service.h +++ b/app/src/basic/zdatachannel_service.h @@ -78,7 +78,13 @@ uint32_t zdatachannel_init(zdatachannel_t* p_nus, zdatachannel_init_t const* p_n void zdatachannel_on_ble_evt(ble_evt_t const* p_ble_evt, void* p_context); uint32_t zdatachannel_data_send(uint8_t* p_data, uint16_t* p_length); +static inline uint32_t zdatachannel_data_send2(uint8_t* p_data, uint16_t p_length){ + return zdatachannel_data_send(p_data, &p_length); +} uint32_t zdatachannel_block_data_send(uint8_t* p_data, uint16_t* p_length); +static inline uint32_t zdatachannel_block_data_send2(uint8_t* p_data, uint16_t p_length){ + return zdatachannel_block_data_send(p_data, &p_length); +} #ifdef __cplusplus } diff --git a/app/src/one_conduction/ble_cmd_process_service.c b/app/src/one_conduction/ble_cmd_process_service.c index 71388d0..0ae27ec 100644 --- a/app/src/one_conduction/ble_cmd_process_service.c +++ b/app/src/one_conduction/ble_cmd_process_service.c @@ -26,7 +26,7 @@ static void send_error_receipt(ify_hrs_packet_t* rxpacket, int32_t errorcode) { txheader->frame_type = kifyhrs_pt_error_receipt; receipt->errorcode = kifyhrs_ecode_cmd_not_support; - zdatachannel_data_send(txbuf, sendlen); + zdatachannel_data_send2(txbuf, sendlen); } static void send_success_receipt(ify_hrs_packet_t* rxpacket) { @@ -37,7 +37,7 @@ static void send_success_receipt(ify_hrs_packet_t* rxpacket) { txheader->frame_index = rxpacket->frame_index; txheader->frame_type = kifyhrs_pt_cmd_receipt; - zdatachannel_data_send(txbuf, sendlen); + zdatachannel_data_send2(txbuf, sendlen); } /******************************************************************************* @@ -47,8 +47,7 @@ void ble_cmder_process_rx(uint8_t* rx, int len) { ify_hrs_packet_t* rxheader = (ify_hrs_packet_t*)rx; ify_hrs_packet_t* txheader = (ify_hrs_packet_t*)txbuf; - int packetdata_len = len - sizeof(ify_hrs_packet_t); - ify_hrs_cmd_t cmd = rxheader->cmd; + ify_hrs_cmd_t cmd = (ify_hrs_cmd_t)rxheader->cmd; txheader->cmd = rxheader->cmd; txheader->frame_index = rxheader->frame_index; @@ -64,7 +63,7 @@ void ble_cmder_process_rx(uint8_t* rx, int len) { receipt->bootloader_version = device_info_read_bootloader_version(); receipt->firmware_version = device_info_read_firmware_version(); receipt->hardware_version = device_info_read_hardware_version(); - zdatachannel_data_send(txbuf, sendlen); + zdatachannel_data_send2(txbuf, sendlen); } else if (ify_hrs_cmd_read_sensor_info) { @@ -78,7 +77,7 @@ void ble_cmder_process_rx(uint8_t* rx, int len) { receipt->sensor1_pos = kifyhrs_sensor_pos_none; receipt->sensor2_pos = kifyhrs_sensor_pos_none; - zdatachannel_data_send(txbuf, sendlen); + zdatachannel_data_send2(txbuf, sendlen); } else if (ify_hrs_cmd_read_device_state) { @@ -93,7 +92,7 @@ void ble_cmder_process_rx(uint8_t* rx, int len) { receipt->powerlevel = SingleLeadECG_battery_val(); receipt->storage_item_num = sample_data_mgr_get_file_num(); - zdatachannel_data_send(txbuf, sendlen); + zdatachannel_data_send2(txbuf, sendlen); } else if (ify_hrs_cmd_read_time) { @@ -108,7 +107,7 @@ void ble_cmder_process_rx(uint8_t* rx, int len) { receipt->hour = ztm.tm_hour; receipt->minute = ztm.tm_min; receipt->second = ztm.tm_sec; - zdatachannel_data_send(txbuf, sendlen); + zdatachannel_data_send2(txbuf, sendlen); } else if (ify_hrs_cmd_sync_time) { @@ -116,7 +115,7 @@ void ble_cmder_process_rx(uint8_t* rx, int len) { uint16_t sendlen = sizeof(ify_hrs_packet_t); znordic_rtc_settime(cmd->year + 2000, cmd->month, cmd->day, cmd->hour, cmd->minute, cmd->second); - zdatachannel_data_send(txbuf, sendlen); + zdatachannel_data_send2(txbuf, sendlen); } else if (ify_hrs_cmd_start_capture) { @@ -168,13 +167,12 @@ void ble_cmder_process_rx(uint8_t* rx, int len) { receipt->capturePrecision = SAMPLE_PRECISION; receipt->compressAlgorithm = 0; - zdatachannel_data_send(txbuf, sendlen); + zdatachannel_data_send2(txbuf, sendlen); } else if (ify_hrs_cmd_del_record) { - del_record_cmd_t* cmd = (del_record_cmd_t*)rxheader->data; - uint16_t sendlen = sizeof(ify_hrs_packet_t); + del_record_cmd_t* cmd = (del_record_cmd_t*)rxheader->data; static sample_data_filename_t filename; memset(&filename, 0, sizeof(filename)); @@ -189,8 +187,7 @@ void ble_cmder_process_rx(uint8_t* rx, int len) { } else if (ify_hrs_cmd_start_upload_record) { - start_upload_record_cmd_t* cmd = (start_upload_record_cmd_t*)rxheader->data; - uint16_t sendlen = sizeof(ify_hrs_packet_t); + start_upload_record_cmd_t* cmd = (start_upload_record_cmd_t*)rxheader->data; static sample_data_filename_t filename; memset(&filename, 0, sizeof(filename)); @@ -212,7 +209,7 @@ void ble_cmder_process_rx(uint8_t* rx, int len) { read_sn_receipt_t* receipt = (read_sn_receipt_t*)txheader->data; uint16_t sendlen = sizeof(ify_hrs_packet_t) + sizeof(read_sn_receipt_t); device_info_read_sn((sn_t*)&receipt->sn); - zdatachannel_data_send(txbuf, sendlen); + zdatachannel_data_send2(txbuf, sendlen); } else if (ify_hrs_cmd_reset) { diff --git a/app/src/one_conduction/heart_wave_sample_service.c b/app/src/one_conduction/heart_wave_sample_service.c index 03a9aa2..816ba51 100644 --- a/app/src/one_conduction/heart_wave_sample_service.c +++ b/app/src/one_conduction/heart_wave_sample_service.c @@ -59,7 +59,7 @@ static float Filter(filter_t* filter, float newInput) { return newv; } void nrfx_timer_event_handler(nrf_timer_event_t event_type, void* p_context) { // - uint16_t val = SingleLeadECG_battery_get_adc_val(); // 12bit + uint16_t val = SingleLeadECG_ecg_plod_get_ecg_val(); // 12bit float val_af100 = (float)val / 4096.0f * 100; diff --git a/app/src/one_conduction/one_conduction_board.c b/app/src/one_conduction/one_conduction_board.c index 9c83911..5193c2f 100644 --- a/app/src/one_conduction/one_conduction_board.c +++ b/app/src/one_conduction/one_conduction_board.c @@ -53,56 +53,40 @@ /******************************************************************************* * ADC * *******************************************************************************/ -typedef enum { - ADC_UNSET_CH = 0, - ADC_BATTERY_CH, - ADC_ECG_CH, -} adc_channel_t; -adc_channel_t m_now_adc_channel = ADC_UNSET_CH; +uint8_t m_now_adc_channel = 0xff; + +void SingleLeadECG_adc_set_ch(uint8_t ch); void SingleLeadECG_adc_module_init() { nrf_drv_saadc_config_t adccfg = NRFX_SAADC_DEFAULT_CONFIG; adccfg.resolution = NRF_SAADC_RESOLUTION_12BIT; // 4096 等于满采样率 ZERROR_CHECK(nrf_drv_saadc_init(&adccfg, NULL)); - - nrf_saadc_channel_config_t channel_config = NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(ECG_ADC_PIN); - channel_config.acq_time = NRF_SAADC_ACQTIME_40US; - ZERROR_CHECK(nrfx_saadc_channel_init(ECG_ADC_CHANNEL, &channel_config)); + // SingleLeadECG_adc_set_ch(BATTERY_ADC_CHANNEL); } -void SingleLeadECG_adc_set_ch(adc_channel_t ch) { +void SingleLeadECG_adc_set_ch(uint8_t ch) { if (m_now_adc_channel != ch) { - if (m_now_adc_channel == ADC_ECG_CH) { - nrfx_saadc_channel_uninit(ECG_ADC_CHANNEL); - } else if (m_now_adc_channel == ADC_BATTERY_CH) { - nrfx_saadc_channel_uninit(BATTERY_ADC_CHANNEL); - } + if (m_now_adc_channel != 0xff) nrfx_saadc_channel_uninit(m_now_adc_channel); - if (ch == ADC_ECG_CH) { + if (ch == ECG_ADC_CHANNEL) { nrf_saadc_channel_config_t channel_config = NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(ECG_ADC_PIN); channel_config.acq_time = NRF_SAADC_ACQTIME_40US; ZERROR_CHECK(nrfx_saadc_channel_init(ECG_ADC_CHANNEL, &channel_config)); - } else if (ch == ADC_BATTERY_CH) { + } else if (ch == BATTERY_ADC_CHANNEL) { nrf_saadc_channel_config_t channel_config = NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(BATTERY_ADC_PIN); - channel_config.acq_time = NRF_SAADC_ACQTIME_10US; + channel_config.acq_time = NRF_SAADC_ACQTIME_40US; ZERROR_CHECK(nrfx_saadc_channel_init(BATTERY_ADC_CHANNEL, &channel_config)); } } m_now_adc_channel = ch; } -int16_t SingleLeadECG_adc_get_val(adc_channel_t ch) { - // SingleLeadECG_adc_set_ch(ch); - if (ch == ADC_ECG_CH) { - return znrf_adc_channel_read_val(ECG_ADC_CHANNEL); - } else if (ch == ADC_BATTERY_CH) { - return znrf_adc_channel_read_val(BATTERY_ADC_CHANNEL); - } - return 0; +int16_t SingleLeadECG_adc_get_val(uint8_t ch) { + SingleLeadECG_adc_set_ch(ch); + return znrf_adc_channel_read_val(ch); } void SingleLeadECG_adc_module_deinit() { - // SingleLeadECG_adc_set_ch(ADC_UNSET_CH); - nrfx_saadc_channel_uninit(ECG_ADC_CHANNEL); + SingleLeadECG_adc_set_ch(0xff); nrf_drv_saadc_uninit(); } @@ -256,7 +240,7 @@ void SingleLeadECG_ecg_io_init() { uint32_t SingleLeadECG_ecg_nlod_get_connected_state() { return nrf_gpio_pin_read(ECG_NLOD_PIN); } uint32_t SingleLeadECG_ecg_plod_get_connected_state() { return !nrf_gpio_pin_read(ECG_PLOD_PIN); } -int16_t SingleLeadECG_ecg_plod_get_ecg_val() { return SingleLeadECG_adc_get_val(ADC_ECG_CH); } +int16_t SingleLeadECG_ecg_plod_get_ecg_val() { return SingleLeadECG_adc_get_val(ECG_ADC_CHANNEL); } /******************************************************************************* * BATTERY * @@ -264,7 +248,7 @@ int16_t SingleLeadECG_ecg_plod_get_ecg_val() { return SingleLeadECG_adc_get_val void SingleLeadECG_battery_init() {} void SingleLeadECG_battery_deinit() {} -int16_t SingleLeadECG_battery_get_adc_val() { return SingleLeadECG_adc_get_val(ADC_BATTERY_CH); } +int16_t SingleLeadECG_battery_get_adc_val() { return SingleLeadECG_adc_get_val(BATTERY_ADC_CHANNEL); } int16_t SingleLeadECG_battery_val() { return 50; } void SingleLeadECG_battery_charge_detect_io_init() { // nrf_gpio_cfg_sense_input(BATTERY_CHARGE_DETECT_PIN, NRF_GPIO_PIN_PULLUP, NRF_GPIO_PIN_NOSENSE); diff --git a/app/src/one_conduction/one_conduction_main.c b/app/src/one_conduction/one_conduction_main.c index 26cc174..279ee68 100644 --- a/app/src/one_conduction/one_conduction_main.c +++ b/app/src/one_conduction/one_conduction_main.c @@ -238,7 +238,7 @@ void app_event_process_cb(void* p_event_data, uint16_t event_size) { /******************************************************************************* * 页面加载中 * *******************************************************************************/ - if (ds_cur_state_haspassed_ms() >= (500 * 5)) { + if (ds_cur_state_haspassed_ms() >= (2000 * 5)) { /** * @brief 保持静止2500ms后,切换到采集页面 * @@ -261,19 +261,19 @@ void app_event_process_cb(void* p_event_data, uint16_t event_size) { sampledata_file_name.sec = tm.tm_sec; m_cur_fd = sample_data_mgr_open(&sampledata_file_name, kwrflag_write_only); - } else if (ds_cur_state_haspassed_ms() >= (500 * 4)) { + } else if (ds_cur_state_haspassed_ms() >= (2000 * 4)) { if (dsp_mgr_preparePage_get_progress() != 4) { dsp_mgr_preparePage_set_progress(4); } - } else if (ds_cur_state_haspassed_ms() >= (500 * 3)) { + } else if (ds_cur_state_haspassed_ms() >= (2000 * 3)) { if (dsp_mgr_preparePage_get_progress() != 3) { dsp_mgr_preparePage_set_progress(3); } - } else if (ds_cur_state_haspassed_ms() >= (500 * 2)) { + } else if (ds_cur_state_haspassed_ms() >= (2000 * 2)) { if (dsp_mgr_preparePage_get_progress() != 2) { dsp_mgr_preparePage_set_progress(2); } - } else if (ds_cur_state_haspassed_ms() >= (500 * 1)) { + } else if (ds_cur_state_haspassed_ms() >= (2000 * 1)) { if (dsp_mgr_preparePage_get_progress() != 1) { dsp_mgr_preparePage_set_progress(1); }