diff --git a/ZBD_IIIDL_S_Project/DependFile/QML/Ssvep.qml b/ZBD_IIIDL_S_Project/DependFile/QML/Ssvep.qml index 1d93260..74c0311 100644 --- a/ZBD_IIIDL_S_Project/DependFile/QML/Ssvep.qml +++ b/ZBD_IIIDL_S_Project/DependFile/QML/Ssvep.qml @@ -1,10 +1,11 @@ import QtQuick 2.0 import TcpSocket 2.0 +import BCIManager 2.0 Item { property int hitIndex: -1 property bool bStimulate: false - property int responseTime: 10*1000 + property int responseTime: 10 property bool bTest: true property bool bConnect: false; @@ -25,7 +26,20 @@ Item { "qrc:/DependFile/Source/brainTrain/upTest/upper_stretch_R12.png", "qrc:/DependFile/Source/brainTrain/upTest/upper_stretch_R13.png", "qrc:/DependFile/Source/brainTrain/upTest/upper_stretch_R14.png", - "qrc:/DependFile/Source/brainTrain/upTest/upper_stretch_R15.png" + "qrc:/DependFile/Source/brainTrain/upTest/upper_stretch_R15.png", + "qrc:/DependFile/Source/brainTrain/upTest/upper_stretch_R14.png", + "qrc:/DependFile/Source/brainTrain/upTest/upper_stretch_R13.png", + "qrc:/DependFile/Source/brainTrain/upTest/upper_stretch_R12.png", + "qrc:/DependFile/Source/brainTrain/upTest/upper_stretch_R11.png", + "qrc:/DependFile/Source/brainTrain/upTest/upper_stretch_R10.png", + "qrc:/DependFile/Source/brainTrain/upTest/upper_stretch_R09.png", + "qrc:/DependFile/Source/brainTrain/upTest/upper_stretch_R08.png", + "qrc:/DependFile/Source/brainTrain/upTest/upper_stretch_R07.png", + "qrc:/DependFile/Source/brainTrain/upTest/upper_stretch_R06.png", + "qrc:/DependFile/Source/brainTrain/upTest/upper_stretch_R05.png", + "qrc:/DependFile/Source/brainTrain/upTest/upper_stretch_R04.png", + "qrc:/DependFile/Source/brainTrain/upTest/upper_stretch_R03.png", + "qrc:/DependFile/Source/brainTrain/upTest/upper_stretch_R02.png" ] property int currentIndexTwelevHz: 0 @@ -120,7 +134,7 @@ Item { Timer { id: hitTimer - interval: responseTime; + interval: responseTime*1000; repeat: false onTriggered: { clearHit(); @@ -142,14 +156,17 @@ Item { { ssvepTenHzTimer.start(); hitTimer.start(); + bci.startTrain(0,responseTime); }else if(index === "1") { ssvepTwelveHzTimer.start(); hitTimer.start(); + bci.startTrain(1,responseTime); }else if(index === "2") { ssvepFifteenHzTimer.start(); hitTimer.start(); + bci.startTrain(2,responseTime); }else { return; @@ -172,7 +189,6 @@ Item { } function onExit(){ - console.log("1222222222222222"); if(bConnect) { clientSocket.writeBytes(getIntArr("2")); @@ -187,7 +203,7 @@ Item { Component.onCompleted: { - //BCIManager.signalQmlStopLinkerPrograme.connect(onExit); + bci.initTrain(); } TcpSocket{ id: clientSocket @@ -228,6 +244,10 @@ Item { console.info("Client socket disconnected") } } + BCIManager + { + id:bci; + } Rectangle{ anchors.top: parent.top @@ -356,7 +376,7 @@ Item { anchors.bottom: parent.bottom Timer { id: ssvepTenHzTimer - interval: 300; + interval: 70; repeat: true onTriggered: { currentIndexTenHz = (currentIndexTenHz + 1) % imageFilesTenHz.length; @@ -726,7 +746,7 @@ Item { { anchors.fill: parent onClicked: { - ssvepHit(0); + ssvepHit("0"); stopStimulate(); } } @@ -764,7 +784,7 @@ Item { { anchors.fill: parent onClicked: { - ssvepHit(1); + ssvepHit("1"); stopStimulate(); } } @@ -802,7 +822,7 @@ Item { { anchors.fill: parent onClicked: { - ssvepHit(2); + ssvepHit("2"); stopStimulate(); } } diff --git a/ZBD_IIIDL_S_Project/Src/TrainManager/BCIManager.cpp b/ZBD_IIIDL_S_Project/Src/TrainManager/BCIManager.cpp index f98d38e..b767537 100644 --- a/ZBD_IIIDL_S_Project/Src/TrainManager/BCIManager.cpp +++ b/ZBD_IIIDL_S_Project/Src/TrainManager/BCIManager.cpp @@ -6,7 +6,23 @@ BCIManager::BCIManager(QObject *parent) : QObject{parent} { + heartTimer = new QTimer(); + heartTimer->setInterval(1000); + heartTimer->start(); + trainTimer = new QTimer(); + connect(heartTimer, SIGNAL(timeout()), this, SLOT(slotHeartTimer())); + connect(trainTimer, SIGNAL(timeout()), this, SLOT(slotTrainTimer())); + m_st_bicycleParam.trainMode = 0; //被动 + m_st_bicycleParam.spasmSwitch = 1; //开启 + m_st_bicycleParam.spasmLevel = 1; //默认一级 + m_st_bicycleParam.configPower = 0; //默认低 + m_st_bicycleParam.switchDirectonTime = 10; //换向时间默认10 + m_st_bicycleParam.phaseValue = 0; //协同相位值 + m_st_bicycleParam.direction = 1; //方向正向 + m_st_bicycleParam.speed = 10; //速度 10 + m_st_bicycleParam.resistance = 10; //阻力 Nm 0~20挡 + m_st_bicycleParam.spasmType = 0; //默认逆向 } @@ -51,6 +67,34 @@ bool BCIManager::startLinkerPrograme() m_pCmd->start(strCmd); } +void BCIManager::initTrain() +{ + if(nullptr == heartTimer) + { + heartTimer = new QTimer(); + heartTimer->setInterval(1000); + heartTimer->start(); + connect(heartTimer, SIGNAL(timeout()), this, SLOT(slotHeartTimer())); + } + + if(nullptr == trainTimer) + { + trainTimer = new QTimer(); + connect(trainTimer, SIGNAL(timeout()), this, SLOT(slotTrainTimer())); + + m_st_bicycleParam.trainMode = 0; //被动 + m_st_bicycleParam.spasmSwitch = 1; //开启 + m_st_bicycleParam.spasmLevel = 1; //默认一级 + m_st_bicycleParam.configPower = 0; //默认低 + m_st_bicycleParam.switchDirectonTime = 10; //换向时间默认10 + m_st_bicycleParam.phaseValue = 0; //协同相位值 + m_st_bicycleParam.direction = 1; //方向正向 + m_st_bicycleParam.speed = 10; //速度 10 + m_st_bicycleParam.resistance = 10; //阻力 Nm 0~20挡 + m_st_bicycleParam.spasmType = 0; //默认逆向 + } +} + void BCIManager::slotLinkerProgrameReadyReadStandardOutput() { if(m_pCmd) @@ -66,3 +110,82 @@ void BCIManager::slotLinkerProgrameReadyReadStandardError() qDebug() << m_pCmd->readAllStandardError(); } } + +void BCIManager::slotHeartTimer() +{ + //qDebug()<<"上位机发送心跳"; + CCommunicateAPI::getInstance()->sendHeartBeat(); + static int num = 0; + ++num; + if(num > 3) + { + num = 0; + QPixmap pixmap; + if(heartCount < 1) + { + + + } + else + { + + } + if(heartCount >= 3) + { + heartCount = 0; + } + + } +} + +void BCIManager::slotTrainTimer() +{ + stopTrain(); +} + +void BCIManager::startTrain(int Part, int Time) +{ + initTrain(); + if(trainTimer->isActive()) + { + stopTrain(); + } + trainTimer->setInterval(Time * 1000); + trainTimer->start(); + //状态控制 0-停止 1启动 2-暂停 3-继续 + m_st_bicycleParam.controlState = 1; + m_st_bicycleParam.bodyPart = Part; //训练部位 0-上肢 1-下肢 2-四肢 3-垂直上肢 + m_st_bicycleParam.trainTime = 120; + CCommunicateAPI::getInstance()->sendBicycleParam(m_st_bicycleParam); + +} +void BCIManager::stopTrain() +{ + if(trainTimer) + { + if(trainTimer->isActive()) + { + trainTimer->stop(); + } + m_st_bicycleParam.controlState = 0; + CCommunicateAPI::getInstance()->sendBicycleParam(m_st_bicycleParam); + } +} +void BCIManager::pauseTrain() +{ + if(trainTimer) + { + trainTimer->stop(); + m_st_bicycleParam.controlState = 2; + CCommunicateAPI::getInstance()->sendBicycleParam(m_st_bicycleParam); + } +} +void BCIManager::continueTrain() +{ + if(trainTimer) + { + trainTimer->start(); + m_st_bicycleParam.controlState = 3; + CCommunicateAPI::getInstance()->sendBicycleParam(m_st_bicycleParam); + } +} diff --git a/ZBD_IIIDL_S_Project/Src/TrainManager/BCIManager.h b/ZBD_IIIDL_S_Project/Src/TrainManager/BCIManager.h index c64266c..b5c751e 100644 --- a/ZBD_IIIDL_S_Project/Src/TrainManager/BCIManager.h +++ b/ZBD_IIIDL_S_Project/Src/TrainManager/BCIManager.h @@ -4,6 +4,8 @@ #include #include #include "QmlTcpSocket/TcpSocket.h" +#include "ccommunicateapi.h" +#include class BCIManager : public QObject { @@ -20,21 +22,40 @@ public: static void registerQMLType() { qmlRegisterType("TcpSocket", 2, 0, "TcpSocket"); + qmlRegisterType("BCIManager", 2, 0, "BCIManager"); } //启动Linker工具 bool startLinkerPrograme(); + + Q_INVOKABLE void initTrain(); + Q_INVOKABLE void startTrain(int Part, int Time); + Q_INVOKABLE void stopTrain(); + Q_INVOKABLE void pauseTrain(); + Q_INVOKABLE void continueTrain(); + private slots: //Linker程序的标准输出 void slotLinkerProgrameReadyReadStandardOutput(); //Linker程序的错误输出 void slotLinkerProgrameReadyReadStandardError(); + //下位机心跳包 + void slotHeartTimer(); + //下位机心训练计时停止 + void slotTrainTimer(); + signals: void signalQmlStopLinkerPrograme(); private: QProcess *m_pCmd = nullptr; + + QTimer *heartTimer = nullptr; + QTimer *trainTimer = nullptr; + + int heartCount = 0; //心跳次数,用于检测通信 + ST_BicycleParam m_st_bicycleParam; //启动参数 }; #endif // BCIMANAGER_H diff --git a/ZBD_IIIDL_S_Project/Src/TrainManager/eyetrainwidget.cpp b/ZBD_IIIDL_S_Project/Src/TrainManager/eyetrainwidget.cpp index 260fe03..0cbcd56 100644 --- a/ZBD_IIIDL_S_Project/Src/TrainManager/eyetrainwidget.cpp +++ b/ZBD_IIIDL_S_Project/Src/TrainManager/eyetrainwidget.cpp @@ -8,58 +8,15 @@ eyeTrainWidget::eyeTrainWidget(QWidget *parent) : ui(new Ui::eyeTrainWidget) { ui->setupUi(this); - heartTimer = new QTimer(); - heartTimer->setInterval(1000); - heartTimer->start(); - trainTimer = new QTimer(); - connect(heartTimer, SIGNAL(timeout()), this, SLOT(slotHeartTimer())); - connect(trainTimer, SIGNAL(timeout()), this, SLOT(slotTrainTimer())); - m_st_bicycleParam.trainMode = 0; //被动 - m_st_bicycleParam.spasmSwitch = 1; //开启 - m_st_bicycleParam.spasmLevel = 1; //默认一级 - m_st_bicycleParam.configPower = 0; //默认低 - m_st_bicycleParam.switchDirectonTime = 10; //换向时间默认10 - m_st_bicycleParam.phaseValue = 0; //协同相位值 - m_st_bicycleParam.direction = 1; //方向正向 - m_st_bicycleParam.speed = 10; //速度 10 - m_st_bicycleParam.resistance = 10; //阻力 Nm 0~20挡 - m_st_bicycleParam.spasmType = 0; //默认逆向 BCIManager::getInstance().startLinkerPrograme(); ui->quickWidget->setSource(QUrl("qrc:/DependFile/QML/Ssvep.qml")); -// int8_t controlState;//状态控制 0-停止 1启动 2-暂停 3-继续 -// int8_t bodyPart; //训练部位 0-上肢 1-下肢 2-四肢 3-垂直上肢 -// int8_t trainMode; //训练模式 0-被动 1-主动 2-助力 3-等速 4-上下肢协同被动 7-四肢主被动 9-单独主动 10-被动可切主动(主被动) -// int8_t spasmSwitch; //痉挛开关 0-关 1-开 -// int8_t spasmLevel; //痉挛等级1~3挡 -// int8_t configPower; //配置功率0~2 低中高 -// int8_t switchDirectonTime;//换向时间 -// int8_t phaseValue; //协同相位值 -// int8_t direction; //方向 0-逆向 1-正向 -// int8_t speed; //速度 2~60r/min -// int8_t resistance; //阻力 Nm 0~20挡 -// int8_t spasmType; //痉挛后方向 1-正向 0-逆向,默认逆向,没有了 -// uint8_t trainTime; //训练时间 0~120min - - } eyeTrainWidget::~eyeTrainWidget() { - - - if(heartTimer) - { - heartTimer->stop(); - delete heartTimer; - } - if(trainTimer) - { - trainTimer->stop(); - delete trainTimer; - } delete ui; QVariant retVal; QMetaObject::invokeMethod(ui->quickWidget->rootObject(), @@ -74,83 +31,10 @@ eyeTrainWidget::~eyeTrainWidget() } } -void eyeTrainWidget::startTrain(int8_t Part, int Time) -{ - // heartTimer->start(); - trainTimer->setInterval(Time*1000); - trainTimer->start(); - //状态控制 0-停止 1启动 2-暂停 3-继续 - m_st_bicycleParam.controlState = 1; - m_st_bicycleParam.bodyPart = Part; //训练部位 0-上肢 1-下肢 2-四肢 3-垂直上肢 - m_st_bicycleParam.trainTime = 120; - CCommunicateAPI::getInstance()->sendBicycleParam(m_st_bicycleParam); -} -void eyeTrainWidget::stopTrain() -{ - - heartTimer->stop(); - trainTimer->stop(); - - m_st_bicycleParam.controlState = 0; - CCommunicateAPI::getInstance()->sendBicycleParam(m_st_bicycleParam); - -} -void eyeTrainWidget::pauseTrain() -{ - trainTimer->stop(); - m_st_bicycleParam.controlState = 2; - CCommunicateAPI::getInstance()->sendBicycleParam(m_st_bicycleParam); -} -void eyeTrainWidget::continueTrain() -{ - trainTimer->start(); - m_st_bicycleParam.controlState = 3; - CCommunicateAPI::getInstance()->sendBicycleParam(m_st_bicycleParam); -} void eyeTrainWidget::slotQmlStatusChanged(QQuickWidget::Status emStatus) { - qDebug() << "3342" << emStatus; + qDebug() << "slotQmlStatusChanged" << emStatus; } -void eyeTrainWidget::slotHeartTimer() -{ - //qDebug()<<"上位机发送心跳"; - CCommunicateAPI::getInstance()->sendHeartBeat(); - static int num = 0; - ++num; - if(num > 3) - { - num = 0; - QPixmap pixmap; - if(heartCount < 1) - { - - } - else - { - - } - if(heartCount >= 3) - { - heartCount = 0; - } - - } -} -void eyeTrainWidget::slotTrainTimer() -{ - - trainTimer->stop(); - m_st_bicycleParam.controlState = 0; - CCommunicateAPI::getInstance()->sendBicycleParam(m_st_bicycleParam); -} -/*void eyeTrainWidget::on_startButton_clicked() -{ - startTrain(0, 10); -} -void eyeTrainWidget::on_closeButton_clicked() -{ - stopTrain(); -}*/ diff --git a/ZBD_IIIDL_S_Project/Src/TrainManager/eyetrainwidget.h b/ZBD_IIIDL_S_Project/Src/TrainManager/eyetrainwidget.h index ccff3da..8f83503 100644 --- a/ZBD_IIIDL_S_Project/Src/TrainManager/eyetrainwidget.h +++ b/ZBD_IIIDL_S_Project/Src/TrainManager/eyetrainwidget.h @@ -5,7 +5,6 @@ #include #include #include -#include "ccommunicateapi.h" #include namespace Ui { @@ -19,26 +18,13 @@ class eyeTrainWidget : public QWidget public: explicit eyeTrainWidget(QWidget *parent = nullptr); ~eyeTrainWidget(); - ST_BicycleParam m_st_bicycleParam; //启动参数 - void startTrain(int8_t Part, int Time); - void stopTrain(); - void pauseTrain(); - void continueTrain(); private slots: void slotQmlStatusChanged(QQuickWidget::Status emStatus); private: Ui::eyeTrainWidget *ui; - QTimer *heartTimer; - QTimer *trainTimer; - int heartCount; //心跳次数,用于检测通信 -private slots: - void slotHeartTimer(); - void slotTrainTimer(); - //void on_startButton_clicked(); - //void on_closeButton_clicked(); }; #endif // EYETRAINWIDGET_H diff --git a/ZBD_IIIDL_S_Project/release/UpLowLimp.exe b/ZBD_IIIDL_S_Project/release/UpLowLimp.exe index 47cac72..1da2133 100644 Binary files a/ZBD_IIIDL_S_Project/release/UpLowLimp.exe and b/ZBD_IIIDL_S_Project/release/UpLowLimp.exe differ