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;
extern bool eth_connected;
extern SNMP::Manager snmp;
TaskHandle_t restServerTask;
TaskHandle_t powerProcedureTask;
void setup() {
Serial.begin(115200);
......@@ -20,8 +23,15 @@ void setup() {
PINS.last_triggered = millis();
PINS.stage = "";
PINS.ramping = false;
PINS.canDoPowerFromREST = false;
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 {
......@@ -37,13 +47,51 @@ void serialLoop() {
}
}
void loop() {
isr_check_loop();
snmp.loop();
restServer.handleClient();
toggle_status_led();
serialLoop();
if (eth_connected) { // We may be triggered, but disconnected from the network.
powerOffCheckLoop();
void waitEnvOk() {
// Poll port expander on initialiation to wait until environment all ok
// If the ICBM is booted before the detector is up, as it should be,
// then the environment will always be incorrect, creating a power down
PINS.stage = "Waiting for environment to be okay first time";
uint32_t lastIteration = millis();
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
delay(MPOD_UPDATE_LATENCY);
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;
ramping = (mpod.isRampingUp() || mpod.isRampingDown());
if (!ramping) {
......@@ -267,7 +273,7 @@ void setChannelStateAndWait(const IPAddress *ipAddr, const uint16_t channel, con
settingChannelState = false;
} else if (loopCount >= 5) {
// 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.println(channel);
SNMP::Message *snmp_msg = mpod.setChannelState(channel, output);
......
......@@ -72,6 +72,7 @@ void isr_check_loop() {
// If not all ok, set the power down flag, later handled.
if (!(PINS.sib && PINS.plc && PINS.ups)) {
PERFORM_PROCEDURE_FROM_INTERRUPT = 1;
PINS.canDoPowerFromREST = true;
}
}
......
......@@ -26,6 +26,7 @@ struct pins {
int last_triggered;
String stage;
bool ramping;
bool canDoPowerFromREST;
};
extern struct pins PINS;
......
......@@ -25,6 +25,8 @@ void initializeRoutes() {
restServer.on("/", panel);
restServer.on("/poll", pollMPODChannel);
restServer.on("/mpodstatus", getMpodStatus);
restServer.on("/power", powerGroup);
restServer.on("/alloff", powerAllOff);
......@@ -82,9 +84,9 @@ void identify() {
message += "\"ramping\":";
message += PINS.ramping;
message += ",\n";
message += "\"stage\":";
message += "\"stage\": \"";
message += PINS.stage;
message += ",\n";
message += "\"\n";
message += "\n}";
message += "\n}";
......@@ -131,6 +133,10 @@ enum {
};
void sendSNMP() {
if (PINS.ramping) {
restServer.send(403, "text/json", "{\"success\": 0, \"reason\": \"ramping ongoing\"}");
return;
}
uint8_t output = NONE;
uint16_t channel = 0;
bool success = false;
......@@ -177,7 +183,20 @@ void sendSNMP() {
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() {
if (PINS.ramping) {
restServer.send(403, "text/json", "{\"success\": 0, \"reason\": \"ramping ongoing\"}");
return;
}
String output;
String group;
String ret;
......@@ -202,11 +221,19 @@ void powerGroup() {
}
if (output && group) {
PINS.ramping = true;
PINS.stage = group;
if (output == "on") {
PINS.stage += " going up";
success = pproc.powerOn(group);
} else if (output == "off") {
PINS.stage += " going down";
success = pproc.powerOff(group);
}
PINS.ramping = false;
PINS.stage = "";
}
String http_msg = "{\n";
......@@ -224,6 +251,10 @@ void powerGroup() {
}
void powerAllOff() {
if (PINS.ramping) {
restServer.send(403, "text/json", "{\"success\": 0, \"reason\": \"ramping ongoing\"}");
return;
}
String group;
String groups;
bool success = false;
......
......@@ -13,3 +13,4 @@ void panel(); // / show a status page
void pollMPODChannel(); // /poll?ch=1
void powerGroup(); // /power?group=ASICS&output=on
void powerAllOff(); // /alloff?token=CWH
void getMpodStatus(); // /mpodstatus