#ifndef QDPweb_h #define QDPweb_h /* * ESP-DASH V2 * Made by Ayush Sharma * Github URL: https://github.com/ayushsharma82/ESP-DASH * Support Me: https://www.patreon.com/asrocks5 * * - Version Changelog - * V1.0.0 - 11 Nov. 2017 - Library was Born * V1.0.1 - 13 Nov. 2017 - Fixed Empty SPIFFS Issue * V1.0.2 - 13 Nov. 2017 - Improvements on SPIFFS Issue * V1.0.3 - 24 Dec. 2017 - Pushing to Library Manager * * = Library Rewritten! = * V2.0.0 - 25 Jan 2019 - Wohoo! A breakthrough in performance and capabilities! * * * Credits: * Malcolm Brook (https://github.com/malbrook) for Slider Card */ #include "Arduino.h" #include "stdlib_noniso.h" #if defined(ESP8266) #define HARDWARE "ESP8266" #include "ESP8266WiFi.h" #include "ESPAsyncTCP.h" #include "ESPAsyncWebServer.h" #include "ArduinoJson.h" #elif defined(ESP32) #define HARDWARE "ESP32" #include #include #include "WiFi.h" #include "AsyncTCP.h" #include "ESPAsyncWebServer.h" #include "ArduinoJson.h" #endif #include "webpage.h" typedef std::function DashButtonHandler; typedef std::function DashSliderHandler; #define DEBUG_MODE 1 // change to 1 for DEBUG Messages // Debug mode #define TEMPERATURE_CARD_TYPES 6 #define STATUS_CARD_TYPES 4 #define SLIDER_CARD_TYPES 4 #if defined(ESP8266) #define BUTTON_CARD_LIMIT 20 #define NUMBER_CARD_LIMIT 20 #define TEMPERATURE_CARD_LIMIT 20 #define HUMIDITY_CARD_LIMIT 20 #define STATUS_CARD_LIMIT 20 #define LINE_CHART_LIMIT 5 #define GAUGE_CHART_LIMIT 20 #define SLIDER_CARD_LIMIT 10 #elif defined(ESP32) #define BUTTON_CARD_LIMIT 50 #define NUMBER_CARD_LIMIT 50 #define TEMPERATURE_CARD_LIMIT 50 #define HUMIDITY_CARD_LIMIT 50 #define STATUS_CARD_LIMIT 50 #define LINE_CHART_LIMIT 10 #define GAUGE_CHART_LIMIT 50 #define SLIDER_CARD_LIMIT 20 #endif class QDPwebClass{ public: void init(AsyncWebServer& server); void disableStats(); // To Disable Stats and disable reboot void addNumberCard(const char* _id, const char* _name, int _value = 0); // Add Number card with custom value void updateNumberCard(const char* _id, int _value); // Update Number Card with custom value void addTemperatureCard(const char* _id, const char* _name, int _type, int _value = 0); // Add Temperature Card with custom value void updateTemperatureCard(const char* _id, int _value); // Update Temperature Card with custom value void addHumidityCard(const char* _id, const char* _name, int _value = 0); // Add Humidity Card with custom value void updateHumidityCard(const char* _id, int _value); // Update Humidity Card with custom value void addStatusCard(const char* _id, const char* _name, int _type = 0); // Add Status Card with more status types void addStatusCard(const char* _id, const char* _name, bool _type); // Add Status Card with true / false void updateStatusCard(const char* _id, int _type); void updateStatusCard(const char* _id, bool _type); void addButtonCard(const char* _id, const char* _name); // Add Button // Add Slider Card void addSliderCard(const char* _id, const char* _name, int _type); void updateSliderCard(const char* _id, int _value); //Initiate a Line Chart with Integer x axis and custom y axis void addLineChart(const char* _id, const char* _name, int _x_axis_value[], int _x_axis_size, const char* _y_axis_name, int _y_axis_value[], int _y_axis_size); // Initiate a Line Chart with String x axis and custom y axis void addLineChart(const char* _id, const char* _name, String _x_axis_value[], int _x_axis_size, const char* _y_axis_name, int _y_axis_value[], int _y_axis_size); void updateLineChart(const char* _id, int _x_axis_value[], int _x_axis_size, int _y_axis_value[], int _y_axis_size); // Update a Line Chart with custom Int x axis and y axis void updateLineChart(const char* _id, String _x_axis_value[], int _x_axis_size, int _y_axis_value[], int _y_axis_size); // Update a Line Chart with custom String x axis and y axis void addGaugeChart(const char *_id, const char *_name, int _value = 0); // Add Gauge card void updateGaugeChart(const char* _id, int _value); // Update Gauge card void attachButtonClick(DashButtonHandler handler){ _buttonClickFunc = handler; } void attachSliderChanged(DashSliderHandler handler){ _sliderChangedFunc = handler; } private: bool stats_enabled = true; DashButtonHandler _buttonClickFunc; DashSliderHandler _sliderChangedFunc; // Button Cards // Data Relation: // (Handle Incomming Websocket Requests via Card ID) Card ID -> Card Name String button_card_id[BUTTON_CARD_LIMIT] = {}; String button_card_name[BUTTON_CARD_LIMIT] = {}; // Number Cards // Card ID -> Card Name -> Integer Value String number_card_id[NUMBER_CARD_LIMIT] = {}; String number_card_name[NUMBER_CARD_LIMIT] = {}; uint16_t number_card_value[NUMBER_CARD_LIMIT] = {}; // Temperature Cards // Data Relation: // Card ID -> Card Name ->> // Types // 0 - °C [Celsius] // 1 - °F [Fahrenheit] // 2 - K [Kelvin] // 3 - °R [Rakine] // 4 - °De [Delisle] // 5 - °N [Newton] // ->> Integer Value String temperature_card_id[TEMPERATURE_CARD_LIMIT] = {}; String temperature_card_name[TEMPERATURE_CARD_LIMIT] = {}; int temperature_card_type[TEMPERATURE_CARD_LIMIT] = {}; int temperature_card_value[TEMPERATURE_CARD_LIMIT] = {}; // Humidity Cards // Data Relation: // Card ID -> Card Name -> Integer Value String humidity_card_id[HUMIDITY_CARD_LIMIT] = {}; String humidity_card_name[HUMIDITY_CARD_LIMIT] = {}; int humidity_card_value[HUMIDITY_CARD_LIMIT] = {}; // Status Cards // Data Relation: // Card ID -> Card Name -> Card Type // 0 - false // 1 - true // 2 - warning // 3 - paused String status_card_id[STATUS_CARD_LIMIT] = {}; String status_card_name[STATUS_CARD_LIMIT] = {}; int status_card_value[STATUS_CARD_LIMIT] = {}; // Graph Cards // Data Relation: // Card ID -> Card Name ->> // X Axis -> Bool Type -> String <- OR -> ( Array Length -> Integer Array ) // Y Axis -> Y Axis Name -> Array Length -> Integer Array String line_chart_id[LINE_CHART_LIMIT] = {}; String line_chart_name[LINE_CHART_LIMIT] = {}; // X Axis // A Graph can either have a STRING Type X Axis or Integer Type bool line_chart_x_axis_type[LINE_CHART_LIMIT] = {}; // Boolean which indicates the type // true = String, false = Int String line_chart_x_axis_value_string[LINE_CHART_LIMIT][100] = {}; // String Type int line_chart_x_axis_size[LINE_CHART_LIMIT] = {}; int line_chart_x_axis_value_int[LINE_CHART_LIMIT][100] = {}; // Integer Type // Y Axis String line_chart_y_axis_name[LINE_CHART_LIMIT] = {}; int line_chart_y_axis_size[LINE_CHART_LIMIT] = {}; int line_chart_y_axis_value[LINE_CHART_LIMIT][100] = {}; // Gauge Charts // Card ID -> Card Name -> Integer Value String gauge_chart_id[GAUGE_CHART_LIMIT] = {}; String gauge_chart_name[GAUGE_CHART_LIMIT] = {}; uint16_t gauge_chart_value[GAUGE_CHART_LIMIT] = {}; // Slider Card // Data Relation: // Card ID -> Card Name -> Card Type // 0 - vertical bottom to top // 1 - vertical top to bottom // 2 - horizontal left to right // 3 - horizontal right to left String slider_card_id[SLIDER_CARD_LIMIT] = {}; String slider_card_name[SLIDER_CARD_LIMIT] = {}; int slider_card_type[SLIDER_CARD_LIMIT] = {}; int slider_card_value[SLIDER_CARD_LIMIT] = {}; static void onWsEvent(AsyncWebSocket * server, AsyncWebSocketClient * client, AwsEventType type, void * arg, uint8_t *data, size_t len); void generateLayoutResponse(String& result); void generateStatsResponse(String& result); void generateRebootResponse(String& result); size_t getTotalResponseCapacity(); size_t getNumberCardsLen(); size_t getTemperatureCardsLen(); size_t getHumidityCardsLen(); size_t getStatusCardsLen(); size_t getButtonCardsLen(); size_t getLineChartsLen(); size_t getGaugeChartsLen(); size_t getSliderCardsLen(); }; extern QDPwebClass QDPweb; #endif