#include "fescontroldialog.h" #include "ui_fescontroldialog.h" #include #include #include #include "bleitem.h" #include #include #include "dbforrmate.h" #include "cdatabaseinterface.h" #include #include "readconfig.h" #include #include #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(0); } int iSum=0; for(int i=startIndex;i<=endIndex;i++) { iSum+=srcArray[i]; } return static_cast(iSum%256); } QByteArray FesControlDialog::createFrame(QByteArray dataBuffer) { //创建数据包 QByteArray buffer; buffer.append(static_cast(FRAME_HEAD)); buffer.append(static_cast(dataBuffer.length())); for(int i=0;isetPortName(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()<<"单独电刺激,修改预设频率:"<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()<<"单独电刺激,修改预设频率:"<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() <<"发送数据:"<=1 && deviceNo <= 4 ) { if(checkedMuscle_DeviceArray[deviceNo-1]) return true; } return false; } void FesControlDialog::setMuscleDeviceStateByNo(uint8_t deviceNo, bool flag) { if(flag) { qDebug() <<"打开设备的肌肉:"<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所有数据:"<setDeviceState(false); break; case CMD_SEARCH_DEVICE_E: { qDebug()<<"搜索设备"; //qDebug()<setDeviceState(true); } break; case CMD_DEVICE_DISCONNECT_E: qDebug()<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()"<listWidget->count(); BLEItem *bleItem = new BLEItem(deviceNo-1); bleItem->setBLEName(deviceNo); //BLeItem和命名 qDebug()<<"ui->listWidget->count()2"<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(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() <<"设备列表:"<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():"<isOpen()) m_serialPort->write(array); //qDebug() <<"输出FES数据"<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 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 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 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()<<"设备状态发生变化"< deviceStateList; for(int i = 0;i < 4;++i) { qDebug()<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; } }