#include #include "overCurrentProt.h" #include volatile bool overCurrentMarker; void overCurrentProtServiceRoutine() { // switch off current digitalWrite(CURRENT_SHUTDOWN, CURRENT_OFF); // set marker overCurrentMarker = true; Serial.println("X"); } OverCurrentProtCmd::OverCurrentProtCmd(OverCurrentProt *overCurrentProt) : m_overCurrentProt(overCurrentProt) { } String OverCurrentProtCmd::exec(String params) { String res = "done"; Print *out = m_server; if (params.equalsIgnoreCase("help")) { *out << "help ..... this help page" << endl; *out << "show ..... show statistics" << endl; *out << "reset .... reset statistics" << endl; *out << "disable .. disable loop" << endl; *out << "enable ... enable loop" << endl; *out << endl; } else if (params.equalsIgnoreCase("enable")) { digitalWrite(CURRENT_SHUTDOWN, CURRENT_ON); *out << "Loop enabled" << endl; } else if (params.equalsIgnoreCase("disable")) { digitalWrite(CURRENT_SHUTDOWN, CURRENT_OFF); *out << "Loop disabled" << endl; } else if (params.equalsIgnoreCase("show")) { *out << "Over current counter: " << m_overCurrentProt->getEventCnt() << endl; } else if (params.equalsIgnoreCase("reset")) { m_overCurrentProt->resetEventCnt(); *out << "Over current counter reseted" << endl; } else { *out << "unknown subcommand" << endl; res = "failed"; } return res; } OverCurrentProt::OverCurrentProt() : m_overCurrentProtCmd(this), m_eventCnt(0), m_timestamp(0) { } void OverCurrentProt::begin(CmdServer *cmdServer) { m_overCurrentProtCmd.registerYourself(cmdServer); pinMode(CURRENT_SHUTDOWN, OUTPUT); digitalWrite(CURRENT_SHUTDOWN, CURRENT_ON); overCurrentMarker = false; pinMode(CURRENT_INTERRUPT, INPUT); attachInterrupt(CURRENT_INTERRUPT, overCurrentProtServiceRoutine, FALLING); Serial.println("OC ready"); } void OverCurrentProt::exec() { if ((m_timestamp == 0) && overCurrentMarker) { m_eventCnt++; m_timestamp = millis(); } if ((m_timestamp != 0) && ((m_timestamp + TURN_ON_DELAY) < millis())) { overCurrentMarker = false; m_timestamp = 0; digitalWrite(CURRENT_SHUTDOWN, CURRENT_ON); } }