#pragma once #include #include #include #include #include // Page IDs #define INTERNAL_DISPLAY_DASHBOARD_PAGE 0 #define INTERNAL_DISPLAY_INPUT_PAGE 1 #define INTERNAL_DISPLAY_OUTPUT_PAGE 2 #define INTERNAL_DISPLAY_AC_PAGE 3 // Picture IDs #define PIC_LAN_DISCONNECTED 2 #define PIC_LAN_CONNECTED 3 #define PIC_MQTT_DISCONNECTED 4 #define PIC_MQTT_CONNECTED 5 #define PIC_PWM_BAR_ON 33 #define PIC_PWM_BAR_OFF 48 // Messages #define MSG_MQTT_CONNECTED "BMS Managed" #define MSG_MQTT_DISCONNECTED "Standalone" // Refresh Interval #define INTERNAL_DISPLAY_CLOCK_REFRESH_INTERVAL 15000 #define INTERNAL_DISPLAY_TOP_BAR_REFRESH_INTERVAL 5000 class InternalDisplay : public ESPMegaDisplay { public: InternalDisplay(HardwareSerial *displayAdapter); void begin(ESPMegaIoT *iot, std::function getRtcTime); void loop(); void bindInputCard(DigitalInputCard *inputCard); void bindOutputCard(DigitalOutputCard *outputCard); private: DigitalInputCard *inputCard; DigitalOutputCard *outputCard; // Previously registered callbacks of input and output cards // We need to call them when the respective card is binded to the display // Because we will replace the callbacks with the display's own callbacks void handleInputStateChange(uint8_t pin, bool state); void handlePwmStateChange(uint8_t pin, bool state, uint16_t value); void handlePageChange(uint8_t page); void setOutputBar(uint8_t pin, uint16_t value); void setOutputStateColor(uint8_t pin, bool state); void setInputMarker(uint8_t pin, bool state); void setPWMAdjustmentSlider(uint16_t value); void setPWMAdjustmentPin(uint8_t pin); void setPWMAdjustmentButton(bool state); void saveNetworkConfig(); void saveMQTTConfig(); void updateStatusIcons(bool networkStatus, bool mqttStatus); void updateClock(); void refreshPage(); void refreshPage(uint8_t page); void refreshDashboard(); void refreshInput(); void refreshOutput(); void refreshAC(); MqttConfig *mqttConfig; NetworkConfig *networkConfig; // Pointers to various data ESPMegaIoT *iot; std::function getRtcTime; };