diff --git a/cardbase.h b/cardbase.h index e6761ea..fdf2398 100644 --- a/cardbase.h +++ b/cardbase.h @@ -37,8 +37,6 @@ class VariableBase { AlarmAlertLow gap_alert_low; FrequencybandOutput freband_output[10]; - - DCOutput dc_output[4]; }; // 位移 diff --git a/config_mgr.cpp b/config_mgr.cpp index 152f374..d00abe2 100644 --- a/config_mgr.cpp +++ b/config_mgr.cpp @@ -41,6 +41,7 @@ void ConfigMgr::Save(QString & file_path) { card_type_[i] != kCardRelaySingleNOK) { continue; } + qDebug() << "i" << i ; // process slot QJsonObject slot_item; if (card_type_[i] != kCardRelaySingle && @@ -74,15 +75,26 @@ void ConfigMgr::Save(QString & file_path) { 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; + QJsonObject dc_output; + QJsonArray dc_output_array; 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){ 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; - } + } } + for(int var = 0 ; var < CHANNEL_COUNT; ++ var ){ + if(ptr->dc_output[cid][var].output_channel > 0){ + dc_output["output_channel"] = ptr->dc_output[cid][var].output_channel; + dc_output["minmum"] = ptr->dc_output[cid][var].minmum; + dc_output["maxmum"] = ptr->dc_output[cid][var].maxmum; + dc_output_array.append(dc_output); + } + + } + channel_item["dc_output"] = dc_output_array; // 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; @@ -570,6 +582,16 @@ void ConfigMgr::Load(QString filename) { vib_data->base_config_[j].keyphase_slot = channel["keyphase_slot"].toInt(); vib_data->base_config_[j].keyphase_ch = channel["keyphase_ch"].toInt(); } + // dc_output + QJsonArray dc_output_array = channel["dc_output"].toArray(); + if(!dc_output_array.isEmpty()){ + for(int var = 0 ; var < CHANNEL_COUNT; ++var){ + QJsonObject dc_output_obj = dc_output_array[var].toObject(); + vib_data->dc_output[j][var].output_channel = dc_output_obj["output_channel"].toInt(); + vib_data->dc_output[j][var].minmum = dc_output_obj["minmum"].toInt(); + vib_data->dc_output[j][var].maxmum = dc_output_obj["maxmum"].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(); diff --git a/data_config.h b/data_config.h index 39386a8..be4489e 100644 --- a/data_config.h +++ b/data_config.h @@ -8,9 +8,13 @@ typedef unsigned char uint8_t; typedef unsigned short uint16_t; +typedef struct { + bool used[4]; // 是否已配置 +}ChannelUsed; + extern QString g_strServerIp; // 服务端IP extern QString g_version; - +extern ChannelUsed ch_used; #define SLOT_NUM 15 #define CHANNEL_COUNT 4 #define RELAY_COUNT 16 @@ -54,7 +58,68 @@ typedef enum { kVibThrust = 3, //轴向位移 kVibPressurePulsation = 4 //动态压力脉动 } VibChannelType; +enum TotalCalcValueType { + // 转速 + kSpeedRpm = 0, + // 轴向位移 + kThrustGap = 2, + + // 径向位移 + kRadialPk = 4, + kRadialPk2Pk = 5, + kRadialRmsScaledPeak = 6, + kRadialRmsScaledPk2Pk = 7, + + // 速度 + kVelPeak = 11, + kVelRmsScaledPeak = 12, + kVelRms = 13, + + kVelDisPeak = 17, + kVelDisPk2Pk = 18, + kVelDisRmsScaledPeak = 19, + kVelDisRmsScaledPk2Pk = 20, + + // 加速度 + kAccPeak = 21, + kAccRmsScaledPeak = 22, + kAccRms = 23, + + kAccVelPeak = 26, + kAccVelRmsScaledPeak = 27, + kAccVelRms = 28, + + kAccDisPeak = 31, + kAccDisPk2Pk = 32, + kAccDisRmsScaledPeak = 33, + kAccDisRmsScaledPk2Pk = 34, + + // 压力脉动 + kPressPulsationPeak = 41, + kPressPulsationRmsScaledPeak = 42, + kPressPulsationRms = 43, + + // kTriggerPressurePulsationLow = 11, // [10, 40] + // kTriggerPressurePulsationMID1 = 12, // (40, 120] + // kTriggerPressurePulsationMID2 = 13, // (120, 190] + // kTriggerPressurePulsationHIGH1 = 14, // (190, 290] + // kTriggerPressurePulsationHIGH2 = 15, // (290, 500] + // kTriggerPressurePulsationHH1 = 16, // (500, 2000] + // kTriggerPressurePulsationHH2 = 17, // (2000, 3200] + // kTriggerPressurePulsationHH3 = 18, // (3200, 4200] + // kTriggerPressurePulsationHH4 = 19, // (4200, 4600] + // kTriggerPressurePulsationOA = 20, // [5, 500] + + // 复合运算 + kSmax = 81, // 径向位移运算 + kDifferentialHousingExpansion = 82, // 差胀,针对轴向位移,做减法 + kRelativeShaftTaper = 83, // 径向位移,根据公式进行计算 + kRelativeShaftCollar = 84, // 径向位移,根据公式进行计算 + kDualMathematicalFunction = 85, // 公式计算 + + kDCValue = 100, +}; typedef enum{ kTruePeak = 0, kTruePeakToPeak = 1, @@ -74,7 +139,11 @@ typedef enum{ kUnit6 = 5, // mm kUnit7 = 6, // mils kUnit8 = 7, // inch/s**2 - kUnit9 = 8 // user defined + kUnit9 = 9, // mbar + kUnit10 = 10, // bar + kUnit11 = 11, // psi + kUnit12 = 12, // pa + kUnit13 = 13 // user defined } EngineeringUnit; typedef struct SlotConfig_{ @@ -209,6 +278,8 @@ typedef struct DCOutput_{ maxmum = 0; } } DCOutput; + + //typedef struct { // Filter filter[3]; // 0: kFilterTypeLowPass, 1: kFilterTypeHighPass, 2: kFilterTypeBandPass //} AllFilter; diff --git a/dc_output_channel.cpp b/dc_output_channel.cpp index 39e925e..acd163f 100644 --- a/dc_output_channel.cpp +++ b/dc_output_channel.cpp @@ -1,12 +1,26 @@ #include "dc_output_channel.h" #include "ui_dc_output_channel.h" #include +#include "data_config.h" -DC_Output_Channel::DC_Output_Channel(QWidget *parent) : + + +DC_Output_Channel::DC_Output_Channel(QString unit_str_,QWidget *parent) : QWidget(parent), ui(new Ui::DC_Output_Channel) { ui->setupUi(this); + unit_str = unit_str_; + ui->label_min_unit->setText(unit_str); + ui->label_max_unit->setText(unit_str); + radiobtn[0] = ui->radioButton; + radiobtn[1] = ui->radioButton_2; + radiobtn[2] = ui->radioButton_3; + radiobtn[3] = ui->radioButton_4; + for (int i = 0; i < 4; i++) { + if(ch_used.used[i]) + radiobtn[i]->setEnabled(false); + } } DC_Output_Channel::~DC_Output_Channel() diff --git a/dc_output_channel.h b/dc_output_channel.h index 54555a8..5a24dfa 100644 --- a/dc_output_channel.h +++ b/dc_output_channel.h @@ -2,6 +2,7 @@ #define DC_OUTPUT_CHANNEL_H #include +#include namespace Ui { class DC_Output_Channel; @@ -12,7 +13,7 @@ class DC_Output_Channel : public QWidget Q_OBJECT public: - explicit DC_Output_Channel(QWidget *parent = nullptr); + explicit DC_Output_Channel(QString unit_str_,QWidget *parent = nullptr); ~DC_Output_Channel(); signals: void output_channel_data_sg(int channel,float minmun,float maxmum); @@ -23,6 +24,9 @@ private slots: private: Ui::DC_Output_Channel *ui; + QString unit_str; + QRadioButton *radiobtn[4]; + bool channel_used[4] = {false,false,false,false}; }; #endif // DC_OUTPUT_CHANNEL_H diff --git a/dc_outputs.cpp b/dc_outputs.cpp index 4adb94c..61cf5c8 100644 --- a/dc_outputs.cpp +++ b/dc_outputs.cpp @@ -7,6 +7,8 @@ #include "data_config.h" #include "vibrationdata.h" +ChannelUsed ch_used; + DC_Outputs::DC_Outputs(int slot_no_,int cardtype,QWidget *parent) : QWidget(parent), ui(new Ui::DC_Outputs) @@ -15,7 +17,7 @@ DC_Outputs::DC_Outputs(int slot_no_,int cardtype,QWidget *parent) : ui->comboBox_ch_output->setView(new QListView()); slot_no = slot_no_; car_type = static_cast(cardtype); - memset(channel_used,0,sizeof(channel_used)); + unit = ""; current_index = ui->comboBox_ch_output->currentIndex(); Init(); } @@ -28,40 +30,120 @@ DC_Outputs::~DC_Outputs() void DC_Outputs::Init(){ std::shared_ptr base_ptr = ConfigMgr::Instance()->GetSlotPtr(slot_no); if (base_ptr == nullptr) { - qCritical() << "[Acceleration::Init] should not be here"; + qCritical() << "[DC_Outputs" +"::Init] should not be here"; return; } - std::shared_ptr ptr = std::dynamic_pointer_cast(base_ptr); - std::shared_ptr variable_base = ptr->GetChannelPtr(current_index + 1); - if (variable_base == nullptr) { - qDebug() << "[DC_Outputs::Init] no channel ptr"; - return; - } - if(variable_base->dc_output[0].output_channel == 1){ + vib_dc_output_ptr = std::dynamic_pointer_cast(base_ptr); + QString unit_str = GetUnit(); + if(vib_dc_output_ptr->dc_output[current_index][0].output_channel == 1){ ui->label_ch_1->setText("通道1"); - ui->label_ch_1_min->setText(QString::number(variable_base->dc_output[0].minmum)); - ui->label_ch_1_max->setText(QString::number(variable_base->dc_output[0].maxmum)); + ui->label_ch_1_min->setText(QString::number(vib_dc_output_ptr->dc_output[current_index][0].minmum)); + ui->label_ch_1_max->setText(QString::number(vib_dc_output_ptr->dc_output[current_index][0].maxmum)); + ch_used.used[0] = true; } - if(variable_base->dc_output[0].output_channel == 2){ + if(vib_dc_output_ptr->dc_output[current_index][1].output_channel == 2){ ui->label_ch_2->setText("通道2"); - ui->label_ch_2_min->setText(QString::number(variable_base->dc_output[1].minmum)); - ui->label_ch_2_max->setText(QString::number(variable_base->dc_output[1].maxmum)); + ui->label_ch_2_min->setText(QString::number(vib_dc_output_ptr->dc_output[current_index][1].minmum)); + ui->label_ch_2_max->setText(QString::number(vib_dc_output_ptr->dc_output[current_index][1].maxmum)); + ch_used.used[1] = true; } - if(variable_base->dc_output[0].output_channel == 3){ + if(vib_dc_output_ptr->dc_output[current_index][2].output_channel == 3){ ui->label_ch_3->setText("通道3"); - ui->label_ch_3_min->setText(QString::number(variable_base->dc_output[2].minmum)); - ui->label_ch_3_max->setText(QString::number(variable_base->dc_output[2].maxmum)); + ui->label_ch_3_min->setText(QString::number(vib_dc_output_ptr->dc_output[current_index][2].minmum)); + ui->label_ch_3_max->setText(QString::number(vib_dc_output_ptr->dc_output[current_index][2].maxmum)); + ch_used.used[2] = true; } - if(variable_base->dc_output[0].output_channel == 4){ + if(vib_dc_output_ptr->dc_output[current_index][3].output_channel == 4){ ui->label_ch_4->setText("通道4"); - ui->label_ch_4_min->setText(QString::number(variable_base->dc_output[3].minmum)); - ui->label_ch_4_max->setText(QString::number(variable_base->dc_output[3].maxmum)); + ui->label_ch_4_min->setText(QString::number(vib_dc_output_ptr->dc_output[current_index][3].minmum)); + ui->label_ch_4_max->setText(QString::number(vib_dc_output_ptr->dc_output[current_index][3].maxmum)); + ch_used.used[3] = true; } + } +QString DC_Outputs::GetUnit(){ + int unit_num = -1; + QString unit_str = ""; + std::shared_ptr variable_base = vib_dc_output_ptr->GetChannelPtr(current_index + 1); + if (vib_dc_output_ptr->base_config_[current_index].channel_type == kVibRadial) { + std::shared_ptr variable_ptr = std::dynamic_pointer_cast(variable_base); + unit_num = variable_ptr->general.engineering_unit; + } + if (vib_dc_output_ptr->base_config_[current_index].channel_type == kVibAcc) { + std::shared_ptr variable_ptr = std::dynamic_pointer_cast(variable_base); + unit_num = variable_ptr->general.engineering_unit; + } + if (vib_dc_output_ptr->base_config_[current_index].channel_type == kVibVelocity) { + std::shared_ptr variable_ptr = std::dynamic_pointer_cast(variable_base); + unit_num = variable_ptr->general.engineering_unit; + } + if (vib_dc_output_ptr->base_config_[current_index].channel_type == kVibThrust) { + std::shared_ptr variable_ptr = std::dynamic_pointer_cast(variable_base); + unit_num = variable_ptr->general.engineering_unit; + } + if (vib_dc_output_ptr->base_config_[current_index].channel_type == kVibPressurePulsation) { + std::shared_ptr variable_ptr = std::dynamic_pointer_cast(variable_base); + unit_num = variable_ptr->general.engineering_unit; + } + switch (unit_num) { + case kUnit1:{ + unit_str = "g"; + break; + } + case kUnit2:{ + unit_str = "m/s**2"; + break; + } + case kUnit3:{ + unit_str = "mm/s"; + break; + } + case kUnit4:{ + unit_str = "inch/s"; + break; + } + case kUnit5:{ + unit_str = "um"; + break; + } + case kUnit6:{ + unit_str = "mm"; + break; + } + case kUnit7:{ + unit_str = "mils"; + break; + } + case kUnit8:{ + unit_str = "inch/s**2"; + break; + } + case kUnit9:{ + unit_str = "mbar"; + break; + } + case kUnit10:{ + unit_str = "bar"; + break; + } + case kUnit11:{ + unit_str = "psi"; + break; + } + case kUnit12:{ + unit_str = "pa"; + break; + } + } + return unit_str; +} void DC_Outputs::on_comboBox_ch_output_activated(int index) { - DC_Output_Channel *dc_output_channel = new DC_Output_Channel(); + current_index = index; + QString unit_str = GetUnit(); + DC_Output_Channel *dc_output_channel = new DC_Output_Channel(unit_str); dc_output_channel->setWindowModality(Qt::ApplicationModal); connect(dc_output_channel,SIGNAL(output_channel_data_sg(int,float,float)),this,SLOT(output_channel_data(int,float,float))); dc_output_channel->show(); @@ -69,58 +151,54 @@ void DC_Outputs::on_comboBox_ch_output_activated(int index) void DC_Outputs::output_channel_data(int channel,float minmun,float maxmum){ qDebug() << channel << minmun << maxmum ; + QString unit_str = GetUnit(); if(channel == 1){ ui->label_ch_1->setText("通道1"); ui->label_ch_1_min->setText(QString::number(minmun)); ui->label_ch_1_max->setText(QString::number(maxmum)); + ch_used.used[0] = true; }else if(channel == 2){ ui->label_ch_2->setText("通道2"); ui->label_ch_2_min->setText(QString::number(minmun)); ui->label_ch_2_max->setText(QString::number(maxmum)); + ch_used.used[1] = true; }else if(channel == 3){ ui->label_ch_3->setText("通道3"); ui->label_ch_3_min->setText(QString::number(minmun)); ui->label_ch_3_max->setText(QString::number(maxmum)); + ch_used.used[2] = true; }else if(channel == 4){ ui->label_ch_4->setText("通道4"); ui->label_ch_4_min->setText(QString::number(minmun)); ui->label_ch_4_max->setText(QString::number(maxmum)); + ch_used.used[3] = true; } } void DC_Outputs::on_pushButton_confirm_clicked() { - std::shared_ptr base_ptr = ConfigMgr::Instance()->GetSlotPtr(slot_no); - if (base_ptr == nullptr) { - qCritical() << "[Acceleration::Init] should not be here"; - return; - } - std::shared_ptr ptr = std::dynamic_pointer_cast(base_ptr); - std::shared_ptr variable_base = ptr->GetChannelPtr(current_index); - if (variable_base == nullptr ) { - return ; - } + if(ui->label_ch_1->text() != "未使用"){ - variable_base->dc_output[0].output_channel = 1; - variable_base->dc_output[0].minmum = ui->label_ch_1_min->text().toFloat(); - variable_base->dc_output[0].maxmum = ui->label_ch_1_max->text().toFloat(); + vib_dc_output_ptr->dc_output[current_index][0].output_channel = 1; + vib_dc_output_ptr->dc_output[current_index][0].minmum = ui->label_ch_1_min->text().toFloat(); + vib_dc_output_ptr->dc_output[current_index][0].maxmum = ui->label_ch_1_max->text().toFloat(); } if(ui->label_ch_2->text() != "未使用"){ - variable_base->dc_output[1].output_channel = 2; - variable_base->dc_output[1].minmum = ui->label_ch_2_min->text().toFloat(); - variable_base->dc_output[1].maxmum = ui->label_ch_2_max->text().toFloat(); + vib_dc_output_ptr->dc_output[current_index][1].output_channel = 2; + vib_dc_output_ptr->dc_output[current_index][1].minmum = ui->label_ch_2_min->text().toFloat(); + vib_dc_output_ptr->dc_output[current_index][1].maxmum = ui->label_ch_2_max->text().toFloat(); } if(ui->label_ch_3->text() != "未使用"){ - variable_base->dc_output[2].output_channel = 3; - variable_base->dc_output[2].minmum = ui->label_ch_3_min->text().toFloat(); - variable_base->dc_output[2].maxmum = ui->label_ch_3_max->text().toFloat(); + vib_dc_output_ptr->dc_output[current_index][2].output_channel = 3; + vib_dc_output_ptr->dc_output[current_index][2].minmum = ui->label_ch_3_min->text().toFloat(); + vib_dc_output_ptr->dc_output[current_index][2].maxmum = ui->label_ch_3_max->text().toFloat(); } if(ui->label_ch_4->text() != "未使用"){ - variable_base->dc_output[3].output_channel = 4; - variable_base->dc_output[3].minmum = ui->label_ch_4_min->text().toFloat(); - variable_base->dc_output[3].maxmum = ui->label_ch_4_max->text().toFloat(); + vib_dc_output_ptr->dc_output[current_index][3].output_channel = 4; + vib_dc_output_ptr->dc_output[current_index][3].minmum = ui->label_ch_4_min->text().toFloat(); + vib_dc_output_ptr->dc_output[current_index][3].maxmum = ui->label_ch_4_max->text().toFloat(); } - ptr->variables_.push_back(variable_base); + this->close(); } @@ -130,3 +208,34 @@ void DC_Outputs::on_pushButton_cancel_clicked() this->close(); } + +void DC_Outputs::on_comboBox_ch_output_currentIndexChanged(int index) +{ + current_index = index; + QString unit_str = GetUnit(); + if(vib_dc_output_ptr->dc_output[current_index][0].output_channel == 1){ + ui->label_ch_1->setText("通道1"); + ui->label_ch_1_min->setText(QString::number(vib_dc_output_ptr->dc_output[current_index][0].minmum)); + ui->label_ch_1_max->setText(QString::number(vib_dc_output_ptr->dc_output[current_index][0].maxmum)); + ch_used.used[0] = true; + } + if(vib_dc_output_ptr->dc_output[current_index][1].output_channel == 2){ + ui->label_ch_2->setText("通道2"); + ui->label_ch_2_min->setText(QString::number(vib_dc_output_ptr->dc_output[current_index][1].minmum)); + ui->label_ch_2_max->setText(QString::number(vib_dc_output_ptr->dc_output[current_index][1].maxmum)); + ch_used.used[1] = true; + } + if(vib_dc_output_ptr->dc_output[current_index][2].output_channel == 3){ + ui->label_ch_3->setText("通道3"); + ui->label_ch_3_min->setText(QString::number(vib_dc_output_ptr->dc_output[current_index][2].minmum)); + ui->label_ch_3_max->setText(QString::number(vib_dc_output_ptr->dc_output[current_index][2].maxmum)); + ch_used.used[2] = true; + } + if(vib_dc_output_ptr->dc_output[current_index][3].output_channel == 4){ + ui->label_ch_4->setText("通道4"); + ui->label_ch_4_min->setText(QString::number(vib_dc_output_ptr->dc_output[current_index][3].minmum)); + ui->label_ch_4_max->setText(QString::number(vib_dc_output_ptr->dc_output[current_index][3].maxmum)); + ch_used.used[3] = true; + } +} + diff --git a/dc_outputs.h b/dc_outputs.h index fa5496a..ef64ce3 100644 --- a/dc_outputs.h +++ b/dc_outputs.h @@ -3,6 +3,7 @@ #include #include "data_config.h" +#include "vibrationdata.h" namespace Ui { class DC_Outputs; @@ -20,13 +21,22 @@ public: private slots: void on_comboBox_ch_output_activated(int index); + void on_pushButton_confirm_clicked(); + + void on_pushButton_cancel_clicked(); + void output_channel_data(int channel,float minmun,float maxmum); + void on_comboBox_ch_output_currentIndexChanged(int index); + private: Ui::DC_Outputs *ui; + std::shared_ptr vib_dc_output_ptr = nullptr; void Init(); - bool channel_used[4]; + QString GetUnit(); + int current_index; + QString unit; }; #endif // DC_OUTPUTS_H diff --git a/dc_outputs.ui b/dc_outputs.ui index d29c893..4d30069 100644 --- a/dc_outputs.ui +++ b/dc_outputs.ui @@ -213,12 +213,12 @@ 300 160 - 101 + 41 16 - ----- ----- + ----- @@ -226,12 +226,12 @@ 300 200 - 101 + 31 16 - ----- ----- + ----- @@ -239,12 +239,12 @@ 420 160 - 121 + 31 16 - ----- ----- + ----- @@ -252,12 +252,12 @@ 420 200 - 101 + 31 16 - ----- ----- + ----- @@ -265,12 +265,12 @@ 300 240 - 71 + 31 16 - ----- ----- + ----- @@ -278,12 +278,12 @@ 300 280 - 71 + 31 16 - ----- ----- + ----- @@ -291,12 +291,12 @@ 420 240 - 71 + 31 16 - ----- ----- + ----- @@ -304,12 +304,12 @@ 420 280 - 71 + 31 16 - ----- ----- + ----- @@ -338,6 +338,110 @@ 取消 + + + + 340 + 160 + 41 + 16 + + + + ----- + + + + + + 460 + 160 + 41 + 16 + + + + ----- + + + + + + 340 + 200 + 41 + 16 + + + + ----- + + + + + + 460 + 200 + 41 + 16 + + + + ----- + + + + + + 340 + 240 + 41 + 16 + + + + ----- + + + + + + 460 + 240 + 41 + 16 + + + + ----- + + + + + + 340 + 280 + 41 + 16 + + + + ----- + + + + + + 460 + 280 + 31 + 16 + + + + ----- + + diff --git a/vibrationdata.h b/vibrationdata.h index fccb69f..14ce487 100644 --- a/vibrationdata.h +++ b/vibrationdata.h @@ -14,6 +14,7 @@ class VibrationData : public CardBase { std::vector> variables_; VibAlertDanger alert_danger[CHANNEL_COUNT]; VibAlertDangerPress alert_danger_press[CHANNEL_COUNT]; + DCOutput dc_output[CHANNEL_COUNT][CHANNEL_COUNT]; }; #endif // VIBRATIONDATA_H