922 lines
28 KiB
C++
Raw Normal View History

2024-11-25 17:15:44 +08:00
#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,&current,sizeof(current));
QByteArray tempArray(2,0);
memcpy(tempArray.data(),&current,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(),&current,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;
}
}