machines/projects/pid-controller/firmware/addons/Status.h
2023-11-12 21:43:05 +01:00

111 lines
2.0 KiB
C++

#ifndef STATUS_H
#define STATUS_H
#include "../addon.h"
#include "../types.h"
#include "../common/macros.h"
#include <Arduino.h>
class Status : public Addon
{
public:
Status(short _errorPin, short _okPin) : errorPin(_errorPin),
okPin(_okPin),
status_blink_TS(0),
doBlink(false),
last_blink(true),
blink_start_ts(0),
max_blink_time(HOUR_MS),
Addon(STATUS_STR, STATUS)
{
}
short setup()
{
pinMode(okPin, OUTPUT);
pinMode(errorPin, OUTPUT);
}
short loop()
{
if (now - status_blink_TS > 1000)
{
status_blink_TS = millis();
last_blink = !last_blink;
if (doBlink)
{
digitalWrite(errorPin, last_blink);
}
if (now - blink_start_ts > max_blink_time)
{
doBlink = false;
}
}
}
void status_blink(bool blink)
{
if (!doBlink && blink)
{
blink_start_ts = millis();
}
doBlink = blink;
}
void setStatusAllOn()
{
if (doBlink)
{
return;
}
digitalWrite(errorPin, HIGH);
digitalWrite(okPin, HIGH);
}
void setStatusAllOff()
{
if (doBlink)
{
return;
}
digitalWrite(errorPin, LOW);
digitalWrite(okPin, LOW);
}
void setStatus(bool error)
{
if (doBlink)
{
return;
}
if (error)
{
digitalWrite(errorPin, HIGH);
digitalWrite(okPin, LOW);
}
else
{
digitalWrite(okPin, HIGH);
digitalWrite(errorPin, LOW);
}
}
void info(Stream *stream)
{
*stream << this->name << "\n\t : " SPACE("Error Pin:" << errorPin) << SPACE("\t | Ok Pin :" << okPin);
}
private:
millis_t status_blink_TS;
bool doBlink;
bool last_blink;
millis_t blink_start_ts;
millis_t max_blink_time;
short okPin;
short errorPin;
};
#endif