Skip to content

Commit

Permalink
Set proper result code on modbus RPC timeout (#814)
Browse files Browse the repository at this point in the history
  • Loading branch information
KraPete authored Sep 26, 2024
1 parent f2a0aaf commit 60bdfc2
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 35 deletions.
6 changes: 6 additions & 0 deletions debian/changelog
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
wb-mqtt-serial (2.143.4) stable; urgency=medium

* Set proper result code on port/Load RPC timeout

-- Petr Krasnoshchekov <[email protected]> Thu, 26 Sep 2024 18:50:09 +0500

wb-mqtt-serial (2.143.3) stable; urgency=medium

* WB-LED template: safety mode, switch mode, powerup actions support
Expand Down
14 changes: 7 additions & 7 deletions src/rpc/rpc_port_load_handler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,16 +42,16 @@ void RPCPortLoadHandler(const Json::Value& request,
WBMQTT::TMqttRpcServer::TResultCallback onResult,
WBMQTT::TMqttRpcServer::TErrorCallback onError)
{
Json::Value replyJSON;
auto protocol = request.get("protocol", "raw").asString();
if (protocol == "modbus") {
auto rpcRequest = ParseRPCPortLoadModbusRequest(request);
auto response = ExecRPCPortLoadModbusRequest(port, rpcRequest);
replyJSON["response"] = FormatResponse(response, rpcRequest->Format);
} else {
auto rpcRequest = ParseRPCPortLoadRawRequest(request);
auto response = ExecRPCPortLoadRawRequest(port, rpcRequest);
replyJSON["response"] = FormatResponse(response, rpcRequest->Format);
SetCallbacks(*rpcRequest, onResult, onError);
ExecRPCPortLoadModbusRequest(port, rpcRequest);
return;
}
Json::Value replyJSON;
auto rpcRequest = ParseRPCPortLoadRawRequest(request);
auto response = ExecRPCPortLoadRawRequest(port, rpcRequest);
replyJSON["response"] = FormatResponse(response, rpcRequest->Format);
onResult(replyJSON);
}
59 changes: 32 additions & 27 deletions src/rpc/rpc_port_load_modbus_serial_client_task.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,18 +56,38 @@ PRPCPortLoadModbusRequest ParseRPCPortLoadModbusRequest(const Json::Value& reque
return RPCRequest;
}

std::vector<uint8_t> ExecRPCPortLoadModbusRequest(TPort& port, PRPCPortLoadModbusRequest rpcRequest)
void ExecRPCPortLoadModbusRequest(TPort& port, PRPCPortLoadModbusRequest rpcRequest)
{
Modbus::TModbusRTUTraits traits;
auto pdu = Modbus::MakePDU(rpcRequest->Function, rpcRequest->Address, rpcRequest->Count, rpcRequest->Message);
auto responsePduSize = Modbus::CalcResponsePDUSize(rpcRequest->Function, rpcRequest->Count);
auto res = traits.Transaction(port,
rpcRequest->SlaveId,
pdu,
responsePduSize,
rpcRequest->ResponseTimeout,
rpcRequest->FrameTimeout);
return Modbus::ExtractResponseData(rpcRequest->Function, res.Pdu);
try {
port.CheckPortOpen();
port.SkipNoise();
port.SleepSinceLastInteraction(rpcRequest->FrameTimeout);
Modbus::TModbusRTUTraits traits;
auto pdu = Modbus::MakePDU(rpcRequest->Function, rpcRequest->Address, rpcRequest->Count, rpcRequest->Message);
auto responsePduSize = Modbus::CalcResponsePDUSize(rpcRequest->Function, rpcRequest->Count);
auto res = traits.Transaction(port,
rpcRequest->SlaveId,
pdu,
responsePduSize,
rpcRequest->ResponseTimeout,
rpcRequest->FrameTimeout);
auto response = Modbus::ExtractResponseData(rpcRequest->Function, res.Pdu);

if (rpcRequest->OnResult) {
Json::Value replyJSON;
replyJSON["response"] = FormatResponse(response, rpcRequest->Format);
rpcRequest->OnResult(replyJSON);
}
} catch (const Modbus::TModbusExceptionError& error) {
Json::Value replyJSON;
replyJSON["exception"]["code"] = error.GetExceptionCode();
replyJSON["exception"]["msg"] = error.what();
rpcRequest->OnResult(replyJSON);
} catch (const TResponseTimeoutException& error) {
if (rpcRequest->OnError) {
rpcRequest->OnError(WBMQTT::E_RPC_REQUEST_TIMEOUT, error.what());
}
}
}

TRPCPortLoadModbusSerialClientTask::TRPCPortLoadModbusSerialClientTask(PRPCPortLoadModbusRequest request)
Expand All @@ -89,24 +109,9 @@ ISerialClientTask::TRunResult TRPCPortLoadModbusSerialClientTask::Run(
}

try {
port->CheckPortOpen();
port->SkipNoise();
port->SleepSinceLastInteraction(Request->FrameTimeout);
lastAccessedDevice.PrepareToAccess(nullptr);

TSerialPortSettingsGuard settingsGuard(port, Request->SerialPortSettings);
auto response = ExecRPCPortLoadModbusRequest(*port, Request);

if (Request->OnResult) {
Json::Value replyJSON;
replyJSON["response"] = FormatResponse(response, Request->Format);
Request->OnResult(replyJSON);
}
} catch (const Modbus::TModbusExceptionError& error) {
Json::Value replyJSON;
replyJSON["exception"]["code"] = error.GetExceptionCode();
replyJSON["exception"]["msg"] = error.what();
Request->OnResult(replyJSON);
ExecRPCPortLoadModbusRequest(*port, Request);
} catch (const std::exception& error) {
if (Request->OnError) {
Request->OnError(WBMQTT::E_RPC_SERVER_ERROR, std::string("Port IO error: ") + error.what());
Expand Down
2 changes: 1 addition & 1 deletion src/rpc/rpc_port_load_modbus_serial_client_task.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,4 +33,4 @@ class TRPCPortLoadModbusSerialClientTask: public ISerialClientTask

typedef std::shared_ptr<TRPCPortLoadModbusSerialClientTask> PRPCPortLoadModbusSerialClientTask;

std::vector<uint8_t> ExecRPCPortLoadModbusRequest(TPort& port, PRPCPortLoadModbusRequest rpcRequest);
void ExecRPCPortLoadModbusRequest(TPort& port, PRPCPortLoadModbusRequest rpcRequest);

0 comments on commit 60bdfc2

Please sign in to comment.