UpLowLimp/ZBD_IIIDL_S_Project/Src/GameControl/gamedisplaypage.cpp.bak
2024-11-25 17:15:44 +08:00

1299 lines
38 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "gamedisplaypage.h"
#include "ui_gamedisplaypage.h"
#include "mainwindowpagecontrol.h"
#include <QPropertyAnimation>
#include <QButtonGroup>
#include <QDebug>
#include <QPaintEvent>
#include <QPainter>
#include "icemodule.h"
#include "ccommunicateapi.h"
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonParseError>
#include "currentuserdata.h"
#include "paramtipsdialog.h"
#include "gamecontrol.h"
#include "languagemanager.h"
#include <QMessageBox>
#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_reportDialog(NULL),
m_quitDialog(NULL),
m_emergencyDialog(NULL),
heartCount(0),
E_gameState(STOP)
{
ui->setupUi(this);
this->setWindowFlags(Qt::FramelessWindowHint); //设置无边框
setAttribute(Qt::WA_TranslucentBackground,true); //设置透明
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);
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);
heartTimer->start();
#ifdef HEARTBEAT
heartTimer->start();
#endif
countDownTimer = new QTimer();
countDownTimer->setInterval(1000);
connect(countDownTimer,SIGNAL(timeout()),this,SLOT(slotCountDownTimer()));
initGameSocket();
m_reportDialog = new TrainReport();
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->groupBox_6->setVisible(false);
}
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;
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));
}
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;
}
}
//实时数据填充
void GameDisplayPage::setSlaveParam(ST_DeviceParam &st_deviceParam)
{
ST_GameControlParam st_gameControlParam;
switch(m_bodyPart)
{
case 0: //上肢
{
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));
setActivePassiveSwitchMode(st_deviceParam.currentMode);
//运动距离怎么计算
ui->length_Label->setText(QString::number(st_deviceParam.upLimpCircle*0.628,'f',2) + "m");
st_gameControlParam.speed = st_deviceParam.upLimpSpeed;
st_gameControlParam.forceLeft = st_deviceParam.upBalance;
st_gameControlParam.forceRight = 100 - st_deviceParam.upBalance;
}
break;
case 1: //下肢
{
if(st_deviceParam.downLimpSpeed > SpeedMax)
st_deviceParam.downLimpSpeed = SpeedMax;
ui->downRealSpeed_Label->setText(QString::number(st_deviceParam.downLimpSpeed));
ui->downRealPower_Label->setText(QString::number(st_deviceParam.downPower));
setActivePassiveSwitchMode(st_deviceParam.currentMode);
ui->length_Label->setText(QString::number(st_deviceParam.downLimpCircle*0.628,'f',2) + "m");
st_gameControlParam.speed = st_deviceParam.downLimpSpeed;
st_gameControlParam.forceLeft = st_deviceParam.downBalance;
st_gameControlParam.forceRight = 100 - 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;
ui->downRealSpeed_Label->setText(QString::number(st_deviceParam.downLimpSpeed));
ui->downRealPower_Label->setText(QString::number(st_deviceParam.downPower));
setActivePassiveSwitchMode(st_deviceParam.currentMode);
ui->length_Label->setText(QString::number(st_deviceParam.upLimpCircle*0.628,'f',2) + "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 = st_deviceParam.downBalance;
st_gameControlParam.forceRight = 100 - st_deviceParam.downBalance;
}
st_gameControlParam.speed = st_deviceParam.upLimpSpeed > st_deviceParam.downLimpSpeed?st_deviceParam.upLimpSpeed:st_deviceParam.downLimpSpeed;
}
break;
}
st_trainReport.upLimpLength = st_deviceParam.upLimpCircle*0.628;
st_trainReport.downLimpLength = st_deviceParam.downLimpCircle*0.628;
//此处显示的是左右平衡,但是下位机上传的是上下肢平衡
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<int,int> balancePair;
balancePair.first = st_deviceParam.upBalance;
balancePair.second = st_deviceParam.downBalance;
//左右平衡计数
balanceList.append(balancePair);
}
//触发急停(必须放在痉挛前,原因暂时未找到)
#if 1
if( 1 == st_deviceParam.emergencyState)
{
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);
break;
case 1: //正向
m_spasmTipsDialog->setSpasmCompletedDirection(0);
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();
}
}
}
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 < 60)
{
++speed;
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 <size;i++)
m_channelAList.at(i)->setText(QString::number(data[i]));
}
void GameDisplayPage::slotSetChannelBData(int *data,int size)
{
if(size <= 8 )
for(int i = 0;i <size;i++)
m_channelBList.at(i)->setText(QString::number(data[i]));
}
/*******踏车设置参数,根据参数设置界面来填充数据*******/
void GameDisplayPage::slotSetBicycleParam(ST_BicycleParam st_setBicycleParam)
{
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 || 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(0 == 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);
}
}
//获取当前方向
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::slotReceiveData(QByteArray array)
{
switch(array[2])
{
case BRFORE_START_CMD: //启动前
case AFTER_START_CMD: //启动后
{
ST_DeviceParam st_deviceParam;
memcpy(&st_deviceParam,array.data() + 3,sizeof(ST_DeviceParam));
setSlaveParam(st_deviceParam);
}
break;
case RECE_HEARTBEAT_CMD:
++heartCount;
break;
}
}
void GameDisplayPage::slotHeartTimer()
{
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;
//计算主被动时间
switch(m_currentMode)
{
case 0: //被动
++st_trainReport.passiveTime;
break;
case 1://主动
++st_trainReport.activeTime;
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<<ui->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)
{
ui->warnTips_Label->setVisible(true);
ui->warnTips_Label->setText(str);
//显示3s后隐藏
// QTimer::singleShot(3000,this,[this](){
// ui->warnTips_Label->setVisible(false);
// });
}
void GameDisplayPage::switchButtonState(int8_t mode)
{
switch(mode)
{
case 0://被动不设置阻力
//上肢速度
setSpeedState(true);
//上肢阻力
setForceState(false);
break;
case 1://主动
//上肢速度
setSpeedState(false);
//上肢阻力
setForceState(true);
break;
default:
setSpeedState(true);
setForceState(true);
break;
}
}
//解析游戏数据
void GameDisplayPage::parseGameMsg(QByteArray jsonArray)
{
qDebug()<<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);
break;
case 4: //退出游戏
{
QTimer::singleShot(200,this,[this](){
emit signalGameStateChanged(0);
});
}
break;
}
}
}
}
else
qDebug()<<"jsonError.error"<<jsonError.error;
}
void GameDisplayPage::sendGameControlParam(ST_GameControlParam st_gameControlParam)
{
st_gameControlParam.MsgId = 1;
QJsonObject object;
object.insert("MsgID",st_gameControlParam.MsgId);
object.insert("userName",st_gameControlParam.userName);
object.insert("ID",st_gameControlParam.ID);
object.insert("speed",st_gameControlParam.speed);
object.insert("forceLeft",st_gameControlParam.forceLeft*0.7);
object.insert("forceRight",st_gameControlParam.forceRight*0.7);
object.insert("steps",30);
object.insert("calories",5);
//左右平衡度数据
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);
}
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;
}
//计算阻力值
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;
}
void GameDisplayPage::initButton()
{
ui->stop_Btn->setVisible(false);
ui->pause_Btn->setVisible(false);
ui->start_Btn->setVisible(true);
ui->length_Label->setText("0.00m");
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()
{
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;
}
GameControl::getInstance()->playTipMusic("./DependFile/Music/startTraining.mp3");
//已开始
gameState = 1;
E_gameState = START;
ui->start_Btn->setVisible(false);
ui->stop_Btn->setVisible(true);
ui->pause_Btn->setVisible(true);
//告知下位机开始运动
if(m_st_bicycleParam.controlState == 2)
m_st_bicycleParam.controlState = 3;
else
m_st_bicycleParam.controlState = 1;
CCommunicateAPI::getInstance()->sendBicycleParam(m_st_bicycleParam);
//开始时间计时器
countDownTimer->start();
}
void GameDisplayPage::on_stop_Btn_clicked()
{
E_gameState = STOP;
ui->start_Btn->setVisible(false);
ui->stop_Btn->setVisible(false);
ui->pause_Btn->setVisible(false);
GameControl::getInstance()->playTipMusic("./DependFile/Music/stopTraining.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();
//弹出训练报告
m_reportDialog->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);
}
void GameDisplayPage::on_pause_Btn_clicked()
{
E_gameState = PAUSE;
GameControl::getInstance()->playTipMusic("./DependFile/Music/pauseTraining.mp3");
//关闭定时器
countDownTimer->stop();
m_st_bicycleParam.controlState = 2;
CCommunicateAPI::getInstance()->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;
if(ui->switchAFes_Btn->styleSheet() == "border-image: url(:/DependFile/Source/gamePage/switchOn.png);")
{
ui->switchAFes_Btn->setStyleSheet("border-image: url(:/DependFile/Source/gamePage/switchOff.png);");
}
else if(ui->switchAFes_Btn->styleSheet() == "border-image: url(:/DependFile/Source/gamePage/switchOff.png);")
{
ui->switchAFes_Btn->setStyleSheet("border-image: url(:/DependFile/Source/gamePage/switchOn.png);");
}
}
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_currentMode == mode)
return;
if(m_currentMode != 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);
if(m_st_bicycleParam.trainMode == 7 || m_st_bicycleParam.trainMode == 10)
{
changeModeTips(modeName);
}
m_currentMode = 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;
ui->upRealPower_Label->setText("0");
ui->upRealSpeed_Label->setText("0");
ui->downRealPower_Label->setText("0");
ui->downRealSpeed_Label->setText("0");
balanceList.clear();
resistentList.clear();
}
void GameDisplayPage::on_forward_Btn_clicked()
{
setTrainDirection(1);
m_st_bicycleParam.direction = 1;
}
void GameDisplayPage::on_backward_Btn_clicked()
{
setTrainDirection(0);
m_st_bicycleParam.direction = 0;
}
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:
{
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);");
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);");
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/minus1.png);");
ui->upSpeedPlus_Btn->setStyleSheet("border-image: url(:/DependFile/Source/gamePage/plus1.png);");
ui->speed_GroupBox->setStyleSheet("#speed_GroupBox{background: #FFFFFF;\nborder: 1px solid #05A6EC;}");
}
else
{
ui->upSpeedMinus_Btn->setStyleSheet("border-image: url(:/DependFile/Source/gamePage/minusDis.png);");
ui->upSpeedPlus_Btn->setStyleSheet("border-image: url(:/DependFile/Source/gamePage/plusDis.png);");
ui->speed_GroupBox->setStyleSheet("#speed_GroupBox{background: #ECECEC;\nborder: 1px solid #05A6EC;}");
}
}
//设置阻力使能状态
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/minus1.png);");
ui->upForcePlus_Btn->setStyleSheet("border-image: url(:/DependFile/Source/gamePage/plus1.png);");
ui->force_GroupBox->setStyleSheet("#force_GroupBox{background: #FFFFFF;\nborder: 1px solid #05A6EC;}");
}
else
{
ui->upForceMinus_Btn->setStyleSheet("border-image: url(:/DependFile/Source/gamePage/minusDis.png);");
ui->upForcePlus_Btn->setStyleSheet("border-image: url(:/DependFile/Source/gamePage/plusDis.png);");
ui->force_GroupBox->setStyleSheet("#force_GroupBox{background: #ECECEC;\nborder: 1px solid #05A6EC;}");
}
}