#include "gamedisplaypage.h" #include "ui_gamedisplaypage.h" #include "mainwindowpagecontrol.h" #include #include #include #include #include #include #include #include #include #include "currentuserdata.h" //#include "paramtipsdialog.h" #include "gamecontrol.h" #include "languagemanager.h" #include "icemodule.h" #include "fescontroldialog.h" #include "icemodule.h" #include "ccommunicateapi.h" #include "paramtipsdialog.h" #define SpeedMax 100 #define SleepTime 500 GameDisplayPage::GameDisplayPage(QWidget *parent) : QWidget(parent), ui(new Ui::GameDisplayPage), m_openState(true), upDirection(1), downDirection(1), m_spasmTipsDialog(NULL), heartTimer(NULL), countDownTimer(NULL), m_spasmTimes(0), m_currentMode(0), m_AP_mode(1),//默认为主动 m_reportDialog(NULL), m_quitDialog(NULL), m_emergencyDialog(NULL), heartCount(0), E_gameState(STOP), m_increasingSpeed(false), m_decreasingSpeed(false), m_decreasingForce(false), m_increasingForce(false), m_quitBySpeedDialog(NULL), gameState(0) { ui->setupUi(this); this->setWindowFlags(Qt::FramelessWindowHint); //设置无边框 setAttribute(Qt::WA_TranslucentBackground,true); //设置透明 initGameSocket(); m_leftAnimation = new QPropertyAnimation(ui->leftPage_GroupBox,"pos"); m_rightAnimation = new QPropertyAnimation(ui->rightPage_GroupBox,"pos"); m_leftAnimation->setDuration(1000); m_rightAnimation->setDuration(1000); QButtonGroup *upLimpGroup = new QButtonGroup(this); upLimpGroup->addButton(ui->forward_Btn); upLimpGroup->addButton(ui->backward_Btn); m_channelBList.append(ui->channelB1_Label); m_channelBList.append(ui->channelB2_Label); m_channelBList.append(ui->channelB3_Label); m_channelBList.append(ui->channelB4_Label); m_channelBList.append(ui->channelB5_Label); m_channelBList.append(ui->channelB6_Label); m_channelBList.append(ui->channelB7_Label); m_channelBList.append(ui->channelB8_Label); ui->stop_Btn->setVisible(false); ui->pause_Btn->setVisible(false); ui->signal_Label->setVisible(false); ui->signal_Label_2->setVisible(false); ui->wifiSignal_Label->move(1620,25); E_LANGUAGE language = LanguageManager::getInstance()->getCurrentLanguage(); if(language == English_E) ui->warnTips_Label->move(1000,20); else ui->warnTips_Label->move(1090,20); m_spasmTipsDialog = new SpasmTipsDialog(); m_emergencyDialog = new EmergencyStopDialog(); setTitle(); connect(IceModule::getInstance(),SIGNAL(signalSetFesAParam(int*,int)),this,SLOT(slotSetChannelAData(int*,int))); connect(IceModule::getInstance(),SIGNAL(signalSetFesBParam(int*,int)),this,SLOT(slotSetChannelBData(int*,int))); connect(IceModule::getInstance(),SIGNAL(signalSetBicycleParam(ST_BicycleParam)),this,SLOT(slotSetBicycleParam(ST_BicycleParam))); connect(CCommunicateAPI::getInstance(),SIGNAL(signalReadyRead(QByteArray)),this,SLOT(slotReceiveData(QByteArray))); heartTimer = new QTimer(); connect(heartTimer,SIGNAL(timeout()),this,SLOT(slotHeartTimer())); heartTimer->setInterval(1000); #ifdef HEARTBEAT heartTimer->start(); #endif #ifndef OXYGEN ui->heart_GroupBox->setVisible(false); #endif countDownTimer = new QTimer(); countDownTimer->setInterval(1000); connect(countDownTimer,SIGNAL(timeout()),this,SLOT(slotCountDownTimer())); paramPressTimer = new QTimer(); connect(paramPressTimer, &QTimer::timeout, this, &GameDisplayPage::pressedAdjustSpeed); paramPressForceTimer = new QTimer(); connect(paramPressForceTimer, &QTimer::timeout, this, &GameDisplayPage::pressAdjustForce); m_reportDialog = new TrainReport(); m_trainReportTwoTwo = new TrainReportTwoTwo(); m_trainReportTwoThree = new TrainReportTwoThree(); m_trainReportThreeTwo = new TrainReportThreeTwo(); m_quitDialog = new QuitGameDialog(); connect(ui->back1_Btn,SIGNAL(clicked()),this,SLOT(slotBackClicked())); connect(ui->back2_Btn,SIGNAL(clicked()),this,SLOT(slotBackClicked())); ui->warnTips_Label->setVisible(false); st_trainReport.passiveTime = 0; st_trainReport.activeTime = 0; ui->debug_GroupBox->setVisible(false); #ifdef NORMALEXE ui->groupBox_6->setVisible(false); #endif // ui->currentMode_label->setFont(QFont("黑体",8)); m_soundDialog = new SoundDialog(); m_quitBySpeedDialog = new QuitBySpeedDialog(); connect(m_quitBySpeedDialog,SIGNAL(signalClosed()),this,SLOT(slotSpeedDialogClosed())); // 游戏自运行测试 } GameDisplayPage::~GameDisplayPage() { if(m_leftAnimation) delete m_leftAnimation; if(m_rightAnimation) delete m_rightAnimation; if(heartTimer) delete heartTimer; if(countDownTimer) delete countDownTimer; if(m_reportDialog) delete m_reportDialog; if(m_quitDialog) delete m_quitDialog; if(m_emergencyDialog) delete m_emergencyDialog; if(m_trainReportTwoTwo) delete m_trainReportTwoTwo; if(m_trainReportThreeTwo) delete m_trainReportThreeTwo; if(m_trainReportTwoThree) delete m_trainReportTwoThree; if(m_gameSocket) delete m_gameSocket; if(m_soundDialog) { delete m_soundDialog; } if(m_quitBySpeedDialog) delete m_quitBySpeedDialog; if(paramPressTimer) delete paramPressTimer; if(paramPressForceTimer) delete paramPressForceTimer; delete ui; } void GameDisplayPage::initGameSocket() { m_gameSocket = new QUdpSocket(); int16_t port = 2100; if(m_gameSocket->bind(QHostAddress("127.0.0.1"),port)) { qDebug()<<(QString("游戏服务端口%1").arg(port)); } else { qDebug()<<(QString("游戏服务端口%1绑定失败").arg(port)); } connect(m_gameSocket,&QUdpSocket::readyRead,this,&GameDisplayPage::slotReceiveGameData); } void GameDisplayPage::setUser(const ST_PatientMsg &st_patientMsg) { ui->user_Btn->setText(st_patientMsg.name); } void GameDisplayPage::setTitle() { //设置title效果 ui->user_Btn->setIcon(QIcon(":/DependFile/Source/User/user1.png")); ui->user_Btn->setIconSize(QSize(40,40)); } void GameDisplayPage::setTrainPart(int type) { m_bodyPart = type; switch(type) { case 0: ui->upLimp_GroupBox->move(20,135); ui->heart_GroupBox->move(20,320); ui->upLimp_GroupBox->setVisible(true); ui->downLimp_GroupBox->setVisible(false); ui->title_Label->setText(tr("上肢训练")); break; case 1: ui->downLimp_GroupBox->move(20,135); ui->heart_GroupBox->move(20,320); ui->upLimp_GroupBox->setVisible(false); ui->downLimp_GroupBox->setVisible(true); ui->title_Label->setText(tr("下肢训练")); break; case 2: ui->upLimp_GroupBox->move(20,135); ui->downLimp_GroupBox->move(20,320); ui->heart_GroupBox->move(20,505); ui->upLimp_GroupBox->setVisible(true); ui->downLimp_GroupBox->setVisible(true); ui->title_Label->setText(tr("上下肢训练")); break; case 3: ui->upLimp_GroupBox->move(20,135); ui->heart_GroupBox->move(20,320); ui->upLimp_GroupBox->setVisible(true); ui->downLimp_GroupBox->setVisible(false); ui->title_Label->setText(tr("上肢训练")); break; } } //实时数据填充 void GameDisplayPage::setSlaveParam(ST_DeviceParam &st_deviceParam) { // qDebug()<<"hello"; ST_GameControlParam st_gameControlParam; //qDebug()<<"单车速度:"< SpeedMax) st_deviceParam.upLimpSpeed = SpeedMax; ui->upRealSpeed_Label->setText(QString::number(st_deviceParam.upLimpSpeed)); ui->upRealPower_Label->setText(QString::number(st_deviceParam.upPower)); m_currentSpeed = st_deviceParam.upLimpSpeed; if(m_st_bicycleParam.trainMode == 7 || m_st_bicycleParam.trainMode == 10) setActivePassiveSwitchMode(st_deviceParam.currentMode); //运动距离怎么计算 ui->length_Label->setText(QString::number(st_deviceParam.upLimpCircle*0.6,'f',1) + "m"); st_gameControlParam.speed = st_deviceParam.upLimpSpeed; st_gameControlParam.forceLeft = st_deviceParam.upBalance; st_gameControlParam.forceRight = 100 - st_deviceParam.upBalance; st_gameControlParam.angle = st_deviceParam.leftHandPosition; } break; case 1: //下肢 { if(st_deviceParam.downLimpSpeed > SpeedMax) st_deviceParam.downLimpSpeed = SpeedMax; ui->downRealSpeed_Label->setText(QString::number(st_deviceParam.downLimpSpeed)); m_currentSpeed = st_deviceParam.downLimpSpeed; // qDebug() <<"实时功率"<downRealPower_Label->setText(QString::number(st_deviceParam.downPower)); if(m_st_bicycleParam.trainMode == 7 || m_st_bicycleParam.trainMode == 10) setActivePassiveSwitchMode(st_deviceParam.currentMode); ui->length_Label->setText(QString::number(st_deviceParam.downLimpCircle*0.6,'f',1) + "m"); st_gameControlParam.speed = st_deviceParam.downLimpSpeed; st_gameControlParam.forceLeft = 100 - st_deviceParam.downBalance; st_gameControlParam.forceRight = st_deviceParam.downBalance; } break; case 2: //上下肢 { if(st_deviceParam.upLimpSpeed > SpeedMax) st_deviceParam.upLimpSpeed = SpeedMax; ui->upRealSpeed_Label->setText(QString::number(st_deviceParam.upLimpSpeed)); ui->upRealPower_Label->setText(QString::number(st_deviceParam.upPower)); if(st_deviceParam.downLimpSpeed > SpeedMax) st_deviceParam.downLimpSpeed = SpeedMax; m_currentSpeed = SpeedMax; if(m_spasmTipsDialog->isVisible()) { ui->downRealSpeed_Label->setText(QString::number(0)); ui->downRealPower_Label->setText(QString::number(0)); st_deviceParam.downLimpSpeed = 0; //gameState = 2; //不再接收游戏 } else { ui->downRealSpeed_Label->setText(QString::number(st_deviceParam.downLimpSpeed)); ui->downRealPower_Label->setText(QString::number(st_deviceParam.downPower)); //gameState = 1; //接收数据 } if(m_st_bicycleParam.trainMode == 7 || m_st_bicycleParam.trainMode == 10) setActivePassiveSwitchMode(st_deviceParam.currentMode); ui->length_Label->setText(QString::number(st_deviceParam.upLimpCircle*0.6,'f',1) + "m"); if(st_deviceParam.upLimpSpeed >= st_deviceParam.downLimpSpeed) { st_gameControlParam.forceLeft = st_deviceParam.upBalance; st_gameControlParam.forceRight = 100 - st_deviceParam.upBalance; } else { st_gameControlParam.forceLeft = 100 - st_deviceParam.downBalance; st_gameControlParam.forceRight = st_deviceParam.downBalance; } st_gameControlParam.speed = st_deviceParam.upLimpSpeed > st_deviceParam.downLimpSpeed?st_deviceParam.upLimpSpeed:st_deviceParam.downLimpSpeed; } break; case 3: //垂直上肢 { if(st_deviceParam.upLimpSpeed > SpeedMax) st_deviceParam.upLimpSpeed = SpeedMax; ui->upRealSpeed_Label->setText(QString::number(st_deviceParam.upLimpSpeed)); ui->upRealPower_Label->setText(QString::number(st_deviceParam.upPower)); m_currentSpeed = st_deviceParam.upLimpSpeed; if(m_st_bicycleParam.trainMode == 7 || m_st_bicycleParam.trainMode == 10) setActivePassiveSwitchMode(st_deviceParam.currentMode); //运动距离怎么计算 ui->length_Label->setText(QString::number(st_deviceParam.upLimpCircle*0.6,'f',1) + "m"); st_gameControlParam.speed = st_deviceParam.upLimpSpeed; st_gameControlParam.forceLeft = st_deviceParam.upBalance; st_gameControlParam.forceRight = 100 - st_deviceParam.upBalance; st_gameControlParam.angle = st_deviceParam.leftHandPosition; //qDebug()<<"左手位置:"<= 180) { st_deviceParam.leftHandPosition -= 180; } else { st_deviceParam.leftHandPosition = st_deviceParam.leftHandPosition + 180; } */ st_gameControlParam.angle = st_deviceParam.leftHandPosition; } break; } //设置当前模式 m_currentMode = st_deviceParam.currentMode; st_trainReport.upLimpLength = st_deviceParam.upLimpCircle*0.6; st_trainReport.downLimpLength = st_deviceParam.downLimpCircle*0.6; ui->leftHandAngle_label->setText(QString::number(st_deviceParam.leftHandPosition)); ui->leftFootAngle_label->setText(QString::number(st_deviceParam.leftFootPosition)); //此处显示的是左右平衡,但是下位机上传的是上下肢平衡 //qDebug() <<"st_gameControlParam.forceLeft"<< st_gameControlParam.forceLeft << gameState; if(!gameState) //游戏未开始,设置作用平衡为50 { st_gameControlParam.forceLeft = 50; st_gameControlParam.forceRight = 50; } if(m_bodyPart != 3 && gameState) //不是垂直上肢改变平衡度,同时游戏开始才改变平衡度 { ui->leftBalance_Label->setText(QString::number(st_gameControlParam.forceLeft) +"%"); ui->rightBalance_Label->setText(QString::number(st_gameControlParam.forceRight)+"%"); } //采集平衡数据 static int skipNum = 0; ++skipNum; if(skipNum > 20) { QPair balancePair; balancePair.first = st_deviceParam.upBalance; balancePair.second = st_deviceParam.downBalance; //左右平衡计数 balanceList.append(balancePair); //填充上肢或者下肢最大速度 int tempSpeed = qMax(st_deviceParam.upLimpSpeed,st_deviceParam.downLimpSpeed); speedList.append(tempSpeed); } #if 1 //触发急停(必须放在痉挛前,原因暂时未找到) if( 1 == st_deviceParam.emergencyState) { //痉挛设置速度为0; //st_deviceParam.downLimpSpeed = 0; //st_deviceParam.downPower = 0; IceModule::getInstance()->setEmergencyState(true); if(m_emergencyDialog->isVisible()) return; //训练界面未开始训练 if(m_st_bicycleParam.controlState == 0 ) { if(this->isVisible()) { //退出游戏 sendStopCmd(); //显示急停弹框 m_emergencyDialog->show(); //切到主界面,关闭当前页显示,关闭游戏container // emit signalGameStateChanged(0); } else { m_emergencyDialog->show(); } } //训练界面已开始训练 else { if(m_spasmTipsDialog->isVisible()) { m_spasmTipsDialog->stopPlayBell(); m_spasmTipsDialog->close(); } //退出游戏 sendStopCmd(); //显示急停弹框 m_emergencyDialog->show(); //关闭倒计时 countDownTimer->stop(); //切换界面 //emit signalGameStateChanged(0); st_trainReport.passiveTime = 0; st_trainReport.activeTime = 0; //切换为未训练状态 m_st_bicycleParam.controlState = 0; } } else { IceModule::getInstance()->setEmergencyState(false); if(m_emergencyDialog->isVisible()) { m_emergencyDialog->close(); } //非急停状态下发送数据驱动游戏 st_gameControlParam.speed *= 0.3; if(st_gameControlParam.speed < 1.1 && st_gameControlParam.speed > 0) st_gameControlParam.speed = 1.1; sendGameControlParam(st_gameControlParam); } #endif //触发痉挛 if(1 == st_deviceParam.spasmState ) { if(m_spasmTipsDialog->isVisible()) return; m_spasmTimes++; //痉挛次数用于报告 st_trainReport.spasmTimes = m_spasmTimes; switch(m_currentDirection) { case 0: //逆向 { m_spasmTipsDialog->setSpasmCompletedDirection(1), ui->direction_Label->setText(tr("正向")); } break; case 1: //正向 { m_spasmTipsDialog->setSpasmCompletedDirection(0), ui->direction_Label->setText(tr("逆向")); } break; } m_spasmTipsDialog->setSpasmDialogVisible(true,m_spasmTimes); if(m_currentDirection) m_currentDirection = 0; else m_currentDirection = 1; if(1 == m_currentDirection) { ui->forward_Btn->setChecked(true); ui->backward_Btn->setChecked(false); } //逆向 else if(0 == m_currentDirection) { ui->forward_Btn->setChecked(false); ui->backward_Btn->setChecked(true); } if(m_spasmTimes >= 3) { m_spasmTimes = 0; //大于3次痉挛退出训练 on_stop_Btn_clicked(); } } //FES踏车时 发送电刺激参数 if(IceModule::getInstance()->getGameType() == 2) { ST_FESRealTimeParam st_FesRealTimeParam; st_FesRealTimeParam.currentUpAngle = st_deviceParam.leftHandPosition; st_FesRealTimeParam.currentDownAngle = st_deviceParam.leftFootPosition; st_FesRealTimeParam.direction = st_deviceParam.direction; st_FesRealTimeParam.upSpeed = st_deviceParam.upLimpSpeed; st_FesRealTimeParam.downSpeed = st_deviceParam.downLimpSpeed; sendRealTimeFesParam(st_FesRealTimeParam); } } void GameDisplayPage::open_Btn_clicked() { m_leftAnimation->setStartValue(QPoint(-430,120)); m_leftAnimation->setEndValue(QPoint(0,120)); m_rightAnimation->setStartValue(QPoint(1920,120)); m_rightAnimation->setEndValue(QPoint(1490,120)); m_leftAnimation->start(QAbstractAnimation::KeepWhenStopped); m_rightAnimation->start(QAbstractAnimation::KeepWhenStopped); } void GameDisplayPage::close_Btn_clicked() { m_leftAnimation->setStartValue(QPoint(0,120)); m_leftAnimation->setEndValue(QPoint(-430,120)); m_rightAnimation->setStartValue(QPoint(1490,120)); m_rightAnimation->setEndValue(QPoint(1920,120)); m_leftAnimation->start(QAbstractAnimation::KeepWhenStopped); m_rightAnimation->start(QAbstractAnimation::KeepWhenStopped); } void GameDisplayPage::mouseDoubleClickEvent(QMouseEvent *event) { Q_UNUSED(event) if(event->pos().x() > 434 && event->pos().x() < 1482) { if(m_openState) close_Btn_clicked(); else open_Btn_clicked(); m_openState = !m_openState; } } void GameDisplayPage::on_upSpeedMinus_Btn_clicked() { int speed = ui->upSpeed_Label->text().toInt(); if(speed > 2) { --speed; ui->upSpeed_Label->setText(QString::number(speed)); setTrainSpeed(speed); m_st_bicycleParam.speed = speed; } } void GameDisplayPage::on_upSpeedPlus_Btn_clicked() { int speed = ui->upSpeed_Label->text().toInt(); if(speed < 55) { ++speed; if((E_gameState != START) && (speed > 30)) { ParamTipsDialog tipDialog; tipDialog.setParamTipsMsg(tr("设定速度已超30r/min,确认使用该速度训练吗?")); tipDialog.exec(); if(0 == tipDialog.getResult()) { ui->upSpeed_Label->setText("30"); return; } } ui->upSpeed_Label->setText(QString::number(speed)); setTrainSpeed(speed); m_st_bicycleParam.speed = speed; } } void GameDisplayPage::on_upForceMinus_Btn_clicked() { int force = ui->upForce_Label->text().toInt(); if(force > 1) { --force; ui->upForce_Label->setText(QString::number(force)); setTrainFore(force); m_st_bicycleParam.resistance = force; } } void GameDisplayPage::on_upForcePlus_Btn_clicked() { int force = ui->upForce_Label->text().toInt(); if(force < 20) { ++force; ui->upForce_Label->setText(QString::number(force)); setTrainFore(force); m_st_bicycleParam.resistance = force; } } void GameDisplayPage::slotSetChannelAData(int *data,int size) { if(size <= 8 ) for(int i = 0;i setText(QString::number(data[i])); } void GameDisplayPage::slotSetChannelBData(int *data,int size) { if(size <= 8 ) for(int i = 0;i setText(QString::number(data[i])); } /*******踏车设置参数,根据参数设置界面来填充数据*******/ void GameDisplayPage::slotSetBicycleParam(ST_BicycleParam st_setBicycleParam) { //设置初始方向 if(st_setBicycleParam.direction == 1) ui->direction_Label->setText(tr("正向")); else if(st_setBicycleParam.direction == 0) ui->direction_Label->setText(tr("逆向")); m_st_bicycleParam = st_setBicycleParam; m_startNum = m_st_bicycleParam.trainTime * 60; m_spasmTipsDialog->setSpasmCompletedDirection(st_setBicycleParam.spasmType); //训练模式 setTrainMode(m_st_bicycleParam.trainMode); //主被动模式按钮状态切换 switchButtonState(m_st_bicycleParam.trainMode); //设置训练部位 setTrainPart(st_setBicycleParam.bodyPart); //上肢+垂直下肢 if(0 == st_setBicycleParam.bodyPart || 3 == st_setBicycleParam.bodyPart|| 2 == st_setBicycleParam.bodyPart) { //主动训练速度设置成0 if(1 == m_st_bicycleParam.trainMode) st_setBicycleParam.speed = 0; ui->upSpeed_Label->setText(QString::number(st_setBicycleParam.speed)); ui->upForce_Label->setText(QString::number(st_setBicycleParam.resistance)); ui->upRemainTime_Label->setText(QString::number(m_st_bicycleParam.trainTime)); //正向 if(1 == st_setBicycleParam.direction) { ui->forward_Btn->setChecked(true); ui->backward_Btn->setChecked(false); } //逆向 else if(3 == st_setBicycleParam.direction) { ui->forward_Btn->setChecked(false); ui->backward_Btn->setChecked(true); } } //下肢 if(1 == st_setBicycleParam.bodyPart || 2 == st_setBicycleParam.bodyPart) { //主动训练速度设置成0 if(1 == m_st_bicycleParam.trainMode) st_setBicycleParam.speed = 0; ui->upSpeed_Label->setText(QString::number(st_setBicycleParam.speed)); ui->upForce_Label->setText(QString::number(st_setBicycleParam.resistance)); ui->downRemainTime_Label->setText(QString::number(m_st_bicycleParam.trainTime)); //正向 if(1 == st_setBicycleParam.direction) { ui->forward_Btn->setChecked(true); ui->backward_Btn->setChecked(false); } //逆向 else if(0 == st_setBicycleParam.direction) { ui->forward_Btn->setChecked(false); ui->backward_Btn->setChecked(true); } } //垂直上肢隐藏平衡 if(3 == st_setBicycleParam.bodyPart) { ui->leftBalance_Label->hide(); ui->leftBalanceText_Label->hide(); ui->rightBalance_Label->hide(); ui->rightBalanceText_Label->hide(); } else { ui->leftBalance_Label->show(); ui->leftBalanceText_Label->show(); ui->rightBalance_Label->show(); ui->rightBalanceText_Label->show(); } //获取当前方向 m_currentDirection = st_setBicycleParam.direction; st_patientMsg = CurrentUserData::getInstace()->getCurrentPatientMsg(); //填充报告内容 //患者基础信息 st_trainReport.ID = st_patientMsg.ID; st_trainReport.name = st_patientMsg.name; st_trainReport.sex = st_patientMsg.sex; st_trainReport.phone = st_patientMsg.phone; st_trainReport.age = st_patientMsg.age; st_trainReport.markMsg = st_patientMsg.markMsg; //训练设置参数 st_trainReport.trainMode = m_st_bicycleParam.trainMode; st_trainReport.bodyIndex = m_st_bicycleParam.bodyPart; st_trainReport.trainTime = m_st_bicycleParam.trainTime; //初始化平衡值 st_trainReport.leftBalance = 0; st_trainReport.rightBalance = 0; } void GameDisplayPage::getEmergecyState(ST_DeviceParam &st_deviceParam) { #if 1 //触发急停(必须放在痉挛前,原因暂时未找到) //qDebug() <<"急停状态:"<setEmergencyState(true); if(m_emergencyDialog->isVisible()) return; //训练界面未开始训练 if(m_st_bicycleParam.controlState == 0 ) { if(this->isVisible()) { //退出游戏 sendStopCmd(); //显示急停弹框 m_emergencyDialog->show(); //切到主界面,关闭当前页显示,关闭游戏container // emit signalGameStateChanged(0); qDebug() <<"---------------------------------------1"; } else { m_emergencyDialog->show(); qDebug() <<"---------------------------------------2"; } } //训练界面已开始训练 else { if(m_spasmTipsDialog->isVisible()) { m_spasmTipsDialog->stopPlayBell(); m_spasmTipsDialog->close(); qDebug() <<"---------------------------------------3"; } //退出游戏 sendStopCmd(); //显示急停弹框 m_emergencyDialog->show(); //关闭倒计时 countDownTimer->stop(); //切换界面 //emit signalGameStateChanged(0); st_trainReport.passiveTime = 0; st_trainReport.activeTime = 0; //切换为未训练状态 m_st_bicycleParam.controlState = 0; } } else { IceModule::getInstance()->setEmergencyState(false); if(m_emergencyDialog->isVisible()) { m_emergencyDialog->close(); qDebug() <<"---------------------------------------4"; } //非急停状态下发送数据驱动游戏 //st_gameControlParam.speed *= 0.3; //if(st_gameControlParam.speed < 1.1 && st_gameControlParam.speed > 0) // st_gameControlParam.speed = 1.1; //sendGameControlParam(st_gameControlParam); } #endif } //接收下位机数据 void GameDisplayPage::slotReceiveData(QByteArray array) { // qDebug() <<"收到:"<= 30) //接手的是非实时参数的数据 { //qDebug() <<"游戏、急停:" << gameState<< st_deviceParam.emergencyState; // qDebug() <<"急停状态:" << st_deviceParam.emergencyState; getEmergecyState(st_deviceParam); } int speed = st_deviceParam.downLimpSpeed >= st_deviceParam.upLimpSpeed ? st_deviceParam.downLimpSpeed:st_deviceParam.upLimpSpeed; static int overTimes = 0; //speed = 100; //速度提示 if(speed > 99) { overTimes++; if(overTimes > 40 && !m_quitBySpeedDialog->isVisible()) { m_quitBySpeedDialog->startTimer(); overTimes = 0; } } else { m_quitBySpeedDialog->stopTimer(); overTimes = 0; } } break; case RECE_HEARTBEAT_CMD: ++heartCount; // qDebug()<<"接收下位机心跳"; break; case GET_VERSION_CMD: //软件版本号 { QString version; version.append(array.mid(3,4)); IceModule::getInstance()->setVersion(version); } break; } } void GameDisplayPage::slotHeartTimer() { // qDebug()<<"上位机发送心跳"; CCommunicateAPI::getInstance()->sendHeartBeat(); static int num = 0; ++num; if(num > 3) { num = 0; QPixmap pixmap; if(heartCount < 1) { IceModule::getInstance()->setBicycleDeviceState(false); pixmap.load(":/DependFile/Source/signal/deviceDisconnected.png"); } else { IceModule::getInstance()->setBicycleDeviceState(true); pixmap.load(":/DependFile/Source/signal/deviceConnected.png"); } if(heartCount >= 3) { heartCount = 0; } ui->wifiSignal_Label->setPixmap(pixmap); } } void GameDisplayPage::slotCountDownTimer() { --m_startNum; if(m_startNum < 0) { countDownTimer->stop(); return; } int minNum = m_startNum/60;//分钟数 int secNum = m_startNum%60;//秒数 //训练时间计时 ++st_trainReport.trainTime; qDebug()<<"计时:"< ui->upSpeed_Label->text().toInt()) ++st_trainReport.activeTime; else st_trainReport.passiveTime++; }; break; case 9://单独主动 st_trainReport.passiveTime+=1; break; case 10://被动可切主动 st_trainReport.activeTime += 1; break; case 11: case 12: ++st_trainReport.passiveTime; ++st_trainReport.activeTime; break; } //填入阻力值 resistentList<upForce_Label->text().toInt(); if(minNum == 0 && secNum == 0) { m_startNum = 0; //关闭定时器 countDownTimer->stop(); ui->upRemainTime_Label->setText("0"); ui->downRemainTime_Label->setText("0"); //告知下位机停止训练 m_st_bicycleParam.controlState = 0; CCommunicateAPI::getInstance()->sendBicycleParam(m_st_bicycleParam); //弹出报告 //计算结果数据(平衡度、距离等) calculateResultData(); //弹出训练报告 m_reportDialog->setReportData(st_trainReport,1); //开窗 if(!m_openState) { open_Btn_clicked(); m_openState = !m_openState; } st_trainReport.passiveTime = 0; st_trainReport.activeTime = 0; st_trainReport.trainTime = 0; //停止游戏 sendStopCmd(); } else { ui->upRemainTime_Label->setText(QString::number(minNum+1)); ui->downRemainTime_Label->setText(QString::number(minNum+1)); } } void GameDisplayPage::slotStopTraining() { m_st_bicycleParam.controlState = 0; CCommunicateAPI::getInstance()->sendBicycleParam(m_st_bicycleParam); } void GameDisplayPage::slotReceiveGameData() { while(m_gameSocket->hasPendingDatagrams()) { QByteArray buf; buf.resize(m_gameSocket->pendingDatagramSize()); m_gameSocket->readDatagram(buf.data(),buf.size()); parseGameMsg(buf); } } void GameDisplayPage::slotBackClicked() { //首先停止运动 m_st_bicycleParam.controlState = 0; CCommunicateAPI::getInstance()->sendBicycleParam(m_st_bicycleParam); m_quitDialog->exec(); if(m_quitDialog->getResult() == 1) { //开窗 if(!m_openState) { open_Btn_clicked(); m_openState = !m_openState; } quitTrain(); //emit signalGameStateChanged(0); } else { if(E_gameState == PAUSE || E_gameState == STOP) return; m_st_bicycleParam.controlState = 1; CCommunicateAPI::getInstance()->sendBicycleParam(m_st_bicycleParam); } } void GameDisplayPage::quitTrain() { //关闭定时器 countDownTimer->stop(); //退出游戏 sendStopCmd(); } void GameDisplayPage::changeModeTips(QString str) { m_tipStr = str; ui->warnTips_Label->setVisible(true); if(m_switchTimes > 0 ) ui->warnTips_Label->setText(tr("模式切换中")); else ui->warnTips_Label->setText(tr("被动")); QTimer::singleShot(2500,this,[this](){ ui->warnTips_Label->setText(m_tipStr); }); //|| m_currentSpeed > ui->upSpeed_Label->text().toInt() //qDebug()<<"比较速度"<upSpeed_Label->text().toInt(); ++m_switchTimes; } void GameDisplayPage::switchButtonState(int8_t mode) { switch(mode) { case 0://被动不设置阻力 //上肢速度 setSpeedState(true); //上肢阻力 setForceState(false); setDirectionState(true); break; case 1://主动 //上肢速度 setSpeedState(false); if(m_st_bicycleParam.bodyPart == 3) setDirectionState(false); //垂直上至的主动模式 else setDirectionState(true); // qDebug() <<"主动、部位:1"<back1_Btn->setVisible(isShow); ui->back2_Btn->setVisible(isShow); } //发送实时电刺激相关参数 void GameDisplayPage::sendRealTimeFesParam(ST_FESRealTimeParam st_fesRealTimeParam) { for(int i = 0;i <= 4;++i) { //if(FesControlDialog::getInstance()->getDeviceStateByNo(i)) if(FesControlDialog::getInstance()->getMuscleDeviceStateByNo(i)) { FesControlDialog::getInstance()->setRealTimeParam(i,st_fesRealTimeParam); } } } void GameDisplayPage::testTipsDialog() { /* static int overTimes = 0; int speed = 100; //速度提示 if(speed > 99) { overTimes++; if(overTimes > 40 && !m_quitBySpeedDialog->isVisible()) { m_quitBySpeedDialog->startTimer(); overTimes = 0; } } else { m_quitBySpeedDialog->stopTimer(); overTimes = 0; } */ QByteArray data = QByteArray::fromHex("AB040107100001CD"); slotReceiveData(data); } //解析游戏数据 void GameDisplayPage::parseGameMsg(QByteArray jsonArray) { QJsonParseError jsonError; QJsonDocument doucment = QJsonDocument::fromJson(jsonArray, &jsonError); // 转化为 JSON 文档 if (!doucment.isNull() && (jsonError.error == QJsonParseError::NoError)) { if(doucment.isObject()) { QJsonObject object = doucment.object(); // 转化为对象 if(object.contains("MsgID")) { QString str = object.value("MsgID").toString(); int msgID = str.toInt(); switch(msgID) { case 3: //开始游戏 emit signalGameStateChanged(1); m_gameRebackState = 1; break; case 4: //退出游戏 { m_gameRebackState = 0; QTimer::singleShot(200,this,[this](){ emit signalGameStateChanged(0); }); } break; } } } } else qDebug()<<"jsonError.error"<getCurrentGameID(); object.insert("MsgID",st_gameControlParam.MsgId); object.insert("userName",st_gameControlParam.userName); object.insert("ID",st_gameControlParam.ID); object.insert("speed",st_gameControlParam.speed); if(tempGameID ==1 || tempGameID ==2) { object.insert("forceLeft",st_gameControlParam.forceLeft*0.7 >= 60 ? 60 : st_gameControlParam.forceLeft*0.7); object.insert("forceRight",st_gameControlParam.forceRight*0.7 >= 60 ? 60 : st_gameControlParam.forceRight*0.7); } else { object.insert("forceLeft",st_gameControlParam.forceLeft*0.7); object.insert("forceRight",st_gameControlParam.forceRight*0.7); } object.insert("steps",30); object.insert("calories",5); object.insert("angle",st_gameControlParam.angle); //左右平衡度数据,angle:1-359;可能跳变,333;停了一会; QJsonDocument document; document.setObject(object); QByteArray sendArray = document.toJson(QJsonDocument::Compact); QString ip("127.0.0.1"); int16_t port = 12000; m_gameSocket->writeDatagram(sendArray,QHostAddress(ip),port); } void GameDisplayPage::sendStopCmd() { QJsonObject object; object.insert("MsgID",2); object.insert("GameState",0); QJsonDocument document; document.setObject(object); QByteArray sendArray = document.toJson(QJsonDocument::Compact); QString ip("127.0.0.1"); int16_t port = 12000; m_gameSocket->writeDatagram(sendArray,QHostAddress(ip),port); QTimer::singleShot(100,this,[this](){ if(m_gameRebackState) { //再次发送关闭指令 qDebug()<<"再次发送关闭指令"; sendStopCmd(); } }); } //开始游戏 void GameDisplayPage::startGameCmd() { QJsonObject object; object.insert("MsgID",2); object.insert("GameState",1); QJsonDocument document; document.setObject(object); QByteArray sendArray = document.toJson(QJsonDocument::Compact); QString ip("127.0.0.1"); int16_t port = 12000; m_gameSocket->writeDatagram(sendArray,QHostAddress(ip),port); //test } //暂停游戏 void GameDisplayPage::pauseGameCmd() { QJsonObject object; object.insert("MsgID",2); object.insert("GameState",2); QJsonDocument document; document.setObject(object); QByteArray sendArray = document.toJson(QJsonDocument::Compact); QString ip("127.0.0.1"); int16_t port = 12000; m_gameSocket->writeDatagram(sendArray,QHostAddress(ip),port); } void GameDisplayPage::sendStopCmdThreeTimes() { sendStopCmd(); QTimer::singleShot(400,this,[this](){ sendStopCmd(); }); } void GameDisplayPage::calculateResultData() { //计算平衡度 int upBalance = 0,downBalance = 0; int upSum = 0,downSum = 0; for(int i = 0;i < balanceList.size();i++) { upSum += balanceList.at(i).first; downSum += balanceList.at(i).second; } upBalance = ((float)upSum)/balanceList.size(); downBalance = ((float)downSum)/balanceList.size(); //报告中的平衡度 switch(m_bodyPart) { case 0: //上肢 st_trainReport.leftBalance = upBalance; st_trainReport.rightBalance = 100 - upBalance; break; case 1: //下肢 st_trainReport.leftBalance = downBalance; st_trainReport.rightBalance = 100 - downBalance; break; case 2: //上下肢 st_trainReport.leftBalance = upBalance; st_trainReport.rightBalance = 100 - upBalance; break; case 3: //垂直上肢 st_trainReport.leftBalance = 50; st_trainReport.rightBalance = 50; break; } //计算阻力值 int maxResistent = 0,minResistent = 200,sumResistent = 0,aveResistent = 0; if(!resistentList.empty()) { for(int i = 0;i < resistentList.size();i++) { if(maxResistent < resistentList.at(i)) maxResistent = resistentList.at(i); if(minResistent > resistentList.at(i)) minResistent = resistentList.at(i); sumResistent += resistentList.at(i); } if(resistentList.size() > 0) aveResistent = sumResistent/resistentList.size(); st_trainReport.minResistance = minResistent; st_trainReport.maxResistance = maxResistent; st_trainReport.averangeResistance = aveResistent; } else { int tempResistance = ui->upForce_Label->text().toInt(); st_trainReport.minResistance = tempResistance; st_trainReport.maxResistance = tempResistance; st_trainReport.averangeResistance = tempResistance; } //计算速度 int maxSpeed = 0,sumSpeed = 0,aveSpeed = 0; if(!speedList.empty()) { for(int i = 0;i < speedList.size();i++) { if(maxSpeed < speedList.at(i)) maxSpeed = speedList.at(i); sumSpeed += speedList.at(i); } if(speedList.size() > 0) aveSpeed = sumSpeed/speedList.size(); // st_trainReport.minResistance = minResistent; st_trainReport.maxSpeed = maxSpeed; st_trainReport.averageSpeed = aveSpeed; } else { int tempSpeed = ui->upSpeed_Label->text().toInt(); //需要修改 st_trainReport.maxSpeed = tempSpeed; st_trainReport.averageSpeed = tempSpeed; } } void GameDisplayPage::initButton() { ui->stop_Btn->setVisible(false); ui->pause_Btn->setVisible(false); ui->start_Btn->setVisible(true); ui->length_Label->setText("0.00m"); qDebug()<<"0.0m"; ui->leftBalance_Label->setText("50%"); ui->rightBalance_Label->setText("50%"); } void GameDisplayPage::setTrainSpeed(int speed, qint8 type) { if(0 == type) CCommunicateAPI::getInstance()->sendRealTimeParam(PASSIVE_SPEED,speed); else if(1 == type) CCommunicateAPI::getInstance()->sendRealTimeParam(EQUAL_SPEED,speed); } void GameDisplayPage::setTrainFore(int force, qint8 type) { Q_UNUSED(type) CCommunicateAPI::getInstance()->sendRealTimeParam(RESISTANCE_CMD,force); } void GameDisplayPage::setTrainDirection(qint8 direction, qint8 type) { //direction 默认为1 Q_UNUSED(type) CCommunicateAPI::getInstance()->sendRealTimeParam(SWITCH_DIRECTION,direction); } void GameDisplayPage::switchFes(qint8 channel, bool ok) { Q_UNUSED(channel) Q_UNUSED(ok) } void GameDisplayPage::on_start_Btn_clicked() { for(int i=0 ;i<100; i++) { testTipsDialog(); } if(0 == gameState)/// { //训练起始时间 st_trainReport.startTimeStr = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"); st_trainReport.trainTime = 0; st_trainReport.activeTime = 0; st_trainReport.passiveTime = 0; } E_LANGUAGE language = LanguageManager::getInstance()->getCurrentLanguage(); if (language == Chinese_E) { GameControl::getInstance()->playTipMusic("./DependFile/Music/startTraining.mp3"); } else if (language == English_E) //初始化英文暂停和结束 { GameControl::getInstance()->playTipMusic("./DependFile/Music/startTraining_En.mp3"); } //已开始 gameState = 1; E_gameState = START;//// setbackBtVisible(false); ui->start_Btn->setVisible(false); ui->stop_Btn->setVisible(true); ui->pause_Btn->setVisible(true); //配置功率 m_st_bicycleParam.configPower = IceModule::getInstance()->getPower(); //告知下位机开始运动 if(m_st_bicycleParam.controlState == 2) m_st_bicycleParam.controlState = 3; else m_st_bicycleParam.controlState = 1; //if(m_st_bicycleParam.bodyPart == 3) // m_st_bicycleParam.bodyPart = 0; qDebug() <<"部位:"<< m_st_bicycleParam.bodyPart; CCommunicateAPI::getInstance()->sendBicycleParam(m_st_bicycleParam); //开始时间计时器 countDownTimer->start(); startGameCmd(); //停止游戏运动 /* ST_GameControlParam st_gameControlParam; st_gameControlParam.speed = 30; st_gameControlParam.forceLeft = 50; st_gameControlParam.forceRight = 50; bool increaseDir = true,decreaseDir=true,speedDir=true; for(int i=0; i<100000; i++) { Sleep(100); if(st_gameControlParam.angle >0 && speedDir) st_gameControlParam.angle += 3; else if(st_gameControlParam.angle < 180 && !speedDir) st_gameControlParam.angle -= 3; if(st_gameControlParam.angle == 0 || st_gameControlParam.angle == 180) speedDir = !speedDir; if(st_gameControlParam.forceRight >0 && increaseDir) st_gameControlParam.forceRight ++; else if(st_gameControlParam.forceRight < 180 && !increaseDir) st_gameControlParam.forceRight --; if(st_gameControlParam.forceRight == 0 || st_gameControlParam.forceRight == 180) increaseDir = !increaseDir; if(st_gameControlParam.forceLeft >0 && decreaseDir) st_gameControlParam.forceLeft ++; else if(st_gameControlParam.forceLeft < 180 && !decreaseDir) st_gameControlParam.forceLeft --; if(st_gameControlParam.forceLeft == 0 || st_gameControlParam.forceLeft == 180) decreaseDir = !decreaseDir; sendGameControlParam(st_gameControlParam); } */ } void GameDisplayPage::on_stop_Btn_clicked() { //更新玩游戏的三个处方参数 ST_TrainParam st_trainParam = GameControl::getInstance()->getTrainParam(); if(ui->direction_Label->text() == tr("正向")) st_trainParam.trainDirection = 1; else st_trainParam.trainDirection = 0; st_trainParam.trainSpeed = ui->upSpeed_Label->text().toInt(); st_trainParam.trainResistance = ui->upForce_Label->text().toInt(); GameControl::getInstance()->setTrainParam(st_trainParam); E_gameState = STOP; ui->start_Btn->setVisible(false); ui->stop_Btn->setVisible(false); ui->pause_Btn->setVisible(false); E_LANGUAGE language = LanguageManager::getInstance()->getCurrentLanguage(); if (language == Chinese_E) { GameControl::getInstance()->playTipMusic("./DependFile/Music/stopTraining.mp3"); } else if (language == English_E) //初始化英文暂停和结束 { GameControl::getInstance()->playTipMusic("./DependFile/Music/stopTraining_En.mp3"); } //告知下位机停止训练 m_st_bicycleParam.controlState = 0; CCommunicateAPI::getInstance()->sendBicycleParam(m_st_bicycleParam); //关闭定时器 countDownTimer->stop(); // sendStopCmd(); //停止游戏运动 ST_GameControlParam st_gameControlParam; st_gameControlParam.speed = 0; st_gameControlParam.forceLeft = 50; st_gameControlParam.forceRight = 50; sendGameControlParam(st_gameControlParam); //计算结果数据(平衡度、距离等) calculateResultData(); //弹出训练报告 int chooseReport = 0; //增加了垂直上肢等速、 if(st_trainReport.bodyIndex==3 && ( st_trainReport.trainMode==0 || st_trainReport.trainMode==3)) { chooseReport = 1; //2*2=原来:(垂直上肢的助力模式和被动模式),现在 (垂直上肢的助力模式、被动模式、等速) } else if(st_trainReport.bodyIndex==3 && (st_trainReport.trainMode==2 || st_trainReport.trainMode == 1 || st_trainReport.trainMode==10)) { chooseReport = 2; //3*2=原来:(垂直上肢的主动模式、等速模式和主被动),现在(垂直上肢的主动模式、主被动) } else if((st_trainReport.bodyIndex==0 || st_trainReport.bodyIndex== 2|| st_trainReport.bodyIndex==1) && (st_trainReport.trainMode==0 || st_trainReport.trainMode==4) || (st_trainReport.bodyIndex==0 ||st_trainReport.bodyIndex == 1) && st_trainReport.trainMode==3) { chooseReport = 3;//2*3=原来:(水平上肢、上下肢和下肢的被动和助力),现在:(水平上肢、上下肢和下肢的被动、水平上肢和下肢的等速模式),上下肢被动模式是4不是0 } //qDebug()<<"chooseReport:"<<"st_trainReport.bodyIndex:"<<"st_trainReport.trainMode:"<setReportData(st_trainReport,1); else if(chooseReport == 1) m_trainReportTwoTwo->setReportData(st_trainReport,1); else if(chooseReport == 2) m_trainReportThreeTwo->setReportData(st_trainReport,1); else if(chooseReport == 3) m_trainReportTwoThree->setReportData(st_trainReport,1); //开窗 if(!m_openState) { open_Btn_clicked(); m_openState = !m_openState; } st_trainReport.activeTime = 0; st_trainReport.passiveTime = 0; //退出游戏 sendStopCmd(); // Sleep(SleepTime); // emit signalGameStateChanged(0); //只修改页面索引,不发送槽函数 //MainWindowPageControl::getInstance()->setPageIndex(MainPage_E); } void GameDisplayPage::on_pause_Btn_clicked() { E_gameState = PAUSE; gameState = 2; //设置游戏状态为2,启动的时候再开启 E_LANGUAGE language = LanguageManager::getInstance()->getCurrentLanguage(); if (language == Chinese_E) { GameControl::getInstance()->playTipMusic("./DependFile/Music/pauseTraining.mp3"); } else if (language == English_E) //初始化英文暂停和结束 { GameControl::getInstance()->playTipMusic("./DependFile/Music/pauseTraining_En.mp3"); } pauseGameCmd(); //关闭定时器 countDownTimer->stop(); // **************一行代码; //qDebug()<<"暂停时间:"<sendBicycleParam(m_st_bicycleParam); ui->start_Btn->setVisible(true); ui->stop_Btn->setVisible(false); ui->pause_Btn->setVisible(false); ui->upRealPower_Label->setText("0"); ui->upRealSpeed_Label->setText("0"); ui->downRealPower_Label->setText("0"); ui->downRealSpeed_Label->setText("0"); /* if(m_st_bicycleParam.trainMode == 7 || m_st_bicycleParam.trainMode == 10) { ui->upCurrentStage_Label->setText(tr("主动模式")); //将当前模式切成主动 m_currentMode = 1; } */ } void GameDisplayPage::on_switchAFes_Btn_clicked() { QMessageBox::warning(NULL,tr("提示"),tr("未检测到电刺激设备")); return; } void GameDisplayPage::setTrainMode(int8_t mode) { QString modeName; switch(mode) { case 0: modeName = tr("被动"); break; case 1: modeName = tr("主动"); break; case 2: modeName = tr("助力"); break; case 3: modeName = tr("等速"); break; case 4: //四肢被动 modeName = tr("被动"); break; case 5: modeName = tr("上肢带下肢"); break; case 6: modeName = tr("下肢带上肢"); break; case 7: modeName = tr("主被动"); break; case 8: modeName = tr("FES"); break; case 9: modeName = tr("主动"); break; case 10: modeName = tr("主被动"); break; case 11: ui->upCurrentStage_Label->setText(tr("主动")); break; case 12: ui->upCurrentStage_Label->setText(tr("被动")); break; } ui->upCurrentStage_Label->setText(modeName); } //设置主被动切换的模式(实时填充) void GameDisplayPage::setActivePassiveSwitchMode(int8_t mode) { if(m_AP_mode == mode) return; if(m_AP_mode != mode) { QString modeName; switch(mode) { case 0: modeName = tr("被动"); break; case 1: modeName = tr("主动"); break; case 7: modeName = tr("主被动"); break; case 9: modeName = tr("主动"); break; case 10: modeName = tr("主被动"); break; case 11: //ui->upCurrentStage_Label->setText(tr("主动")); break; case 12: //ui->upCurrentStage_Label->setText(tr("被动")); break; } ui->warnTips_Label->setText(modeName); if(m_st_bicycleParam.trainMode == 7 || m_st_bicycleParam.trainMode == 10) { changeModeTips(modeName); } m_AP_mode = mode; } } //填充设置参数 void GameDisplayPage::fillSetParam(int updown,int speed,int resistance,int direction) { //上肢 upDirection = direction; if(upDirection == 1) on_forward_Btn_clicked(); else if(upDirection == 0) on_backward_Btn_clicked(); ui->upSpeed_Label->setText(QString::number(speed)); ui->upForce_Label->setText(QString::number(resistance)); } void GameDisplayPage::setPulseOxygen(const ST_PulseOxygen& pulseOxygen) { // ui->pulse_Label->setText(QString::number(pulseOxygen.pulse)); // ui->oxygen_Label->setText(QString::number(pulseOxygen.oxygen)); } void GameDisplayPage::setCenterParam(int left, int right, int length) { ui->leftBalance_Label->setText(QString::number(left) + "%"); ui->leftBalance_Label->setText(QString::number(right) + "%"); ui->leftBalance_Label->setText(QString::number(length) + "m"); } void GameDisplayPage::paintEvent(QPaintEvent *event) { Q_UNUSED(event) QPainter painter(this); painter.fillRect(rect(),QColor(0,0,0,10)); } void GameDisplayPage::showEvent(QShowEvent *event) { Q_UNUSED(event) initButton();//初始化 gameState = 0;//未开始 m_spasmTimes = 0; st_trainReport.spasmTimes = 0; st_trainReport.upLimpLength =0; st_trainReport.downLimpLength = 0; ui->upRealPower_Label->setText("0"); ui->upRealSpeed_Label->setText("0"); ui->downRealPower_Label->setText("0"); ui->downRealSpeed_Label->setText("0"); balanceList.clear(); resistentList.clear(); speedList.clear(); //清空 //设置当前用户 setUser(CurrentUserData::getInstace()->getCurrentPatientMsg()); setbackBtVisible(true); m_AP_mode = 1; ui->warnTips_Label->setVisible(false); E_gameState = STOP; m_switchTimes = 0; int8_t type = IceModule::getInstance()->getGameType(); switch (type) { case 1: //单独踏车 ui->groupBox_6->setVisible(false); break; case 2: //FES踏车 ui->groupBox_6->setVisible(true); break; } E_LANGUAGE language = LanguageManager::getInstance()->getCurrentLanguage(); if (language == English_E) //初始化英文暂停和结束 { ui->stop_Btn->setStyleSheet("border-image: url(:/DependFile/Source/gamePage/stop_E.png);"); ui->pause_Btn->setStyleSheet("border-image: url(:/DependFile/Source/gamePage/pause_E.png);"); ui->warnTips_Label->move(1290,20); ui->upCurrentStage_Label->setStyleSheet("color:white;width: 58px;height: 29px;font-size: 23px;font-weight: 500;color: #FFFFFF;line-height: 44px;"); ui->currentMode_label->setStyleSheet("color:white;width: 58px;height: 29px;font-size: 23px;font-weight: 500;color: #FFFFFF;line-height: 44px;"); } } void GameDisplayPage::on_forward_Btn_clicked() { /* setTrainDirection(1); m_st_bicycleParam.direction = 1; m_currentDirection = 1; */ if(m_currentDirection == 0) { setTrainDirection(1); m_st_bicycleParam.direction = 1; m_currentDirection = 1; ui->direction_Label->setText(tr("正向")); } else { setTrainDirection(0); m_st_bicycleParam.direction = 0; m_currentDirection = 0; ui->direction_Label->setText(tr("逆向")); } } void GameDisplayPage::on_backward_Btn_clicked() { /* setTrainDirection(0); m_st_bicycleParam.direction = 0; m_currentDirection = 0; */ if(m_currentDirection == 0) { setTrainDirection(1); m_st_bicycleParam.direction = 1; m_currentDirection = 1; ui->direction_Label->setText(tr("正向")); } else { setTrainDirection(0); m_st_bicycleParam.direction = 0; m_currentDirection = 0; ui->direction_Label->setText(tr("逆向")); } } void GameDisplayPage::on_switchFes_Btn_clicked() { QString fesA("border-image: url(:/DependFile/Source/gamePage/checkA.png);"); QString fesB("border-image: url(:/DependFile/Source/gamePage/checkB.png);"); // if(ui->switchFes_Btn->styleSheet() == fesA) // { // ui->switchFes_Btn->setStyleSheet(fesB); // } // else if(ui->switchFes_Btn->styleSheet() == fesB) // { // ui->switchFes_Btn->setStyleSheet(fesA); // } } void GameDisplayPage::changeEvent(QEvent* event) { switch (event->type()) { case QEvent::LanguageChange: { //qDebug() <<"改变语言"; E_LANGUAGE language = LanguageManager::getInstance()->getCurrentLanguage(); switch(language) { case Chinese_E: ui->stop_Btn->setStyleSheet("border-image: url(:/DependFile/Source/gamePage/stop.png);"); ui->pause_Btn->setStyleSheet("border-image: url(:/DependFile/Source/gamePage/pause.png);"); //调节样式 ui->currentMode_label->setStyleSheet("color:white;width: 58px;height: 29px;font-size: 29px;font-weight: 500;color: #FFFFFF;line-height: 44px;"); ui->upCurrentStage_Label->setStyleSheet("color:white;width: 58px;height: 29px;font-size: 29px;font-weight: 500;color: #FFFFFF;line-height: 44px;"); ui->upLimb_label->setFont(QFont("黑体",29)); ui->downLimb_label->setFont(QFont("黑体",29)); ui->directionText_label->setFont(QFont("黑体",29)); ui->speedText_label->setFont(QFont("黑体",29)); ui->resistText_label->setFont(QFont("黑体",29)); ui->directionText_label->move(110,10); ui->speedText_label->move(100,10); ui->resistText_label->move(100,10); ui->warnTips_Label->move(1090,20); //主被动模式下的主动和被动提示 break; case English_E: ui->stop_Btn->setStyleSheet("border-image: url(:/DependFile/Source/gamePage/stop_E.png);"); ui->pause_Btn->setStyleSheet("border-image: url(:/DependFile/Source/gamePage/pause_E.png);"); //调节样式 ui->currentMode_label->setStyleSheet("color:white;width: 58px;height: 29px;font-size: 23px;font-weight: 500;color: #FFFFFF;line-height: 44px;"); ui->upCurrentStage_Label->setStyleSheet("color:white;width: 58px;height: 29px;font-size: 23px;font-weight: 500;color: #FFFFFF;line-height: 44px;"); ui->upLimb_label->setFont(QFont("黑体",15)); ui->downLimb_label->setFont(QFont("黑体",15)); ui->directionText_label->setFont(QFont("黑体",15)); ui->speedText_label->setFont(QFont("黑体",15)); ui->resistText_label->setFont(QFont("黑体",15)); ui->directionText_label->move(108,10); ui->speedText_label->move(95,10); ui->resistText_label->move(105,10); ui->warnTips_Label->move(1290,20); break; } ui->retranslateUi(this); } break; default: QWidget::changeEvent(event); break; } } //设置速度使能状态 void GameDisplayPage::setSpeedState(bool enabled) { ui->upSpeedMinus_Btn->setEnabled(enabled); ui->upSpeedPlus_Btn->setEnabled(enabled); ui->speed_GroupBox->setEnabled(enabled); if(enabled) { ui->upSpeedMinus_Btn->setStyleSheet("border-image: url(:/DependFile/Source/gamePage/decreaseValue.png);"); ui->upSpeedPlus_Btn->setStyleSheet("border-image: url(:/DependFile/Source/gamePage/plusValue.png);"); ui->speed_GroupBox->setStyleSheet("#speed_GroupBox{border-image: url(:/DependFile/Source/gamePage/parameBackground.png);}"); } else { ui->upSpeedMinus_Btn->setStyleSheet("border-image: url(:/DependFile/Source/gamePage/valuePlusOffChange.png);"); ui->upSpeedPlus_Btn->setStyleSheet("border-image: url(:/DependFile/Source/gamePage/valueOffChange.png);"); ui->speed_GroupBox->setStyleSheet("#speed_GroupBox{border-image: url(:/DependFile/Source/gamePage/parameBackground.png);}"); } } //设置阻力使能状态 void GameDisplayPage::setDirectionState(bool enabled) { ui->forward_Btn->setEnabled(enabled); ui->backward_Btn->setEnabled(enabled); ui->groupBox_3->setEnabled(enabled); if(enabled) { ui->backward_Btn->setStyleSheet("border-image: url(:/DependFile/Source/gamePage/decreaseValue.png);"); ui->forward_Btn->setStyleSheet("border-image: url(:/DependFile/Source/gamePage/plusValue.png);"); ui->groupBox_3->setStyleSheet("#groupBox_3{border-image: url(:/DependFile/Source/gamePage/parameBackground.png);}"); } else { ui->backward_Btn->setStyleSheet("border-image: url(:/DependFile/Source/gamePage/valuePlusOffChange.png);"); ui->forward_Btn->setStyleSheet("border-image: url(:/DependFile/Source/gamePage/valueOffChange.png);"); ui->groupBox_3->setStyleSheet("#groupBox_3{border-image: url(:/DependFile/Source/gamePage/parameBackground.png);}"); } } //设置阻力使能状态 void GameDisplayPage::setForceState(bool enabled) { ui->upForceMinus_Btn->setEnabled(enabled); ui->upForcePlus_Btn->setEnabled(enabled); ui->force_GroupBox->setEnabled(enabled); if(enabled) { ui->upForceMinus_Btn->setStyleSheet("border-image: url(:/DependFile/Source/gamePage/decreaseValue.png);"); ui->upForcePlus_Btn->setStyleSheet("border-image: url(:/DependFile/Source/gamePage/plusValue.png);"); ui->force_GroupBox->setStyleSheet("#force_GroupBox{border-image: url(:/DependFile/Source/gamePage/parameBackground.png);}"); } else { ui->upForceMinus_Btn->setStyleSheet("border-image: url(:/DependFile/Source/gamePage/valuePlusOffChange.png);"); ui->upForcePlus_Btn->setStyleSheet("border-image: url(:/DependFile/Source/gamePage/valueOffChange.png);"); ui->force_GroupBox->setStyleSheet("#force_GroupBox{border-image: url(:/DependFile/Source/gamePage/parameBackground.png);}"); } } void GameDisplayPage::pressedAdjustSpeed() { int speed = ui->upSpeed_Label->text().toInt(); if(m_increasingSpeed && speed < 55) { ++speed; if((E_gameState != START) && (speed > 30)) { ParamTipsDialog tipDialog; tipDialog.setParamTipsMsg(tr("设定速度已超30r/min,确认使用该速度训练吗?")); tipDialog.exec(); if(0 == tipDialog.getResult()) { ui->upSpeed_Label->setText("30"); return; } } ui->upSpeed_Label->setText(QString::number(speed)); setTrainSpeed(speed); m_st_bicycleParam.speed = speed; } else if(m_decreasingSpeed && speed > 2) { --speed; ui->upSpeed_Label->setText(QString::number(speed)); setTrainSpeed(speed); m_st_bicycleParam.speed = speed; } if(!m_decreasingSpeed && !m_increasingSpeed) { paramPressTimer->stop(); } } void GameDisplayPage::pressAdjustForce() { int force = ui->upForce_Label->text().toInt(); if(m_increasingForce && force < 20) { ++force; ui->upForce_Label->setText(QString::number(force)); setTrainFore(force); m_st_bicycleParam.resistance = force; } else if(m_decreasingForce && force > 1) { --force; ui->upForce_Label->setText(QString::number(force)); setTrainFore(force); m_st_bicycleParam.resistance = force; } if(!m_decreasingForce && !m_increasingForce) { paramPressForceTimer->stop(); } } void GameDisplayPage::on_sound_Button_clicked() { m_soundDialog->show(); } void GameDisplayPage::on_upSpeedPlus_Btn_pressed() { paramPressTimer->start(200); m_increasingSpeed = true; } void GameDisplayPage::on_upSpeedMinus_Btn_pressed() { paramPressTimer->start(200); m_decreasingSpeed = true; } void GameDisplayPage::on_upSpeedPlus_Btn_released() { m_increasingSpeed = false; } void GameDisplayPage::on_upSpeedMinus_Btn_released() { m_decreasingSpeed = false; } void GameDisplayPage::on_upForcePlus_Btn_pressed() { m_increasingForce = true; paramPressForceTimer->start(200); } void GameDisplayPage::on_upForceMinus_Btn_pressed() { m_decreasingForce = true; paramPressForceTimer->start(200); } void GameDisplayPage::on_upForcePlus_Btn_released() { m_increasingForce = false; } void GameDisplayPage::on_upForceMinus_Btn_released() { m_decreasingForce = false; } void GameDisplayPage::slotSpeedDialogClosed() { on_stop_Btn_clicked(); //速到超过5s,终止训练 } void GameDisplayPage::slotSimulateData() { static int angle = 0; ST_GameControlParam st_gameControlParam; st_gameControlParam.speed = 10; st_gameControlParam.forceLeft = 50; st_gameControlParam.forceRight = 50; st_gameControlParam.angle = angle; sendGameControlParam(st_gameControlParam); angle++; if(angle >= 360) angle = 0; }