12 changed files with 400 additions and 16 deletions
-
3.vscode/settings.json
-
10app/src/basic/device_info_mgr.c
-
13app/src/basic/device_info_mgr.h
-
124app/src/basic/heart_rate_sensor_protocol.h
-
8app/src/basic/zdatachannel_service.h
-
225app/src/one_conduction/ble_cmd_process_service.c
-
2app/src/one_conduction/ble_cmd_process_service.h
-
3app/src/one_conduction/config.h
-
2app/src/one_conduction/one_conduction_main.c
-
4app/src/one_conduction/sample_data_manager.c
-
6app/src/one_conduction/sample_data_manager.h
-
2libznordic
@ -0,0 +1,10 @@ |
|||
#include "device_info_mgr.h" |
|||
|
|||
void device_info_read_sn(sn_t* sn) { |
|||
const char* sn_str = "M1001000000001"; |
|||
memcpy(sn->sn, sn_str, sizeof(sn->sn)); |
|||
} |
|||
uint16_t device_info_read_blestack_version(void) { return 1; } |
|||
uint16_t device_info_read_bootloader_version(void) { return 1; } |
|||
uint16_t device_info_read_firmware_version(void) { return 1; } |
|||
uint16_t device_info_read_hardware_version(void) { return 1; } |
@ -0,0 +1,13 @@ |
|||
#pragma once |
|||
#include "znordic.h" |
|||
|
|||
typedef struct { |
|||
uint8_t sn[14]; |
|||
} sn_t; |
|||
|
|||
|
|||
void device_info_read_sn(sn_t *sn); |
|||
uint16_t device_info_read_blestack_version(void); |
|||
uint16_t device_info_read_bootloader_version(void); |
|||
uint16_t device_info_read_firmware_version(void); |
|||
uint16_t device_info_read_hardware_version(void); |
@ -0,0 +1,225 @@ |
|||
#include "ble_cmd_process_service.h" |
|||
|
|||
#include "basic/device_info_mgr.h" |
|||
#include "basic/heart_rate_sensor_protocol.h" |
|||
#include "basic/zdatachannel_service.h" |
|||
#include "config.h" |
|||
#include "one_conduction_board.h" |
|||
#include "sample_data_manager.h" |
|||
static uint8_t txbuf[128]; |
|||
|
|||
void ble_cmder_try_start_adv() {} |
|||
|
|||
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; } |
|||
|
|||
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; |
|||
uint16_t sendlen = sizeof(ify_hrs_packet_t) + sizeof(error_receipt_t); |
|||
|
|||
txheader->cmd = rxpacket->cmd; |
|||
txheader->frame_index = rxpacket->frame_index; |
|||
txheader->frame_type = kifyhrs_pt_error_receipt; |
|||
|
|||
txheader->frame_type = kifyhrs_pt_error_receipt; |
|||
receipt->errorcode = kifyhrs_ecode_cmd_not_support; |
|||
zdatachannel_data_send(txbuf, sendlen); |
|||
} |
|||
|
|||
static void send_success_receipt(ify_hrs_packet_t* rxpacket) { |
|||
ify_hrs_packet_t* txheader = (ify_hrs_packet_t*)txbuf; |
|||
uint16_t sendlen = sizeof(ify_hrs_packet_t); |
|||
|
|||
txheader->cmd = rxpacket->cmd; |
|||
txheader->frame_index = rxpacket->frame_index; |
|||
txheader->frame_type = kifyhrs_pt_cmd_receipt; |
|||
|
|||
zdatachannel_data_send(txbuf, sendlen); |
|||
} |
|||
|
|||
/******************************************************************************* |
|||
* Ï·¢ÏûÏ¢´¦Àí * |
|||
*******************************************************************************/ |
|||
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; |
|||
|
|||
txheader->cmd = rxheader->cmd; |
|||
txheader->frame_index = rxheader->frame_index; |
|||
txheader->frame_type = kifyhrs_pt_cmd_receipt; |
|||
|
|||
memset(txbuf, 0, sizeof(txbuf)); |
|||
|
|||
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); |
|||
|
|||
receipt->blestack_version = device_info_read_blestack_version(); |
|||
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); |
|||
} |
|||
|
|||
else if (ify_hrs_cmd_read_sensor_info) { |
|||
sensor_info_receipt_t* receipt = (sensor_info_receipt_t*)txheader->data; |
|||
uint16_t sendlen = sizeof(ify_hrs_packet_t) + sizeof(sensor_info_receipt_t); |
|||
|
|||
receipt->sensor_num = 1; |
|||
receipt->sensor_precision = SAMPLE_PRECISION; |
|||
receipt->sensor_sample_rate = SAMPLE_RATE / 10; |
|||
receipt->sensor0_pos = kifyhrs_sensor_pos_none; |
|||
receipt->sensor1_pos = kifyhrs_sensor_pos_none; |
|||
receipt->sensor2_pos = kifyhrs_sensor_pos_none; |
|||
|
|||
zdatachannel_data_send(txbuf, sendlen); |
|||
} |
|||
|
|||
else if (ify_hrs_cmd_read_device_state) { |
|||
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->drop0_state.drop0 = 0; |
|||
receipt->device_state0.sample_state = 1; |
|||
receipt->device_state0.report_state = 1; |
|||
receipt->device_state0.lowbattery_state = 0; |
|||
receipt->device_state0.full_storage = sample_data_mgr_storage_is_full(); |
|||
receipt->powerlevel = SingleLeadECG_battery_val(); |
|||
receipt->storage_item_num = sample_data_mgr_get_file_num(); |
|||
|
|||
zdatachannel_data_send(txbuf, sendlen); |
|||
} |
|||
|
|||
else if (ify_hrs_cmd_read_time) { |
|||
read_time_receipt_t* receipt = (read_time_receipt_t*)txheader->data; |
|||
uint16_t sendlen = sizeof(ify_hrs_packet_t) + sizeof(read_time_receipt_t); |
|||
static ztm_t ztm; |
|||
znordic_rtc_gettime(&ztm); |
|||
|
|||
receipt->year = (ztm.tm_year + 1900 - 2000); |
|||
receipt->month = ztm.tm_mon + 1; |
|||
receipt->day = ztm.tm_mday; |
|||
receipt->hour = ztm.tm_hour; |
|||
receipt->minute = ztm.tm_min; |
|||
receipt->second = ztm.tm_sec; |
|||
zdatachannel_data_send(txbuf, sendlen); |
|||
} |
|||
|
|||
else if (ify_hrs_cmd_sync_time) { |
|||
sync_time_cmd_t* cmd = (sync_time_cmd_t*)rxheader->data; |
|||
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); |
|||
} |
|||
|
|||
else if (ify_hrs_cmd_start_capture) { |
|||
send_error_receipt(rxheader, kifyhrs_ecode_cmd_not_support); |
|||
} |
|||
|
|||
else if (ify_hrs_cmd_stop_capture) { |
|||
send_error_receipt(rxheader, kifyhrs_ecode_cmd_not_support); |
|||
} |
|||
|
|||
else if (ify_hrs_cmd_start_realtime_report) { |
|||
// unsupport cmd |
|||
int ecode = ble_start_realtime_report(); |
|||
if (ecode == 0) { |
|||
send_success_receipt(rxheader); |
|||
} else { |
|||
send_error_receipt(rxheader, ecode); |
|||
} |
|||
} |
|||
|
|||
else if (ify_hrs_cmd_stop_realtime_report) { |
|||
int ecode = ble_stop_realtime_report(); |
|||
if (ecode == 0) { |
|||
send_success_receipt(rxheader); |
|||
} else { |
|||
send_error_receipt(rxheader, ecode); |
|||
} |
|||
} |
|||
|
|||
else if (ify_hrs_cmd_read_records_info) { |
|||
// send_error_receipt(rxheader, kifyhrs_ecode_cmd_not_support); |
|||
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; |
|||
sample_data_fileinfo_list_t* recordlist = sample_data_mgr_get_fileinfo_list(); |
|||
if (recordoff >= recordlist->count) { |
|||
send_error_receipt(rxheader, kifyhrs_ecode_cmd_not_support); |
|||
return; |
|||
} |
|||
|
|||
sample_data_fileinfo_t* fileinfo = recordlist->fileinfo[recordoff]; |
|||
memcpy(receipt->record_id, fileinfo->filename, 6); |
|||
receipt->frameNum = fileinfo->size / 16; // 16 bytes per frame |
|||
receipt->dataSize = fileinfo->size; |
|||
receipt->sensorNum = 1; |
|||
receipt->captureRate = SAMPLE_RATE / 10; |
|||
receipt->capturePrecision = SAMPLE_PRECISION; |
|||
receipt->compressAlgorithm = 0; |
|||
|
|||
zdatachannel_data_send(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); |
|||
|
|||
static sample_data_filename_t filename; |
|||
memset(&filename, 0, sizeof(filename)); |
|||
memcpy(&filename, cmd->record_id, sizeof(cmd->record_id)); |
|||
|
|||
int ecode = sample_data_mgr_delete_file(&filename); |
|||
if (ecode == 0) { |
|||
send_success_receipt(rxheader); |
|||
} else { |
|||
send_error_receipt(rxheader, kifyhrs_ecode_unkown_error); |
|||
} |
|||
} |
|||
|
|||
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); |
|||
|
|||
static sample_data_filename_t filename; |
|||
memset(&filename, 0, sizeof(filename)); |
|||
memcpy(&filename, cmd->record_id, sizeof(cmd->record_id)); |
|||
|
|||
int ecode = ble_start_upload_record(&filename); |
|||
if (ecode == 0) { |
|||
send_success_receipt(rxheader); |
|||
} else { |
|||
send_error_receipt(rxheader, ecode); |
|||
} |
|||
} |
|||
|
|||
else if (ify_hrs_cmd_enter_ota) { |
|||
send_error_receipt(rxheader, kifyhrs_ecode_cmd_not_support); |
|||
} |
|||
|
|||
else if (ify_hrs_cmd_read_sn) { |
|||
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); |
|||
} |
|||
|
|||
else if (ify_hrs_cmd_reset) { |
|||
NVIC_SystemReset(); |
|||
} |
|||
// |
|||
else { |
|||
send_error_receipt(rxheader, kifyhrs_ecode_cmd_not_support); |
|||
} |
|||
} |
@ -1 +1 @@ |
|||
Subproject commit 1eb8d83d8d82aecd5a0da03be2a9399e061f91a8 |
|||
Subproject commit 195d28909c8ed31853420141b4902fb8d61e6975 |
Write
Preview
Loading…
Cancel
Save
Reference in new issue