#ifndef __UI_H__ #define __UI_H__ #include "Free_Fonts.h" #include "Seeed_Arduino_ooFreeRTOS.h" #include "SysConfig.h" #include "seeed_line_chart.h" #include "sensor.h" #include "utils.h" #include #include #include using namespace cpp_freertos; #define SCREEN_WIDTH 320 // Wio Terminal Maximum Width #define SCREEN_HIGH 240 // Wio Terminal Maximum Height #define SEMSOR_NUM_MAX 4 // Maximum number of sensors #define LINE_DATA_MAX_SIZE 30 // maximum size of data #define DRAW_LINE_MAX_NUM 1 // maximum num of draw line #define SHOW_LOG_MAX_SIZE 11 // maximum size of log enum page_state { NETWORKPAGE, PROCESSPAGE, SENSEPAGE }; #define NONE_PRESSED 0x0F #define FIRST_PAGE 0 #define LORA_PAGE 0 #define WIFI_PAGE 1 // define a struct with keyboard statemachine struct PagesStateMachine { page_state mainstate; uint8_t key; int8_t sense_select; int8_t process_select; int8_t network_select; }; struct State { int8_t current_page; bool is_next; int8_t s_select; }; struct NetworkState { int8_t current_network; struct State nw_state; // network wifi state struct State nl_state; // network lora state }; struct LoRaBandInfo { char *type; char *frequency; char *country; uint8_t band; }; typedef bool (*page_t)(uint8_t key); class UI : public Thread { public: UI(TFT_eSPI &lcd, TFT_eSprite &display, SysConfig &config, Message &m1); void init(); protected: virtual void Run(); public: void UIPushData(std::vector d); void UIPushLog(std::vector d); private: TFT_eSPI &tft; TFT_eSprite &spr; Message &btnMail; SysConfig &cfg; std::vector s_data; bool s_data_ready = true; std::vector a_log; bool log_ready = true; uint8_t rotate_status = 0; bool rotate_flag = false; uint8_t buff[256]; struct sensor_data sdata; struct PagesStateMachine page; void TitleDisplay(uint8_t t); void Status1Display(uint8_t status); void Status2Display(uint8_t status); void StatusMachine(struct State *ui_state, uint8_t key); struct LoRaBandInfo lora_band_info[3] = { {"US", "915", "North America", 2}, {"EU", "868", "European Region", 1}, {"AU", "915", "Australia", 9}, }; struct NetworkState n_state = {0, {0, false, 0}, {0, false, 0}}; bool NetworkPageManager(uint8_t keys); bool Network_1(uint8_t select); bool Network_2_0(uint8_t select); // lora bool Network_2_1(uint8_t select); // wifi bool Network_3_0(uint8_t select); // lora bool Network_3_1(uint8_t select); // wifi bool Network_4_0(uint8_t select); // lora bool Network_5_0(uint8_t select); // lora bool NetworkSubtitles(uint8_t keys); void NetworkSignal(int16_t signal); void NetworkLoRaBandSelect(uint8_t location, struct LoRaBandInfo lbi, uint8_t select); struct State p_state = {0, true, 0}; void ProcessPageManager(uint8_t keys); void ProcessSubTitle(uint8_t select); bool Process_1(uint8_t select); bool Process_2(uint8_t select); struct State s_state = {0, true, 0}; void SensePageManager(uint8_t keys); bool Sensor_1(uint8_t select); bool Sensor_2(uint8_t select); bool Sensor_3(uint8_t select); void SensorADDDisplay(uint8_t chose); void SensorPageState(int PAGES, int _CHOOSE_PAGE); void SensorSubTitle(String value); void SensorSubTitle2(String value); void SensorSwitchButton(uint8_t button); void SensorUnit(String value); typedef bool (UI::*page_t)(uint8_t key); page_t l_network[5] = {&UI::Network_1, &UI::Network_2_0, &UI::Network_3_0, &UI::Network_4_0, &UI::Network_5_0}; page_t w_network[3] = {&UI::Network_1, &UI::Network_2_1, &UI::Network_3_1}; page_t process[2] = {&UI::Process_1, &UI::Process_2}; page_t sense[3] = {&UI::Sensor_1, &UI::Sensor_2, &UI::Sensor_3}; void PageMangent(uint8_t key); private: // inline function, 4byte uint8_t to float void uint8_to_float(uint8_t *data, float *destination); // temp data int temp_light; int temp_mic; doubles line_chart_data[4]; }; #endif // __UI_H__