32 RCLCPP_INFO(
getLogger(),
"[CpModbusRelay] Initializing...");
39 RCLCPP_ERROR(
getLogger(),
"[CpModbusRelay] Failed to get CpModbusConnection component");
43 RCLCPP_INFO(
getLogger(),
"[CpModbusRelay] Initialized with connection component");
51 std::string error =
"Invalid channel: " + std::to_string(channel) +
" (must be 1-8)";
52 RCLCPP_ERROR(
getLogger(),
"[CpModbusRelay] %s", error.c_str());
60 std::string error =
"Not connected to Modbus device";
61 RCLCPP_ERROR(
getLogger(),
"[CpModbusRelay] %s", error.c_str());
71 int value = state ? TRUE : FALSE;
74 getLogger(),
"[CpModbusRelay] Writing coil %d (channel %d) = %s", address, channel,
75 state ?
"ON" :
"OFF");
77 int rc = modbus_write_bit(ctx, address, value);
81 std::string error = modbus_strerror(errno);
82 RCLCPP_ERROR(
getLogger(),
"[CpModbusRelay] Write failed: %s", error.c_str());
88 RCLCPP_INFO(
getLogger(),
"[CpModbusRelay] Write successful");
98 RCLCPP_ERROR(
getLogger(),
"[CpModbusRelay] Invalid channel: %d (must be 1-8)", channel);
104 RCLCPP_ERROR(
getLogger(),
"[CpModbusRelay] Not connected to Modbus device");
114 int rc = modbus_read_bits(ctx, address, 1, &status);
118 RCLCPP_ERROR(
getLogger(),
"[CpModbusRelay] Read failed: %s", modbus_strerror(errno));
122 state = (status != 0);
124 getLogger(),
"[CpModbusRelay] Read coil %d (channel %d) = %s", address, channel,
125 state ?
"ON" :
"OFF");
132 uint8_t mask = state ? 0xFF : 0x00;
140 std::string error =
"Not connected to Modbus device";
141 RCLCPP_ERROR(
getLogger(),
"[CpModbusRelay] %s", error.c_str());
154 coils[i] = (mask & (1 << i)) ? TRUE : FALSE;
164 std::string error = modbus_strerror(errno);
165 RCLCPP_ERROR(
getLogger(),
"[CpModbusRelay] Write all failed: %s", error.c_str());
171 RCLCPP_INFO(
getLogger(),
"[CpModbusRelay] Write all successful");
176 bool state = (mask & (1 << i)) != 0;
187 RCLCPP_ERROR(
getLogger(),
"[CpModbusRelay] Not connected to Modbus device");
200 RCLCPP_ERROR(
getLogger(),
"[CpModbusRelay] Read all failed: %s", modbus_strerror(errno));
214 RCLCPP_DEBUG(
getLogger(),
"[CpModbusRelay] Read all coils: 0x%02X", states);
bool writeAllCoils(bool state)
bool isValidChannel(int channel) const
smacc2::SmaccSignal< void(uint8_t states)> onReadComplete_
static constexpr int COIL_BASE_ADDRESS
std::function< void()> postWriteSuccessEvent_
smacc2::SmaccSignal< void(int channel, bool state)> onWriteSuccess_
void onInitialize() override
int channelToAddress(int channel) const
CpModbusConnection * connectionComponent_
bool readAllCoils(uint8_t &states)
static constexpr int NUM_CHANNELS
smacc2::SmaccSignal< void(int channel, const std::string &error)> onWriteFailure_
bool readCoil(int channel, bool &state)
bool writeCoil(int channel, bool state)
std::function< void()> postWriteFailureEvent_
rclcpp::Logger getLogger() const
void requiresComponent(TComponent *&requiredComponentStorage, ComponentRequirement requirementType=ComponentRequirement::SOFT)