DreherTankController/src/controller/controller.h

93 lines
2.9 KiB
C++

#ifndef MY_CONTROLLER_H_INCLUDED
#define MY_CONTROLLER_H_INCLUDED
#include "../OneWire/OneWire.h"
#include "../DallasTemperature/DallasTemperature.h"
#include "../display/display.h"
#include "../faults/faults.h"
#include "../macros.h"
#include "../types.h"
#define _TEMP_CONVERSION_DELAY 800
#define _ANALOG_READ_DELAY 500
// Maximal nötige Anzahl an Druck-Einträgen, bevor der interne 12 Bit Timer überläuft
#define _P_ARR_LEN ((409600 / _ANALOG_READ_DELAY) + 1)
#if _MODBUS_AVERAGE_TEMPERATURES == 1
// Maximal nötige Anzahl an Temperatur-Einträgen, bevor der interne 12 Bit Timer überläuft
#define _T_ARR_LEN (409600 / _TEMP_CONVERSION_DELAY) + 1
#endif
extern u16 modbusData[];
extern Display display;
class Controller
{
private:
const uint8_t _aPin;
uint8_t _prPin;
uint8_t _pfPin;
uint8_t _t1Pin;
uint8_t _t2Pin;
#if _MODBUS_AVERAGE_TEMPERATURES == 1
int16_t _t1_arr[_T_ARR_LEN]; // Array, aus dem der Durchschnittswert ermittelt wird
u16 _t1_c = 0; // Anzahl der Einträge, aus denen der Durchschnitt gebildet wird
bool _t1_of = false; // Flag, die anzeigt, ob das _t1_arr-Array schon voll ist
// int16_t _t2_arr[_T_ARR_LEN]; // Array, aus dem der Durchschnittswert ermittelt wird
u16 _t2_c = 0; // Anzahl der Einträge, aus denen der Durchschnitt gebildet wird
bool _t2_of = false; // Flag, die anzeigt, ob das _t2_arr-Array schon voll ist
#endif
int16_t _p_arr[_P_ARR_LEN]; // Array, aus dem der Durchschnittswert ermittelt wird
u16 _p_i_curr = 0; // Aktueller Index des _p_arr-Arrays
u16 _p_i_mb_start = 0;
u16 _p_i_fault_start = 0;
bool _p_mb_full = false; // ob das _p_arr-Array für Modbus komplett gelesen werden soll
OneWire _oneWire;
DallasTemperature _dallas;
DeviceAddress _tempAddr1;
enum States : uint8_t { stateIdle, stateRising, stateFalling };
States _tState = stateIdle;
States _pState = stateIdle;
bool _initOk = false;
bool _requestConversion;
unsigned long _lastConversion;
unsigned long _lastAnalogRead;
u16 _rawP;
// u32 _lastT1Idle;
// u32 _lastT2Idle;
// u32 _lastPIdle;
// u32 _lastFaultCheck;
// u32 _lastT2checked;
// u32 _lastPchecked;
void _setT1Valve(uint8_t, States);
void _setPValves(States);
#if _MODBUS_AVERAGE_TEMPERATURES == 1
void _averageTemperature1();
void _averageTemperature2();
#endif // _MODBUS_AVERAGE_TEMPERATURES == 1
inline void _averagePressure();
inline int16_t _buildAveragePForFaultDetection();
public:
Controller(const uint8_t pAnalaogPin,
const uint8_t oneWirePin,
const uint8_t pRisePin,
const uint8_t t1Pin,
const uint8_t t2Pin,
const uint8_t pFallPin
);
void init(bool startup=false);
void process();
#if _MODBUS == 1
void resetAverageCounters();
#endif
};
#endif // MY_CONTROLLER_H_INCLUDED