DreherTankController/src/faults/faults.h

125 lines
3.5 KiB
C++

#ifndef FAULTS_H_INCLUDED
#define FAULTS_H_INCLUDED
#include <Arduino.h>
#include "../macros.h"
enum FaultCode : u8
{
invalidCode = 0,
t1TooHi, t1TooLo, t1Invalid,
t2TooHi, t2TooLo, t2Invalid,
pTooHi, pTooLo, pInvalid
};
enum FaultState : u8
{
noFault, activeFault, inactiveFault
};
struct SavedFault
{
FaultCode code; // Fehlercode
u16 id; // ID, mit der der Master den Alarm identifizieren kann
u16 counterActivated; // Wie oft der Regler seit dem Alarm gestartet/resetted wurde
u16 counterDeactivated; // Wie oft der Regler seit der Alarm-Deaktivierung gestartet/resetted wurde
bool active; // Ob der Fehler beim Ausschalten noch vorhanden war
bool deactivated; // Ob der Fehler vor dem Ausschalten noch behoben wurde
};
class Fault
{
public:
Fault();
Fault(FaultCode, const u16);
Fault(const Fault&);
Fault(const SavedFault&);
void process();
const char* title();
const char* activatedText();
const char* deactivatedText();
FaultCode code; // Fehlercode
u16 id; // ID, mit der der Master den Alarm identifizieren kann
u16 counterActivated; // Wie oft der Regler seit der Alarm-Aktivierung gestartet/resetted wurde
u16 counterDeactivated; // Wie oft der Regler seit der Alarm-Deaktivierung gestartet/resetted wurde
u32 timeActivated; // millis() zum Zeitpunkt des Fehlers
u32 timeDeactivated = 0xFFFFFFFF; // millis(), als die Fehlerursache nicht mehr vorhanden war
bool timeActivatedOverflow = false; // Ob schon mehr als 0xFFFFFFFF (u32) ms vergangen sind
bool timeDeactivatedOverflow = false; // Ob schon mehr als 0xFFFFFFFF (u32) ms vergangen sind
bool active = true; // Ob der Fehler noch vorhanden ist
private:
bool _of1 = false;
bool _of2 = false;
};
struct FaultSettings
{
uint8_t acoustic = 0xFF;
uint8_t optical = 0xFF;
uint8_t tOnIfError = 0xFF;
uint8_t pOnIfError = 0xFF;
int16_t tMinRRate = 0x8000; // Hundertstel-°C / 5 Minuten
int16_t tMinFRate = 0x8000; // Hundertstel-°C / 5 Minuten
int16_t pMinRate = 0x8000; // Hundertstel-Bar / 5 Minuten
};
class FaultList
{
public:
FaultList();
void process();
bool check(FaultCode, int16_t val=0);
u8 count();
Fault* first();
Fault* last();
Fault* at(const u8);
bool removeID(const u16);
bool removeOne(const u8);
bool removeAll();
FaultState state();
void t1Idle();
void t1Idle(const int16_t);
void t2Idle();
void t2Idle(const int16_t);
void pIdle();
void pIdle(const int16_t);
const char* menu();
bool tActive();
bool pActive();
private:
Fault _list[_MAX_FAULTS];
u8 _size = 0;
u16 _lastID;
FaultState _state = noFault;
FaultCode _lastActiveT1Fault = invalidCode;
FaultCode _lastActiveT2Fault = invalidCode;
FaultCode _lastActivePFault = invalidCode;
bool _t1Active = false;
bool _t2Active = false;
bool _pActive = false;
u32 _lastT1Idle;
u32 _lastT2Idle;
u32 _lastPIdle;
int16_t _compT1;
int16_t _compT2;
int16_t _compP;
String _str;
bool _removeAllActive = false;
bool _tStateBefore;
bool _pIncBefore;
bool _pDecBefore;
void _save(const u8);
void _saveSize();
void _saveLastID();
void _test(Fault&, const bool&, const FaultCode&);
void _setModbusAlarm(const Fault&, const u8, const bool);
};
extern FaultList faults;
extern FaultSettings faultSettings;
// extern const u8 EEPROM_FAULTS[];
#endif // FAULTS_H_INCLUDED