Newer
Older
#include "powerproc.hpp"
#include "mpod.hpp"
PowerProcedure::PowerProcedure(const IPAddress& ipAddr)
: ipAddr(ipAddr), stagesCount(STAGESCOUNT), currentStage(""), currentChannel(-1) {
stages = new Stage[stagesCount];
stages[0].name = "ASICS";
stages[0].type = SWITCH;
stages[0].size = 15;
stages[0].channels = new int[stages[0].size]{
508, 708, // MBJT
503, 504, // AM, RB
502, 506, 602, 606, // RB
501, 505, 601, 605, // IOB
507, 607, 608 // IOBA
};
stages[1].name = "HV";
stages[1].type = SWITCH;
stages[1].size = 40;
stages[1].channels = new int[stages[1].size]{
1, 2, 3, 4, 5, 6, 7, 8, // IS
101, 103, 102, 104, // M1 RING1
113, 114, 115, 116, // M2 RING1
213, 214, 215, 216, // M3 RING1
201, 203, 202, 204, // M4 RING1
105, 106, 107, 108, // M1 BACK
109, 110, 111, 112, // M2 BACK
209, 210, 211, 212, // M3 BACK
205, 206, 207, 208, // M4 BACK
};
stages[2].name = "ISVOLTAGE";
stages[2].type = VOLTAGE;
stages[2].size = 8;
stages[2].channels = new int[stages[2].size]{
1, 2, // M1
3, 4, // M2
5, 6, // M3
7, 8 // M4
};
stages[2].onValue = new float[stages[2].size]{10, 10, 10, 10, 10, 10, 10, 10};
stages[2].offValue = new float[stages[2].size]{2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5};
stages[3].type = SWITCH;
stages[3].size = 36;
stages[3].channels = new int[stages[3].size]{
701, 801, 802, 803, 804, // M1 PLC
702, 805, 806, 807, 808, // M2 PLC
703, 901, 902, 903, 904, // M3 PLC
704, 905, 906, 907, 908, // M4 PLC
301, 302, 303, 304, // M1 SG
305, 306, 307, 308, // M2 SG
401, 402, 403, 404, // M3 SG
405, 406, 407, 408, // M4 SG
};
}
PowerProcedure::~PowerProcedure() {
for (size_t stageIdx = 0; stageIdx < stagesCount; stageIdx++) {
delete[] stages[stageIdx].channels;
if (stages[stageIdx].type == VOLTAGE) {
delete[] stages[stageIdx].onValue;
delete[] stages[stageIdx].offValue;
}
}
String PowerProcedure::toJSON() {
String json = "{\n";
json += "\"target\":\"" + ipAddr.toString() + "\",\n";
json += "\"groups\": [\n";
for (size_t stageIdx = 0; stageIdx < stagesCount; stageIdx++) {
Stage* currentStage = &stages[stageIdx];
if (currentStage->type == VOLTAGE) {
continue;
}
json += "{\"name\":\"" + currentStage->name + "\",";
json += "\"channels\":[\n";
for (size_t ch = 0; ch < currentStage->size; ch++) {
SNMP::Message* snmp_msg = mpod.read(currentStage->channels[ch]);
snmp.send(snmp_msg, ipAddr, SNMP::Port::SNMP);
delete snmp_msg;
delay(MPOD_UPDATE_LATENCY);
snmp.loop(); // Force loop to update now
json += mpod.toJSON();
json += ",\n";
}
json.remove(json.lastIndexOf(','), 1); // Remove trailing comma of last entry
json += "]\n";
json += "},\n";
}
json.remove(json.lastIndexOf(','), 1); // Remove trailing comma of last entry
json += "]\n"; // groups body
json += "}"; // json body
return json;
}
bool PowerProcedure::powerOn(const String& stage) {
for (size_t stageIdx = 0; stageIdx < stagesCount; stageIdx++) {
Stage* currentStage = &stages[stageIdx];
if (currentStage->name == stage) {
for (size_t chIdx = 0; chIdx < currentStage->size; chIdx++) {
if (currentStage->type == SWITCH) {
setChannelStateAndWait(&ipAddr, currentStage->channels[chIdx], 1); // 1 == ON
} else if (currentStage->type == VOLTAGE) {
setChannelVoltageAndWait(&ipAddr, currentStage->channels[chIdx],
currentStage->onValue[chIdx]);
}
}
return true;
}
}
return false; // Invalid group name
}
bool PowerProcedure::powerOff(const String& stage) {
for (size_t stageIdx = 0; stageIdx < stagesCount; stageIdx++) {
Stage* currentStage = &stages[stageIdx];
if (currentStage->name == stage) {
for (int chIdx = currentStage->size - 1; chIdx >= 0; chIdx--) {
if (currentStage->type == SWITCH) {
setChannelStateAndWait(&ipAddr, currentStage->channels[chIdx], 0); // 0 == OFF
} else if (currentStage->type == VOLTAGE) {
setChannelVoltageAndWait(&ipAddr, currentStage->channels[chIdx],
currentStage->offValue[chIdx]);
}
}
return true;
}
}
return false; // Invalid group name
}
PowerProcedure pproc(IPAddress(192, 168, 140, 106));