511 lines
14 KiB
C++
Raw Normal View History

2024-11-25 17:15:44 +08:00
#include "channeldialog.h"
#include "ui_channeldialog.h"
#include <QDebug>
#include <QPainter>
#include <QTimer>
#include <QMessageBox>
#include "fescontroldialog.h"
#include "icemodule.h"
#include <QDateTime>
ChannelDialog::ChannelDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::ChannelDialog),
m_buttonGroup(nullptr)
{
ui->setupUi(this);
this->setWindowFlags(Qt::FramelessWindowHint); //设置无边框
setAttribute(Qt::WA_TranslucentBackground,true); //设置透明
initWidget();
st_MuscleParam.connectState = true;
for(int i=0; i<8; i++)
maxCurrentData[i] = 0;
st_AnalogSetting.breakTime = 0;
st_AnalogSetting.fallingTime = 10;
st_AnalogSetting.holdingTime = 100;
st_AnalogSetting.risingTime = 10;
st_AnalogSetting.frequency = 50; //0~100Hz
st_AnalogSetting.pulseWidth = 100; //0~500us
st_AnalogSetting.samplerate = SamplingRate4K;
st_AnalogSetting.workmode = WorkModeStimulate;
//限制最大和最小电流滑块
QObject::connect(ui->minCurrent_Slider, &QSlider::valueChanged, [this](int value) {
if (value > ui->maxCurrent_Slider->value()) {
ui->minCurrent_Slider->setValue(ui->maxCurrent_Slider->value());
}
});
}
ChannelDialog::~ChannelDialog()
{
delete ui;
}
void ChannelDialog::initWidget()
{
//设置按钮互斥,配合样式表
m_buttonGroup = new QButtonGroup;
// m_buttonGroup->setExclusive(true);
m_buttonGroup->addButton(ui->gongErL_Btn,1);
m_buttonGroup->addButton(ui->gongSanL_Btn,2);
m_buttonGroup->addButton(ui->qianSanJiaoL_Btn,3);
m_buttonGroup->addButton(ui->houSanJiaoL_Btn,4);
m_buttonGroup->addButton(ui->quWanL_Btn,5);
m_buttonGroup->addButton(ui->shenWanL_Btn,6);
m_buttonGroup->addButton(ui->jianJiaL_Btn,7);
m_buttonGroup->addButton(ui->gangShangL_Btn,8);
m_buttonGroup->addButton(ui->guoShengL_Btn,9);
m_buttonGroup->addButton(ui->tunDaL_Btn,10);
m_buttonGroup->addButton(ui->jingQianL_Btn,11);
m_buttonGroup->addButton(ui->feiChangL_Btn,12);
m_buttonGroup->addButton(ui->fuJiL_Btn,13);
m_buttonGroup->addButton(ui->shuJiL_Btn,14);
m_buttonGroup->addButton(ui->guSiTouL_Btn,15);
m_buttonGroup->addButton(ui->gongErR_Btn,16);
m_buttonGroup->addButton(ui->gongSanR_Btn,17);
m_buttonGroup->addButton(ui->qianSanJiaoR_Btn,18);
m_buttonGroup->addButton(ui->houSanJiaoR_Btn,19);
m_buttonGroup->addButton(ui->quWanR_Btn,20);
m_buttonGroup->addButton(ui->shenWanR_Btn,21);
m_buttonGroup->addButton(ui->jianJiaR_Btn,22);
m_buttonGroup->addButton(ui->gangShangR_Btn,23);
m_buttonGroup->addButton(ui->guoShengR_Btn,24);
m_buttonGroup->addButton(ui->tunDaR_Btn,25);
m_buttonGroup->addButton(ui->jingQianR_Btn,26);
m_buttonGroup->addButton(ui->feiChangR_Btn,27);
m_buttonGroup->addButton(ui->fuJiR_Btn,28);
m_buttonGroup->addButton(ui->shuJiR_Btn,29);
m_buttonGroup->addButton(ui->guSiTouR_Btn,30);
foreach(QAbstractButton *button,m_buttonGroup->buttons())
button->setCheckable(true);
connect(m_buttonGroup,SIGNAL(buttonClicked(int)),this,SLOT(slotButtonClicked(int)));
connect(m_buttonGroup,SIGNAL(buttonClicked(QAbstractButton *)),this,SLOT(slotButtonClicked(QAbstractButton*)));
ui->maxCurrent_Slider->setRange(0,100);
}
void ChannelDialog::setTitle(int title)
{
QString strTitle;
switch(title)
{
case 1:
case 2:
strTitle = QString(tr("通道A%1").arg(title%2 ? 1:2));
break;
case 3:
case 4:
strTitle = QString(tr("通道B%1").arg(title%2 ? 1:2));
break;
case 5:
case 6:
strTitle = QString(tr("通道C%1").arg(title%2 ? 1:2));
break;
case 7:
case 8:
strTitle = QString(tr("通道D%1").arg(title%2 ? 1:2));
break;
}
ui->channelName_Label->setText(strTitle);
m_currentChannel = title;
m_deviceNo = m_currentChannel/2 + (m_currentChannel%2?1:0);
m_deviceChannel = m_currentChannel%2 ? 1:2;
/********电刺激操作流程*********/
}
ST_MuscleParam ChannelDialog::getValue()
{
return st_MuscleParam;
}
void ChannelDialog::on_confirm_Btn_clicked()
{
st_MuscleParam.plus = ui->plus_Label->text().toInt();
st_MuscleParam.minCurrent = ui->minCurrent_Label->text().toInt();
st_MuscleParam.frequency = ui->frequent_Label->text().toInt();
st_MuscleParam.maxCurrent = ui->maxCurrent_Label->text().toInt();
if(st_MuscleParam.muscleName == "")
{
QMessageBox::warning(NULL,"Warning",tr("未选择肌肉!"));
return;
}
//关闭预设电流开关
if(st_MuscleParam.connectState)
{
FesControlDialog::getInstance()->setPreCurrentState(m_deviceNo,m_deviceChannel,false);
int index = (m_deviceNo-1)*2 + m_deviceChannel-1;
maxCurrentData[index] = st_MuscleParam.maxCurrent;
qDebug() << "index:"<<index;
IceModule::getInstance()->setMaxCurrentValue(index,st_MuscleParam.maxCurrent);
}
FesControlDialog::getInstance()->setMuscleDeviceStateByNo(m_deviceNo,true);; //添加已经更改肌肉的设备
this->hide();
}
void ChannelDialog::slotButtonClicked(int id)
{
st_MuscleParam.muscleId = id;
}
void ChannelDialog::slotButtonClicked(QAbstractButton *button)
{
st_MuscleParam.muscleName = button->text();
ui->muscle_Label->setText(st_MuscleParam.muscleName);
QString muscleName = button->objectName();
int index = muscleName.indexOf("_");
QPixmap pixmap;
QString fileName("./DependFile/Image/leftMuscle/");
fileName.append(muscleName.leftRef(index-1));
fileName.append(".png");
pixmap.load(fileName );
ui->muscleImage_Label->setPixmap(pixmap);
}
void ChannelDialog::on_frequentMinus_Btn_clicked()
{
int value = ui->frequent_Slider->value();
--value;
ui->frequent_Slider->setValue(value);
//FesControlDialog::getInstance()->setPreFrequency(m_deviceNo,m_deviceChannel, value);
//FesControlDialog::getInstance()->setPreCurrentState(m_deviceNo,m_deviceChannel,true);
}
void ChannelDialog::on_frequentPlus_Btn_clicked()
{
int value = ui->frequent_Slider->value();
++value;
ui->frequent_Slider->setValue(value);
//FesControlDialog::getInstance()->setPreCurrentState(m_deviceNo,m_deviceChannel,true);
//FesControlDialog::getInstance()->setPreFrequency(m_deviceNo,m_deviceChannel, value);
}
//频率
void ChannelDialog::on_frequent_Slider_valueChanged(int value)
{
ui->frequent_Label->setText(QString::number(value));
st_AnalogSetting.frequency = value;
//qDebug() <<m_deviceNo << m_deviceChannel;
}
//脉宽
void ChannelDialog::on_plus_Slider_valueChanged(int value)
{
ui->plus_Label->setText(QString::number(value));
st_AnalogSetting.pulseWidth = value;
}
//最小电流
void ChannelDialog::on_minCurrent_Slider_valueChanged(int value)
{
ui->minCurrent_Label->setText(QString::number(value));
static int times = 0;
if(st_MuscleParam.connectState)
{
times++;
if(times > 20) //100ms
{
FesControlDialog::getInstance()->setPreCurrent(m_deviceNo,m_deviceChannel,value);
times = 0;
}
}
}
//最大电流
void ChannelDialog::on_maxCurrent_Slider_valueChanged(int value)
{
ui->maxCurrent_Label->setText(QString::number(value));
ui->minCurrent_Slider->setRange(0,99);
ui->minCurrent_Slider->setPageStep(value);
//ui->minCurrent_Slider->setMaximum(value);
static int times = 0;
if(st_MuscleParam.connectState)
{
times++;
if(times > 20) //100ms
{
FesControlDialog::getInstance()->setPreCurrent(m_deviceNo,m_deviceChannel,value);
times = 0;
}
}
}
void ChannelDialog::on_PWMMinus_Btn_clicked()
{
int value = ui->plus_Slider->value();
value -= 10;
ui->plus_Slider->setValue(value);
//FesControlDialog::getInstance()->setPrePulseWidth(m_deviceNo,m_deviceChannel,value);
}
void ChannelDialog::on_PWMPlus_Btn_clicked()
{
int value = ui->plus_Slider->value();
value += 10;
ui->plus_Slider->setValue(value);
//FesControlDialog::getInstance()->setPrePulseWidth(m_deviceNo,m_deviceChannel,value);
}
void ChannelDialog::on_minCurrentMinus_Btn_clicked()
{
int value = ui->minCurrent_Slider->value();
--value;
ui->minCurrent_Slider->setValue(value);
//测试使用2024.9.30
if(st_MuscleParam.connectState)
FesControlDialog::getInstance()->setPreCurrent(m_deviceNo,m_deviceChannel,value);
}
void ChannelDialog::on_minCurrentPlus_Btn_clicked()
{
int value = ui->minCurrent_Slider->value();
++value;
ui->minCurrent_Slider->setValue(value);
//测试使用2024.9.30
if(st_MuscleParam.connectState)
FesControlDialog::getInstance()->setPreCurrent(m_deviceNo,m_deviceChannel,value);
}
void ChannelDialog::on_maxCurrentMinus_Btn_clicked()
{
int value = ui->maxCurrent_Slider->value();
--value;
ui->maxCurrent_Slider->setValue(value);
//测试使用2024.9.30
if(st_MuscleParam.connectState)
FesControlDialog::getInstance()->setPreCurrent(m_deviceNo,m_deviceChannel,value);
}
void ChannelDialog::on_maxCurrentPlus_Btn_clicked()
{
int value = ui->maxCurrent_Slider->value();
++value;
ui->maxCurrent_Slider->setValue(value);
//测试使用2024.9.30
if(st_MuscleParam.connectState)
FesControlDialog::getInstance()->setPreCurrent(m_deviceNo,m_deviceChannel,value);
}
//通道开关
void ChannelDialog::on_switch_Btn_clicked()
{
if(ui->switch_Btn->styleSheet() == "border-image: url(:/DependFile/Source/gamePage/switchOn.png);")
{
ui->switch_Btn->setStyleSheet("border-image: url(:/DependFile/Source/gamePage/switchOff.png);");
st_MuscleParam.connectState = false;
//FesControlDialog::getInstance()->setPreCurrentState(,,false);
}
else if(ui->switch_Btn->styleSheet() == "border-image: url(:/DependFile/Source/gamePage/switchOff.png);")
{
st_MuscleParam.connectState = true;
ui->switch_Btn->setStyleSheet("border-image: url(:/DependFile/Source/gamePage/switchOn.png);");
}
}
void ChannelDialog::setMuscleState(QList<bool> muscleStateList)
{
//为了防止肌肉重复选择
// for(int i = 0;i < muscleStateList.size();i++)
// {
// if(muscleStateList.at(i))
// {
// m_buttonGroup->button(i+1)->setChecked(true);
// slotButtonClicked(i+1);
// slotButtonClicked(m_buttonGroup->button(i+1));
// break;
// }
// }
//已选择的肌肉设置为不可用
// foreach(QAbstractButton *button,m_buttonGroup->buttons())
// {
// QPushButton* pushButton = dynamic_cast<QPushButton*>(button);
// int id = m_buttonGroup->id(button);
// pushButton->setEnabled(muscleStateList.at(id-1));
// }
// for(int i = 0;i < m_buttonGroup->buttons().count();++i)
// {
// m_buttonGroup->buttons().at(i)->setEnabled(muscleStateList.at(i));
// }
}
void ChannelDialog::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event)
QPainter painter(this);
painter.fillRect(rect(),QColor(0,0,0,100));
}
void ChannelDialog::showEvent(QShowEvent *event)
{
Q_UNUSED(event)
ui->minCurrent_Slider->setRange(0,ui->maxCurrent_Slider->value());
ui->maxCurrent_Label->setText(QString::number(0));
//打开预设电流开关
if(st_MuscleParam.connectState)
FesControlDialog::getInstance()->setPreCurrentState(m_deviceNo,m_deviceChannel,true);
}
void ChannelDialog::changeEvent(QEvent* event)
{
Q_UNUSED(event)
#if 0
switch (event->type())
{
case QEvent::LanguageChange:
ui->retranslateUi(this);
QTimer::singleShot(300,this,[this](){
initWidget();
});
break;
default:
QWidget::changeEvent(event);
break;
}
#endif
}
void ChannelDialog::setFrequentRange(int min,int max)
{
ui->frequent_Slider->setRange(min,max);
}
void ChannelDialog::setPlusRange(int min,int max)
{
ui->plus_Slider->setRange(min,max);
}
void ChannelDialog::setMinCurrentRange(int min,int max)
{
ui->minCurrent_Slider->setRange(min,max);
ui->minCurrent_Label->setText("0");
}
void ChannelDialog::setMaxCurrentRange(int min,int max)
{
ui->maxCurrent_Slider->setRange(min,max);
ui->maxCurrent_Label->setText("0");
}
void ChannelDialog::setFrequentValue(int value)
{
ui->frequent_Slider->setValue(value);
}
void ChannelDialog::setPlusValue(int value)
{
ui->plus_Slider->setValue(value);
}
void ChannelDialog::setMinCurrentValue(int value)
{
ui->minCurrent_Slider->setValue(value);
ui->minCurrent_Label->setText(QString::number(value));
}
void ChannelDialog::setMaxCurrentValue(int value)
{
ui->maxCurrent_Slider->setValue(value);
}
void ChannelDialog::setMuscleId(int id)
{
if(id > 0 && id < 31)
{
m_buttonGroup->button(id)->setChecked(true);
m_buttonGroup->button(id)->click();
}
}
void ChannelDialog::setChannleDialogState(bool isRunning)
{
ui->groupBox->setEnabled(!isRunning);
ui->groupBox_3->setEnabled(!isRunning);
ui->groupBox_4->setEnabled(!isRunning);
ui->groupBox_5->setEnabled(!isRunning);
}
int *ChannelDialog::getMaxCurrentData()
{
return maxCurrentData;
}
void ChannelDialog::setMuscleConnectState(bool flag)
{
if(!flag)
{
ui->switch_Btn->setStyleSheet("border-image: url(:/DependFile/Source/gamePage/switchOff.png);");
st_MuscleParam.connectState = false;
//FesControlDialog::getInstance()->setPreCurrentState(,,false);
}
else if(flag)
{
st_MuscleParam.connectState = true;
ui->switch_Btn->setStyleSheet("border-image: url(:/DependFile/Source/gamePage/switchOn.png);");
}
}
void ChannelDialog::on_frequent_Slider_sliderReleased()
{
int value = ui->frequent_Label->text().toInt();
if(st_MuscleParam.connectState)
FesControlDialog::getInstance()->setPreFrequency(m_deviceNo,m_deviceChannel, value);
}
void ChannelDialog::on_plus_Slider_sliderReleased()
{
int value = ui->plus_Label->text().toInt();
if(st_MuscleParam.connectState)
FesControlDialog::getInstance()->setPrePulseWidth(m_deviceNo,m_deviceChannel,value);
}
void ChannelDialog::on_minCurrent_Slider_sliderReleased()
{
int value = ui->minCurrent_Label->text().toInt();
FesControlDialog::getInstance()->setPreCurrent(m_deviceNo,m_deviceChannel,value);
qDebug()<<"最小电流"<<value;
}
void ChannelDialog::on_maxCurrent_Slider_sliderReleased()
{
int value = ui->maxCurrent_Label->text().toInt();
FesControlDialog::getInstance()->setPreCurrent(m_deviceNo,m_deviceChannel,value);
qDebug()<<"最大电流"<<value;
}