#pragma once #include #include #include #include #include #include #include "secsgem/secs2/item.hpp" namespace secsgem::gem { namespace s2 = secsgem::secs2; enum class HostCmdAck : uint8_t { Accept = 0, InvalidCommand = 1, CannotDoNow = 2, ParameterInvalid = 3, AcceptedWillFinishLater = 4, Rejected = 5, InvalidObject = 6, }; // One entry on S2F41. The messages catalog declares this // struct external_struct: true so the codegen references it rather than // redefining it. struct CommandParameter { std::string name; s2::Item value; }; class HostCommandRegistry { public: // Declarative effect, loaded from YAML. struct Spec { HostCmdAck ack = HostCmdAck::Accept; std::optional emit_ceid; std::optional set_alarm; }; struct Result { HostCmdAck ack = HostCmdAck::InvalidCommand; std::optional emit_ceid; std::optional set_alarm; }; void register_command(std::string rcmd, Spec spec) { by_rcmd_.insert_or_assign(std::move(rcmd), std::move(spec)); } bool has(const std::string& rcmd) const { return by_rcmd_.count(rcmd) > 0; } Result dispatch(const std::string& rcmd, const std::vector& /*params*/) const { auto it = by_rcmd_.find(rcmd); if (it == by_rcmd_.end()) return {HostCmdAck::InvalidCommand, std::nullopt, std::nullopt}; return {it->second.ack, it->second.emit_ceid, it->second.set_alarm}; } private: std::map by_rcmd_; }; } // namespace secsgem::gem