TSI_Config/config_mgr.cpp
2025-03-29 18:05:12 +08:00

103 lines
4.4 KiB
C++

#include "config_mgr.h"
#include <QDebug>
#include <QJsonDocument>
#include <QJsonArray>
#include <QJsonObject>
#include "data_config.h"
#include "vibrationdata.h"
ConfigMgr *ConfigMgr::instance = nullptr;
ConfigMgr::~ConfigMgr() {
}
void ConfigMgr::Save() {
}
void ConfigMgr::Load(QString filename) {
QFile file(filename);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
qDebug() << "Cannot open file for reading:" << filename;
return;
}
QString content = file.readAll();
file.close();
QByteArray jsonData = content.toUtf8();
QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonData);
if (jsonDoc.isNull()) {
qDebug() << "Cannot parse JSON document";
return;
}
if (!jsonDoc.isObject() && !jsonDoc.isArray()) {
qDebug() << "JSON document is not an object or an array";
return;
}
QJsonObject json_obj = jsonDoc.object();
// parse card_type
QJsonArray card_type = json_obj["card_type"].toArray();
int slot = 0;
QJsonObject temp_obj;
for (int i = 0; i < card_type.size(); ++i) {
temp_obj = card_type[i].toObject();
slot = temp_obj["slot"].toInt();
card_type_[slot - 1] = static_cast<CardType>(temp_obj["type"].toInt());
}
// parse each slot
QJsonObject channel;
for (int i = 0; i < SLOT_NUM; ++i) {
if (card_type_[i] == kCardNone) {
continue;
}
slot = i + 1;
if (json_obj[QString::number(slot)].isNull()) {
continue;
}
temp_obj = json_obj[QString::number(slot)].toObject();
if (card_type_[i] == kCardVibSingle) {
std::shared_ptr<VibrationData> vib_data = std::make_shared<VibrationData>();
for (int j = 0; j < CHANNEL_COUNT; ++j) {
channel = temp_obj[QString::number(j + 1)].toObject();
// base info
vib_data->base_config_[j].standby = channel["standby"].toBool();
vib_data->base_config_[j].active = channel["active"].toBool();
vib_data->base_config_[j].rack_type = channel["rack_type"].toInt();
// vib_data->base_config_[j].tmr_group = channel["tmr_group"].toString();
vib_data->base_config_[j].channel_type = channel["channel_type"].toInt();
memset(vib_data->base_config_[j].transducer_name, 0, 32);
memcpy(vib_data->base_config_[j].transducer_name, channel["transducer_name"].toString().toStdString().c_str(), channel["transducer_name"].toString().length());
vib_data->base_config_[j].scale_factor = channel["scale_factor"].toDouble();
vib_data->base_config_[j].sampling_rate = channel["sampling_rate"].toInt();
QJsonArray voltage_range_array = channel["normal_voltage_range"].toArray();
vib_data->base_config_[j].normal_voltage_low = voltage_range_array[0].toDouble();
vib_data->base_config_[j].normal_voltage_high = voltage_range_array[1].toDouble();
// filter
QJsonArray filter_array = channel["filter"].toArray();
for (int k = 0; k < filter_array.size(); k++) {
QJsonObject filter_ele = filter_array[i].toObject();
vib_data->filter_[j].filter[k].low = filter_ele["low"].toInt();
vib_data->filter_[j].filter[k].high = filter_ele["high"].toInt();
vib_data->filter_[j].filter[k].checked = filter_ele["checked"].toBool();
}
// variables
QJsonObject tmp_variable = channel["variable"].toObject();
switch (vib_data->base_config_[j].channel_type) {
case kVibRadial: {
std::shared_ptr<RadialVariable> radial_variable = std::make_shared<RadialVariable>();
radial_variable->id_ = j + 1;
vib_data->variables_.push_back(radial_variable);
break;
}
case kVibVelocity:
case kVibAcc: {
std::shared_ptr<AccVelVariable> acc_vel_variable = std::make_shared<AccVelVariable>();
vib_data->variables_.push_back(acc_vel_variable);
break;
}
}
}
cards_.push_back(vib_data);
}
}
}