@ -8,16 +8,195 @@
# include "one_conduction_board.h"
# include "sample_data_manager.h"
static uint8_t txbuf [ 128 ] ;
APP_TIMER_DEF ( m_record_upload_tmr ) ; / / 数 据 上 报 定 时 器
static uint8_t txbuf [ 128 ] ;
static uint8_t reportbuf [ 128 ] ;
static bool m_realtime_report_state = false ;
static bool m_isupload_data_state = false ;
static bool m_ble_cmder_is_inited = false ;
static uint32_t m_report_data_sumcheckcode = 0 ;
static void record_upload_tmr_cb ( void * p_context ) ;
int ble_stop_upload_record ( ) ;
/*******************************************************************************
* 广 播 控 制 *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void ble_cmder_start_adv ( ) {
m_realtime_report_state = false ;
zble_module_start_adv ( ) ;
}
void ble_cmder_stop_adv ( ) {
zble_module_stop_adv ( ) ;
m_realtime_report_state = false ;
}
/*******************************************************************************
* 模 块 初 始 化 *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void ble_cmder_init ( ) {
if ( ! m_ble_cmder_is_inited ) {
ZERROR_CHECK ( app_timer_create ( & m_record_upload_tmr , APP_TIMER_MODE_REPEATED , record_upload_tmr_cb ) ) ;
}
m_ble_cmder_is_inited = true ;
}
void ble_cmder_uninit ( ) { }
/*******************************************************************************
* 实 时 上 报 控 制 *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
int ble_start_realtime_report ( ) {
m_realtime_report_state = true ;
return 0 ;
}
int ble_stop_realtime_report ( ) {
m_realtime_report_state = false ;
return 0 ;
}
void ble_cmder_try_report_one_sample_data ( uint32_t frameIndex , uint16_t data ) {
if ( ! m_realtime_report_state ) {
return ;
}
heartrate_report_packet_t * reportpacket = ( heartrate_report_packet_t * ) reportbuf ;
reportpacket - > cmd = ify_hrs_report_heartrate_data ;
reportpacket - > frame_index = 0 ;
reportpacket - > frame_type = kifyhrs_pt_report ;
reportpacket - > sample_data_index = frameIndex ;
/**
* @ brief 第 一 导 联 数 据
*/
reportpacket - > data [ 0 ] = ( data > > 0 ) & 0xFF ;
reportpacket - > data [ 1 ] = ( data > > 8 ) & 0xFF ;
reportpacket - > data [ 2 ] = 0 ;
uint16_t sendlen = sizeof ( heartrate_report_packet_t ) + 3 ;
zdatachannel_data_send2 ( reportbuf , sendlen ) ;
return ;
}
void ble_cmder_try_report_sensor_drop_event ( uint8_t dropstate0 , uint8_t dropstate1 ) {
sensor_drop_event_report_packet_t * reportpacket = ( sensor_drop_event_report_packet_t * ) reportbuf ;
reportpacket - > cmd = ify_hrs_report_sensor_drop_detect ;
reportpacket - > frame_index = 0 ;
reportpacket - > frame_type = kifyhrs_pt_report ;
reportpacket - > drop_state0 = dropstate0 ;
reportpacket - > drop_state1 = dropstate1 ;
uint16_t sendlen = sizeof ( sensor_drop_event_report_packet_t ) ;
zdatachannel_data_send2 ( reportbuf , sendlen ) ;
return ;
}
void ble_cmder_report_upload_finish_event ( uint32_t sumcheckcode ) {
ify_hrs_packet_t * txheader = ( ify_hrs_packet_t * ) txbuf ;
uint16_t sendlen = sizeof ( ify_hrs_packet_t ) + 4 ;
txheader - > cmd = ify_hrs_report_record_upload_end ;
txheader - > frame_index = 0 ;
txheader - > frame_type = kifyhrs_pt_report ;
/ / txheader - > data [ 0 ] = errorcode ;
* ( uint32_t * ) txheader - > data = sumcheckcode ;
zdatachannel_data_send2 ( txbuf , sendlen ) ;
return ;
}
void ble_cmder_report_sample_finish_event ( ) {
ify_hrs_packet_t * txheader = ( ify_hrs_packet_t * ) txbuf ;
uint16_t sendlen = sizeof ( ify_hrs_packet_t ) ;
void ble_cmder_start_adv ( ) { zble_module_start_adv ( ) ; }
void ble_cmder_stop_adv ( ) { zble_module_stop_adv ( ) ; }
txheader - > cmd = ify_hrs_report_sample_finish_end ;
txheader - > frame_index = 0 ;
txheader - > frame_type = kifyhrs_pt_report ;
int ble_start_realtime_report ( ) { return 0 ; }
int ble_stop_realtime_report ( ) { return 0 ; }
int ble_start_upload_record ( sample_data_filename_t * recordid ) { return 0 ; }
int ble_stop_upload_record ( ) { return 0 ; }
zdatachannel_data_send2 ( txbuf , sendlen ) ;
return ;
}
/*******************************************************************************
* 上 传 数 据 控 制 *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static int m_upload_fd ;
static uint8_t datacache [ 256 ] ;
static uint8_t m_remaindatalen = 0 ;
static void record_upload_tmr_cb ( void * p_context ) { / /
/ / sample_data_mgr_read
if ( m_remaindatalen = = 0 ) {
memset ( datacache , 0 , sizeof ( datacache ) ) ;
int32_t rdsize = sample_data_mgr_read ( m_upload_fd , datacache , sizeof ( datacache ) ) ;
if ( rdsize < = 0 ) {
ZLOGI ( " read file end,stop upload " ) ;
ble_cmder_report_upload_finish_event ( m_report_data_sumcheckcode ) ;
ble_stop_upload_record ( ) ;
return ;
}
m_remaindatalen = rdsize ;
}
int32_t mtusize = zble_module_get_mtu_size ( ) ;
uint8_t * data = datacache + ( sizeof ( datacache ) - m_remaindatalen ) ;
uint8_t len = m_remaindatalen > mtusize ? mtusize : m_remaindatalen ;
if ( ! zdatachannel_is_connected ( ) ) {
ZLOGI ( " ble is disconnected,stop upload " ) ;
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 " ) ;
ble_stop_upload_record ( ) ;
return ;
} else if ( suc = = NRF_ERROR_BUSY ) {
/ / 等 待 下 次 发 送
return ;
} else {
ZLOGI ( " ble send error,stop upload %x " , suc ) ;
ble_stop_upload_record ( ) ;
return ;
}
}
for ( uint32_t i = 0 ; i < len ; i + + ) {
m_report_data_sumcheckcode + = data [ i ] ;
}
m_remaindatalen - = len ;
}
int ble_start_upload_record ( sample_data_filename_t * recordid ) {
/ /
/ / 启 动
/ /
if ( ds_now_state ( ) ! = kdevice_state_home ) {
return kifyhrs_ecode_device_busy ;
}
m_upload_fd = sample_data_mgr_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 ble_stop_upload_record ( ) {
m_isupload_data_state = false ;
app_timer_stop ( m_record_upload_tmr ) ;
return 0 ;
}
bool ble_is_upload_record ( ) { return m_isupload_data_state ; }
/*******************************************************************************
* UTILS *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void send_error_receipt ( ify_hrs_packet_t * rxpacket , int32_t errorcode ) {
ify_hrs_packet_t * txheader = ( ify_hrs_packet_t * ) txbuf ;
error_receipt_t * receipt = ( error_receipt_t * ) txheader - > data ;
@ -88,12 +267,13 @@ void ble_cmder_process_rx(uint8_t* rx, int len) {
device_state_receipt_t * receipt = ( device_state_receipt_t * ) txheader - > data ;
uint16_t sendlen = sizeof ( ify_hrs_packet_t ) + sizeof ( device_state_receipt_t ) ;
receipt - > drop_state0 | = 0x01 ;
receipt - > drop_state1 = 0x00 ;
receipt - > device_state0 = ( 0x01 < < 0 /*设备采集*/ ) | / /
( 0x01 < < 1 /*设备上报*/ ) | / /
( 0x00 < < 2 /*低电量*/ ) | / /
( 0x01 < < 3 /*存储满*/ ) ;
receipt - > drop_state0 . sensor0_pos = ( ! SingleLeadECG_ecg_plod_get_connected_state ( ) ) ;
receipt - > drop_state1 = 0x00 ;
receipt - > device_state0 . sampling_state = ( ds_now_state ( ) = = kdevice_state_sampling ) ;
receipt - > device_state0 . report_state = m_realtime_report_state ;
receipt - > device_state0 . low_battery = ( SingleLeadECG_battery_val ( ) < 20 ) ;
receipt - > device_state0 . full_storge = ( sample_data_mgr_storage_is_full ( ) ) ;
receipt - > device_state1 = 0 ;
receipt - > powerlevel = SingleLeadECG_battery_val ( ) ;
receipt - > storage_item_num = sample_data_mgr_get_file_num ( ) ;
@ -152,12 +332,19 @@ void ble_cmder_process_rx(uint8_t* rx, int len) {
}
else if ( cmd = = ify_hrs_cmd_read_records_info ) {
/ / send_error_receipt ( rxheader , kifyhrs_ecode_cmd_not_support ) ;
/ / 指 令 10 - 读 取 采 样 记 录 头 部 信 息
read_record_info_cmd_t * cmd = ( read_record_info_cmd_t * ) rxheader - > data ;
read_record_info_receipt_t * receipt = ( read_record_info_receipt_t * ) txheader - > data ;
uint16_t sendlen = sizeof ( ify_hrs_packet_t ) + sizeof ( read_record_info_receipt_t ) ;
uint8_t recordoff = cmd - > record_index ;
uint8_t recordoff = cmd - > record_index ;
/ / 采 样 时 不 支 持
if ( ds_now_state ( ) ! = kdevice_state_home ) {
send_error_receipt ( rxheader , kifyhrs_ecode_device_busy ) ;
return ;
}
sample_data_fileinfo_list_t * recordlist = sample_data_mgr_get_fileinfo_list ( ) ;
if ( recordoff > = recordlist - > count ) {
send_error_receipt ( rxheader , kifyhrs_ecode_no_record_find ) ;
@ -178,12 +365,19 @@ void ble_cmder_process_rx(uint8_t* rx, int len) {
}
else if ( cmd = = ify_hrs_cmd_del_record ) {
/ / 指 令 11 - 删 除 采 样 记 录
del_record_cmd_t * cmd = ( del_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 ( ds_now_state ( ) ! = kdevice_state_home ) {
send_error_receipt ( rxheader , kifyhrs_ecode_device_busy ) ;
return ;
}
int ecode = sample_data_mgr_delete_file ( & filename ) ;
if ( ecode = = 0 ) {
send_success_receipt ( rxheader ) ;
@ -193,12 +387,19 @@ void ble_cmder_process_rx(uint8_t* rx, int len) {
}
else if ( cmd = = ify_hrs_cmd_start_upload_record ) {
/ / 指 令 12 - 上 传 采 集 记 录
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 ( ds_now_state ( ) ! = kdevice_state_home ) {
send_error_receipt ( rxheader , kifyhrs_ecode_device_busy ) ;
return ;
}
int ecode = ble_start_upload_record ( & filename ) ;
if ( ecode = = 0 ) {
send_success_receipt ( rxheader ) ;