818 lines
27 KiB
C
818 lines
27 KiB
C
/********************************************************************
|
||
Copyright (c) 2021 Xiangyu Medical Co.,Ltd. All rights reserved.
|
||
FileName : drv_uart.c
|
||
Author : zhangdawei
|
||
Version : V1.0
|
||
Date :
|
||
Note :
|
||
History :
|
||
********************************************************************/
|
||
/* Includes ------------------------------------------------------*/
|
||
#include "drv_uart.h"
|
||
#include "pca10040.h"
|
||
#include "ble_nus.h"
|
||
#include "time.h"
|
||
#include "IoControl.h"
|
||
#include "nrf_drv_timer.h"
|
||
#include "fds.h"
|
||
/* Private define ------------------------------------------------*/
|
||
BLE_NUS_DEF(m_nus); //定义名称为m_nus的串口透传服务实例
|
||
/* Private typedef -----------------------------------------------*/
|
||
/* Private constants ---------------------------------------------*/
|
||
/* 接收到的方案信息 */
|
||
SchemeData_t SchemeData;
|
||
SchemeData_t PreStorageSchemeData;// 设备预存信息
|
||
uint16_t m_ble_nus_max_data_len = BLE_GATT_ATT_MTU_DEFAULT - 3; /**< Maximum length of data (in bytes) that can be transmitted to the peer by the Nordic UART service module. */
|
||
/* Private variables ---------------------------------------------*/
|
||
//该变量用于保存连接句柄,初始值设置为无连接
|
||
uint16_t m_conn_handle = BLE_CONN_HANDLE_INVALID;
|
||
/* 电池电量的原始值 */
|
||
nrf_saadc_value_t Battery_Saadc_Value = 10000;
|
||
/* 电池电压百分比 */
|
||
uint8_t Battery_Percentage = 100;
|
||
/* 肌电采集定时器初始化标志 */
|
||
uint8_t TimerEegAdcInit_Flag = 0;
|
||
/* 控制电流标志 */
|
||
uint8_t CurrentFlag = 0;
|
||
/* 设备的连接状态 */
|
||
ConnectStateInfo_e DeviceConnectState = DisconnectState;
|
||
ElectrodeStatusInfo_e ElectrodeStatusInfo = ElectrodeConnectted;
|
||
ElectrodeStatusInfo_e LastElectrodeStatusInfo = ElectrodeConnectted;
|
||
/* 适配器连接状态 */
|
||
AdapterStateInfo_e AdapterState = AdapterNotConnected;
|
||
AdapterStateInfo_e LastAdapterState = AdapterNotConnected;
|
||
|
||
/* MAC地址数组 */
|
||
uint8_t BLE_MAC[BLE_GAP_ADDR_LEN];
|
||
//定义FDS异步操作标志结构体
|
||
my_fds_info_t my_fds_info;
|
||
// 初始化参数信息
|
||
SchemePara_t SchemePara = {
|
||
.text = 0
|
||
};
|
||
uint16_t ccrvaluebuf[70] = {
|
||
23,25,27,29,31,33,35,37,39,41, //1-10
|
||
43,45,47,50,52,54,56,58,60,63, //11-20
|
||
65,67,69,71,74,76,78,80,82,85, //21-30
|
||
87,89,91,93,95,97,99,101,103,105, //31-40
|
||
108,111,114,117,120,123,126,129,132,134, //41-50
|
||
136,138,140,142,144,146,148,150,152,154, //51-60
|
||
155,156,158,160,162,164,167,170,172,174 //61-70
|
||
};
|
||
#define EEG_DATA_LENGTH ( 50 )
|
||
uint8_t aEEGData[EEG_DATA_LENGTH] = {
|
||
23,25,27,29,31,33,35,37,39,41,
|
||
43,45,47,50,52,54,56,58,60,63,
|
||
65,67,69,71,74,76,78,80,82,85,
|
||
87,89,91,93,95,97,99,101,103,105,
|
||
108,111,114,117,120,123,126,129,132,134
|
||
};
|
||
uint8_t eegmode = 0;
|
||
uint8_t eegflag = 0;
|
||
|
||
StimStateInfo_t ChannelStimStateInfo_t;
|
||
|
||
rms_data_t rmsData = {.frameHeader = FRAME_HEADER,
|
||
.frameLength = sizeof(rmsData) - 4, //减去帧头、帧长度、校验和、帧尾
|
||
.functionCode = D_EMG_DATA_REPORT,
|
||
.myNumber = 0x01,
|
||
.channel = 0x01,
|
||
//.rmsDataBuffer = {0},
|
||
.checkSum = 0,
|
||
.frameTail = FRAME_TAIL
|
||
};
|
||
|
||
/* Private function prototypes -----------------------------------*/
|
||
void StatusInquiry(ElectrodeStatusInfo_e Electrodestatus);
|
||
void StartStopCtrl(uint8_t StartStopValue);
|
||
void MACQuery(void);
|
||
/* Public constants ----------------------------------------------*/
|
||
/* Public variables ----------------------------------------------*/
|
||
/********************************************************************
|
||
* name : void SetFreqWidth(uint8_t* AnalysisDataBffer_t)
|
||
* description : 设置脉冲频率
|
||
* Input : AnalysisDataBffer_t:接收到的数据缓冲区
|
||
* Output : void
|
||
* Return : void
|
||
********************************************************************/
|
||
void SetFreqWidth(uint8_t* AnalysisDataBffer_t)
|
||
{
|
||
|
||
}
|
||
/********************************************************************
|
||
* name : void SetRampTime(uint8_t* AnalysisDataBfferIn_t)
|
||
* description : 设置斜坡时间
|
||
* Input : AnalysisDataBffer_t:接收到的数据缓冲区
|
||
* Output : void
|
||
* Return : void
|
||
********************************************************************/
|
||
void SetRampTime(uint8_t* AnalysisDataBffer_t)
|
||
{
|
||
|
||
}
|
||
/********************************************************************
|
||
* name : void SetStimPara(uint8_t* AnalysisDataBfferIn_t)
|
||
* description : 设置刺激参数
|
||
* Input : AnalysisDataBffer_t:接收到的数据缓冲区
|
||
* Output : void
|
||
* Return : void
|
||
********************************************************************/
|
||
void SetStimPara(uint8_t* AnalysisDataBffer_t)
|
||
{
|
||
|
||
|
||
//开启采集模式
|
||
if(1 == AnalysisDataBffer_t[4])
|
||
{
|
||
eegmode = 1;
|
||
return;
|
||
}
|
||
|
||
}
|
||
/********************************************************************
|
||
* name : static void nus_data_handler(ble_nus_evt_t * p_evt)
|
||
* description : BLE串口透传事件回调函数
|
||
* Input : ble_nus_evt_t * p_evt:发生的事件
|
||
* Output : void
|
||
* Return : void
|
||
********************************************************************/
|
||
static void nus_data_handler(ble_nus_evt_t * p_evt)
|
||
{
|
||
uint8_t FrameLength = 0;//帧长度
|
||
uint8_t FunctionCode = 0;//功能码
|
||
uint8_t CheckSum = 0;//校验和
|
||
uint8_t Sum = 0;//数据和
|
||
uint8_t SumCCR = 0;//CCR值
|
||
#define RX_BLE_DATA_LEN 100
|
||
uint8_t RecieveData[RX_BLE_DATA_LEN] = {0}; //接收数据帧的数组
|
||
|
||
if(p_evt->type == BLE_NUS_EVT_RX_DATA)
|
||
{
|
||
uint16_t Length = 0;
|
||
|
||
Length = p_evt->params.rx_data.length;
|
||
if(Length > RX_BLE_DATA_LEN)
|
||
{
|
||
NRF_LOG_ERROR("RecieveData length error");
|
||
return;
|
||
}
|
||
else
|
||
{
|
||
memcpy(RecieveData, p_evt->params.rx_data.p_data, Length);
|
||
}
|
||
|
||
/* 解析蓝牙收到的数据 */
|
||
if(0xAA == RecieveData[0])
|
||
{
|
||
FrameLength = RecieveData[1]; //帧长度
|
||
if(FrameLength > (RX_BLE_DATA_LEN - 4))
|
||
{
|
||
NRF_LOG_ERROR("RecieveData length error %d", FrameLength);
|
||
return;
|
||
}
|
||
else if(0x55 != RecieveData[FrameLength + 3]) //查找帧尾
|
||
{
|
||
NRF_LOG_ERROR("RecieveData end flag error");
|
||
return;
|
||
}
|
||
CheckSum = RecieveData[FrameLength + 2]; //校验和
|
||
//if(0x55 == RecieveData[FrameLength + 3]) //查找帧尾
|
||
{
|
||
/*校验数据包*/
|
||
for(uint8_t i = 0; i < FrameLength; i++)
|
||
{
|
||
Sum += RecieveData[i+2];
|
||
}
|
||
SumCCR = Sum & 0xff;
|
||
|
||
if(CheckSum == SumCCR)
|
||
{
|
||
FunctionCode = RecieveData[2];
|
||
|
||
/*模式、脉宽、频率、斜坡时间设置*/
|
||
if(STIM_PARA_CONTROL == FunctionCode)
|
||
{
|
||
SetStimPara(RecieveData); //设置参数
|
||
ble_nus_data_send(&m_nus, RecieveData, &Length, m_conn_handle);//将收到的数据回复回去
|
||
}
|
||
/*电流控制 (控制刺激强度)*/
|
||
else if(CURRENT_CONTROL == FunctionCode)
|
||
{
|
||
NRF_LOG_INFO("CURRENT_CONTROL");
|
||
|
||
// SetStandardCurrent(RecieveData); //设置电流
|
||
// CurrentFlag = 1; //设置电流的标志,此标志为1时表示可以输出电流
|
||
ble_nus_data_send(&m_nus, RecieveData, &Length, m_conn_handle);//将收到的数据回复回去
|
||
}
|
||
/*刺激启停控制*/
|
||
else if(START_STOP_CONTROL == FunctionCode)
|
||
{
|
||
NRF_LOG_INFO("START_STOP_CONTROL");
|
||
// CurrentFlag = 0; //此标志清0,此时开启电流的标志由通道模式和通道状态控制
|
||
uint8_t StartStopValue = CH_STOP; //初始状态为停止
|
||
StartStopValue = RecieveData[StartStopOffset]; //设置启停状态
|
||
StartStopCtrl(StartStopValue); //启停控制
|
||
ble_nus_data_send(&m_nus, RecieveData, &Length, m_conn_handle);//将收到的数据回复回去
|
||
}
|
||
/*触发采集开始*/
|
||
else if(TRIG_COLLECT_START_CONTROL == FunctionCode)
|
||
{
|
||
NRF_LOG_INFO("TRIG_COLLECT_START_CONTROL");
|
||
ble_nus_data_send(&m_nus, RecieveData, &Length, m_conn_handle);//将收到的数据回复回去
|
||
}
|
||
/*触发刺激开始*/
|
||
else if(TRIG_STIM_START_CONTROL == FunctionCode)
|
||
{
|
||
NRF_LOG_INFO("TRIG_STIM_START_CONTROL");
|
||
ble_nus_data_send(&m_nus, RecieveData, &Length, m_conn_handle);//将收到的数据回复回去
|
||
}
|
||
/*轮询0x8A*/
|
||
else if(STATUS_INQUIRY == FunctionCode)
|
||
{
|
||
StatusInquiry(ElectrodeStatusInfo);
|
||
NRF_LOG_INFO("STATUS_INQUIRY");
|
||
}
|
||
/* 运行轮询 */
|
||
else if(RUN_ROLL == FunctionCode)
|
||
{
|
||
RunRoll();
|
||
NRF_LOG_INFO("RUN_ROLL");
|
||
}
|
||
/* 版本查询 */
|
||
else if(VERSION_INQUIRY == FunctionCode)
|
||
{
|
||
CheckVersion();
|
||
NRF_LOG_INFO("VERSION_INQUIRY");
|
||
}
|
||
else if(SCHEME_QUERY == FunctionCode)
|
||
{
|
||
//SchemeQuery();
|
||
my_fds_info.read = true;
|
||
NRF_LOG_INFO("SCHEME_QUERY");
|
||
}
|
||
else if(MAC_QUERY == FunctionCode)
|
||
{
|
||
MACQuery();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
/***********end***********/
|
||
}
|
||
}
|
||
/********************************************************************
|
||
* name : void service_nus_init(void)
|
||
* description : 串口透传服务初始化
|
||
* Input : void
|
||
* Output : void
|
||
* Return : void
|
||
********************************************************************/
|
||
void service_nus_init(void)
|
||
{
|
||
ret_code_t err_code;
|
||
ble_nus_init_t nus_init; //定义串口透传初始化结构体
|
||
/*------------------以下代码初始化串口透传服务-------------*/
|
||
memset(&nus_init, 0, sizeof(nus_init)); //清零串口透传服务初始化结构体
|
||
nus_init.data_handler = nus_data_handler; //设置串口透传事件回调函数
|
||
err_code = ble_nus_init(&m_nus, &nus_init); //初始化串口透传服务
|
||
APP_ERROR_CHECK(err_code);
|
||
/*------------------初始化串口透传服务-END-----------------*/
|
||
}
|
||
/********************************************************************
|
||
* name : void StartStopCtrl(uint8_t ucStartStopValueIn)
|
||
* description : 启、停控制处理函数
|
||
* Input : ucStartStopValueIn:启、停控制值
|
||
ucChannelIn:通道号
|
||
* Output : void
|
||
* Return : void
|
||
********************************************************************/
|
||
void StartStopCtrl(uint8_t StartStopValue)
|
||
{
|
||
switch(StartStopValue)
|
||
{
|
||
case CH_START: StartManage();
|
||
break;
|
||
case CH_PAUSE: PauseManage();
|
||
break;
|
||
case CH_CONTINUE: RecoverManage();
|
||
break;
|
||
case CH_STOP: StopManage();
|
||
break;
|
||
default: break;
|
||
}
|
||
}
|
||
/********************************************************************
|
||
* name : void StartManage(void)
|
||
* description : 开始处理函数
|
||
* Input : void
|
||
* Output : void
|
||
* Return : void
|
||
********************************************************************/
|
||
void StartManage(void)
|
||
{
|
||
if(eegmode == 1)
|
||
{
|
||
eegflag = 1;
|
||
}
|
||
|
||
}
|
||
/********************************************************************
|
||
* name : void PauseManage(void)
|
||
* description : 暂停处理函数
|
||
* Input : Channel:通道号
|
||
* Output : void
|
||
* Return : void
|
||
********************************************************************/
|
||
void PauseManage(void)
|
||
{
|
||
if(eegmode == 1)
|
||
{
|
||
eegflag = 0;
|
||
}
|
||
// CHAChannelState_e = IdleState; //设置状态为空闲态,空闲状态下pwm_flag置0
|
||
// ChannelStimStateInfo_t.ChannelWorkState = Pause;
|
||
// PwmDACStop();
|
||
// CloseOutput(); //关闭输出
|
||
// NRF_LOG_INFO("Pause_Stim");
|
||
}
|
||
/********************************************************************
|
||
* name : void CloseOutput(void)
|
||
* description : 将输出电流置0,斜坡时间置0,关闭输出PWM
|
||
* Input : void
|
||
* Output : void
|
||
* Return : void
|
||
********************************************************************/
|
||
void CloseOutput(void)
|
||
{
|
||
if(eegmode == 1)
|
||
{
|
||
eegmode = 0;
|
||
eegflag = 0;
|
||
}
|
||
//ChannelStimStateInfo_t.ucCurrent = 0;
|
||
// ChannelStimStateInfo_t.Ramp_e = RampIdle;//斜坡状态为空闲态
|
||
// RampTime = 0; //斜坡时间清0
|
||
// SetCurrent(0); //设置输出电流为0
|
||
// PwmSubtractStop(); //关闭输出PWM
|
||
// PwmDACStop(); //停止充能PWM
|
||
//// GpioteInit();
|
||
}
|
||
/********************************************************************
|
||
* name : void RecoverManage(void)
|
||
* description : 继续处理函数
|
||
* Input : void
|
||
* Output : void
|
||
* Return : void
|
||
********************************************************************/
|
||
void RecoverManage(void)
|
||
{
|
||
if(eegmode == 1)
|
||
{
|
||
eegflag = 1;
|
||
}
|
||
|
||
}
|
||
/********************************************************************
|
||
* name : void StopManage(void)
|
||
* description : 停止处理函数
|
||
* Input : void
|
||
* Output : void
|
||
* Return : void
|
||
********************************************************************/
|
||
void StopManage(void)
|
||
{
|
||
|
||
}
|
||
|
||
/********************************************************************
|
||
* name : void SetStandardCurrent(uint8_t* AnalysisDataBfferIn_t)
|
||
* description : 设置标称电流值
|
||
* Input : AnalysisDataBfferIn_t:接收到的数据缓冲区
|
||
* Output : void
|
||
* Return : void
|
||
********************************************************************/
|
||
void SetStandardCurrent(uint8_t* AnalysisDataBffer_t)
|
||
{
|
||
|
||
}
|
||
/********************************************************************
|
||
* name : void StatusInquiry(void)
|
||
* description : 状态轮询
|
||
* Input : void
|
||
* Output : void
|
||
* Return : void
|
||
********************************************************************/
|
||
void StatusInquiry(ElectrodeStatusInfo_e Electrodestatus)
|
||
{
|
||
uint8_t j = 2;
|
||
static uint8_t aTxBuffer[10] = {0};
|
||
uint32_t ulCrc = 0;
|
||
uint16_t Length = 10;
|
||
|
||
/* 帧头、帧尾*/
|
||
aTxBuffer[HeadOffset] = 0xAA;
|
||
aTxBuffer[DataLengthOffset] = 0x06;
|
||
aTxBuffer[FunctionCodeOffset] = STATUS_INQUIRY;
|
||
aTxBuffer[ChannelNumOffset] = 0x00;
|
||
aTxBuffer[ElectrodeStatusOffset] = 0x01;
|
||
aTxBuffer[StimStatusOffset] = ChannelStimStateInfo_t.Ramp_e;
|
||
aTxBuffer[StimCurrentOffset] = ChannelStimStateInfo_t.ucCurrent;
|
||
aTxBuffer[ResetOffset] = 0x00;
|
||
aTxBuffer[TailOffset] = 0x55;
|
||
|
||
/* 校验和 */
|
||
for(uint8_t i = 0; i < 6; i++)
|
||
{
|
||
ulCrc += aTxBuffer[j];
|
||
j++;
|
||
}
|
||
aTxBuffer[DataCrcOffset] = (uint8_t)ulCrc;
|
||
|
||
ble_nus_data_send(&m_nus, aTxBuffer, &Length, m_conn_handle);
|
||
}
|
||
|
||
/********************************************************************
|
||
* name : uint8_t caculate_sum_check(void)
|
||
* description : 运行校验和计算
|
||
* Input : typeStructHeader:数据结构头部
|
||
typeStructLength:数据结构长度
|
||
* Output : void
|
||
* Return : 计算结果
|
||
********************************************************************/
|
||
|
||
uint8_t caculate_sum_check(uint8_t *typeStructHeader, uint8_t typeStructLength)
|
||
{
|
||
uint8_t sum = 0;
|
||
uint8_t * typeStructCMD = &typeStructHeader[2];
|
||
for (uint8_t i = 0; i < typeStructLength; i++)
|
||
{
|
||
sum += typeStructCMD[i];
|
||
}
|
||
return sum&0xFF;
|
||
}
|
||
|
||
/// @brief 运行状态回复
|
||
reply_run_status_t replyRunStatus = {
|
||
.frameHeader = FRAME_HEADER,
|
||
.frameLength = sizeof(replyRunStatus) - 4, //减去帧头、帧长度、校验和、帧尾
|
||
.functionCode = RUN_ROLL,
|
||
.myNumber = 0x01,
|
||
.channel = 0x01,
|
||
.checkSum = 0,
|
||
.frameTail = FRAME_TAIL
|
||
};
|
||
/********************************************************************
|
||
* name : void RunRoll(void)
|
||
* description : 运行轮询
|
||
* Input : void
|
||
* Output : void
|
||
* Return : void
|
||
********************************************************************/
|
||
void RunRoll(void)
|
||
{
|
||
uint32_t ulCrc = 0;
|
||
uint16_t Length = sizeof(replyRunStatus);
|
||
|
||
replyRunStatus.ChargeState = ChargeState;
|
||
replyRunStatus.BatteryLevelA = Battery_Percentage;
|
||
|
||
replyRunStatus.checkSum = (uint8_t)caculate_sum_check((uint8_t *)&replyRunStatus, replyRunStatus.frameLength);
|
||
|
||
ble_nus_data_send(&m_nus, &replyRunStatus.frameHeader, &Length, m_conn_handle);
|
||
}
|
||
/********************************************************************
|
||
* name : void CheckVersion(void)
|
||
* description : 版本查询
|
||
* Input : void
|
||
* Output : void
|
||
* Return : void
|
||
********************************************************************/
|
||
check_version_t checkVersion = {
|
||
.frameHeader = FRAME_HEADER,
|
||
.frameLength = sizeof(checkVersion) - 4, //减去帧头、帧长度、校验和、帧尾
|
||
.functionCode = VERSION_INQUIRY,
|
||
.myNumber = 0x01,
|
||
.channel = 0x01,
|
||
.checkSum = 0,
|
||
.frameTail = FRAME_TAIL
|
||
}
|
||
void CheckVersion(void)
|
||
{
|
||
uint8_t j = 2;
|
||
static uint8_t aTxBuffer[21] = {0};
|
||
uint32_t ulCrc = 0;
|
||
uint16_t Length = 21;
|
||
|
||
/* 帧头、帧尾*/
|
||
aTxBuffer[HeadOffset] = 0xAA;
|
||
aTxBuffer[DataLengthOffset] = 0x11;
|
||
aTxBuffer[FunctionCodeOffset] = VERSION_INQUIRY;
|
||
aTxBuffer[ChannelNumOffset] = 0x00;
|
||
aTxBuffer[20] = 0x55;
|
||
|
||
/* 协议中规定先发送高字节,后发送低字节 */
|
||
aTxBuffer[4] = VersionDes[0];
|
||
aTxBuffer[5] = VersionDes[1];
|
||
aTxBuffer[6] = VersionDes[2];
|
||
aTxBuffer[7] = VersionDes[3];
|
||
aTxBuffer[8] = VersionDes[4];
|
||
aTxBuffer[9] = VersionDes[5];
|
||
aTxBuffer[10] = VersionDes[6];
|
||
aTxBuffer[11] = VersionDes[7];
|
||
aTxBuffer[12] = 0x00;
|
||
aTxBuffer[13] = 0x00;
|
||
aTxBuffer[14] = 0x00;
|
||
aTxBuffer[15] = 0x00;
|
||
aTxBuffer[16] = 0x00;
|
||
aTxBuffer[17] = 0x00;
|
||
aTxBuffer[18] = 0x00;
|
||
/* 校验和 */
|
||
for(uint8_t i = 0; i < 17; i++)
|
||
{
|
||
ulCrc += aTxBuffer[j];
|
||
j++;
|
||
}
|
||
aTxBuffer[19] = (uint8_t)ulCrc;
|
||
ble_nus_data_send(&m_nus, aTxBuffer, &Length, m_conn_handle);
|
||
}
|
||
/********************************************************************
|
||
* name : void EegDataSend(void)
|
||
* description : 发送肌电数据
|
||
* Input : void
|
||
* Output : void
|
||
* Return : void
|
||
********************************************************************/
|
||
void EegDataSend(void)
|
||
{
|
||
uint8_t j = 2;
|
||
|
||
static uint8_t aTxBuffer[EEG_DATA_LENGTH+6] = {0};
|
||
uint32_t ulCrc = 0;
|
||
uint16_t Length = EEG_DATA_LENGTH+6;
|
||
ret_code_t err_code;
|
||
|
||
/* 帧头、帧尾*/
|
||
aTxBuffer[HeadOffset] = 0xAA;
|
||
aTxBuffer[DataLengthOffset] = 0x34;
|
||
aTxBuffer[FunctionCodeOffset] = EEG_DATA;
|
||
aTxBuffer[ChannelNumOffset] = 0x00;
|
||
aTxBuffer[EEG_DATA_LENGTH+5] = 0x55;
|
||
|
||
/* 协议中规定先发送高字节,后发送低字节 */
|
||
memcpy(&aTxBuffer[4],aEEGData,EEG_DATA_LENGTH);
|
||
|
||
/* 校验和 */
|
||
for(uint8_t i = 0; i < EEG_DATA_LENGTH+2; i++)
|
||
{
|
||
ulCrc += aTxBuffer[j];
|
||
j++;
|
||
}
|
||
aTxBuffer[EEG_DATA_LENGTH+4] = (uint8_t)ulCrc;
|
||
ble_nus_data_send(&m_nus, aTxBuffer, &Length, m_conn_handle);
|
||
}
|
||
/********************************************************************
|
||
* name : void UpdateCurrent(uint8_t CurrentSend)
|
||
* description : 同步电流
|
||
* Input : void
|
||
* Output : void
|
||
* Return : void
|
||
********************************************************************/
|
||
void UpdateCurrent(uint8_t CurrentSend)
|
||
{
|
||
uint8_t j = 2;
|
||
uint8_t aTxBuffer[8] = {0};
|
||
uint32_t ulCrc = 0;
|
||
uint16_t Length = 8;
|
||
|
||
/* 帧头、帧尾*/
|
||
aTxBuffer[HeadOffset] = 0xAA;
|
||
aTxBuffer[DataLengthOffset] = 0x04;
|
||
aTxBuffer[FunctionCodeOffset] = CURRENT_CONTROL;
|
||
aTxBuffer[ChannelNumOffset] = 0x00;
|
||
aTxBuffer[7] = 0x55;
|
||
|
||
/* 协议中规定先发送高字节,后发送低字节 */
|
||
aTxBuffer[4] = CurrentSend;
|
||
aTxBuffer[5] = 0x01; // 01代表蓝牙设备发送
|
||
|
||
/* 校验和 */
|
||
for(uint8_t i = 0; i < 4; i++)
|
||
{
|
||
ulCrc += aTxBuffer[j];
|
||
j++;
|
||
}
|
||
aTxBuffer[6] = (uint8_t)ulCrc;
|
||
ble_nus_data_send(&m_nus, aTxBuffer, &Length, m_conn_handle);
|
||
}
|
||
|
||
|
||
void user_ble_or_uart_send(char * txBufferP, uint16_t Length)
|
||
{
|
||
ble_nus_data_send(&m_nus, txBufferP, &Length, m_conn_handle);
|
||
}
|
||
|
||
/********************************************************************
|
||
* name : void ble_send_rms_data(uint16_t rms_data)
|
||
* description : 发送肌电数据到主机
|
||
* Input : uint16_t rms_data:肌电数据
|
||
* Output : void
|
||
* Return :
|
||
********************************************************************/
|
||
void ble_send_rms_data(uint16_t rms_data)
|
||
{
|
||
uint32_t TempSum = 0;
|
||
|
||
static uint8_t sendCnt = 0;
|
||
|
||
if(sendCnt < RMS_USER_DATA_LENGTH)
|
||
{
|
||
rmsData.rmsDataBuffer[sendCnt] = rms_data; //将rms_data存入rmsData的rmsDataBuffer数组中
|
||
sendCnt++;
|
||
if(sendCnt < RMS_USER_DATA_LENGTH)
|
||
return ; //如果发送次数小于RMS_USER_DATA_LENGTH,则不发送
|
||
}
|
||
sendCnt = 0; //发送次数达到RMS_USER_DATA_LENGTH后,重置发送次数
|
||
rmsData.myNumber = 1;
|
||
//rmsData.myNumber++;
|
||
uint8_t * sumCheckStartP = (uint8_t *)&rmsData.functionCode;
|
||
for(uint8_t i = 0; i < rmsData.frameLength; i++)
|
||
{
|
||
TempSum += sumCheckStartP[i];
|
||
}
|
||
rmsData.checkSum = TempSum & 0xff;
|
||
user_ble_or_uart_send((uint8_t *)&rmsData, sizeof(rmsData)); //145us
|
||
}
|
||
|
||
|
||
/********************************************************************
|
||
* name : void StateUpLoad(AdapterStateInfo_e AdapterStateTemp , ElectrodeStatusInfo_e ElectrodeStatusTemp)
|
||
* description : 电极片和适配器状态上传
|
||
* Input : AdapterStateInfo_e AdapterStateTemp , ElectrodeStatusInfo_e ElectrodeStatusTemp
|
||
* Output : void
|
||
* Return : void
|
||
********************************************************************/
|
||
void StateUpLoad(AdapterStateInfo_e AdapterStateTemp , ElectrodeStatusInfo_e ElectrodeStatusTemp)
|
||
{
|
||
uint8_t j = 2;
|
||
uint8_t aTxBuffer[8] = {0};
|
||
uint32_t ulCrc = 0;
|
||
uint16_t Length = 8;
|
||
|
||
AdapterStateInfo_e AdapterStateIn;
|
||
ElectrodeStatusInfo_e ElectrodeStatusIn;
|
||
|
||
AdapterStateIn = AdapterStateTemp;
|
||
ElectrodeStatusIn = ElectrodeStatusTemp;
|
||
|
||
/* 帧头、帧尾*/
|
||
aTxBuffer[HeadOffset] = 0xAA;
|
||
aTxBuffer[DataLengthOffset] = 0x04;
|
||
aTxBuffer[FunctionCodeOffset] = STATE_UPLOAD;
|
||
aTxBuffer[ChannelNumOffset] = 0x00;
|
||
aTxBuffer[7] = 0x55;
|
||
|
||
aTxBuffer[4] = AdapterStateIn; // 适配器连接状态
|
||
aTxBuffer[5] = ElectrodeStatusIn; // 电极片状态
|
||
|
||
if(ElectrodeStatusIn == ElectrodeFalloff)
|
||
{
|
||
|
||
ElectrodeStatusInfo = ElectrodeConnectted;
|
||
}
|
||
|
||
NRF_LOG_INFO("Electrodestatus = %d",ElectrodeStatusIn);
|
||
/* 校验和 */
|
||
for(uint8_t i = 0; i < 4; i++)
|
||
{
|
||
ulCrc += aTxBuffer[j];
|
||
j++;
|
||
}
|
||
aTxBuffer[6] = (uint8_t)ulCrc;
|
||
ble_nus_data_send(&m_nus, aTxBuffer, &Length, m_conn_handle);
|
||
}
|
||
/********************************************************************
|
||
* name : void UpdateControlStatus(uint8_t ControlStatus)
|
||
* description : 同步电流
|
||
* Input : void
|
||
* Output : void
|
||
* Return : void
|
||
********************************************************************/
|
||
void UpdateControlStatus(uint8_t ControlStatus)
|
||
{
|
||
uint8_t j = 2;
|
||
uint8_t aTxBuffer[8] = {0};
|
||
uint32_t ulCrc = 0;
|
||
uint16_t Length = 8;
|
||
|
||
/* 帧头、帧尾*/
|
||
aTxBuffer[HeadOffset] = 0xAA;
|
||
aTxBuffer[DataLengthOffset] = 0x04;
|
||
aTxBuffer[FunctionCodeOffset] = START_STOP_CONTROL;
|
||
aTxBuffer[ChannelNumOffset] = 0x00;
|
||
aTxBuffer[7] = 0x55;
|
||
|
||
/* 协议中规定先发送高字节,后发送低字节 */
|
||
aTxBuffer[4] = ControlStatus;
|
||
aTxBuffer[5] = 0x01; // 01代表蓝牙设备发送
|
||
|
||
/* 校验和 */
|
||
for(uint8_t i = 0; i < 4; i++)
|
||
{
|
||
ulCrc += aTxBuffer[j];
|
||
j++;
|
||
}
|
||
aTxBuffer[6] = (uint8_t)ulCrc;
|
||
ble_nus_data_send(&m_nus, aTxBuffer, &Length, m_conn_handle);
|
||
}
|
||
/********************************************************************
|
||
* name : void SchemeQuery(uint8_t idMSB,uint8_t idLSB)
|
||
* description : 方案查询
|
||
* Input : void
|
||
* Output : void
|
||
* Return : void
|
||
********************************************************************/
|
||
void SchemeQuery(uint8_t idMSB,uint8_t idLSB)
|
||
{
|
||
uint8_t j = 2;
|
||
static uint8_t aTxBuffer[8] = {0};
|
||
uint32_t ulCrc = 0;
|
||
uint16_t Length = 8;
|
||
|
||
/* 帧头、帧尾*/
|
||
aTxBuffer[HeadOffset] = 0xAA;
|
||
aTxBuffer[DataLengthOffset] = 0x04;
|
||
aTxBuffer[FunctionCodeOffset] = SCHEME_QUERY;
|
||
aTxBuffer[ChannelNumOffset] = 0x00;
|
||
aTxBuffer[7] = 0x55;
|
||
|
||
/* 协议中规定先发送高字节,后发送低字节 */
|
||
aTxBuffer[4] = idMSB;
|
||
aTxBuffer[5] = idLSB;
|
||
|
||
/* 校验和 */
|
||
for(uint8_t i = 0; i < 4; i++)
|
||
{
|
||
ulCrc += aTxBuffer[j];
|
||
j++;
|
||
}
|
||
aTxBuffer[6] = (uint8_t)ulCrc;
|
||
ble_nus_data_send(&m_nus, aTxBuffer, &Length, m_conn_handle);
|
||
}
|
||
/********************************************************************
|
||
* name : void MACQuery(void)
|
||
* description : MAC地址查询
|
||
* Input : void
|
||
* Output : void
|
||
* Return : void
|
||
********************************************************************/
|
||
void MACQuery(void)
|
||
{
|
||
uint8_t j = 2;
|
||
static uint8_t aTxBuffer[12] = {0};
|
||
uint32_t ulCrc = 0;
|
||
uint16_t Length = 12;
|
||
|
||
/* 帧头、帧尾*/
|
||
aTxBuffer[HeadOffset] = 0xAA;
|
||
aTxBuffer[DataLengthOffset] = 0x08;
|
||
aTxBuffer[FunctionCodeOffset] = MAC_QUERY;
|
||
aTxBuffer[ChannelNumOffset] = 0x00;
|
||
aTxBuffer[11] = 0x55;
|
||
|
||
aTxBuffer[4] = BLE_MAC[5];
|
||
aTxBuffer[5] = BLE_MAC[4];
|
||
aTxBuffer[6] = BLE_MAC[3];
|
||
aTxBuffer[7] = BLE_MAC[2];
|
||
aTxBuffer[8] = BLE_MAC[1];
|
||
aTxBuffer[9] = BLE_MAC[0];
|
||
/* 校验和 */
|
||
for(uint8_t i = 0; i < 8; i++)
|
||
{
|
||
ulCrc += aTxBuffer[j];
|
||
j++;
|
||
}
|
||
aTxBuffer[10] = (uint8_t)ulCrc;
|
||
ble_nus_data_send(&m_nus, aTxBuffer, &Length, m_conn_handle);
|
||
}
|
||
|
||
/********************************************************************
|
||
* name : void JudgeLedMode(void)
|
||
* description :
|
||
* Input : void
|
||
* Output : void
|
||
* Return : void
|
||
********************************************************************/
|
||
void JudgeLedMode(void)
|
||
{
|
||
|
||
}
|
||
|
||
void DisconnectControl(void)
|
||
{
|
||
StopManage();
|
||
}
|
||
|
||
/*************************** END OF FILE ***************************/
|
||
|
||
|