MeterBusPowerMaster/overCurrentProt.cpp
2014-03-16 17:35:10 +01:00

67 lines
1.5 KiB
C++

#include <arduino.h>
#include <stdint.h>
#include "overCurrentProt.h"
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) {
return String("") + m_overCurrentProt->getEventCnt();
}
OverCurrentResetCmd::OverCurrentResetCmd(OverCurrentProt *overCurrentProt) : m_overCurrentProt(overCurrentProt) {
}
String OverCurrentResetCmd::exec(String params) {
m_overCurrentProt->resetEventCnt();
return "done";
}
OverCurrentProt::OverCurrentProt() : m_overCurrentProtCmd(this), m_overCurrentResetCmd(this), m_eventCnt(0), m_timestamp(0) {
}
void OverCurrentProt::begin(CmdServer *cmdServer) {
m_overCurrentProtCmd.registerYourself(cmdServer);
m_overCurrentResetCmd.registerYourself(cmdServer);
pinMode(CURRENT_SHUTDOWN, OUTPUT);
digitalWrite(CURRENT_SHUTDOWN, CURRENT_ON);
overCurrentMarker = false;
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);
}
}