* @brief Assembles the complete project JSON object. */
| 898 | * @brief Assembles the complete project JSON object. |
| 899 | */ |
| 900 | QJsonObject IO::Drivers::Modbus::buildProject() const |
| 901 | { |
| 902 | QJsonObject project; |
| 903 | project[Keys::Title] = tr("Modbus Project"); |
| 904 | project[Keys::Actions] = QJsonArray(); |
| 905 | |
| 906 | QJsonObject source; |
| 907 | source[Keys::SourceId] = 0; |
| 908 | source[Keys::Title] = tr("Modbus"); |
| 909 | source[Keys::BusType] = static_cast<int>(SerialStudio::BusType::ModBus); |
| 910 | source[Keys::FrameStart] = QString(); |
| 911 | source[Keys::FrameEnd] = QString(); |
| 912 | source[Keys::Checksum] = QString(); |
| 913 | source[Keys::FrameDetection] = static_cast<int>(SerialStudio::NoDelimiters); |
| 914 | source[Keys::Decoder] = static_cast<int>(SerialStudio::Binary); |
| 915 | source[Keys::HexadecimalDelimiters] = false; |
| 916 | source[Keys::FrameParserCode] = buildFrameParser(); |
| 917 | source[Keys::FrameParserLanguage] = static_cast<int>(SerialStudio::Lua); |
| 918 | |
| 919 | QJsonObject conn_settings; |
| 920 | for (const auto& prop : driverProperties()) |
| 921 | conn_settings.insert(prop.key, QJsonValue::fromVariant(prop.value)); |
| 922 | |
| 923 | source[Keys::SourceConn] = conn_settings; |
| 924 | |
| 925 | project[Keys::Sources] = QJsonArray{source}; |
| 926 | |
| 927 | static const QStringList type_names = { |
| 928 | tr("Holding Registers"), |
| 929 | tr("Input Registers"), |
| 930 | tr("Coils"), |
| 931 | tr("Discrete Inputs"), |
| 932 | }; |
| 933 | |
| 934 | QJsonArray group_array; |
| 935 | int group_id = 0; |
| 936 | int dataset_index = 1; |
| 937 | |
| 938 | for (const auto& reg_group : m_registerGroups) { |
| 939 | DataModel::Group group; |
| 940 | group.groupId = group_id; |
| 941 | group.widget = QStringLiteral("datagrid"); |
| 942 | |
| 943 | const QString type_name = (reg_group.registerType < type_names.count()) |
| 944 | ? type_names[reg_group.registerType] |
| 945 | : tr("Unknown"); |
| 946 | group.title = QStringLiteral("%1 @ %2").arg(type_name, QString::number(reg_group.startAddress)); |
| 947 | |
| 948 | const bool is_reg = (reg_group.registerType <= 1); |
| 949 | |
| 950 | for (quint16 i = 0; i < reg_group.count; ++i) { |
| 951 | DataModel::Dataset dataset; |
| 952 | dataset.index = dataset_index++; |
| 953 | dataset.log = true; |
| 954 | |
| 955 | const quint16 addr = reg_group.startAddress + i; |
| 956 | |
| 957 | if (is_reg) { |