922 lines
28 KiB
C++
922 lines
28 KiB
C++
#include "fescontroldialog.h"
|
||
#include "ui_fescontroldialog.h"
|
||
#include <QMessageBox>
|
||
#include <QDebug>
|
||
#include <QSerialPortInfo>
|
||
#include "bleitem.h"
|
||
#include <QDir>
|
||
#include <QSettings>
|
||
#include "dbforrmate.h"
|
||
#include "cdatabaseinterface.h"
|
||
#include <QMessageBox>
|
||
#include "readconfig.h"
|
||
#include <QTimer>
|
||
#include <QPainter>
|
||
#include "languagemanager.h"
|
||
|
||
FesControlDialog* FesControlDialog::instance = nullptr;
|
||
|
||
FesControlDialog::FesControlDialog(QWidget *parent) :
|
||
QDialog(parent),
|
||
ui(new Ui::FesControlDialog),
|
||
m_serialPort(NULL),
|
||
deviceConCount(0),
|
||
connectTimer(NULL),
|
||
E_fromFesType(ONLY_FES_E)
|
||
{
|
||
ui->setupUi(this);
|
||
|
||
//跟随主窗体关闭
|
||
ui->queryDevice_Btn->setVisible(false);
|
||
//ui->scanDevice_Btn->setVisible(false);
|
||
|
||
setAttribute(Qt::WA_QuitOnClose,false);
|
||
|
||
for(int i = 0;i< 4;i++)
|
||
{
|
||
deviceDtateArray[i] = 0;
|
||
//m_batteryValue[i] = 0;
|
||
}
|
||
|
||
for(int i = 0;i< 4;i++)
|
||
checkedMuscle_DeviceArray[i] = 0;
|
||
|
||
connectTimer = new QTimer();
|
||
connect(connectTimer,&QTimer::timeout,this,&FesControlDialog::slotConnectFes);
|
||
|
||
addedDeviceList.clear();
|
||
|
||
this->setWindowFlags(Qt::FramelessWindowHint); //设置无边框
|
||
setAttribute(Qt::WA_TranslucentBackground,true); //设置透明
|
||
|
||
initSerialPort();
|
||
|
||
//ui->flushSerial_Btn->setVisible(false);
|
||
}
|
||
|
||
FesControlDialog::~FesControlDialog()
|
||
{
|
||
qDebug()<<"~FesControlDialog()";
|
||
delete ui;
|
||
}
|
||
|
||
FesControlDialog *FesControlDialog::getInstance()
|
||
{
|
||
if(!instance)
|
||
instance = new FesControlDialog();
|
||
return instance;
|
||
}
|
||
|
||
bool FesControlDialog::initSerialPort()
|
||
{
|
||
if(!m_serialPort)
|
||
{
|
||
m_serialPort = new QSerialPort();
|
||
connect(m_serialPort,&QSerialPort::readyRead,this,&FesControlDialog::receiveDataInterface);
|
||
connect(m_serialPort,&QSerialPort::errorOccurred,this,&FesControlDialog::displayError);
|
||
}
|
||
|
||
m_serialPort->close();
|
||
QSerialPortInfo m_SerialPortInfo;
|
||
QStringList serialPortNames;
|
||
|
||
foreach(m_SerialPortInfo,QSerialPortInfo::availablePorts())
|
||
{
|
||
QSerialPort serialport;
|
||
serialport.setPort(m_SerialPortInfo);
|
||
|
||
if(serialport.open(QIODevice::ReadWrite))
|
||
{
|
||
serialPortNames.append(m_SerialPortInfo.portName());
|
||
serialport.close();
|
||
}
|
||
}
|
||
|
||
if(!serialPortNames.isEmpty())
|
||
{
|
||
ui->serial_ComboBox->clear();
|
||
ui->serial_ComboBox->addItems(serialPortNames);
|
||
}
|
||
else
|
||
{
|
||
QMessageBox::warning(NULL,tr("警告"),tr("FES无可用串口"),QMessageBox::Retry);
|
||
return false;
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
char FesControlDialog::getSum(QByteArray srcArray, int startIndex, int endIndex)
|
||
{
|
||
if(srcArray==nullptr||srcArray.length()==0||startIndex>srcArray.length()||endIndex>srcArray.length()||startIndex>endIndex)
|
||
{
|
||
return static_cast<char>(0);
|
||
}
|
||
int iSum=0;
|
||
for(int i=startIndex;i<=endIndex;i++)
|
||
{
|
||
iSum+=srcArray[i];
|
||
}
|
||
return static_cast<char>(iSum%256);
|
||
}
|
||
|
||
QByteArray FesControlDialog::createFrame(QByteArray dataBuffer)
|
||
{
|
||
//创建数据包
|
||
QByteArray buffer;
|
||
buffer.append(static_cast<char>(FRAME_HEAD));
|
||
buffer.append(static_cast<char>(dataBuffer.length()));
|
||
for(int i=0;i<dataBuffer.length();i++)
|
||
{
|
||
buffer.append(dataBuffer.data()[i]);
|
||
}
|
||
buffer.append(getSum(buffer,2,buffer.length()-1));
|
||
buffer.append(0x55);
|
||
return buffer;
|
||
}
|
||
|
||
void FesControlDialog::openSerialPort()
|
||
{
|
||
if(m_serialPort)
|
||
{
|
||
m_serialPort->setPortName(ui->serial_ComboBox->currentText());
|
||
m_serialPort->setReadBufferSize(200);
|
||
if(m_serialPort->open(QIODevice::ReadWrite))
|
||
{
|
||
m_serialPort->setBaudRate(QSerialPort::Baud115200);
|
||
m_serialPort->setDataBits(QSerialPort::Data8);
|
||
m_serialPort->setParity(QSerialPort::NoParity);
|
||
m_serialPort->setStopBits(QSerialPort::OneStop);
|
||
m_serialPort->setFlowControl(QSerialPort::NoFlowControl);
|
||
ui->openSerial_Btn->setText("关闭");
|
||
}
|
||
else
|
||
{
|
||
QMessageBox::warning(NULL,tr("警告"),tr("串口打开失败"),QMessageBox::Retry);
|
||
}
|
||
}
|
||
}
|
||
|
||
bool FesControlDialog::openSeriaport(ST_SerialPortConfig st_serialParam)
|
||
{
|
||
if(m_serialPort)
|
||
{
|
||
m_serialPort->setPortName(st_serialParam.portName);
|
||
m_serialPort->setReadBufferSize(200);
|
||
if(m_serialPort->open(QIODevice::ReadWrite))
|
||
{
|
||
m_serialPort->setBaudRate(QSerialPort::Baud115200);
|
||
m_serialPort->setDataBits(QSerialPort::Data8);
|
||
m_serialPort->setParity(QSerialPort::NoParity);
|
||
m_serialPort->setStopBits(QSerialPort::OneStop);
|
||
m_serialPort->setFlowControl(QSerialPort::NoFlowControl);
|
||
ui->openSerial_Btn->setText("关闭");
|
||
return true;
|
||
}
|
||
else
|
||
{
|
||
QMessageBox::warning(NULL,tr("警告"),tr("FES串口打开失败"),QMessageBox::Retry);
|
||
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
|
||
void FesControlDialog::searchDevice()
|
||
{
|
||
QByteArray array(4,0);
|
||
array[0] = CMD_SEARCH_DEVICE_E; //功能码
|
||
array[1] = 0; //设备编号0,搜索所有设备
|
||
array[2] = 0; //通道号0,默认值
|
||
array[3] = 1; //数据(1-开始搜索,0-停止搜索)
|
||
QByteArray sendArray = createFrame(array);
|
||
|
||
sendData(sendArray);
|
||
}
|
||
|
||
bool FesControlDialog::connectDevice(QByteArray mac,uint8_t deviceNum)
|
||
{
|
||
QByteArray array(3,0);
|
||
array[0] = CMD_DEVICE_CONNECT_E; //功能码
|
||
array[1] = deviceNum; //设备编号0,搜索所有设备
|
||
array[2] = 0; //通道号0,默认值
|
||
array.append(mac);
|
||
QByteArray sendArray = createFrame(array);
|
||
|
||
sendData(sendArray);
|
||
|
||
return true;
|
||
}
|
||
|
||
void FesControlDialog::setPreCurrentState(int device, int channel, bool state)
|
||
{
|
||
QByteArray dataArray(4,0);
|
||
dataArray[0] = PreCurrentSwitch; //功能码
|
||
dataArray[1] = device; //设备编号0,搜索所有设备
|
||
dataArray[2] = channel; //通道号0,默认值
|
||
dataArray[3] = state ? 1: 0; //1-开 0-关
|
||
QByteArray sendArray = createFrame(dataArray);
|
||
sendData(sendArray);
|
||
|
||
}
|
||
|
||
//预设电流大小
|
||
void FesControlDialog::setPreCurrent(int device,int channel,uint8_t current)
|
||
{
|
||
QByteArray dataArray(4,0);
|
||
dataArray[0] = PreCurrentSet_E; //功能码
|
||
dataArray[1] = device; //设备编号0,搜索所有设备
|
||
dataArray[2] = channel; //通道号0,默认值
|
||
dataArray[3] = current; //1-开 0-关
|
||
QByteArray sendArray = createFrame(dataArray);
|
||
sendData(sendArray);
|
||
}
|
||
|
||
void FesControlDialog::setPreFrequency(int device, int channel, int16_t current)
|
||
{
|
||
QByteArray dataArray(3,0);
|
||
dataArray[0] = FES_PRE_FREQUENCY; //功能码
|
||
dataArray[1] = device; //设备编号0,搜索所有设备
|
||
dataArray[2] = channel; //通道号0,默认值
|
||
// memcpy(dataArray.data()+3,¤t,sizeof(current));
|
||
|
||
QByteArray tempArray(2,0);
|
||
memcpy(tempArray.data(),¤t,sizeof(current));
|
||
dataArray.append(tempArray.at(1)).append(tempArray.at(0));
|
||
|
||
QByteArray sendArray = createFrame(dataArray);
|
||
sendData(sendArray);
|
||
qDebug() <<"发送频率:"<< sendArray.toHex();
|
||
/*
|
||
switch(E_fromFesType) //FES参数来的页面
|
||
{
|
||
case ONLY_FES_E:
|
||
m_st_OnlyFESParam.frequency = current;
|
||
//FesControlDialog::getInstance()->setOnlyFesParam(device,channel,m_st_OnlyFESParam);
|
||
|
||
Sleep(100);
|
||
// FesControlDialog::getInstance()->setPreCurrentState(device,channel,true);
|
||
//qDebug()<<"单独电刺激,修改预设频率:"<<current<<m_st_OnlyFESParam.frequency << m_st_OnlyFESParam.keepTime << m_st_OnlyFESParam.mode;
|
||
break;
|
||
case BICYCLE_FES_E:
|
||
m_st_fesParam.frequency = current;
|
||
//qDebug()<<"脚踏车电刺激,修改预设频率:"<<current;
|
||
//FesControlDialog::getInstance()->setFesParam(device,channel,m_st_fesParam);
|
||
Sleep(100);
|
||
|
||
//FesControlDialog::getInstance()->setPreCurrentState(device,channel,true);
|
||
break;
|
||
}
|
||
*/
|
||
|
||
}
|
||
|
||
void FesControlDialog::setPrePulseWidth(int device, int channel, int16_t current)
|
||
{
|
||
//qDebug() << E_fromFesType;
|
||
/*
|
||
switch(E_fromFesType) //FES参数来的页面
|
||
{
|
||
case ONLY_FES_E:
|
||
m_st_OnlyFESParam.pulseWidth = current;
|
||
FesControlDialog::getInstance()->setOnlyFesParam(device,channel,m_st_OnlyFESParam);
|
||
Sleep(100);
|
||
// FesControlDialog::getInstance()->setPreCurrentState(device,channel,true);
|
||
//qDebug()<<"单独电刺激,修改预设频率:"<<current<<m_st_OnlyFESParam.frequency<<m_st_OnlyFESParam.pulseWidth << m_st_OnlyFESParam.keepTime << m_st_OnlyFESParam.mode;
|
||
break;
|
||
case BICYCLE_FES_E:
|
||
m_st_fesParam.pulseWidth = current;
|
||
qDebug()<<"脚踏车电刺激,修改预设频率:"<<current<<m_st_fesParam.frequency << m_st_fesParam.pulseWidth << m_st_fesParam.mode;
|
||
FesControlDialog::getInstance()->setFesParam(device,channel,m_st_fesParam);
|
||
Sleep(100);
|
||
//FesControlDialog::getInstance()->setPreCurrentState(device,channel,true);
|
||
break;
|
||
}*/
|
||
QByteArray dataArray(3,0);
|
||
dataArray[0] = FES_PRE_BINDWIDTH; //功能码
|
||
dataArray[1] = device; //设备编号0,搜索所有设备
|
||
dataArray[2] = channel; //通道号0,默认值
|
||
|
||
QByteArray tempArray(2,0);
|
||
memcpy(tempArray.data(),¤t,sizeof(current));
|
||
dataArray.append(tempArray.at(1)).append(tempArray.at(0));
|
||
|
||
QByteArray sendArray = createFrame(dataArray);
|
||
sendData(sendArray);
|
||
qDebug() <<"发送带宽:"<< sendArray.toHex();
|
||
}
|
||
|
||
void FesControlDialog::setFesParam(int device,int channel,ST_FESSetParam st_fesParam)
|
||
{
|
||
//来自页面,保存参数
|
||
m_st_fesParam = st_fesParam;
|
||
|
||
E_fromFesType = BICYCLE_FES_E;
|
||
|
||
QByteArray dataArray(6,0);
|
||
dataArray[0] = FESParamSet_E; //功能码
|
||
dataArray[1] = device; //设备编号0,搜索所有设备
|
||
dataArray[2] = channel; //通道号0,默认值
|
||
dataArray[3] = 2; //刺激
|
||
dataArray[4] = 1; //采样率4k
|
||
dataArray[5] = 1; //双向对称方波
|
||
QByteArray tempArray(2,0);
|
||
//频率
|
||
memcpy(tempArray.data(),&st_fesParam.frequency,sizeof(st_fesParam.frequency));
|
||
dataArray.append(tempArray.at(1)).append(tempArray.at(0));
|
||
//脉宽
|
||
memcpy(tempArray.data(),&st_fesParam.pulseWidth,sizeof(st_fesParam.pulseWidth));
|
||
dataArray.append(tempArray.at(1)).append(tempArray.at(0));
|
||
//起始角度
|
||
memcpy(tempArray.data(),&st_fesParam.startAngle,sizeof(st_fesParam.startAngle));
|
||
dataArray.append(tempArray.at(1)).append(tempArray.at(0));
|
||
//结束角度
|
||
memcpy(tempArray.data(),&st_fesParam.stopAgnle,sizeof(st_fesParam.stopAgnle));
|
||
dataArray.append(tempArray.at(1)).append(tempArray.at(0));
|
||
|
||
//起始角度-逆向
|
||
memcpy(tempArray.data(),&st_fesParam.startAngleReverse,sizeof(st_fesParam.startAngle));
|
||
dataArray.append(tempArray.at(1)).append(tempArray.at(0));
|
||
//结束角度-逆向
|
||
|
||
memcpy(tempArray.data(),&st_fesParam.stopAgnleReverse,sizeof(st_fesParam.stopAgnle));
|
||
dataArray.append(tempArray.at(1)).append(tempArray.at(0));
|
||
|
||
//最小电流
|
||
dataArray.append(st_fesParam.minCurrent);
|
||
//最大电流sendRealTimeFesParam
|
||
dataArray.append(st_fesParam.maxCurrent);
|
||
//上下肢区分
|
||
dataArray.append(st_fesParam.upDownLimp);
|
||
//左右肢区分
|
||
dataArray.append(st_fesParam.leftRightLimp);
|
||
|
||
QByteArray sendArray = createFrame(dataArray);
|
||
sendData(sendArray);
|
||
qDebug() <<"发送数据:"<<sendArray.toHex();
|
||
|
||
}
|
||
|
||
void FesControlDialog::setRealTimeParam(int device,ST_FESRealTimeParam st_fesRealTimeParam)
|
||
{
|
||
QByteArray dataArray(5,0);
|
||
dataArray[0] = RealTimeParam_E; //功能码
|
||
dataArray[1] = device; //设备编号0,搜索所有设备
|
||
dataArray[2] = 0; //通道号0,默认值
|
||
dataArray[3] = st_fesRealTimeParam.upSpeed;//实时速度
|
||
dataArray[4] = st_fesRealTimeParam.downSpeed;//实时速度
|
||
QByteArray tempArray(2,0);
|
||
//上肢实时角度
|
||
memcpy(tempArray.data(),&st_fesRealTimeParam.currentUpAngle,sizeof(st_fesRealTimeParam.currentUpAngle));
|
||
dataArray.append(tempArray.at(1)).append(tempArray.at(0));
|
||
//下肢实时角度
|
||
memcpy(tempArray.data(),&st_fesRealTimeParam.currentDownAngle,sizeof(st_fesRealTimeParam.currentDownAngle));
|
||
dataArray.append(tempArray.at(1)).append(tempArray.at(0));
|
||
|
||
dataArray.append(st_fesRealTimeParam.direction);
|
||
QByteArray sendArray = createFrame(dataArray);
|
||
sendData(sendArray);
|
||
qDebug() <<"电刺激实时数据:"<<sendArray.toHex();
|
||
|
||
}
|
||
|
||
void FesControlDialog::switchDeviceChannel(int device, int channel, bool on)
|
||
{
|
||
QByteArray dataArray(4,0);
|
||
dataArray[0] = CMD_CHANNEL_CONTROL; //功能码
|
||
dataArray[1] = device; //设备编号0,搜索所有设备
|
||
dataArray[2] = channel; //通道号0,默认值
|
||
dataArray[3] = on ? 1:0; //1-开 0-关
|
||
QByteArray sendArray = createFrame(dataArray);
|
||
sendData(sendArray);
|
||
qDebug() <<"发送FES输出开关指令:"<<sendArray.toHex();
|
||
}
|
||
|
||
|
||
void FesControlDialog::setOnlyFesParam(int device,int channel,ST_OnlyFESParam st_fesParm)
|
||
{
|
||
m_st_OnlyFESParam = st_fesParm;
|
||
E_fromFesType = ONLY_FES_E;
|
||
|
||
st_fesParm.mode = 0x02;//刺激
|
||
st_fesParm.sampleRate = 0;//采样率4K
|
||
st_fesParm.waveStyle = 1;//波形 双向方波
|
||
QByteArray dataArray;
|
||
|
||
dataArray.append(st_fesParm.mode);
|
||
dataArray.append(st_fesParm.sampleRate);
|
||
dataArray.append(st_fesParm.waveStyle);
|
||
|
||
QByteArray tempArray(2,0);
|
||
memcpy(tempArray.data(),&st_fesParm.frequency,sizeof(st_fesParm.frequency));
|
||
dataArray.append(tempArray.at(1)).append(tempArray.at(0));
|
||
|
||
memcpy(tempArray.data(),&st_fesParm.pulseWidth,sizeof(st_fesParm.pulseWidth));
|
||
dataArray.append(tempArray.at(1)).append(tempArray.at(0));
|
||
|
||
memcpy(tempArray.data(),&st_fesParm.waveRise,sizeof(st_fesParm.waveRise));
|
||
dataArray.append(tempArray.at(1)).append(tempArray.at(0));
|
||
|
||
memcpy(tempArray.data(),&st_fesParm.keepTime,sizeof(st_fesParm.keepTime));
|
||
dataArray.append(tempArray.at(1)).append(tempArray.at(0));
|
||
|
||
memcpy(tempArray.data(),&st_fesParm.waveFall,sizeof(st_fesParm.waveFall));
|
||
dataArray.append(tempArray.at(1)).append(tempArray.at(0));
|
||
|
||
memcpy(tempArray.data(),&st_fesParm.sleepTime,sizeof(st_fesParm.sleepTime));
|
||
dataArray.append(tempArray.at(1)).append(tempArray.at(0));
|
||
|
||
QByteArray array(3,0);
|
||
array[0] = CMD_PARAM_SET_E;
|
||
array[1] = device;
|
||
array[2] = channel;
|
||
array.append(dataArray);
|
||
|
||
QByteArray sendArray = createFrame(array);
|
||
|
||
sendData(sendArray);
|
||
qDebug() <<"发送实时参数:"<<sendArray.toHex();
|
||
}
|
||
|
||
/*
|
||
void FesControlDialog::saveOnlyFesParam(ST_OnlyFESParam st_OnlyFESParam)
|
||
{
|
||
m_st_OnlyFESParam = st_OnlyFESParam;
|
||
E_fromFesType = ONLY_FES_E; //从单电刺激页面来的参数
|
||
|
||
}
|
||
|
||
void FesControlDialog::saveBicycleFesParam(ST_FESSetParam st_FESSetParam)
|
||
{
|
||
m_st_fesParam = st_FESSetParam;
|
||
E_fromFesType = BICYCLE_FES_E; //从FES页面来的参数
|
||
|
||
}
|
||
*/
|
||
|
||
|
||
bool FesControlDialog::getDeviceStateByNo(uint8_t deviceNo)
|
||
{
|
||
if(deviceNo <= 4 )
|
||
{
|
||
if(deviceDtateArray[deviceNo-1])
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
bool FesControlDialog::getMuscleDeviceStateByNo(uint8_t deviceNo)
|
||
{
|
||
if(deviceNo >=1 && deviceNo <= 4 )
|
||
{
|
||
if(checkedMuscle_DeviceArray[deviceNo-1])
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
void FesControlDialog::setMuscleDeviceStateByNo(uint8_t deviceNo, bool flag)
|
||
{
|
||
if(flag)
|
||
{
|
||
qDebug() <<"打开设备的肌肉:"<<deviceNo; //从0~3
|
||
checkedMuscle_DeviceArray[deviceNo-1] = 1;
|
||
}
|
||
|
||
else
|
||
{
|
||
qDebug() <<"关闭设备的肌肉:"<<deviceNo;
|
||
checkedMuscle_DeviceArray[deviceNo-1] = 0;
|
||
}
|
||
}
|
||
|
||
//启用电刺激设备
|
||
bool FesControlDialog::openFESDevice()
|
||
{
|
||
//将按钮设置为不可用
|
||
//通过配置文件打开串口
|
||
ST_SerialPortConfig st_serialPortParam;
|
||
if(ReadConfig::getInstance()->getFesASerialPortConfig(st_serialPortParam))
|
||
{
|
||
//初始化串口
|
||
if(initSerialPort())
|
||
{
|
||
//打开串口
|
||
if(openSeriaport(st_serialPortParam))
|
||
{
|
||
//搜索电刺激设备
|
||
searchDevice();
|
||
//连接电刺激设备
|
||
connectTimer->start(1000);
|
||
this->show();
|
||
return true;
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
|
||
return false;
|
||
}
|
||
|
||
void FesControlDialog::queryDeviceState(uint8_t deviceNo)
|
||
{
|
||
QByteArray dataArray(4,0);
|
||
dataArray[0] = CMD_QUERY_STATE_E; //功能码
|
||
dataArray[1] = deviceNo; //设备编号0,搜索所有设备
|
||
dataArray[2] = 0; //通道号0,默认值
|
||
dataArray[3] = 0;
|
||
QByteArray sendArray = createFrame(dataArray);
|
||
sendData(sendArray);
|
||
}
|
||
|
||
void FesControlDialog::turnoffDevice(uint8_t deviceNo, uint8_t type)
|
||
{
|
||
QByteArray array(4,0);
|
||
array[0] = CMD_TURNOFF_E; //功能码
|
||
array[1] = deviceNo; //设备编号
|
||
array[2] = 0; //通道号0,默认值
|
||
array[3] = type; //数据(0-关闭单个设备,1-所有设备)
|
||
QByteArray sendArray = createFrame(array);
|
||
sendData(sendArray);
|
||
if(1 == deviceNo && 1 == type)
|
||
{
|
||
qDebug()<<"关闭所有设备";
|
||
}
|
||
}
|
||
|
||
void FesControlDialog::on_openSerial_Btn_clicked()
|
||
{
|
||
if(ui->openSerial_Btn->text() == "打开")
|
||
{
|
||
openSerialPort();
|
||
}
|
||
else if(ui->openSerial_Btn->text() == "关闭")
|
||
{
|
||
m_serialPort->close();
|
||
ui->openSerial_Btn->setText("打开");
|
||
//刷新串口
|
||
initSerialPort();
|
||
}
|
||
}
|
||
|
||
void FesControlDialog::on_scanDevice_Btn_clicked()
|
||
{
|
||
searchDevice();
|
||
}
|
||
|
||
void FesControlDialog::receiveDataInterface()
|
||
{
|
||
QByteArray buf;
|
||
buf = m_serialPort->readAll();
|
||
receiveArray.append(buf);
|
||
while(!receiveArray.isEmpty())
|
||
{
|
||
if(receiveArray[0] != (char)(0xAA))
|
||
{
|
||
receiveArray.remove(0,1);
|
||
}
|
||
else
|
||
{
|
||
//获取有效数据长度
|
||
uint8_t datalen = 0;
|
||
memcpy(&datalen,receiveArray.constData()+1,sizeof(uint8_t));
|
||
|
||
if(receiveArray.length() >= datalen + 4)
|
||
{
|
||
//校验成功
|
||
if((uint8_t)receiveArray[datalen+3] == 0x55)
|
||
{
|
||
analysisData(receiveArray);
|
||
receiveArray.remove(0,datalen + 4);
|
||
}
|
||
else //校验失败
|
||
{
|
||
//方式1 丢弃本包
|
||
receiveArray.remove(0,datalen + 4);
|
||
}
|
||
}
|
||
else //数据不够,直接退出继续接收
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
void FesControlDialog::analysisData(QByteArray array)
|
||
{
|
||
uint8_t deviceNo = uint8_t(array[3]);
|
||
qDebug()<<"FES所有数据:"<<array.toHex();
|
||
|
||
switch(array[2])
|
||
{
|
||
case CMD_QUERY_STATE_E:
|
||
{
|
||
//qDebug()<<"轮询:"<<array.toHex();
|
||
int temp_batteryValue = array[7];//电量
|
||
//temp_batteryValue = 50;
|
||
int temp_deviceNo = array[3];
|
||
if(temp_deviceNo <= 4)
|
||
// m_batteryValue[temp_deviceNo] = temp_batteryValue;
|
||
emit signalGetBattery(temp_deviceNo,temp_batteryValue);
|
||
//如果轮训,发现设备不在列表中,则删除
|
||
}
|
||
break;
|
||
case CMD_TURNOFF_E:
|
||
if(deviceNo <= 4)
|
||
deviceDtateArray[deviceNo-1] = 0;
|
||
qDebug()<<deviceNo<<"关机断开";
|
||
deviceObjectMap.value(deviceNo)->setDeviceState(false);
|
||
break;
|
||
case CMD_SEARCH_DEVICE_E:
|
||
{
|
||
qDebug()<<"搜索设备";
|
||
//qDebug()<<array.toHex();
|
||
}
|
||
break;
|
||
case CMD_DEVICE_REPORT_E:
|
||
{
|
||
//qDebug()<<"设备上报:"<<array.toHex();
|
||
QByteArray macArray = array.mid(5,6);
|
||
//更新连接界面列表
|
||
if(connectDevieMap.contains(macArray) && (!deviceList.contains(macArray)))
|
||
{
|
||
//填充自动连接设备列表
|
||
AutoFESDeviceMap.insert(connectDevieMap.value(macArray),macArray);
|
||
AutoFESDeviceControlStateMap.insert(connectDevieMap.value(macArray),false);
|
||
deviceList.append(macArray);
|
||
updateDeviceList();
|
||
}
|
||
}
|
||
break;
|
||
case CMD_DEVICE_CONNECT_E:
|
||
if(deviceObjectMap.contains(deviceNo))
|
||
{
|
||
if(deviceNo <= 4)
|
||
deviceDtateArray[deviceNo-1] = 1;
|
||
//for(int i=0; 1<4; i++)
|
||
// qDebug()<<"点击连接状态:"<<i<<deviceDtateArray[i];
|
||
AutoFESDeviceControlStateMap[deviceNo] = true;
|
||
deviceObjectMap.value(deviceNo)->setDeviceState(true);
|
||
}
|
||
break;
|
||
case CMD_DEVICE_DISCONNECT_E:
|
||
qDebug()<<deviceNo<<"断开";
|
||
|
||
if(deviceObjectMap.contains(deviceNo))
|
||
{
|
||
if(deviceNo <= 4)
|
||
deviceDtateArray[deviceNo-1] = 0;
|
||
|
||
AutoFESDeviceControlStateMap[deviceNo] = false;
|
||
deviceObjectMap.value(deviceNo)->setDeviceState(false);
|
||
|
||
/*
|
||
BLEItem *bleItem = new BLEItem(deviceNo-1);
|
||
bleItem->setBLEName(connectDevieMap.value(deviceList.at(deviceNo-1)));
|
||
|
||
QListWidgetItem *item =ui->listWidget->item(deviceNo-1);
|
||
//item->setSizeHint(QSize(100,65));
|
||
//ui->listWidget->addItem(item);
|
||
|
||
ui->listWidget->removeItemWidget(item);
|
||
ui->listWidget->takeItem(deviceNo-1);
|
||
delete item;
|
||
*/
|
||
/*
|
||
qDebug()<<"ui->listWidget->count()"<<ui->listWidget->count();
|
||
BLEItem *bleItem = new BLEItem(deviceNo-1);
|
||
bleItem->setBLEName(deviceNo); //BLeItem和命名
|
||
|
||
qDebug()<<"ui->listWidget->count()2"<<ui->listWidget->count();
|
||
for(int i = 0; i < ui->listWidget->count(); ++i) //编号
|
||
{
|
||
//QListWidgetItem *item =ui->listWidget->item(i);
|
||
QListWidgetItem *item =ui->listWidget->item(i);
|
||
|
||
// 获取与item关联的QWidget
|
||
QWidget *widget = ui->listWidget->itemWidget(item);
|
||
// 尝试将QWidget转换为BLEItem
|
||
BLEItem *tempBleItem = dynamic_cast<BLEItem*>(widget);
|
||
|
||
if(bleItem->getBLEName() == tempBleItem->getBLEName())
|
||
{
|
||
|
||
qDebug() <<"清除:"<< bleItem->getBLEName();
|
||
|
||
ui->listWidget->removeItemWidget(item);
|
||
delete tempBleItem;
|
||
delete item; // 从QListWidget中移除item*
|
||
|
||
//ui->listWidget->takeItem(i);
|
||
--i;
|
||
|
||
break;
|
||
}
|
||
|
||
}
|
||
*/
|
||
|
||
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
|
||
//更新蓝牙设备列表
|
||
void FesControlDialog::updateDeviceList()
|
||
{
|
||
QStringList labelList;
|
||
for(int i = 0;i < deviceList.count();++i)
|
||
{
|
||
if(addedDeviceList.contains(deviceList.at(i)))
|
||
continue;
|
||
//在连接界面显示
|
||
//qDebug() <<"设备列表:"<<i<< deviceList[i];
|
||
BLEItem *bleItem = new BLEItem(i);
|
||
bleItem->setBLEName(connectDevieMap.value(deviceList.at(i)));
|
||
deviceObjectMap.insert(bleItem->getBLEName(),bleItem);
|
||
|
||
connect(bleItem,&BLEItem::signalConnectDevice,this,&FesControlDialog::slotConnectDevice);
|
||
connect(bleItem,&BLEItem::signalBtnStateChanged,this,&FesControlDialog::deviceStateChanged);
|
||
|
||
QListWidgetItem *item = new QListWidgetItem(ui->listWidget);
|
||
item->setSizeHint(QSize(100,65));
|
||
ui->listWidget->addItem(item);
|
||
ui->listWidget->setItemWidget(item,bleItem);
|
||
|
||
addedDeviceList.append(deviceList.at(i));
|
||
}
|
||
//qDebug() <<"deviceList.count():"<<deviceList.at(0).toInt()<<addedDeviceList.at(0).toInt();
|
||
}
|
||
|
||
|
||
|
||
QByteArray FesControlDialog::str2QByteArray(QString str)
|
||
{
|
||
QByteArray currentMac(6,0);
|
||
bool ok;
|
||
for(int i = 0;i < currentMac.size();++i)
|
||
{
|
||
currentMac[i] = str.mid(2*i,2).toInt(&ok,16);
|
||
}
|
||
return currentMac;
|
||
}
|
||
|
||
|
||
void FesControlDialog::sendData(QByteArray array)
|
||
{
|
||
if(m_serialPort && m_serialPort->isOpen())
|
||
m_serialPort->write(array);
|
||
//qDebug() <<"输出FES数据"<<array.toHex();
|
||
}
|
||
|
||
//查看界面列表
|
||
void FesControlDialog::on_listWidgetClicked(QListWidgetItem *item)
|
||
{
|
||
QString str = item->text();
|
||
QByteArray currentMac(6,0);
|
||
bool ok;
|
||
for(int i = 0;i < currentMac.size();++i)
|
||
{
|
||
currentMac[i] = str.mid(2*i,2).toInt(&ok,16);
|
||
}
|
||
currentMacDevice = currentMac;
|
||
}
|
||
|
||
void FesControlDialog::displayError(QSerialPort::SerialPortError error)
|
||
{
|
||
|
||
}
|
||
|
||
void FesControlDialog::slotConnectDevice(bool connect,uint8_t device)
|
||
{
|
||
QMapIterator<QByteArray, int> iter(connectDevieMap);
|
||
QByteArray devcieMac;
|
||
while (iter.hasNext()) {
|
||
iter.next();
|
||
if(iter.value() == device)
|
||
{
|
||
devcieMac = iter.key();
|
||
break;
|
||
}
|
||
}
|
||
|
||
QByteArray sendArray;
|
||
if(connect)
|
||
{
|
||
QByteArray array(3,0);
|
||
array[0] = CMD_DEVICE_CONNECT_E; //功能码
|
||
array[1] = device; //设备编号0,搜索所有设备
|
||
array[2] = 0; //通道号0,默认值
|
||
array.append(devcieMac);
|
||
sendArray = createFrame(array);
|
||
}
|
||
else
|
||
{
|
||
QByteArray array(4,0);
|
||
array[0] = CMD_TURNOFF_E; //功能码
|
||
array[1] = device; //设备编号
|
||
array[2] = 0; //通道号0,默认值
|
||
array[3] = 0; //数据(0-关闭)
|
||
sendArray = createFrame(array);
|
||
setMuscleDeviceStateByNo(device,false); //已连接的肌肉设备更新
|
||
}
|
||
sendData(sendArray);
|
||
}
|
||
|
||
|
||
|
||
void FesControlDialog::showEvent(QShowEvent *event)
|
||
{
|
||
Q_UNUSED(event)
|
||
//查询数据库
|
||
connectDevieMap.clear();
|
||
QString query("select * from BLEDeviceMsg");
|
||
if(CDatabaseInterface::getInstance()->exec(query))
|
||
{
|
||
int tempNum = CDatabaseInterface::getInstance()->getValuesSize();
|
||
QList<QVariantMap> valueMapList;
|
||
valueMapList = CDatabaseInterface::getInstance()->getValues(0,tempNum);
|
||
for(int i = 0;i < valueMapList.count();++i)
|
||
{
|
||
ST_BLEDevice st_BLEDevice = variantMapToBLEDevice(valueMapList.at(i));
|
||
//填充设备Map
|
||
connectDevieMap.insert(str2QByteArray(st_BLEDevice.deviceMac),st_BLEDevice.deviceNo);
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
|
||
void FesControlDialog::on_queryDevice_Btn_clicked()
|
||
{
|
||
queryDeviceState(1);
|
||
}
|
||
|
||
|
||
void FesControlDialog::on_flushSerial_Btn_clicked()
|
||
{
|
||
initSerialPort();
|
||
}
|
||
|
||
void FesControlDialog::slotConnectFes()
|
||
{
|
||
QMapIterator<int,bool> iter(AutoFESDeviceControlStateMap);
|
||
int times = 1;
|
||
while (iter.hasNext()) {
|
||
iter.next();
|
||
if(!iter.value())
|
||
{
|
||
++times;
|
||
int deviceNo = iter.key();
|
||
QTimer::singleShot(100*times,this,[=](){
|
||
connectDevice(AutoFESDeviceMap.value(deviceNo),deviceNo);
|
||
});
|
||
|
||
break;
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
void FesControlDialog::deviceStateChanged(uint8_t deviceNo, bool state)
|
||
{
|
||
qDebug()<<"设备状态发生变化"<<deviceNo<<state;
|
||
QList<uint8_t> deviceStateList;
|
||
for(int i = 0;i < 4;++i)
|
||
{
|
||
qDebug()<<i<<deviceDtateArray[i];
|
||
deviceStateList.append(deviceDtateArray[i]);
|
||
//如果不存在item,就移除item
|
||
}
|
||
|
||
emit signalDeviceStateChanged(deviceStateList);
|
||
|
||
}
|
||
|
||
|
||
void FesControlDialog::on_close_Btn_clicked()
|
||
{
|
||
this->close();
|
||
}
|
||
|
||
void FesControlDialog::paintEvent(QPaintEvent *event)
|
||
{
|
||
Q_UNUSED(event)
|
||
QPainter painter(this);
|
||
painter.fillRect(rect(),QColor(0,0,0,100));
|
||
}
|
||
|
||
void FesControlDialog::changeEvent(QEvent *event)
|
||
{
|
||
switch (event->type())
|
||
{
|
||
case QEvent::LanguageChange:
|
||
ui->retranslateUi(this);
|
||
break;
|
||
default:
|
||
QWidget::changeEvent(event);
|
||
break;
|
||
}
|
||
}
|