diff --git a/TSI_Config.pro b/TSI_Config.pro index 1fe84ad..6a30950 100644 --- a/TSI_Config.pro +++ b/TSI_Config.pro @@ -22,6 +22,7 @@ SOURCES += \ main.cpp \ mainwindow.cpp \ pointname.cpp \ + pressure_pulsation.cpp \ radial_vibration.cpp \ rangeslider.cpp \ relaysetting.cpp \ @@ -54,6 +55,7 @@ HEADERS += \ macconfig.h \ mainwindow.h \ pointname.h \ + pressure_pulsation.h \ radial_vibration.h \ rangeslider.h \ relaysetting.h \ @@ -74,12 +76,14 @@ HEADERS += \ FORMS += \ acceleration.ui \ + axialdisplacement.ui \ connect.ui \ ethconfig.ui \ keyphase.ui \ macconfig.ui \ mainwindow.ui \ pointname.ui \ + pressure_pulsation.ui \ radial_vibration.ui \ relaysetting.ui \ seismic_monitor.ui \ diff --git a/axialdisplacement.ui b/axialdisplacement.ui new file mode 100644 index 0000000..a24c473 --- /dev/null +++ b/axialdisplacement.ui @@ -0,0 +1,781 @@ + + + AxialDisplacement + + + + 0 + 0 + 690 + 532 + + + + Form + + + + + 21 + 10 + 105 + 17 + + + + + + + 通道: + + + + + + + 1 + + + + + + + (启用) + + + + + + + + + 341 + 10 + 63 + 17 + + + + + + + 槽位号: + + + + + + + 3 + + + + + + + + + 10 + 60 + 651 + 381 + + + + 1 + + + + 传感器和滤波配置 + + + + + 10 + 30 + 353 + 116 + + + + 滤波 + + + + + + + + 高通: + + + + + + + + 60 + 0 + + + + + 60 + 16777215 + + + + 3 + + + 3000 + + + + + + + - + + + + + + + + 60 + 0 + + + + + 60 + 16777215 + + + + 3 + + + 3000 + + + 3000 + + + + + + + 3 - 3000Hz + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + 低通: + + + + + + + + 60 + 0 + + + + + 60 + 16777215 + + + + + + + + - + + + + + + + + 60 + 0 + + + + + 60 + 16777215 + + + + + + + + 30 - 30000Hz + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + 带通: + + + + + + + + 60 + 0 + + + + 3 + + + 3000 + + + + + + + - + + + + + + + + 60 + 0 + + + + 3 + + + 3000 + + + 3000 + + + + + + + 3 - 3000Hz + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + 特征值和警报配置 + + + + + 10 + 10 + 471 + 191 + + + + 采样频率 + + + + + 20 + 30 + 397 + 24 + + + + + + + 固定 + + + + + + + + + 采样率: + + + + + + + + 100 + 50 + + + + + + + + Hz + + + + + + + + + + + 带宽: + + + + + + + + 100 + 50 + + + + + + + + Hz + + + + + + + + + + + 20 + 70 + 118 + 22 + + + + + + + FFT 点数: + + + + + + + + 8192 + + + + + + + + + + 20 + 100 + 122 + 14 + + + + + + + 频率范围: + + + + + + + 5000 Hz + + + + + + + + + 20 + 130 + 92 + 14 + + + + + + + 线数: + + + + + + + 1250 Hz + + + + + + + + + 20 + 160 + 104 + 14 + + + + + + + 频率分辨率: + + + + + + + 4 Hz + + + + + + + + + + 10 + 219 + 471 + 121 + + + + 测量 + + + + + 20 + 40 + 54 + 12 + + + + 最小: + + + + + + 20 + 80 + 54 + 12 + + + + 最大: + + + + + + 90 + 20 + 54 + 12 + + + + 测量值 + + + + + + 230 + 20 + 54 + 12 + + + + 对应值 + + + + + + 70 + 40 + 81 + 20 + + + + + + + 210 + 40 + 81 + 20 + + + + + + + 70 + 80 + 81 + 20 + + + + + + + 210 + 80 + 81 + 20 + + + + + + + 310 + 40 + 54 + 12 + + + + mbar + + + + + + 310 + 80 + 54 + 12 + + + + mbar + + + + + + 160 + 40 + 31 + 16 + + + + mV + + + + + + 160 + 80 + 31 + 16 + + + + mV + + + + + + + + + 20 + 450 + 632 + 37 + + + + + + + + 100 + 35 + + + + 确定 + + + + + + + false + + + + 100 + 35 + + + + 设置为默认值 + + + + + + + + 100 + 35 + + + + 取消 + + + + + + + false + + + + 100 + 35 + + + + 打印 + + + + + + + false + + + + 100 + 35 + + + + 帮助 + + + + + + + + + diff --git a/cardbase.h b/cardbase.h index 0b02ae9..8523d52 100644 --- a/cardbase.h +++ b/cardbase.h @@ -25,6 +25,7 @@ class VariableBase { VibChannelType type_; Filter filter_[3]; DirectImpl direct_; + GapRange gap_range; XImpl x1_; XImpl x2_; RecorderOut recorder_out_; @@ -49,11 +50,26 @@ class AccVelVariable : public VariableBase { bool rms_active_; bool integrate_active_; }; -// 加速度与速度 +// 轴向位移 class ThrustVariable : public VariableBase { public: bool alert_latching_; bool danger_latching_; bool timed_ok_; + ZeroPosition zero_position; +}; +// 动态压力脉动 +class PressurePulsationVariable : public VariableBase { + public: + bool fixed; + int sample_rate; + int bandwidth; + int fft_points; + bool spectral_synchron; + int measuring_min; + int measuring_max; + int scale_min; + int scale_max; + bool inherited; }; #endif // CARDBASE_H diff --git a/config_mgr.cpp b/config_mgr.cpp index a436d2b..9a91fe4 100644 --- a/config_mgr.cpp +++ b/config_mgr.cpp @@ -66,27 +66,43 @@ void ConfigMgr::Save(QString & file_path) { 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; - channel_item["keyphase"] = ptr->base_config_[cid].keyphase; - channel_item["keyphase_slot"] = ptr->base_config_[cid].keyphase_slot; - channel_item["keyphase_ch"] = ptr->base_config_[cid].keyphase_ch; + QJsonArray voltage_range; voltage_range.append(ptr->base_config_[cid].normal_voltage_low); voltage_range.append(ptr->base_config_[cid].normal_voltage_high); channel_item["normal_voltage_range"] = voltage_range; QJsonObject setpoint_data; - if(ptr->base_config_[cid].channel_type != kVibThrust){ - setpoint_data["1x_ampl_upper"] = qRound(ptr->alert_danger[cid].x1_ampl_upper * 10)/10.0; - setpoint_data["1x_ampl_lower"] = qRound(ptr->alert_danger[cid].x1_ampl_lower * 10)/10.0; - setpoint_data["1x_ampl_enable"] = ptr->alert_danger[cid].x1_ampl_enable; - setpoint_data["2x_ampl_upper"] = qRound(ptr->alert_danger[cid].x2_ampl_upper * 10)/10.0; - setpoint_data["2x_ampl_lower"] = qRound(ptr->alert_danger[cid].x2_ampl_lower * 10)/10.0; - setpoint_data["2x_ampl_enable"] = ptr->alert_danger[cid].x2_ampl_enable; + if(ptr->base_config_[cid].channel_type == kVibRadial || ptr->base_config_[cid].channel_type == kVibThrust || + ptr->base_config_[cid].channel_type == kVibAcc || ptr->base_config_[cid].channel_type == kVibVelocity ){ + if(ptr->base_config_[cid].channel_type != kVibThrust){ + setpoint_data["1x_ampl_upper"] = qRound(ptr->alert_danger[cid].x1_ampl_upper * 10)/10.0; + setpoint_data["1x_ampl_lower"] = qRound(ptr->alert_danger[cid].x1_ampl_lower * 10)/10.0; + setpoint_data["1x_ampl_enable"] = ptr->alert_danger[cid].x1_ampl_enable; + setpoint_data["2x_ampl_upper"] = qRound(ptr->alert_danger[cid].x2_ampl_upper * 10)/10.0; + setpoint_data["2x_ampl_lower"] = qRound(ptr->alert_danger[cid].x2_ampl_lower * 10)/10.0; + setpoint_data["2x_ampl_enable"] = ptr->alert_danger[cid].x2_ampl_enable; + channel_item["keyphase"] = ptr->base_config_[cid].keyphase; + channel_item["keyphase_slot"] = ptr->base_config_[cid].keyphase_slot; + channel_item["keyphase_ch"] = ptr->base_config_[cid].keyphase_ch; + } + setpoint_data["direct_upper"] = qRound(ptr->alert_danger[cid].direct_upper * 10)/10.0; + setpoint_data["direct_enable"] = ptr->alert_danger[cid].direct_enable; + setpoint_data["danger_param"] = ptr->alert_danger[cid].danger_param; + setpoint_data["danger_upper"] = qRound(ptr->alert_danger[cid].danger_upper * 10)/10.0; + setpoint_data["danger_enable"] = ptr->alert_danger[cid].danger_enable; + + } + if(ptr->base_config_[cid].channel_type == kVibPressurePulsation){ + setpoint_data["low_upper"] = qRound(ptr->alert_danger_press[cid].low_upper * 10)/10.0; + setpoint_data["low_enable"] = ptr->alert_danger_press[cid].low_enable; + setpoint_data["mid1_upper"] = qRound(ptr->alert_danger_press[cid].mid1_upper * 10)/10.0; + setpoint_data["mid1_enable"] = ptr->alert_danger_press[cid].mid1_enable; + setpoint_data["mid2_upper"] = qRound(ptr->alert_danger_press[cid].mid2_upper * 10)/10.0; + setpoint_data["mid2_enable"] = ptr->alert_danger_press[cid].mid2_enable; + setpoint_data["danger_param"] = ptr->alert_danger_press[cid].danger_param; + setpoint_data["danger_upper"] = qRound(ptr->alert_danger_press[cid].danger_upper * 10)/10.0; + setpoint_data["danger_enable"] = ptr->alert_danger_press[cid].danger_enable; } - setpoint_data["direct_upper"] = qRound(ptr->alert_danger[cid].direct_upper * 10)/10.0; - setpoint_data["direct_enable"] = ptr->alert_danger[cid].direct_enable; - setpoint_data["danger_param"] = ptr->alert_danger[cid].danger_param; - setpoint_data["danger_upper"] = qRound(ptr->alert_danger[cid].danger_upper * 10)/10.0; - setpoint_data["danger_enable"] = ptr->alert_danger[cid].danger_enable; channel_item["setpoint"] = setpoint_data; // variables QJsonObject variables; @@ -175,7 +191,7 @@ void ConfigMgr::Save(QString & file_path) { band_pass["checked"] = thrust_ptr->filter_[2].checked; filter.append(band_pass); variables["filter"] = filter; - QJsonObject direct; + QJsonObject direct,gap; QJsonObject recorder_out; QJsonObject delay; QJsonArray latching; @@ -183,6 +199,9 @@ void ConfigMgr::Save(QString & file_path) { direct["clamp_value"] = thrust_ptr->direct_.clamp_value; direct["custom"] = thrust_ptr->direct_.custom; variables["direct"] = direct; + gap["full_scale_range"] = thrust_ptr->gap_range.full_scale_range; + gap["custom"] = thrust_ptr->gap_range.custom; + variables["gap"] = gap; recorder_out["recorder_output"] = thrust_ptr->recorder_out_.recorder_output; recorder_out["two_ma_clamp"] = thrust_ptr->recorder_out_.two_ma_clamp; recorder_out["trip_multiply"] = thrust_ptr->recorder_out_.trip_multiply; @@ -196,7 +215,46 @@ void ConfigMgr::Save(QString & file_path) { latching.append(thrust_ptr->alert_latching_); latching.append(thrust_ptr->danger_latching_); latching.append(thrust_ptr->timed_ok_); + variables["zero_position"] = thrust_ptr->zero_position.value; variables["latching"] = latching; + }else if(ptr->base_config_[cid].channel_type == kVibPressurePulsation){ + std::shared_ptr pressure_ptr = std::dynamic_pointer_cast(base_channel_ptr); + if(pressure_ptr == nullptr){ + continue; + } + // filter + QJsonArray filter; + QJsonObject low_pass; + low_pass["low"] = pressure_ptr->filter_[0].low; + low_pass["high"] = pressure_ptr->filter_[0].high; + low_pass["checked"] = pressure_ptr->filter_[0].checked; + filter.append(low_pass); + QJsonObject high_pass; + high_pass["low"] = pressure_ptr->filter_[1].low; + high_pass["high"] = pressure_ptr->filter_[1].high; + high_pass["checked"] = pressure_ptr->filter_[1].checked; + filter.append(high_pass); + QJsonObject band_pass; + band_pass["low"] = pressure_ptr->filter_[2].low; + band_pass["high"] = pressure_ptr->filter_[2].high; + band_pass["checked"] = pressure_ptr->filter_[2].checked; + filter.append(band_pass); + variables["filter"] = filter; + QJsonObject sampling; + QJsonObject scaling; + sampling["fixed"] = pressure_ptr->fixed; + sampling["sample_rate"] = pressure_ptr->sample_rate; + sampling["band_width"] = pressure_ptr->bandwidth; + sampling["fft_points"] = pressure_ptr->fft_points; + sampling["spectral_synchron"] = pressure_ptr->spectral_synchron; + scaling["measuring_min"] = pressure_ptr->measuring_min; + scaling["measuring_max"] = pressure_ptr->measuring_max; + scaling["scale_min"] = pressure_ptr->scale_min; + scaling["scale_max"] = pressure_ptr->scale_max; + scaling["inherited"] = pressure_ptr->inherited; + variables["sampling"] = sampling; + variables["scaling"] = scaling; + } else { std::shared_ptr av_ptr = std::dynamic_pointer_cast(base_channel_ptr); if(av_ptr == nullptr){ @@ -319,10 +377,10 @@ void ConfigMgr::Save(QString & file_path) { if (base_ptr == nullptr) { continue; } - std::shared_ptr ptr = std::dynamic_pointer_cast(base_ptr); - if(ptr->single_relay_nok[ch].logic_expression != ""){ - qDebug() << "ch" << ch << ptr->single_relay_nok[ch].logic_expression; - channel_item.insert("logic_expression", ptr->single_relay_nok[ch].logic_expression); + std::shared_ptr ptr = std::dynamic_pointer_cast(base_ptr); + if(ptr->single_relay[ch].logic_expression != ""){ + qDebug() << "ch" << ch << ptr->single_relay[ch].logic_expression; + channel_item.insert("logic_expression", ptr->single_relay[ch].logic_expression); } }else if(card_type_[i] == kCardRelaySingle){ @@ -430,22 +488,37 @@ void ConfigMgr::Load(QString filename) { 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(); - vib_data->base_config_[j].keyphase = channel["keyphase"].toBool(); - vib_data->base_config_[j].keyphase_slot = channel["keyphase_slot"].toInt(); - vib_data->base_config_[j].keyphase_ch = channel["keyphase_ch"].toInt(); + //setpoint QJsonObject setpoint_data = channel["setpoint"].toObject(); - vib_data->alert_danger[j].direct_upper = setpoint_data["direct_upper"].toDouble(); - vib_data->alert_danger[j].direct_enable = setpoint_data["direct_enable"].toBool(); - vib_data->alert_danger[j].x1_ampl_upper = setpoint_data["1x_ampl_upper"].toDouble(); - vib_data->alert_danger[j].x1_ampl_lower = setpoint_data["1x_ampl_lower"].toDouble(); - vib_data->alert_danger[j].x1_ampl_enable = setpoint_data["1x_ampl_enable"].toBool(); - vib_data->alert_danger[j].x2_ampl_upper = setpoint_data["2x_ampl_upper"].toDouble(); - vib_data->alert_danger[j].x2_ampl_lower = setpoint_data["2x_ampl_lower"].toDouble(); - vib_data->alert_danger[j].x2_ampl_enable = setpoint_data["2x_ampl_enable"].toBool(); - vib_data->alert_danger[j].danger_param = setpoint_data["danger_param"].toInt(); - vib_data->alert_danger[j].danger_upper = setpoint_data["danger_upper"].toDouble(); - vib_data->alert_danger[j].danger_enable = setpoint_data["danger_enable"].toBool(); + if(vib_data->base_config_[j].channel_type == kVibRadial || vib_data->base_config_[j].channel_type == kVibThrust || + vib_data->base_config_[j].channel_type == kVibAcc ||vib_data->base_config_[j].channel_type == kVibVelocity ){ + vib_data->alert_danger[j].direct_upper = setpoint_data["direct_upper"].toDouble(); + vib_data->alert_danger[j].direct_enable = setpoint_data["direct_enable"].toBool(); + vib_data->alert_danger[j].x1_ampl_upper = setpoint_data["1x_ampl_upper"].toDouble(); + vib_data->alert_danger[j].x1_ampl_lower = setpoint_data["1x_ampl_lower"].toDouble(); + vib_data->alert_danger[j].x1_ampl_enable = setpoint_data["1x_ampl_enable"].toBool(); + vib_data->alert_danger[j].x2_ampl_upper = setpoint_data["2x_ampl_upper"].toDouble(); + vib_data->alert_danger[j].x2_ampl_lower = setpoint_data["2x_ampl_lower"].toDouble(); + vib_data->alert_danger[j].x2_ampl_enable = setpoint_data["2x_ampl_enable"].toBool(); + vib_data->alert_danger[j].danger_param = setpoint_data["danger_param"].toInt(); + vib_data->alert_danger[j].danger_upper = setpoint_data["danger_upper"].toDouble(); + vib_data->alert_danger[j].danger_enable = setpoint_data["danger_enable"].toBool(); + vib_data->base_config_[j].keyphase = channel["keyphase"].toBool(); + vib_data->base_config_[j].keyphase_slot = channel["keyphase_slot"].toInt(); + vib_data->base_config_[j].keyphase_ch = channel["keyphase_ch"].toInt(); + } + if(vib_data->base_config_[j].channel_type == kVibPressurePulsation){ + vib_data->alert_danger_press[j].low_upper = setpoint_data["low_upper"].toDouble(); + vib_data->alert_danger_press[j].low_enable = setpoint_data["low_enable"].toBool(); + vib_data->alert_danger_press[j].mid1_upper = setpoint_data["mid1_upper"].toDouble(); + vib_data->alert_danger_press[j].mid1_enable = setpoint_data["mid1_enable"].toBool(); + vib_data->alert_danger_press[j].mid2_upper = setpoint_data["mid2_upper"].toDouble(); + vib_data->alert_danger_press[j].mid2_enable = setpoint_data["mid2_enable"].toBool(); + vib_data->alert_danger_press[j].danger_param = setpoint_data["danger_param"].toInt(); + vib_data->alert_danger_press[j].danger_upper = setpoint_data["danger_upper"].toDouble(); + vib_data->alert_danger_press[j].danger_enable = setpoint_data["danger_enable"].toBool(); + } // variables QJsonObject tmp_variable = channel["variable"].toObject(); switch (vib_data->base_config_[j].channel_type) { @@ -508,6 +581,10 @@ void ConfigMgr::Load(QString filename) { variable->direct_.clamp_value = direct["clamp_value"].toDouble(); variable->direct_.custom = direct["custom"].toDouble(); + QJsonObject gap = tmp_variable["gap"].toObject(); + variable->gap_range.full_scale_range = direct["full_scale_range"].toInt(); + variable->gap_range.custom = direct["custom"].toDouble(); + QJsonObject recorder_out = tmp_variable["recorder_out"].toObject(); variable->recorder_out_.recorder_output = recorder_out["recorder_output"].toInt(); variable->recorder_out_.two_ma_clamp = recorder_out["two_ma_clamp"].toBool(); @@ -519,6 +596,34 @@ void ConfigMgr::Load(QString filename) { variable->alert_latching_ = latching["alert"].toBool(); variable->danger_latching_ = latching["danger"].toBool(); variable->timed_ok_ = latching["timed_ok"].toBool(); + variable->zero_position.value = tmp_variable["zero_position"].toDouble(); + vib_data->variables_.push_back(variable); + break; + } + case kVibPressurePulsation:{ + std::shared_ptr variable = std::make_shared(); + // filter + QJsonArray filter_array = tmp_variable["filter"].toArray(); + for (int k = 0; k < filter_array.size(); k++) { + QJsonObject filter_ele = filter_array[k].toObject(); + variable->filter_[k].low = filter_ele["low"].toInt(); + variable->filter_[k].high = filter_ele["high"].toInt(); + variable->filter_[k].checked = filter_ele["checked"].toBool(); + } + variable->id_ = j + 1; + QJsonObject sampling,scaling; + sampling = tmp_variable["sampling"].toObject(); + scaling = tmp_variable["scaling"].toObject(); + variable->fixed = sampling["fixed"].toBool(); + variable->sample_rate = sampling["sample_rate"].toInt(); + variable->bandwidth = sampling["band_width"].toInt(); + variable->fft_points = sampling["fft_points"].toInt(); + variable->spectral_synchron = sampling["spectral_synchron"].toBool(); + variable->measuring_min = scaling["measuring_min"].toInt(); + variable->measuring_max = scaling["measuring_max"].toInt(); + variable->scale_min = scaling["scale_min"].toInt(); + variable->scale_max = scaling["scale_max"].toInt(); + variable->inherited = scaling["inherited"].toBool(); vib_data->variables_.push_back(variable); break; } @@ -624,13 +729,13 @@ void ConfigMgr::Load(QString filename) { } cards_.push_back(keyphase_data); }else if (card_type_[i] == kCardRelaySingleNOK ){ - std::shared_ptr singlerelay_data = std::make_shared(); + std::shared_ptr singlerelay_data = std::make_shared(); singlerelay_data->slot_ = slot; singlerelay_data->card_type_ = static_cast(card_type_[i]); singlerelay_data->version_ = temp_obj["version"].toInt(); for (int j = 0; j < RELAY_COUNT; ++j) { channel = temp_obj[QString::number(j + 1)].toObject(); - singlerelay_data->single_relay_nok[j].logic_expression = channel["logic_expression"].toString(); + singlerelay_data->single_relay[j].logic_expression = channel["logic_expression"].toString(); } cards_.push_back(singlerelay_data); }else if(card_type_[i] == kCardRelaySingle){ diff --git a/data_config.h b/data_config.h index 6f7ef98..9285396 100644 --- a/data_config.h +++ b/data_config.h @@ -14,7 +14,15 @@ extern QString g_version; #define SLOT_NUM 15 #define CHANNEL_COUNT 4 #define RELAY_COUNT 16 - +struct ExprNode { + QString value; + QList children; +}; +struct ExprValidationResult { + bool isValid; + int errorPos; + QString errorMsg; +}; typedef enum { kCardNone = 0, kCardCpu = 1, @@ -161,6 +169,11 @@ typedef struct { float custom; } DirectImpl; +typedef struct{ + int full_scale_range; + float custom; +}GapRange; + typedef struct { bool checked; int full_scale_range; @@ -182,6 +195,10 @@ typedef struct { bool active_100ms; } Delay; +typedef struct { + float value; +} ZeroPosition; + typedef struct { bool rms_active; bool integrate_active; @@ -262,6 +279,28 @@ typedef struct VibAlertDanger_{ } } VibAlertDanger; +typedef struct VibAlertDangerPress_{ + float low_upper; + bool low_enable; + float mid1_upper; + bool mid1_enable; + float mid2_upper; + bool mid2_enable; + int danger_param; //0: 全频段OA + float danger_upper; + bool danger_enable; + VibAlertDangerPress_(){ + low_upper = 0.0; + low_enable = false; + mid1_upper = 0.0; + mid1_enable = false; + mid2_upper = 0.0; + mid2_enable = false; + danger_upper = 0.0; + danger_enable = false; + } +} VibAlertDangerPress; + typedef struct SpeedAlert_{ int speed_upper; int speed_lower; diff --git a/mainwindow.cpp b/mainwindow.cpp index e48be63..951a9ed 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -27,6 +27,7 @@ #include "ethconfig.h" #include "macconfig.h" #include +#include "setpoint_pressure.h" QString g_strServerIp; QString g_version; @@ -503,6 +504,12 @@ void MainWindow::OnButtonGroup(QAbstractButton *slot_btn) { break; } } +// std::shared_ptr ptr = std::dynamic_pointer_cast(base_ptr); +// if(ptr->base_config_[button_id].channel_type == kVibPressurePulsation){ +// SetpointPressure *setpoint_press = new SetpointPressure(button_id,ConfigMgr::Instance()->card_type_[button_id - 1]); +// setpoint_press->setWindowModality(Qt::ApplicationModal); +// setpoint_press->show(); +// } } if(slot_btn != NULL && ui->pushButton_point_name->isChecked()){ QString object_name = slot_btn->objectName(); diff --git a/pressure_pulsation.cpp b/pressure_pulsation.cpp new file mode 100644 index 0000000..b675df3 --- /dev/null +++ b/pressure_pulsation.cpp @@ -0,0 +1,142 @@ +#include "pressure_pulsation.h" +#include "ui_pressure_pulsation.h" +#include +#include +#include +#include + +#include "data_config.h" +#include "vibrationdata.h" +#include "config_mgr.h" + +PressurePulsation::PressurePulsation(int slot_no_, int channel_, bool active,QWidget *parent) : + QWidget(parent), + ui(new Ui::PressurePulsation) +{ + ui->setupUi(this); + slot_no = slot_no_; + channel = channel_; + QString chan = QString("%1").arg(channel); + QString slot = QString("%1").arg(slot_no); + ui->label_channel->setText(chan); + ui->label_slot->setText(slot); + if (active) { + ui->label_active->setText("(启用)"); + } else { + ui->label_active->setText("(停用)"); + } + Init(); +} + +PressurePulsation::~PressurePulsation() +{ + delete ui; +} +void PressurePulsation::Init() { + std::shared_ptr base_ptr = ConfigMgr::Instance()->GetSlotPtr(slot_no); + if (base_ptr == nullptr) { + qCritical() << "[Radial::Init] should not be here"; + return; + } + std::shared_ptr ptr = std::dynamic_pointer_cast(base_ptr); + if (ptr->base_config_[channel - 1].channel_type != kVibPressurePulsation) { + qDebug() << "[Radial::Init] channel type changes"; + return; + } + std::shared_ptr variable_base = ptr->GetChannelPtr(channel); + if (variable_base == nullptr) { + qDebug() << "[Radial::Init] no channel ptr"; + return; + } + std::shared_ptr variable_ptr = std::dynamic_pointer_cast(variable_base); + ui->checkBox_low_pass->setChecked(variable_ptr->filter_[0].checked); + ui->spinBox_low_pass_low->setValue(variable_ptr->filter_[0].low); + ui->spinBox_low_pass_high->setValue(variable_ptr->filter_[0].high); + ui->checkBox_high_pass->setChecked(variable_ptr->filter_[1].checked); + ui->spinBox_high_pass_low->setValue(variable_ptr->filter_[1].low); + ui->spinBox_high_pass_high->setValue(variable_ptr->filter_[1].high); + ui->checkBox_band_pass->setChecked(variable_ptr->filter_[2].checked); + ui->spinBox_band_pass_low->setValue(variable_ptr->filter_[2].low); + ui->spinBox_band_pass_high->setValue(variable_ptr->filter_[2].high); + ui->radioButton_fixed->setChecked(variable_ptr->fixed); + ui->lineEdit_sample_rate->setText(QString::number(variable_ptr->sample_rate)); + ui->lineEdit_bandwidth->setText(QString::number(variable_ptr->bandwidth)); + ui->comboBox_fft_points->setCurrentText(QString::number(variable_ptr->fft_points)); + ui->checkBox_spectral->setCheckable(variable_ptr->spectral_synchron); + ui->lineEdit_measuring_value_min->setText(QString::number(variable_ptr->measuring_min)); + ui->lineEdit_measuring_value_max->setText(QString::number(variable_ptr->measuring_max)); + ui->lineEdit_scale_value_min->setText(QString::number(variable_ptr->scale_min)); + ui->lineEdit_scale_value_max->setText(QString::number(variable_ptr->scale_max)); + ui->checkBox_inherited->setCheckable(variable_ptr->inherited); +} +void PressurePulsation::on_pushButton_confirm_clicked() +{ + std::shared_ptr base_ptr = ConfigMgr::Instance()->GetSlotPtr(slot_no); + if (base_ptr == nullptr) { + qCritical() << "[Radial::Init] should not be here"; + return; + } + std::shared_ptr ptr = std::dynamic_pointer_cast(base_ptr); + std::shared_ptr variable_base = ptr->GetChannelPtr(channel); + if (variable_base == nullptr || variable_base->type_ != kVibThrust) { + if (variable_base == nullptr) { + qDebug() << "no channel ptr"; + } else { + ptr->RemoveChannel(channel); + qDebug() << "channel type change"; + } + std::shared_ptr variable = std::make_shared(); + variable->id_ = channel; + variable->type_ = kVibPressurePulsation; + variable->filter_[0].checked = ui->checkBox_low_pass->checkState(); + variable->filter_[0].low = ui->spinBox_low_pass_low->value(); + variable->filter_[0].high = ui->spinBox_low_pass_high->value(); + variable->filter_[1].checked = ui->checkBox_high_pass->checkState(); + variable->filter_[1].low = ui->spinBox_high_pass_low->value(); + variable->filter_[1].high = ui->spinBox_high_pass_high->value(); + variable->filter_[2].checked = ui->checkBox_band_pass->checkState(); + variable->filter_[2].low = ui->spinBox_band_pass_low->value(); + variable->filter_[2].high = ui->spinBox_band_pass_high->value(); + variable->fixed = ui->radioButton_fixed->isChecked(); + variable->sample_rate = ui->lineEdit_sample_rate->text().toUInt(); + variable->bandwidth = ui->lineEdit_bandwidth->text().toInt(); + variable->fft_points = ui->comboBox_fft_points->currentText().toInt(); + variable->spectral_synchron = ui->checkBox_inherited->checkState(); + variable->measuring_min = ui->lineEdit_measuring_value_min->text().toInt(); + variable->measuring_max = ui->lineEdit_measuring_value_max->text().toInt(); + variable->scale_min = ui->lineEdit_scale_value_min->text().toInt(); + variable->scale_max = ui->lineEdit_scale_value_max->text().toInt(); + + ptr->variables_.push_back(variable); + this->close(); + return; + } + std::shared_ptr variable = std::dynamic_pointer_cast(variable_base); + variable->filter_[0].checked = ui->checkBox_low_pass->checkState(); + variable->filter_[0].low = ui->spinBox_low_pass_low->value(); + variable->filter_[0].high = ui->spinBox_low_pass_high->value(); + variable->filter_[1].checked = ui->checkBox_high_pass->checkState(); + variable->filter_[1].low = ui->spinBox_high_pass_low->value(); + variable->filter_[1].high = ui->spinBox_high_pass_high->value(); + variable->filter_[2].checked = ui->checkBox_band_pass->checkState(); + variable->filter_[2].low = ui->spinBox_band_pass_low->value(); + variable->filter_[2].high = ui->spinBox_band_pass_high->value(); + variable->fixed = ui->radioButton_fixed->isChecked(); + variable->sample_rate = ui->lineEdit_sample_rate->text().toUInt(); + variable->bandwidth = ui->lineEdit_bandwidth->text().toInt(); + variable->fft_points = ui->comboBox_fft_points->currentText().toInt(); + variable->spectral_synchron = ui->checkBox_inherited->checkState(); + variable->measuring_min = ui->lineEdit_measuring_value_min->text().toInt(); + variable->measuring_max = ui->lineEdit_measuring_value_max->text().toInt(); + variable->scale_min = ui->lineEdit_scale_value_min->text().toInt(); + variable->scale_max = ui->lineEdit_scale_value_max->text().toInt(); + + this->close(); +} + + +void PressurePulsation::on_pushButton_cancel_clicked() +{ + this->close(); +} + diff --git a/pressure_pulsation.h b/pressure_pulsation.h new file mode 100644 index 0000000..8bdbcaa --- /dev/null +++ b/pressure_pulsation.h @@ -0,0 +1,30 @@ +#ifndef PRESSURE_PULSATION_H +#define PRESSURE_PULSATION_H + +#include + +namespace Ui { +class PressurePulsation; +} + +class PressurePulsation : public QWidget +{ + Q_OBJECT + +public: + explicit PressurePulsation(int slot_no_, int channel_, bool active,QWidget *parent = nullptr); + ~PressurePulsation(); + int slot_no; + int channel; + +private slots: + void on_pushButton_confirm_clicked(); + + void on_pushButton_cancel_clicked(); + +private: + Ui::PressurePulsation *ui; + void Init(); +}; + +#endif // PRESSURE_PULSATION_H diff --git a/pressure_pulsation.ui b/pressure_pulsation.ui new file mode 100644 index 0000000..3508192 --- /dev/null +++ b/pressure_pulsation.ui @@ -0,0 +1,807 @@ + + + PressurePulsation + + + + 0 + 0 + 701 + 519 + + + + Form + + + + + 351 + 10 + 63 + 17 + + + + + + + 槽位号: + + + + + + + 3 + + + + + + + + + 31 + 10 + 105 + 17 + + + + + + + 通道: + + + + + + + 1 + + + + + + + (启用) + + + + + + + + + 30 + 450 + 632 + 37 + + + + + + + + 100 + 35 + + + + 确定 + + + + + + + false + + + + 100 + 35 + + + + 设置为默认值 + + + + + + + + 100 + 35 + + + + 取消 + + + + + + + false + + + + 100 + 35 + + + + 打印 + + + + + + + false + + + + 100 + 35 + + + + 帮助 + + + + + + + + + 20 + 60 + 651 + 381 + + + + 1 + + + + 传感器和滤波配置 + + + + + 10 + 30 + 353 + 116 + + + + 滤波 + + + + + + + + 高通: + + + + + + + + 60 + 0 + + + + + 60 + 16777215 + + + + 3 + + + 3000 + + + + + + + - + + + + + + + + 60 + 0 + + + + + 60 + 16777215 + + + + 3 + + + 3000 + + + 3000 + + + + + + + 3 - 3000Hz + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + 低通: + + + + + + + + 60 + 0 + + + + + 60 + 16777215 + + + + + + + + - + + + + + + + + 60 + 0 + + + + + 60 + 16777215 + + + + + + + + 30 - 30000Hz + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + 带通: + + + + + + + + 60 + 0 + + + + 3 + + + 3000 + + + + + + + - + + + + + + + + 60 + 0 + + + + 3 + + + 3000 + + + 3000 + + + + + + + 3 - 3000Hz + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + 特征值和警报配置 + + + + + 10 + 10 + 471 + 191 + + + + 采样频率 + + + + + 20 + 30 + 397 + 24 + + + + + + + 固定 + + + + + + + + + 采样率: + + + + + + + + 100 + 20 + + + + + + + + Hz + + + + + + + + + + + 带宽: + + + + + + + + 100 + 20 + + + + + + + + Hz + + + + + + + + + + + 20 + 70 + 118 + 22 + + + + + + + FFT 点数: + + + + + + + + 8192 + + + + + + + + + + 20 + 100 + 122 + 14 + + + + + + + 频率范围: + + + + + + + 5000 Hz + + + + + + + + + 20 + 130 + 92 + 14 + + + + + + + 线数: + + + + + + + 1250 Hz + + + + + + + + + 20 + 160 + 104 + 14 + + + + + + + 频率分辨率: + + + + + + + 4 Hz + + + + + + + + + 170 + 70 + 141 + 16 + + + + 光谱同步时间值 + + + + + + + 10 + 219 + 471 + 121 + + + + 测量 + + + + + 20 + 40 + 54 + 12 + + + + 最小: + + + + + + 20 + 80 + 54 + 12 + + + + 最大: + + + + + + 90 + 20 + 54 + 12 + + + + 测量值 + + + + + + 230 + 20 + 54 + 12 + + + + 对应值 + + + + + + 70 + 40 + 81 + 20 + + + + + + + 210 + 40 + 81 + 20 + + + + + + + 70 + 80 + 81 + 20 + + + + + + + 210 + 80 + 81 + 20 + + + + + + + 310 + 40 + 54 + 12 + + + + mbar + + + + + + 310 + 80 + 54 + 12 + + + + mbar + + + + + + 160 + 40 + 31 + 16 + + + + mV + + + + + + 160 + 80 + 31 + 16 + + + + mV + + + + + + 360 + 50 + 71 + 16 + + + + 继承 + + + + + + + + + diff --git a/seismic_monitor.cpp b/seismic_monitor.cpp index dfc62ce..68302e8 100644 --- a/seismic_monitor.cpp +++ b/seismic_monitor.cpp @@ -13,6 +13,8 @@ #include "config_mgr.h" #include "vibrationdata.h" #include "trust.h" +#include +#include "pressure_pulsation.h" Seismic_monitor::Seismic_monitor(int slot,int cardtype, QWidget *parent) : QWidget(parent), @@ -49,7 +51,6 @@ void Seismic_monitor::Init() { // ui->comboBox_transducer_name_3->addItem(vec_transducer[var].transducer_name); // ui->comboBox_transducer_name_4->addItem(vec_transducer[var].transducer_name); // } - int slot = 0; std::shared_ptr base_ptr = ConfigMgr::Instance()->GetSlotPtr(slot_no); if (base_ptr == nullptr) { qDebug() << "base_ptr"; @@ -61,18 +62,7 @@ void Seismic_monitor::Init() { UpdateData(vib_data); return; } - for (int i = 0; i < SLOT_NUM; ++i) { - if (ConfigMgr::Instance()->card_type_[i] == kCardNone) { - continue; - } - QJsonObject card_item; - slot = i + 1; - card_item["type"] = ConfigMgr::Instance()->card_type_[i]; - card_item["slot"] = slot; - if (ConfigMgr::Instance()->card_type_[i] == kCardKeyphaseSingle ) { - ui->comboBox_keyphase_slot->addItem(QString::number(slot)); - } - } + std::shared_ptr vib_data = std::dynamic_pointer_cast(base_ptr); for (int i = 0; i < CHANNEL_COUNT; i++) { if (i + 1 == 1) { @@ -193,6 +183,25 @@ void Seismic_monitor::on_pushButton_confirm_clicked() { // UpdateData(vib_data); return; } + + if (ConfigMgr::Instance()->card_type_[ui->comboBox_keyphase_slot->currentText().toInt()] != kCardKeyphaseSingle && ui->checkBox_keyphase->isChecked()) { + QMessageBox::information(this, QStringLiteral("提示"), "第一通道键相槽位选择错误!"); + return; + } + if (ConfigMgr::Instance()->card_type_[ui->comboBox_keyphase_slot_2->currentText().toInt()] != kCardKeyphaseSingle && ui->checkBox_keyphase_2->isChecked()) { + QMessageBox::information(this, QStringLiteral("提示"), "第二通道键相槽位选择错误!"); + return; + } + if (ConfigMgr::Instance()->card_type_[ui->comboBox_keyphase_slot_3->currentText().toInt()] != kCardKeyphaseSingle && ui->checkBox_keyphase_3->isChecked()) { + QMessageBox::information(this, QStringLiteral("提示"), "第三通道键相槽位选择错误!"); + return; + } + if (ConfigMgr::Instance()->card_type_[ui->comboBox_keyphase_slot_4->currentText().toInt()] != kCardKeyphaseSingle && ui->checkBox_keyphase_4->isChecked()) { + QMessageBox::information(this, QStringLiteral("提示"), "第四通道键相槽位选择错误!"); + return; + } + + std::shared_ptr vib_data = std::dynamic_pointer_cast(base_ptr); UpdateData(vib_data); this->close(); @@ -219,6 +228,10 @@ void Seismic_monitor::on_pushButton_config_1_clicked() { Trust *trust = new Trust(slot_no, channel, ui->checkBox_enable_1->isChecked()); trust->setWindowModality(Qt::ApplicationModal); trust->show(); + }else if (ui->comboBox_chan_type_1->currentIndex() == kVibPressurePulsation) { + PressurePulsation *pressure_pulsation = new PressurePulsation(slot_no, channel, ui->checkBox_enable_1->isChecked()); + pressure_pulsation->setWindowModality(Qt::ApplicationModal); + pressure_pulsation->show(); } } @@ -237,9 +250,13 @@ void Seismic_monitor::on_pushButton_config_2_clicked() { velocity->setWindowModality(Qt::ApplicationModal); velocity->show(); }else if (ui->comboBox_chan_type_2->currentIndex() == kVibThrust) { - Trust *trust = new Trust(slot_no, channel, ui->checkBox_enable_1->isChecked()); + Trust *trust = new Trust(slot_no, channel, ui->checkBox_enable_2->isChecked()); trust->setWindowModality(Qt::ApplicationModal); trust->show(); + }else if (ui->comboBox_chan_type_2->currentIndex() == kVibPressurePulsation) { + PressurePulsation *pressure_pulsation = new PressurePulsation(slot_no, channel, ui->checkBox_enable_2->isChecked()); + pressure_pulsation->setWindowModality(Qt::ApplicationModal); + pressure_pulsation->show(); } } @@ -258,9 +275,13 @@ void Seismic_monitor::on_pushButton_config_3_clicked() { velocity->setWindowModality(Qt::ApplicationModal); velocity->show(); }else if (ui->comboBox_chan_type_3->currentIndex() == kVibThrust) { - Trust *trust = new Trust(slot_no, channel, ui->checkBox_enable_1->isChecked()); + Trust *trust = new Trust(slot_no, channel, ui->checkBox_enable_3->isChecked()); trust->setWindowModality(Qt::ApplicationModal); trust->show(); + }else if (ui->comboBox_chan_type_3->currentIndex() == kVibPressurePulsation) { + PressurePulsation *pressure_pulsation = new PressurePulsation(slot_no, channel, ui->checkBox_enable_3->isChecked()); + pressure_pulsation->setWindowModality(Qt::ApplicationModal); + pressure_pulsation->show(); } } @@ -279,9 +300,13 @@ void Seismic_monitor::on_pushButton_config_4_clicked() { velocity->setWindowModality(Qt::ApplicationModal); velocity->show(); }else if (ui->comboBox_chan_type_4->currentIndex() == kVibThrust) { - Trust *trust = new Trust(slot_no, channel, ui->checkBox_enable_1->isChecked()); + Trust *trust = new Trust(slot_no, channel, ui->checkBox_enable_4->isChecked()); trust->setWindowModality(Qt::ApplicationModal); trust->show(); + }else if (ui->comboBox_chan_type_4->currentIndex() == kVibPressurePulsation) { + PressurePulsation *pressure_pulsation = new PressurePulsation(slot_no, channel, ui->checkBox_enable_4->isChecked()); + pressure_pulsation->setWindowModality(Qt::ApplicationModal); + pressure_pulsation->show(); } } @@ -289,15 +314,22 @@ void Seismic_monitor::on_comboBox_chan_type_1_currentTextChanged(const QString & switch (ui->comboBox_chan_type_1->currentIndex()) { case kVibRadial: ui->label_unit_1->setText("mV / mm"); + EnableKeyphase(); break; case kVibAcc: ui->label_unit_1->setText("mV / m/s^2"); + EnableKeyphase(); break; case kVibVelocity: ui->label_unit_1->setText("mV / mm/s"); + EnableKeyphase(); break; case kVibThrust: ui->label_unit_1->setText("mV / mil"); + DisableKeyphase(); + break; + case kVibPressurePulsation: + DisableKeyphase(); break; } } @@ -306,15 +338,22 @@ void Seismic_monitor::on_comboBox_chan_type_2_currentTextChanged(const QString & switch (ui->comboBox_chan_type_2->currentIndex()) { case kVibRadial: ui->label_unit_2->setText("mV / mm"); + EnableKeyphase(); break; case kVibAcc: ui->label_unit_2->setText("mV / m/s^2"); + EnableKeyphase2(); break; case kVibVelocity: ui->label_unit_2->setText("mV / mm/s"); + EnableKeyphase2(); break; case kVibThrust: ui->label_unit_2->setText("mV / mil"); + DisableKeyphase2(); + break; + case kVibPressurePulsation: + DisableKeyphase2(); break; } } @@ -323,15 +362,22 @@ void Seismic_monitor::on_comboBox_chan_type_3_currentTextChanged(const QString & switch (ui->comboBox_chan_type_3->currentIndex()) { case kVibRadial: ui->label_unit_3->setText("mV / mm"); + EnableKeyphase(); break; case kVibAcc: ui->label_unit_3->setText("mV / m/s^2"); + EnableKeyphase3(); break; case kVibVelocity: ui->label_unit_3->setText("mV / mm/s"); + EnableKeyphase3(); break; case kVibThrust: ui->label_unit_3->setText("mV / mil"); + DisableKeyphase3(); + break; + case kVibPressurePulsation: + DisableKeyphase3(); break; } } @@ -340,15 +386,22 @@ void Seismic_monitor::on_comboBox_chan_type_4_currentTextChanged(const QString & switch (ui->comboBox_chan_type_4->currentIndex()) { case kVibRadial: ui->label_unit_4->setText("mV / mm"); + EnableKeyphase4(); break; case kVibAcc: ui->label_unit_4->setText("mV / m/s^2"); + EnableKeyphase4(); break; case kVibVelocity: ui->label_unit_4->setText("mV / mm/s"); + EnableKeyphase4(); break; case kVibThrust: ui->label_unit_4->setText("mV / mil"); + DisableKeyphase4(); + break; + case kVibPressurePulsation: + DisableKeyphase4(); break; } } @@ -393,17 +446,20 @@ void Seismic_monitor::EnableKeyphase(){ ui->checkBox_keyphase->setEnabled(true); ui->comboBox_keyphase_ch->setEnabled(true); ui->comboBox_keyphase_slot->setEnabled(true); - +} +void Seismic_monitor::EnableKeyphase2(){ ui->checkBox_keyphase_2->setCheckable(true); ui->checkBox_keyphase_2->setEnabled(true); ui->comboBox_keyphase_ch_2->setEnabled(true); ui->comboBox_keyphase_slot_2->setEnabled(true); - +} +void Seismic_monitor::EnableKeyphase3(){ ui->checkBox_keyphase_3->setCheckable(true); ui->checkBox_keyphase_3->setEnabled(true); ui->comboBox_keyphase_ch_3->setEnabled(true); ui->comboBox_keyphase_slot_3->setEnabled(true); - +} +void Seismic_monitor::EnableKeyphase4(){ ui->checkBox_keyphase_4->setCheckable(true); ui->checkBox_keyphase_4->setEnabled(true); ui->comboBox_keyphase_ch_4->setEnabled(true); @@ -414,17 +470,21 @@ void Seismic_monitor::DisableKeyphase(){ ui->checkBox_keyphase->setEnabled(false); ui->comboBox_keyphase_ch->setEnabled(false); ui->comboBox_keyphase_slot->setEnabled(false); - +} +void Seismic_monitor::DisableKeyphase2(){ ui->checkBox_keyphase_2->setCheckable(false); ui->checkBox_keyphase_2->setEnabled(false); ui->comboBox_keyphase_ch_2->setEnabled(false); ui->comboBox_keyphase_slot_2->setEnabled(false); - +} +void Seismic_monitor::DisableKeyphase3(){ ui->checkBox_keyphase_3->setCheckable(false); ui->checkBox_keyphase_3->setEnabled(false); ui->comboBox_keyphase_ch_3->setEnabled(false); ui->comboBox_keyphase_slot_3->setEnabled(false); +} +void Seismic_monitor::DisableKeyphase4(){ ui->checkBox_keyphase_4->setCheckable(false); ui->checkBox_keyphase_4->setEnabled(false); ui->comboBox_keyphase_ch_4->setEnabled(false); diff --git a/seismic_monitor.h b/seismic_monitor.h index c97ae69..b18441d 100644 --- a/seismic_monitor.h +++ b/seismic_monitor.h @@ -58,7 +58,13 @@ class Seismic_monitor : public QWidget { QVector vec_transducer; void Init(); void EnableKeyphase(); + void EnableKeyphase2(); + void EnableKeyphase3(); + void EnableKeyphase4(); void DisableKeyphase(); + void DisableKeyphase2(); + void DisableKeyphase3(); + void DisableKeyphase4(); }; #endif // SEISMIC_MONITOR_H diff --git a/seismic_monitor.ui b/seismic_monitor.ui index 7989d29..c67cddc 100644 --- a/seismic_monitor.ui +++ b/seismic_monitor.ui @@ -402,6 +402,11 @@ 轴向位移 + + + 动态压力脉动 + + @@ -658,7 +663,83 @@ - + + + + 1 + + + + + 2 + + + + + 3 + + + + + 4 + + + + + 5 + + + + + 6 + + + + + 7 + + + + + 8 + + + + + 9 + + + + + 10 + + + + + 11 + + + + + 12 + + + + + 13 + + + + + 14 + + + + + 15 + + + @@ -876,6 +957,11 @@ 轴向位移 + + + 动态压力脉动 + + @@ -1129,7 +1215,83 @@ - + + + + 1 + + + + + 2 + + + + + 3 + + + + + 4 + + + + + 5 + + + + + 6 + + + + + 7 + + + + + 8 + + + + + 9 + + + + + 10 + + + + + 11 + + + + + 12 + + + + + 13 + + + + + 14 + + + + + 15 + + + @@ -1547,6 +1709,11 @@ 轴向位移 + + + 动态压力脉动 + + @@ -1797,7 +1964,83 @@ - + + + + 1 + + + + + 2 + + + + + 3 + + + + + 4 + + + + + 5 + + + + + 6 + + + + + 7 + + + + + 8 + + + + + 9 + + + + + 10 + + + + + 11 + + + + + 12 + + + + + 13 + + + + + 14 + + + + + 15 + + + @@ -2015,6 +2258,11 @@ 轴向位移 + + + 动态压力脉动 + + @@ -2265,7 +2513,83 @@ - + + + + 1 + + + + + 2 + + + + + 3 + + + + + 4 + + + + + 5 + + + + + 6 + + + + + 7 + + + + + 8 + + + + + 9 + + + + + 10 + + + + + 11 + + + + + 12 + + + + + 13 + + + + + 14 + + + + + 15 + + + diff --git a/setpoint.cpp b/setpoint.cpp index 591a014..a9cdd04 100644 --- a/setpoint.cpp +++ b/setpoint.cpp @@ -26,12 +26,12 @@ Setpoint::Setpoint(int slot_no_,int cardtype,QWidget *parent) : Setpoint::~Setpoint() { - if(slider_direct != nullptr) - delete slider_direct; - if(slider_1x_ampl != nullptr) - delete slider_1x_ampl; - if(slider_2x_ampl != nullptr) - delete slider_2x_ampl; + if(slider_1st != nullptr) + delete slider_1st; + if(slider_2nd != nullptr) + delete slider_2nd; + if(slider_3rd != nullptr) + delete slider_3rd; if(slider_danger != nullptr) delete slider_danger; delete ui; @@ -39,57 +39,55 @@ Setpoint::~Setpoint() void Setpoint::Init(){ QVBoxLayout *layout_direct = new QVBoxLayout(ui->widget_direct); - slider_direct = new RangeSlider; - layout_direct->addWidget(slider_direct); + slider_1st = new RangeSlider; + layout_direct->addWidget(slider_1st); QVBoxLayout *layout_1x_ampl = new QVBoxLayout(ui->widget_1x_ampl); - slider_1x_ampl = new RangeSlider; - layout_1x_ampl->addWidget(slider_1x_ampl); + slider_2nd = new RangeSlider; + layout_1x_ampl->addWidget(slider_2nd); QVBoxLayout *layout_2x_ampl = new QVBoxLayout(ui->widget_2x_ampl); - slider_2x_ampl = new RangeSlider; - layout_2x_ampl->addWidget(slider_2x_ampl); + slider_3rd = new RangeSlider; + layout_2x_ampl->addWidget(slider_3rd); QVBoxLayout *layout_danger = new QVBoxLayout(ui->widget_danger); slider_danger = new RangeSlider(1); layout_danger->addWidget(slider_danger); std::shared_ptr base_ptr = ConfigMgr::Instance()->GetSlotPtr(slot_no); - vib_alert_ptr = std::dynamic_pointer_cast(base_ptr); - switch (car_type) { case kCardVibSingle:{ - update(); + update(); }break; } - QObject::connect(ui->lineEdit_direct_upper, &QLineEdit::editingFinished, [&]() { - slider_direct->setUpperValue(ui->lineEdit_direct_upper->text().toFloat()); + QObject::connect(ui->lineEdit_1st_upper, &QLineEdit::editingFinished, [&]() { + slider_1st->setUpperValue(ui->lineEdit_1st_upper->text().toFloat()); }); - QObject::connect(slider_direct, &RangeSlider::rangeChanged, [&](float low,float high) { - ui->lineEdit_direct_upper->setText(QString::number(high)); + QObject::connect(slider_1st, &RangeSlider::rangeChanged, [&](float low,float high) { + ui->lineEdit_1st_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(slider_2nd, &RangeSlider::rangeChanged, [&](float low, float high) { + ui->lineEdit_2nd_upper->setText(QString::number(high)); + ui->lineEdit_2nd_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_2nd_upper, &QLineEdit::editingFinished, [&]() { + slider_2nd->setUpperValue(ui->lineEdit_2nd_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(ui->lineEdit_2nd_lower, &QLineEdit::editingFinished, [&]() { + slider_2nd->setLowerValue(ui->lineEdit_2nd_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(slider_3rd, &RangeSlider::rangeChanged, [&](float low, float high) { + ui->lineEdit_3rd_upper->setText(QString::number(high)); + ui->lineEdit_3rd_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_3rd_upper, &QLineEdit::editingFinished, [&]() { + slider_2nd->setUpperValue(ui->lineEdit_3rd_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(ui->lineEdit_3rd_lower, &QLineEdit::editingFinished, [&]() { + slider_2nd->setLowerValue(ui->lineEdit_3rd_lower->text().toFloat()); }); QObject::connect(slider_danger, &RangeSlider::rangeChanged, [&](float low,float high) { @@ -102,22 +100,32 @@ void Setpoint::Init(){ 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(); + std::shared_ptr base_ptr = ConfigMgr::Instance()->GetSlotPtr(slot_no); + std::shared_ptr setpoint_data = std::dynamic_pointer_cast(base_ptr); + if(setpoint_data->base_config_[current_index].channel_type == kVibPressurePulsation){ + setpoint_data->alert_danger_press[current_index].low_upper = ui->lineEdit_1st_upper->text().toFloat(); + setpoint_data->alert_danger_press[current_index].low_enable = ui->checkBox_1st->checkState(); + setpoint_data->alert_danger_press[current_index].mid1_upper = ui->lineEdit_2nd_upper->text().toFloat(); + setpoint_data->alert_danger_press[current_index].mid1_enable = ui->checkBox_2nd->checkState(); + setpoint_data->alert_danger_press[current_index].mid2_upper = ui->lineEdit_3rd_upper->text().toFloat(); + setpoint_data->alert_danger_press[current_index].mid2_enable = ui->checkBox_3rd->checkState(); + setpoint_data->alert_danger_press[current_index].danger_param = ui->comboBox_danger->currentIndex(); + setpoint_data->alert_danger_press[current_index].danger_upper = ui->lineEdit_danger_upper->text().toFloat(); + setpoint_data->alert_danger_press[current_index].danger_enable = ui->checkBox_danger->checkState(); + }else{ + setpoint_data->alert_danger[current_index].direct_upper = ui->lineEdit_1st_upper->text().toFloat(); + setpoint_data->alert_danger[current_index].direct_enable = ui->checkBox_1st->checkState(); + setpoint_data->alert_danger[current_index].x1_ampl_upper = ui->lineEdit_2nd_upper->text().toFloat(); + setpoint_data->alert_danger[current_index].x1_ampl_lower = ui->lineEdit_2nd_lower->text().toFloat(); + setpoint_data->alert_danger[current_index].x1_ampl_enable = ui->checkBox_2nd->checkState(); + setpoint_data->alert_danger[current_index].x2_ampl_upper = ui->lineEdit_3rd_upper->text().toFloat(); + setpoint_data->alert_danger[current_index].x2_ampl_lower = ui->lineEdit_3rd_lower->text().toFloat(); + setpoint_data->alert_danger[current_index].x2_ampl_enable = ui->checkBox_3rd->checkState(); + setpoint_data->alert_danger[current_index].danger_param = ui->comboBox_danger->currentIndex(); + setpoint_data->alert_danger[current_index].danger_upper = ui->lineEdit_danger_upper->text().toFloat(); + setpoint_data->alert_danger[current_index].danger_enable = ui->checkBox_danger->checkState(); + } this->close(); } @@ -134,20 +142,34 @@ 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(); - + std::shared_ptr base_ptr = ConfigMgr::Instance()->GetSlotPtr(slot_no); + std::shared_ptr setpoint_data = std::dynamic_pointer_cast(base_ptr); + if(setpoint_data->base_config_[current_index].channel_type == kVibPressurePulsation){ + setpoint_data->alert_danger_press[current_index].low_upper = ui->lineEdit_1st_upper->text().toFloat(); + setpoint_data->alert_danger_press[current_index].low_enable = ui->checkBox_1st->checkState(); + setpoint_data->alert_danger_press[current_index].mid1_upper = ui->lineEdit_2nd_upper->text().toFloat(); + setpoint_data->alert_danger_press[current_index].mid1_enable = ui->checkBox_2nd->checkState(); + setpoint_data->alert_danger_press[current_index].mid2_upper = ui->lineEdit_3rd_upper->text().toFloat(); + setpoint_data->alert_danger_press[current_index].mid2_enable = ui->checkBox_3rd->checkState(); + setpoint_data->alert_danger_press[current_index].danger_param = ui->comboBox_danger->currentIndex(); + setpoint_data->alert_danger_press[current_index].danger_upper = ui->lineEdit_danger_upper->text().toFloat(); + setpoint_data->alert_danger_press[current_index].danger_enable = ui->checkBox_danger->checkState(); + }else{ + setpoint_data->alert_danger[current_index].direct_upper = ui->lineEdit_1st_upper->text().toFloat(); + setpoint_data->alert_danger[current_index].direct_enable = ui->checkBox_1st->checkState(); + setpoint_data->alert_danger[current_index].x1_ampl_upper = ui->lineEdit_2nd_upper->text().toFloat(); + setpoint_data->alert_danger[current_index].x1_ampl_lower = ui->lineEdit_2nd_lower->text().toFloat(); + setpoint_data->alert_danger[current_index].x1_ampl_enable = ui->checkBox_2nd->checkState(); + setpoint_data->alert_danger[current_index].x2_ampl_upper = ui->lineEdit_3rd_upper->text().toFloat(); + setpoint_data->alert_danger[current_index].x2_ampl_lower = ui->lineEdit_3rd_lower->text().toFloat(); + setpoint_data->alert_danger[current_index].x2_ampl_enable = ui->checkBox_3rd->checkState(); + setpoint_data->alert_danger[current_index].danger_param = ui->comboBox_danger->currentIndex(); + setpoint_data->alert_danger[current_index].danger_upper = ui->lineEdit_danger_upper->text().toFloat(); + setpoint_data->alert_danger[current_index].danger_enable = ui->checkBox_danger->checkState(); + } current_index = index; update(); + } void Setpoint::update() { @@ -161,218 +183,300 @@ void Setpoint::update() return; } if(!variable_[chan]->x1_.checked){ - ui->checkBox_1x_ampl->setEnabled(false); - ui->lineEdit_1x_ampl_lower->setEnabled(false); - ui->lineEdit_1x_ampl_upper->setEnabled(false); + ui->checkBox_1st->setEnabled(false); + ui->lineEdit_2nd_lower->setEnabled(false); + ui->lineEdit_2nd_upper->setEnabled(false); } if(!variable_[chan]->x2_.checked){ - ui->checkBox_2x_ampl->setEnabled(false); - ui->lineEdit_2x_ampl_upper->setEnabled(false); - ui->lineEdit_2x_ampl_lower->setEnabled(false); + ui->checkBox_2nd->setEnabled(false); + ui->lineEdit_3rd_upper->setEnabled(false); + ui->lineEdit_3rd_lower->setEnabled(false); } if(setpoint_data->base_config_[chan].channel_type == kVibRadial){ - + EnableNormal(); + ShowSlider(); if(variable_[chan]->direct_.full_scale_range == 0){ - slider_direct->setRange(0,100); + slider_1st->setRange(0,100); slider_danger->setRange(0,100); }else if(variable_[chan]->direct_.full_scale_range == 1){ - slider_direct->setRange(0,150); + slider_1st->setRange(0,150); slider_danger->setRange(0,150); }else if(variable_[chan]->direct_.full_scale_range == 2){ - slider_direct->setRange(0,200); + slider_1st->setRange(0,200); slider_danger->setRange(0,200); }else if(variable_[chan]->direct_.full_scale_range == 3){ - slider_direct->setRange(0,400); + slider_1st->setRange(0,400); slider_danger->setRange(0,400); }else if(variable_[chan]->direct_.full_scale_range == 4){ - slider_direct->setRange(0,500); + slider_1st->setRange(0,500); slider_danger->setRange(0,500); } - ui->label_direct->setText("um"); + ui->label_unit_1st->setText("um"); ui->label_danger->setText("um"); } if(setpoint_data->base_config_[chan].channel_type == kVibThrust){ - ui->label_27->hide(); - ui->label_1x->hide(); - ui->lineEdit_1x_ampl_upper->hide(); + EnableNormal(); + ui->label_2nd->hide(); + ui->label_unit_2nd->hide(); + ui->lineEdit_2nd_upper->hide(); ui->widget_1x_ampl->hide(); - ui->lineEdit_1x_ampl_lower->hide(); - ui->checkBox_1x_ampl->hide(); - - ui->label_32->hide(); - ui->label_2x->hide(); - ui->lineEdit_2x_ampl_upper->hide(); + ui->lineEdit_2nd_lower->hide(); + ui->checkBox_2nd->hide(); + ui->label_3rd->hide(); + ui->label_unit_3rd->hide(); + ui->lineEdit_3rd_upper->hide(); ui->widget_2x_ampl->hide(); - ui->lineEdit_2x_ampl_lower->hide(); - ui->checkBox_2x_ampl->hide(); - ui->label_direct->setText("mil"); + ui->lineEdit_3rd_lower->hide(); + ui->checkBox_3rd->hide(); + ui->label_unit_1st->setText("mil"); ui->label_danger->setText("mil"); if(variable_[chan]->direct_.full_scale_range == 0){ - slider_direct->setRange(-25,25); + slider_1st->setRange(-25,25); slider_danger->setRange(-25,25); }else if(variable_[chan]->direct_.full_scale_range == 1){ - slider_direct->setRange(-30,30); + slider_1st->setRange(-30,30); slider_danger->setRange(-30,30); }else if(variable_[chan]->direct_.full_scale_range == 2){ - slider_direct->setRange(-40,40); + slider_1st->setRange(-40,40); slider_danger->setRange(-40,40); }else if(variable_[chan]->direct_.full_scale_range == 3){ - ui->label_direct->setText("mm"); + ui->label_unit_1st->setText("mm"); ui->label_danger->setText("mm"); - slider_direct->setRange(-0.5,0.5); + slider_1st->setRange(-0.5,0.5); slider_danger->setRange(-0.5,0.5); }else if(variable_[chan]->direct_.full_scale_range == 4){ - ui->label_direct->setText("mm"); + ui->label_unit_1st->setText("mm"); ui->label_danger->setText("mm"); - slider_direct->setRange(-1,1); + slider_1st->setRange(-1,1); slider_danger->setRange(-1,1); } - - } if(setpoint_data->base_config_[chan].channel_type == kVibAcc){ + EnableNormal(); + ShowSlider(); std::shared_ptr base_channel_ptr = setpoint_data->GetChannelPtr(chan + 1); std::shared_ptr av_ptr = std::dynamic_pointer_cast(base_channel_ptr); if(variable_[chan]->direct_.full_scale_range == 0){ - slider_direct->setRange(0,20); + slider_1st->setRange(0,20); slider_danger->setRange(0,20); }else if(variable_[chan]->direct_.full_scale_range == 1){ - slider_direct->setRange(0,50); + slider_1st->setRange(0,50); slider_danger->setRange(0,50); }else if(variable_[chan]->direct_.full_scale_range == 2){ - slider_direct->setRange(0,100); + slider_1st->setRange(0,100); slider_danger->setRange(0,100); }else if(variable_[chan]->direct_.full_scale_range == 3){ - slider_direct->setRange(0,200); + slider_1st->setRange(0,200); slider_danger->setRange(0,200); }else if(variable_[chan]->direct_.full_scale_range == 4){ - slider_direct->setRange(0,250); + slider_1st->setRange(0,250); slider_danger->setRange(0,250); }else if(variable_[chan]->direct_.full_scale_range == 5){ - slider_direct->setRange(0,400); + slider_1st->setRange(0,400); slider_danger->setRange(0,400); } - ui->label_direct->setText("m/s^2 pk"); + ui->label_unit_1st->setText("m/s^2 pk"); ui->label_danger->setText("m/s^2 pk"); if(av_ptr->rms_active_){ if(variable_[chan]->direct_.full_scale_range == 0){ - slider_direct->setRange(0,20); + slider_1st->setRange(0,20); slider_danger->setRange(0,20); }else if(variable_[chan]->direct_.full_scale_range == 1){ - slider_direct->setRange(0,50); + slider_1st->setRange(0,50); slider_danger->setRange(0,50); }else if(variable_[chan]->direct_.full_scale_range == 2){ - slider_direct->setRange(0,100); + slider_1st->setRange(0,100); slider_danger->setRange(0,100); }else if(variable_[chan]->direct_.full_scale_range == 3){ - slider_direct->setRange(0,200); + slider_1st->setRange(0,200); slider_danger->setRange(0,200); } - ui->label_direct->setText("m/s^2 rms"); + ui->label_unit_1st->setText("m/s^2 rms"); ui->label_danger->setText("m/s^2 rms"); } if(av_ptr->integrate_active_){ if(variable_[chan]->direct_.full_scale_range == 0){ - slider_direct->setRange(0,25); + slider_1st->setRange(0,25); slider_danger->setRange(0,25); }else if(variable_[chan]->direct_.full_scale_range == 1){ - slider_direct->setRange(0,50); + slider_1st->setRange(0,50); slider_danger->setRange(0,50); }else if(variable_[chan]->direct_.full_scale_range == 2){ - slider_direct->setRange(0,100); + slider_1st->setRange(0,100); slider_danger->setRange(0,100); } - ui->label_direct->setText("mm/s pk"); + ui->label_unit_1st->setText("mm/s pk"); ui->label_danger->setText("mm/s pk"); } if(av_ptr->rms_active_ && av_ptr->integrate_active_){ if(variable_[chan]->direct_.full_scale_range == 0){ - slider_direct->setRange(0,25); + slider_1st->setRange(0,25); slider_danger->setRange(0,25); }else if(variable_[chan]->direct_.full_scale_range == 1){ - slider_direct->setRange(0,50); + slider_1st->setRange(0,50); slider_danger->setRange(0,50); } - ui->label_direct->setText("mm/s rms"); + ui->label_unit_1st->setText("mm/s rms"); ui->label_danger->setText("mm/s rms"); } } if(setpoint_data->base_config_[chan].channel_type == kVibVelocity){ + EnableNormal(); + ShowSlider(); std::shared_ptr base_channel_ptr = setpoint_data->GetChannelPtr(chan + 1); std::shared_ptr av_ptr = std::dynamic_pointer_cast(base_channel_ptr); if(variable_[chan]->direct_.full_scale_range == 0){ - slider_direct->setRange(0,10); + slider_1st->setRange(0,10); slider_danger->setRange(0,10); }else if(variable_[chan]->direct_.full_scale_range == 1){ - slider_direct->setRange(0,20); + slider_1st->setRange(0,20); slider_danger->setRange(0,20); }else if(variable_[chan]->direct_.full_scale_range == 2){ - slider_direct->setRange(0,50); + slider_1st->setRange(0,50); slider_danger->setRange(0,50); } - ui->label_direct->setText("mm/s pk"); + ui->label_unit_1st->setText("mm/s pk"); ui->label_danger->setText("mm/s pk"); if(av_ptr->rms_active_){ if(variable_[chan]->direct_.full_scale_range == 0){ - slider_direct->setRange(0,10); + slider_1st->setRange(0,10); slider_danger->setRange(0,10); }else if(variable_[chan]->direct_.full_scale_range == 1){ - slider_direct->setRange(0,20); + slider_1st->setRange(0,20); slider_danger->setRange(0,20); }else if(variable_[chan]->direct_.full_scale_range == 2){ - slider_direct->setRange(0,50); + slider_1st->setRange(0,50); slider_danger->setRange(0,50); } - ui->label_direct->setText("mm/s rms"); + ui->label_unit_1st->setText("mm/s rms"); ui->label_danger->setText("mm/s rms"); } if(av_ptr->integrate_active_){ if(variable_[chan]->direct_.full_scale_range == 0){ - slider_direct->setRange(0,100); + slider_1st->setRange(0,100); slider_danger->setRange(0,100); }else if(variable_[chan]->direct_.full_scale_range == 1){ - slider_direct->setRange(0,200); + slider_1st->setRange(0,200); slider_danger->setRange(0,200); }else if(variable_[chan]->direct_.full_scale_range == 2){ - slider_direct->setRange(0,500); + slider_1st->setRange(0,500); slider_danger->setRange(0,500); } - ui->label_direct->setText("um pp"); + ui->label_unit_1st->setText("um pp"); ui->label_danger->setText("um pp"); } + } + if(setpoint_data->base_config_[chan].channel_type == kVibPressurePulsation){ + ShowSlider(); + ui->label_1st->setText("低频段"); + ui->label_2nd->setText("中1频段"); + ui->label_3rd->setText("中2频段"); + ui->comboBox_danger->clear(); + ui->comboBox_danger->addItem("全频段"); + ui->checkBox_1st->setEnabled(true); + ui->checkBox_2nd->setEnabled(true); + ui->checkBox_3rd->setEnabled(true); + ui->lineEdit_2nd_lower->hide(); + ui->lineEdit_2nd_upper->setEnabled(true); + ui->lineEdit_3rd_lower->hide(); + ui->lineEdit_3rd_upper->setEnabled(true); + ui->label_unit_1st->setText("kPa"); + ui->label_unit_2nd->setText("kPa"); + ui->label_unit_3rd->setText("kPa"); + ui->label_danger->setText("kPa"); + slider_1st->setRange(0,10); + slider_2nd->setRange(0,10); + slider_3rd->setRange(0,10); + slider_danger->setRange(0,40); + ui->lineEdit_1st_upper->setText(QString::number(setpoint_data->alert_danger_press[chan].low_upper)); + ui->checkBox_1st->setChecked(setpoint_data->alert_danger_press[chan].low_enable); + if(setpoint_data->alert_danger_press[chan].low_upper > 0){ + slider_1st->m_upper = setpoint_data->alert_danger_press[chan].low_upper; + slider_1st->m_lower = 0; + } - } - 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; + ui->lineEdit_2nd_upper->setText(QString::number(setpoint_data->alert_danger_press[chan].mid1_upper)); + ui->checkBox_2nd->setChecked(setpoint_data->alert_danger_press[chan].mid1_enable); + if(setpoint_data->alert_danger_press[chan].mid1_upper > 0){ + slider_2nd->m_upper = setpoint_data->alert_danger_press[chan].mid1_upper; + slider_2nd->m_lower = 0; + } + ui->lineEdit_3rd_upper->setText(QString::number(setpoint_data->alert_danger_press[chan].mid2_upper)); + ui->checkBox_3rd->setChecked(setpoint_data->alert_danger_press[chan].mid2_enable); + if(setpoint_data->alert_danger_press[chan].mid2_upper > 0){ + slider_3rd->m_upper = setpoint_data->alert_danger_press[chan].mid2_upper; + slider_3rd->m_lower = 0; + } + ui->lineEdit_danger_upper->setText(QString::number(setpoint_data->alert_danger_press[chan].danger_upper)); + ui->checkBox_danger->setChecked(setpoint_data->alert_danger_press[chan].danger_enable); + if(setpoint_data->alert_danger_press[chan].danger_upper > 0){ + slider_danger->m_upper = setpoint_data->alert_danger_press[chan].danger_upper; + slider_danger->m_lower = 0; + } + }else{ + ui->lineEdit_1st_upper->setText(QString::number(setpoint_data->alert_danger[chan].direct_upper)); + ui->checkBox_1st->setChecked(setpoint_data->alert_danger[chan].direct_enable); + if(setpoint_data->alert_danger[chan].direct_upper > 0){ + slider_1st->m_upper = setpoint_data->alert_danger[chan].direct_upper; + slider_1st->m_lower = 0; + } + ui->lineEdit_2nd_upper->setText(QString::number(setpoint_data->alert_danger[chan].x1_ampl_upper)); + ui->lineEdit_2nd_lower->setText(QString::number(setpoint_data->alert_danger[chan].x1_ampl_lower)); + ui->checkBox_2nd->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_2nd->m_upper = setpoint_data->alert_danger[chan].x1_ampl_upper; + slider_2nd->m_lower = setpoint_data->alert_danger[chan].x1_ampl_lower; + } + ui->lineEdit_3rd_upper->setText(QString::number(setpoint_data->alert_danger[chan].x2_ampl_upper)); + ui->lineEdit_3rd_lower->setText(QString::number(setpoint_data->alert_danger[chan].x2_ampl_lower)); + ui->checkBox_3rd->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_3rd->m_upper = setpoint_data->alert_danger[chan].x2_ampl_upper; + slider_3rd->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; + } } } + + +void Setpoint::EnableNormal(){ + ui->label_1st->setText("直接值"); + ui->label_2nd->setText("1倍频幅值"); + ui->label_3rd->setText("2倍频幅值"); + ui->comboBox_danger->clear(); + QStringList items = {"直接值", "1倍频幅值", "2倍频幅值"}; + ui->comboBox_danger->addItems(items); + ui->checkBox_2nd->setChecked(false); + ui->checkBox_3rd->setChecked(false); + ui->label_unit_2nd->setText("- -"); + ui->label_unit_3rd->setText("- -"); +} + +void Setpoint::ShowSlider(){ + ui->label_2nd->show(); + ui->label_unit_2nd->show(); + ui->lineEdit_2nd_upper->show(); + ui->widget_1x_ampl->show(); + ui->lineEdit_2nd_lower->show(); + ui->checkBox_1st->show(); + + ui->label_3rd->show(); + ui->label_unit_3rd->show(); + ui->lineEdit_3rd_upper->show(); + ui->widget_2x_ampl->show(); + ui->lineEdit_3rd_lower->show(); + ui->checkBox_2nd->show(); +} diff --git a/setpoint.h b/setpoint.h index 3a9a6ff..b83af7d 100644 --- a/setpoint.h +++ b/setpoint.h @@ -30,14 +30,16 @@ private slots: private: Ui::Setpoint *ui; - RangeSlider *slider_direct; - RangeSlider *slider_1x_ampl; - RangeSlider *slider_2x_ampl; + RangeSlider *slider_1st; + RangeSlider *slider_2nd; + RangeSlider *slider_3rd; RangeSlider *slider_danger; - std::shared_ptr vib_alert_ptr = nullptr; int current_index; void Init(); void update(); + void EnbalePressurePulsation(); + void EnableNormal(); + void ShowSlider(); }; #endif // SETPOINT_H diff --git a/setpoint.ui b/setpoint.ui index d8fc8c2..359ecac 100644 --- a/setpoint.ui +++ b/setpoint.ui @@ -297,7 +297,7 @@ - + 121 @@ -310,7 +310,7 @@ 1倍频幅值 - + 121 @@ -332,7 +332,7 @@ - + 130 @@ -357,7 +357,7 @@ - - - + 120 @@ -379,7 +379,7 @@ - + 121 @@ -392,7 +392,7 @@ 启用 - + 221 @@ -405,7 +405,7 @@ 启用 - + 221 @@ -418,7 +418,7 @@ 2倍频幅值 - + 230 @@ -443,7 +443,7 @@ - - - + 221 @@ -487,7 +487,7 @@ - + 220 @@ -509,7 +509,7 @@ - + 30 @@ -556,7 +556,7 @@ - + 40 @@ -572,7 +572,7 @@ Qt::AlignCenter - + 25 @@ -600,7 +600,7 @@ Qt::AlignCenter - + 30 diff --git a/singlerelay.cpp b/singlerelay.cpp index 257dce9..973b218 100644 --- a/singlerelay.cpp +++ b/singlerelay.cpp @@ -1,6 +1,9 @@ #include "singlerelay.h" #include "ui_singlerelay.h" #include "vibrationdata.h" +#include +#include +#include SingleRelay::SingleRelay(int slot,int cardtype,QWidget *parent) : QDialog(parent) @@ -47,14 +50,12 @@ SingleRelay::SingleRelay(int slot,int cardtype,QWidget *parent) connect(btnGroup_slot, SIGNAL(buttonClicked(QAbstractButton *)), this, SLOT(OnButtonGroup(QAbstractButton *))); connect(ui->comboBox_relay_ch, QOverload::of(&QComboBox::currentIndexChanged), this, &SingleRelay::onComboBoxIndexChanged); - Init(); + treeView_relay->setContextMenuPolicy(Qt::CustomContextMenu); + connect(treeView_relay,&QTreeView::customContextMenuRequested,this,&SingleRelay::on_treeView_Relay_customContextMenuRequested); current_index = ui->comboBox_relay_ch->currentIndex(); - if(single_relay_nok_data->single_relay_nok[current_index].logic_expression != ""){ - QString channel_name = channelNameMap[single_relay_nok_data->single_relay_nok[current_index].logic_expression]; - QStandardItem *item = new QStandardItem(channel_name); - item->setData(single_relay_nok_data->single_relay_nok[current_index].logic_expression,Qt::UserRole); - model_Relay->appendRow(item); - } + Init(); + onComboBoxIndexChanged(current_index); + } SingleRelay::~SingleRelay() { @@ -93,29 +94,46 @@ void SingleRelay::Init(){ std::shared_ptr base_ptr = ConfigMgr::Instance()->GetSlotPtr(slot_no); if (base_ptr == nullptr) { // do nothing or use template to init it. - single_relay_nok_data = std::make_shared(); - single_relay_nok_data->card_type_ = car_type; - single_relay_nok_data->slot_ = slot_no; - ConfigMgr::Instance()->AddCard(single_relay_nok_data); + relay_data = std::make_shared(); + relay_data->card_type_ = car_type; + relay_data->slot_ = slot_no; + ConfigMgr::Instance()->AddCard(relay_data); return; } - single_relay_nok_data = std::dynamic_pointer_cast(base_ptr); + relay_data = std::dynamic_pointer_cast(base_ptr); + + qDebug() << "logic" <single_relay[current_index].logic_expression; for(int i = 0 ; i < SLOT_NUM ; i++){ std::shared_ptr cardbase_ptr = ConfigMgr::Instance()->GetSlotPtr(i + 1); if(cardbase_ptr != nullptr && cardbase_ptr->card_type_ == kCardVibSingle){ + qDebug() << "i" << i; std::shared_ptr ptr = std::dynamic_pointer_cast(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); + } + channelNameMap[item_data] = item_str; + 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; item_str = QString("%1 (槽位 %2 通道 %3 非OK)").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("%1P##NO").arg(ptr->base_config_[var].chan_id); channelNameMap[item_data] = item_str; } }else if(cardbase_ptr != nullptr && cardbase_ptr->card_type_ == kCardSpeedSingle){ - } } + if(!relay_data->single_relay[current_index].logic_expression.isEmpty()){ + setExpressionToTreeView(treeView_relay, relay_data->single_relay[current_index].logic_expression); + } } void SingleRelay::on_pushButton_cancel_clicked() { this->close(); @@ -127,19 +145,44 @@ void SingleRelay::OnButtonGroup(QAbstractButton *slot_btn) { QString object_name = slot_btn->objectName(); qDebug() << object_name ; int button_id = object_name.right(object_name.length() - 15).toInt(); + std::shared_ptr base_ptr = ConfigMgr::Instance()->GetSlotPtr(button_id); + std::shared_ptr ptr = std::dynamic_pointer_cast(base_ptr); + 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){ std::shared_ptr base_ptr = ConfigMgr::Instance()->GetSlotPtr(button_id); if(base_ptr->card_type_ == kCardVibSingle){ - std::shared_ptr vib_data = std::dynamic_pointer_cast(base_ptr); - if((vib_data->base_config_[var].standby && (var % 2))) + QString item_data; + if(ptr->base_config_[var].standby && (var % 2)) continue; - QString item_str = QString("%1 (槽位 %2 通道 %3 非OK)").arg(vib_data->base_config_[var].point_name).arg(QString::number(button_id, 10).rightJustified(2, '0')).arg(QString::number(var+1, 10).rightJustified(2, '0')); - 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); - list_widget_available->addItem(item); - }else if(base_ptr->card_type_ == kCardSpeedSingle){ + 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("%1 (槽位 %3 通道 %4 警报)").arg(ptr->base_config_[var].point_name).arg(QString::number(button_id, 10).rightJustified(2, '0')).arg(QString::number(var+1, 10).rightJustified(2, '0')); + QListWidgetItem *item = new QListWidgetItem(item_str); + 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("%1 (槽位 %3 通道 %4 危险)").arg(ptr->base_config_[var].point_name).arg(QString::number(button_id, 10).rightJustified(2, '0')).arg(QString::number(var+1, 10).rightJustified(2, '0')); + QListWidgetItem *item = new QListWidgetItem(item_str); + 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); + } + QString item_str = QString("%1 (槽位 %2 通道 %3 非OK)").arg(ptr->base_config_[var].point_name).arg(QString::number(button_id, 10).rightJustified(2, '0')).arg(QString::number(var+1, 10).rightJustified(2, '0')); + QListWidgetItem *item = new QListWidgetItem(item_str); + QString item_data_nok = 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_nok); + list_widget_available->addItem(item); } } } @@ -152,42 +195,252 @@ void SingleRelay::keyPressEvent(QKeyEvent *event) { // } // QTextEdit::keyPressEvent(event); } +QString SingleRelay::buildLogicExpression(QStandardItem *item) { + if (!item) return ""; + int childCount = item->rowCount(); + QVariant userData = item->data(Qt::UserRole); + QString text = userData.toString().trimmed(); + qDebug() << "item" << userData; + if (childCount == 0) { + // 叶子节点,直接返回表达式,比如 S01C01A1 + return text; + } + + // 判断当前是 +(OR)还是 *(AND) + QString opStr = (text == "+") ? "+" : + (text == "*") ? "*" : ""; + + // 如果不是 +/*,视为叶子节点 + if (opStr.isEmpty()) { + return text; + } + + QStringList subExprs; + for (int i = 0; i < childCount; ++i) { + QStandardItem *child = item->child(i); + subExprs << buildLogicExpression(child); + } + + return "(" + subExprs.join(" " + opStr + " ") + ")"; +} void SingleRelay::on_pushButton_confirm_clicked() { QStandardItemModel *model = qobject_cast(treeView_relay->model()); if (!model) return; + QStandardItem *root = model->invisibleRootItem(); - QStandardItem *topItem = root->child(0); QString finalExpr; - QVariant userData = topItem->data(Qt::UserRole); - QString user_text = userData.toString().trimmed(); - single_relay_nok_data->single_relay_nok[current_index].logic_expression = user_text; + for (int i = 0; i < root->rowCount(); ++i) { + QStandardItem *topItem = root->child(i); + QString expr = buildLogicExpression(topItem); + finalExpr += expr; + } + ExprValidationResult result = validateLogicExpression(finalExpr); + if (!result.isValid && !finalExpr.isEmpty()) { + QMessageBox::warning(this, "表达式错误", + QString("错误位置:%1\n错误描述:%2").arg(result.errorPos).arg(result.errorMsg)); + return; + } + relay_data->single_relay[current_index].logic_expression = finalExpr; + qDebug() << "逻辑表达式:" << finalExpr; this->close(); } void SingleRelay::onComboBoxIndexChanged(int index){ qDebug()<< "[SingleRelay]:index " << index; + QStandardItemModel *model = qobject_cast(treeView_relay->model()); if (!model) return; QStandardItem *root = model->invisibleRootItem(); - if(root->rowCount() > 0){ - QStandardItem *topItem = root->child(0); - QString finalExpr; - QVariant userData = topItem->data(Qt::UserRole); - QString user_text = userData.toString().trimmed(); - single_relay_nok_data->single_relay_nok[current_index].logic_expression = user_text; + QString finalExpr; + for (int i = 0; i < root->rowCount(); ++i) { + QStandardItem *topItem = root->child(i); + QString expr = buildLogicExpression(topItem); + finalExpr += expr; } + ExprValidationResult result = validateLogicExpression(finalExpr); + if (!result.isValid && !finalExpr.isEmpty()) { + QMessageBox::warning(this, "表达式错误", + QString("错误位置:%1\n错误描述:%2").arg(result.errorPos).arg(result.errorMsg)); + return; + } + qDebug() << "finalExpr" << finalExpr; + relay_data->single_relay[current_index].logic_expression = finalExpr; current_index = index; - if(single_relay_nok_data->single_relay_nok[index].logic_expression != ""){ - model_Relay->clear(); - QString channel_name = channelNameMap[single_relay_nok_data->single_relay_nok[current_index].logic_expression]; - QStandardItem *item = new QStandardItem(channel_name); - item->setData(single_relay_nok_data->single_relay_nok[current_index].logic_expression,Qt::UserRole); - model_Relay->appendRow(item); - }else{ + if(relay_data->single_relay[index].logic_expression != "") + setExpressionToTreeView(treeView_relay, relay_data->single_relay[index].logic_expression); + else model_Relay->clear(); +} +ExprNode* SingleRelay::parseExpression(const QString& expr, int& pos) { + auto skipSpaces = [&]() { + while (pos < expr.length() && expr[pos].isSpace()) pos++; + }; + + QStack nodeStack; + QStack opStack; + + while (pos < expr.length()) { + skipSpaces(); + if (pos >= expr.length()) break; + + QChar ch = expr[pos]; + + if (ch == '(') { + pos++; + nodeStack.push(parseExpression(expr, pos)); + } else if (ch == ')') { + pos++; + break; + } else if (ch == '+' || ch == '*') { + opStack.push(QString(ch)); + pos++; + } else { + QString token; + while (pos < expr.length() && !QString("()+* ").contains(expr[pos])) { + token += expr[pos++]; + } + if (!token.isEmpty()) { + nodeStack.push(new ExprNode{token, {}}); + } + } + + while (opStack.size() > 0 && nodeStack.size() >= 2) { + QString op = opStack.pop(); + ExprNode* right = nodeStack.pop(); + ExprNode* left = nodeStack.pop(); + + if (left->value == op) { + left->children.append(right); + nodeStack.push(left); + } else if (right->value == op) { + right->children.prepend(left); + nodeStack.push(right); + } else { + ExprNode* parent = new ExprNode{op, {left, right}}; + nodeStack.push(parent); + } + } + } + + return nodeStack.isEmpty() ? nullptr : nodeStack.top(); +} +QStandardItem* SingleRelay::buildItemTree(ExprNode* node) { + if (!node) return nullptr; + QString displayText; + if (node->value == "+" || node->value == "*") { + displayText = (node->value == "+") ? "OR" : "AND"; // 运算符显示 + } else { + displayText = channelNameMap.value(node->value, node->value); // 显示名 + qDebug() << "display" <value; } + QStandardItem* item = new QStandardItem(displayText); + item->setData(node->value, Qt::UserRole); // 原始表达式key + for (ExprNode* child : node->children) { + item->appendRow(buildItemTree(child)); + } + return item; } + +ExprValidationResult SingleRelay::validateLogicExpression(const QString& expr) { + int bracketCount = 0; + bool lastWasOperator = true; + bool lastWasOpenParen = false; + + for (int i = 0; i < expr.length(); ++i) { + QChar ch = expr[i]; + + if (ch.isSpace()) continue; + + if (ch == '(') { + bracketCount++; + lastWasOpenParen = true; + lastWasOperator = true; + } else if (ch == ')') { + bracketCount--; + if (bracketCount < 0) { + return {false, i, "多余的右括号 ')'"}; + } + lastWasOpenParen = false; + lastWasOperator = false; + } else if (ch == '+' || ch == '*') { + if (lastWasOperator || lastWasOpenParen) { + return {false, i, QString("无效的运算符 '%1' 的位置").arg(ch)}; + } + lastWasOperator = true; + lastWasOpenParen = false; + } else if (ch.isLetterOrNumber()) { + QString token; + int start = i; + while (i < expr.length() && expr[i].isLetterOrNumber()) { + token += expr[i]; + ++i; + } + --i; // 修正多读了一位 + if (token.isEmpty()) { + return {false, start, "变量名称缺失"}; + } + lastWasOperator = false; + lastWasOpenParen = false; + } else if (ch.isLetterOrNumber() || ch == '#' || ch.unicode() > 127) { + QString token; + int start = i; + while (i < expr.length() && + (expr[i].isLetterOrNumber() || expr[i] == '#' || expr[i].unicode() > 127)) { + token += expr[i]; + ++i; + } + --i; + if (token.isEmpty()) { + return {false, start, "变量名称缺失"}; + } + lastWasOperator = false; + lastWasOpenParen = false; + }else { + return {false, i, QString("不支持的字符 '%1'").arg(ch)}; + } + } + + if (bracketCount != 0) { + return {false, expr.length(), "括号不匹配"}; + } + + if (lastWasOperator) { + return {false, expr.length() - 1, "表达式不能以运算符结尾"}; + } + + return {true, -1, ""}; +} +void SingleRelay::setExpressionToTreeView(QTreeView* treeView, const QString& expr) { + int pos = 0; + model_Relay->clear(); + ExprNode* root = parseExpression(expr, pos); + QStandardItem* rootItem = buildItemTree(root); + + model_Relay->appendRow(rootItem); + treeView_relay->expandAll(); +} +void SingleRelay::slotDeleteItem() +{ + QModelIndex curIndex = treeView_relay->currentIndex(); + if(curIndex.isValid()){ + model_Relay->removeRow(curIndex.row(),curIndex.parent()); + } + +} +void SingleRelay::on_treeView_Relay_customContextMenuRequested(const QPoint &pos) +{ + qDebug() << "on_treeView_Relay_customContextMenuRequested" <indexAt(pos); //当前点击的元素的index + QModelIndex index = curIndex.sibling(curIndex.row(),0); //该行的第1列元素的index + QMenu menu(this); + if (index.isValid()){ + //添加一行菜单,进行展开 + menu.addAction(QStringLiteral("删除"), this, SLOT(slotDeleteItem())); + menu.addSeparator(); //添加一个分隔线 + } + menu.exec(QCursor::pos()); //显示菜单 +} diff --git a/singlerelay.h b/singlerelay.h index 4a4b072..34fd5ee 100644 --- a/singlerelay.h +++ b/singlerelay.h @@ -14,7 +14,6 @@ namespace Ui { class SingleRelay; } - class SingleRelay : public QDialog { Q_OBJECT @@ -31,6 +30,9 @@ class SingleRelay : public QDialog { void on_pushButton_confirm_clicked(); void onComboBoxIndexChanged(int index); + void slotDeleteItem(); + + void on_treeView_Relay_customContextMenuRequested(const QPoint &pos); private: Ui::SingleRelay *ui; @@ -38,11 +40,17 @@ private: QListWidget *list_widget_available = nullptr; QTreeView *treeView_relay; QStandardItemModel *model_Relay; - std::shared_ptr single_relay_nok_data = nullptr; + std::shared_ptr relay_data = nullptr; int current_index; QMap channelNameMap; void Init(); + void buildTreeFromExpression(QTreeView *treeView, const QString &expr); + ExprNode* parseExpression(const QString& expr, int& pos); + QStandardItem* buildItemTree(ExprNode* node); + void setExpressionToTreeView(QTreeView* treeView, const QString& expr); + QString buildLogicExpression(QStandardItem *item); + ExprValidationResult validateLogicExpression(const QString& expr); }; #endif // SINGLERELAY_H diff --git a/singlerelay.ui b/singlerelay.ui index 784c808..29e2654 100644 --- a/singlerelay.ui +++ b/singlerelay.ui @@ -6,7 +6,7 @@ 0 0 - 924 + 994 569 @@ -937,7 +937,7 @@ 620 40 - 281 + 341 301 @@ -946,9 +946,9 @@ 230 - 380 + 370 391 - 131 + 141 diff --git a/singlerelay_data.cpp b/singlerelay_data.cpp index 61d1c7b..10b3304 100644 --- a/singlerelay_data.cpp +++ b/singlerelay_data.cpp @@ -1,4 +1,4 @@ #include "singlerelay_data.h" -SingleRelayDataNOK::SingleRelayDataNOK(){ +SingleRelayData::SingleRelayData(){ } diff --git a/singlerelay_data.h b/singlerelay_data.h index e509c02..7b08d65 100644 --- a/singlerelay_data.h +++ b/singlerelay_data.h @@ -2,10 +2,10 @@ #define SINGLERELAY_DATA_H #include "cardbase.h" -class SingleRelayDataNOK : public CardBase { +class SingleRelayData : public CardBase { public: - SingleRelayDataNOK(); - SingleRelayNOK single_relay_nok[RELAY_COUNT]; + SingleRelayData(); + SingleRelayNOK single_relay[RELAY_COUNT]; }; #endif // SINGLERELAY_DATA_H diff --git a/tmrrelayassociation.h b/tmrrelayassociation.h index 0047e64..7786f8c 100644 --- a/tmrrelayassociation.h +++ b/tmrrelayassociation.h @@ -13,15 +13,7 @@ namespace Ui { class TMRRelayAssociation; } -struct ExprNode { - QString value; - QList children; -}; -struct ExprValidationResult { - bool isValid; - int errorPos; - QString errorMsg; -}; + class TMRRelayAssociation : public QDialog diff --git a/trust.cpp b/trust.cpp index c2d4b1c..32a15de 100644 --- a/trust.cpp +++ b/trust.cpp @@ -60,6 +60,7 @@ void Trust::Init() { ui->spinBox_band_pass_low->setValue(variable_ptr->filter_[2].low); ui->spinBox_band_pass_high->setValue(variable_ptr->filter_[2].high); ui->comboBox_direct_value_range->setCurrentIndex(variable_ptr->direct_.full_scale_range); + ui->comboBox_gap_range->setCurrentIndex(variable_ptr->gap_range.full_scale_range); ui->doubleSpinBox_direct_clamp->setValue(variable_ptr->direct_.clamp_value); // ui->label_bias_voltage->setText(QString::number(variable_ptr->direct_.bias_voltage)); // ui->doubleSpinBox_bias_volt_clamp->setValue(variables[i].clamp_value); @@ -71,6 +72,7 @@ void Trust::Init() { ui->checkBox_danger_latching->setChecked(variable_ptr->danger_latching_); ui->comboBox_recorder_output->setCurrentIndex(variable_ptr->recorder_out_.recorder_output); ui->checkBox_two_ma_clamp->setChecked(variable_ptr->recorder_out_.two_ma_clamp); + ui->doubleSpinBox_zero_position->setValue(variable_ptr->zero_position.value); } void Trust::on_pushButton_confirm_clicked() { @@ -103,6 +105,7 @@ void Trust::on_pushButton_confirm_clicked() variable->direct_.full_scale_range = ui->comboBox_direct_value_range->currentIndex(); variable->direct_.clamp_value = ui->doubleSpinBox_direct_clamp->value(); variable->direct_.custom = 0; // TODO: + variable->gap_range.full_scale_range = ui->comboBox_gap_range->currentIndex(); variable->recorder_out_.recorder_output = ui->comboBox_recorder_output->currentIndex(); variable->recorder_out_.two_ma_clamp = ui->checkBox_two_ma_clamp->isChecked(); variable->delay_.alert = ui->spinBox_alert->value(); @@ -110,6 +113,7 @@ void Trust::on_pushButton_confirm_clicked() variable->delay_.active_100ms = ui->checkBox_100ms->isChecked(); variable->alert_latching_ = ui->checkBox_alert_latching->isChecked(); variable->danger_latching_ = ui->checkBox_danger_latching->isChecked(); + variable->zero_position.value = ui->doubleSpinBox_zero_position->value(); ptr->variables_.push_back(variable); this->close(); return; @@ -127,6 +131,8 @@ void Trust::on_pushButton_confirm_clicked() variable->direct_.full_scale_range = ui->comboBox_direct_value_range->currentIndex(); variable->direct_.clamp_value = ui->doubleSpinBox_direct_clamp->value(); variable->direct_.custom = 0; // TODO: + variable->gap_range.full_scale_range = ui->comboBox_gap_range->currentIndex(); + variable->gap_range.custom = 0; variable->recorder_out_.recorder_output = ui->comboBox_recorder_output->currentIndex(); variable->recorder_out_.two_ma_clamp = ui->checkBox_two_ma_clamp->isChecked(); variable->delay_.alert = ui->spinBox_alert->value(); @@ -140,6 +146,6 @@ void Trust::on_pushButton_confirm_clicked() void Trust::on_pushButton_cancel_clicked() { - + this->close(); } diff --git a/trust.ui b/trust.ui index 230ce4d..ba6bd3b 100644 --- a/trust.ui +++ b/trust.ui @@ -430,31 +430,6 @@ -24 Vdc - - - 0-100 um - - - - - 0-150 um - - - - - 0-200 um - - - - - 0-400 um - - - - - 0-500 um - - 自定义 @@ -466,7 +441,7 @@ 10 190 - 221 + 201 101 @@ -571,6 +546,51 @@ + + + + 220 + 190 + 171 + 101 + + + + 初始位置 + + + + + 10 + 50 + 61 + 21 + + + + 2 + + + 1.000000000000000 + + + 99.900000000000006 + + + + + + 80 + 50 + 91 + 16 + + + + -6.33 - 13.99 V + + + diff --git a/vibrationdata.h b/vibrationdata.h index 94e5026..fccb69f 100644 --- a/vibrationdata.h +++ b/vibrationdata.h @@ -13,6 +13,7 @@ class VibrationData : public CardBase { SeismicMonitor base_config_[CHANNEL_COUNT]; std::vector> variables_; VibAlertDanger alert_danger[CHANNEL_COUNT]; + VibAlertDangerPress alert_danger_press[CHANNEL_COUNT]; }; #endif // VIBRATIONDATA_H