重新绑定通道名称

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["power"] = ptr->base_config_[cid].power;
channel_item["point_name"] = ptr->base_config_[cid].point_name;
channel_item["chan_id"] = ptr->base_config_[cid].chan_id;
QJsonArray voltage_range;
voltage_range.append(ptr->base_config_[cid].normal_voltage_low);
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].power = channel["power"].toBool();
vib_data->base_config_[j].point_name = channel["point_name"].toString();
vib_data->base_config_[j].chan_id = channel["chan_id"].toString();
//setpoint
QJsonObject setpoint_data = channel["setpoint"].toObject();
vib_data->alert_danger[j].direct_upper = setpoint_data["direct_upper"].toDouble();

View File

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

View File

@ -176,8 +176,8 @@ void MainWindow::createMenu(const QString &rootTitle, QPushButton *parent) {
// 创建第三层子菜单:/HAM824 单板卡、三冗余板卡
QAction *proximitor_1 = proximitor_menu->addAction("/HAM824 单板卡");
proximitor_1->setData(kCardVibSingle);
QAction *proximitor_2 = proximitor_menu->addAction("/HAM824 三冗余板卡");
proximitor_2->setData(kCardVibTMRPrimary);
//QAction *proximitor_2 = proximitor_menu->addAction("/HAM824 三冗余板卡");
//proximitor_2->setData(kCardVibTMRPrimary);
QAction *rpm_1 = rpm_menu->addAction("/OPM844 单板卡");
rpm_1->setData(kCardSpeedSingle);
// 创建第二层子菜单:/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_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(relays_1, &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;
QString file_name = filepath + "\\tsi_config_file.json";
ConfigMgr::Instance()->Save(file_name);
return;
// 读取文件内容
QFile file(file_name);
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_high = ui->doubleSpinBox_high_1->value();
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) {
vib_data->base_config_[var].standby = ui->checkBox_standby_1->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_high = ui->doubleSpinBox_high_2->value();
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) {
vib_data->base_config_[var].standby = ui->checkBox_standby_2->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_high = ui->doubleSpinBox_high_3->value();
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) {
vib_data->base_config_[var].standby = ui->checkBox_standby_2->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_high = ui->doubleSpinBox_high_4->value();
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,185 +56,9 @@ void Setpoint::Init(){
switch (car_type) {
case kCardVibSingle:{
slider_direct->setRange(0,20);
slider_1x_ampl->setRange(0,20);
slider_2x_ampl->setRange(0,20);
int chan = ui->comboBox_chan->currentIndex();
std::shared_ptr<VibrationData> setpoint_data = std::dynamic_pointer_cast<VibrationData>(base_ptr);
std::vector<std::shared_ptr<VariableBase>> variable_ = setpoint_data->variables_;
if(setpoint_data->base_config_[chan].channel_type == kVibRadial){
for (int var = 0; var < variable_.size(); ++var) {
if(variable_[var]->direct_.full_scale_range == 0){
slider_direct->setRange(0,100);
slider_danger->setRange(0,100);
}else if(variable_[var]->direct_.full_scale_range == 1){
slider_direct->setRange(0,150);
slider_danger->setRange(0,150);
}else if(variable_[var]->direct_.full_scale_range == 2){
slider_direct->setRange(0,200);
slider_danger->setRange(0,200);
}else if(variable_[var]->direct_.full_scale_range == 3){
slider_direct->setRange(0,400);
slider_danger->setRange(0,400);
}else if(variable_[var]->direct_.full_scale_range == 4){
slider_direct->setRange(0,500);
slider_danger->setRange(0,500);
}
ui->label_direct->setText("um");
ui->label_danger->setText("um");
}
}
if(setpoint_data->base_config_[chan].channel_type == kVibAcc){
std::shared_ptr<VariableBase> base_channel_ptr = setpoint_data->GetChannelPtr(chan + 1);
std::shared_ptr<AccVelVariable> av_ptr = std::dynamic_pointer_cast<AccVelVariable>(base_channel_ptr);
for (int var = 0; var < variable_.size(); ++ var) {
if(variable_[var]->direct_.full_scale_range == 0){
slider_direct->setRange(0,20);
slider_danger->setRange(0,20);
}else if(variable_[var]->direct_.full_scale_range == 1){
slider_direct->setRange(0,50);
slider_danger->setRange(0,50);
}else if(variable_[var]->direct_.full_scale_range == 2){
slider_direct->setRange(0,100);
slider_danger->setRange(0,100);
}else if(variable_[var]->direct_.full_scale_range == 3){
slider_direct->setRange(0,200);
slider_danger->setRange(0,200);
}else if(variable_[var]->direct_.full_scale_range == 4){
slider_direct->setRange(0,250);
slider_danger->setRange(0,250);
}else if(variable_[var]->direct_.full_scale_range == 5){
slider_direct->setRange(0,400);
slider_danger->setRange(0,400);
}
ui->label_direct->setText("m/s^2 pk");
ui->label_danger->setText("m/s^2 pk");
}
if(av_ptr->rms_active_){
for (int var = 0; var < variable_.size(); ++ var) {
if(variable_[var]->direct_.full_scale_range == 0){
slider_direct->setRange(0,20);
slider_danger->setRange(0,20);
}else if(variable_[var]->direct_.full_scale_range == 1){
slider_direct->setRange(0,50);
slider_danger->setRange(0,50);
}else if(variable_[var]->direct_.full_scale_range == 2){
slider_direct->setRange(0,100);
slider_danger->setRange(0,100);
}else if(variable_[var]->direct_.full_scale_range == 3){
slider_direct->setRange(0,200);
slider_danger->setRange(0,200);
}
ui->label_direct->setText("m/s^2 rms");
ui->label_danger->setText("m/s^2 rms");
}
}
if(av_ptr->integrate_active_){
for (int var = 0; var < variable_.size(); ++ var) {
if(variable_[var]->direct_.full_scale_range == 0){
slider_direct->setRange(0,25);
slider_danger->setRange(0,25);
}else if(variable_[var]->direct_.full_scale_range == 1){
slider_direct->setRange(0,50);
slider_danger->setRange(0,50);
}else if(variable_[var]->direct_.full_scale_range == 2){
slider_direct->setRange(0,100);
slider_danger->setRange(0,100);
}
ui->label_direct->setText("mm/s pk");
ui->label_danger->setText("mm/s pk");
}
}
if(av_ptr->rms_active_ && av_ptr->integrate_active_){
for (int var = 0; var < variable_.size(); ++ var) {
if(variable_[var]->direct_.full_scale_range == 0){
slider_direct->setRange(0,25);
slider_danger->setRange(0,25);
}else if(variable_[var]->direct_.full_scale_range == 1){
slider_direct->setRange(0,50);
slider_danger->setRange(0,50);
}
ui->label_direct->setText("mm/s rms");
ui->label_danger->setText("mm/s rms");
}
}
}
if(setpoint_data->base_config_[chan].channel_type == kVibVelocity){
std::shared_ptr<VariableBase> base_channel_ptr = setpoint_data->GetChannelPtr(chan + 1);
std::shared_ptr<AccVelVariable> av_ptr = std::dynamic_pointer_cast<AccVelVariable>(base_channel_ptr);
for (int var = 0; var < variable_.size(); ++ var) {
if(variable_[var]->direct_.full_scale_range == 0){
slider_direct->setRange(0,10);
slider_danger->setRange(0,10);
}else if(variable_[var]->direct_.full_scale_range == 1){
slider_direct->setRange(0,20);
slider_danger->setRange(0,20);
}else if(variable_[var]->direct_.full_scale_range == 2){
slider_direct->setRange(0,50);
slider_danger->setRange(0,50);
}
ui->label_direct->setText("mm/s pk");
ui->label_danger->setText("mm/s pk");
}
if(av_ptr->rms_active_){
for (int var = 0; var < variable_.size(); ++ var) {
if(variable_[var]->direct_.full_scale_range == 0){
slider_direct->setRange(0,10);
slider_danger->setRange(0,10);
}else if(variable_[var]->direct_.full_scale_range == 1){
slider_direct->setRange(0,20);
slider_danger->setRange(0,20);
}else if(variable_[var]->direct_.full_scale_range == 2){
slider_direct->setRange(0,50);
slider_danger->setRange(0,50);
}
ui->label_direct->setText("mm/s rms");
ui->label_danger->setText("mm/s rms");
}
}
if(av_ptr->integrate_active_){
for (int var = 0; var < variable_.size(); ++ var) {
if(variable_[var]->direct_.full_scale_range == 0){
slider_direct->setRange(0,100);
slider_danger->setRange(0,100);
}else if(variable_[var]->direct_.full_scale_range == 1){
slider_direct->setRange(0,200);
slider_danger->setRange(0,200);
}else if(variable_[var]->direct_.full_scale_range == 2){
slider_direct->setRange(0,500);
slider_danger->setRange(0,500);
}
ui->label_direct->setText("um pp");
ui->label_danger->setText("um pp");
}
}
}
ui->lineEdit_direct_upper->setText(QString::number(setpoint_data->alert_danger[chan].direct_upper));
ui->checkBox_direct->setChecked(setpoint_data->alert_danger[chan].direct_enable);
if(setpoint_data->alert_danger[chan].direct_upper > 0){
slider_direct->m_upper = setpoint_data->alert_danger[chan].direct_upper;
}
ui->lineEdit_1x_ampl_upper->setText(QString::number(setpoint_data->alert_danger[chan].x1_ampl_upper));
ui->lineEdit_1x_ampl_lower->setText(QString::number(setpoint_data->alert_danger[chan].x1_ampl_lower));
ui->checkBox_1x_ampl->setChecked(setpoint_data->alert_danger[chan].x1_ampl_enable);
if(setpoint_data->alert_danger[chan].x1_ampl_upper > 0 && setpoint_data->alert_danger[chan].x1_ampl_lower > 0){
slider_1x_ampl->m_upper = setpoint_data->alert_danger[chan].x1_ampl_upper;
slider_1x_ampl->m_lower = setpoint_data->alert_danger[chan].x1_ampl_lower;
}
ui->lineEdit_2x_ampl_upper->setText(QString::number(setpoint_data->alert_danger[chan].x2_ampl_upper));
ui->lineEdit_2x_ampl_lower->setText(QString::number(setpoint_data->alert_danger[chan].x2_ampl_lower));
ui->checkBox_2x_ampl->setChecked(setpoint_data->alert_danger[chan].x2_ampl_enable);
if(setpoint_data->alert_danger[chan].x2_ampl_upper > 0 && setpoint_data->alert_danger[chan].x2_ampl_lower > 0){
slider_2x_ampl->m_upper = setpoint_data->alert_danger[chan].x2_ampl_upper;
slider_2x_ampl->m_lower = setpoint_data->alert_danger[chan].x2_ampl_lower;
}
ui->lineEdit_danger_upper->setText(QString::number(setpoint_data->alert_danger[chan].danger_upper));
ui->checkBox_danger->setChecked(setpoint_data->alert_danger[chan].danger_enable);
if(setpoint_data->alert_danger[chan].danger_upper > 0){
slider_danger->m_upper = setpoint_data->alert_danger[chan].danger_upper;
slider_danger->m_lower = 0;
}
update();
}break;
}
QObject::connect(ui->lineEdit_direct_upper, &QLineEdit::editingFinished, [&]() {
@ -321,29 +145,184 @@ void Setpoint::onComboBoxIndexChanged(int index){
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;
update();
}
void Setpoint::update()
{
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::vector<std::shared_ptr<VariableBase>> variable_ = setpoint_data->variables_;
if(setpoint_data->base_config_[chan].channel_type == kVibRadial){
for (int var = 0; var < variable_.size(); ++var) {
if(variable_[var]->direct_.full_scale_range == 0){
slider_direct->setRange(0,100);
slider_danger->setRange(0,100);
}else if(variable_[var]->direct_.full_scale_range == 1){
slider_direct->setRange(0,150);
slider_danger->setRange(0,150);
}else if(variable_[var]->direct_.full_scale_range == 2){
slider_direct->setRange(0,200);
slider_danger->setRange(0,200);
}else if(variable_[var]->direct_.full_scale_range == 3){
slider_direct->setRange(0,400);
slider_danger->setRange(0,400);
}else if(variable_[var]->direct_.full_scale_range == 4){
slider_direct->setRange(0,500);
slider_danger->setRange(0,500);
}
ui->label_direct->setText("um");
ui->label_danger->setText("um");
}
}
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;
if(setpoint_data->base_config_[chan].channel_type == kVibAcc){
std::shared_ptr<VariableBase> base_channel_ptr = setpoint_data->GetChannelPtr(chan + 1);
std::shared_ptr<AccVelVariable> av_ptr = std::dynamic_pointer_cast<AccVelVariable>(base_channel_ptr);
for (int var = 0; var < variable_.size(); ++ var) {
if(variable_[var]->direct_.full_scale_range == 0){
slider_direct->setRange(0,20);
slider_danger->setRange(0,20);
}else if(variable_[var]->direct_.full_scale_range == 1){
slider_direct->setRange(0,50);
slider_danger->setRange(0,50);
}else if(variable_[var]->direct_.full_scale_range == 2){
slider_direct->setRange(0,100);
slider_danger->setRange(0,100);
}else if(variable_[var]->direct_.full_scale_range == 3){
slider_direct->setRange(0,200);
slider_danger->setRange(0,200);
}else if(variable_[var]->direct_.full_scale_range == 4){
slider_direct->setRange(0,250);
slider_danger->setRange(0,250);
}else if(variable_[var]->direct_.full_scale_range == 5){
slider_direct->setRange(0,400);
slider_danger->setRange(0,400);
}
ui->label_direct->setText("m/s^2 pk");
ui->label_danger->setText("m/s^2 pk");
}
if(av_ptr->rms_active_){
for (int var = 0; var < variable_.size(); ++ var) {
if(variable_[var]->direct_.full_scale_range == 0){
slider_direct->setRange(0,20);
slider_danger->setRange(0,20);
}else if(variable_[var]->direct_.full_scale_range == 1){
slider_direct->setRange(0,50);
slider_danger->setRange(0,50);
}else if(variable_[var]->direct_.full_scale_range == 2){
slider_direct->setRange(0,100);
slider_danger->setRange(0,100);
}else if(variable_[var]->direct_.full_scale_range == 3){
slider_direct->setRange(0,200);
slider_danger->setRange(0,200);
}
ui->label_direct->setText("m/s^2 rms");
ui->label_danger->setText("m/s^2 rms");
}
}
if(av_ptr->integrate_active_){
for (int var = 0; var < variable_.size(); ++ var) {
if(variable_[var]->direct_.full_scale_range == 0){
slider_direct->setRange(0,25);
slider_danger->setRange(0,25);
}else if(variable_[var]->direct_.full_scale_range == 1){
slider_direct->setRange(0,50);
slider_danger->setRange(0,50);
}else if(variable_[var]->direct_.full_scale_range == 2){
slider_direct->setRange(0,100);
slider_danger->setRange(0,100);
}
ui->label_direct->setText("mm/s pk");
ui->label_danger->setText("mm/s pk");
}
}
if(av_ptr->rms_active_ && av_ptr->integrate_active_){
for (int var = 0; var < variable_.size(); ++ var) {
if(variable_[var]->direct_.full_scale_range == 0){
slider_direct->setRange(0,25);
slider_danger->setRange(0,25);
}else if(variable_[var]->direct_.full_scale_range == 1){
slider_direct->setRange(0,50);
slider_danger->setRange(0,50);
}
ui->label_direct->setText("mm/s rms");
ui->label_danger->setText("mm/s rms");
}
}
}
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;
if(setpoint_data->base_config_[chan].channel_type == kVibVelocity){
std::shared_ptr<VariableBase> base_channel_ptr = setpoint_data->GetChannelPtr(chan + 1);
std::shared_ptr<AccVelVariable> av_ptr = std::dynamic_pointer_cast<AccVelVariable>(base_channel_ptr);
for (int var = 0; var < variable_.size(); ++ var) {
if(variable_[var]->direct_.full_scale_range == 0){
slider_direct->setRange(0,10);
slider_danger->setRange(0,10);
}else if(variable_[var]->direct_.full_scale_range == 1){
slider_direct->setRange(0,20);
slider_danger->setRange(0,20);
}else if(variable_[var]->direct_.full_scale_range == 2){
slider_direct->setRange(0,50);
slider_danger->setRange(0,50);
}
ui->label_direct->setText("mm/s pk");
ui->label_danger->setText("mm/s pk");
}
if(av_ptr->rms_active_){
for (int var = 0; var < variable_.size(); ++ var) {
if(variable_[var]->direct_.full_scale_range == 0){
slider_direct->setRange(0,10);
slider_danger->setRange(0,10);
}else if(variable_[var]->direct_.full_scale_range == 1){
slider_direct->setRange(0,20);
slider_danger->setRange(0,20);
}else if(variable_[var]->direct_.full_scale_range == 2){
slider_direct->setRange(0,50);
slider_danger->setRange(0,50);
}
ui->label_direct->setText("mm/s rms");
ui->label_danger->setText("mm/s rms");
}
}
if(av_ptr->integrate_active_){
for (int var = 0; var < variable_.size(); ++ var) {
if(variable_[var]->direct_.full_scale_range == 0){
slider_direct->setRange(0,100);
slider_danger->setRange(0,100);
}else if(variable_[var]->direct_.full_scale_range == 1){
slider_direct->setRange(0,200);
slider_danger->setRange(0,200);
}else if(variable_[var]->direct_.full_scale_range == 2){
slider_direct->setRange(0,500);
slider_danger->setRange(0,500);
}
ui->label_direct->setText("um pp");
ui->label_danger->setText("um pp");
}
}
}
ui->lineEdit_direct_upper->setText(QString::number(setpoint_data->alert_danger[chan].direct_upper));
ui->checkBox_direct->setChecked(setpoint_data->alert_danger[chan].direct_enable);
if(setpoint_data->alert_danger[chan].direct_upper > 0){
slider_direct->m_upper = setpoint_data->alert_danger[chan].direct_upper;
}
ui->lineEdit_1x_ampl_upper->setText(QString::number(setpoint_data->alert_danger[chan].x1_ampl_upper));
ui->lineEdit_1x_ampl_lower->setText(QString::number(setpoint_data->alert_danger[chan].x1_ampl_lower));
ui->checkBox_1x_ampl->setChecked(setpoint_data->alert_danger[chan].x1_ampl_enable);
if(setpoint_data->alert_danger[chan].x1_ampl_upper > 0 && setpoint_data->alert_danger[chan].x1_ampl_lower > 0){
slider_1x_ampl->m_upper = setpoint_data->alert_danger[chan].x1_ampl_upper;
slider_1x_ampl->m_lower = setpoint_data->alert_danger[chan].x1_ampl_lower;
}
ui->lineEdit_2x_ampl_upper->setText(QString::number(setpoint_data->alert_danger[chan].x2_ampl_upper));
ui->lineEdit_2x_ampl_lower->setText(QString::number(setpoint_data->alert_danger[chan].x2_ampl_lower));
ui->checkBox_2x_ampl->setChecked(setpoint_data->alert_danger[chan].x2_ampl_enable);
if(setpoint_data->alert_danger[chan].x2_ampl_upper > 0 && setpoint_data->alert_danger[chan].x2_ampl_lower > 0){
slider_2x_ampl->m_upper = setpoint_data->alert_danger[chan].x2_ampl_upper;
slider_2x_ampl->m_lower = setpoint_data->alert_danger[chan].x2_ampl_lower;
}
ui->lineEdit_danger_upper->setText(QString::number(setpoint_data->alert_danger[chan].danger_upper));
ui->checkBox_danger->setChecked(setpoint_data->alert_danger[chan].danger_enable);
if(setpoint_data->alert_danger[chan].danger_upper > 0){
slider_danger->m_upper = setpoint_data->alert_danger[chan].danger_upper;
slider_danger->m_lower = 0;
}
}

View File

@ -37,6 +37,7 @@ private:
std::shared_ptr<VibrationData> vib_alert_ptr = nullptr;
int current_index;
void Init();
void update();
};
#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);
if((vib_data->base_config_[var].standby && vib_data->base_config_[var + 1].standby && !(var % 2)))
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);
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);

View File

@ -17,7 +17,7 @@ TMRRelayAssociation::TMRRelayAssociation(int slot,int cardtype,QWidget *parent)
}
ui->label_slot_no->setText(QString::number(slot_no));
QVBoxLayout *layout_available = new QVBoxLayout(ui->widget_available);
list_widget_available = new DraggableListWidget;
list_widget_available = new QListWidget();
layout_available->addWidget(list_widget_available);
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);
current_index = ui->comboBox_relay_ch->currentIndex();
Init();
onComboBoxIndexChanged(current_index);
// QString expr = "((S01C01A1 + S01C02A1 + (S02C01A1 * S02C01A2)) * (S02C01A2 + S02C01A1 + (S02C01A1 + S02C01A2)) * (S02C01A1 * S02C01A2))";
// setExpressionToTreeView(treeView_relay, expr);
}
@ -116,10 +116,37 @@ void TMRRelayAssociation::Init(){
return;
}
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) {
auto skipSpaces = [&]() {
@ -174,7 +201,14 @@ ExprNode* TMRRelayAssociation::parseExpression(const QString& expr, int& pos) {
}
QStandardItem* TMRRelayAssociation::buildItemTree(ExprNode* node) {
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) {
item->appendRow(buildItemTree(child));
}
@ -193,7 +227,8 @@ QString TMRRelayAssociation::buildLogicExpression(QStandardItem *item) {
if (!item) return "";
int childCount = item->rowCount();
QString text = item->text().trimmed();
QVariant userData = item->data(Qt::UserRole);
QString text = userData.toString().trimmed();
if (childCount == 0) {
// 叶子节点,直接返回表达式,比如 S01C01A1
@ -360,28 +395,28 @@ void TMRRelayAssociation::OnButtonGroup(QAbstractButton *slot_btn) {
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<VibrationData> ptr = std::dynamic_pointer_cast<VibrationData>(base_ptr);
QString item_str = QString("*");
QListWidgetItem *item_or = new QListWidgetItem("*");
item_or->setData(Qt::UserRole, "*");
list_widget_available->addItem(item_or);
QListWidgetItem *item_and = new QListWidgetItem("+");
item_and->setData(Qt::UserRole, "+");
QListWidgetItem *item_and = new QListWidgetItem("AND");
item_and->setData(Qt::UserRole, "*");
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){
QString item_data;
if(ptr->alert_danger[var].direct_enable ||
ptr->alert_danger[var].x1_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);
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);
list_widget_available->addItem(item);
}
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);
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);
list_widget_available->addItem(item);
}
@ -404,9 +439,6 @@ void TMRRelayAssociation::on_pushButton_confirm_clicked()
for (int i = 0; i < root->rowCount(); ++i) {
QStandardItem *topItem = root->child(i);
QString expr = buildLogicExpression(topItem);
// if (!finalExpr.isEmpty()) {
// finalExpr += " OR ";
// }
finalExpr += expr;
}
ExprValidationResult result = validateLogicExpression(finalExpr);
@ -429,9 +461,6 @@ void TMRRelayAssociation::onComboBoxIndexChanged(int index){
for (int i = 0; i < root->rowCount(); ++i) {
QStandardItem *topItem = root->child(i);
QString expr = buildLogicExpression(topItem);
// if (!finalExpr.isEmpty()) {
// finalExpr += " OR ";
// }
finalExpr += expr;
}
ExprValidationResult result = validateLogicExpression(finalExpr);

View File

@ -27,34 +27,64 @@ public:
using QStandardItemModel::QStandardItemModel;
QStringList mimeTypes() const override {
return { "application/x-custom" };
// 支持自定义类型和 QListWidget 默认类型
return { "application/x-custom", "application/x-qabstractitemmodeldatalist" };
}
bool dropMimeData(const QMimeData *data, Qt::DropAction action,
int row, int column, const QModelIndex &parent) override {
if (!data->hasFormat("application/x-custom"))
int row, int column, const QModelIndex &parent) override {
QStandardItem *parentItem = this->itemFromIndex(parent);
if (!parentItem)
parentItem = this->invisibleRootItem();
if (data->hasFormat("application/x-custom")) {
QByteArray rawData = data->data("application/x-custom");
QString customText = QString::fromUtf8(rawData);
QStandardItem *newItem = new QStandardItem(customText);
newItem->setData(customText, Qt::UserRole); // 假设 data 也就是内容
newItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable |
Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled);
if (row < 0)
parentItem->appendRow(newItem);
else
parentItem->insertRow(row, newItem);
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;
QByteArray rawData = data->data("application/x-custom");
QString customText = QString::fromUtf8(rawData);
QStandardItem *newItem = new QStandardItem(customText);
newItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable |
Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled);
QStandardItem *parentItem = this->itemFromIndex(parent);
if (!parentItem) parentItem = this->invisibleRootItem();
if (row < 0)
parentItem->appendRow(newItem);
else
parentItem->insertRow(row, newItem);
return true;
}
}
Qt::DropActions supportedDropActions() const override {
return Qt::CopyAction;
return Qt::CopyAction | Qt::MoveAction;
}
};
@ -90,11 +120,12 @@ private slots:
private:
Ui::TMRRelayAssociation *ui;
QButtonGroup * btnGroup_slot = nullptr;
DraggableListWidget *list_widget_available = nullptr;
QListWidget *list_widget_available = nullptr;
int current_index;
QTreeView *treeView_relay;
QStandardItemModel *model_Relay;
std::shared_ptr<TmrrelayassociationData> relay_data = nullptr;
QMap<QString, QString> channelNameMap;
void Init();
void buildTreeFromExpression(QTreeView *treeView, const QString &expr);

View File

@ -6,7 +6,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>821</width>
<width>892</width>
<height>634</height>
</rect>
</property>
@ -186,7 +186,7 @@
<rect>
<x>110</x>
<y>538</y>
<width>691</width>
<width>751</width>
<height>40</height>
</rect>
</property>
@ -980,38 +980,12 @@
<string>TextLabel</string>
</property>
</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">
<property name="geometry">
<rect>
<x>230</x>
<y>360</y>
<width>301</width>
<width>361</width>
<height>161</height>
</rect>
</property>
@ -1021,7 +995,7 @@
<rect>
<x>610</x>
<y>80</y>
<width>191</width>
<width>251</width>
<height>421</height>
</rect>
</property>