* @brief Parses a JSON register map (flat registers array or grouped by type). */
| 592 | * @brief Parses a JSON register map (flat registers array or grouped by type). |
| 593 | */ |
| 594 | bool DataModel::ModbusMapImporter::parseJSON(const QString& path) |
| 595 | { |
| 596 | QFile file(path); |
| 597 | if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) |
| 598 | return false; |
| 599 | |
| 600 | const auto result = Misc::JsonValidator::parseAndValidate(file.readAll()); |
| 601 | file.close(); |
| 602 | |
| 603 | if (!result.valid) { |
| 604 | qWarning() << "[ModbusMapImporter] Invalid JSON map:" << result.errorMessage; |
| 605 | return false; |
| 606 | } |
| 607 | |
| 608 | if (!result.document.isObject()) |
| 609 | return false; |
| 610 | |
| 611 | const auto root = result.document.object(); |
| 612 | |
| 613 | if (root.contains(QStringLiteral("registers"))) { |
| 614 | const auto arr = root.value(QStringLiteral("registers")).toArray(); |
| 615 | for (const auto& item : arr) { |
| 616 | RegisterEntry entry; |
| 617 | if (parseRegisterEntry(item.toObject(), entry)) |
| 618 | m_registers.append(entry); |
| 619 | } |
| 620 | } |
| 621 | |
| 622 | // clang-format off |
| 623 | static const struct { const char* key; int type; } groups[] = { |
| 624 | {"holdingRegisters", 0}, {"holding_registers", 0}, {"holding", 0}, |
| 625 | {"inputRegisters", 1}, {"input_registers", 1}, {"input", 1}, |
| 626 | {"coils", 2}, |
| 627 | {"discreteInputs", 3}, {"discrete_inputs", 3}, {"discrete", 3}, |
| 628 | }; |
| 629 | |
| 630 | // clang-format on |
| 631 | |
| 632 | for (const auto& g : groups) { |
| 633 | const auto key = QLatin1String(g.key); |
| 634 | if (!root.contains(key)) |
| 635 | continue; |
| 636 | |
| 637 | const auto arr = root.value(key).toArray(); |
| 638 | for (const auto& item : arr) { |
| 639 | RegisterEntry entry; |
| 640 | if (parseRegisterEntry(item.toObject(), entry, g.type)) |
| 641 | m_registers.append(entry); |
| 642 | } |
| 643 | } |
| 644 | |
| 645 | return !m_registers.isEmpty(); |
| 646 | } |
| 647 | |
| 648 | //-------------------------------------------------------------------------------------------------- |
| 649 | // Register block grouping |