rtu: implement modbus sensor read
Read the modbus device config from the Entity Manager configuration and
create the sensor interfaces for related sensor register config.
Tested:
Added new Unit test named test_sensors -
```
> meson test -t 10 -C builddir/ --print-errorlogs --wrapper="valgrind --error-exitcode=1" test_sensors
ninja: Entering directory `/host/repos/Modbus/phosphor-modbus/builddir'
[2/2] Linking target tests/test_sensors
1/1 test_sensors OK 13.98s
Ok: 1
Fail: 0
```
Tested on Qemu using Mock Modbus Device -
```
root@ventura:~# busctl tree xyz.openbmc_project.ModbusRTU
└─ /xyz
└─ /xyz/openbmc_project
├─ /xyz/openbmc_project/inventory_source
│ ├─ /xyz/openbmc_project/inventory_source/Heat_Exchanger_12_DevTTYUSB0
│ ├─ /xyz/openbmc_project/inventory_source/Heat_Exchanger_12_DevTTYUSB1
│ ├─ /xyz/openbmc_project/inventory_source/Reservoir_Pumping_Unit_12_DevTTYUSB0
│ └─ /xyz/openbmc_project/inventory_source/Reservoir_Pumping_Unit_12_DevTTYUSB1
└─ /xyz/openbmc_project/sensors
└─ /xyz/openbmc_project/sensors/temperature
├─ /xyz/openbmc_project/sensors/temperature/Reservoir_Pumping_Unit_12_DevTTYUSB0_RPU_Coolant_Inlet_Temp_C
├─ /xyz/openbmc_project/sensors/temperature/Reservoir_Pumping_Unit_12_DevTTYUSB0_RPU_Coolant_Outlet_Temp_C
├─ /xyz/openbmc_project/sensors/temperature/Reservoir_Pumping_Unit_12_DevTTYUSB1_RPU_Coolant_Inlet_Temp_C
└─ /xyz/openbmc_project/sensors/temperature/Reservoir_Pumping_Unit_12_DevTTYUSB1_RPU_Coolant_Outlet_Temp_C
busctl introspect xyz.openbmc_project.ModbusRTU /xyz/openbmc_project/sensors/temperature/Reservoir_Pumping_Unit_12_DevTTYUSB1_RPU_Coolant_Outlet_Temp_C
NAME TYPE SIGNATURE RESULT/VALUE FLAGS
org.freedesktop.DBus.Introspectable interface - - -
.Introspect method - s -
org.freedesktop.DBus.Peer interface - - -
.GetMachineId method - s -
.Ping method - - -
org.freedesktop.DBus.Properties interface - - -
.Get method ss v -
.GetAll method s a{sv} -
.Set method ssv - -
.PropertiesChanged signal sa{sv}as - -
xyz.openbmc_project.Sensor.Value interface - - -
.MaxValue property d nan emits-change writable
.MinValue property d nan emits-change writable
.Unit property s "xyz.openbmc_project.Sensor.Value.Unit.… emits-change writable
.Value property d 1670.6 emits-change writable
```
Change-Id: I1368e8df5999b5cee9ac19d185ee110a9ecc3021
Signed-off-by: Jagpal Singh Gill <paligill@gmail.com>
diff --git a/tests/modbus_server_tester.cpp b/tests/modbus_server_tester.cpp
index fe1b825..1b09dc2 100644
--- a/tests/modbus_server_tester.cpp
+++ b/tests/modbus_server_tester.cpp
@@ -122,35 +122,8 @@
uint16_t registerOffset = request.raw[2] << 8 | request.raw[3];
uint16_t registerCount = request.raw[4] << 8 | request.raw[5];
- if (registerOffset == testSuccessReadHoldingRegisterOffset ||
- registerOffset == testSuccessReadHoldingRegisterSegmentedOffset)
+ if (registerOffset == testFailureReadHoldingRegister)
{
- checkRequestSize(registerCount, testSuccessReadHoldingRegisterCount);
-
- response << request.raw[0] << request.raw[1]
- << uint8_t(2 * registerCount)
- << uint16_t(testSuccessReadHoldingRegisterResponse[0])
- << uint16_t(testSuccessReadHoldingRegisterResponse[1]);
- response.appendCRC();
- segmentedResponse =
- (registerOffset == testSuccessReadHoldingRegisterSegmentedOffset);
- }
- else if (registerOffset == testReadHoldingRegisterModelOffset)
- {
- checkRequestSize(registerCount, testReadHoldingRegisterModelCount);
-
- response << request.raw[0] << request.raw[1]
- << uint8_t(2 * testReadHoldingRegisterModelCount);
- for (size_t i = 0; i < testReadHoldingRegisterModelCount; i++)
- {
- response << uint16_t(testReadHoldingRegisterModel[i]);
- }
- response.appendCRC();
- }
- else if (registerOffset == testFailureReadHoldingRegister)
- {
- checkRequestSize(registerCount, testSuccessReadHoldingRegisterCount);
-
response << request.raw[0]
<< (uint8_t)readHoldingRegistersErrorFunctionCode
<< uint8_t(RTUIntf::ModbusExceptionCode::illegalFunctionCode);
@@ -158,7 +131,29 @@
}
else
{
- FAIL() << "Invalid register offset:" << registerOffset;
+ auto expectedResponseIter =
+ testReadHoldingRegisterMap.find(registerOffset);
+ if (expectedResponseIter == testReadHoldingRegisterMap.end())
+ {
+ FAIL() << "Invalid register offset:" << registerOffset;
+ return;
+ }
+
+ checkRequestSize(registerCount,
+ std::get<0>(expectedResponseIter->second));
+
+ auto& expectedResponse = std::get<1>(expectedResponseIter->second);
+
+ response << request.raw[0] << request.raw[1]
+ << uint8_t(2 * registerCount);
+ for (size_t i = 0; i < registerCount; i++)
+ {
+ response << uint16_t(expectedResponse[i]);
+ }
+ response.appendCRC();
+
+ segmentedResponse =
+ (registerOffset == testSuccessReadHoldingRegisterSegmentedOffset);
}
}