blob: 42cef57daef7398f7a928252e0a90a051df351ca [file] [log] [blame]
Jagpal Singh Gill7f9d41d2025-10-16 09:42:18 -07001#include "base_port.hpp"
2
3#include "common/entity_manager_interface.hpp"
4
5#include <fcntl.h>
6
7#include <phosphor-logging/lg2.hpp>
8#include <xyz/openbmc_project/Configuration/USBPort/client.hpp>
9
10#include <filesystem>
11#include <format>
12#include <optional>
13#include <regex>
14
15namespace phosphor::modbus::rtu::port
16{
17
18PHOSPHOR_LOG2_USING;
19
20BasePort::BasePort(sdbusplus::async::context& ctx, const config::Config& config,
21 const std::string& devicePath) :
22 name(config.name), mutex(config.name)
23{
24 fd = open(devicePath.c_str(), O_RDWR | O_NOCTTY);
25 if (fd == -1)
26 {
27 throw("Failed to open serial port " + devicePath +
28 " with error: " + strerror(errno));
29 }
30
31 modbus =
32 std::make_unique<ModbusIntf>(ctx, fd, config.baudRate, config.rtsDelay);
33 if (!modbus)
34 {
35 throw std::runtime_error("Failed to create Modbus interface");
36 }
37
38 info("Serial port {NAME} created successfully", "NAME", config.name);
39}
40
41auto BasePort::readHoldingRegisters(
42 uint8_t deviceAddress, uint16_t registerOffset, uint32_t baudRate,
43 Parity parity, std::vector<uint16_t>& registers)
44 -> sdbusplus::async::task<bool>
45{
46 sdbusplus::async::lock_guard lg{mutex};
47 co_await lg.lock();
48
49 if (!modbus->setProperties(baudRate, parity))
50 {
51 error("Failed to set serial port properties");
52 co_return false;
53 }
54
55 debug(
56 "Reading holding registers from device {ADDRESS} {PORT} at offset {OFFSET}",
57 "ADDRESS", deviceAddress, "PORT", name, "OFFSET", registerOffset);
58
59 auto ret = co_await modbus->readHoldingRegisters(deviceAddress,
60 registerOffset, registers);
61 if (!ret)
62 {
63 error(
64 "Failed to read holding registers from device {ADDRESS} {PORT} at offset "
65 "{OFFSET}",
66 "ADDRESS", deviceAddress, "PORT", name, "OFFSET", registerOffset);
67 }
68
69 co_return ret;
70}
71
72} // namespace phosphor::modbus::rtu::port