DreherTankController/src/display/display.h

199 lines
6.5 KiB
C++

#ifndef MY_DISPLAY_H_INCLUDED
#define MY_DISPLAY_H_INCLUDED
#include <U8g2lib.h>
#include "../types.h"
#include "../macros.h"
#include "../faults/faults.h"
//#define _STD_FONT u8g2_font_ncenB10_te
//#define _FIRS_LINE_Y 11
//#define _STD_LINEHEIGHT 12
#define _STD_FONT u8g2_font_fub11_tf
#define _FIRS_LINE_Y 12
#define _STD_LINEHEIGHT 13
#define _SEL_FONT u8g2_font_6x10_tf
#define _FIRS_LINE_Y 12
#define _STD_LINEHEIGHT 13
#define _BEGIN_FAST_STEPS_DELAY 500
#define _BEGIN_BIG_STEPS_DELAY 3000
#define _FAST_STEP_MS 110
#define _BIG_STEP 10
#define _BACK_TO_HOME_SCREEN 1
#define _MENU_MAIN 1
#define _MENU_SYSTEM 10
#define _MENU_SETTINGS_MODBUS 11
#define _MENU_TEMPERATURE 12
#define _MENU_PRESSURE 13
#define _MENU_FAULTS_MAIN 20
#define _MENU_FAULTS_OPEN 21
#define _MENU_FAULTS_SETTINGS 22
#define _SELECTION_TEMPERATURE_ENABLED 100
#define _SELECTION_TEMPERATURE_SETPOINT 101
#define _SELECTION_TEMPERATURE_HYSTERESIS 102
#define _SELECTION_PRESSURE_ENABLE_INCREASE 110
#define _SELECTION_PRESSURE_ENABLE_DECREASE 111
#define _SELECTION_PRESSURE_SETPOINT 115
#define _SELECTION_PRESSURE_HYSTERESIS 116
#define _SELECTION_FAULTS_ACOUSTIC 125
#define _SELECTION_FAULTS_OPTICAL 126
#define _SELECTION_FAULTS_T_OFF 127
#define _SELECTION_FAULTS_P_OFF 128
#define _SELECTION_FAULTS_T_R_RATE 129
#define _SELECTION_FAULTS_T_F_RATE 130
#define _SELECTION_FAULTS_P_RATE 131
#define _SELECTION_MODBUS_BAUDRATE 150
#define _SELECTION_MODBUS_ADDRESS 151
#define _SELECTION_MODBUS_DELAY 152
#define _SELECTION_P_SENSOR 200
#define _SELECTION_CLEAR_FAULTS 220
#define _SELECTION_RESET 255
#define _FAULT_INFO 170
#define _VERIFY_ADMIN 253
#define _ADMIN_CODE 42
#define _POS_TEMPERATURE_MENU 0
#define _POS_TEMPERATURE_ENABLED 0
#define _POS_TEMPERATURE_SETPOINT 1
#define _POS_TEMPERATURE_HYSTERESIS 2
#define _POS_PRESSURE_MENU 1
#define _POS_PRESSURE_ENABLE_INCREASE 0
#define _POS_PRESSURE_ENABLE_DECREASE 1
#define _POS_PRESSURE_SETPOINT 2
#define _POS_PRESSURE_HYSTERESIS 3
#define _POS_FAULTS_MAIN 2
#define _POS_FAULTS_OPEN 0
#define _POS_FAULTS_CLEAR 1
#define _POS_FAULTS_SETTINGS 2
#define _POS_FAULTS_ACOUSTIC 0
#define _POS_FAULTS_OPTICAL 1
#define _POS_FAULTS_T_OFF 2
#define _POS_FAULTS_P_OFF 3
#define _POS_FAULTS_T_R_RATE 4
#define _POS_FAULTS_T_F_RATE 5
#define _POS_FAULTS_P_RATE 6
#define _POS_SYSTEM 3
#define _POS_MODBUS_MENU 0
#define _POS_MODBUS_ADDRESS 0
#define _POS_MODBUS_BAUDRATE 1
#define _POS_MODBUS_DELAY 2
#define _POS_P_SENSOR_SELECTION 1
#define _POS_P_SMC_1_5V_0_5BAR 0
#define _POS_P_GEMS_0_5V_0_6BAR 1
#define _POS_RESET 4
#define _POS_BAUDRATE_300 0
#define _POS_BAUDRATE_1200 1
#define _POS_BAUDRATE_2400 2
#define _POS_BAUDRATE_4800 3
#define _POS_BAUDRATE_9600 4
#define _POS_BAUDRATE_19200 5
#define _POS_BAUDRATE_38400 6
#define _POS_BAUDRATE_57600 7
#define _POS_BAUDRATE_115200 8
extern "C" uint8_t my_UserInterfaceMessage(u8g2_t *u8g2, const char *title1, const char *title2, const char *title3, const char *buttons, uint8_t cursor);
extern "C" uint8_t my_UserInterfaceSelectionList(u8g2_t *u8g2, const char *title, uint8_t start_pos, const char *sl);
// extern "C" void my_UserInterfaceInputValue(u8g2_t *u8g2, const char *title, const char *pre, uint8_t value, uint8_t digits, const char *post);
extern "C" void my_UserInterfaceInputValueString(u8g2_t *u8g2, const char *title, const char *sub, const char *text);
// extern "C" uint8_t my_read_pin_state(u8x8_t *u8x8);
class Display : public U8G2_ST7920_128X64_F_HW_SPI
{
private:
enum MenuLevel : int8_t {
MenuLevel_1, MenuLevel_2, MenuLevel_3
};
enum Precision : int8_t {
Precision_0, Precision_1, Precision_2
};
uint8_t _bgLightAnalog = 255; // Wie stark die Displaybeleuchtung ist
bool _bgLightBool = true; // Ob die Displaybeleuchtung an ist (egal wie stark)
char _text[50]; // Buffer für Texte
char _text2[30]; // Buffer für Texte
uint8_t _selection; // welche Auswahl gerendert werden soll
uint8_t _cursor; // aktuelle Auswahl-Cursorposition
uint8_t _prevCursor; // letzte Auswahl-Cursorposition
uint8_t _cur_l1; // Cursorposition in Ebene 1
uint8_t _cur_l2; // Cursorposition in Ebene 2
uint8_t _cur_l3; // Cursorposition in Ebene 3
uint8_t _menu_depth; // Im wievielten Untermenü man gerade ist
uint8_t _selCnt; // Anzahl der Auswahlmöglichkeiten
bool _inputValueActive; // Ob gerade ein Wert eingegeben wird
int _val; // Der eingegebene Wert
int _valMin; // Der kleinstmögliche einzugebende Wert
int _valMax; // Der größtmögliche einzugebende Wert
unsigned long _prevT;
bool _enableBigSteps; // Ob große Schritte (_BIG_STEP) durchgeführt werden sollen
unsigned long _checkFastStepTime; // letzte Zeit, zu der ein entsprechender Button NICHT gedrückt war
unsigned long _lastFastStep; // letzte Zeit, zu der ein schneller Schritt ausgeführt wurde
int _stepSize; // Um wieviel der entsprechende Wert auf einmal geändert werden soll
u8 _fastStepsDelay;
bool _showFault;
u8 _showFaultC = 0;
FaultState _lastFaultState = noFault;
u8 _lastCEn;
u8 _lastOpticalState;
u8 _currBrightness = 0;
u32 _lastBrightnessChange;
bool _incBrightness = false;
void _saveCursorPosForLevel(MenuLevel);
uint8_t _restoreCursor();
void _baudrateCursorPos();
void _setModbusBaudrate();
void _select();
void _select(const uint8_t, const bool restoreCursor=false);
uint8_t _event();
void _nextEvent();
void _prevEvent();
void _home();
bool _displayFaultOrPowerSymbol(const FaultState&, bool);
void _inputValue(const uint8_t stepSize, const char *title, const char *text=nullptr, const char *val=nullptr);
void _restrictInputValue(int min, int max, Precision p=Precision_0);
public:
const uint8_t btnNext;
const uint8_t btnPrev;
const uint8_t btnSelect;
const uint8_t btnCancel;
const uint8_t bgLed;
Display(uint8_t cs,
uint8_t btnNext,
uint8_t btnPrev,
uint8_t btnSelect,
uint8_t btnCancel,
uint8_t bgLED);
void init();
void process();
void modbusProblem();
void oneWireDevicesDetected(uint8_t count);
void tooMuchOneWireDevicesDetected(uint8_t actual, uint8_t max);
void noOneWireDevicesDetected();
void greeting();
void bgLight(uint8_t);
void bgLight(int val) {bgLight((uint8_t) val);};
void bgLight(bool);
bool bgLightIncrease(uint8_t step=1);
bool bgLightDecrease(uint8_t step=1);
uint8_t bgLightAnalog();
bool bgLightState();
void (*reset)() = 0;
};
#endif // MY_DISPLAY_H_INCLUDED