This commit is contained in:
curtis 2024-11-28 13:38:22 +08:00
parent 9b6889d259
commit 80bbc13c78
6 changed files with 174 additions and 140 deletions

View File

@ -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();
}
}

View File

@ -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);
}
}

View File

@ -4,6 +4,8 @@
#include <QObject>
#include <QProcess>
#include "QmlTcpSocket/TcpSocket.h"
#include "ccommunicateapi.h"
#include <QTimer>
class BCIManager : public QObject
{
@ -20,21 +22,40 @@ public:
static void registerQMLType()
{
qmlRegisterType<QMLTcpSockets::TcpSocket>("TcpSocket", 2, 0, "TcpSocket");
qmlRegisterType<BCIManager>("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

View File

@ -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();
}*/

View File

@ -5,7 +5,6 @@
#include <QTimer>
#include <QMessageBox>
#include <QDebug>
#include "ccommunicateapi.h"
#include <QQuickWidget>
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