Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • detectors/dssc/icbm
1 result
Show changes
Commits on Source (5)
...@@ -7,6 +7,9 @@ unsigned long start; ...@@ -7,6 +7,9 @@ unsigned long start;
extern bool eth_connected; extern bool eth_connected;
extern SNMP::Manager snmp; extern SNMP::Manager snmp;
TaskHandle_t restServerTask;
TaskHandle_t powerProcedureTask;
void setup() { void setup() {
Serial.begin(115200); Serial.begin(115200);
...@@ -20,8 +23,15 @@ void setup() { ...@@ -20,8 +23,15 @@ void setup() {
PINS.last_triggered = millis(); PINS.last_triggered = millis();
PINS.stage = ""; PINS.stage = "";
PINS.ramping = false; PINS.ramping = false;
PINS.canDoPowerFromREST = false;
start = millis(); start = millis();
// Run the web interface on core 0
xTaskCreatePinnedToCore(webInterfaceLoop, "Web Interface", 10000, NULL, 1, &restServerTask, 0);
// Run the power procedure and interrupt handling on core 1, the default core
xTaskCreatePinnedToCore(mainLoop, "PowerProcedure Task", 10000, NULL, 1, &powerProcedureTask,
1);
} }
enum { enum {
...@@ -37,13 +47,51 @@ void serialLoop() { ...@@ -37,13 +47,51 @@ void serialLoop() {
} }
} }
void loop() { void waitEnvOk() {
isr_check_loop(); // Poll port expander on initialiation to wait until environment all ok
snmp.loop(); // If the ICBM is booted before the detector is up, as it should be,
restServer.handleClient(); // then the environment will always be incorrect, creating a power down
toggle_status_led(); PINS.stage = "Waiting for environment to be okay first time";
serialLoop();
if (eth_connected) { // We may be triggered, but disconnected from the network. uint32_t lastIteration = millis();
powerOffCheckLoop(); while (true) {
serialLoop();
if (millis() - lastIteration >= 200) { // ms, faster polling makes for erroneous readings.
poll_port_expander();
if (PINS.sib && PINS.plc && PINS.ups) {
break;
}
lastIteration = millis();
}
}
PINS.stage = "";
PINS.canDoPowerFromREST = true;
}
void webInterfaceLoop(void* pvParameters) {
Serial.print("Web loop running on core ");
Serial.println(xPortGetCoreID());
while (true) {
restServer.handleClient();
}
}
void mainLoop(void* pvParameters) {
Serial.print("Main loop running on core ");
Serial.println(xPortGetCoreID());
waitEnvOk();
while (true) {
isr_check_loop();
snmp.loop();
toggle_status_led();
serialLoop();
if (eth_connected) { // We may be triggered, but disconnected from the network.
powerOffCheckLoop();
}
} }
} }
void loop() {}
...@@ -260,6 +260,12 @@ void setChannelStateAndWait(const IPAddress *ipAddr, const uint16_t channel, con ...@@ -260,6 +260,12 @@ void setChannelStateAndWait(const IPAddress *ipAddr, const uint16_t channel, con
delay(MPOD_UPDATE_LATENCY); delay(MPOD_UPDATE_LATENCY);
snmp.loop(); snmp.loop();
if (mpod.getChannel() != channel) {
// We have stale information, because MPOD swallowed UDP request.
// Skip this update check and go for next iteration, where data will be requested
// or request resent.
continue;
}
loopCount += 1; loopCount += 1;
ramping = (mpod.isRampingUp() || mpod.isRampingDown()); ramping = (mpod.isRampingUp() || mpod.isRampingDown());
if (!ramping) { if (!ramping) {
...@@ -267,7 +273,7 @@ void setChannelStateAndWait(const IPAddress *ipAddr, const uint16_t channel, con ...@@ -267,7 +273,7 @@ void setChannelStateAndWait(const IPAddress *ipAddr, const uint16_t channel, con
settingChannelState = false; settingChannelState = false;
} else if (loopCount >= 5) { } else if (loopCount >= 5) {
// There were no changes in 5 reads, it might be that the command (UDP) // There were no changes in 5 reads, it might be that the command (UDP)
// got swallowed by the MPOD controller while doing something else. // got swallowed by the MPOD controller while it was doing something else.
Serial.print("!Resend command to "); Serial.print("!Resend command to ");
Serial.println(channel); Serial.println(channel);
SNMP::Message *snmp_msg = mpod.setChannelState(channel, output); SNMP::Message *snmp_msg = mpod.setChannelState(channel, output);
......
...@@ -72,6 +72,7 @@ void isr_check_loop() { ...@@ -72,6 +72,7 @@ void isr_check_loop() {
// If not all ok, set the power down flag, later handled. // If not all ok, set the power down flag, later handled.
if (!(PINS.sib && PINS.plc && PINS.ups)) { if (!(PINS.sib && PINS.plc && PINS.ups)) {
PERFORM_PROCEDURE_FROM_INTERRUPT = 1; PERFORM_PROCEDURE_FROM_INTERRUPT = 1;
PINS.canDoPowerFromREST = true;
} }
} }
......
...@@ -26,6 +26,7 @@ struct pins { ...@@ -26,6 +26,7 @@ struct pins {
int last_triggered; int last_triggered;
String stage; String stage;
bool ramping; bool ramping;
bool canDoPowerFromREST;
}; };
extern struct pins PINS; extern struct pins PINS;
......
...@@ -25,6 +25,8 @@ void initializeRoutes() { ...@@ -25,6 +25,8 @@ void initializeRoutes() {
restServer.on("/", panel); restServer.on("/", panel);
restServer.on("/poll", pollMPODChannel); restServer.on("/poll", pollMPODChannel);
restServer.on("/mpodstatus", getMpodStatus);
restServer.on("/power", powerGroup); restServer.on("/power", powerGroup);
restServer.on("/alloff", powerAllOff); restServer.on("/alloff", powerAllOff);
...@@ -82,9 +84,9 @@ void identify() { ...@@ -82,9 +84,9 @@ void identify() {
message += "\"ramping\":"; message += "\"ramping\":";
message += PINS.ramping; message += PINS.ramping;
message += ",\n"; message += ",\n";
message += "\"stage\":"; message += "\"stage\": \"";
message += PINS.stage; message += PINS.stage;
message += ",\n"; message += "\"\n";
message += "\n}"; message += "\n}";
message += "\n}"; message += "\n}";
...@@ -131,6 +133,10 @@ enum { ...@@ -131,6 +133,10 @@ enum {
}; };
void sendSNMP() { void sendSNMP() {
if (PINS.ramping) {
restServer.send(403, "text/json", "{\"success\": 0, \"reason\": \"ramping ongoing\"}");
return;
}
uint8_t output = NONE; uint8_t output = NONE;
uint16_t channel = 0; uint16_t channel = 0;
bool success = false; bool success = false;
...@@ -177,7 +183,20 @@ void sendSNMP() { ...@@ -177,7 +183,20 @@ void sendSNMP() {
restServer.send(success ? 200 : 406, "text/json", http_msg); restServer.send(success ? 200 : 406, "text/json", http_msg);
} }
void getMpodStatus() {
if (PINS.ramping) {
restServer.send(403, "text/json", "{\"success\": 0, \"reason\": \"ramping ongoing\"}");
return;
}
restServer.send(200, "text/json", pproc.toJSON());
}
void powerGroup() { void powerGroup() {
if (PINS.ramping) {
restServer.send(403, "text/json", "{\"success\": 0, \"reason\": \"ramping ongoing\"}");
return;
}
String output; String output;
String group; String group;
String ret; String ret;
...@@ -202,11 +221,19 @@ void powerGroup() { ...@@ -202,11 +221,19 @@ void powerGroup() {
} }
if (output && group) { if (output && group) {
PINS.ramping = true;
PINS.stage = group;
if (output == "on") { if (output == "on") {
PINS.stage += " going up";
success = pproc.powerOn(group); success = pproc.powerOn(group);
} else if (output == "off") { } else if (output == "off") {
PINS.stage += " going down";
success = pproc.powerOff(group); success = pproc.powerOff(group);
} }
PINS.ramping = false;
PINS.stage = "";
} }
String http_msg = "{\n"; String http_msg = "{\n";
...@@ -224,6 +251,10 @@ void powerGroup() { ...@@ -224,6 +251,10 @@ void powerGroup() {
} }
void powerAllOff() { void powerAllOff() {
if (PINS.ramping) {
restServer.send(403, "text/json", "{\"success\": 0, \"reason\": \"ramping ongoing\"}");
return;
}
String group; String group;
String groups; String groups;
bool success = false; bool success = false;
......
...@@ -13,3 +13,4 @@ void panel(); // / show a status page ...@@ -13,3 +13,4 @@ void panel(); // / show a status page
void pollMPODChannel(); // /poll?ch=1 void pollMPODChannel(); // /poll?ch=1
void powerGroup(); // /power?group=ASICS&output=on void powerGroup(); // /power?group=ASICS&output=on
void powerAllOff(); // /alloff?token=CWH void powerAllOff(); // /alloff?token=CWH
void getMpodStatus(); // /mpodstatus