250 lines
		
	
	
		
			No EOL
		
	
	
		
			6.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			250 lines
		
	
	
		
			No EOL
		
	
	
		
			6.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
// OMOTE UI
 | 
						|
// 2023 Matthew Colvin
 | 
						|
#pragma once
 | 
						|
 | 
						|
#include "Images.hpp"
 | 
						|
#include "UIBase.hpp"
 | 
						|
#include "lvgl.h"
 | 
						|
#include "poller.hpp"
 | 
						|
#include <algorithm>
 | 
						|
#include <memory>
 | 
						|
#include <stdio.h>
 | 
						|
#include <string>
 | 
						|
 | 
						|
namespace UI::Basic {
 | 
						|
/// @brief Singleton to allow UI code to live separately from the Initialization
 | 
						|
/// of resources.
 | 
						|
class OmoteUI : public UIBase {
 | 
						|
public:
 | 
						|
  OmoteUI(std::shared_ptr<HardwareAbstract> aHardware);
 | 
						|
 | 
						|
  static std::weak_ptr<OmoteUI> getRefrence() { return getInstance(); };
 | 
						|
  static std::shared_ptr<OmoteUI>
 | 
						|
  getInstance(std::shared_ptr<HardwareAbstract> aHardware = nullptr) {
 | 
						|
    if (mInstance) {
 | 
						|
      return mInstance;
 | 
						|
    } else if (aHardware) {
 | 
						|
      mInstance = std::make_shared<OmoteUI>(aHardware);
 | 
						|
    }
 | 
						|
    return mInstance;
 | 
						|
  };
 | 
						|
 | 
						|
  // Set the page indicator scroll position relative to the tabview scroll
 | 
						|
  // position
 | 
						|
  void store_scroll_value_event_cb(lv_event_t *e);
 | 
						|
  // Update current device when the tabview page is changes
 | 
						|
  void tabview_device_event_cb(lv_event_t *e);
 | 
						|
  // Update wake timeout handler
 | 
						|
  void wakeTimeoutSetting_event_cb(lv_event_t *e);
 | 
						|
  // Slider Event handler
 | 
						|
  void bl_slider_event_cb(lv_event_t *e);
 | 
						|
  // Apple Key Event handler
 | 
						|
  void appleKey_event_cb(lv_event_t *e);
 | 
						|
  // Wakeup by IMU Switch Event handler
 | 
						|
  void WakeEnableSetting_event_cb(lv_event_t *e);
 | 
						|
  // Smart Home Toggle Event handler
 | 
						|
  void smartHomeToggle_event_cb(lv_event_t *e);
 | 
						|
  // Smart Home Toggle Event handler
 | 
						|
  void smartHomeSlider_event_cb(lv_event_t *e);
 | 
						|
  // Virtual Keypad Event handler
 | 
						|
  void virtualKeypad_event_cb(lv_event_t *e);
 | 
						|
  void wifi_settings_cb(lv_event_t *event);
 | 
						|
 | 
						|
  void connect_btn_cb(lv_event_t *event);
 | 
						|
 | 
						|
  void password_field_event_cb(lv_event_t *e);
 | 
						|
  // Use LVGL to layout the ui and register the callbacks
 | 
						|
  void layout_UI();
 | 
						|
 | 
						|
  void ta_kb_event_cb(lv_event_t *e);
 | 
						|
 | 
						|
  void wifi_scan_done(std::shared_ptr<std::vector<WifiInfo>> info);
 | 
						|
  void loopHandler();
 | 
						|
  /**
 | 
						|
   * @brief Function to hide the keyboard. If the keyboard is attached to a text
 | 
						|
   * area, it will be hidden when the text area is defocused. This function can
 | 
						|
   * be used if the keyboard need to be hidden due to some script event.
 | 
						|
   *
 | 
						|
   */
 | 
						|
  void hide_keyboard();
 | 
						|
 | 
						|
  /**
 | 
						|
   * @brief Function to show the keyboard. If a text area needs the keybaord, it
 | 
						|
   * should be attached to the text area using the approbiate function. The
 | 
						|
   * keyboard will then show up when the text area is focused. This function is
 | 
						|
   * needed if the keyboard should be shown due to some script or other trigger.
 | 
						|
   *
 | 
						|
   */
 | 
						|
  void show_keyboard();
 | 
						|
 | 
						|
private:
 | 
						|
  static std::shared_ptr<OmoteUI> mInstance;
 | 
						|
 | 
						|
  std::unique_ptr<poller> batteryPoller;
 | 
						|
 | 
						|
  int sleepTimeoutMap[5] = {10000,30000,60000,180000,600000};
 | 
						|
 | 
						|
  void reset_settings_menu();
 | 
						|
  void attach_keyboard(lv_obj_t *textarea);
 | 
						|
  std::shared_ptr<std::vector<WifiInfo>> found_wifi_networks;
 | 
						|
  /**
 | 
						|
   * @brief Keyboard object used whenever a keyboard is needed.
 | 
						|
   *
 | 
						|
   */
 | 
						|
  lv_obj_t *kb;
 | 
						|
 | 
						|
  /**
 | 
						|
   * @brief Function to create the keyboard object which can then be attached to
 | 
						|
   * different text areas.
 | 
						|
   *
 | 
						|
   */
 | 
						|
  void create_keyboard();
 | 
						|
 | 
						|
  /**
 | 
						|
   * @brief Set the up settings object
 | 
						|
   *
 | 
						|
   * @param parent
 | 
						|
   */
 | 
						|
  void setup_settings(lv_obj_t *parent);
 | 
						|
 | 
						|
  /**
 | 
						|
   * @brief LVGL Menu for settings pages as needed.
 | 
						|
   *
 | 
						|
   */
 | 
						|
  lv_obj_t *settingsMenu;
 | 
						|
 | 
						|
  /**
 | 
						|
   * @brief Main page of the settings menu
 | 
						|
   *
 | 
						|
   */
 | 
						|
  lv_obj_t *settingsMainPage;
 | 
						|
 | 
						|
  /**
 | 
						|
   * @brief Battery percentage label
 | 
						|
   *
 | 
						|
   */
 | 
						|
  lv_obj_t *objBattPercentage;
 | 
						|
 | 
						|
  /**
 | 
						|
   * @brief Battery icon object in the status bar
 | 
						|
   *
 | 
						|
   */
 | 
						|
  lv_obj_t *objBattIcon;
 | 
						|
 | 
						|
  void create_status_bar();
 | 
						|
 | 
						|
  lv_obj_t *panel = nullptr;
 | 
						|
  Images imgs = Images();
 | 
						|
  uint_fast8_t currentDevice = 4;
 | 
						|
  lv_color_t color_primary = lv_color_hex(0x303030); // gray
 | 
						|
 | 
						|
  inline static const uint_fast8_t virtualKeyMapTechnisat[10] = {
 | 
						|
      0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x0};
 | 
						|
 | 
						|
  /************************************** WIFI Settings Menu
 | 
						|
   * *******************************************************/
 | 
						|
  /**
 | 
						|
   * @brief Container within the wifi selection page
 | 
						|
   */
 | 
						|
  lv_obj_t *wifi_setting_cont;
 | 
						|
 | 
						|
  /**
 | 
						|
   * @brief Wifi settings entry point on the settings tab
 | 
						|
   *
 | 
						|
   */
 | 
						|
  lv_obj_t *wifiOverview;
 | 
						|
 | 
						|
  /**
 | 
						|
   * @brief Label in the wifi password page. This label is updated with the
 | 
						|
   * selected SSID when the credentials for a wifi network is entered.
 | 
						|
   *
 | 
						|
   */
 | 
						|
  lv_obj_t *wifi_password_label;
 | 
						|
 | 
						|
  /**
 | 
						|
   * @brief Menu Subpage for the wifi password
 | 
						|
   */
 | 
						|
  lv_obj_t *wifi_password_page;
 | 
						|
 | 
						|
  /**
 | 
						|
   * @brief  Menu Subpage for wifi selection
 | 
						|
   */
 | 
						|
  lv_obj_t *wifi_selection_page;
 | 
						|
 | 
						|
  /**
 | 
						|
   * @brief Wifi Label shown in the top status bar
 | 
						|
   */
 | 
						|
  lv_obj_t *WifiLabel;
 | 
						|
 | 
						|
  /**
 | 
						|
   * @brief Number of wifi subpage needed to display the found wifi networks
 | 
						|
   *
 | 
						|
   */
 | 
						|
  unsigned int no_subpages;
 | 
						|
 | 
						|
  /**
 | 
						|
   * @brief number of wifi networks found
 | 
						|
   *
 | 
						|
   */
 | 
						|
  unsigned int no_wifi_networks;
 | 
						|
 | 
						|
  void wifi_status(std::shared_ptr<wifiStatus> status);
 | 
						|
  /**
 | 
						|
   * @brief callback function to get next wifi subpage. This callback can be
 | 
						|
   * used to get the next or previous page
 | 
						|
   *
 | 
						|
   * @param e lvgl event object
 | 
						|
   */
 | 
						|
  void next_wifi_selection_subpage(lv_event_t *e);
 | 
						|
 | 
						|
  /**
 | 
						|
   * @brief Create a wifi selection sub page object
 | 
						|
   *
 | 
						|
   * @param menu         LVGL Menu where the sub page should be added to
 | 
						|
   * @return lv_obj_t*   Menu sub page object pointer
 | 
						|
   */
 | 
						|
  lv_obj_t *create_wifi_selection_page(lv_obj_t *menu);
 | 
						|
 | 
						|
  /**
 | 
						|
   * @brief Method to create the wifi password sub page
 | 
						|
   *
 | 
						|
   * @param menu        Menu where the sub page should be created
 | 
						|
   * @return lv_obj_t*  menu sub page object pointer
 | 
						|
   */
 | 
						|
  lv_obj_t *create_wifi_password_page(lv_obj_t *menu);
 | 
						|
 | 
						|
  /**
 | 
						|
   * @brief Method to create the wifi settings on the main page
 | 
						|
   *
 | 
						|
   * @param parent    lv object parent where the main settings page should be
 | 
						|
   * added to
 | 
						|
   */
 | 
						|
  void create_wifi_main_page(lv_obj_t *parent);
 | 
						|
 | 
						|
  /**
 | 
						|
   * @brief Method to create wifi settings. This method will call the
 | 
						|
   * create_wifi_selection_page, the create_wifi_password_page, and the
 | 
						|
   * create_wifi_main_page
 | 
						|
   *
 | 
						|
   * @param menu      Settings menu where the sub pages should be added to
 | 
						|
   * @param parent    lv object parent where the main settings page should be
 | 
						|
   * added to
 | 
						|
   */
 | 
						|
  void create_wifi_settings(lv_obj_t *menu, lv_obj_t *parent);
 | 
						|
 | 
						|
  /**
 | 
						|
   * @brief Function to update the wifi selection sub page
 | 
						|
   *
 | 
						|
   * @param page index of the page to display
 | 
						|
   */
 | 
						|
  void update_wifi_selection_subpage(int page);
 | 
						|
 | 
						|
  /**
 | 
						|
   * @brief Function to create the display settings page.
 | 
						|
   *
 | 
						|
   * @param parent LVGL object acting as a parent for the display settings page
 | 
						|
   */
 | 
						|
  void display_settings(lv_obj_t *parent);
 | 
						|
};
 | 
						|
 | 
						|
} // namespace UI::Basic
 |