• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

wirenboard / wb-mqtt-serial / 673

15 Jul 2025 07:07AM UTC coverage: 73.028% (-0.8%) from 73.863%
673

push

github

web-flow
Add device/Load and device/Set RPC

6463 of 9217 branches covered (70.12%)

51 of 322 new or added lines in 13 files covered. (15.84%)

7 existing lines in 2 files now uncovered.

12368 of 16936 relevant lines covered (73.03%)

373.64 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/src/rpc/rpc_device_load_task.cpp
1
#include "rpc_device_load_task.h"
2
#include "config_merge_template.h"
3
#include "rpc_helpers.h"
4
#include "serial_port.h"
5
#include "wb_registers.h"
6

7
namespace
8
{
NEW
9
    void ExecRPCRequest(PPort port, PRPCDeviceLoadRequest rpcRequest)
×
10
    {
NEW
11
        if (!rpcRequest->OnResult) {
×
NEW
12
            return;
×
13
        }
NEW
14
        Json::Value result;
×
NEW
15
        for (int i = 0; i < 2; i++) {
×
NEW
16
            auto registerList = i ? rpcRequest->GetParametersRegisterList() : rpcRequest->GetChannelsRegisterList();
×
NEW
17
            if (!registerList.empty()) {
×
NEW
18
                ReadRegisterList(*port, rpcRequest->Device, registerList, result[i ? "parameters" : "channels"]);
×
19
            }
20
        }
NEW
21
        rpcRequest->OnResult(result);
×
22
    }
23
} // namespace
24

NEW
25
TRPCDeviceLoadRequest::TRPCDeviceLoadRequest(const TDeviceProtocolParams& protocolParams,
×
26
                                             PSerialDevice device,
27
                                             PDeviceTemplate deviceTemplate,
NEW
28
                                             bool deviceFromConfig)
×
NEW
29
    : TRPCDeviceRequest(protocolParams, device, deviceTemplate, deviceFromConfig)
×
30
{}
31

NEW
32
void TRPCDeviceLoadRequest::ParseRequestItems(const Json::Value& items, std::list<std::string>& list)
×
33
{
NEW
34
    for (const auto& item: items) {
×
NEW
35
        auto id = item.asString();
×
NEW
36
        if (std::find(list.begin(), list.end(), id) == list.end()) {
×
NEW
37
            list.push_back(id);
×
38
        }
39
    }
40
}
41

NEW
42
TRPCRegisterList TRPCDeviceLoadRequest::GetChannelsRegisterList()
×
43
{
NEW
44
    Json::Value items(Json::arrayValue);
×
NEW
45
    for (auto item: DeviceTemplate->GetTemplate()["channels"]) {
×
NEW
46
        if (item["address"].isNull()) { // write only channel
×
NEW
47
            continue;
×
48
        }
NEW
49
        auto id = item["name"].asString();
×
NEW
50
        if (std::find(Channels.begin(), Channels.end(), id) != Channels.end()) {
×
NEW
51
            item["id"] = id;
×
NEW
52
            items.append(item);
×
NEW
53
            Channels.remove(id);
×
54
        }
55
    }
NEW
56
    if (!Channels.empty()) {
×
NEW
57
        throw TRPCException("Channel \"" + Channels.front() + "\" is write only or not found in \"" +
×
NEW
58
                                DeviceTemplate->Type + "\" device template",
×
NEW
59
                            TRPCResultCode::RPC_WRONG_PARAM_VALUE);
×
60
    }
NEW
61
    return CreateRegisterList(ProtocolParams, Device, items);
×
62
}
63

NEW
64
TRPCRegisterList TRPCDeviceLoadRequest::GetParametersRegisterList()
×
65
{
NEW
66
    auto params = DeviceTemplate->GetTemplate()["parameters"];
×
NEW
67
    Json::Value items(Json::arrayValue);
×
NEW
68
    for (auto it = params.begin(); it != params.end(); ++it) {
×
NEW
69
        auto item = *it;
×
NEW
70
        if (item["address"].isNull()) { // write only parameter
×
NEW
71
            continue;
×
72
        }
NEW
73
        auto id = params.isObject() ? it.key().asString() : item["id"].asString();
×
NEW
74
        if (std::find(Parameters.begin(), Parameters.end(), id) != Parameters.end()) {
×
NEW
75
            if (params.isObject()) {
×
NEW
76
                item["id"] = id;
×
77
            }
NEW
78
            items.append(item);
×
NEW
79
            Parameters.remove(id);
×
80
        }
81
    }
NEW
82
    if (!Channels.empty()) {
×
NEW
83
        throw TRPCException("Parameter \"" + Parameters.front() + "\" is write only or not found in \"" +
×
NEW
84
                                DeviceTemplate->Type + "\" device template",
×
NEW
85
                            TRPCResultCode::RPC_WRONG_PARAM_VALUE);
×
86
    }
NEW
87
    return CreateRegisterList(ProtocolParams, Device, items);
×
88
}
89

NEW
90
PRPCDeviceLoadRequest ParseRPCDeviceLoadRequest(const Json::Value& request,
×
91
                                                const TDeviceProtocolParams& protocolParams,
92
                                                PSerialDevice device,
93
                                                PDeviceTemplate deviceTemplate,
94
                                                bool deviceFromConfig,
95
                                                WBMQTT::TMqttRpcServer::TResultCallback onResult,
96
                                                WBMQTT::TMqttRpcServer::TErrorCallback onError)
97
{
NEW
98
    auto res = std::make_shared<TRPCDeviceLoadRequest>(protocolParams, device, deviceTemplate, deviceFromConfig);
×
NEW
99
    res->ParseSettings(request, onResult, onError);
×
NEW
100
    res->ParseRequestItems(request["channels"], res->Channels);
×
NEW
101
    res->ParseRequestItems(request["parameters"], res->Parameters);
×
NEW
102
    return res;
×
103
}
104

NEW
105
TRPCDeviceLoadSerialClientTask::TRPCDeviceLoadSerialClientTask(PRPCDeviceLoadRequest request): Request(request)
×
106
{
NEW
107
    ExpireTime = std::chrono::steady_clock::now() + Request->TotalTimeout;
×
108
}
109

NEW
110
ISerialClientTask::TRunResult TRPCDeviceLoadSerialClientTask::Run(PPort port,
×
111
                                                                  TSerialClientDeviceAccessHandler& lastAccessedDevice,
112
                                                                  const std::list<PSerialDevice>& polledDevices)
113
{
NEW
114
    if (std::chrono::steady_clock::now() > ExpireTime) {
×
NEW
115
        if (Request->OnError) {
×
NEW
116
            Request->OnError(WBMQTT::E_RPC_REQUEST_TIMEOUT, "RPC request timeout");
×
117
        }
NEW
118
        return ISerialClientTask::TRunResult::OK;
×
119
    }
120
    try {
NEW
121
        if (!port->IsOpen()) {
×
NEW
122
            port->Open();
×
123
        }
NEW
124
        lastAccessedDevice.PrepareToAccess(*port, nullptr);
×
NEW
125
        if (!Request->DeviceFromConfig) {
×
NEW
126
            TSerialPortSettingsGuard settingsGuard(port, Request->SerialPortSettings);
×
127
        }
NEW
128
        ExecRPCRequest(port, Request);
×
NEW
129
    } catch (const std::exception& error) {
×
NEW
130
        if (Request->OnError) {
×
NEW
131
            Request->OnError(WBMQTT::E_RPC_SERVER_ERROR, std::string("Port IO error: ") + error.what());
×
132
        }
133
    }
NEW
134
    return ISerialClientTask::TRunResult::OK;
×
135
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc