From cf7969fc09c9816737bb6a1acbd314ed9abf3b45 Mon Sep 17 00:00:00 2001 From: Cyril Danilevski <cyril.danilevski@xfel.eu> Date: Wed, 22 Jan 2025 17:47:19 +0100 Subject: [PATCH] Add setChannelAndWait --- mpod.cpp | 23 +++++++++++++++++++++++ mpod.hpp | 1 + rest.cpp | 25 +++++++++++-------------- 3 files changed, 35 insertions(+), 14 deletions(-) diff --git a/mpod.cpp b/mpod.cpp index 80a8280..160fd72 100644 --- a/mpod.cpp +++ b/mpod.cpp @@ -190,3 +190,26 @@ void initializeSNMP() { snmp.onMessage(onMessage); Serial.println("SNMP Server Started"); } + +/* setChannelAndWait + * Set a channel's parameters and wait until it's settled. + */ +void setChannelAndWait(IPAddress *ipAddr, uint16_t channel, uint8_t output) { + // Send set command + SNMP::Message *snmp_msg = mpod.output(channel, output); + snmp.send(snmp_msg, *ipAddr, SNMP::Port::SNMP); + delete snmp_msg; + + // wait for channel reply + delay(MPOD_UPDATE_LATENCY); + snmp.loop(); + + // Poll channel until it's settled + do { + SNMP::Message *snmp_msg = mpod.read(channel); + snmp.send(snmp_msg, *ipAddr, SNMP::Port::SNMP); + delete snmp_msg; + delay(MPOD_UPDATE_LATENCY); + snmp.loop(); + } while (mpod.isOn() != (bool)output || mpod.isRampingDown() || mpod.isRampingUp()); +} diff --git a/mpod.hpp b/mpod.hpp index ca0b855..0680e04 100644 --- a/mpod.hpp +++ b/mpod.hpp @@ -95,4 +95,5 @@ extern MPOD mpod; // Event handler to process SNMP messages void onSNMPMessage(const SNMP::Message *message, const IPAddress remote, const uint16_t port); void initializeSNMP(); +void setChannelAndWait(IPAddress*, uint16_t, uint8_t); diff --git a/rest.cpp b/rest.cpp index 9d55040..f4f5226 100644 --- a/rest.cpp +++ b/rest.cpp @@ -117,9 +117,9 @@ void restart() { } enum { - OFF, - ON, - NONE, + OFF = 0, + ON = 1, + NONE = -1, }; void sendSNMP() { @@ -140,17 +140,10 @@ void sendSNMP() { } auto ipAddr = IPAddress(192, 168, 140, 79); - if (output != NONE && channel != 0) { - SNMP::Message *snmp_msg = mpod.output(channel, output); - snmp.send(snmp_msg, ipAddr, SNMP::Port::SNMP); - delete snmp_msg; - success = true; - } - if (success) { - SNMP::Message *snmp_msg = mpod.read(channel); - snmp.send(snmp_msg, ipAddr, SNMP::Port::SNMP); - delete snmp_msg; + if (output != NONE && channel != 0) { + setChannelAndWait(&ipAddr, channel, output); + success = true; // validates input parameters, not MPOD status, reported separately } String http_msg = "{\n"; @@ -186,7 +179,11 @@ void pollMPODChannel() { SNMP::Message *snmp_msg = mpod.read(channel); snmp.send(snmp_msg, ipAddr, SNMP::Port::SNMP); delete snmp_msg; - ret = mpod.toJSON(); // TODO: This has stale info at this stage! + + delay(MPOD_UPDATE_LATENCY); + snmp.loop(); // Force loop to update now + + ret = mpod.toJSON(); } String http_msg = "{\n"; -- GitLab