#pragma once #include "modbus/modbus.hpp" #include "port/base_port.hpp" #include #include #include #include #include #include #include namespace phosphor::modbus::rtu::inventory { class Device; namespace ModbusIntf = phosphor::modbus::rtu; using SerialPortIntf = phosphor::modbus::rtu::port::BasePort; using InventorySourceIntf = sdbusplus::aserver::xyz::openbmc_project::inventory::source::modbus::FRU< Device>; namespace config { struct Register { std::string name = "unknown"; uint16_t offset = 0; uint8_t size = 0; }; struct AddressRange { uint8_t start; uint8_t end; }; struct Config { using address_range_arr_t = std::vector; using port_address_map_t = std::map; // std::string name = "unknown"; port_address_map_t addressMap = {}; std::vector registers = {}; ModbusIntf::Parity parity = ModbusIntf::Parity::unknown; uint32_t baudRate = 0; }; auto getConfig(sdbusplus::async::context& ctx, sdbusplus::message::object_path objectPath) -> sdbusplus::async::task>; } // namespace config class Device { public: Device() = delete; using serial_port_map_t = std::unordered_map>; explicit Device(sdbusplus::async::context& ctx, const config::Config& config, serial_port_map_t& serialPorts); auto probePorts() -> sdbusplus::async::task; auto probePort(std::string portName) -> sdbusplus::async::task; auto probeDevice(uint8_t address, const std::string& portName, SerialPortIntf& port) -> sdbusplus::async::task; auto addInventorySource(uint8_t address, const std::string& portName, SerialPortIntf& port) -> sdbusplus::async::task; const config::Config config; private: sdbusplus::async::context& ctx; serial_port_map_t& serialPorts; std::map> inventorySources; }; } // namespace phosphor::modbus::rtu::inventory