重新绑定通道名称

This commit is contained in:
zhangsheng 2025-04-23 14:44:58 +08:00
parent 0da25401ac
commit 2c42a9eaa7
10 changed files with 303 additions and 281 deletions

View File

@ -66,6 +66,7 @@ void ConfigMgr::Save(QString & file_path) {
channel_item["sampling_rate"] = ptr->base_config_[cid].sampling_rate; channel_item["sampling_rate"] = ptr->base_config_[cid].sampling_rate;
channel_item["power"] = ptr->base_config_[cid].power; channel_item["power"] = ptr->base_config_[cid].power;
channel_item["point_name"] = ptr->base_config_[cid].point_name; channel_item["point_name"] = ptr->base_config_[cid].point_name;
channel_item["chan_id"] = ptr->base_config_[cid].chan_id;
QJsonArray voltage_range; QJsonArray voltage_range;
voltage_range.append(ptr->base_config_[cid].normal_voltage_low); voltage_range.append(ptr->base_config_[cid].normal_voltage_low);
voltage_range.append(ptr->base_config_[cid].normal_voltage_high); voltage_range.append(ptr->base_config_[cid].normal_voltage_high);
@ -395,6 +396,7 @@ void ConfigMgr::Load(QString filename) {
vib_data->base_config_[j].normal_voltage_high = voltage_range_array[1].toDouble(); vib_data->base_config_[j].normal_voltage_high = voltage_range_array[1].toDouble();
vib_data->base_config_[j].power = channel["power"].toBool(); vib_data->base_config_[j].power = channel["power"].toBool();
vib_data->base_config_[j].point_name = channel["point_name"].toString(); vib_data->base_config_[j].point_name = channel["point_name"].toString();
vib_data->base_config_[j].chan_id = channel["chan_id"].toString();
//setpoint //setpoint
QJsonObject setpoint_data = channel["setpoint"].toObject(); QJsonObject setpoint_data = channel["setpoint"].toObject();
vib_data->alert_danger[j].direct_upper = setpoint_data["direct_upper"].toDouble(); vib_data->alert_danger[j].direct_upper = setpoint_data["direct_upper"].toDouble();

View File

@ -105,6 +105,7 @@ typedef enum {
typedef struct { typedef struct {
int id; int id;
QString point_name; QString point_name;
QString chan_id;
bool standby; bool standby;
bool active; bool active;
int rack_type; // VibRackType int rack_type; // VibRackType

View File

@ -176,8 +176,8 @@ void MainWindow::createMenu(const QString &rootTitle, QPushButton *parent) {
// 创建第三层子菜单:/HAM824 单板卡、三冗余板卡 // 创建第三层子菜单:/HAM824 单板卡、三冗余板卡
QAction *proximitor_1 = proximitor_menu->addAction("/HAM824 单板卡"); QAction *proximitor_1 = proximitor_menu->addAction("/HAM824 单板卡");
proximitor_1->setData(kCardVibSingle); proximitor_1->setData(kCardVibSingle);
QAction *proximitor_2 = proximitor_menu->addAction("/HAM824 三冗余板卡"); //QAction *proximitor_2 = proximitor_menu->addAction("/HAM824 三冗余板卡");
proximitor_2->setData(kCardVibTMRPrimary); //proximitor_2->setData(kCardVibTMRPrimary);
QAction *rpm_1 = rpm_menu->addAction("/OPM844 单板卡"); QAction *rpm_1 = rpm_menu->addAction("/OPM844 单板卡");
rpm_1->setData(kCardSpeedSingle); rpm_1->setData(kCardSpeedSingle);
// 创建第二层子菜单:/KPM834 键相模块 // 创建第二层子菜单:/KPM834 键相模块
@ -213,7 +213,7 @@ void MainWindow::createMenu(const QString &rootTitle, QPushButton *parent) {
}); });
// 连接所有菜单项 // 连接所有菜单项
QObject::connect(proximitor_1, &QAction::triggered, this, &MainWindow::onMenuActionTriggered); QObject::connect(proximitor_1, &QAction::triggered, this, &MainWindow::onMenuActionTriggered);
QObject::connect(proximitor_2, &QAction::triggered, this, &MainWindow::onMenuActionTriggered); //QObject::connect(proximitor_2, &QAction::triggered, this, &MainWindow::onMenuActionTriggered);
QObject::connect(rpm_1, &QAction::triggered, this, &MainWindow::onMenuActionTriggered); QObject::connect(rpm_1, &QAction::triggered, this, &MainWindow::onMenuActionTriggered);
QObject::connect(relays_1, &QAction::triggered, this, &MainWindow::onMenuActionTriggered); QObject::connect(relays_1, &QAction::triggered, this, &MainWindow::onMenuActionTriggered);
QObject::connect(relays_2, &QAction::triggered, this, &MainWindow::onMenuActionTriggered); QObject::connect(relays_2, &QAction::triggered, this, &MainWindow::onMenuActionTriggered);
@ -566,6 +566,7 @@ void MainWindow::on_pushButton_save_clicked() {
return; return;
QString file_name = filepath + "\\tsi_config_file.json"; QString file_name = filepath + "\\tsi_config_file.json";
ConfigMgr::Instance()->Save(file_name); ConfigMgr::Instance()->Save(file_name);
return;
// 读取文件内容 // 读取文件内容
QFile file(file_name); QFile file(file_name);
if (!file.open(QIODevice::ReadOnly)) { if (!file.open(QIODevice::ReadOnly)) {

View File

@ -117,6 +117,7 @@ void Seismic_monitor::UpdateData(std::shared_ptr<VibrationData> vib_data) {
vib_data->base_config_[var].normal_voltage_low = ui->doubleSpinBox_low_1->value(); vib_data->base_config_[var].normal_voltage_low = ui->doubleSpinBox_low_1->value();
vib_data->base_config_[var].normal_voltage_high = ui->doubleSpinBox_high_1->value(); vib_data->base_config_[var].normal_voltage_high = ui->doubleSpinBox_high_1->value();
vib_data->base_config_[var].power = ui->checkBox_power_1->isChecked(); vib_data->base_config_[var].power = ui->checkBox_power_1->isChecked();
vib_data->base_config_[var].chan_id = QString("S%1C%2").arg(QString::number(slot_no, 10).rightJustified(2, '0')).arg(QString::number(var+1, 10).rightJustified(2, '0'));
} else if (var + 1 == 2) { } else if (var + 1 == 2) {
vib_data->base_config_[var].standby = ui->checkBox_standby_1->isChecked(); vib_data->base_config_[var].standby = ui->checkBox_standby_1->isChecked();
vib_data->base_config_[var].active = ui->checkBox_enable_2->isChecked(); vib_data->base_config_[var].active = ui->checkBox_enable_2->isChecked();
@ -128,6 +129,7 @@ void Seismic_monitor::UpdateData(std::shared_ptr<VibrationData> vib_data) {
vib_data->base_config_[var].normal_voltage_low = ui->doubleSpinBox_low_2->value(); vib_data->base_config_[var].normal_voltage_low = ui->doubleSpinBox_low_2->value();
vib_data->base_config_[var].normal_voltage_high = ui->doubleSpinBox_high_2->value(); vib_data->base_config_[var].normal_voltage_high = ui->doubleSpinBox_high_2->value();
vib_data->base_config_[var].power = ui->checkBox_power_2->isChecked(); vib_data->base_config_[var].power = ui->checkBox_power_2->isChecked();
vib_data->base_config_[var].chan_id = QString("S%1C%2").arg(QString::number(slot_no, 10).rightJustified(2, '0')).arg(QString::number(var+1, 10).rightJustified(2, '0'));
} else if (var + 1 == 3) { } else if (var + 1 == 3) {
vib_data->base_config_[var].standby = ui->checkBox_standby_2->isChecked(); vib_data->base_config_[var].standby = ui->checkBox_standby_2->isChecked();
vib_data->base_config_[var].active = ui->checkBox_enable_3->isChecked(); vib_data->base_config_[var].active = ui->checkBox_enable_3->isChecked();
@ -139,6 +141,7 @@ void Seismic_monitor::UpdateData(std::shared_ptr<VibrationData> vib_data) {
vib_data->base_config_[var].normal_voltage_low = ui->doubleSpinBox_low_3->value(); vib_data->base_config_[var].normal_voltage_low = ui->doubleSpinBox_low_3->value();
vib_data->base_config_[var].normal_voltage_high = ui->doubleSpinBox_high_3->value(); vib_data->base_config_[var].normal_voltage_high = ui->doubleSpinBox_high_3->value();
vib_data->base_config_[var].power = ui->checkBox_power_3->isChecked(); vib_data->base_config_[var].power = ui->checkBox_power_3->isChecked();
vib_data->base_config_[var].chan_id = QString("S%1C%2").arg(QString::number(slot_no, 10).rightJustified(2, '0')).arg(QString::number(var+1, 10).rightJustified(2, '0'));
} else if (var + 1 == 4) { } else if (var + 1 == 4) {
vib_data->base_config_[var].standby = ui->checkBox_standby_2->isChecked(); vib_data->base_config_[var].standby = ui->checkBox_standby_2->isChecked();
vib_data->base_config_[var].active = ui->checkBox_enable_4->isChecked(); vib_data->base_config_[var].active = ui->checkBox_enable_4->isChecked();
@ -150,6 +153,7 @@ void Seismic_monitor::UpdateData(std::shared_ptr<VibrationData> vib_data) {
vib_data->base_config_[var].normal_voltage_low = ui->doubleSpinBox_low_4->value(); vib_data->base_config_[var].normal_voltage_low = ui->doubleSpinBox_low_4->value();
vib_data->base_config_[var].normal_voltage_high = ui->doubleSpinBox_high_4->value(); vib_data->base_config_[var].normal_voltage_high = ui->doubleSpinBox_high_4->value();
vib_data->base_config_[var].power = ui->checkBox_power_4->isChecked(); vib_data->base_config_[var].power = ui->checkBox_power_4->isChecked();
vib_data->base_config_[var].chan_id = QString("S%1C%2").arg(QString::number(slot_no, 10).rightJustified(2, '0')).arg(QString::number(var+1, 10).rightJustified(2, '0'));
} }
} }
} }

View File

@ -56,11 +56,101 @@ void Setpoint::Init(){
switch (car_type) { switch (car_type) {
case kCardVibSingle:{ case kCardVibSingle:{
slider_direct->setRange(0,20);
slider_1x_ampl->setRange(0,20); slider_1x_ampl->setRange(0,20);
slider_2x_ampl->setRange(0,20); slider_2x_ampl->setRange(0,20);
update();
}break;
}
QObject::connect(ui->lineEdit_direct_upper, &QLineEdit::editingFinished, [&]() {
slider_direct->setUpperValue(ui->lineEdit_direct_upper->text().toFloat());
});
QObject::connect(slider_direct, &RangeSlider::rangeChanged, [&](float low,float high) {
ui->lineEdit_direct_upper->setText(QString::number(high));
});
QObject::connect(slider_1x_ampl, &RangeSlider::rangeChanged, [&](float low, float high) {
ui->lineEdit_1x_ampl_upper->setText(QString::number(high));
ui->lineEdit_1x_ampl_lower->setText(QString::number(low));
});
QObject::connect(ui->lineEdit_1x_ampl_upper, &QLineEdit::editingFinished, [&]() {
slider_1x_ampl->setUpperValue(ui->lineEdit_1x_ampl_upper->text().toFloat());
});
QObject::connect(ui->lineEdit_1x_ampl_lower, &QLineEdit::editingFinished, [&]() {
slider_1x_ampl->setLowerValue(ui->lineEdit_1x_ampl_lower->text().toFloat());
});
QObject::connect(slider_2x_ampl, &RangeSlider::rangeChanged, [&](float low, float high) {
ui->lineEdit_2x_ampl_upper->setText(QString::number(high));
ui->lineEdit_2x_ampl_lower->setText(QString::number(low));
});
QObject::connect(ui->lineEdit_2x_ampl_upper, &QLineEdit::editingFinished, [&]() {
slider_1x_ampl->setUpperValue(ui->lineEdit_2x_ampl_upper->text().toFloat());
});
QObject::connect(ui->lineEdit_2x_ampl_lower, &QLineEdit::editingFinished, [&]() {
slider_1x_ampl->setLowerValue(ui->lineEdit_2x_ampl_lower->text().toFloat());
});
QObject::connect(slider_danger, &RangeSlider::rangeChanged, [&](float low,float high) {
ui->lineEdit_danger_upper->setText(QString::number(high));
});
QObject::connect(ui->lineEdit_danger_upper, &QLineEdit::editingFinished, [&]() {
slider_danger->setUpperValue(ui->lineEdit_danger_upper->text().toFloat());
});
}
void Setpoint::on_pushButton_confirm_clicked()
{
if (vib_alert_ptr == nullptr) {
qCritical() << "[Setpoint::confirm] should not be here";
return;
}
vib_alert_ptr->alert_danger[current_index].direct_upper = ui->lineEdit_direct_upper->text().toFloat();
vib_alert_ptr->alert_danger[current_index].direct_enable = ui->checkBox_direct->checkState();
vib_alert_ptr->alert_danger[current_index].x1_ampl_upper = ui->lineEdit_1x_ampl_upper->text().toFloat();
vib_alert_ptr->alert_danger[current_index].x1_ampl_lower = ui->lineEdit_1x_ampl_lower->text().toFloat();
vib_alert_ptr->alert_danger[current_index].x1_ampl_enable = ui->checkBox_1x_ampl->checkState();
vib_alert_ptr->alert_danger[current_index].x2_ampl_upper = ui->lineEdit_2x_ampl_upper->text().toFloat();
vib_alert_ptr->alert_danger[current_index].x2_ampl_lower = ui->lineEdit_2x_ampl_lower->text().toFloat();
vib_alert_ptr->alert_danger[current_index].x2_ampl_enable = ui->checkBox_2x_ampl->checkState();
vib_alert_ptr->alert_danger[current_index].danger_param = ui->comboBox_danger->currentIndex();
vib_alert_ptr->alert_danger[current_index].danger_upper = ui->lineEdit_danger_upper->text().toFloat();
vib_alert_ptr->alert_danger[current_index].danger_enable = ui->checkBox_danger->checkState();
this->close();
}
void Setpoint::on_pushButton_cancel_clicked()
{
this->close();
}
void Setpoint::on_pushButton_set_default_clicked()
{
}
void Setpoint::onComboBoxIndexChanged(int index){
vib_alert_ptr->alert_danger[current_index].direct_upper = ui->lineEdit_direct_upper->text().toFloat();
vib_alert_ptr->alert_danger[current_index].direct_enable = ui->checkBox_direct->checkState();
vib_alert_ptr->alert_danger[current_index].x1_ampl_upper = ui->lineEdit_1x_ampl_upper->text().toFloat();
vib_alert_ptr->alert_danger[current_index].x1_ampl_lower = ui->lineEdit_1x_ampl_lower->text().toFloat();
vib_alert_ptr->alert_danger[current_index].x1_ampl_enable = ui->checkBox_1x_ampl->checkState();
vib_alert_ptr->alert_danger[current_index].x2_ampl_upper = ui->lineEdit_2x_ampl_upper->text().toFloat();
vib_alert_ptr->alert_danger[current_index].x2_ampl_lower = ui->lineEdit_2x_ampl_lower->text().toFloat();
vib_alert_ptr->alert_danger[current_index].x2_ampl_enable = ui->checkBox_2x_ampl->checkState();
vib_alert_ptr->alert_danger[current_index].danger_param = ui->comboBox_danger->currentIndex();
vib_alert_ptr->alert_danger[current_index].danger_upper = ui->lineEdit_danger_upper->text().toFloat();
vib_alert_ptr->alert_danger[current_index].danger_enable = ui->checkBox_danger->checkState();
current_index = index;
update();
}
void Setpoint::update()
{
int chan = ui->comboBox_chan->currentIndex(); int chan = ui->comboBox_chan->currentIndex();
std::shared_ptr<CardBase> base_ptr = ConfigMgr::Instance()->GetSlotPtr(slot_no);
std::shared_ptr<VibrationData> setpoint_data = std::dynamic_pointer_cast<VibrationData>(base_ptr); std::shared_ptr<VibrationData> setpoint_data = std::dynamic_pointer_cast<VibrationData>(base_ptr);
std::vector<std::shared_ptr<VariableBase>> variable_ = setpoint_data->variables_; std::vector<std::shared_ptr<VariableBase>> variable_ = setpoint_data->variables_;
if(setpoint_data->base_config_[chan].channel_type == kVibRadial){ if(setpoint_data->base_config_[chan].channel_type == kVibRadial){
@ -235,115 +325,4 @@ void Setpoint::Init(){
slider_danger->m_upper = setpoint_data->alert_danger[chan].danger_upper; slider_danger->m_upper = setpoint_data->alert_danger[chan].danger_upper;
slider_danger->m_lower = 0; slider_danger->m_lower = 0;
} }
}break;
}
QObject::connect(ui->lineEdit_direct_upper, &QLineEdit::editingFinished, [&]() {
slider_direct->setUpperValue(ui->lineEdit_direct_upper->text().toFloat());
});
QObject::connect(slider_direct, &RangeSlider::rangeChanged, [&](float low,float high) {
ui->lineEdit_direct_upper->setText(QString::number(high));
});
QObject::connect(slider_1x_ampl, &RangeSlider::rangeChanged, [&](float low, float high) {
ui->lineEdit_1x_ampl_upper->setText(QString::number(high));
ui->lineEdit_1x_ampl_lower->setText(QString::number(low));
});
QObject::connect(ui->lineEdit_1x_ampl_upper, &QLineEdit::editingFinished, [&]() {
slider_1x_ampl->setUpperValue(ui->lineEdit_1x_ampl_upper->text().toFloat());
});
QObject::connect(ui->lineEdit_1x_ampl_lower, &QLineEdit::editingFinished, [&]() {
slider_1x_ampl->setLowerValue(ui->lineEdit_1x_ampl_lower->text().toFloat());
});
QObject::connect(slider_2x_ampl, &RangeSlider::rangeChanged, [&](float low, float high) {
ui->lineEdit_2x_ampl_upper->setText(QString::number(high));
ui->lineEdit_2x_ampl_lower->setText(QString::number(low));
});
QObject::connect(ui->lineEdit_2x_ampl_upper, &QLineEdit::editingFinished, [&]() {
slider_1x_ampl->setUpperValue(ui->lineEdit_2x_ampl_upper->text().toFloat());
});
QObject::connect(ui->lineEdit_2x_ampl_lower, &QLineEdit::editingFinished, [&]() {
slider_1x_ampl->setLowerValue(ui->lineEdit_2x_ampl_lower->text().toFloat());
});
QObject::connect(slider_danger, &RangeSlider::rangeChanged, [&](float low,float high) {
ui->lineEdit_danger_upper->setText(QString::number(high));
});
QObject::connect(ui->lineEdit_danger_upper, &QLineEdit::editingFinished, [&]() {
slider_danger->setUpperValue(ui->lineEdit_danger_upper->text().toFloat());
});
} }
void Setpoint::on_pushButton_confirm_clicked()
{
if (vib_alert_ptr == nullptr) {
qCritical() << "[Setpoint::confirm] should not be here";
return;
}
vib_alert_ptr->alert_danger[current_index].direct_upper = ui->lineEdit_direct_upper->text().toFloat();
vib_alert_ptr->alert_danger[current_index].direct_enable = ui->checkBox_direct->checkState();
vib_alert_ptr->alert_danger[current_index].x1_ampl_upper = ui->lineEdit_1x_ampl_upper->text().toFloat();
vib_alert_ptr->alert_danger[current_index].x1_ampl_lower = ui->lineEdit_1x_ampl_lower->text().toFloat();
vib_alert_ptr->alert_danger[current_index].x1_ampl_enable = ui->checkBox_1x_ampl->checkState();
vib_alert_ptr->alert_danger[current_index].x2_ampl_upper = ui->lineEdit_2x_ampl_upper->text().toFloat();
vib_alert_ptr->alert_danger[current_index].x2_ampl_lower = ui->lineEdit_2x_ampl_lower->text().toFloat();
vib_alert_ptr->alert_danger[current_index].x2_ampl_enable = ui->checkBox_2x_ampl->checkState();
vib_alert_ptr->alert_danger[current_index].danger_param = ui->comboBox_danger->currentIndex();
vib_alert_ptr->alert_danger[current_index].danger_upper = ui->lineEdit_danger_upper->text().toFloat();
vib_alert_ptr->alert_danger[current_index].danger_enable = ui->checkBox_danger->checkState();
this->close();
}
void Setpoint::on_pushButton_cancel_clicked()
{
this->close();
}
void Setpoint::on_pushButton_set_default_clicked()
{
}
void Setpoint::onComboBoxIndexChanged(int index){
vib_alert_ptr->alert_danger[current_index].direct_upper = ui->lineEdit_direct_upper->text().toFloat();
vib_alert_ptr->alert_danger[current_index].direct_enable = ui->checkBox_direct->checkState();
vib_alert_ptr->alert_danger[current_index].x1_ampl_upper = ui->lineEdit_1x_ampl_upper->text().toFloat();
vib_alert_ptr->alert_danger[current_index].x1_ampl_lower = ui->lineEdit_1x_ampl_lower->text().toFloat();
vib_alert_ptr->alert_danger[current_index].x1_ampl_enable = ui->checkBox_1x_ampl->checkState();
vib_alert_ptr->alert_danger[current_index].x2_ampl_upper = ui->lineEdit_2x_ampl_upper->text().toFloat();
vib_alert_ptr->alert_danger[current_index].x2_ampl_lower = ui->lineEdit_2x_ampl_lower->text().toFloat();
vib_alert_ptr->alert_danger[current_index].x2_ampl_enable = ui->checkBox_2x_ampl->checkState();
vib_alert_ptr->alert_danger[current_index].danger_param = ui->comboBox_danger->currentIndex();
vib_alert_ptr->alert_danger[current_index].danger_upper = ui->lineEdit_danger_upper->text().toFloat();
vib_alert_ptr->alert_danger[current_index].danger_enable = ui->checkBox_danger->checkState();
current_index = index;
ui->lineEdit_direct_upper->setText(QString::number(vib_alert_ptr->alert_danger[index].direct_upper));
ui->checkBox_direct->setChecked(vib_alert_ptr->alert_danger[index].direct_enable);
if(vib_alert_ptr->alert_danger[index].direct_upper > 0)
slider_direct->m_upper = vib_alert_ptr->alert_danger[index].direct_upper;
ui->lineEdit_1x_ampl_upper->setText(QString::number(vib_alert_ptr->alert_danger[index].x1_ampl_upper));
ui->lineEdit_1x_ampl_lower->setText(QString::number(vib_alert_ptr->alert_danger[index].x1_ampl_lower));
ui->checkBox_1x_ampl->setChecked(vib_alert_ptr->alert_danger[index].x1_ampl_enable);
if(vib_alert_ptr->alert_danger[index].x1_ampl_upper > 0 && vib_alert_ptr->alert_danger[index].x1_ampl_lower > 0){
slider_1x_ampl->m_upper = vib_alert_ptr->alert_danger[index].x1_ampl_upper;
slider_1x_ampl->m_lower = vib_alert_ptr->alert_danger[index].x1_ampl_lower;
}
ui->lineEdit_2x_ampl_upper->setText(QString::number(vib_alert_ptr->alert_danger[index].x2_ampl_upper));
ui->lineEdit_2x_ampl_lower->setText(QString::number(vib_alert_ptr->alert_danger[index].x2_ampl_lower));
ui->checkBox_2x_ampl->setChecked(vib_alert_ptr->alert_danger[index].x2_ampl_enable);
if(vib_alert_ptr->alert_danger[index].x2_ampl_upper > 0 && vib_alert_ptr->alert_danger[index].x2_ampl_lower > 0){
slider_2x_ampl->m_upper = vib_alert_ptr->alert_danger[index].x2_ampl_upper;
slider_2x_ampl->m_lower = vib_alert_ptr->alert_danger[index].x2_ampl_lower;
}
ui->lineEdit_danger_upper->setText(QString::number(vib_alert_ptr->alert_danger[index].danger_upper));
ui->checkBox_danger->setChecked(vib_alert_ptr->alert_danger[index].danger_enable);
if(vib_alert_ptr->alert_danger[index].danger_upper > 0){
slider_danger->m_upper = vib_alert_ptr->alert_danger[index].danger_upper;
}
}

View File

@ -37,6 +37,7 @@ private:
std::shared_ptr<VibrationData> vib_alert_ptr = nullptr; std::shared_ptr<VibrationData> vib_alert_ptr = nullptr;
int current_index; int current_index;
void Init(); void Init();
void update();
}; };
#endif // SETPOINT_H #endif // SETPOINT_H

View File

@ -105,7 +105,7 @@ void SingleRelay::OnButtonGroup(QAbstractButton *slot_btn) {
std::shared_ptr<VibrationData> vib_data = std::dynamic_pointer_cast<VibrationData>(base_ptr); std::shared_ptr<VibrationData> vib_data = std::dynamic_pointer_cast<VibrationData>(base_ptr);
if((vib_data->base_config_[var].standby && vib_data->base_config_[var + 1].standby && !(var % 2))) if((vib_data->base_config_[var].standby && vib_data->base_config_[var + 1].standby && !(var % 2)))
continue; continue;
QString item_str = QString("S%1C%2P##NO (Slot %3 Channel %4 Not OK)").arg(QString::number(button_id, 10).rightJustified(2, '0')).arg(QString::number(var+1, 10).rightJustified(2, '0')).arg(button_id).arg(var+1); QString item_str = QString("%1 (Slot %2 Channel %3 Not OK)").arg(vib_data->base_config_[var].point_name).arg(button_id).arg(var+1);
QListWidgetItem *item = new QListWidgetItem(item_str); QListWidgetItem *item = new QListWidgetItem(item_str);
QString item_data = QString("S%1C%2P##NO").arg(QString::number(button_id, 10).rightJustified(2, '0')).arg(QString::number(var+1, 10).rightJustified(2, '0')); QString item_data = QString("S%1C%2P##NO").arg(QString::number(button_id, 10).rightJustified(2, '0')).arg(QString::number(var+1, 10).rightJustified(2, '0'));
item->setData(Qt::UserRole, item_data); item->setData(Qt::UserRole, item_data);

View File

@ -17,7 +17,7 @@ TMRRelayAssociation::TMRRelayAssociation(int slot,int cardtype,QWidget *parent)
} }
ui->label_slot_no->setText(QString::number(slot_no)); ui->label_slot_no->setText(QString::number(slot_no));
QVBoxLayout *layout_available = new QVBoxLayout(ui->widget_available); QVBoxLayout *layout_available = new QVBoxLayout(ui->widget_available);
list_widget_available = new DraggableListWidget; list_widget_available = new QListWidget();
layout_available->addWidget(list_widget_available); layout_available->addWidget(list_widget_available);
list_widget_available->setDragEnabled(true); list_widget_available->setDragEnabled(true);
@ -57,7 +57,7 @@ TMRRelayAssociation::TMRRelayAssociation(int slot,int cardtype,QWidget *parent)
connect(treeView_relay,&QTreeView::customContextMenuRequested,this,&TMRRelayAssociation::on_treeView_Relay_customContextMenuRequested); connect(treeView_relay,&QTreeView::customContextMenuRequested,this,&TMRRelayAssociation::on_treeView_Relay_customContextMenuRequested);
current_index = ui->comboBox_relay_ch->currentIndex(); current_index = ui->comboBox_relay_ch->currentIndex();
Init(); Init();
onComboBoxIndexChanged(current_index);
// QString expr = "((S01C01A1 + S01C02A1 + (S02C01A1 * S02C01A2)) * (S02C01A2 + S02C01A1 + (S02C01A1 + S02C01A2)) * (S02C01A1 * S02C01A2))"; // QString expr = "((S01C01A1 + S01C02A1 + (S02C01A1 * S02C01A2)) * (S02C01A2 + S02C01A1 + (S02C01A1 + S02C01A2)) * (S02C01A1 * S02C01A2))";
// setExpressionToTreeView(treeView_relay, expr); // setExpressionToTreeView(treeView_relay, expr);
} }
@ -116,10 +116,37 @@ void TMRRelayAssociation::Init(){
return; return;
} }
relay_data = std::dynamic_pointer_cast<TmrrelayassociationData>(base_ptr); relay_data = std::dynamic_pointer_cast<TmrrelayassociationData>(base_ptr);
qDebug() << "logic" <<relay_data->tmr_relay[current_index].logic_expression;
ui->checkBox_sgcc->setChecked(relay_data->sgcc_enable);
setExpressionToTreeView(treeView_relay, relay_data->tmr_relay[current_index].logic_expression);
qDebug() << "logic" <<relay_data->tmr_relay[current_index].logic_expression;
for(int i = 0 ; i < SLOT_NUM ; i++){
std::shared_ptr<CardBase> cardbase_ptr = ConfigMgr::Instance()->GetSlotPtr(i + 1);
if(cardbase_ptr != nullptr &&
cardbase_ptr->card_type_ == kCardVibSingle){
qDebug() << "i" << i;
std::shared_ptr<VibrationData> ptr = std::dynamic_pointer_cast<VibrationData>(cardbase_ptr);
for (int var = 0; var < CHANNEL_COUNT; ++var) {
QString item_data,item_str;
if(ptr->alert_danger[var].direct_enable ||
ptr->alert_danger[var].x1_ampl_enable ||
ptr->alert_danger[var].x2_ampl_enable){
item_str = QString("%1 (槽位 %2 通道 %3 警报)").arg(ptr->base_config_[var].point_name).arg(ptr->base_config_[var].chan_id.mid(1,2)).arg(ptr->base_config_[var].chan_id.mid(4,2));
item_data = QString("%1A1").arg(ptr->base_config_[var].chan_id);
}
if(ptr->alert_danger[var].danger_enable){
item_str = QString("%1 (槽位 %2 通道 %3 危险)").arg(ptr->base_config_[var].point_name).arg(ptr->base_config_[var].chan_id.mid(1,2)).arg(ptr->base_config_[var].chan_id.mid(4,2));
item_data = QString("%1A2").arg(ptr->base_config_[var].chan_id);
}
channelNameMap[item_data] = item_str;
}
}else if(cardbase_ptr != nullptr &&
(cardbase_ptr->card_type_ == kCardSpeedSingle)){
}
}
ui->checkBox_sgcc->setChecked(relay_data->sgcc_enable);
if(!relay_data->tmr_relay[current_index].logic_expression.isEmpty()){
setExpressionToTreeView(treeView_relay, relay_data->tmr_relay[current_index].logic_expression);
}
} }
ExprNode* TMRRelayAssociation::parseExpression(const QString& expr, int& pos) { ExprNode* TMRRelayAssociation::parseExpression(const QString& expr, int& pos) {
auto skipSpaces = [&]() { auto skipSpaces = [&]() {
@ -174,7 +201,14 @@ ExprNode* TMRRelayAssociation::parseExpression(const QString& expr, int& pos) {
} }
QStandardItem* TMRRelayAssociation::buildItemTree(ExprNode* node) { QStandardItem* TMRRelayAssociation::buildItemTree(ExprNode* node) {
if (!node) return nullptr; if (!node) return nullptr;
QStandardItem* item = new QStandardItem(node->value); QString displayText;
if (node->value == "+" || node->value == "*") {
displayText = (node->value == "+") ? "OR" : "AND"; // 运算符显示
} else {
displayText = channelNameMap.value(node->value, node->value); // 显示名
}
QStandardItem* item = new QStandardItem(displayText);
item->setData(node->value, Qt::UserRole); // 原始表达式key
for (ExprNode* child : node->children) { for (ExprNode* child : node->children) {
item->appendRow(buildItemTree(child)); item->appendRow(buildItemTree(child));
} }
@ -193,7 +227,8 @@ QString TMRRelayAssociation::buildLogicExpression(QStandardItem *item) {
if (!item) return ""; if (!item) return "";
int childCount = item->rowCount(); int childCount = item->rowCount();
QString text = item->text().trimmed(); QVariant userData = item->data(Qt::UserRole);
QString text = userData.toString().trimmed();
if (childCount == 0) { if (childCount == 0) {
// 叶子节点,直接返回表达式,比如 S01C01A1 // 叶子节点,直接返回表达式,比如 S01C01A1
@ -360,28 +395,28 @@ void TMRRelayAssociation::OnButtonGroup(QAbstractButton *slot_btn) {
int button_id = object_name.right(object_name.length() - 15).toInt(); int button_id = object_name.right(object_name.length() - 15).toInt();
std::shared_ptr<CardBase> base_ptr = ConfigMgr::Instance()->GetSlotPtr(button_id); std::shared_ptr<CardBase> base_ptr = ConfigMgr::Instance()->GetSlotPtr(button_id);
std::shared_ptr<VibrationData> ptr = std::dynamic_pointer_cast<VibrationData>(base_ptr); std::shared_ptr<VibrationData> ptr = std::dynamic_pointer_cast<VibrationData>(base_ptr);
QString item_str = QString("*"); QListWidgetItem *item_and = new QListWidgetItem("AND");
QListWidgetItem *item_or = new QListWidgetItem("*"); item_and->setData(Qt::UserRole, "*");
item_or->setData(Qt::UserRole, "*");
list_widget_available->addItem(item_or);
QListWidgetItem *item_and = new QListWidgetItem("+");
item_and->setData(Qt::UserRole, "+");
list_widget_available->addItem(item_and); list_widget_available->addItem(item_and);
QListWidgetItem *item_or = new QListWidgetItem("OR");
item_or->setData(Qt::UserRole, "+");
list_widget_available->addItem(item_or);
for(int var = 0; var < CHANNEL_COUNT ; ++var){ for(int var = 0; var < CHANNEL_COUNT ; ++var){
QString item_data;
if(ptr->alert_danger[var].direct_enable || if(ptr->alert_danger[var].direct_enable ||
ptr->alert_danger[var].x1_ampl_enable || ptr->alert_danger[var].x1_ampl_enable ||
ptr->alert_danger[var].x2_ampl_enable){ ptr->alert_danger[var].x2_ampl_enable){
QString item_str = QString("S%1C%2A1 (槽位 %3 通道 %4 警报)").arg(QString::number(button_id, 10).rightJustified(2, '0')).arg(QString::number(var+1, 10).rightJustified(2, '0')).arg(button_id).arg(var+1); QString item_str = QString("%1 (槽位 %3 通道 %4 警报)").arg(ptr->base_config_[var].point_name).arg(button_id).arg(var+1);
QListWidgetItem *item = new QListWidgetItem(item_str); QListWidgetItem *item = new QListWidgetItem(item_str);
QString item_data = QString("S%1C%2A1").arg(QString::number(button_id, 10).rightJustified(2, '0')).arg(QString::number(var+1, 10).rightJustified(2, '0')); item_data = QString("S%1C%2A1").arg(QString::number(button_id, 10).rightJustified(2, '0')).arg(QString::number(var+1, 10).rightJustified(2, '0'));
item->setData(Qt::UserRole, item_data); item->setData(Qt::UserRole, item_data);
list_widget_available->addItem(item); list_widget_available->addItem(item);
} }
if(ptr->alert_danger[var].danger_enable){ if(ptr->alert_danger[var].danger_enable){
QString item_str = QString("S%1C%2A2 (槽位 %3 通道 %4 危险)").arg(QString::number(button_id, 10).rightJustified(2, '0')).arg(QString::number(var+1, 10).rightJustified(2, '0')).arg(button_id).arg(var+1); QString item_str = QString("%1 (槽位 %3 通道 %4 危险)").arg(ptr->base_config_[var].point_name).arg(button_id).arg(var+1);
QListWidgetItem *item = new QListWidgetItem(item_str); QListWidgetItem *item = new QListWidgetItem(item_str);
QString item_data = QString("S%1C%2A2").arg(QString::number(button_id, 10).rightJustified(2, '0')).arg(QString::number(var+1, 10).rightJustified(2, '0')); item_data = QString("S%1C%2A2").arg(QString::number(button_id, 10).rightJustified(2, '0')).arg(QString::number(var+1, 10).rightJustified(2, '0'));
item->setData(Qt::UserRole, item_data); item->setData(Qt::UserRole, item_data);
list_widget_available->addItem(item); list_widget_available->addItem(item);
} }
@ -404,9 +439,6 @@ void TMRRelayAssociation::on_pushButton_confirm_clicked()
for (int i = 0; i < root->rowCount(); ++i) { for (int i = 0; i < root->rowCount(); ++i) {
QStandardItem *topItem = root->child(i); QStandardItem *topItem = root->child(i);
QString expr = buildLogicExpression(topItem); QString expr = buildLogicExpression(topItem);
// if (!finalExpr.isEmpty()) {
// finalExpr += " OR ";
// }
finalExpr += expr; finalExpr += expr;
} }
ExprValidationResult result = validateLogicExpression(finalExpr); ExprValidationResult result = validateLogicExpression(finalExpr);
@ -429,9 +461,6 @@ void TMRRelayAssociation::onComboBoxIndexChanged(int index){
for (int i = 0; i < root->rowCount(); ++i) { for (int i = 0; i < root->rowCount(); ++i) {
QStandardItem *topItem = root->child(i); QStandardItem *topItem = root->child(i);
QString expr = buildLogicExpression(topItem); QString expr = buildLogicExpression(topItem);
// if (!finalExpr.isEmpty()) {
// finalExpr += " OR ";
// }
finalExpr += expr; finalExpr += expr;
} }
ExprValidationResult result = validateLogicExpression(finalExpr); ExprValidationResult result = validateLogicExpression(finalExpr);

View File

@ -27,24 +27,25 @@ public:
using QStandardItemModel::QStandardItemModel; using QStandardItemModel::QStandardItemModel;
QStringList mimeTypes() const override { QStringList mimeTypes() const override {
return { "application/x-custom" }; // 支持自定义类型和 QListWidget 默认类型
return { "application/x-custom", "application/x-qabstractitemmodeldatalist" };
} }
bool dropMimeData(const QMimeData *data, Qt::DropAction action, bool dropMimeData(const QMimeData *data, Qt::DropAction action,
int row, int column, const QModelIndex &parent) override { int row, int column, const QModelIndex &parent) override {
if (!data->hasFormat("application/x-custom")) QStandardItem *parentItem = this->itemFromIndex(parent);
return false; if (!parentItem)
parentItem = this->invisibleRootItem();
if (data->hasFormat("application/x-custom")) {
QByteArray rawData = data->data("application/x-custom"); QByteArray rawData = data->data("application/x-custom");
QString customText = QString::fromUtf8(rawData); QString customText = QString::fromUtf8(rawData);
QStandardItem *newItem = new QStandardItem(customText); QStandardItem *newItem = new QStandardItem(customText);
newItem->setData(customText, Qt::UserRole); // 假设 data 也就是内容
newItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | newItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable |
Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled); Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled);
QStandardItem *parentItem = this->itemFromIndex(parent);
if (!parentItem) parentItem = this->invisibleRootItem();
if (row < 0) if (row < 0)
parentItem->appendRow(newItem); parentItem->appendRow(newItem);
else else
@ -53,8 +54,37 @@ public:
return true; return true;
} }
if (data->hasFormat("application/x-qabstractitemmodeldatalist")) {
QByteArray encoded = data->data("application/x-qabstractitemmodeldatalist");
QDataStream stream(&encoded, QIODevice::ReadOnly);
while (!stream.atEnd()) {
int r, c;
QMap<int, QVariant> roleDataMap;
stream >> r >> c >> roleDataMap;
QString text = roleDataMap.value(Qt::DisplayRole).toString();
QVariant userData = roleDataMap.value(Qt::UserRole);
QStandardItem *newItem = new QStandardItem(text);
newItem->setData(userData, Qt::UserRole); // 保留附加数据
newItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable |
Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled);
if (row < 0)
parentItem->appendRow(newItem);
else
parentItem->insertRow(row, newItem);
}
return true;
}
return false;
}
Qt::DropActions supportedDropActions() const override { Qt::DropActions supportedDropActions() const override {
return Qt::CopyAction; return Qt::CopyAction | Qt::MoveAction;
} }
}; };
@ -90,11 +120,12 @@ private slots:
private: private:
Ui::TMRRelayAssociation *ui; Ui::TMRRelayAssociation *ui;
QButtonGroup * btnGroup_slot = nullptr; QButtonGroup * btnGroup_slot = nullptr;
DraggableListWidget *list_widget_available = nullptr; QListWidget *list_widget_available = nullptr;
int current_index; int current_index;
QTreeView *treeView_relay; QTreeView *treeView_relay;
QStandardItemModel *model_Relay; QStandardItemModel *model_Relay;
std::shared_ptr<TmrrelayassociationData> relay_data = nullptr; std::shared_ptr<TmrrelayassociationData> relay_data = nullptr;
QMap<QString, QString> channelNameMap;
void Init(); void Init();
void buildTreeFromExpression(QTreeView *treeView, const QString &expr); void buildTreeFromExpression(QTreeView *treeView, const QString &expr);

View File

@ -6,7 +6,7 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>821</width> <width>892</width>
<height>634</height> <height>634</height>
</rect> </rect>
</property> </property>
@ -186,7 +186,7 @@
<rect> <rect>
<x>110</x> <x>110</x>
<y>538</y> <y>538</y>
<width>691</width> <width>751</width>
<height>40</height> <height>40</height>
</rect> </rect>
</property> </property>
@ -980,38 +980,12 @@
<string>TextLabel</string> <string>TextLabel</string>
</property> </property>
</widget> </widget>
<widget class="QPushButton" name="pushButton_and">
<property name="geometry">
<rect>
<x>540</x>
<y>380</y>
<width>51</width>
<height>41</height>
</rect>
</property>
<property name="text">
<string>与(+)</string>
</property>
</widget>
<widget class="QPushButton" name="pushButton_or">
<property name="geometry">
<rect>
<x>540</x>
<y>440</y>
<width>51</width>
<height>41</height>
</rect>
</property>
<property name="text">
<string>或(*)</string>
</property>
</widget>
<widget class="QWidget" name="widget_available" native="true"> <widget class="QWidget" name="widget_available" native="true">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>230</x> <x>230</x>
<y>360</y> <y>360</y>
<width>301</width> <width>361</width>
<height>161</height> <height>161</height>
</rect> </rect>
</property> </property>
@ -1021,7 +995,7 @@
<rect> <rect>
<x>610</x> <x>610</x>
<y>80</y> <y>80</y>
<width>191</width> <width>251</width>
<height>421</height> <height>421</height>
</rect> </rect>
</property> </property>