DreherTankController/src/macros.h

251 lines
10 KiB
C++

#ifndef _MY_MACROS_H_INCLUDED
#define _MY_MACROS_H_INCLUDED
#define _DEBUG 1
#define _DEBUG_SENSORS 0
#define _DEBUG_DISPLAY 0
#define _DEBUG_MENU 0
#define _DEBUG_MODBUS 0
#define _MODBUS 1
// Das Ermitteln einer Durchschnittstemperatur braucht (zu) viel RAM und ist wahrscheinlich unnötig
#define _MODBUS_AVERAGE_TEMPERATURES 0
#define _REGS_INFRONTOF_EVENTS 6
// Ergibt sich aus 0xFF - 0x06, ev. wird
#define _MODBUS_MAX_EVENTS 249
#define _VERSION_MAJOR 0
#define _VERSION_MINOR 0
#define _VERSION_MICRO 1
#define _VERSION_NUMBER _VERSION_MICRO | (_VERSION_MINOR << 6) | (_VERSION_MAJOR << 12)
#define _VERSION_STRING "v0.0.1"
#define _MODBUS_ADDR_MIN 1
#define _MODBUS_ADDR_MAX 247 // Laut QModMaster letzte Adresse
#define _MODBUS_DELAY_MIN 0 // 1/10 Millisekunden
#define _MODBUS_DELAY_MAX 250 // 1/10 Millisekunden
#define _MODBUS_VALVE_T1_INDEX 0
#define _MODBUS_VALVE_T2_INDEX 1
#define _MODBUS_VALVE_PR_INDEX 2
#define _MODBUS_VALVE_PF_INDEX 3
#define _MODBUS_T1_INDEX 2
#define _MODBUS_T2_INDEX 3
#define _MODBUS_P_INDEX 4
#define _STD_TEMP_SETPOINT 400 // Hundertstel
#define _STD_TEMP_HYSTERESIS 10 // Hundertstel
#define _STD_P_SETPOINT 100 // Hundertstel
#define _STD_P_HYSTERESIS 5 // Hundertstel
#define _STD_P_EN_INC 1
#define _STD_P_EN_DEC 1
#define _STD_T_EN 1
#define _STD_C_EN 0
#define _MIN_TEMP_SETPOINT 10 // Hundertstel
#define _MAX_TEMP_SETPOINT 3000 // Hundertstel
#define _MIN_TEMP_HYSTERESIS 1 // Hundertstel
#define _MAX_TEMP_HYSTERESIS 100 // Hundertstel
#define _MIN_P_SETPOINT 0 // Hundertstel
#define _MAX_P_SETPOINT 300 // Hundertstel
#define _MIN_P_HYSTERESIS 1 // Hundertstel
#define _MAX_P_HYSTERESIS 50 // Hundertstel
#define _P_SENSOR_1_5V_0_5BAR 1
#define _P_SENSOR_0_5V_0_6BAR 2
#define _STD_FAULTS_ACOUSTIC 1
#define _STD_FAULTS_OPTICAL 1
#define _STD_FAULTS_T_ON 1
#define _STD_FAULTS_P_ON 0
#define _STD_FAULTS_T_R_RATE 10 // Hundertstel
#define _STD_FAULTS_T_F_RATE 10 // Hundertstel
#define _STD_FAULTS_P_RATE 10 // Hundertstel
#define _MIN_FAULTS_RATE 0 // Hundertstel
#define _MAX_FAULTS_RATE 1000 // Hundertstel
// Alarme
#define _MAX_FAULTS 30
// #define _CHECK_FAULT_INTERVAL 300000 // 5 Minuten
// #define _CHECK_FAULT_INTERVAL 3000 // 3 Sekunden (für Testzwecke)
// #define _CHECK_T_FAULT_INTERVAL 3600000 // 1 Stunde
// #define _CHECK_P_FAULT_INTERVAL 10000 // 10 Sekunden
#define _CHECK_T_FAULT_INTERVAL 3000 // 3 Sekunden (für Testzwecke)
#define _CHECK_P_FAULT_INTERVAL 3000 // 3 Sekunden (für Testzwecke)
// EEPROM Adressen:
#define _EEPROM_OFFSET 0 // Falls sich die Register nicht mehr beschreiben lassen
#define _EEPROM_MODBUS_ADDRESS (0 + _EEPROM_OFFSET) // 1 byte
#define _EEPROM_MODBUS_BAUDRATE (1 + _EEPROM_OFFSET) // 4 bytes
#define _EEPROM_MODBUS_DELAY (5 + _EEPROM_OFFSET) // 1 byte
#define _EEPROM_TEMP_SETPOINT (6 + _EEPROM_OFFSET) // 4 bytes
#define _EEPROM_TEMP_HYSTERESIS (10 + _EEPROM_OFFSET) // 4 bytes
#define _EEPROM_P_SETPOINT (14 + _EEPROM_OFFSET) // 4 bytes
#define _EEPROM_P_HYSTERESIS (18 + _EEPROM_OFFSET) // 4 bytes
#define _EEPROM_P_EN_INC (22 + _EEPROM_OFFSET) // 1 byte
#define _EEPROM_P_EN_DEC (23 + _EEPROM_OFFSET) // 1 byte
#define _EEPROM_P_SENSOR (24 + _EEPROM_OFFSET) // 1 byte
#define _EEPROM_BG_LIGHT (25 + _EEPROM_OFFSET) // 1 byte
#define _EEPROM_T_EN (26 + _EEPROM_OFFSET) // 1 byte
#define _EEPROM_CONTROL_EN (27 + _EEPROM_OFFSET) // 1 byte
// bisschen Reserveplatz
#define _EEPROM_POWERON_COUNT (48 + _EEPROM_OFFSET) // 2 bytes
#define _EEPROM_FAULT_SIZE 6 // 6 bytes für 1 Fehler
#define _EEPROM_FAULT_SETTINGS (50 + _EEPROM_OFFSET) // 20 bytes (incl. Reserve)
#define _EEPROM_FAULT_LAST_ID (70 + _EEPROM_OFFSET) // 2 byte
#define _EEPROM_FAULT_COUNT (72 + _EEPROM_OFFSET) // 1 byte
/*
* Bytes 1, 2: Alarm ID
* Bytes 3, 4: Bit 0...11: counterActivated
* Bytes 3, 4: Bit 12...15: Alarm-Code
* Bytes 5, 6: Bit 0...11: counterDeactivated
* Bytes 5, 6: Bit 12...13: active, deactivated
* Bytes 5, 6: Bit 14...15: reserviert
*/
#define _EEPROM_FAULT_1 (73 + _EEPROM_OFFSET)
#define _EEPROM_FAULT_2 (_EEPROM_FAULT_1 + _EEPROM_OFFSET + _EEPROM_FAULT_SIZE)
#define _EEPROM_FAULT_3 (_EEPROM_FAULT_2 + _EEPROM_OFFSET + _EEPROM_FAULT_SIZE)
#define _EEPROM_FAULT_4 (_EEPROM_FAULT_3 + _EEPROM_OFFSET + _EEPROM_FAULT_SIZE)
#define _EEPROM_FAULT_5 (_EEPROM_FAULT_4 + _EEPROM_OFFSET + _EEPROM_FAULT_SIZE)
#define _EEPROM_FAULT_6 (_EEPROM_FAULT_5 + _EEPROM_OFFSET + _EEPROM_FAULT_SIZE)
#define _EEPROM_FAULT_7 (_EEPROM_FAULT_6 + _EEPROM_OFFSET + _EEPROM_FAULT_SIZE)
#define _EEPROM_FAULT_8 (_EEPROM_FAULT_7 + _EEPROM_OFFSET + _EEPROM_FAULT_SIZE)
#define _EEPROM_FAULT_9 (_EEPROM_FAULT_8 + _EEPROM_OFFSET + _EEPROM_FAULT_SIZE)
#define _EEPROM_FAULT_10 (_EEPROM_FAULT_9 + _EEPROM_OFFSET + _EEPROM_FAULT_SIZE)
#define _EEPROM_FAULT_11 (_EEPROM_FAULT_10 + _EEPROM_OFFSET + _EEPROM_FAULT_SIZE)
#define _EEPROM_FAULT_12 (_EEPROM_FAULT_11 + _EEPROM_OFFSET + _EEPROM_FAULT_SIZE)
#define _EEPROM_FAULT_13 (_EEPROM_FAULT_12 + _EEPROM_OFFSET + _EEPROM_FAULT_SIZE)
#define _EEPROM_FAULT_14 (_EEPROM_FAULT_13 + _EEPROM_OFFSET + _EEPROM_FAULT_SIZE)
#define _EEPROM_FAULT_15 (_EEPROM_FAULT_14 + _EEPROM_OFFSET + _EEPROM_FAULT_SIZE)
#define _EEPROM_FAULT_16 (_EEPROM_FAULT_15 + _EEPROM_OFFSET + _EEPROM_FAULT_SIZE)
#define _EEPROM_FAULT_17 (_EEPROM_FAULT_16 + _EEPROM_OFFSET + _EEPROM_FAULT_SIZE)
#define _EEPROM_FAULT_18 (_EEPROM_FAULT_17 + _EEPROM_OFFSET + _EEPROM_FAULT_SIZE)
#define _EEPROM_FAULT_19 (_EEPROM_FAULT_18 + _EEPROM_OFFSET + _EEPROM_FAULT_SIZE)
#define _EEPROM_FAULT_20 (_EEPROM_FAULT_19 + _EEPROM_OFFSET + _EEPROM_FAULT_SIZE)
#define _EEPROM_FAULT_21 (_EEPROM_FAULT_20 + _EEPROM_OFFSET + _EEPROM_FAULT_SIZE)
#define _EEPROM_FAULT_22 (_EEPROM_FAULT_21 + _EEPROM_OFFSET + _EEPROM_FAULT_SIZE)
#define _EEPROM_FAULT_23 (_EEPROM_FAULT_22 + _EEPROM_OFFSET + _EEPROM_FAULT_SIZE)
#define _EEPROM_FAULT_24 (_EEPROM_FAULT_23 + _EEPROM_OFFSET + _EEPROM_FAULT_SIZE)
#define _EEPROM_FAULT_25 (_EEPROM_FAULT_24 + _EEPROM_OFFSET + _EEPROM_FAULT_SIZE)
#define _EEPROM_FAULT_26 (_EEPROM_FAULT_25 + _EEPROM_OFFSET + _EEPROM_FAULT_SIZE)
#define _EEPROM_FAULT_27 (_EEPROM_FAULT_26 + _EEPROM_OFFSET + _EEPROM_FAULT_SIZE)
#define _EEPROM_FAULT_28 (_EEPROM_FAULT_27 + _EEPROM_OFFSET + _EEPROM_FAULT_SIZE)
#define _EEPROM_FAULT_29 (_EEPROM_FAULT_28 + _EEPROM_OFFSET + _EEPROM_FAULT_SIZE)
#define _EEPROM_FAULT_30 (_EEPROM_FAULT_29 + _EEPROM_OFFSET + _EEPROM_FAULT_SIZE)
// bisschen Reserveplatz
#define _EEPROM_FAULTS_ACOUSTIC 300 // 1 byte
#define _EEPROM_FAULTS_OPTICAL 301 // 1 byte
#define _EEPROM_FAULTS_T_ON 302 // 1 byte
#define _EEPROM_FAULTS_P_ON 303 // 1 byte
#define _EEPROM_FAULTS_T_R_RATE 304 // 2 bytes
#define _EEPROM_FAULTS_T_F_RATE 306 // 2 bytes
#define _EEPROM_FAULTS_P_RATE 308 // 2 bytes
extern u32 currMillis;
#if _DEBUG == 1
#define _print(s) Serial.print(s)
#define _println(s) Serial.println(s)
#define _printf(s) Serial.print(F(s))
#define _printlnf(s) Serial.println(F(s))
#if _DEBUG_DISPLAY == 1
struct __printTimeStruct {
__printTimeStruct(const char *text) : _text(text) {
_t0 = currMillis;
};
~__printTimeStruct() {
_printf("Vergangene Millisekunden ["); _print(_text);
_printf("]: "); _println(currMillis - _t0);
};
private:
u32 _t0;
const char *_text;
};
#define _printtime(text) __printTimeStruct __printt(text)
#else
#define _printtime(text)
#endif // _DEBUG_DISPLAY
#if _DEBUG_SENSORS == 1
#define _prints(s) _print(s)
#define _printsln(s) _println(s)
#define _printsf(s) _printf(s)
#define _printslnf(s) _printlnf(s)
#else
#define _prints(s)
#define _printsln(s)
#define _printsf(s)
#define _printslnf(s)
#endif // _DEBUG_SENSORS
#if _DEBUG_MODBUS == 1
#define _printb(s) _print(s)
#define _printbln(s) _println(s)
#define _printbf(s) _printf(s)
#define _printblnf(s) _printlnf(s)
#else
#define _printb(s)
#define _printbln(s)
#define _printbf(s)
#define _printblnf(s)
#endif // _DEBUG_MODBUS
#if _DEBUG_MENU == 1
#define _printm(s) _print(s)
#define _printmln(s) _println(s)
#define _printmf(s) _printf(s)
#define _printmlnf(s) _printlnf(s)
#else
#define _printm(s)
#define _printmln(s)
#define _printmf(s)
#define _printmlnf(s)
#endif // _DEBUG_MENU
#else // _DEBUG != 1
#define _print(s)
#define _println(s)
#define _printf(s)
#define _printlnf(s)
#define _prints(s)
#define _printsln(s)
#define _printsf(s)
#define _printslnf(s)
#define _printb(s)
#define _printbln(s)
#define _printbf(s)
#define _printblnf(s)
#define _printm(s)
#define _printmln(s)
#define _printmf(s)
#define _printmlnf(s)
#define _printtime(s)
#endif
#if _MODBUS == 1
extern bool timeStampOverflow;
extern unsigned long timeStamp;
extern u8 modbusValves[];
extern u16 &eventCounter;
extern u16 modbusData[];
#define _setModbusValve(index, val)\
if (bitRead(modbusValves[0], index) != val) {\
bitWrite(modbusValves[0], index, val);\
bitWrite(modbusData[1], index+8, val);\
if (eventCounter <= _MODBUS_MAX_EVENTS) {\
/* Die ersten 12 Bits beinhalten den relativen Zeitstempel in Zehntelsekunden */\
/* Dieser Stempel ist immer 0xFFF, falls schon zuviel Zeit seit der letzten Referenzierung vergangen ist */\
/* u16 result = (timeStampOverflow) ? 0xFFF : ((currMillis - timeStamp) / 100) & 0xFFF;*/\
u16 result = (timeStampOverflow) ? 0xFFF : (modbusData[5] & 0xFFF);\
/* Die Bits 12...14 beinhalten die Nr des geschalteten Ausgangs */\
result |= index << 12;\
/* Das MSB gibt an, ob der Ausgang ein- oder ausgeschaltet wurde */\
result |= val << 15;\
modbusData[_REGS_INFRONTOF_EVENTS + eventCounter] = result;\
eventCounter++;\
}\
}
#else
#define _setModbusValve(index, val)
#endif // _MODBUS == 1
#endif // _MY_MACROS_H_INCLUDED