NetMeterbusMaster/overCurrentProt.cpp

87 lines
2.2 KiB
C++
Raw Permalink Normal View History

2014-05-14 19:37:04 +02:00
#include <stdint.h>
#include "overCurrentProt.h"
#include <Streaming.h>
2014-05-14 19:37:04 +02:00
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;
2014-05-14 19:37:04 +02:00
}
OverCurrentProt::OverCurrentProt() : m_overCurrentProtCmd(this),
2014-05-14 19:37:04 +02:00
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);
}
}