From 95ebcc3aacbb0ee1915d692411892ec51cc086d1 Mon Sep 17 00:00:00 2001 From: Raphael Maenle Date: Sun, 7 Jun 2026 22:50:37 +0200 Subject: [PATCH] B2: HostHandler status + subscription senders MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds the five GEM event-subscription primitives the host needs to drive the equipment's data-collection lifecycle (E30 §6.11): S1F3/F4 selected status data S1F11/F12 status variable namelist S2F33/F34 define reports S2F35/F36 link event reports S2F37/F38 enable/disable events Each is a one-line wrapper over the codegen builders + Connection's send_request, surfacing the codegen-generated DefineReportEntry / LinkEventEntry structs to callers behind a {id, [vids]} pair API. This is the minimum surface a host needs to walk a fresh equipment through "define report -> link CEID -> enable" and start receiving S6F11 event reports — the same pattern the existing demo client does inline. B3 lands the RCMD / recipe / job / terminal senders that build on top. Co-Authored-By: Claude Opus 4.7 --- include/secsgem/gem/host_handler.hpp | 25 +++++++++++++++++++ src/gem/host_handler.cpp | 36 ++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) diff --git a/include/secsgem/gem/host_handler.hpp b/include/secsgem/gem/host_handler.hpp index a22f417..2a5e370 100644 --- a/include/secsgem/gem/host_handler.hpp +++ b/include/secsgem/gem/host_handler.hpp @@ -71,6 +71,31 @@ class HostHandler : public std::enable_shared_from_this { // S1F15/F16 Request Offline. Counterpart to go_remote(). void go_offline(ReplyHandler cb); + // ---- Status + subscription senders (B2) ------------------------------- + + // S1F3/F4 Selected Status Data: empty `svids` requests every SVID. + void send_selected_status(const std::vector& svids, ReplyHandler cb); + + // S1F11/F12 Status Variable Namelist: empty `svids` requests every name. + void send_status_namelist(const std::vector& svids, ReplyHandler cb); + + // S2F33/F34 Define Report. `reports[i] = {rptid, [vids]}`; an empty + // rptid list per request resets that report (per E30 §6.11). + void send_define_reports( + uint32_t dataid, + const std::vector>>& reports, + ReplyHandler cb); + + // S2F35/F36 Link Event Reports. `links[i] = {ceid, [rptids]}`. + void send_link_event_reports( + uint32_t dataid, + const std::vector>>& links, + ReplyHandler cb); + + // S2F37/F38 Enable/Disable Events. Empty `ceids` = all. + void send_enable_events(bool enable, const std::vector& ceids, + ReplyHandler cb); + // ---- Low-level: forward a primary verbatim ---------------------------- void send_request(secs2::Message msg, ReplyHandler cb); diff --git a/src/gem/host_handler.cpp b/src/gem/host_handler.cpp index 1861042..cfd36de 100644 --- a/src/gem/host_handler.cpp +++ b/src/gem/host_handler.cpp @@ -81,6 +81,42 @@ void HostHandler::go_offline(ReplyHandler cb) { send_request(s1f15_request_offline(), std::move(cb)); } +void HostHandler::send_selected_status(const std::vector& svids, + ReplyHandler cb) { + send_request(s1f3_selected_status_request(svids), std::move(cb)); +} + +void HostHandler::send_status_namelist(const std::vector& svids, + ReplyHandler cb) { + send_request(s1f11_status_namelist_request(svids), std::move(cb)); +} + +void HostHandler::send_define_reports( + uint32_t dataid, + const std::vector>>& reports, + ReplyHandler cb) { + std::vector entries; + entries.reserve(reports.size()); + for (const auto& [rptid, vids] : reports) entries.push_back({rptid, vids}); + send_request(s2f33_define_report(dataid, entries), std::move(cb)); +} + +void HostHandler::send_link_event_reports( + uint32_t dataid, + const std::vector>>& links, + ReplyHandler cb) { + std::vector entries; + entries.reserve(links.size()); + for (const auto& [ceid, rptids] : links) entries.push_back({ceid, rptids}); + send_request(s2f35_link_event_report(dataid, entries), std::move(cb)); +} + +void HostHandler::send_enable_events(bool enable, + const std::vector& ceids, + ReplyHandler cb) { + send_request(s2f37_enable_event(enable, ceids), std::move(cb)); +} + void HostHandler::send_request(s2::Message msg, ReplyHandler cb) { conn_->send_request(std::move(msg), std::move(cb)); }