├── src ├── Images │ ├── bttf.ora │ ├── bttf.png │ ├── pcb.png │ ├── analog.png │ ├── lcars.ora │ ├── lcars.png │ ├── sleep.png │ ├── weather.png │ ├── analog_bg.png │ ├── hand_hour.png │ ├── dont_panic.png │ ├── hand_minute.png │ └── iron_man.h ├── wos.ino ├── Logging.h ├── Watchy_Linux.h ├── Logging.cpp ├── Watchy_Step.h ├── Watchy_BCD.h ├── Watchy_Jarvis.h ├── Watchy_BTTF.h ├── Watchy_Dot.h ├── Watchy_Analog.h ├── Watchy_LCARS.h ├── BLE.h ├── fonts.h ├── Kernel.h ├── config.h ├── Watchy.h ├── Kernel.cpp ├── Watchy_Linux.cpp ├── bma.h ├── Watchy_BCD.cpp ├── Watchy_BTTF.cpp ├── Watchy_Base.h ├── Watchy_LCARS.cpp ├── Watchy_Dot.cpp ├── Watchy_Analog.cpp ├── BLE.cpp ├── Watchy_Jarvis.cpp ├── Watchy_Step.cpp ├── bma.cpp ├── icons.h ├── Fonts │ ├── Bitwise_m19x8pt7b.h │ ├── Okuda_A5PL14pt7b.h │ ├── UbuntuMono_R12pt7b.h │ ├── Bitwise_m19x10pt7b.h │ ├── UbuntuMono_B12pt7b.h │ ├── Okuda_A5PL16pt7b.h │ └── Bitwise_m19x12pt7b.h └── Watchy_Base.cpp ├── .vscode ├── settings.json └── arduino.json ├── README.md ├── library.properties ├── LICENSE └── .gitignore /src/Images/bttf.ora: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/peerdavid/wos/HEAD/src/Images/bttf.ora -------------------------------------------------------------------------------- /src/Images/bttf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/peerdavid/wos/HEAD/src/Images/bttf.png -------------------------------------------------------------------------------- /src/Images/pcb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/peerdavid/wos/HEAD/src/Images/pcb.png -------------------------------------------------------------------------------- /src/Images/analog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/peerdavid/wos/HEAD/src/Images/analog.png -------------------------------------------------------------------------------- /src/Images/lcars.ora: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/peerdavid/wos/HEAD/src/Images/lcars.ora -------------------------------------------------------------------------------- /src/Images/lcars.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/peerdavid/wos/HEAD/src/Images/lcars.png -------------------------------------------------------------------------------- /src/Images/sleep.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/peerdavid/wos/HEAD/src/Images/sleep.png -------------------------------------------------------------------------------- /src/Images/weather.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/peerdavid/wos/HEAD/src/Images/weather.png -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "files.associations": { 3 | "cmath": "cpp" 4 | } 5 | } -------------------------------------------------------------------------------- /src/Images/analog_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/peerdavid/wos/HEAD/src/Images/analog_bg.png -------------------------------------------------------------------------------- /src/Images/hand_hour.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/peerdavid/wos/HEAD/src/Images/hand_hour.png -------------------------------------------------------------------------------- /src/Images/dont_panic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/peerdavid/wos/HEAD/src/Images/dont_panic.png -------------------------------------------------------------------------------- /src/Images/hand_minute.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/peerdavid/wos/HEAD/src/Images/hand_minute.png -------------------------------------------------------------------------------- /src/wos.ino: -------------------------------------------------------------------------------- 1 | #include "Kernel.h" 2 | Kernel kernel; 3 | 4 | 5 | void setup(){ 6 | kernel.state_machine(); 7 | } 8 | 9 | 10 | void loop(){ 11 | 12 | } 13 | -------------------------------------------------------------------------------- /.vscode/arduino.json: -------------------------------------------------------------------------------- 1 | { 2 | "port": "/dev/ttyUSB0", 3 | "configuration": "PSRAM=disabled,PartitionScheme=min_spiffs,CPUFreq=240,FlashMode=qio,FlashFreq=80,FlashSize=4M,UploadSpeed=921600,DebugLevel=none", 4 | "board": "esp32:esp32:esp32", 5 | "sketch": "src/wos.ino", 6 | "output": "output" 7 | } -------------------------------------------------------------------------------- /src/Logging.h: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | 4 | // #define DISABLE_LOGGING 5 | 6 | class Logging { 7 | public: 8 | static Logging* instance(); 9 | void log(String module_name, String message); 10 | 11 | private: 12 | static Logging* _instance; 13 | Logging(); 14 | }; -------------------------------------------------------------------------------- /src/Watchy_Linux.h: -------------------------------------------------------------------------------- 1 | #ifndef WATCHY_LINUX_H 2 | #define WATCHY_LINUX_H 3 | 4 | #include "Watchy_Base.h" 5 | #include "icons.h" 6 | #include "fonts.h" 7 | #include "Images/dont_panic.h" 8 | 9 | class WatchyLinux : public WatchyBase { 10 | 11 | public: 12 | WatchyLinux(); 13 | void drawWatchFace(); 14 | void handleButtonPress(); 15 | }; 16 | 17 | #endif 18 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Watchy OS (WOS) 2 | 3 | I'm currently woring on WatchyOS (WOS) - its an alternative to the official 4 | Watchy code. Instead on heavly relying on inheritance, this project is structured 5 | by different components which are controlled by a kernel. This should provide 6 | more flexibility and it should become easier for developers to add new 7 | features. 8 | 9 | More updates are comming soon. 10 | -------------------------------------------------------------------------------- /src/Logging.cpp: -------------------------------------------------------------------------------- 1 | #include "Logging.h" 2 | 3 | 4 | Logging* Logging::_instance= nullptr; 5 | 6 | 7 | Logging::Logging(){ 8 | #ifndef DISABLE_LOGGING 9 | Serial.begin(9600); 10 | Serial.flush(); 11 | #endif 12 | } 13 | 14 | 15 | Logging* Logging::instance(){ 16 | if(_instance == nullptr){ 17 | _instance = new Logging(); 18 | } 19 | return _instance; 20 | } 21 | 22 | 23 | void Logging::log(String module_name, String message){ 24 | #ifndef DISABLE_LOGGING 25 | Serial.println("[" + module_name + "] " + message); 26 | Serial.flush(); 27 | #endif 28 | } -------------------------------------------------------------------------------- /src/Watchy_Step.h: -------------------------------------------------------------------------------- 1 | #ifndef WATCHY_STEP_H 2 | #define WATCHY_STEP_H 3 | 4 | #include "Watchy_Base.h" 5 | #include "icons.h" 6 | #include "fonts.h" 7 | 8 | class WatchyStep : public WatchyBase { 9 | 10 | public: 11 | WatchyStep(); 12 | void drawWatchFace(); 13 | void drawTime(); 14 | void drawDate(); 15 | void drawSteps(); 16 | void drawBattery(); 17 | void handleButtonPress(); 18 | 19 | private: 20 | float getMaxSteps(); 21 | void startNewDay(); 22 | int32_t getStepsOfDay(); 23 | }; 24 | 25 | #endif 26 | -------------------------------------------------------------------------------- /src/Watchy_BCD.h: -------------------------------------------------------------------------------- 1 | #ifndef WATCHY_BTTF_H 2 | #define WATCHY_BTTF_H 3 | 4 | #include "Watchy_Base.h" 5 | #include "icons.h" 6 | #include "fonts.h" 7 | #include "Images/pcb.h" 8 | 9 | class WatchyBCD : public WatchyBase { 10 | 11 | public: 12 | WatchyBCD(); 13 | void drawWatchFace(); 14 | void handleButtonPress(); 15 | 16 | private: 17 | void printCentered(uint16_t x, uint16_t y, String text); 18 | void printBinary(uint16_t x, uint16_t y, uint8_t value, uint8_t n); 19 | void printBCD(String s, uint16_t y, uint16_t value); 20 | }; 21 | 22 | #endif 23 | -------------------------------------------------------------------------------- /library.properties: -------------------------------------------------------------------------------- 1 | name=WatchyOS 2 | version=0.0.1 3 | author=David Peer 4 | maintainer=David Peer 5 | sentence=WOS - an inofficial OS for the Watchy from SQFMI. 6 | paragraph=WOS - An inofficial OS for the Watchy from SQFMI which is based on the source code that is provided by SQFMI. Nevertheless, the architecture is less based on inheritance and more on composition to make things much more flexible and maintanable for future implementaitons. 7 | category=Other 8 | url=https://github.com/peerdavid/watchy 9 | architectures=esp32 10 | depends=Adafruit GFX Library,Arduino_JSON,DS3232RTC,GxEPD2,WiFiManager 11 | -------------------------------------------------------------------------------- /src/Watchy_Jarvis.h: -------------------------------------------------------------------------------- 1 | #ifndef WATCHY_JARVIS_H 2 | #define WATCHY_JARVIS_H 3 | 4 | #include "Watchy_Base.h" 5 | #include "icons.h" 6 | #include "fonts.h" 7 | #include "Images/iron_man.h" 8 | 9 | class WatchyJarvis : public WatchyBase { 10 | 11 | public: 12 | WatchyJarvis(); 13 | void drawWatchFace(); 14 | void drawTime(); 15 | void drawDate(); 16 | void drawSteps(); 17 | void drawBattery(); 18 | void handleButtonPress(); 19 | 20 | private: 21 | void drawCircle(int16_t x0, int16_t y0, int16_t r, 22 | uint16_t color, uint8_t width); 23 | 24 | }; 25 | 26 | #endif 27 | -------------------------------------------------------------------------------- /src/Watchy_BTTF.h: -------------------------------------------------------------------------------- 1 | #ifndef WATCHY_BTTF_H 2 | #define WATCHY_BTTF_H 3 | 4 | #include "Watchy_Base.h" 5 | #include "icons.h" 6 | #include "fonts.h" 7 | #include "Images/bttf.h" 8 | 9 | class WatchyBTTF : public WatchyBase { 10 | 11 | public: 12 | WatchyBTTF(); 13 | void drawWatchFace(); 14 | void drawTime(); 15 | void drawDate(); 16 | void drawSteps(); 17 | void drawBattery(); 18 | void handleButtonPress(); 19 | 20 | private: 21 | void printCentered(uint16_t x, uint16_t y, String text); 22 | void drawCircle(int16_t x0, int16_t y0, int16_t r, 23 | uint16_t color, uint8_t width); 24 | 25 | }; 26 | 27 | #endif 28 | -------------------------------------------------------------------------------- /src/Watchy_Dot.h: -------------------------------------------------------------------------------- 1 | #ifndef WATCHY_DOT_H 2 | #define WATCHY_DOT_H 3 | 4 | #include "Watchy_Base.h" 5 | #include "icons.h" 6 | #include "fonts.h" 7 | #include "Images/analog.h" 8 | 9 | class WatchyDot : public WatchyBase { 10 | 11 | public: 12 | WatchyDot(); 13 | void drawWatchFace(); 14 | void drawTime(); 15 | void drawDate(); 16 | void drawAlarm(); 17 | void drawTriangles(); 18 | void handleButtonPress(); 19 | 20 | private: 21 | void printCentered(uint16_t x, uint16_t y, String text, uint16_t size); 22 | void drawCircle(int16_t x0, int16_t y0, int16_t r, 23 | uint16_t color, uint8_t width); 24 | 25 | }; 26 | 27 | #endif 28 | -------------------------------------------------------------------------------- /src/Watchy_Analog.h: -------------------------------------------------------------------------------- 1 | #ifndef WATCHY_ANALOG_H 2 | #define WATCHY_ANALOG_H 3 | 4 | #include "Watchy_Base.h" 5 | #include "icons.h" 6 | #include "fonts.h" 7 | #include "Images/analog.h" 8 | 9 | class WatchyAnalog : public WatchyBase { 10 | 11 | public: 12 | WatchyAnalog(); 13 | void drawWatchFace(); 14 | void drawTime(); 15 | void drawDate(); 16 | void drawSteps(); 17 | void drawBattery(); 18 | void handleButtonPress(); 19 | void drawAlarm(); 20 | 21 | private: 22 | void printCentered(uint16_t x, uint16_t y, String text); 23 | void drawCircle(int16_t x0, int16_t y0, int16_t r, 24 | uint16_t color, uint8_t width); 25 | 26 | }; 27 | 28 | #endif 29 | -------------------------------------------------------------------------------- /src/Watchy_LCARS.h: -------------------------------------------------------------------------------- 1 | #ifndef WATCHY_LCARS_H 2 | #define WATCHY_LCARS_H 3 | 4 | #include "Watchy_Base.h" 5 | #include "icons.h" 6 | #include "fonts.h" 7 | #include "Images/lcars.h" 8 | 9 | class WatchyLCARS : public WatchyBase { 10 | 11 | public: 12 | WatchyLCARS(); 13 | void drawWatchFace(); 14 | void drawTime(); 15 | void drawDate(); 16 | void drawSteps(); 17 | void drawBattery(); 18 | void drawAlarm(); 19 | void drawTemperature(); 20 | void handleButtonPress(); 21 | 22 | private: 23 | void printCentered(uint16_t x, uint16_t y, String text); 24 | void drawCircle(int16_t x0, int16_t y0, int16_t r, 25 | uint16_t color, uint8_t width); 26 | 27 | }; 28 | 29 | #endif 30 | -------------------------------------------------------------------------------- /src/BLE.h: -------------------------------------------------------------------------------- 1 | #ifndef _BLE_H_ 2 | #define _BLE_H_ 3 | 4 | #include "Arduino.h" 5 | 6 | #include 7 | #include 8 | #include 9 | #include 10 | 11 | #include "esp_ota_ops.h" 12 | 13 | #include "config.h" 14 | 15 | class BLE; 16 | 17 | class BLE 18 | { 19 | public: 20 | 21 | BLE(void); 22 | ~BLE(void); 23 | 24 | bool begin(const char* localName); 25 | int updateStatus(); 26 | int howManyBytes(); 27 | 28 | private: 29 | String local_name; 30 | 31 | BLEServer *pServer = NULL; 32 | 33 | BLEService *pESPOTAService = NULL; 34 | BLECharacteristic * pESPOTAIdCharacteristic = NULL; 35 | 36 | BLEService *pService = NULL; 37 | BLECharacteristic * pVersionCharacteristic = NULL; 38 | BLECharacteristic * pOtaCharacteristic = NULL; 39 | BLECharacteristic * pWatchFaceNameCharacteristic = NULL; 40 | }; 41 | 42 | #endif 43 | -------------------------------------------------------------------------------- /src/fonts.h: -------------------------------------------------------------------------------- 1 | 2 | #ifndef FONTS_H 3 | #define FONTS_H 4 | 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include "Fonts/Bitwise_m19x8pt7b.h" 14 | #include "Fonts/Bitwise_m19x12pt7b.h" 15 | #include "Fonts/Bitwise_m19x10pt7b.h" 16 | #include "Fonts/Bitwise_m19x18pt7b.h" 17 | #include "Fonts/Seven_Seg24pt7b.h" 18 | #include "Fonts/Seven_Seg18pt7b.h" 19 | #include "Fonts/Okuda_A5PL14pt7b.h" 20 | #include "Fonts/Okuda_A5PL16pt7b.h" 21 | #include "Fonts/Okuda_A5PL25pt7b.h" 22 | #include "Fonts/UbuntuMono_R12pt7b.h" 23 | #include "Fonts/UbuntuMono_B12pt7b.h" 24 | #include "Fonts/WallingtonRegular12pt7b.h" 25 | #include "Fonts/Himalaya_40020pt7b.h" 26 | 27 | #endif -------------------------------------------------------------------------------- /src/Kernel.h: -------------------------------------------------------------------------------- 1 | #ifndef WOS_KERNEL_H 2 | #define WOS_KERNEL_H 3 | 4 | 5 | #include "Watchy_BTTF.h" 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include "BLE.h" 14 | #include "bma.h" 15 | #include "config.h" 16 | #include "Logging.h" 17 | 18 | 19 | enum KernelState{ 20 | KERNEL_STATE_RTC_ALARM, 21 | KERNEL_STATE_BTN_PRESSED, 22 | KERNEL_STATE_RESET 23 | }; 24 | 25 | 26 | class Kernel { 27 | 28 | public: 29 | Kernel(); 30 | void state_machine(); 31 | 32 | private: 33 | KernelState get_state(); 34 | void tick(); 35 | void btn_press(); 36 | void alarm(); 37 | void watch_face_tick(); 38 | void step_module_tick(); 39 | void deep_sleep(); 40 | 41 | // State parameters 42 | esp_sleep_wakeup_cause_t _wakeup_reason; 43 | 44 | // Modules 45 | WatchyBTTF _watchface; 46 | Logging* _logging; 47 | }; 48 | 49 | 50 | extern RTC_DATA_ATTR BMA423 sensor; 51 | 52 | #endif -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 SQFMI 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/config.h: -------------------------------------------------------------------------------- 1 | #ifndef CONFIG_H 2 | #define CONFIG_H 3 | 4 | //pins 5 | #define SDA 21 6 | #define SCL 22 7 | #define ADC_PIN 33 8 | #define RTC_PIN GPIO_NUM_27 9 | #define CS 5 10 | #define DC 10 11 | #define RESET 9 12 | #define BUSY 19 13 | #define VIB_MOTOR_PIN 13 14 | #define MENU_BTN_PIN 26 15 | #define BACK_BTN_PIN 25 16 | #define UP_BTN_PIN 32 17 | #define DOWN_BTN_PIN 4 18 | #define MENU_BTN_MASK GPIO_SEL_26 19 | #define BACK_BTN_MASK GPIO_SEL_25 20 | #define UP_BTN_MASK GPIO_SEL_32 21 | #define DOWN_BTN_MASK GPIO_SEL_4 22 | #define ACC_INT_MASK GPIO_SEL_14 23 | #define BTN_PIN_MASK MENU_BTN_MASK|BACK_BTN_MASK|UP_BTN_MASK|DOWN_BTN_MASK 24 | //display 25 | #define DISPLAY_WIDTH 200 26 | #define DISPLAY_HEIGHT 200 27 | //weather api 28 | #define CITY_NAME "NEW+YORK" //if your city name has a space, replace with '+' 29 | #define COUNTRY_CODE "US" 30 | #define OPENWEATHERMAP_APIKEY "f058fe1cad2afe8e2ddc5d063a64cecb" //use your own API key :) 31 | #define OPENWEATHERMAP_URL "http://api.openweathermap.org/data/2.5/weather?q=" 32 | #define TEMP_UNIT "metric" //use "imperial" for Fahrenheit" 33 | //wifi 34 | #define WIFI_AP_TIMEOUT 60 35 | #define WIFI_AP_SSID "Watchy AP" 36 | //menu 37 | #define WATCHFACE_STATE -1 38 | #define MAIN_MENU_STATE 0 39 | #define APP_STATE 1 40 | #define FW_UPDATE_STATE 2 41 | #define MENU_HEIGHT 30 42 | #define MENU_LENGTH 6 43 | //set time 44 | #define SET_HOUR 0 45 | #define SET_MINUTE 1 46 | #define SET_YEAR 2 47 | #define SET_MONTH 3 48 | #define SET_DAY 4 49 | #define YEAR_OFFSET 1970 50 | //BLE OTA 51 | #define BLE_DEVICE_NAME "Watchy BLE OTA" 52 | #define WATCHFACE_NAME "Watchy 7 Segment" 53 | #define SOFTWARE_VERSION_MAJOR 1 54 | #define SOFTWARE_VERSION_MINOR 0 55 | #define SOFTWARE_VERSION_PATCH 0 56 | #define HARDWARE_VERSION_MAJOR 1 57 | #define HARDWARE_VERSION_MINOR 0 58 | 59 | #endif -------------------------------------------------------------------------------- /src/Watchy.h: -------------------------------------------------------------------------------- 1 | #ifndef WATCHY_H 2 | #define WATCHY_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include "DSEG7_Classic_Bold_53.h" 13 | #include "BLE.h" 14 | #include "bma.h" 15 | #include "config.h" 16 | 17 | typedef struct weatherData{ 18 | int8_t temperature; 19 | int16_t weatherConditionCode; 20 | }weatherData; 21 | 22 | class Watchy { 23 | public: 24 | static DS3232RTC RTC; 25 | static GxEPD2_BW display; 26 | tmElements_t currentTime; 27 | public: 28 | Watchy(); 29 | void init(esp_sleep_wakeup_cause_t wakeup_reason); 30 | float getBatteryVoltage(); 31 | void vibMotor(uint8_t intervalMs = 100, uint8_t length = 20); 32 | 33 | void handleButtonPress(); 34 | void showMenu(byte menuIndex, bool partialRefresh); 35 | void showBattery(); 36 | void showBuzz(); 37 | void showAccelerometer(); 38 | void showUpdateFW(); 39 | void setTime(); 40 | void setupWifi(); 41 | bool connectWiFi(); 42 | weatherData getWeatherData(); 43 | void updateFWBegin(); 44 | 45 | void showWatchFace(bool partialRefresh); 46 | virtual void drawWatchFace(); //override this method for different watch faces 47 | 48 | private: 49 | void _rtcConfig(); 50 | void _bmaConfig(); 51 | static void _configModeCallback(WiFiManager *myWiFiManager); 52 | static uint16_t _readRegister(uint8_t address, uint8_t reg, uint8_t *data, uint16_t len); 53 | static uint16_t _writeRegister(uint8_t address, uint8_t reg, uint8_t *data, uint16_t len); 54 | }; 55 | 56 | extern RTC_DATA_ATTR int guiState; 57 | extern RTC_DATA_ATTR int menuIndex; 58 | extern RTC_DATA_ATTR BMA423 sensor; 59 | extern RTC_DATA_ATTR bool WIFI_CONFIGURED; 60 | extern RTC_DATA_ATTR bool BLE_CONFIGURED; 61 | 62 | #endif -------------------------------------------------------------------------------- /src/Kernel.cpp: -------------------------------------------------------------------------------- 1 | #include "Kernel.h" 2 | 3 | 4 | #define MODULE_NAME "Kernel" 5 | 6 | Kernel::Kernel(){ 7 | _logging = Logging::instance(); 8 | } 9 | 10 | 11 | void Kernel::state_machine(){ 12 | KernelState state = get_state(); 13 | 14 | switch(state){ 15 | case KERNEL_STATE_RTC_ALARM: 16 | _logging->log(MODULE_NAME, "State: RTC Alarm."); 17 | tick(); 18 | break; 19 | 20 | case KERNEL_STATE_BTN_PRESSED: 21 | _logging->log(MODULE_NAME, "State: Btn pressed."); 22 | tick(); 23 | break; 24 | 25 | case KERNEL_STATE_RESET: 26 | _logging->log(MODULE_NAME, "State: Reset."); 27 | tick(); 28 | break; 29 | } 30 | 31 | // Pow, lots of stuff to do - but finally we can sleep again :) 32 | deep_sleep(); 33 | } 34 | 35 | 36 | KernelState Kernel::get_state(){ 37 | KernelState state; 38 | _wakeup_reason = esp_sleep_get_wakeup_cause(); 39 | if(_wakeup_reason == ESP_SLEEP_WAKEUP_EXT0){ 40 | state = KERNEL_STATE_RTC_ALARM; 41 | } else if(_wakeup_reason == ESP_SLEEP_WAKEUP_EXT1){ 42 | state = KERNEL_STATE_BTN_PRESSED; 43 | } else { 44 | state = KERNEL_STATE_RESET; 45 | } 46 | 47 | return state; 48 | } 49 | 50 | 51 | void Kernel::tick(){ 52 | watch_face_tick(); 53 | step_module_tick(); 54 | } 55 | 56 | 57 | void Kernel::watch_face_tick(){ 58 | _watchface.init(_wakeup_reason); 59 | } 60 | 61 | 62 | void Kernel::step_module_tick(){ 63 | tmElements_t currentTime; 64 | _watchface.RTC.read(currentTime); 65 | 66 | if(currentTime.Hour == 0 && currentTime.Minute == 0){ 67 | _logging->log(MODULE_NAME, "Reset step counter."); 68 | sensor.resetStepCounter(); 69 | } 70 | } 71 | 72 | 73 | void Kernel::btn_press(){ 74 | 75 | } 76 | 77 | 78 | void Kernel::alarm(){ 79 | 80 | } 81 | 82 | 83 | void Kernel::deep_sleep(){ 84 | esp_sleep_enable_ext0_wakeup(RTC_PIN, 0); //enable deep sleep wake on RTC interrupt 85 | esp_sleep_enable_ext1_wakeup(BTN_PIN_MASK, ESP_EXT1_WAKEUP_ANY_HIGH); //enable deep sleep wake on button press 86 | esp_deep_sleep_start(); 87 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | examples/WatchFaces/David/config.h 2 | src/usr_config.h 3 | output 4 | app/bin/ 5 | app/pde.jar 6 | build/macosx/work/ 7 | arduino-core/bin/ 8 | arduino-core/arduino-core.jar 9 | hardware/arduino/bootloaders/caterina_LUFA/Descriptors.o 10 | hardware/arduino/bootloaders/caterina_LUFA/Descriptors.lst 11 | hardware/arduino/bootloaders/caterina_LUFA/Caterina.sym 12 | hardware/arduino/bootloaders/caterina_LUFA/Caterina.o 13 | hardware/arduino/bootloaders/caterina_LUFA/Caterina.map 14 | hardware/arduino/bootloaders/caterina_LUFA/Caterina.lst 15 | hardware/arduino/bootloaders/caterina_LUFA/Caterina.lss 16 | hardware/arduino/bootloaders/caterina_LUFA/Caterina.elf 17 | hardware/arduino/bootloaders/caterina_LUFA/Caterina.eep 18 | hardware/arduino/bootloaders/caterina_LUFA/.dep/ 19 | build/*.zip 20 | build/*.tar.bz2 21 | build/windows/work/ 22 | build/windows/*.zip 23 | build/windows/*.tgz 24 | build/windows/*.tar.bz2 25 | build/windows/libastylej* 26 | build/windows/liblistSerials* 27 | build/windows/arduino-*.zip 28 | build/windows/dist/*.tar.gz 29 | build/windows/dist/*.tar.bz2 30 | build/windows/launch4j-*.tgz 31 | build/windows/launch4j-*.zip 32 | build/windows/launcher/launch4j 33 | build/windows/WinAVR-*.zip 34 | build/macosx/arduino-*.zip 35 | build/macosx/dist/*.tar.gz 36 | build/macosx/dist/*.tar.bz2 37 | build/macosx/*.tar.bz2 38 | build/macosx/libastylej* 39 | build/macosx/appbundler*.jar 40 | build/macosx/appbundler*.zip 41 | build/macosx/appbundler 42 | build/macosx/appbundler-1.0ea-arduino? 43 | build/macosx/appbundler-1.0ea-arduino*.zip 44 | build/macosx/appbundler-1.0ea-upstream*.zip 45 | build/linux/work/ 46 | build/linux/dist/*.tar.gz 47 | build/linux/dist/*.tar.bz2 48 | build/linux/*.tgz 49 | build/linux/*.tar.xz 50 | build/linux/*.tar.bz2 51 | build/linux/*.zip 52 | build/linux/libastylej* 53 | build/linux/liblistSerials* 54 | build/shared/reference*.zip 55 | build/shared/Edison*.zip 56 | build/shared/Galileo*.zip 57 | build/shared/WiFi101-Updater-ArduinoIDE-Plugin*.zip 58 | test-bin 59 | *.iml 60 | .idea 61 | .DS_Store 62 | .directory 63 | hardware/arduino/avr/libraries/Bridge/examples/XivelyClient/passwords.h 64 | avr-toolchain-*.zip 65 | /app/nbproject/private/ 66 | /arduino-core/nbproject/private/ 67 | /app/build/ 68 | /arduino-core/build/ 69 | 70 | manifest.mf 71 | nbbuild.xml 72 | nbproject 73 | -------------------------------------------------------------------------------- /src/Watchy_Linux.cpp: -------------------------------------------------------------------------------- 1 | #include "Watchy_Linux.h" 2 | 3 | 4 | // For more fonts look here: 5 | // https://learn.adafruit.com/adafruit-gfx-graphics-library/using-fonts 6 | //#define FONT_LARGE Bohemian_Typewriter22pt7b 7 | //#define FONT_MEDUM Bohemian_Typewriter18pt7b 8 | #define FONT UbuntuMono_R12pt7b 9 | #define FONT_BOLD UbuntuMono_B12pt7b 10 | 11 | WatchyLinux::WatchyLinux(){ 12 | dark_mode = true; 13 | } 14 | 15 | 16 | void WatchyLinux::handleButtonPress(){ 17 | WatchyBase::handleButtonPress(); 18 | 19 | uint64_t wakeupBit = esp_sleep_get_ext1_wakeup_status(); 20 | if(IS_DOUBLE_TAP){ 21 | // NOP 22 | } 23 | } 24 | 25 | 26 | void WatchyLinux::drawWatchFace(){ 27 | WatchyBase::drawWatchFace(); 28 | if(watchFaceDisabled()){ 29 | return; 30 | } 31 | 32 | drawBitmapRotate(100, 200, dont_panic, 0, DARK_GREY); 33 | 34 | // Date time 35 | String hourStr = String(currentTime.Hour); 36 | hourStr = currentTime.Hour < 10 ? "0" + hourStr : hourStr; 37 | String minStr = String(currentTime.Minute); 38 | minStr = currentTime.Minute < 10 ? "0" + minStr : minStr; 39 | 40 | String dayOfWeek = dayShortStr(currentTime.Wday); 41 | String dayStr = String(currentTime.Day); 42 | dayStr = currentTime.Day < 10 ? "0" + dayStr : dayStr; 43 | 44 | // Battery 45 | int8_t bat = getBattery(); 46 | bat = bat >= 100 ? 99 : bat; 47 | String batStr = String(bat); 48 | batStr = bat < 10 ? "0" + batStr : batStr; 49 | 50 | // Step counter 51 | uint32_t steps = sensor.getCounter(); 52 | 53 | // Alarm 54 | String alarm_str = alarm_timer < 0 ? "N/A" : String(alarm_timer) + " min."; 55 | 56 | // Draw background 57 | display.setFont(&FONT_BOLD); 58 | display.setTextColor(FOREGROUND_COLOR); 59 | display.setCursor(0, 30); 60 | display.println(" deepthought:$"); 61 | 62 | display.setFont(&FONT); 63 | display.print(" [TIME] "); 64 | display.println(hourStr + ":" + minStr); 65 | display.print(" [DATE] "); 66 | display.println(dayOfWeek + " " + dayStr); 67 | display.print(" [BATT] "); 68 | display.println(batStr + " %"); 69 | display.print(" [ALRM] "); 70 | display.println(alarm_str); 71 | display.print(" [STEP] "); 72 | display.println(steps); 73 | 74 | display.setCursor(0, 180); 75 | display.setFont(&FONT_BOLD); 76 | display.println("--==|| 42 ||==--"); 77 | // display.fillRect(135, 164, 10, 20, FOREGROUND_COLOR); 78 | } 79 | -------------------------------------------------------------------------------- /src/bma.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #ifdef ARDUINO 4 | #include 5 | #else 6 | #include 7 | #endif 8 | 9 | #include "bma423.h" 10 | 11 | enum { 12 | DIRECTION_TOP_EDGE = 0, 13 | DIRECTION_BOTTOM_EDGE = 1, 14 | DIRECTION_LEFT_EDGE = 2, 15 | DIRECTION_RIGHT_EDGE = 3, 16 | DIRECTION_DISP_UP = 4, 17 | DIRECTION_DISP_DOWN = 5 18 | } ; 19 | 20 | typedef struct bma4_accel Accel; 21 | typedef struct bma4_accel_config Acfg; 22 | 23 | class BMA423 24 | { 25 | 26 | public: 27 | BMA423(); 28 | ~BMA423(); 29 | 30 | bool begin(bma4_com_fptr_t readCallBlack, bma4_com_fptr_t writeCallBlack, bma4_delay_fptr_t delayCallBlack, 31 | uint8_t address = BMA4_I2C_ADDR_PRIMARY); 32 | 33 | void softReset(); 34 | void shutDown(); 35 | void wakeUp(); 36 | bool selfTest(); 37 | 38 | uint8_t getDirection(); 39 | 40 | bool setAccelConfig(Acfg &cfg); 41 | bool getAccelConfig(Acfg &cfg); 42 | bool getAccel(Accel &acc); 43 | bool getAccelEnable(); 44 | bool disableAccel(); 45 | bool enableAccel(bool en = true); 46 | 47 | bool setINTPinConfig(struct bma4_int_pin_config config, uint8_t pinMap); 48 | bool getINT(); 49 | uint8_t getIRQMASK(); 50 | bool disableIRQ(uint16_t int_map = BMA423_STEP_CNTR_INT); 51 | bool enableIRQ(uint16_t int_map = BMA423_STEP_CNTR_INT); 52 | bool isStepCounter(); 53 | bool isDoubleClick(); 54 | bool isTilt(); 55 | bool isActivity(); 56 | bool isAnyNoMotion(); 57 | 58 | bool resetStepCounter(); 59 | uint32_t getCounter(); 60 | 61 | float readTemperature(); 62 | float readTemperatureF(); 63 | 64 | uint16_t getErrorCode(); 65 | uint16_t getStatus(); 66 | uint32_t getSensorTime(); 67 | 68 | 69 | const char *getActivity(); 70 | bool setRemapAxes(struct bma423_axes_remap *remap_data); 71 | 72 | bool enableFeature(uint8_t feature, uint8_t enable ); 73 | bool enableStepCountInterrupt(bool en = true); 74 | bool enableTiltInterrupt(bool en = true); 75 | bool enableWakeupInterrupt(bool en = true); 76 | bool enableAnyNoMotionInterrupt(bool en = true); 77 | bool enableActivityInterrupt(bool en = true); 78 | 79 | private: 80 | bma4_com_fptr_t __readRegisterFptr; 81 | bma4_com_fptr_t __writeRegisterFptr; 82 | bma4_delay_fptr_t __delayCallBlackFptr; 83 | 84 | uint8_t __address; 85 | uint16_t __IRQ_MASK; 86 | bool __init; 87 | struct bma4_dev __devFptr; 88 | }; 89 | -------------------------------------------------------------------------------- /src/Watchy_BCD.cpp: -------------------------------------------------------------------------------- 1 | #include "Watchy_BCD.h" 2 | 3 | 4 | // For more fonts look here: 5 | // https://learn.adafruit.com/adafruit-gfx-graphics-library/using-fonts 6 | #define FONT FreeMonoBold12pt7b 7 | 8 | 9 | WatchyBCD::WatchyBCD(){ 10 | 11 | } 12 | 13 | 14 | void WatchyBCD::handleButtonPress(){ 15 | WatchyBase::handleButtonPress(); 16 | 17 | uint64_t wakeupBit = esp_sleep_get_ext1_wakeup_status(); 18 | if(IS_DOUBLE_TAP){ 19 | dark_mode = dark_mode ? false : true; 20 | RTC.read(currentTime); 21 | showWatchFace(false); 22 | return; 23 | } 24 | } 25 | 26 | 27 | void WatchyBCD::drawWatchFace(){ 28 | WatchyBase::drawWatchFace(); 29 | if(watchFaceDisabled()){ 30 | return; 31 | } 32 | 33 | display.drawBitmap(0, 0, pcb, 200, 200, FOREGROUND_COLOR); 34 | 35 | display.setFont(&FONT); 36 | display.setTextColor(FOREGROUND_COLOR); 37 | 38 | display.fillRect(43, 5, 50, 21, BACKGROUND_COLOR); 39 | display.setCursor(48, 20); 40 | display.println("10b"); 41 | 42 | display.fillRect(123, 5, 50, 21, BACKGROUND_COLOR); 43 | display.setCursor(128, 20); 44 | display.println("01b"); 45 | 46 | uint32_t steps = sensor.getCounter(); 47 | uint8_t bat = getBattery(); 48 | bat = min((uint8_t) 99, bat); 49 | 50 | printBCD("h", 30, currentTime.Hour); 51 | printBCD("m", 50, currentTime.Minute); 52 | 53 | printBCD("M", 80, currentTime.Month); 54 | printBCD("D", 100, currentTime.Day); 55 | 56 | printBCD("B", 130, bat); 57 | 58 | uint32_t setps_10k = steps / 1000; 59 | uint32_t steps_100 = (steps - 1000*setps_10k) / 10; 60 | printBCD("S", 160, setps_10k); 61 | printBCD("", 180, steps_100); 62 | } 63 | 64 | 65 | void WatchyBCD::printBCD(String s, uint16_t y, uint16_t value){ 66 | if(s != ""){ 67 | display.fillRect(8, y-5, 22, 22, BACKGROUND_COLOR); 68 | display.setCursor(13, y+13); 69 | display.println(s); 70 | } 71 | 72 | printBinary(38, y, (uint8_t) value / 10, 4); 73 | printBinary(118, y, (uint8_t) value % 10, 4); 74 | } 75 | 76 | void WatchyBCD::printBinary(uint16_t x, uint16_t y, uint8_t value, uint8_t n){ 77 | if(n <= 0){ 78 | return; 79 | } 80 | 81 | uint8_t gap = 2; 82 | uint8_t size = 15; 83 | uint8_t x_pos = x + (n-1)*(size+gap); 84 | 85 | display.fillRoundRect(x_pos-gap, y-gap-1, size+2*gap, size+2*gap+2, 3, BACKGROUND_COLOR); 86 | if(value % 2 == 0){ 87 | display.drawRoundRect(x_pos, y, size, size, 3, FOREGROUND_COLOR); 88 | display.drawRoundRect(x_pos+1, y+1, size-2, size-2, 3, FOREGROUND_COLOR); 89 | display.fillRoundRect(x_pos+2, y+2, size-4, size-4, 3, BACKGROUND_COLOR); 90 | } else { 91 | display.fillRoundRect(x_pos, y, size, size, 3, FOREGROUND_COLOR); 92 | } 93 | 94 | printBinary(x, y, value / 2, n-1); 95 | } -------------------------------------------------------------------------------- /src/Watchy_BTTF.cpp: -------------------------------------------------------------------------------- 1 | #include "Watchy_BTTF.h" 2 | 3 | 4 | // For more fonts look here: 5 | // https://learn.adafruit.com/adafruit-gfx-graphics-library/using-fonts 6 | //#define FONT_LARGE Bohemian_Typewriter22pt7b 7 | //#define FONT_MEDUM Bohemian_Typewriter18pt7b 8 | #define FONT_7_SEG_LARGE Seven_Seg24pt7b 9 | #define FONT_7_SEG_MEDIUM Seven_Seg18pt7b 10 | 11 | WatchyBTTF::WatchyBTTF(){ 12 | 13 | } 14 | 15 | 16 | void WatchyBTTF::handleButtonPress(){ 17 | WatchyBase::handleButtonPress(); 18 | 19 | uint64_t wakeupBit = esp_sleep_get_ext1_wakeup_status(); 20 | if(IS_DOUBLE_TAP){ 21 | // NOP 22 | } 23 | } 24 | 25 | 26 | void WatchyBTTF::drawWatchFace(){ 27 | WatchyBase::drawWatchFace(); 28 | if(watchFaceDisabled()){ 29 | return; 30 | } 31 | 32 | display.drawBitmap(0, 0, bttf, 200, 200, FOREGROUND_COLOR); 33 | drawTime(); 34 | drawDate(); 35 | drawSteps(); 36 | drawBattery(); 37 | //drawHelperGrid(); 38 | } 39 | 40 | 41 | void WatchyBTTF::printCentered(uint16_t x, uint16_t y, String text){ 42 | int16_t x1, y1; 43 | uint16_t w, h; 44 | 45 | display.getTextBounds(text, 40, 100, &x1, &y1, &w, &h); 46 | display.setCursor(x-w/2, y+h/2); 47 | display.println(text); 48 | } 49 | 50 | 51 | void WatchyBTTF::drawTime(){ 52 | display.setFont(&FONT_7_SEG_LARGE); 53 | display.setTextColor(BACKGROUND_COLOR); 54 | String hourStr = String(currentTime.Hour); 55 | hourStr = currentTime.Hour < 10 ? "0" + hourStr : hourStr; 56 | printCentered(101, 42, hourStr); 57 | 58 | String minStr = String(currentTime.Minute); 59 | minStr = currentTime.Minute < 10 ? "0" + minStr : minStr; 60 | printCentered(165, 42, minStr); 61 | } 62 | 63 | 64 | void WatchyBTTF::drawDate(){ 65 | display.setFont(&FONT_7_SEG_MEDIUM); 66 | display.setTextColor(BACKGROUND_COLOR); 67 | 68 | String month = monthShortStr(currentTime.Month); 69 | printCentered(35, 103, month); 70 | 71 | String dayStr = String(currentTime.Day); 72 | dayStr = currentTime.Day < 10 ? "0" + dayStr : dayStr; 73 | printCentered(94, 103, dayStr); 74 | 75 | if(alarm_timer < 0){ 76 | String yearStr = String(currentTime.Year + YEAR_OFFSET); 77 | printCentered(157, 103, yearStr); 78 | } else { 79 | String alarm_str = "T-" + String(alarm_timer); 80 | printCentered(157, 103, alarm_str); 81 | } 82 | } 83 | 84 | 85 | void WatchyBTTF::drawBattery(){ 86 | display.setFont(&FONT_7_SEG_MEDIUM); 87 | display.setTextColor(BACKGROUND_COLOR); 88 | 89 | int8_t bat = getBattery(); 90 | String batStr = String(bat); 91 | batStr = bat < 10 ? "0" + batStr : batStr; 92 | batStr = bat < 100 ? "0" + batStr : batStr; 93 | printCentered(151, 169, batStr); 94 | } 95 | 96 | 97 | void WatchyBTTF::drawSteps(){ 98 | display.setFont(&FONT_7_SEG_MEDIUM); 99 | display.setTextColor(BACKGROUND_COLOR); 100 | 101 | uint32_t steps = sensor.getCounter(); 102 | String stepStr = String(steps); 103 | for(int i=1; i<5; i++){ 104 | stepStr = steps < pow(10, i) ? "0" + stepStr : stepStr; 105 | } 106 | 107 | printCentered(62, 169, stepStr); 108 | } -------------------------------------------------------------------------------- /src/Watchy_Base.h: -------------------------------------------------------------------------------- 1 | #ifndef WATCHY_BASE_H 2 | #define WATCHY_BASE_H 3 | 4 | #include "Watchy.h" 5 | #include "fonts.h" 6 | #include "icons.h" 7 | #include 8 | #include "Images/smart_home.h" 9 | #include "Images/sleep.h" 10 | #include 11 | 12 | 13 | // ---- USER SETTINGS ---------------------------- 14 | // Note: The user settings can also be specified 15 | // in config.h - its loaded if it exists. 16 | #define WIFI_SSID "ENTER_HERE" 17 | #define WIFI_PASS "ENTER_HERE" 18 | 19 | #define MQTT_BROKER "ENTER_HERE" 20 | #define MQTT_TOPIC "ENTER_HERE" 21 | #define MQTT_PAYLOAD "ENTER_HERE" 22 | 23 | #define SLEEP_HOUR 1 24 | #define SLEEP_MINUTE 0 25 | 26 | #define BATTERY_OFFSET 0.30 // This offset is different for each watchy [V] 27 | 28 | #if __has_include("usr_config.h") && __has_include() 29 | # include "usr_config.h" 30 | #endif 31 | // ----------------------------------------------- 32 | 33 | 34 | extern RTC_DATA_ATTR bool show_mqqt_data; 35 | extern RTC_DATA_ATTR int16_t alarm_timer; 36 | 37 | // Btn definitions 38 | #define IS_DOUBLE_TAP (wakeupBit & ACC_INT_MASK && guiState == WATCHFACE_STATE) 39 | #define IS_BTN_RIGHT_UP (wakeupBit & UP_BTN_MASK && guiState == WATCHFACE_STATE) 40 | #define IS_BTN_LEFT_UP (wakeupBit & BACK_BTN_MASK && guiState == WATCHFACE_STATE) 41 | #define IS_BTN_RIGHT_DOWN (wakeupBit & DOWN_BTN_MASK && guiState == WATCHFACE_STATE) 42 | 43 | // Color settings 44 | extern RTC_DATA_ATTR bool dark_mode; 45 | #define FOREGROUND_COLOR (dark_mode ? GxEPD_WHITE : GxEPD_BLACK) 46 | #define BACKGROUND_COLOR (dark_mode ? GxEPD_BLACK : GxEPD_WHITE) 47 | 48 | // Other settings 49 | //#define EXT_INT_MASK MENU_BTN_MASK|BACK_BTN_MASK|UP_BTN_MASK|DOWN_BTN_MASK|ACC_INT_MASK 50 | #define EXT_INT_MASK MENU_BTN_MASK|BACK_BTN_MASK|UP_BTN_MASK|DOWN_BTN_MASK 51 | 52 | #define GREY 0x7BEF 53 | #define DARK_GREY 0x7BEE 54 | #define LIGHT_GREY 0x7BED 55 | 56 | class WatchyBase : public Watchy { 57 | public: 58 | WatchyBase(); 59 | virtual void drawWatchFace(); 60 | virtual void init(esp_sleep_wakeup_cause_t wakeup_reason); 61 | virtual void handleButtonPress(); 62 | void vibrate(uint8_t times=1, uint32_t delay_time=50); 63 | uint8_t getBattery(); 64 | bool connectWiFi(); 65 | void disconnectWiFi(); 66 | uint8_t openDoor(); 67 | uint8_t loadMqqtData(); 68 | void drawHelperGrid(); 69 | void drawMqqtData(); 70 | bool watchFaceDisabled(); 71 | void drawPixel(int16_t x, int16_t y,uint16_t col); 72 | void drawBitmapCol(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t color1); 73 | int getPixel(int16_t x, int16_t y, const uint8_t *bitmap); 74 | void drawBitmapRotate(int xx, int yy, const uint8_t *bitmap, unsigned int fAngle, uint16_t color); 75 | private: 76 | void _minutesToHM(int16_t minutes, uint8_t &h, uint8_t &m); 77 | void _rtcConfig(); 78 | void _bmaConfig(); 79 | static uint16_t _readRegister(uint8_t address, uint8_t reg, uint8_t *data, uint16_t len); 80 | static uint16_t _writeRegister(uint8_t address, uint8_t reg, uint8_t *data, uint16_t len); 81 | }; 82 | 83 | #endif 84 | -------------------------------------------------------------------------------- /src/Watchy_LCARS.cpp: -------------------------------------------------------------------------------- 1 | #include "Watchy_LCARS.h" 2 | 3 | 4 | // For more fonts look here: 5 | // https://learn.adafruit.com/adafruit-gfx-graphics-library/using-fonts 6 | //#define FONT_LARGE Bohemian_Typewriter22pt7b 7 | //#define FONT_MEDUM Bohemian_Typewriter18pt7b 8 | #define FONT_LARGE Okuda_A5PL25pt7b 9 | #define FONT_MEDIUM Okuda_A5PL16pt7b 10 | #define FONT_SMALL Okuda_A5PL14pt7b 11 | 12 | WatchyLCARS::WatchyLCARS(){ 13 | 14 | } 15 | 16 | 17 | void WatchyLCARS::handleButtonPress(){ 18 | WatchyBase::handleButtonPress(); 19 | 20 | uint64_t wakeupBit = esp_sleep_get_ext1_wakeup_status(); 21 | if(IS_DOUBLE_TAP){ 22 | // NOP 23 | } 24 | } 25 | 26 | 27 | void WatchyLCARS::drawWatchFace(){ 28 | WatchyBase::drawWatchFace(); 29 | if(watchFaceDisabled()){ 30 | return; 31 | } 32 | 33 | // Draw background 34 | display.drawBitmap(0, 0, lcars_img, 200, 200, FOREGROUND_COLOR); 35 | display.setFont(&FONT_SMALL); 36 | display.setTextColor(BACKGROUND_COLOR); 37 | display.setCursor(110, 185); 38 | display.println("STEP"); 39 | display.setCursor(60, 93); 40 | display.println("lcars-watchy"); 41 | 42 | // Draw data 43 | drawTime(); 44 | drawDate(); 45 | drawSteps(); 46 | drawBattery(); 47 | drawAlarm(); 48 | } 49 | 50 | 51 | void WatchyLCARS::printCentered(uint16_t x, uint16_t y, String text){ 52 | int16_t x1, y1; 53 | uint16_t w, h; 54 | 55 | display.getTextBounds(text, 40, 100, &x1, &y1, &w, &h); 56 | display.setCursor(x-w/2, y+h/2); 57 | display.println(text); 58 | } 59 | 60 | 61 | void WatchyLCARS::drawTime(){ 62 | display.setFont(&FONT_LARGE); 63 | display.setTextColor(BACKGROUND_COLOR); 64 | String hourStr = String(currentTime.Hour); 65 | hourStr = currentTime.Hour < 10 ? "0" + hourStr : hourStr; 66 | 67 | String minStr = String(currentTime.Minute); 68 | minStr = currentTime.Minute < 10 ? "0" + minStr : minStr; 69 | printCentered(55, 25, hourStr + ":" + minStr); 70 | } 71 | 72 | 73 | void WatchyLCARS::drawDate(){ 74 | display.setFont(&FONT_SMALL); 75 | display.setTextColor(BACKGROUND_COLOR); 76 | 77 | String dayOfWeek = dayShortStr(currentTime.Wday); 78 | String dayStr = String(currentTime.Day); 79 | dayStr = currentTime.Day < 10 ? "0" + dayStr : dayStr; 80 | display.setCursor(97, 25); 81 | display.println(dayStr); 82 | display.setCursor(97, 47); 83 | display.println(dayOfWeek); 84 | } 85 | 86 | 87 | void WatchyLCARS::drawBattery(){ 88 | display.setFont(&FONT_MEDIUM); 89 | display.setTextColor(BACKGROUND_COLOR); 90 | 91 | int8_t bat = getBattery(); 92 | bat = bat >= 100 ? 99 : bat; 93 | String batStr = String(bat); 94 | batStr = bat < 10 ? "0" + batStr : batStr; 95 | display.setCursor(35, 125); 96 | display.println("battery: "); 97 | display.setCursor(113, 125); 98 | display.println(batStr + "%"); 99 | } 100 | 101 | 102 | void WatchyLCARS::drawAlarm(){ 103 | display.setFont(&FONT_MEDIUM); 104 | display.setTextColor(BACKGROUND_COLOR); 105 | 106 | display.setCursor(35, 151); 107 | display.println("alarm:"); 108 | display.setCursor(113, 151); 109 | if(alarm_timer < 0){ 110 | display.println("off"); 111 | } else { 112 | display.println("T-" + String(alarm_timer)); 113 | } 114 | } 115 | 116 | 117 | // void WatchyLCARS::drawTemperature(){ 118 | // display.setFont(&FONT_SMALL); 119 | // display.setTextColor(BACKGROUND_COLOR); 120 | 121 | // uint8_t temperature = RTC.temperature() / 4; 122 | // display.setCursor(65, 143); 123 | // display.println("Temp. " + String(temperature)); 124 | // } 125 | 126 | 127 | void WatchyLCARS::drawSteps(){ 128 | display.setFont(&FONT_MEDIUM); 129 | display.setTextColor(BACKGROUND_COLOR); 130 | 131 | uint32_t steps = sensor.getCounter(); 132 | display.setCursor(35, 186); 133 | display.println(steps); 134 | } -------------------------------------------------------------------------------- /src/Watchy_Dot.cpp: -------------------------------------------------------------------------------- 1 | #include "Watchy_Dot.h" 2 | 3 | 4 | #define FONT Himalaya_40020pt7b 5 | 6 | WatchyDot::WatchyDot(){ 7 | 8 | } 9 | 10 | 11 | void WatchyDot::handleButtonPress(){ 12 | WatchyBase::handleButtonPress(); 13 | 14 | uint64_t wakeupBit = esp_sleep_get_ext1_wakeup_status(); 15 | if(IS_DOUBLE_TAP){ 16 | dark_mode = dark_mode ? false : true; 17 | RTC.read(currentTime); 18 | showWatchFace(false); 19 | return; 20 | } 21 | } 22 | 23 | 24 | void WatchyDot::drawWatchFace(){ 25 | WatchyBase::drawWatchFace(); 26 | if(watchFaceDisabled()){ 27 | return; 28 | } 29 | 30 | drawTriangles(); 31 | drawDate(); 32 | drawAlarm(); 33 | drawTime(); 34 | } 35 | 36 | 37 | void WatchyDot::printCentered(uint16_t x, uint16_t y, String text, uint16_t size=1){ 38 | int16_t x1, y1; 39 | uint16_t w, h; 40 | display.getTextBounds(text, 40, 100, &x1, &y1, &w, &h); 41 | 42 | display.setTextColor(BACKGROUND_COLOR); 43 | for(int i=-size-3;i y; 122 | 123 | if(upper_triangle){ 124 | if(y >= 200-bat-1 && y < 200-bat+1){ 125 | color = GxEPD_WHITE; 126 | } else { 127 | color = y >= 200-bat ? DARK_GREY : LIGHT_GREY; 128 | } 129 | } else { 130 | if(y >= 200-steps-1 && y < 200-steps+1){ 131 | color = GxEPD_WHITE; 132 | } else { 133 | color = y >= 200-steps ? GxEPD_BLACK : GREY; 134 | } 135 | } 136 | 137 | // Split both triangles 138 | if(abs(x-y) < 2){ 139 | color = GxEPD_WHITE; 140 | } 141 | 142 | drawPixel(x, y, color); 143 | } 144 | } 145 | } 146 | 147 | 148 | void WatchyDot::drawAlarm(){ 149 | display.setFont(&FONT); 150 | display.setTextColor(FOREGROUND_COLOR); 151 | if(alarm_timer < 0){ 152 | return; 153 | } 154 | 155 | printCentered(100, 153, String(alarm_timer) + " min."); 156 | } -------------------------------------------------------------------------------- /src/Watchy_Analog.cpp: -------------------------------------------------------------------------------- 1 | #include "Watchy_Analog.h" 2 | 3 | 4 | #define FONT WallingtonRegular12pt7b 5 | #define WHITE_TEXT_SIZE 2 6 | 7 | WatchyAnalog::WatchyAnalog(){ 8 | 9 | } 10 | 11 | 12 | void WatchyAnalog::handleButtonPress(){ 13 | WatchyBase::handleButtonPress(); 14 | 15 | uint64_t wakeupBit = esp_sleep_get_ext1_wakeup_status(); 16 | if(IS_DOUBLE_TAP){ 17 | dark_mode = dark_mode ? false : true; 18 | RTC.read(currentTime); 19 | showWatchFace(false); 20 | return; 21 | } 22 | } 23 | 24 | 25 | void WatchyAnalog::drawWatchFace(){ 26 | WatchyBase::drawWatchFace(); 27 | if(watchFaceDisabled()){ 28 | return; 29 | } 30 | 31 | // drawBitmapRotate(100, 200, analog_bg, 0, LIGHT_GREY); 32 | // drawBitmapRotate(100, 200, analog, 0, GxEPD_BLACK); 33 | for(int y=100; y < 200; y++){ 34 | for(int x=0; x < 200; x++){ 35 | drawPixel(x, y, LIGHT_GREY); 36 | } 37 | } 38 | 39 | drawDate(); 40 | drawSteps(); 41 | drawBattery(); 42 | drawAlarm(); 43 | drawTime(); 44 | 45 | //drawHelperGrid(); 46 | } 47 | 48 | 49 | void WatchyAnalog::printCentered(uint16_t x, uint16_t y, String text){ 50 | int16_t x1, y1; 51 | uint16_t w, h; 52 | 53 | display.getTextBounds(text, 100, 100, &x1, &y1, &w, &h); 54 | display.setCursor(x-w/2, y+h/2); 55 | display.println(text); 56 | } 57 | 58 | 59 | void WatchyAnalog::drawTime(){ 60 | int theHour = currentTime.Hour; 61 | int theMinute = currentTime.Minute; 62 | 63 | // Hour hand 64 | int hourAngle = ((theHour%12)*60 + theMinute) * 360 / 720; 65 | drawBitmapRotate(100,100, hour_hand_inv, hourAngle, GxEPD_WHITE); 66 | drawBitmapRotate(100,100, hour_hand_inv, hourAngle, GREY); 67 | drawBitmapRotate(100,100, hour_hand, hourAngle, GxEPD_BLACK); 68 | 69 | // Minute hand 70 | drawBitmapRotate(100,100, minute_hand_inv, theMinute * 6, GxEPD_WHITE); 71 | drawBitmapRotate(100,100, minute_hand_inv, theMinute * 6, GREY); 72 | drawBitmapRotate(100,100, minute_hand, theMinute * 6, GxEPD_BLACK); 73 | 74 | // Middle circle 75 | display.fillCircle(100,100, 13, BACKGROUND_COLOR); 76 | display.fillCircle(100,100, 9, FOREGROUND_COLOR); 77 | display.fillCircle(100,100, 5, BACKGROUND_COLOR); 78 | } 79 | 80 | 81 | void WatchyAnalog::drawDate(){ 82 | display.setFont(&FONT); 83 | display.setTextColor(FOREGROUND_COLOR); 84 | 85 | // Day 86 | String dayStr = String(currentTime.Day); 87 | dayStr = currentTime.Day < 10 ? "0" + dayStr : dayStr; 88 | 89 | display.setTextColor(BACKGROUND_COLOR); 90 | for(int i=-WHITE_TEXT_SIZE;i= 0){ 108 | printCentered(100, 40, "T-" + String(alarm_timer) + " min."); 109 | } else{ 110 | printCentered(100, 35, "Watchy"); 111 | } 112 | } 113 | 114 | 115 | void WatchyAnalog::drawBattery(){ 116 | display.setFont(&FONT); 117 | display.setTextColor(FOREGROUND_COLOR); 118 | 119 | int8_t bat = getBattery(); 120 | bat = bat >= 100 ? 99 : bat; 121 | String batStr = String(bat); 122 | batStr = bat < 10 ? "0" + batStr : batStr; 123 | 124 | display.setTextColor(BACKGROUND_COLOR); 125 | for(int i=-WHITE_TEXT_SIZE;igetValue(); 49 | if (!updateFlag) { //If it's the first packet of OTA since bootup, begin OTA 50 | //Serial.println("Begin FW Update"); 51 | esp_ota_begin(esp_ota_get_next_update_partition(NULL), OTA_SIZE_UNKNOWN, &otaHandler); 52 | updateFlag = true; 53 | status = STATUS_UPDATING; 54 | } 55 | if (_p_ble != NULL) 56 | { 57 | if (rxData.length() > 0) 58 | { 59 | esp_ota_write(otaHandler, rxData.c_str(), rxData.length()); 60 | bytesReceived = bytesReceived + rxData.length(); 61 | if (rxData.length() != FULL_PACKET) 62 | { 63 | esp_ota_end(otaHandler); 64 | //Serial.println("End FW Update"); 65 | if (ESP_OK == esp_ota_set_boot_partition(esp_ota_get_next_update_partition(NULL))) { 66 | status = STATUS_READY; 67 | } 68 | else { 69 | //Serial.println("Upload Error"); 70 | } 71 | } 72 | } 73 | } 74 | 75 | uint8_t txData[5] = {1, 2, 3, 4, 5}; 76 | //delay(1000); 77 | pCharacteristic->setValue((uint8_t*)txData, 5); 78 | pCharacteristic->notify(); 79 | } 80 | 81 | // 82 | // Constructor 83 | BLE::BLE(void) { 84 | 85 | } 86 | 87 | // 88 | // Destructor 89 | BLE::~BLE(void) 90 | { 91 | 92 | } 93 | 94 | // 95 | // begin 96 | bool BLE::begin(const char* localName = "Watchy BLE OTA") { 97 | // Create the BLE Device 98 | BLEDevice::init(localName); 99 | 100 | // Create the BLE Server 101 | pServer = BLEDevice::createServer(); 102 | pServer->setCallbacks(new BLECustomServerCallbacks()); 103 | 104 | // Create the BLE Service 105 | pESPOTAService = pServer->createService(SERVICE_UUID_ESPOTA); 106 | pService = pServer->createService(SERVICE_UUID_OTA); 107 | 108 | // Create a BLE Characteristic 109 | pESPOTAIdCharacteristic = pESPOTAService->createCharacteristic( 110 | CHARACTERISTIC_UUID_ID, 111 | BLECharacteristic::PROPERTY_READ 112 | ); 113 | 114 | pVersionCharacteristic = pService->createCharacteristic( 115 | CHARACTERISTIC_UUID_HW_VERSION, 116 | BLECharacteristic::PROPERTY_READ 117 | ); 118 | 119 | pWatchFaceNameCharacteristic = pService->createCharacteristic( 120 | CHARACTERISTIC_UUID_WATCHFACE_NAME, 121 | BLECharacteristic::PROPERTY_READ 122 | ); 123 | 124 | pOtaCharacteristic = pService->createCharacteristic( 125 | CHARACTERISTIC_UUID_FW, 126 | BLECharacteristic::PROPERTY_NOTIFY | BLECharacteristic::PROPERTY_WRITE 127 | ); 128 | 129 | pOtaCharacteristic->addDescriptor(new BLE2902()); 130 | pOtaCharacteristic->setCallbacks(new otaCallback(this)); 131 | 132 | // Start the service(s) 133 | pESPOTAService->start(); 134 | pService->start(); 135 | 136 | // Start advertising 137 | pServer->getAdvertising()->addServiceUUID(SERVICE_UUID_ESPOTA); 138 | pServer->getAdvertising()->start(); 139 | 140 | uint8_t hardwareVersion[5] = {HARDWARE_VERSION_MAJOR, HARDWARE_VERSION_MINOR, SOFTWARE_VERSION_MAJOR, SOFTWARE_VERSION_MINOR, SOFTWARE_VERSION_PATCH}; 141 | pVersionCharacteristic->setValue((uint8_t*)hardwareVersion, 5); 142 | pWatchFaceNameCharacteristic->setValue("Watchy 7 Segment"); 143 | 144 | return true; 145 | } 146 | 147 | int BLE::updateStatus(){ 148 | return status; 149 | } 150 | 151 | int BLE::howManyBytes(){ 152 | return bytesReceived; 153 | } -------------------------------------------------------------------------------- /src/Images/iron_man.h: -------------------------------------------------------------------------------- 1 | #ifndef IRON_MAN_BASE_H 2 | #define IRON_MAN_BASE_H 3 | 4 | // 'ironman', 80x80px 5 | const unsigned char iron_man [] PROGMEM = { 6 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 7 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 8 | 0x00, 0x03, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xf0, 0x00, 9 | 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 10 | 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 11 | 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xf9, 0xff, 0xff, 12 | 0x1f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xc0, 0xff, 0xff, 0x03, 0xfe, 0x00, 0x00, 0x00, 0x00, 13 | 0xff, 0x00, 0xff, 0xff, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0xff, 0xff, 0x00, 0x7e, 14 | 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0xff, 0xff, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x01, 0xf8, 0x00, 15 | 0xff, 0xff, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x01, 0xf0, 0x00, 0xff, 0xfe, 0x00, 0x1f, 0x00, 0x00, 16 | 0x00, 0x01, 0xf0, 0x00, 0xff, 0xfe, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x7f, 0xfe, 17 | 0x00, 0x1f, 0x80, 0x00, 0x00, 0x03, 0xf0, 0x00, 0x7f, 0xfe, 0x00, 0x1f, 0x80, 0x00, 0x00, 0x03, 18 | 0xf0, 0x00, 0x7f, 0xfe, 0x00, 0x1f, 0x80, 0x00, 0x00, 0x03, 0xf0, 0x00, 0x7f, 0xfe, 0x00, 0x1f, 19 | 0x80, 0x00, 0x00, 0x03, 0xf0, 0x00, 0x7f, 0xfe, 0x00, 0x1f, 0x80, 0x00, 0x00, 0x03, 0xf0, 0x00, 20 | 0x7f, 0xfe, 0x00, 0x1f, 0x80, 0x00, 0x00, 0x03, 0xf0, 0x00, 0x7f, 0xfe, 0x00, 0x1f, 0xc0, 0x00, 21 | 0x00, 0x03, 0xf0, 0x00, 0x7f, 0xfc, 0x00, 0x1f, 0xc0, 0x00, 0x00, 0x03, 0xf0, 0x00, 0x3f, 0xfc, 22 | 0x00, 0x1f, 0xc0, 0x00, 0x00, 0x07, 0xf0, 0x00, 0x3f, 0xfc, 0x00, 0x1f, 0xc0, 0x00, 0x00, 0x07, 23 | 0xf0, 0x00, 0x0f, 0xf0, 0x00, 0x1f, 0xc0, 0x00, 0x00, 0x07, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x1f, 24 | 0xe0, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00, 0x0f, 0xf0, 0x00, 25 | 0x00, 0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xe0, 0x00, 26 | 0x00, 0x0f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00, 0x0f, 0xf8, 0x00, 0x00, 0x00, 27 | 0x00, 0x1f, 0xe0, 0x00, 0x00, 0x0f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00, 0x0f, 28 | 0xf8, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x1f, 29 | 0xe0, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, 0x0f, 0xf0, 0x00, 30 | 0x00, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xe0, 0x00, 31 | 0x00, 0x0f, 0xef, 0x00, 0x00, 0x00, 0x01, 0xe7, 0xe0, 0x00, 0x00, 0x0f, 0xff, 0xf0, 0x00, 0x00, 32 | 0x0f, 0xf7, 0xe0, 0x00, 0x00, 0x0f, 0xff, 0xfe, 0x00, 0x00, 0xff, 0xf7, 0xe0, 0x00, 0x00, 0x0f, 33 | 0xef, 0xff, 0xe0, 0x0f, 0xff, 0xe7, 0xe0, 0x00, 0x00, 0x0f, 0xe3, 0xff, 0xe0, 0x0f, 0xff, 0xc7, 34 | 0xe0, 0x00, 0x00, 0x07, 0xe1, 0xff, 0xc0, 0x07, 0xff, 0x0f, 0xe0, 0x00, 0x00, 0x03, 0xe0, 0x7f, 35 | 0x80, 0x03, 0xfc, 0x0f, 0x00, 0x00, 0x00, 0x03, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 36 | 0x00, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x01, 0xf8, 0x00, 0x00, 0x00, 37 | 0x00, 0x3f, 0x00, 0x00, 0x00, 0x01, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 38 | 0xfc, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x7e, 39 | 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 40 | 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x80, 0x00, 0x00, 0x01, 0xfc, 0x00, 0x00, 41 | 0x00, 0x00, 0x7f, 0x80, 0x00, 0x00, 0x03, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xc0, 0x00, 0x00, 42 | 0x03, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xe0, 0x00, 0x00, 0x07, 0xfc, 0x00, 0x00, 0x00, 0x00, 43 | 0x7f, 0xe0, 0x00, 0x00, 0x07, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, 0x07, 0xf8, 44 | 0x00, 0x00, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, 0x07, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xe0, 45 | 0x00, 0x00, 0x07, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00, 0x07, 0xf0, 0x00, 0x00, 46 | 0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, 47 | 0x07, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, 0x07, 0xc0, 0x00, 0x00, 0x00, 0x00, 48 | 0x07, 0xe0, 0x00, 0x00, 0x07, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x03, 0xe0, 0x00, 0x00, 0x07, 0x80, 49 | 0x00, 0x00, 0x00, 0x00, 0x03, 0xe0, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xe0, 50 | 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 51 | 0x00, 0x00, 0x00, 0x78, 0xff, 0xff, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 52 | 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 53 | 0x00, 0x0f, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0x80, 0x00, 54 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 55 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 56 | }; 57 | 58 | #endif -------------------------------------------------------------------------------- /src/Watchy_Jarvis.cpp: -------------------------------------------------------------------------------- 1 | #include "Watchy_Jarvis.h" 2 | 3 | 4 | // For more fonts look here: 5 | // https://learn.adafruit.com/adafruit-gfx-graphics-library/using-fonts 6 | #define FONT_LARGE Bitwise_m19x18pt7b 7 | #define FONT_MEDUM Bitwise_m19x12pt7b 8 | #define FONT_STEPS Bitwise_m19x10pt7b 9 | #define FONT_SMALL Bitwise_m19x8pt7b 10 | 11 | 12 | WatchyJarvis::WatchyJarvis(){ 13 | 14 | } 15 | 16 | 17 | void WatchyJarvis::handleButtonPress(){ 18 | WatchyBase::handleButtonPress(); 19 | 20 | uint64_t wakeupBit = esp_sleep_get_ext1_wakeup_status(); 21 | if(IS_DOUBLE_TAP){ 22 | dark_mode = dark_mode == true ? false : true; 23 | RTC.read(currentTime); 24 | showWatchFace(false); 25 | return; 26 | } 27 | } 28 | 29 | 30 | void WatchyJarvis::drawWatchFace(){ 31 | WatchyBase::drawWatchFace(); 32 | if(watchFaceDisabled()){ 33 | return; 34 | } 35 | 36 | display.drawBitmap(60, 60, iron_man, 80, 80, FOREGROUND_COLOR); 37 | drawDate(); 38 | drawTime(); 39 | drawSteps(); 40 | drawBattery(); 41 | } 42 | 43 | 44 | void WatchyJarvis::drawTime(){ 45 | display.setFont(&FONT_LARGE); 46 | display.setCursor(80, 30); 47 | if(currentTime.Hour < 10){ 48 | display.print("0"); 49 | } 50 | display.print(currentTime.Hour); 51 | display.print(":"); 52 | if(currentTime.Minute < 10){ 53 | display.print("0"); 54 | } 55 | display.println(currentTime.Minute); 56 | 57 | display.drawLine(53,1, 195, 1, FOREGROUND_COLOR); 58 | display.drawLine(53,2, 195, 2, FOREGROUND_COLOR); 59 | display.drawLine(55,35, 195,35, FOREGROUND_COLOR); 60 | display.drawLine(55,36, 195,36, FOREGROUND_COLOR); 61 | display.drawLine(195,2, 195,135, FOREGROUND_COLOR); 62 | display.drawLine(196,2, 196,135, FOREGROUND_COLOR); 63 | display.drawLine(180,36, 180,135, FOREGROUND_COLOR); 64 | 65 | display.setFont(&FONT_SMALL); 66 | display.setCursor(120, 50); 67 | display.println("time"); 68 | display.drawLine(53,42, 115,42, FOREGROUND_COLOR); 69 | display.drawLine(150,50, 195,50, FOREGROUND_COLOR); 70 | } 71 | 72 | 73 | void WatchyJarvis::drawDate(){ 74 | int16_t x1, y1; 75 | uint16_t w, h; 76 | 77 | drawCircle(10,20,48,FOREGROUND_COLOR,4); 78 | drawCircle(10,20,38,FOREGROUND_COLOR,2); 79 | 80 | display.setFont(&FONT_SMALL); 81 | String dayOfWeek = dayShortStr(currentTime.Wday); 82 | display.getTextBounds(dayOfWeek, 55, 195, &x1, &y1, &w, &h); 83 | display.setCursor(5, 20); 84 | display.println(dayOfWeek); 85 | 86 | display.setFont(&FONT_MEDUM); 87 | display.getTextBounds("00", 55, 195, &x1, &y1, &w, &h); 88 | display.setCursor(5, 40); 89 | if(currentTime.Day < 10){ 90 | display.print("0"); 91 | } 92 | display.println(currentTime.Day); 93 | } 94 | 95 | 96 | void WatchyJarvis::drawBattery(){ 97 | int16_t x1, y1; 98 | uint16_t w, h; 99 | 100 | int8_t percentage = getBattery(); 101 | int8_t height = 60 - float(percentage)/100 * 60; 102 | drawCircle(20, 170, 30, FOREGROUND_COLOR, 6); 103 | display.fillRect(0, 140, 60, height, BACKGROUND_COLOR); 104 | display.fillRect(0, 140, 20, 30, BACKGROUND_COLOR); 105 | drawCircle(20, 170, 40, FOREGROUND_COLOR, 3); 106 | 107 | percentage = min((int8_t) 99, percentage); 108 | display.setFont(&FONT_MEDUM); 109 | display.setCursor(5, 180); 110 | if(percentage < 10) { 111 | display.print("0"); 112 | } 113 | display.println(percentage); 114 | 115 | display.setFont(&FONT_SMALL); 116 | display.setCursor(10, 110); 117 | display.println("power"); 118 | display.getTextBounds("power", 10, 195, &x1, &y1, &w, &h); 119 | display.drawLine(10-1, 112, 10+w+1, 112, FOREGROUND_COLOR); 120 | display.drawLine(10, 112, 5, 130, FOREGROUND_COLOR); 121 | } 122 | 123 | 124 | void WatchyJarvis::drawSteps(){ 125 | int16_t x1, y1; 126 | uint16_t w, h; 127 | 128 | display.setFont(&FONT_STEPS); 129 | uint32_t steps = sensor.getCounter(); 130 | if(steps < 1000){ 131 | display.getTextBounds(String(steps), 100, 180, &x1, &y1, &w, &h); 132 | display.setCursor(175 - w/2, 185); 133 | display.println(steps); 134 | }else{ 135 | steps = round(float(steps / 1000)); 136 | display.getTextBounds(String(steps), 100, 180, &x1, &y1, &w, &h); 137 | display.setCursor(175 - w/2, 180); 138 | display.println(steps); 139 | 140 | display.setFont(&FONT_SMALL); 141 | display.setCursor(155, 195); 142 | display.println("thous."); 143 | } 144 | 145 | drawCircle(185, 185, 50, FOREGROUND_COLOR, 2); 146 | drawCircle(185, 185, 40, FOREGROUND_COLOR, 4); 147 | 148 | display.setFont(&FONT_SMALL); 149 | display.setCursor(80, 170); 150 | display.println("steps"); 151 | display.getTextBounds("steps", 80, 170, &x1, &y1, &w, &h); 152 | display.drawLine(80-1, 172, 80+w+1, 172, FOREGROUND_COLOR); 153 | display.drawLine(80+w, 172, 135, 182, FOREGROUND_COLOR); 154 | 155 | display.drawLine(60, 195, 135, 195, FOREGROUND_COLOR); 156 | } 157 | 158 | 159 | void WatchyJarvis::drawCircle(int16_t x0, int16_t y0, int16_t r, 160 | uint16_t color, uint8_t width){ 161 | for(int i=0; i < width; i++){ 162 | display.drawCircle(x0, y0, r-i, color); 163 | } 164 | } -------------------------------------------------------------------------------- /src/Watchy_Step.cpp: -------------------------------------------------------------------------------- 1 | #include "Watchy_Step.h" 2 | 3 | 4 | // For more fonts look here: 5 | // https://learn.adafruit.com/adafruit-gfx-graphics-library/using-fonts 6 | #define FONT_LARGE_BOLD FreeSansBold24pt7b 7 | #define FONT_MEDUM_BOLD FreeSansBold12pt7b 8 | #define FONT_MEDUM FreeSans12pt7b 9 | #define FONT_SMALL_BOLD FreeSansBold9pt7b 10 | #define FONT_SMALL FreeSans9pt7b 11 | 12 | #define GRAPH_COLOR FOREGROUND_COLOR 13 | 14 | // Store in RTC RAM, otherwise we loose information between different interrupts 15 | RTC_DATA_ATTR uint32_t steps_hours[24] = {0}; //{20,20,15,13,12,11,10,9,8,7,0}; 16 | RTC_DATA_ATTR uint32_t steps_hours_yesterday[24] = {0}; //{5,5,5,5,5,5,10,15,20,30,35,30,30,25,14,13,12,5,13,0,0,0,0,0}; 17 | RTC_DATA_ATTR bool print_date = true; 18 | 19 | 20 | WatchyStep::WatchyStep(){ 21 | 22 | } 23 | 24 | 25 | void WatchyStep::handleButtonPress(){ 26 | WatchyBase::handleButtonPress(); 27 | 28 | uint64_t wakeupBit = esp_sleep_get_ext1_wakeup_status(); 29 | if(IS_DOUBLE_TAP){ 30 | print_date = print_date == true ? false : true; 31 | RTC.read(currentTime); 32 | showWatchFace(true); 33 | return; 34 | } 35 | } 36 | 37 | 38 | void WatchyStep::drawWatchFace(){ 39 | WatchyBase::drawWatchFace(); 40 | if(watchFaceDisabled()){ 41 | return; 42 | } 43 | 44 | for(uint8_t i=0; i<4; i++){ 45 | display.drawRoundRect(0+i, 0+i, 196, 196, 4, FOREGROUND_COLOR); 46 | } 47 | 48 | drawTime(); 49 | drawSteps(); 50 | if(print_date){ 51 | drawDate(); 52 | } else { 53 | drawBattery(); 54 | } 55 | } 56 | 57 | 58 | void WatchyStep::drawTime(){ 59 | display.setFont(&FONT_LARGE_BOLD); 60 | display.setCursor(12, 42); 61 | if(currentTime.Hour < 10){ 62 | display.print("0"); 63 | } 64 | display.print(currentTime.Hour); 65 | display.print(":"); 66 | if(currentTime.Minute < 10){ 67 | display.print("0"); 68 | } 69 | display.println(currentTime.Minute); 70 | } 71 | 72 | 73 | void WatchyStep::drawDate(){ 74 | int16_t x1, y1; 75 | uint16_t w, h; 76 | 77 | display.setFont(&FONT_MEDUM); 78 | String dayOfWeek = dayShortStr(currentTime.Wday); 79 | display.getTextBounds(dayOfWeek, 55, 195, &x1, &y1, &w, &h); 80 | display.setCursor(200-20-w, 25); 81 | display.println(dayOfWeek); 82 | 83 | display.getTextBounds("00", 55, 195, &x1, &y1, &w, &h); 84 | display.setCursor(200-20-w, 45); 85 | if(currentTime.Day < 10){ 86 | display.print("0"); 87 | } 88 | display.println(currentTime.Day); 89 | } 90 | 91 | 92 | void WatchyStep::drawBattery(){ 93 | int8_t percentage = getBattery(); 94 | percentage = min((int8_t) 99, percentage); 95 | display.drawBitmap(145, 15, battery, 37, 21, FOREGROUND_COLOR); 96 | display.setFont(&FONT_SMALL_BOLD); 97 | display.setCursor(152, 31); 98 | if(percentage < 10) { 99 | display.print("0"); 100 | } 101 | display.println(percentage); 102 | } 103 | 104 | 105 | float WatchyStep::getMaxSteps(){ 106 | float max_steps = -1; 107 | for(int i=0; i < 24; i++){ 108 | max_steps = max(float(steps_hours[i]), max_steps); 109 | max_steps = max(float(steps_hours_yesterday[i]), max_steps); 110 | } 111 | return max_steps; 112 | } 113 | 114 | 115 | void WatchyStep::startNewDay(){ 116 | for(int i=0; i < 24; i++){ 117 | steps_hours_yesterday[i] = steps_hours[i]; 118 | steps_hours[i] = 0; 119 | } 120 | } 121 | 122 | 123 | int32_t WatchyStep::getStepsOfDay(){ 124 | int32_t steps = 0; 125 | for(int i=0; i < 24; i++){ 126 | steps += steps_hours[i]; 127 | } 128 | return steps; 129 | } 130 | 131 | 132 | void WatchyStep::drawSteps(){ 133 | int8_t max_height = 70; 134 | 135 | // Bottom line 136 | display.drawLine(5, 140, 195, 140, FOREGROUND_COLOR); 137 | 138 | // Text of bottom line 139 | display.setFont(&FONT_SMALL); 140 | int16_t x1, y1; 141 | uint16_t width, height; 142 | display.getTextBounds("12", 55, 195, &x1, &y1, &width, &height); 143 | display.setCursor(4+12*8 + 2-int(width/2), 160); 144 | display.println("12"); 145 | display.setCursor(4+6*8 + 2-int(width/2), 160); 146 | display.println("06"); 147 | display.setCursor(4+18*8 + 2-int(width/2), 160); 148 | display.println("18"); 149 | 150 | // Whenever we have a new hour, we can restart our step counting. 151 | // But only if its an rtc alarm - ignore button press etc. 152 | 153 | // ToDo: Fix -> changed due to refactoring 154 | //if(rtc_alarm && currentTime.Minute == 0){ 155 | if(currentTime.Minute == 0){ 156 | int8_t last_hour = currentTime.Hour < 1 ? 23 : currentTime.Hour-1; 157 | steps_hours[last_hour] = sensor.getCounter(); 158 | steps_hours[currentTime.Hour] = 0; 159 | sensor.resetStepCounter(); 160 | } else { 161 | steps_hours[currentTime.Hour] = sensor.getCounter(); 162 | } 163 | 164 | // Print max steps for y axis 165 | uint32_t max_steps = getMaxSteps(); 166 | display.setCursor(20, 140-max_height-5); 167 | display.print(max_steps); 168 | display.println(" steps"); 169 | 170 | for(int h=0; h < 24; h++){ 171 | // Clean lines for current hour 172 | uint32_t relative_steps = max_height * float(steps_hours[h]) / float(max_steps+1); // Numerical stability 173 | display.drawLine(4+h*8 + 2, 140, 4+h*8 + 2, 140-relative_steps, GRAPH_COLOR); 174 | display.drawLine(4+h*8 + 3, 140, 4+h*8 + 3, 140-relative_steps, GRAPH_COLOR); 175 | display.drawLine(4+h*8 + 4, 140, 4+h*8 + 4, 140-relative_steps, GRAPH_COLOR); 176 | display.drawLine(4+h*8 + 5, 140, 4+h*8 + 5, 140-relative_steps, GRAPH_COLOR); 177 | 178 | // Last day - only horizontal line 179 | if(steps_hours_yesterday[h] > 0){ 180 | relative_steps = max_height * float(steps_hours_yesterday[h]) / float(max_steps+1); 181 | uint16_t color = steps_hours[h] < steps_hours_yesterday[h] ? FOREGROUND_COLOR : BACKGROUND_COLOR; 182 | display.drawLine(4+h*8 + 2, 140-relative_steps, 4+h*8 + 5, 140-relative_steps, color); 183 | display.drawLine(4+h*8 + 2, 140-relative_steps-1, 4+h*8 + 5, 140-relative_steps-1, color); 184 | } 185 | } 186 | 187 | // Small indicator for current position 188 | display.drawLine(4+currentTime.Hour*8 + 3, 140, 4+currentTime.Hour*8 + 3, 146, FOREGROUND_COLOR); 189 | display.drawLine(4+currentTime.Hour*8 + 4, 140, 4+currentTime.Hour*8 + 4, 146, FOREGROUND_COLOR); 190 | 191 | // Show number of steps as text and bitmap 192 | int32_t step_count_day = getStepsOfDay(); 193 | display.fillRect(0, 170, 196, 26, FOREGROUND_COLOR); 194 | 195 | display.setTextColor(BACKGROUND_COLOR); 196 | display.setFont(&FONT_MEDUM_BOLD); 197 | display.getTextBounds(String(step_count_day), 55, 195, &x1, &y1, &width, &height); 198 | int8_t bitmap_pos = int(200-width)/2; 199 | display.drawBitmap(bitmap_pos-15, 174, steps, 19, 23, BACKGROUND_COLOR); 200 | display.setCursor(bitmap_pos+15, 192); 201 | display.println(step_count_day); 202 | display.setTextColor(FOREGROUND_COLOR); 203 | } -------------------------------------------------------------------------------- /src/bma.cpp: -------------------------------------------------------------------------------- 1 | #include "bma.h" 2 | 3 | #define DEBUGPORT Serial 4 | #ifdef DEBUGPORT 5 | #define DEBUG(...) DEBUGPORT.printf(__VA_ARGS__) 6 | #else 7 | #define DEBUG(...) 8 | #endif 9 | 10 | BMA423::BMA423() 11 | { 12 | __readRegisterFptr = nullptr; 13 | __writeRegisterFptr = nullptr; 14 | __delayCallBlackFptr = nullptr; 15 | __init = false; 16 | } 17 | 18 | BMA423::~BMA423() 19 | { 20 | 21 | } 22 | 23 | bool BMA423::begin(bma4_com_fptr_t readCallBlack, 24 | bma4_com_fptr_t writeCallBlack, 25 | bma4_delay_fptr_t delayCallBlack, 26 | uint8_t address) 27 | { 28 | 29 | if (__init || 30 | readCallBlack == nullptr || 31 | writeCallBlack == nullptr || 32 | delayCallBlack == nullptr) { 33 | return true; 34 | } 35 | 36 | __readRegisterFptr = readCallBlack; 37 | __writeRegisterFptr = writeCallBlack; 38 | __delayCallBlackFptr = delayCallBlack; 39 | 40 | __devFptr.dev_addr = address; 41 | __devFptr.interface = BMA4_I2C_INTERFACE; 42 | __devFptr.bus_read = readCallBlack; 43 | __devFptr.bus_write = writeCallBlack; 44 | __devFptr.delay = delayCallBlack; 45 | __devFptr.read_write_len = 8; 46 | __devFptr.resolution = 12; 47 | __devFptr.feature_len = BMA423_FEATURE_SIZE; 48 | 49 | softReset(); 50 | 51 | __delayCallBlackFptr(20); 52 | 53 | if (bma423_init(&__devFptr) != BMA4_OK) { 54 | DEBUG("BMA423 FAIL\n"); 55 | return false; 56 | } 57 | 58 | if (bma423_write_config_file(&__devFptr) != BMA4_OK) { 59 | DEBUG("BMA423 Write Config FAIL\n"); 60 | return false; 61 | } 62 | 63 | __init = true; 64 | 65 | struct bma4_int_pin_config config ; 66 | config.edge_ctrl = BMA4_LEVEL_TRIGGER; 67 | config.lvl = BMA4_ACTIVE_HIGH; 68 | config.od = BMA4_PUSH_PULL; 69 | config.output_en = BMA4_OUTPUT_ENABLE; 70 | config.input_en = BMA4_INPUT_DISABLE; 71 | 72 | 73 | if (bma4_set_int_pin_config(&config, BMA4_INTR1_MAP, &__devFptr) != BMA4_OK) { 74 | DEBUG("BMA423 SET INT FAIL\n"); 75 | return false; 76 | } 77 | return true; 78 | } 79 | 80 | void BMA423::softReset() 81 | { 82 | uint8_t reg = BMA4_RESET_ADDR; 83 | __writeRegisterFptr(BMA4_I2C_ADDR_PRIMARY, BMA4_RESET_SET_MASK, ®, 1); 84 | } 85 | 86 | void BMA423::shutDown() 87 | { 88 | bma4_set_advance_power_save(BMA4_DISABLE, &__devFptr); 89 | } 90 | 91 | void BMA423::wakeUp() 92 | { 93 | bma4_set_advance_power_save(BMA4_ENABLE, &__devFptr); 94 | } 95 | 96 | uint16_t BMA423::getErrorCode() 97 | { 98 | struct bma4_err_reg err; 99 | uint16_t rslt = bma4_get_error_status(&err, &__devFptr); 100 | return rslt; 101 | } 102 | 103 | uint16_t BMA423::getStatus() 104 | { 105 | uint8_t status; 106 | bma4_get_status(&status, &__devFptr); 107 | return status; 108 | } 109 | 110 | uint32_t BMA423::getSensorTime() 111 | { 112 | uint32_t ms; 113 | bma4_get_sensor_time(&ms, &__devFptr); 114 | return ms; 115 | } 116 | 117 | bool BMA423::selfTest() 118 | { 119 | return (BMA4_OK == bma4_selftest_config(BMA4_ACCEL_SELFTEST_ENABLE_MSK, &__devFptr)); 120 | } 121 | 122 | uint8_t BMA423::getDirection() 123 | { 124 | Accel acc; 125 | if (bma4_read_accel_xyz(&acc, &__devFptr) != BMA4_OK) { 126 | return 0; 127 | } 128 | uint16_t absX = abs(acc.x); 129 | uint16_t absY = abs(acc.y); 130 | uint16_t absZ = abs(acc.z); 131 | 132 | if ((absZ > absX) && (absZ > absY)) { 133 | if (acc.z > 0) { 134 | return DIRECTION_DISP_DOWN; 135 | } else { 136 | return DIRECTION_DISP_UP; 137 | } 138 | } else if ((absY > absX) && (absY > absZ)) { 139 | if (acc.y > 0) { 140 | return DIRECTION_RIGHT_EDGE; 141 | } else { 142 | return DIRECTION_LEFT_EDGE; 143 | } 144 | } else { 145 | if (acc.x < 0) { 146 | return DIRECTION_BOTTOM_EDGE; 147 | } else { 148 | return DIRECTION_TOP_EDGE; 149 | } 150 | } 151 | } 152 | 153 | float BMA423::readTemperature() 154 | { 155 | int32_t data = 0; 156 | bma4_get_temperature(&data, BMA4_DEG, &__devFptr); 157 | float res = (float)data / (float)BMA4_SCALE_TEMP; 158 | /* 0x80 - temp read from the register and 23 is the ambient temp added. 159 | * If the temp read from register is 0x80, it means no valid 160 | * information is available */ 161 | if (((data - 23) / BMA4_SCALE_TEMP) == 0x80) { 162 | res = 0; 163 | } 164 | return res; 165 | } 166 | 167 | 168 | float BMA423::readTemperatureF() 169 | { 170 | float temp = readTemperature(); 171 | if (temp != 0) { 172 | temp = temp * 1.8 + 32.0; 173 | } 174 | return (temp); 175 | } 176 | 177 | bool BMA423::getAccel(Accel &acc) 178 | { 179 | memset(&acc, 0, sizeof(acc)); 180 | if (bma4_read_accel_xyz(&acc, &__devFptr) != BMA4_OK) { 181 | return false; 182 | } 183 | return true; 184 | } 185 | 186 | bool BMA423::getAccelEnable() 187 | { 188 | uint8_t en; 189 | bma4_get_accel_enable(&en, &__devFptr); 190 | return (en & BMA4_ACCEL_ENABLE_POS) == BMA4_ACCEL_ENABLE_POS; 191 | } 192 | 193 | bool BMA423::disableAccel() 194 | { 195 | return enableAccel(false); 196 | } 197 | 198 | bool BMA423::enableAccel(bool en) 199 | { 200 | return (BMA4_OK == bma4_set_accel_enable(en ? BMA4_ENABLE : BMA4_DISABLE, &__devFptr)); 201 | } 202 | 203 | bool BMA423::setAccelConfig(Acfg &cfg) 204 | { 205 | return (BMA4_OK == bma4_set_accel_config(&cfg, &__devFptr)); 206 | } 207 | 208 | bool BMA423::getAccelConfig(Acfg &cfg) 209 | { 210 | return (BMA4_OK == bma4_get_accel_config(&cfg, &__devFptr)); 211 | } 212 | 213 | bool BMA423::setRemapAxes(struct bma423_axes_remap *remap_data) 214 | { 215 | return (BMA4_OK == bma423_set_remap_axes(remap_data, &__devFptr)); 216 | } 217 | 218 | bool BMA423::resetStepCounter() 219 | { 220 | return BMA4_OK == bma423_reset_step_counter(&__devFptr) ; 221 | } 222 | 223 | uint32_t BMA423::getCounter() 224 | { 225 | uint32_t stepCount; 226 | if (bma423_step_counter_output(&stepCount, &__devFptr) == BMA4_OK) { 227 | return stepCount; 228 | } 229 | return 0; 230 | } 231 | 232 | bool BMA423::setINTPinConfig(struct bma4_int_pin_config config, uint8_t pinMap) 233 | { 234 | return BMA4_OK == bma4_set_int_pin_config(&config, pinMap, &__devFptr); 235 | } 236 | 237 | bool BMA423::getINT() 238 | { 239 | return bma423_read_int_status(&__IRQ_MASK, &__devFptr) == BMA4_OK; 240 | } 241 | 242 | uint8_t BMA423::getIRQMASK() 243 | { 244 | return __IRQ_MASK; 245 | } 246 | 247 | bool BMA423::disableIRQ(uint16_t int_map) 248 | { 249 | return (BMA4_OK == bma423_map_interrupt(BMA4_INTR1_MAP, int_map, BMA4_DISABLE, &__devFptr)); 250 | } 251 | 252 | bool BMA423::enableIRQ(uint16_t int_map) 253 | { 254 | return (BMA4_OK == bma423_map_interrupt(BMA4_INTR1_MAP, int_map, BMA4_ENABLE, &__devFptr)); 255 | } 256 | 257 | bool BMA423::enableFeature(uint8_t feature, uint8_t enable) 258 | { 259 | if ((feature & BMA423_STEP_CNTR) == BMA423_STEP_CNTR) { 260 | bma423_step_detector_enable(enable ? BMA4_ENABLE : BMA4_DISABLE, &__devFptr); 261 | } 262 | return (BMA4_OK == bma423_feature_enable(feature, enable, &__devFptr)); 263 | } 264 | 265 | bool BMA423::isStepCounter() 266 | { 267 | return (bool)(BMA423_STEP_CNTR_INT & __IRQ_MASK); 268 | } 269 | 270 | bool BMA423::isDoubleClick() 271 | { 272 | return (bool)(BMA423_WAKEUP_INT & __IRQ_MASK); 273 | } 274 | 275 | bool BMA423::isTilt() 276 | { 277 | return (bool)(BMA423_TILT_INT & __IRQ_MASK); 278 | } 279 | 280 | bool BMA423::isActivity() 281 | { 282 | return (bool)(BMA423_ACTIVITY_INT & __IRQ_MASK); 283 | } 284 | 285 | bool BMA423::isAnyNoMotion() 286 | { 287 | return (bool)(BMA423_ANY_NO_MOTION_INT & __IRQ_MASK); 288 | } 289 | 290 | bool BMA423::enableStepCountInterrupt(bool en) 291 | { 292 | return (BMA4_OK == bma423_map_interrupt(BMA4_INTR1_MAP, BMA423_STEP_CNTR_INT, en, &__devFptr)); 293 | } 294 | 295 | bool BMA423::enableTiltInterrupt(bool en) 296 | { 297 | return (BMA4_OK == bma423_map_interrupt(BMA4_INTR1_MAP, BMA423_TILT_INT, en, &__devFptr)); 298 | } 299 | 300 | bool BMA423::enableWakeupInterrupt(bool en) 301 | { 302 | return (BMA4_OK == bma423_map_interrupt(BMA4_INTR1_MAP, BMA423_WAKEUP_INT, en, &__devFptr)); 303 | } 304 | 305 | bool BMA423::enableAnyNoMotionInterrupt(bool en) 306 | { 307 | return (BMA4_OK == bma423_map_interrupt(BMA4_INTR1_MAP, BMA423_ANY_NO_MOTION_INT, en, &__devFptr)); 308 | } 309 | 310 | bool BMA423::enableActivityInterrupt(bool en) 311 | { 312 | return (BMA4_OK == bma423_map_interrupt(BMA4_INTR1_MAP, BMA423_ACTIVITY_INT, en, &__devFptr)); 313 | } 314 | 315 | const char *BMA423::getActivity() 316 | { 317 | uint8_t activity; 318 | bma423_activity_output(&activity, &__devFptr); 319 | if (activity & BMA423_USER_STATIONARY) { 320 | return "BMA423_USER_STATIONARY"; 321 | } else if (activity & BMA423_USER_WALKING) { 322 | return "BMA423_USER_WALKING"; 323 | } else if (activity & BMA423_USER_RUNNING) { 324 | return "BMA423_USER_RUNNING"; 325 | } else if (activity & BMA423_STATE_INVALID) { 326 | return "BMA423_STATE_INVALID"; 327 | } 328 | return "None"; 329 | } -------------------------------------------------------------------------------- /src/icons.h: -------------------------------------------------------------------------------- 1 | #ifndef ICONS_H 2 | #define ICONS_H 3 | 4 | // 'battery', 37x21px 5 | const unsigned char battery [] PROGMEM = { 6 | 0x3f, 0xff, 0xff, 0xff, 0x80, 0x7f, 0xff, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xe0, 7 | 0x00, 0x00, 0x00, 0xe0, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0xe0, 0x00, 0x00, 0x00, 0xf8, 0xe0, 0x00, 8 | 0x00, 0x00, 0xf8, 0xe0, 0x00, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, 9 | 0x00, 0x38, 0xe0, 0x00, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, 0x00, 10 | 0x38, 0xe0, 0x00, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, 0x00, 0xf8, 0xe0, 0x00, 0x00, 0x00, 0xf8, 11 | 0xe0, 0x00, 0x00, 0x00, 0xe0, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x7f, 12 | 0xff, 0xff, 0xff, 0xc0, 0x3f, 0xff, 0xff, 0xff, 0x80 13 | }; 14 | // 'bluetooth', 13x21px 15 | const unsigned char bluetooth [] PROGMEM = { 16 | 0x1f, 0xc0, 0x3f, 0xe0, 0x7f, 0xf0, 0xfd, 0xf8, 0xfc, 0xf8, 0xfc, 0x78, 0xdd, 0x38, 0xcd, 0x98, 17 | 0xe5, 0x38, 0xf0, 0x78, 0xf8, 0xf8, 0xf8, 0xf8, 0xf0, 0x78, 0xe5, 0x38, 0xcd, 0x98, 0xfd, 0x38, 18 | 0xfc, 0x78, 0xfc, 0xf8, 0x7d, 0xf0, 0x3f, 0xe0, 0x1f, 0xc0 19 | }; 20 | // 'celsius', 26x20px 21 | const unsigned char celsius [] PROGMEM = { 22 | 0x3f, 0x80, 0x1f, 0xc0, 0x7f, 0xc0, 0x3f, 0xc0, 0xc0, 0x60, 0x60, 0x00, 0xc0, 0x60, 0x60, 0x00, 23 | 0xc0, 0x60, 0x60, 0x00, 0xc0, 0x60, 0x60, 0x00, 0xc0, 0x60, 0x60, 0x00, 0xc0, 0x60, 0x60, 0x00, 24 | 0xc0, 0x60, 0x60, 0x00, 0xff, 0xc0, 0x40, 0x00, 0x7f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 25 | 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 26 | 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x7f, 0xc0, 0x00, 0x00, 0x3f, 0xc0 27 | }; 28 | // 'fahrenheit', 26x20px 29 | const unsigned char fahrenheit [] PROGMEM = { 30 | 0x3f, 0x80, 0x1f, 0xc0, 0x7f, 0xc0, 0x3f, 0xc0, 0xc0, 0x60, 0x60, 0x00, 0xc0, 0x60, 0x60, 0x00, 31 | 0xc0, 0x60, 0x60, 0x00, 0xc0, 0x60, 0x60, 0x00, 0xc0, 0x60, 0x60, 0x00, 0xc0, 0x60, 0x60, 0x00, 32 | 0xc0, 0x60, 0x60, 0x00, 0xff, 0xc0, 0x7f, 0xc0, 0x7f, 0x80, 0x3f, 0xc0, 0x00, 0x00, 0x60, 0x00, 33 | 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 34 | 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00 35 | }; 36 | // 'cloudsun', 48x32px 37 | const unsigned char cloudsun [] PROGMEM = { 38 | 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 39 | 0x84, 0x40, 0x00, 0x00, 0x00, 0x10, 0x44, 0x42, 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 40 | 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x02, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 41 | 0x00, 0x00, 0x00, 0x31, 0x80, 0x61, 0x00, 0x07, 0xe0, 0x19, 0x00, 0x32, 0x00, 0x38, 0x38, 0x02, 42 | 0x00, 0x10, 0x00, 0x60, 0x04, 0x02, 0x00, 0x10, 0x00, 0x80, 0x03, 0xf2, 0x00, 0x10, 0x01, 0x00, 43 | 0x01, 0x9e, 0x00, 0x10, 0x03, 0x00, 0x00, 0x03, 0x00, 0x10, 0x02, 0x00, 0x00, 0x01, 0x80, 0x10, 44 | 0x02, 0x00, 0x00, 0x00, 0x80, 0x32, 0x04, 0x00, 0x00, 0x00, 0x40, 0x61, 0x04, 0x00, 0x00, 0x00, 45 | 0x70, 0xc0, 0x0c, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x30, 0x00, 0x00, 0x00, 0x02, 0x08, 0x60, 0x00, 46 | 0x00, 0x00, 0x01, 0x04, 0x40, 0x00, 0x00, 0x00, 0x01, 0xc2, 0x40, 0x00, 0x00, 0x00, 0x00, 0xc0, 47 | 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 48 | 0x00, 0x80, 0x40, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 49 | 0x00, 0x00, 0x03, 0x00, 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xfc, 0x00 50 | }; 51 | // 'cloudy', 48x32px 52 | const unsigned char cloudy [] PROGMEM = { 53 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 54 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 55 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x18, 0x03, 0x00, 0x00, 0x00, 56 | 0x00, 0x60, 0x00, 0x80, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x40, 0x00, 0x00, 0x01, 0x80, 0x00, 0x3f, 57 | 0xc0, 0x00, 0x01, 0x00, 0x00, 0x00, 0x30, 0x00, 0x02, 0x00, 0x00, 0x00, 0x18, 0x00, 0x02, 0x00, 58 | 0x00, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 59 | 0x04, 0x00, 0x00, 0x00, 0x03, 0x80, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 0x00, 60 | 0x00, 0x10, 0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x00, 0x00, 0x00, 0x04, 0x80, 0x00, 61 | 0x00, 0x00, 0x00, 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x02, 62 | 0x80, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0x00, 63 | 0x00, 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x20, 0x00, 64 | 0x00, 0x00, 0x00, 0x08, 0x18, 0x00, 0x00, 0x00, 0x00, 0x30, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xe0 65 | }; 66 | // 'rain', 48x32px 67 | const unsigned char rain [] PROGMEM = { 68 | 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x03, 0x81, 0x80, 0x00, 0x00, 0x00, 0x06, 0x00, 0x60, 69 | 0x00, 0x00, 0x00, 0x08, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x30, 70 | 0x00, 0x00, 0x30, 0x00, 0x00, 0x20, 0x00, 0x00, 0x18, 0x00, 0x00, 0x20, 0x00, 0x00, 0x08, 0x00, 71 | 0x00, 0x20, 0x00, 0x00, 0x04, 0x00, 0x00, 0x40, 0x00, 0x00, 0x07, 0x80, 0x00, 0xc0, 0x00, 0x00, 72 | 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x20, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 73 | 0x00, 0x00, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 74 | 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 75 | 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x30, 0x01, 0x80, 76 | 0x00, 0x00, 0x00, 0x60, 0x00, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 77 | 0x00, 0x21, 0x08, 0x42, 0x10, 0x00, 0x00, 0x42, 0x10, 0x84, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 78 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x84, 0x21, 0x00, 0x00, 0x04, 0x21, 79 | 0x08, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x84, 0x21, 0x08, 0x00, 0x00 80 | }; 81 | // 'snow', 48x32px 82 | const unsigned char snow [] PROGMEM = { 83 | 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x20, 84 | 0x00, 0x00, 0x00, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 85 | 0x01, 0x00, 0x00, 0x00, 0x00, 0x04, 0x81, 0x02, 0x40, 0x00, 0x00, 0x02, 0x81, 0x02, 0x80, 0x00, 86 | 0x00, 0x01, 0x81, 0x03, 0x00, 0x00, 0x00, 0x07, 0x81, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x41, 0x04, 87 | 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0x00, 0x00, 0x00, 0x00, 0x11, 0x10, 0x00, 0x00, 0x00, 0x80, 88 | 0x09, 0x20, 0x04, 0x00, 0x00, 0x40, 0x05, 0x40, 0x08, 0x00, 0x00, 0x20, 0x03, 0x80, 0x10, 0x00, 89 | 0x03, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x20, 0x03, 0x80, 0x10, 0x00, 0x00, 0x40, 0x05, 0x40, 90 | 0x08, 0x00, 0x00, 0x80, 0x09, 0x20, 0x04, 0x00, 0x00, 0x00, 0x11, 0x10, 0x00, 0x00, 0x00, 0x00, 91 | 0x21, 0x08, 0x00, 0x00, 0x00, 0x00, 0x41, 0x04, 0x00, 0x00, 0x00, 0x03, 0x81, 0x03, 0x80, 0x00, 92 | 0x00, 0x01, 0x81, 0x03, 0x00, 0x00, 0x00, 0x02, 0x81, 0x02, 0x80, 0x00, 0x00, 0x04, 0x01, 0x00, 93 | 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 94 | 0x05, 0x40, 0x00, 0x00, 0x00, 0x00, 0x09, 0x20, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 95 | }; 96 | // 'sunny', 48x32px 97 | const unsigned char sunny [] PROGMEM = { 98 | 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 99 | 0x00, 0x00, 0x00, 0x00, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0x00, 0x00, 0x00, 0x18, 100 | 0x20, 0x10, 0x60, 0x00, 0x00, 0x0c, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x06, 0x00, 0x01, 0x80, 0x00, 101 | 0x00, 0x02, 0x0f, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x0c, 102 | 0x00, 0x00, 0x00, 0x30, 0x80, 0x04, 0x30, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 103 | 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 104 | 0x03, 0xf2, 0x00, 0x01, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 105 | 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x30, 106 | 0x80, 0x04, 0x30, 0x00, 0x00, 0x00, 0xc0, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 107 | 0x00, 0x02, 0x0f, 0xc1, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x80, 0x00, 0x00, 0x0c, 0x00, 0x00, 108 | 0xc0, 0x00, 0x00, 0x18, 0x20, 0x10, 0x60, 0x00, 0x00, 0x00, 0x21, 0x08, 0x00, 0x00, 0x00, 0x00, 109 | 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 110 | }; 111 | // 'steps', 19x23px 112 | const unsigned char steps [] PROGMEM = { 113 | 0x00, 0x03, 0xc0, 0x00, 0x07, 0xe0, 0x00, 0x07, 0xe0, 0x00, 0x0f, 0xe0, 0x78, 0x0f, 0xe0, 0xfc, 114 | 0x0f, 0xe0, 0xfc, 0x0f, 0xe0, 0xfc, 0x0f, 0xe0, 0xfe, 0x0f, 0xe0, 0xfe, 0x07, 0xc0, 0xfe, 0x07, 115 | 0xc0, 0xfe, 0x07, 0x80, 0xfe, 0x00, 0x00, 0x7c, 0x0e, 0x00, 0x7c, 0x0f, 0x80, 0x7c, 0x1f, 0x80, 116 | 0x20, 0x1f, 0x00, 0x06, 0x0f, 0x00, 0x3e, 0x0e, 0x00, 0x3e, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x1e, 117 | 0x00, 0x00, 0x1e, 0x00, 0x00 118 | }; 119 | // 'wifi', 26x18px 120 | const unsigned char wifi [] PROGMEM = { 121 | 0x00, 0x7f, 0x80, 0x00, 0x03, 0xff, 0xf0, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x1f, 0xc0, 0xfe, 0x00, 122 | 0x7e, 0x00, 0x1f, 0x80, 0xf8, 0x3f, 0x07, 0xc0, 0x71, 0xff, 0xe3, 0x80, 0x23, 0xff, 0xf1, 0x00, 123 | 0x07, 0xc0, 0xf8, 0x00, 0x0f, 0x00, 0x3c, 0x00, 0x06, 0x3f, 0x18, 0x00, 0x02, 0x7f, 0x90, 0x00, 124 | 0x00, 0xff, 0xc0, 0x00, 0x00, 0xe1, 0xc0, 0x00, 0x00, 0x40, 0x80, 0x00, 0x00, 0x0c, 0x00, 0x00, 125 | 0x00, 0x1e, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00 126 | }; 127 | // 'wifioff', 26x18px 128 | const unsigned char wifioff [] PROGMEM = { 129 | 0x00, 0x7f, 0x87, 0xc0, 0x03, 0xff, 0xff, 0x80, 0x0f, 0xff, 0xff, 0x00, 0x1f, 0xc0, 0xfe, 0x00, 130 | 0x7e, 0x00, 0x7f, 0x80, 0xf8, 0x3f, 0xf7, 0xc0, 0x71, 0xff, 0xe3, 0x80, 0x23, 0xff, 0xf1, 0x00, 131 | 0x07, 0xcf, 0xf8, 0x00, 0x0f, 0x3e, 0x3c, 0x00, 0x06, 0x7f, 0x18, 0x00, 0x02, 0xff, 0x90, 0x00, 132 | 0x01, 0xff, 0xc0, 0x00, 0x07, 0xe1, 0xc0, 0x00, 0x0f, 0xc0, 0x80, 0x00, 0x1f, 0x0c, 0x00, 0x00, 133 | 0x3c, 0x1e, 0x00, 0x00, 0xf8, 0x0c, 0x00, 0x00 134 | }; 135 | 136 | 137 | #endif 138 | -------------------------------------------------------------------------------- /src/Fonts/Bitwise_m19x8pt7b.h: -------------------------------------------------------------------------------- 1 | const uint8_t Bitwise_m19x8pt7bBitmaps[] PROGMEM = { 2 | 0x00, 0xAA, 0xBF, 0xCF, 0xFD, 0x55, 0x04, 0x83, 0x20, 0x90, 0x24, 0x7F, 3 | 0xC4, 0x81, 0x23, 0xFE, 0x24, 0x09, 0x06, 0xC1, 0x20, 0x08, 0x7F, 0xE2, 4 | 0x31, 0x18, 0x84, 0x42, 0x21, 0xFF, 0x09, 0x84, 0xE2, 0x71, 0x3F, 0xF8, 5 | 0x40, 0x0A, 0x56, 0x23, 0x10, 0x8E, 0x67, 0x37, 0x90, 0x3F, 0x10, 0x88, 6 | 0x44, 0x22, 0x13, 0xFB, 0x01, 0x83, 0xC1, 0xE0, 0xF0, 0x7F, 0xF0, 0xF5, 7 | 0x5A, 0xAA, 0xA5, 0xA5, 0x55, 0x5A, 0x21, 0x3E, 0x45, 0x08, 0x08, 0x04, 8 | 0x02, 0x01, 0x00, 0x87, 0xFC, 0x20, 0x10, 0x08, 0x04, 0x00, 0xD0, 0xF8, 9 | 0xA0, 0x04, 0x30, 0x82, 0x10, 0x43, 0x08, 0x71, 0x8E, 0x38, 0xC0, 0xFF, 10 | 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x07, 0x03, 0x81, 0xC0, 0xE0, 0x7F, 11 | 0xF0, 0xC9, 0x24, 0x92, 0x4B, 0xF0, 0xFF, 0x80, 0x40, 0x20, 0x10, 0x0F, 12 | 0xFE, 0x01, 0x00, 0x80, 0x40, 0x20, 0x1F, 0xF0, 0xFF, 0x00, 0x80, 0x40, 13 | 0x20, 0x17, 0xFC, 0x06, 0x03, 0x01, 0x80, 0xC0, 0x7F, 0xF0, 0xC0, 0x60, 14 | 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xC1, 0xFF, 0xC0, 0x60, 0x30, 15 | 0xFF, 0xC0, 0x20, 0x10, 0x08, 0x07, 0xFC, 0x02, 0x01, 0x00, 0x80, 0x40, 16 | 0x3F, 0xF0, 0xFF, 0x40, 0xA0, 0x50, 0x08, 0x04, 0x03, 0xFF, 0x01, 0x80, 17 | 0xC0, 0x60, 0x3F, 0xF0, 0xFF, 0xC0, 0xE0, 0x40, 0x60, 0x60, 0x60, 0x70, 18 | 0x70, 0x30, 0x38, 0x18, 0x1C, 0x00, 0x3F, 0x10, 0x88, 0x44, 0x22, 0x13, 19 | 0xFB, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x7F, 0xF0, 0xFF, 0xC0, 0x60, 0x30, 20 | 0x18, 0x0F, 0xFC, 0x06, 0x03, 0x01, 0x80, 0xC0, 0x60, 0x30, 0xF0, 0x53, 21 | 0x40, 0x01, 0x83, 0x8E, 0x1C, 0x0E, 0x01, 0xC0, 0x38, 0x03, 0x00, 0x00, 22 | 0xFF, 0x80, 0x00, 0x1F, 0xF0, 0xC0, 0x38, 0x03, 0x80, 0x70, 0x38, 0x70, 23 | 0xE1, 0x80, 0x00, 0x00, 0xFF, 0xC1, 0xC1, 0x03, 0x3E, 0x30, 0x20, 0x30, 24 | 0x38, 0x38, 0x30, 0x30, 0x07, 0xC0, 0x60, 0xC2, 0x00, 0x90, 0x03, 0x47, 25 | 0x46, 0x33, 0x18, 0x8C, 0x62, 0x31, 0x98, 0x8A, 0x26, 0x64, 0xEE, 0x18, 26 | 0x00, 0x30, 0x30, 0x3F, 0x00, 0x7F, 0x90, 0x24, 0x09, 0x02, 0x40, 0x90, 27 | 0x2F, 0xFF, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xFF, 0x40, 0xA0, 0x50, 28 | 0x28, 0x14, 0x0B, 0xFF, 0x81, 0xC0, 0xE0, 0x70, 0x3F, 0xF0, 0xFF, 0xC0, 29 | 0xE0, 0x70, 0x08, 0x04, 0x03, 0x01, 0x80, 0xC0, 0xE0, 0x70, 0x3F, 0xF0, 30 | 0xFF, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x07, 0x03, 0x81, 0xC0, 0xE0, 0x70, 31 | 0x3F, 0xF0, 0xFF, 0x02, 0x04, 0x08, 0x10, 0x3F, 0xE0, 0xC1, 0x83, 0x07, 32 | 0xF0, 0xFF, 0x02, 0x04, 0x08, 0x10, 0x3F, 0xE0, 0xC1, 0x83, 0x06, 0x00, 33 | 0xFF, 0xC0, 0x60, 0x30, 0x08, 0x04, 0x03, 0x01, 0x8F, 0xC0, 0xE0, 0x70, 34 | 0x3F, 0xF0, 0x40, 0x90, 0x24, 0x09, 0x02, 0x40, 0x90, 0x2F, 0xFF, 0x03, 35 | 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xAA, 0xAF, 0xFF, 0x01, 0x01, 0x01, 0x01, 36 | 0x01, 0x01, 0x03, 0x03, 0x83, 0x83, 0x83, 0xFF, 0x40, 0xA0, 0x50, 0x28, 37 | 0x14, 0x0A, 0x07, 0xFF, 0x81, 0xC0, 0xE0, 0x70, 0x38, 0x10, 0x40, 0x40, 38 | 0x40, 0x40, 0x40, 0x40, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xFF, 0xFF, 0xF0, 39 | 0x86, 0x10, 0xC2, 0x18, 0x43, 0x08, 0x71, 0x0E, 0x21, 0xC4, 0x38, 0x87, 40 | 0x10, 0xE2, 0x10, 0xC0, 0xE0, 0x78, 0x36, 0x1B, 0x0C, 0xC7, 0x33, 0x99, 41 | 0xC6, 0xE1, 0xF0, 0xF8, 0x30, 0xFF, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 42 | 0x07, 0x03, 0x81, 0xC0, 0xE0, 0x7F, 0xF0, 0xFF, 0xC0, 0x60, 0x30, 0x18, 43 | 0x0C, 0x07, 0xFF, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x00, 0xFF, 0xC0, 0x60, 44 | 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xC0, 0x61, 0xFF, 0xF0, 0x70, 45 | 0xFF, 0x40, 0xA0, 0x50, 0x28, 0x14, 0x0B, 0xFF, 0x81, 0xC0, 0xE0, 0x70, 46 | 0x38, 0x10, 0xFF, 0xC0, 0x60, 0x30, 0x08, 0x04, 0x03, 0xFE, 0x03, 0x01, 47 | 0xC0, 0xE0, 0x7F, 0xF0, 0xFF, 0xC3, 0xF0, 0x80, 0x20, 0x08, 0x02, 0x00, 48 | 0x80, 0x20, 0x08, 0x02, 0x00, 0x80, 0x20, 0x80, 0xC0, 0x60, 0x30, 0x18, 49 | 0x0C, 0x07, 0x03, 0x81, 0xC0, 0xE0, 0x70, 0x3F, 0xF0, 0x80, 0xE0, 0x50, 50 | 0x68, 0x26, 0x11, 0x18, 0x88, 0x64, 0x16, 0x0A, 0x07, 0x01, 0x80, 0x84, 51 | 0x30, 0x86, 0x10, 0xC2, 0x18, 0x43, 0x08, 0x61, 0x0E, 0x21, 0xC4, 0x38, 52 | 0x87, 0x10, 0xFF, 0xF0, 0x81, 0xC0, 0xE0, 0x6C, 0x63, 0x60, 0xE0, 0x70, 53 | 0x6C, 0x63, 0x60, 0xF0, 0x38, 0x10, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0C, 54 | 0x07, 0xFE, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xFF, 0xC0, 0xE0, 0xC0, 55 | 0x40, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0x70, 0x70, 0x3F, 0xF0, 0xEA, 0xAA, 56 | 0xAB, 0xC0, 0x81, 0x81, 0x03, 0x02, 0x04, 0x0C, 0x18, 0x38, 0x30, 0x70, 57 | 0x60, 0xD5, 0x55, 0x57, 0x0C, 0x0E, 0x0C, 0x8C, 0x24, 0x08, 0xFF, 0x44, 58 | 0xFE, 0x02, 0x02, 0xFE, 0xC2, 0xC2, 0xC2, 0xFF, 0x81, 0x02, 0x04, 0x0F, 59 | 0xF8, 0x70, 0xE1, 0xC3, 0x87, 0x0F, 0xF0, 0xFF, 0x1E, 0x04, 0x08, 0x10, 60 | 0x21, 0xFF, 0x02, 0x04, 0x08, 0x1F, 0xF8, 0x70, 0xE1, 0xC3, 0x87, 0x0F, 61 | 0xF0, 0xFF, 0x87, 0x0F, 0xFC, 0x18, 0x30, 0xFF, 0x7E, 0xCD, 0x83, 0x0F, 62 | 0x8C, 0x10, 0x20, 0x40, 0x81, 0x02, 0x00, 0xFF, 0x0A, 0x14, 0x28, 0x5F, 63 | 0x90, 0x7E, 0xC5, 0x8B, 0x17, 0xE0, 0x81, 0x02, 0x04, 0x0F, 0xF8, 0x70, 64 | 0xE1, 0xC3, 0x87, 0x0E, 0x10, 0xC1, 0x24, 0x9B, 0x6C, 0x0C, 0x00, 0x41, 65 | 0x04, 0x10, 0xC3, 0x0C, 0x30, 0xC3, 0xCF, 0xF0, 0x81, 0x02, 0x04, 0x08, 66 | 0x38, 0x70, 0xFF, 0xC3, 0x87, 0x0E, 0x10, 0xAA, 0xAA, 0xFF, 0xFF, 0xC4, 67 | 0x62, 0x31, 0x1C, 0x8E, 0x47, 0x23, 0x91, 0xFF, 0x06, 0x0C, 0x1C, 0x38, 68 | 0x70, 0xE1, 0xFF, 0x06, 0x0C, 0x38, 0x70, 0xE1, 0xFF, 0xFF, 0x06, 0x0C, 69 | 0x18, 0x30, 0x60, 0xFF, 0xC1, 0x83, 0x06, 0x00, 0xFF, 0x06, 0x0C, 0x18, 70 | 0x30, 0x60, 0xFF, 0x06, 0x0C, 0x18, 0x30, 0xFE, 0x38, 0x20, 0xC3, 0x0C, 71 | 0x30, 0xFF, 0x06, 0x07, 0xF0, 0x60, 0xE1, 0xFF, 0x42, 0x11, 0xF7, 0xA1, 72 | 0x08, 0x42, 0x1C, 0x83, 0x06, 0x0C, 0x1C, 0x38, 0x70, 0xFF, 0xC2, 0x42, 73 | 0x46, 0x64, 0x24, 0x3C, 0x18, 0x18, 0x88, 0xC4, 0x62, 0x31, 0x1C, 0x8E, 74 | 0x47, 0x23, 0xFF, 0x87, 0x8D, 0xB1, 0xC3, 0x8D, 0xB1, 0xE1, 0x83, 0x06, 75 | 0x0C, 0x18, 0x30, 0x60, 0xFF, 0x06, 0x0C, 0x18, 0x30, 0xFF, 0x0C, 0x31, 76 | 0xC7, 0x1C, 0x30, 0xFF, 0x19, 0x08, 0x42, 0x10, 0x8C, 0xC1, 0x08, 0x42, 77 | 0x10, 0x83, 0xFF, 0xFF, 0x80, 0xC0, 0x82, 0x08, 0x20, 0x82, 0x0C, 0x1C, 78 | 0x82, 0x08, 0x20, 0x82, 0x30, 0x78, 0x70, 0xF8 }; 79 | 80 | const GFXglyph Bitwise_m19x8pt7bGlyphs[] PROGMEM = { 81 | { 0, 1, 1, 7, 0, 0 }, // 0x20 ' ' 82 | { 1, 2, 12, 3, 1, -11 }, // 0x21 '!' 83 | { 4, 4, 4, 5, 0, -11 }, // 0x22 '"' 84 | { 6, 10, 12, 12, 1, -11 }, // 0x23 '#' 85 | { 21, 9, 14, 11, 1, -12 }, // 0x24 '$' 86 | { 37, 5, 12, 7, 1, -11 }, // 0x25 '%' 87 | { 45, 9, 12, 11, 1, -11 }, // 0x26 '&' 88 | { 59, 2, 4, 3, 0, -11 }, // 0x27 ''' 89 | { 60, 2, 12, 4, 1, -11 }, // 0x28 '(' 90 | { 63, 2, 12, 4, 1, -11 }, // 0x29 ')' 91 | { 66, 5, 6, 7, 1, -11 }, // 0x2A '*' 92 | { 70, 9, 10, 13, 2, -9 }, // 0x2B '+' 93 | { 82, 2, 2, 5, 2, 0 }, // 0x2C ',' 94 | { 83, 5, 1, 7, 1, -4 }, // 0x2D '-' 95 | { 84, 2, 2, 5, 2, -1 }, // 0x2E '.' 96 | { 85, 6, 13, 6, 0, -11 }, // 0x2F '/' 97 | { 95, 9, 12, 11, 1, -11 }, // 0x30 '0' 98 | { 109, 3, 12, 11, 4, -11 }, // 0x31 '1' 99 | { 114, 9, 12, 11, 1, -11 }, // 0x32 '2' 100 | { 128, 9, 12, 11, 1, -11 }, // 0x33 '3' 101 | { 142, 9, 12, 11, 1, -11 }, // 0x34 '4' 102 | { 156, 9, 12, 11, 1, -11 }, // 0x35 '5' 103 | { 170, 9, 12, 11, 1, -11 }, // 0x36 '6' 104 | { 184, 9, 12, 11, 1, -11 }, // 0x37 '7' 105 | { 198, 9, 12, 11, 1, -11 }, // 0x38 '8' 106 | { 212, 9, 12, 11, 1, -11 }, // 0x39 '9' 107 | { 226, 1, 4, 3, 1, -3 }, // 0x3A ':' 108 | { 227, 2, 5, 3, 0, -3 }, // 0x3B ';' 109 | { 229, 9, 9, 13, 2, -8 }, // 0x3C '<' 110 | { 240, 9, 4, 13, 2, -6 }, // 0x3D '=' 111 | { 245, 9, 9, 13, 2, -8 }, // 0x3E '>' 112 | { 256, 8, 12, 10, 1, -11 }, // 0x3F '?' 113 | { 268, 14, 14, 16, 1, -11 }, // 0x40 '@' 114 | { 293, 10, 12, 12, 1, -11 }, // 0x41 'A' 115 | { 308, 9, 12, 11, 1, -11 }, // 0x42 'B' 116 | { 322, 9, 12, 11, 1, -11 }, // 0x43 'C' 117 | { 336, 9, 12, 11, 1, -11 }, // 0x44 'D' 118 | { 350, 7, 12, 8, 1, -11 }, // 0x45 'E' 119 | { 361, 7, 12, 8, 1, -11 }, // 0x46 'F' 120 | { 372, 9, 12, 11, 1, -11 }, // 0x47 'G' 121 | { 386, 10, 12, 12, 1, -11 }, // 0x48 'H' 122 | { 401, 2, 12, 3, 1, -11 }, // 0x49 'I' 123 | { 404, 8, 12, 10, 1, -11 }, // 0x4A 'J' 124 | { 416, 9, 12, 11, 1, -11 }, // 0x4B 'K' 125 | { 430, 8, 12, 8, 0, -11 }, // 0x4C 'L' 126 | { 442, 11, 12, 13, 1, -11 }, // 0x4D 'M' 127 | { 459, 9, 12, 11, 1, -11 }, // 0x4E 'N' 128 | { 473, 9, 12, 11, 1, -11 }, // 0x4F 'O' 129 | { 487, 9, 12, 11, 1, -11 }, // 0x50 'P' 130 | { 501, 9, 13, 11, 1, -11 }, // 0x51 'Q' 131 | { 516, 9, 12, 11, 1, -11 }, // 0x52 'R' 132 | { 530, 9, 12, 11, 1, -11 }, // 0x53 'S' 133 | { 544, 10, 12, 10, 0, -11 }, // 0x54 'T' 134 | { 559, 9, 12, 11, 1, -11 }, // 0x55 'U' 135 | { 573, 9, 12, 10, 0, -11 }, // 0x56 'V' 136 | { 587, 11, 12, 13, 1, -11 }, // 0x57 'W' 137 | { 604, 9, 12, 11, 1, -11 }, // 0x58 'X' 138 | { 618, 9, 12, 11, 1, -11 }, // 0x59 'Y' 139 | { 632, 9, 12, 11, 1, -11 }, // 0x5A 'Z' 140 | { 646, 2, 12, 4, 1, -11 }, // 0x5B '[' 141 | { 649, 7, 13, 6, 0, -11 }, // 0x5C '\' 142 | { 661, 2, 12, 4, 1, -11 }, // 0x5D ']' 143 | { 664, 9, 5, 16, 3, -11 }, // 0x5E '^' 144 | { 670, 8, 1, 9, 0, 4 }, // 0x5F '_' 145 | { 671, 3, 2, 8, 2, -10 }, // 0x60 '`' 146 | { 672, 8, 8, 9, 1, -7 }, // 0x61 'a' 147 | { 680, 7, 12, 9, 1, -11 }, // 0x62 'b' 148 | { 691, 7, 8, 9, 1, -7 }, // 0x63 'c' 149 | { 698, 7, 12, 9, 1, -11 }, // 0x64 'd' 150 | { 709, 7, 8, 9, 1, -7 }, // 0x65 'e' 151 | { 716, 7, 12, 5, 0, -11 }, // 0x66 'f' 152 | { 727, 7, 12, 8, 1, -7 }, // 0x67 'g' 153 | { 738, 7, 12, 9, 1, -11 }, // 0x68 'h' 154 | { 749, 3, 10, 3, 0, -9 }, // 0x69 'i' 155 | { 753, 6, 14, 4, -3, -9 }, // 0x6A 'j' 156 | { 764, 7, 12, 9, 1, -11 }, // 0x6B 'k' 157 | { 775, 2, 12, 3, 1, -11 }, // 0x6C 'l' 158 | { 778, 9, 8, 11, 1, -7 }, // 0x6D 'm' 159 | { 787, 7, 8, 9, 1, -7 }, // 0x6E 'n' 160 | { 794, 7, 8, 9, 1, -7 }, // 0x6F 'o' 161 | { 801, 7, 12, 9, 1, -7 }, // 0x70 'p' 162 | { 812, 7, 12, 9, 1, -7 }, // 0x71 'q' 163 | { 823, 6, 8, 7, 1, -7 }, // 0x72 'r' 164 | { 829, 7, 8, 9, 1, -7 }, // 0x73 's' 165 | { 836, 5, 11, 5, 0, -10 }, // 0x74 't' 166 | { 843, 7, 8, 9, 1, -7 }, // 0x75 'u' 167 | { 850, 8, 8, 8, 0, -7 }, // 0x76 'v' 168 | { 858, 9, 8, 11, 1, -7 }, // 0x77 'w' 169 | { 867, 7, 8, 9, 1, -7 }, // 0x78 'x' 170 | { 874, 7, 12, 9, 1, -7 }, // 0x79 'y' 171 | { 885, 7, 8, 9, 1, -7 }, // 0x7A 'z' 172 | { 892, 5, 16, 7, 1, -11 }, // 0x7B '{' 173 | { 902, 1, 17, 7, 3, -12 }, // 0x7C '|' 174 | { 905, 6, 16, 8, 1, -11 }, // 0x7D '}' 175 | { 917, 11, 2, 13, 1, -5 } }; // 0x7E '~' 176 | 177 | const GFXfont Bitwise_m19x8pt7b PROGMEM = { 178 | (uint8_t *)Bitwise_m19x8pt7bBitmaps, 179 | (GFXglyph *)Bitwise_m19x8pt7bGlyphs, 180 | 0x20, 0x7E, 16 }; 181 | 182 | // Approx. 1592 bytes 183 | -------------------------------------------------------------------------------- /src/Fonts/Okuda_A5PL14pt7b.h: -------------------------------------------------------------------------------- 1 | const uint8_t Okuda_A5PL14pt7bBitmaps[] PROGMEM = { 2 | 0x00, 0xFF, 0xFF, 0xFF, 0xF0, 0x3C, 0xDE, 0xE4, 0x33, 0x0C, 0xCF, 0xFF, 3 | 0xFF, 0x33, 0x0C, 0xCF, 0xFF, 0xFF, 0x33, 0x0C, 0xC0, 0x31, 0xEF, 0xF3, 4 | 0xCF, 0x0C, 0x38, 0x70, 0xE1, 0x87, 0x0C, 0x3C, 0xF3, 0xFD, 0xE3, 0x00, 5 | 0x78, 0xFF, 0x9B, 0x37, 0x66, 0xCC, 0xF9, 0x9F, 0x33, 0xC7, 0xF8, 0x7E, 6 | 0x01, 0xC0, 0x3F, 0x0F, 0xF1, 0xE6, 0x7C, 0xCF, 0x99, 0xB3, 0x76, 0x6C, 7 | 0xFF, 0x8F, 0x00, 0x61, 0xC3, 0x06, 0x0C, 0x19, 0xB3, 0x66, 0x7E, 0xFF, 8 | 0x36, 0x6C, 0xD9, 0xB3, 0x66, 0xCD, 0xF9, 0xE0, 0xF8, 0x31, 0x9C, 0xC6, 9 | 0x33, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0xC3, 0x18, 0xC7, 0x18, 0xC0, 10 | 0x63, 0x18, 0x63, 0x18, 0x63, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x19, 0x8C, 11 | 0x66, 0x31, 0x80, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0xA0, 0x00, 0x0D, 12 | 0x00, 0x01, 0x50, 0x00, 0x14, 0x80, 0x01, 0x48, 0x00, 0xE4, 0xF0, 0x12, 13 | 0x44, 0x86, 0x2F, 0x44, 0x44, 0x64, 0x28, 0x46, 0x41, 0x84, 0x02, 0x18, 14 | 0x80, 0x21, 0x88, 0x3A, 0x14, 0x8C, 0x62, 0x29, 0x02, 0x61, 0x20, 0x38, 15 | 0x14, 0x03, 0x01, 0xBF, 0xD0, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 16 | 0x00, 0x30, 0xCF, 0xFF, 0x30, 0xC0, 0xF8, 0xFF, 0xF0, 0xF0, 0x0C, 0x61, 17 | 0x86, 0x18, 0x63, 0x0C, 0x30, 0xC6, 0x18, 0x61, 0x86, 0x30, 0xC3, 0x0C, 18 | 0x00, 0x7B, 0xFC, 0xF3, 0xCF, 0x3C, 0xF3, 0xCF, 0x3C, 0xF3, 0xCF, 0x3C, 19 | 0xF3, 0xCF, 0xF7, 0x80, 0x6F, 0xF6, 0xDB, 0x6D, 0xB6, 0xDB, 0x6D, 0x80, 20 | 0x7B, 0xFC, 0xF3, 0xCC, 0x30, 0xC3, 0x1C, 0x63, 0x9C, 0x63, 0x0C, 0x30, 21 | 0xC3, 0xFF, 0xC0, 0x7B, 0xFC, 0xF3, 0xCC, 0x30, 0xC3, 0x38, 0xE0, 0xC3, 22 | 0x0C, 0x3C, 0xF3, 0xCF, 0xF7, 0x80, 0x06, 0x0E, 0x0E, 0x0E, 0x1E, 0x1E, 23 | 0x3E, 0x36, 0x36, 0x66, 0x66, 0xE6, 0xC6, 0xFF, 0xFF, 0x06, 0x06, 0x06, 24 | 0x06, 0xFF, 0xFC, 0x30, 0xC3, 0x0C, 0x3E, 0xFF, 0x30, 0xC3, 0x0C, 0x3C, 25 | 0xF3, 0xCF, 0xF7, 0x80, 0x7B, 0xFC, 0xF3, 0xCF, 0x0C, 0x3E, 0xFF, 0x3C, 26 | 0xF3, 0xCF, 0x3C, 0xF3, 0xCF, 0xF7, 0x80, 0xFF, 0xFC, 0x18, 0x30, 0xE1, 27 | 0x83, 0x06, 0x0C, 0x30, 0x60, 0xC1, 0x87, 0x0C, 0x18, 0x30, 0x61, 0x80, 28 | 0x7B, 0xFC, 0xF3, 0xCF, 0x3C, 0xF3, 0xFD, 0xEC, 0xF3, 0xCF, 0x3C, 0xF3, 29 | 0xCF, 0xF7, 0x80, 0x7B, 0xFC, 0xF3, 0xCF, 0x3C, 0xF3, 0xCF, 0x3F, 0xDF, 30 | 0x0C, 0x3C, 0xF3, 0xCF, 0xF7, 0x80, 0xF0, 0x00, 0x3C, 0xF0, 0x00, 0xFC, 31 | 0x0C, 0x63, 0x8C, 0x71, 0x8C, 0x30, 0x61, 0xC3, 0x0E, 0x18, 0x30, 0xFF, 32 | 0xF0, 0x00, 0x03, 0xFF, 0xC0, 0xC1, 0x87, 0x0C, 0x38, 0x60, 0xC3, 0x18, 33 | 0xE3, 0x1C, 0x63, 0x00, 0x7B, 0xFC, 0xF3, 0xCC, 0x30, 0xC3, 0x0C, 0x71, 34 | 0x86, 0x30, 0xC3, 0x00, 0x00, 0xC3, 0x00, 0x7F, 0x7F, 0xF0, 0x78, 0x3C, 35 | 0x1E, 0x7F, 0x7F, 0xB3, 0xD9, 0xEC, 0xF6, 0x7B, 0x3D, 0xFE, 0x7F, 0x01, 36 | 0xFE, 0x7F, 0x00, 0x18, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 37 | 0x7E, 0x7E, 0x7E, 0x76, 0x7E, 0x7E, 0x66, 0x66, 0xE7, 0xE7, 0xFD, 0xFF, 38 | 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xFF, 0xFB, 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 39 | 0xC7, 0xFF, 0xF0, 0x7D, 0xFF, 0x1E, 0x3C, 0x78, 0x30, 0x60, 0xC1, 0x83, 40 | 0x06, 0x0C, 0x18, 0x31, 0xE3, 0xC7, 0xFD, 0xF0, 0xFD, 0xFF, 0x1E, 0x3C, 41 | 0x78, 0xF1, 0xE3, 0xC7, 0x8F, 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xC7, 0xFF, 42 | 0xF0, 0xFF, 0xFF, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0xFB, 0xF6, 0x0C, 43 | 0x18, 0x30, 0x60, 0xC1, 0xFF, 0xF8, 0xFF, 0xFF, 0x06, 0x0C, 0x18, 0x30, 44 | 0x60, 0xC1, 0xFB, 0xF6, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x00, 0x7D, 45 | 0xFF, 0x1E, 0x3C, 0x78, 0x30, 0x60, 0xC1, 0xBF, 0x7E, 0x3C, 0x78, 0xF1, 46 | 0xE3, 0xC7, 0xFD, 0xF8, 0xC7, 0x8F, 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xFF, 47 | 0xFF, 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xC7, 0x8F, 0x18, 0xFF, 0xFF, 0xFF, 48 | 0xFF, 0xFC, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18, 49 | 0x30, 0x60, 0xF1, 0xE3, 0xC7, 0xFD, 0xF0, 0xC7, 0x9F, 0x36, 0xED, 0x9E, 50 | 0x3C, 0x70, 0xE1, 0xC3, 0x87, 0x8F, 0x1F, 0x36, 0x6E, 0xCD, 0x9F, 0x18, 51 | 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 52 | 0xC3, 0xFF, 0xC0, 0xE1, 0xF8, 0x7E, 0x1F, 0x87, 0xE1, 0xFC, 0xFF, 0x3F, 53 | 0xCF, 0xF3, 0xFC, 0xFD, 0xEF, 0x7B, 0xDE, 0xF7, 0xBD, 0xEF, 0x7B, 0xCC, 54 | 0xF3, 0x3C, 0xCC, 0xC7, 0xCF, 0x9F, 0x3E, 0x7C, 0xFD, 0xFB, 0xF7, 0xAF, 55 | 0x5E, 0xFD, 0xFB, 0xF3, 0xE7, 0xCF, 0x9F, 0x18, 0x7D, 0xFF, 0x1E, 0x3C, 56 | 0x78, 0xF1, 0xE3, 0xC7, 0x8F, 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xC7, 0xFD, 57 | 0xF0, 0xFD, 0xFF, 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xC7, 0xFF, 0xF6, 0x0C, 58 | 0x18, 0x30, 0x60, 0xC1, 0x83, 0x00, 0x7D, 0xFF, 0x1E, 0x3C, 0x78, 0xF1, 59 | 0xE3, 0xC7, 0x8F, 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xC7, 0xFD, 0xF1, 0xC1, 60 | 0xE3, 0xC0, 0xF9, 0xFB, 0x36, 0x6C, 0xD9, 0xB3, 0x66, 0xCD, 0xFB, 0xE6, 61 | 0x6C, 0xD9, 0xB3, 0x66, 0xCD, 0x9B, 0x30, 0x7D, 0xFF, 0x1E, 0x3C, 0x78, 62 | 0x30, 0x70, 0x70, 0x70, 0x70, 0x70, 0x60, 0xF1, 0xE3, 0xC7, 0xFD, 0xF0, 63 | 0xFF, 0xFC, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, 64 | 0x0C, 0x18, 0x30, 0x60, 0xC0, 0xC7, 0x8F, 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 65 | 0xC7, 0x8F, 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xC7, 0xFD, 0xF0, 0xE7, 0x67, 66 | 0x66, 0x66, 0x66, 0x66, 0x66, 0x7E, 0x7E, 0x7E, 0x3C, 0x3C, 0x3C, 0x3C, 67 | 0x3C, 0x3C, 0x3C, 0x3C, 0x18, 0xE7, 0x3B, 0x39, 0xD9, 0xCC, 0xCE, 0x66, 68 | 0x73, 0x33, 0x99, 0x9E, 0xCF, 0xFE, 0x7F, 0xF3, 0xFF, 0x8F, 0x78, 0x7B, 69 | 0xC3, 0xDE, 0x1E, 0xF0, 0xF7, 0x87, 0xBC, 0x3D, 0xE1, 0xE7, 0x06, 0x30, 70 | 0xE7, 0x66, 0x66, 0x7E, 0x3E, 0x3C, 0x3C, 0x3C, 0x18, 0x18, 0x18, 0x3C, 71 | 0x3C, 0x3C, 0x3E, 0x7E, 0x66, 0x66, 0xE7, 0xE7, 0x66, 0x66, 0x7E, 0x3E, 72 | 0x3C, 0x3C, 0x3C, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 73 | 0x18, 0x18, 0xFF, 0xFC, 0x18, 0x70, 0xC1, 0x87, 0x0C, 0x18, 0x70, 0xC1, 74 | 0x87, 0x0C, 0x18, 0x70, 0xC1, 0xFF, 0xF8, 0xFF, 0xF1, 0x8C, 0x63, 0x18, 75 | 0xC6, 0x31, 0x8C, 0x63, 0x18, 0xC6, 0x31, 0x8C, 0x7F, 0xE0, 0xC3, 0x0C, 76 | 0x30, 0x61, 0x86, 0x18, 0x60, 0xC3, 0x0C, 0x30, 0x61, 0x86, 0x18, 0x60, 77 | 0xC0, 0xFF, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x18, 78 | 0xC6, 0x31, 0xFF, 0xE0, 0x31, 0xEC, 0xC0, 0xFF, 0xFF, 0xC0, 0x73, 0xE0, 79 | 0xC0, 0x7B, 0xFC, 0xF3, 0xCC, 0x37, 0xFF, 0xCF, 0x3C, 0xF3, 0xCF, 0xF7, 80 | 0xC0, 0xC3, 0x0C, 0x30, 0xFB, 0xFC, 0xF3, 0xCF, 0x3C, 0xF3, 0xCF, 0x3C, 81 | 0xF3, 0xCF, 0xFF, 0x80, 0x7B, 0xFC, 0xF3, 0xCF, 0x0C, 0x30, 0xC3, 0x0C, 82 | 0xF3, 0xCF, 0xF7, 0x80, 0x0C, 0x30, 0xC3, 0x7F, 0xFC, 0xF3, 0xCF, 0x3C, 83 | 0xF3, 0xCF, 0x3C, 0xF3, 0xCF, 0xF7, 0xC0, 0x7B, 0xFC, 0xF3, 0xCF, 0x3F, 84 | 0xFF, 0xC3, 0x0C, 0xF3, 0xCF, 0xF7, 0x80, 0x19, 0xD8, 0xCF, 0xFD, 0x8C, 85 | 0x63, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0x7F, 0xFC, 0xF3, 0xCF, 0x3C, 86 | 0xF3, 0xCF, 0x3C, 0xF3, 0xCF, 0xF7, 0xC3, 0xCF, 0xF7, 0x80, 0xC3, 0x0C, 87 | 0x30, 0xFB, 0xFC, 0xF3, 0xCF, 0x3C, 0xF3, 0xCF, 0x3C, 0xF3, 0xCF, 0x3C, 88 | 0xC0, 0xF0, 0xFF, 0xFF, 0xFF, 0xFC, 0x33, 0x00, 0x33, 0x33, 0x33, 0x33, 89 | 0x33, 0x33, 0x33, 0x33, 0x3F, 0xF0, 0xC3, 0x0C, 0x30, 0xCF, 0x2D, 0xB6, 90 | 0xF3, 0xCE, 0x38, 0xF3, 0xCF, 0x36, 0xDB, 0x2C, 0xC0, 0xFF, 0xFF, 0xFF, 91 | 0xFF, 0xFC, 0xFF, 0xBF, 0xFC, 0xCF, 0x33, 0xCC, 0xF3, 0x3C, 0xCF, 0x33, 92 | 0xCC, 0xF3, 0x3C, 0xCF, 0x33, 0xCC, 0xF3, 0x3C, 0xCC, 0xFB, 0xFC, 0xF3, 93 | 0xCF, 0x3C, 0xF3, 0xCF, 0x3C, 0xF3, 0xCF, 0x3C, 0xC0, 0x7B, 0xFC, 0xF3, 94 | 0xCF, 0x3C, 0xF3, 0xCF, 0x3C, 0xF3, 0xCF, 0xF7, 0x80, 0xFB, 0xFC, 0xF3, 95 | 0xCF, 0x3C, 0xF3, 0xCF, 0x3C, 0xF3, 0xCF, 0xFF, 0xB0, 0xC3, 0x0C, 0x00, 96 | 0x7F, 0xFC, 0xF3, 0xCF, 0x3C, 0xF3, 0xCF, 0x3C, 0xF3, 0xCF, 0xF7, 0xC3, 97 | 0x0C, 0x30, 0xC0, 0xFB, 0xFC, 0xF3, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 98 | 0xC3, 0x0C, 0x00, 0x7B, 0xFC, 0xF3, 0xC3, 0x86, 0x0C, 0x18, 0x70, 0xF3, 99 | 0xCF, 0xF7, 0x80, 0x66, 0x66, 0xFF, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 100 | 0x70, 0xCF, 0x3C, 0xF3, 0xCF, 0x3C, 0xF3, 0xCF, 0x3C, 0xF3, 0xCF, 0xF7, 101 | 0xC0, 0xCF, 0x9B, 0x36, 0x6C, 0xCD, 0x9B, 0x3C, 0x78, 0xF1, 0xE1, 0xC3, 102 | 0x86, 0x0C, 0x00, 0xCC, 0xF3, 0x3D, 0xDB, 0x76, 0xDD, 0xB7, 0x65, 0xD9, 103 | 0xFE, 0x7F, 0x9F, 0xC7, 0x71, 0xDC, 0x77, 0x1D, 0xC3, 0x30, 0xCD, 0x9B, 104 | 0x33, 0xC7, 0x8F, 0x0E, 0x18, 0x30, 0xF1, 0xE3, 0x4C, 0xD9, 0xB3, 0x00, 105 | 0xC7, 0x8F, 0x9B, 0x66, 0xCD, 0x9B, 0x36, 0x6C, 0x70, 0xE1, 0xC3, 0x87, 106 | 0x0E, 0x18, 0x31, 0xE3, 0xC0, 0xFF, 0xF0, 0xC7, 0x18, 0x63, 0x0C, 0x31, 107 | 0x86, 0x38, 0xC3, 0xFF, 0xC0, 0x1C, 0xF3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 108 | 0xCE, 0x38, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xF1, 0xC0, 0xFF, 109 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xE3, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 110 | 0xC3, 0xC7, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x33, 0xCE, 0x00, 0x76, 111 | 0xFE, 0xDC }; 112 | 113 | const GFXglyph Okuda_A5PL14pt7bGlyphs[] PROGMEM = { 114 | { 0, 1, 1, 7, 0, 0 }, // 0x20 ' ' 115 | { 1, 2, 19, 4, 1, -18 }, // 0x21 '!' 116 | { 6, 5, 3, 7, 1, -19 }, // 0x22 '"' 117 | { 8, 10, 10, 12, 1, -16 }, // 0x23 '#' 118 | { 21, 6, 19, 8, 1, -18 }, // 0x24 '$' 119 | { 36, 11, 19, 13, 1, -18 }, // 0x25 '%' 120 | { 63, 7, 19, 8, 1, -18 }, // 0x26 '&' 121 | { 80, 2, 3, 4, 1, -19 }, // 0x27 ''' 122 | { 81, 5, 23, 6, 1, -20 }, // 0x28 '(' 123 | { 96, 5, 23, 6, 0, -20 }, // 0x29 ')' 124 | { 111, 20, 23, 22, 1, -19 }, // 0x2A '*' 125 | { 169, 6, 6, 8, 1, -12 }, // 0x2B '+' 126 | { 174, 2, 3, 4, 1, -1 }, // 0x2C ',' 127 | { 175, 6, 2, 8, 1, -9 }, // 0x2D '-' 128 | { 177, 2, 2, 4, 1, -1 }, // 0x2E '.' 129 | { 178, 6, 19, 7, 1, -18 }, // 0x2F '/' 130 | { 193, 6, 19, 8, 1, -18 }, // 0x30 '0' 131 | { 208, 3, 19, 5, 1, -18 }, // 0x31 '1' 132 | { 216, 6, 19, 8, 1, -18 }, // 0x32 '2' 133 | { 231, 6, 19, 8, 1, -18 }, // 0x33 '3' 134 | { 246, 8, 19, 10, 1, -18 }, // 0x34 '4' 135 | { 265, 6, 19, 8, 1, -18 }, // 0x35 '5' 136 | { 280, 6, 19, 8, 1, -18 }, // 0x36 '6' 137 | { 295, 7, 19, 9, 1, -18 }, // 0x37 '7' 138 | { 312, 6, 19, 8, 1, -18 }, // 0x38 '8' 139 | { 327, 6, 19, 8, 1, -18 }, // 0x39 '9' 140 | { 342, 2, 11, 4, 1, -10 }, // 0x3A ':' 141 | { 345, 2, 11, 4, 1, -9 }, // 0x3B ';' 142 | { 348, 6, 14, 8, 1, -15 }, // 0x3C '<' 143 | { 359, 6, 7, 8, 1, -13 }, // 0x3D '=' 144 | { 365, 6, 14, 8, 1, -15 }, // 0x3E '>' 145 | { 376, 6, 19, 8, 1, -18 }, // 0x3F '?' 146 | { 391, 9, 17, 11, 1, -17 }, // 0x40 '@' 147 | { 411, 8, 19, 8, 0, -18 }, // 0x41 'A' 148 | { 430, 7, 19, 9, 1, -18 }, // 0x42 'B' 149 | { 447, 7, 19, 9, 1, -18 }, // 0x43 'C' 150 | { 464, 7, 19, 9, 1, -18 }, // 0x44 'D' 151 | { 481, 7, 19, 8, 1, -18 }, // 0x45 'E' 152 | { 498, 7, 19, 8, 1, -18 }, // 0x46 'F' 153 | { 515, 7, 19, 9, 1, -18 }, // 0x47 'G' 154 | { 532, 7, 19, 9, 1, -18 }, // 0x48 'H' 155 | { 549, 2, 19, 4, 1, -18 }, // 0x49 'I' 156 | { 554, 7, 19, 9, 1, -18 }, // 0x4A 'J' 157 | { 571, 7, 19, 8, 1, -18 }, // 0x4B 'K' 158 | { 588, 6, 19, 8, 1, -18 }, // 0x4C 'L' 159 | { 603, 10, 19, 12, 1, -18 }, // 0x4D 'M' 160 | { 627, 7, 19, 9, 1, -18 }, // 0x4E 'N' 161 | { 644, 7, 19, 9, 1, -18 }, // 0x4F 'O' 162 | { 661, 7, 19, 9, 1, -18 }, // 0x50 'P' 163 | { 678, 7, 22, 9, 1, -18 }, // 0x51 'Q' 164 | { 698, 7, 19, 8, 1, -18 }, // 0x52 'R' 165 | { 715, 7, 19, 9, 1, -18 }, // 0x53 'S' 166 | { 732, 7, 19, 9, 1, -18 }, // 0x54 'T' 167 | { 749, 7, 19, 9, 1, -18 }, // 0x55 'U' 168 | { 766, 8, 19, 8, 0, -18 }, // 0x56 'V' 169 | { 785, 13, 19, 13, 0, -18 }, // 0x57 'W' 170 | { 816, 8, 19, 8, 0, -18 }, // 0x58 'X' 171 | { 835, 8, 19, 8, 0, -18 }, // 0x59 'Y' 172 | { 854, 7, 19, 9, 1, -18 }, // 0x5A 'Z' 173 | { 871, 5, 23, 6, 1, -20 }, // 0x5B '[' 174 | { 886, 6, 19, 7, 1, -18 }, // 0x5C '\' 175 | { 901, 5, 23, 6, 0, -20 }, // 0x5D ']' 176 | { 916, 6, 3, 8, 1, -23 }, // 0x5E '^' 177 | { 919, 9, 2, 9, 1, 2 }, // 0x5F '_' 178 | { 922, 6, 3, 8, 1, -23 }, // 0x60 '`' 179 | { 925, 6, 15, 8, 1, -14 }, // 0x61 'a' 180 | { 937, 6, 19, 8, 1, -18 }, // 0x62 'b' 181 | { 952, 6, 15, 8, 1, -14 }, // 0x63 'c' 182 | { 964, 6, 19, 8, 1, -18 }, // 0x64 'd' 183 | { 979, 6, 15, 8, 1, -14 }, // 0x65 'e' 184 | { 991, 5, 19, 7, 1, -18 }, // 0x66 'f' 185 | { 1003, 6, 20, 8, 1, -14 }, // 0x67 'g' 186 | { 1018, 6, 19, 8, 1, -18 }, // 0x68 'h' 187 | { 1033, 2, 19, 4, 1, -18 }, // 0x69 'i' 188 | { 1038, 4, 23, 6, 1, -18 }, // 0x6A 'j' 189 | { 1050, 6, 19, 8, 1, -18 }, // 0x6B 'k' 190 | { 1065, 2, 19, 4, 1, -18 }, // 0x6C 'l' 191 | { 1070, 10, 15, 12, 1, -14 }, // 0x6D 'm' 192 | { 1089, 6, 15, 8, 1, -14 }, // 0x6E 'n' 193 | { 1101, 6, 15, 8, 1, -14 }, // 0x6F 'o' 194 | { 1113, 6, 19, 8, 1, -14 }, // 0x70 'p' 195 | { 1128, 6, 19, 8, 1, -14 }, // 0x71 'q' 196 | { 1143, 6, 15, 8, 1, -14 }, // 0x72 'r' 197 | { 1155, 6, 15, 8, 1, -14 }, // 0x73 's' 198 | { 1167, 4, 19, 6, 1, -18 }, // 0x74 't' 199 | { 1177, 6, 15, 8, 1, -14 }, // 0x75 'u' 200 | { 1189, 7, 15, 8, 1, -14 }, // 0x76 'v' 201 | { 1203, 10, 15, 11, 1, -14 }, // 0x77 'w' 202 | { 1222, 7, 15, 8, 1, -14 }, // 0x78 'x' 203 | { 1236, 7, 19, 8, 1, -14 }, // 0x79 'y' 204 | { 1253, 6, 15, 8, 1, -14 }, // 0x7A 'z' 205 | { 1265, 6, 23, 6, 0, -20 }, // 0x7B '{' 206 | { 1283, 2, 23, 4, 1, -20 }, // 0x7C '|' 207 | { 1289, 6, 23, 6, 0, -20 }, // 0x7D '}' 208 | { 1307, 8, 3, 9, 1, -23 } }; // 0x7E '~' 209 | 210 | const GFXfont Okuda_A5PL14pt7b PROGMEM = { 211 | (uint8_t *)Okuda_A5PL14pt7bBitmaps, 212 | (GFXglyph *)Okuda_A5PL14pt7bGlyphs, 213 | 0x20, 0x7E, 32 }; 214 | 215 | // Approx. 1982 bytes 216 | -------------------------------------------------------------------------------- /src/Fonts/UbuntuMono_R12pt7b.h: -------------------------------------------------------------------------------- 1 | const uint8_t UbuntuMono_R12pt7bBitmaps[] PROGMEM = { 2 | 0x00, 0x6D, 0xB6, 0xDB, 0x6C, 0x0F, 0xF8, 0xCF, 0x3C, 0xF3, 0xCF, 0x30, 3 | 0x31, 0x8C, 0x63, 0x18, 0xC6, 0xFF, 0xFF, 0xF3, 0x19, 0xCE, 0x63, 0x3F, 4 | 0xFF, 0xFD, 0x8C, 0x63, 0x18, 0xC6, 0x30, 0x0C, 0x06, 0x0F, 0xCF, 0xEE, 5 | 0x16, 0x03, 0x01, 0xE0, 0x7C, 0x0F, 0x80, 0xE0, 0x30, 0x1E, 0x1F, 0xFC, 6 | 0xFC, 0x0C, 0x06, 0x03, 0x00, 0x70, 0x7B, 0x1B, 0x67, 0x6C, 0xCD, 0xB1, 7 | 0xB6, 0x1D, 0x80, 0x70, 0x0D, 0xC3, 0x6C, 0x6D, 0x99, 0xB7, 0x36, 0xC6, 8 | 0xF0, 0x70, 0x3C, 0x1F, 0x86, 0x61, 0x98, 0x66, 0x1F, 0x03, 0xC0, 0xE6, 9 | 0x6D, 0xB3, 0xEC, 0x73, 0x0C, 0xE7, 0x9F, 0xE3, 0xCC, 0xFF, 0xF0, 0x04, 10 | 0x1C, 0x61, 0x87, 0x0C, 0x38, 0x60, 0xC1, 0x83, 0x06, 0x0E, 0x0C, 0x1C, 11 | 0x1C, 0x1C, 0x1C, 0x10, 0x41, 0xC1, 0xC1, 0xC1, 0xC1, 0x83, 0x83, 0x06, 12 | 0x0C, 0x18, 0x30, 0xE1, 0x87, 0x0C, 0x71, 0xC1, 0x00, 0x0C, 0x03, 0x04, 13 | 0xCB, 0xFF, 0x1E, 0x03, 0x01, 0xE0, 0xCC, 0x12, 0x00, 0x0C, 0x03, 0x00, 14 | 0xC0, 0x30, 0xFF, 0xFF, 0xF0, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0x77, 0x73, 15 | 0xEC, 0xFF, 0xC0, 0xFF, 0x80, 0x03, 0x03, 0x06, 0x06, 0x06, 0x0C, 0x0C, 16 | 0x0C, 0x0C, 0x18, 0x18, 0x18, 0x30, 0x30, 0x30, 0x30, 0x60, 0x60, 0x60, 17 | 0xC0, 0xC0, 0x1E, 0x0F, 0xC7, 0x39, 0x86, 0xC0, 0xF0, 0x3C, 0xCF, 0x33, 18 | 0xCC, 0xF0, 0x3C, 0x0D, 0x86, 0x73, 0x8F, 0xC1, 0xE0, 0x0C, 0x0E, 0x0F, 19 | 0x0D, 0x8C, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xC3, 20 | 0xFD, 0xFE, 0x3C, 0x7F, 0x11, 0xC0, 0x60, 0x30, 0x18, 0x18, 0x18, 0x18, 21 | 0x1C, 0x0C, 0x0C, 0x0C, 0x07, 0xFF, 0xFE, 0x3E, 0x3F, 0xC4, 0x38, 0x06, 22 | 0x01, 0x80, 0xC1, 0xE0, 0x7C, 0x03, 0x80, 0x30, 0x0C, 0x03, 0x81, 0xFF, 23 | 0xE7, 0xE0, 0x07, 0x03, 0xC1, 0xF0, 0x6C, 0x3B, 0x0C, 0xC6, 0x31, 0x8C, 24 | 0xC3, 0x3F, 0xFF, 0xFC, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x3F, 0xBF, 0xD8, 25 | 0x0C, 0x06, 0x03, 0x01, 0xF0, 0xFE, 0x07, 0x00, 0xC0, 0x60, 0x38, 0x3F, 26 | 0xF9, 0xF0, 0x03, 0x87, 0xE3, 0xC1, 0xC0, 0x60, 0x38, 0x0D, 0xF3, 0xFE, 27 | 0xC1, 0xF0, 0x3C, 0x0F, 0x03, 0x61, 0xDF, 0xE1, 0xF0, 0xFF, 0xFF, 0xC0, 28 | 0x60, 0x60, 0x60, 0x30, 0x30, 0x18, 0x08, 0x0C, 0x06, 0x03, 0x03, 0x01, 29 | 0x80, 0xC0, 0x1F, 0x1F, 0xEE, 0x1F, 0x03, 0xC0, 0xF8, 0x67, 0xF0, 0xFC, 30 | 0x67, 0xB0, 0x7C, 0x0F, 0x03, 0xE1, 0xDF, 0xE3, 0xF0, 0x3E, 0x1F, 0xEE, 31 | 0x1B, 0x03, 0xC0, 0xF0, 0x3E, 0x0D, 0xFF, 0x3F, 0xC0, 0x70, 0x18, 0x0E, 32 | 0x0F, 0x1F, 0x87, 0x80, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x77, 0x70, 0x00, 33 | 0x00, 0x37, 0x33, 0xE4, 0x00, 0xC0, 0xF1, 0xF3, 0xE0, 0xC0, 0x3E, 0x01, 34 | 0xF0, 0x0F, 0x00, 0xC0, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x3F, 0xFF, 35 | 0xFC, 0xC0, 0x3C, 0x03, 0xE0, 0x1F, 0x00, 0xC1, 0xF3, 0xE3, 0xC0, 0xC0, 36 | 0x00, 0x7C, 0xFE, 0x87, 0x03, 0x03, 0x06, 0x0C, 0x18, 0x30, 0x30, 0x00, 37 | 0x00, 0x70, 0x70, 0x70, 0x1F, 0x0F, 0xE7, 0x1D, 0x83, 0x60, 0xF0, 0xFC, 38 | 0x7F, 0x33, 0xCC, 0xF3, 0x3C, 0xCF, 0x1F, 0xE3, 0xD8, 0x07, 0x00, 0xE0, 39 | 0x1F, 0x83, 0xE0, 0x0E, 0x03, 0xE0, 0x6C, 0x0D, 0x81, 0xB0, 0x63, 0x0C, 40 | 0x61, 0x8C, 0x71, 0x8F, 0xF9, 0xFF, 0x30, 0x66, 0x0D, 0x80, 0xF0, 0x18, 41 | 0xFE, 0x3F, 0xCC, 0x3B, 0x06, 0xC1, 0xB0, 0xCF, 0xE3, 0xFC, 0xC1, 0xB0, 42 | 0x3C, 0x0F, 0x03, 0xC1, 0xFF, 0xEF, 0xE0, 0x0F, 0x8F, 0xF7, 0x0D, 0x80, 43 | 0xE0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0E, 0x01, 0x80, 0x70, 0x4F, 44 | 0xF0, 0xF8, 0xFC, 0x3F, 0xCC, 0x3B, 0x06, 0xC1, 0xF0, 0x3C, 0x0F, 0x03, 45 | 0xC0, 0xF0, 0x3C, 0x1F, 0x06, 0xC3, 0xBF, 0xCF, 0xC0, 0xFF, 0x7F, 0xB0, 46 | 0x18, 0x0C, 0x06, 0x03, 0xFD, 0xFE, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x07, 47 | 0xFF, 0xFE, 0xFF, 0xFF, 0xF0, 0x18, 0x0C, 0x06, 0x03, 0xFD, 0xFE, 0xC0, 48 | 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x00, 0x0F, 0x8F, 0xF7, 0x0D, 0x80, 49 | 0xE0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0xF0, 0x3E, 0x0D, 0x83, 0x70, 0xCF, 50 | 0xF0, 0xFC, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3F, 0xFF, 0xFF, 51 | 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0C, 0xFF, 0xFF, 0x18, 52 | 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0xFF, 53 | 0x3F, 0x9F, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xC0, 54 | 0x60, 0x34, 0x3F, 0xF9, 0xF8, 0xC1, 0xE1, 0xB1, 0x99, 0x8D, 0xC6, 0xC3, 55 | 0xC1, 0xE0, 0xD8, 0x66, 0x31, 0x98, 0xCC, 0x36, 0x1B, 0x06, 0xC0, 0x60, 56 | 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0C, 57 | 0x07, 0xFF, 0xFE, 0x61, 0x98, 0x66, 0x19, 0x4A, 0x52, 0x94, 0xBC, 0xCF, 58 | 0x33, 0xCC, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0C, 0xE0, 0xF8, 59 | 0x3F, 0x0F, 0xC3, 0xD8, 0xF6, 0x3C, 0xCF, 0x33, 0xC6, 0xF1, 0xBC, 0x3F, 60 | 0x0F, 0xC1, 0xF0, 0x7C, 0x1C, 0x1E, 0x0F, 0xC6, 0x39, 0x86, 0xC0, 0xF0, 61 | 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0D, 0x86, 0x63, 0x8F, 0xC1, 0xE0, 62 | 0xFC, 0x7F, 0xB0, 0xF8, 0x3C, 0x1E, 0x0F, 0x07, 0x86, 0xFF, 0x7E, 0x30, 63 | 0x18, 0x0C, 0x06, 0x03, 0x00, 0x1E, 0x0F, 0xC6, 0x39, 0x86, 0xC0, 0xF0, 64 | 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x86, 0x63, 0x8F, 0xC1, 0xE0, 65 | 0x30, 0x0E, 0x01, 0xE0, 0x18, 0xFC, 0x3F, 0xCC, 0x33, 0x06, 0xC1, 0xB0, 66 | 0x6C, 0x1B, 0x0C, 0xFE, 0x3F, 0x0C, 0x63, 0x18, 0xC3, 0x30, 0x6C, 0x0C, 67 | 0x3E, 0x3F, 0xB8, 0x58, 0x0C, 0x07, 0x01, 0xE0, 0x7C, 0x0F, 0x01, 0xC0, 68 | 0x60, 0x3C, 0x3F, 0xF9, 0xF8, 0xFF, 0xFF, 0xF0, 0xC0, 0x30, 0x0C, 0x03, 69 | 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 70 | 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 71 | 0x3C, 0x0F, 0x03, 0xE1, 0x9F, 0xE3, 0xF0, 0xC0, 0x78, 0x0D, 0x83, 0x30, 72 | 0x66, 0x0C, 0xE1, 0x8C, 0x61, 0x8C, 0x39, 0x83, 0x20, 0x6C, 0x0F, 0x81, 73 | 0xE0, 0x1C, 0x03, 0x80, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 74 | 0xCF, 0x33, 0xCC, 0xF7, 0xBD, 0x2F, 0xCF, 0xE1, 0xF8, 0x7C, 0x0C, 0xC0, 75 | 0xD8, 0x66, 0x18, 0xCC, 0x33, 0x07, 0x81, 0xE0, 0x30, 0x1E, 0x07, 0x83, 76 | 0x30, 0xCC, 0x61, 0x98, 0x6C, 0x0C, 0xC0, 0x36, 0x06, 0x60, 0x63, 0x0C, 77 | 0x30, 0xC1, 0x98, 0x19, 0x80, 0xF0, 0x0F, 0x00, 0x60, 0x06, 0x00, 0x60, 78 | 0x06, 0x00, 0x60, 0x06, 0x00, 0xFF, 0xFF, 0xF0, 0x18, 0x06, 0x03, 0x01, 79 | 0x80, 0xE0, 0x30, 0x18, 0x0E, 0x03, 0x01, 0x80, 0xE0, 0x3F, 0xFF, 0xFC, 80 | 0xFF, 0xFC, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 81 | 0xC3, 0xFF, 0xC0, 0xC0, 0xC0, 0x60, 0x60, 0x60, 0x30, 0x30, 0x30, 0x30, 82 | 0x18, 0x18, 0x18, 0x0C, 0x0C, 0x0C, 0x0C, 0x06, 0x06, 0x06, 0x03, 0x03, 83 | 0xFF, 0xF0, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 84 | 0x0F, 0xFF, 0xC0, 0x0E, 0x01, 0xC0, 0x6C, 0x1D, 0xC3, 0x18, 0xC1, 0xB8, 85 | 0x3A, 0x02, 0xFF, 0xFF, 0xFF, 0x4E, 0x63, 0x7E, 0x3F, 0x80, 0xE0, 0x33, 86 | 0xFB, 0xFF, 0x87, 0x83, 0xE1, 0xBF, 0xCF, 0xE0, 0xC0, 0x60, 0x30, 0x18, 87 | 0x0C, 0x06, 0x03, 0xF9, 0xFE, 0xC3, 0x60, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 88 | 0x0D, 0xFE, 0xFC, 0x00, 0x1F, 0xCF, 0xF7, 0x03, 0x80, 0xC0, 0x30, 0x0C, 89 | 0x03, 0x80, 0x70, 0x0F, 0xF1, 0xFC, 0x01, 0x80, 0xC0, 0x60, 0x30, 0x18, 90 | 0x0C, 0xFE, 0xFF, 0x63, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0D, 0x86, 0xFF, 91 | 0x1F, 0x80, 0x1F, 0x0F, 0xE6, 0x1F, 0x03, 0xFF, 0xFF, 0xFC, 0x03, 0x00, 92 | 0x70, 0x9F, 0xE1, 0xF0, 0x0F, 0x0F, 0xCE, 0x26, 0x03, 0x01, 0x83, 0xFD, 93 | 0xFE, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xC0, 0x60, 0x30, 0x00, 94 | 0x1F, 0xBF, 0xD8, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0x61, 0xBF, 0xCF, 95 | 0xE0, 0x34, 0x3B, 0xF8, 0xF8, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xFC, 96 | 0xFE, 0xC7, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x38, 0x0E, 97 | 0x03, 0x80, 0x00, 0x00, 0x3E, 0x0F, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 98 | 0x60, 0x18, 0x07, 0x10, 0xFC, 0x1E, 0x0E, 0x1C, 0x38, 0x00, 0x0F, 0xDF, 99 | 0x83, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x07, 0x1F, 0xF3, 0xC0, 100 | 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x07, 0x8E, 0xCE, 0x6C, 0x3C, 101 | 0x1E, 0x0D, 0x86, 0x63, 0x19, 0x86, 0xC1, 0x80, 0xF8, 0x3E, 0x01, 0x80, 102 | 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 103 | 0x06, 0x01, 0xC4, 0x3F, 0x07, 0x80, 0xFB, 0xBF, 0xFC, 0xCF, 0x33, 0xCC, 104 | 0xF3, 0x3C, 0xCF, 0x03, 0xC0, 0xF0, 0x3C, 0x0C, 0xFC, 0xFE, 0xC7, 0xC3, 105 | 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x1E, 0x1F, 0xE6, 0x1B, 0x03, 106 | 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0x61, 0x9F, 0xE1, 0xE0, 0xFC, 0x7F, 0xB0, 107 | 0xD8, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xC3, 0x7F, 0xBF, 0x98, 0x0C, 0x06, 108 | 0x03, 0x00, 0x1F, 0xBF, 0xD8, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0x61, 109 | 0xBF, 0xC7, 0xE0, 0x30, 0x18, 0x0C, 0x06, 0x7F, 0xFF, 0xC0, 0xC0, 0xC0, 110 | 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x7E, 0xFE, 0xC2, 0xC0, 0xF0, 0x7E, 111 | 0x0F, 0x03, 0x83, 0xFF, 0x7C, 0x30, 0x18, 0x0C, 0x1F, 0xFF, 0xF9, 0x80, 112 | 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x07, 0x13, 0xF8, 0x78, 0xC3, 0xC3, 0xC3, 113 | 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xE3, 0x7F, 0x3F, 0xC0, 0xF0, 0x36, 0x19, 114 | 0x86, 0x61, 0x8C, 0xC3, 0x30, 0xDC, 0x1E, 0x07, 0x80, 0xC0, 0xC0, 0x78, 115 | 0x0F, 0x01, 0xE0, 0x34, 0x4C, 0xD9, 0x9A, 0xB3, 0xDE, 0x71, 0xCE, 0x18, 116 | 0x82, 0x00, 0xC0, 0xD8, 0x63, 0x30, 0x78, 0x1E, 0x03, 0x01, 0xE0, 0xEC, 117 | 0x33, 0x18, 0x6C, 0x0C, 0xC0, 0xF0, 0x36, 0x19, 0x86, 0x71, 0x8C, 0x63, 118 | 0x30, 0x6C, 0x1B, 0x03, 0x80, 0xE0, 0x38, 0x1C, 0x3E, 0x0F, 0x00, 0xFF, 119 | 0xFF, 0x06, 0x0E, 0x0C, 0x18, 0x30, 0x60, 0x60, 0xFF, 0xFF, 0x0F, 0x8F, 120 | 0xC6, 0x03, 0x01, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x1C, 0x3C, 0x1E, 0x03, 121 | 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0xF0, 0xF8, 0xFF, 0xFF, 122 | 0xFF, 0xFF, 0xFF, 0xC0, 0xF8, 0x7E, 0x03, 0x01, 0x80, 0xC0, 0x60, 0x30, 123 | 0x18, 0x0C, 0x07, 0x01, 0xE0, 0xF0, 0xE0, 0x60, 0x30, 0x18, 0x0C, 0x06, 124 | 0x03, 0x1F, 0x8F, 0x80, 0x78, 0x5F, 0x3C, 0xFA, 0x1C }; 125 | 126 | const GFXglyph UbuntuMono_R12pt7bGlyphs[] PROGMEM = { 127 | { 0, 1, 1, 12, 0, 0 }, // 0x20 ' ' 128 | { 1, 3, 15, 12, 4, -14 }, // 0x21 '!' 129 | { 7, 6, 6, 12, 3, -15 }, // 0x22 '"' 130 | { 12, 10, 15, 12, 1, -14 }, // 0x23 '#' 131 | { 31, 9, 19, 12, 2, -16 }, // 0x24 '$' 132 | { 53, 11, 15, 12, 0, -14 }, // 0x25 '%' 133 | { 74, 10, 15, 12, 1, -14 }, // 0x26 '&' 134 | { 93, 2, 6, 12, 5, -15 }, // 0x27 ''' 135 | { 95, 7, 19, 12, 3, -14 }, // 0x28 '(' 136 | { 112, 7, 19, 12, 2, -14 }, // 0x29 ')' 137 | { 129, 10, 9, 12, 1, -14 }, // 0x2A '*' 138 | { 141, 10, 10, 12, 1, -10 }, // 0x2B '+' 139 | { 154, 4, 6, 12, 4, -2 }, // 0x2C ',' 140 | { 157, 5, 2, 12, 3, -6 }, // 0x2D '-' 141 | { 159, 3, 3, 12, 4, -2 }, // 0x2E '.' 142 | { 161, 8, 21, 12, 2, -16 }, // 0x2F '/' 143 | { 182, 10, 15, 12, 1, -14 }, // 0x30 '0' 144 | { 201, 9, 15, 12, 2, -14 }, // 0x31 '1' 145 | { 218, 9, 15, 12, 2, -14 }, // 0x32 '2' 146 | { 235, 10, 15, 12, 1, -14 }, // 0x33 '3' 147 | { 254, 10, 15, 12, 1, -14 }, // 0x34 '4' 148 | { 273, 9, 15, 12, 2, -14 }, // 0x35 '5' 149 | { 290, 10, 15, 12, 1, -14 }, // 0x36 '6' 150 | { 309, 9, 15, 12, 2, -14 }, // 0x37 '7' 151 | { 326, 10, 15, 12, 1, -14 }, // 0x38 '8' 152 | { 345, 10, 15, 12, 1, -14 }, // 0x39 '9' 153 | { 364, 3, 11, 12, 4, -10 }, // 0x3A ':' 154 | { 369, 4, 14, 12, 3, -10 }, // 0x3B ';' 155 | { 376, 10, 9, 12, 1, -10 }, // 0x3C '<' 156 | { 388, 10, 7, 12, 1, -9 }, // 0x3D '=' 157 | { 397, 10, 9, 12, 1, -10 }, // 0x3E '>' 158 | { 409, 8, 15, 12, 3, -14 }, // 0x3F '?' 159 | { 424, 10, 18, 12, 1, -14 }, // 0x40 '@' 160 | { 447, 11, 15, 12, 0, -14 }, // 0x41 'A' 161 | { 468, 10, 15, 12, 1, -14 }, // 0x42 'B' 162 | { 487, 10, 15, 12, 1, -14 }, // 0x43 'C' 163 | { 506, 10, 15, 12, 1, -14 }, // 0x44 'D' 164 | { 525, 9, 15, 12, 2, -14 }, // 0x45 'E' 165 | { 542, 9, 15, 12, 2, -14 }, // 0x46 'F' 166 | { 559, 10, 15, 12, 1, -14 }, // 0x47 'G' 167 | { 578, 10, 15, 12, 1, -14 }, // 0x48 'H' 168 | { 597, 8, 15, 12, 2, -14 }, // 0x49 'I' 169 | { 612, 9, 15, 12, 1, -14 }, // 0x4A 'J' 170 | { 629, 9, 15, 12, 2, -14 }, // 0x4B 'K' 171 | { 646, 9, 15, 12, 2, -14 }, // 0x4C 'L' 172 | { 663, 10, 15, 12, 1, -14 }, // 0x4D 'M' 173 | { 682, 10, 15, 12, 1, -14 }, // 0x4E 'N' 174 | { 701, 10, 15, 12, 1, -14 }, // 0x4F 'O' 175 | { 720, 9, 15, 12, 2, -14 }, // 0x50 'P' 176 | { 737, 10, 19, 12, 1, -14 }, // 0x51 'Q' 177 | { 761, 10, 15, 12, 1, -14 }, // 0x52 'R' 178 | { 780, 9, 15, 12, 2, -14 }, // 0x53 'S' 179 | { 797, 10, 15, 12, 1, -14 }, // 0x54 'T' 180 | { 816, 10, 15, 12, 1, -14 }, // 0x55 'U' 181 | { 835, 11, 15, 12, 0, -14 }, // 0x56 'V' 182 | { 856, 10, 15, 12, 1, -14 }, // 0x57 'W' 183 | { 875, 10, 15, 12, 1, -14 }, // 0x58 'X' 184 | { 894, 12, 15, 12, 0, -14 }, // 0x59 'Y' 185 | { 917, 10, 15, 12, 1, -14 }, // 0x5A 'Z' 186 | { 936, 6, 19, 12, 3, -14 }, // 0x5B '[' 187 | { 951, 8, 21, 12, 2, -16 }, // 0x5C '\' 188 | { 972, 6, 19, 12, 3, -14 }, // 0x5D ']' 189 | { 987, 11, 8, 12, 1, -14 }, // 0x5E '^' 190 | { 998, 12, 2, 12, 0, 3 }, // 0x5F '_' 191 | { 1001, 4, 4, 12, 4, -15 }, // 0x60 '`' 192 | { 1003, 9, 11, 12, 1, -10 }, // 0x61 'a' 193 | { 1016, 9, 17, 12, 2, -16 }, // 0x62 'b' 194 | { 1036, 10, 11, 12, 1, -10 }, // 0x63 'c' 195 | { 1050, 9, 17, 12, 1, -16 }, // 0x64 'd' 196 | { 1070, 10, 11, 12, 1, -10 }, // 0x65 'e' 197 | { 1084, 9, 17, 12, 2, -16 }, // 0x66 'f' 198 | { 1104, 9, 15, 12, 1, -10 }, // 0x67 'g' 199 | { 1121, 8, 17, 12, 2, -16 }, // 0x68 'h' 200 | { 1138, 10, 16, 12, 1, -15 }, // 0x69 'i' 201 | { 1158, 7, 20, 12, 2, -15 }, // 0x6A 'j' 202 | { 1176, 9, 17, 12, 2, -16 }, // 0x6B 'k' 203 | { 1196, 10, 17, 12, 1, -16 }, // 0x6C 'l' 204 | { 1218, 10, 11, 12, 1, -10 }, // 0x6D 'm' 205 | { 1232, 8, 11, 12, 2, -10 }, // 0x6E 'n' 206 | { 1243, 10, 11, 12, 1, -10 }, // 0x6F 'o' 207 | { 1257, 9, 15, 12, 2, -10 }, // 0x70 'p' 208 | { 1274, 9, 15, 12, 1, -10 }, // 0x71 'q' 209 | { 1291, 8, 11, 12, 3, -10 }, // 0x72 'r' 210 | { 1302, 8, 11, 12, 2, -10 }, // 0x73 's' 211 | { 1313, 9, 14, 12, 2, -13 }, // 0x74 't' 212 | { 1329, 8, 11, 12, 2, -10 }, // 0x75 'u' 213 | { 1340, 10, 11, 12, 1, -10 }, // 0x76 'v' 214 | { 1354, 11, 11, 12, 0, -10 }, // 0x77 'w' 215 | { 1370, 10, 11, 12, 1, -10 }, // 0x78 'x' 216 | { 1384, 10, 15, 12, 1, -10 }, // 0x79 'y' 217 | { 1403, 8, 11, 12, 2, -10 }, // 0x7A 'z' 218 | { 1414, 9, 21, 12, 2, -16 }, // 0x7B '{' 219 | { 1438, 2, 21, 12, 5, -16 }, // 0x7C '|' 220 | { 1444, 9, 21, 12, 2, -16 }, // 0x7D '}' 221 | { 1468, 10, 4, 12, 1, -8 } }; // 0x7E '~' 222 | 223 | const GFXfont UbuntuMono_R12pt7b PROGMEM = { 224 | (uint8_t *)UbuntuMono_R12pt7bBitmaps, 225 | (GFXglyph *)UbuntuMono_R12pt7bGlyphs, 226 | 0x20, 0x7E, 24 }; 227 | 228 | // Approx. 2145 bytes 229 | -------------------------------------------------------------------------------- /src/Fonts/Bitwise_m19x10pt7b.h: -------------------------------------------------------------------------------- 1 | const uint8_t Bitwise_m19x10pt7bBitmaps[] PROGMEM = { 2 | 0x00, 0xDB, 0x6D, 0xB7, 0xFF, 0xF0, 0x38, 0xDE, 0xD2, 0x94, 0x80, 0x03, 3 | 0x30, 0x11, 0x01, 0x98, 0x0C, 0xC0, 0x44, 0x3F, 0xFC, 0x33, 0x01, 0x10, 4 | 0x19, 0x87, 0xFF, 0x84, 0x40, 0x66, 0x03, 0x30, 0x11, 0x01, 0x98, 0x00, 5 | 0x04, 0x0F, 0xFF, 0xC4, 0x3C, 0x43, 0xC4, 0x3C, 0x40, 0xC4, 0x0C, 0x40, 6 | 0xFF, 0xF0, 0x47, 0x04, 0x70, 0x47, 0xC4, 0x7C, 0x47, 0xC4, 0x7F, 0xFF, 7 | 0x04, 0x00, 0x06, 0x0D, 0x90, 0x60, 0x83, 0x06, 0x18, 0x30, 0x71, 0xC3, 8 | 0x8F, 0x1D, 0xF8, 0x00, 0x3F, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 9 | 0x0C, 0x70, 0xCF, 0xFC, 0xE0, 0x0E, 0x0F, 0xE0, 0x7E, 0x07, 0xE0, 0x7E, 10 | 0x07, 0xFF, 0xF0, 0xF5, 0x40, 0x23, 0x6C, 0xCC, 0xCC, 0xCC, 0xCC, 0x66, 11 | 0x30, 0x4C, 0x63, 0x33, 0x33, 0x33, 0x33, 0x64, 0xC0, 0x18, 0x18, 0xDB, 12 | 0x7E, 0x3C, 0x3C, 0x66, 0x06, 0x00, 0xC0, 0x18, 0x03, 0x00, 0x61, 0xFF, 13 | 0xC1, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x18, 0x03, 0x00, 0xD0, 0xFE, 0xC0, 14 | 0x01, 0x80, 0x80, 0xC0, 0x40, 0x60, 0x30, 0x10, 0x18, 0x08, 0x0C, 0x06, 15 | 0x07, 0x83, 0x83, 0xC1, 0xC0, 0xE0, 0x60, 0x00, 0xFF, 0xFC, 0x03, 0xC0, 16 | 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x07, 0xC0, 0x7C, 0x07, 0xC0, 17 | 0x7C, 0x07, 0xC0, 0x7C, 0x07, 0xFF, 0xF0, 0xE6, 0x66, 0x66, 0x66, 0x66, 18 | 0x66, 0xFF, 0xF0, 0xFF, 0xF0, 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 19 | 0x00, 0x3F, 0xFF, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 20 | 0xFF, 0xF0, 0xFF, 0xE0, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 21 | 0x6F, 0xFF, 0x00, 0x70, 0x07, 0x00, 0x70, 0x07, 0x00, 0x70, 0x07, 0xFF, 22 | 0xF0, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00, 23 | 0xE0, 0x1C, 0x03, 0x81, 0xFF, 0xF0, 0x06, 0x00, 0xC0, 0x18, 0xFF, 0xFC, 24 | 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0F, 0xFF, 0x00, 0x30, 25 | 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0xFF, 0xF0, 0xFF, 0xEC, 0x06, 26 | 0xC0, 0x6C, 0x06, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xFF, 0xFC, 0x03, 27 | 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xFF, 0xF0, 0xFF, 0xFC, 0x03, 0xC0, 28 | 0x60, 0x06, 0x00, 0xC0, 0x18, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xE0, 0x1C, 29 | 0x03, 0xC0, 0x38, 0x07, 0x00, 0x70, 0x00, 0x3F, 0xC3, 0x0C, 0x30, 0xC3, 30 | 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC7, 0xFE, 0xE0, 0x7E, 0x07, 0xE0, 0x7E, 31 | 0x07, 0xE0, 0x7E, 0x07, 0xFF, 0xF0, 0xFF, 0xFC, 0x03, 0xC0, 0x3C, 0x03, 32 | 0xC0, 0x3C, 0x03, 0xC0, 0x3F, 0xFF, 0x00, 0x70, 0x07, 0x00, 0x70, 0x07, 33 | 0x00, 0x70, 0x07, 0x00, 0x70, 0xC3, 0xC3, 0x40, 0x00, 0x00, 0x1C, 0x0F, 34 | 0x07, 0x03, 0x81, 0xC0, 0x38, 0x01, 0xE0, 0x0F, 0x00, 0x38, 0x01, 0x80, 35 | 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x1C, 0x01, 0xE0, 0x07, 36 | 0x00, 0x38, 0x01, 0xC0, 0x38, 0x3C, 0x1E, 0x0E, 0x03, 0x00, 0x00, 0xFF, 37 | 0xF8, 0x3E, 0x0F, 0x83, 0x01, 0xC1, 0xF1, 0xE0, 0x60, 0x10, 0x06, 0x01, 38 | 0x80, 0x70, 0x1C, 0x00, 0x01, 0x80, 0x03, 0xF8, 0x03, 0x83, 0x81, 0x80, 39 | 0x30, 0xC0, 0x06, 0x60, 0x01, 0xD8, 0x7A, 0x3C, 0x33, 0x8F, 0x18, 0x63, 40 | 0xC4, 0x10, 0xF1, 0x0C, 0x2C, 0x43, 0x1B, 0x11, 0xCC, 0x63, 0xDE, 0x18, 41 | 0x00, 0x03, 0x00, 0x20, 0x70, 0x30, 0x03, 0xF0, 0x00, 0x7F, 0xF3, 0x01, 42 | 0x98, 0x0C, 0xC0, 0x66, 0x03, 0x30, 0x19, 0x80, 0xDF, 0xFE, 0xE0, 0x3F, 43 | 0x01, 0xF8, 0x0F, 0xC0, 0x7E, 0x03, 0xF0, 0x1F, 0x80, 0xE0, 0xFF, 0xEC, 44 | 0x06, 0xC0, 0x6C, 0x06, 0xC0, 0x6C, 0x06, 0xC0, 0x6F, 0xFE, 0xE0, 0x3E, 45 | 0x03, 0xE0, 0x3E, 0x03, 0xE0, 0x3E, 0x03, 0xFF, 0xF0, 0xFF, 0xFC, 0x07, 46 | 0xC0, 0x7C, 0x07, 0xC0, 0x0C, 0x00, 0xC0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 47 | 0xE0, 0x3E, 0x03, 0xE0, 0x3E, 0x03, 0xFF, 0xF0, 0xFF, 0xFC, 0x03, 0xC0, 48 | 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3E, 0x03, 0xE0, 0x3E, 0x03, 0xE0, 49 | 0x3E, 0x03, 0xE0, 0x3E, 0x03, 0xFF, 0xF0, 0xFF, 0xE0, 0x30, 0x18, 0x0C, 50 | 0x06, 0x03, 0x01, 0xFF, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, 0xFE, 51 | 0xFF, 0xE0, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0xFF, 0xE0, 0x70, 0x38, 52 | 0x1C, 0x0E, 0x07, 0x03, 0x80, 0xFF, 0xFC, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 53 | 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xE0, 0x0E, 0x1F, 0xE0, 0x3E, 0x03, 0xE0, 54 | 0x3E, 0x03, 0xFF, 0xF0, 0x60, 0x33, 0x01, 0x98, 0x0C, 0xC0, 0x66, 0x03, 55 | 0x30, 0x19, 0x80, 0xDF, 0xFF, 0xE0, 0x3F, 0x01, 0xF8, 0x0F, 0xC0, 0x7E, 56 | 0x03, 0xF0, 0x1F, 0x80, 0xE0, 0xDB, 0x6D, 0xB7, 0xFF, 0xFF, 0xF8, 0x00, 57 | 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x01, 0xC0, 0x7C, 58 | 0x1F, 0x07, 0xC1, 0xF0, 0x7F, 0xFC, 0x60, 0x36, 0x03, 0x60, 0x36, 0x03, 59 | 0x60, 0x36, 0x03, 0x60, 0x3F, 0xFF, 0xE0, 0x3E, 0x03, 0xE0, 0x3E, 0x03, 60 | 0xE0, 0x3E, 0x03, 0xE0, 0x30, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 61 | 0x06, 0x03, 0x80, 0xE0, 0x38, 0x0E, 0x03, 0x80, 0xE0, 0x38, 0x0F, 0xFC, 62 | 0xFF, 0xFF, 0x0C, 0x3C, 0x30, 0xF0, 0xC3, 0xC3, 0x0F, 0x0C, 0x3C, 0x30, 63 | 0xF8, 0xC3, 0xE3, 0x0F, 0x8C, 0x3E, 0x30, 0xF8, 0xC3, 0xE3, 0x0F, 0x8C, 64 | 0x3E, 0x30, 0xC0, 0xC0, 0x3E, 0x03, 0xF0, 0x3F, 0x03, 0xD8, 0x3C, 0xC3, 65 | 0xCC, 0x3E, 0x63, 0xE2, 0x3E, 0x33, 0xE1, 0xBE, 0x0B, 0xE0, 0xFE, 0x07, 66 | 0xE0, 0x30, 0xFF, 0xFC, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 67 | 0x3C, 0x07, 0xC0, 0x7C, 0x07, 0xC0, 0x7C, 0x07, 0xC0, 0x7C, 0x07, 0xFF, 68 | 0xF0, 0xFF, 0xFC, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3F, 69 | 0xFF, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x00, 70 | 0xFF, 0xFC, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 71 | 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC1, 0xFC, 0x3F, 0xFF, 0xF0, 0x1C, 72 | 0xFF, 0xCC, 0x0C, 0xC0, 0xCC, 0x0C, 0xC0, 0xCC, 0x0C, 0xC0, 0xCF, 0xFF, 73 | 0xE0, 0x3E, 0x03, 0xE0, 0x3E, 0x03, 0xE0, 0x3E, 0x03, 0xE0, 0x30, 0xFF, 74 | 0xFC, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x0C, 0x00, 0xC0, 0x0F, 0xFF, 0x00, 75 | 0x70, 0x07, 0x00, 0x7C, 0x07, 0xC0, 0x7C, 0x07, 0xFF, 0xF0, 0xFF, 0xF0, 76 | 0x7F, 0x07, 0xF0, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 77 | 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0xC0, 0x3C, 0x03, 78 | 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xE0, 0x3E, 0x03, 79 | 0xE0, 0x3E, 0x03, 0xE0, 0x3E, 0x03, 0xFF, 0xF0, 0xC0, 0x3C, 0x02, 0x40, 80 | 0x66, 0x06, 0x60, 0x42, 0x0C, 0x30, 0xC3, 0x08, 0x11, 0x81, 0x98, 0x19, 81 | 0x00, 0xB0, 0x0F, 0x00, 0xE0, 0x06, 0x00, 0xC3, 0x0F, 0x0C, 0x3C, 0x30, 82 | 0xF0, 0xC3, 0xC3, 0x0F, 0x0C, 0x3C, 0x30, 0xF0, 0xC3, 0xE3, 0x0F, 0x8C, 83 | 0x3E, 0x30, 0xF8, 0xC3, 0xE3, 0x0F, 0x8C, 0x3F, 0xFF, 0xC0, 0xC0, 0x7C, 84 | 0x07, 0xC0, 0x7E, 0x06, 0x30, 0xC1, 0x98, 0x0F, 0x00, 0x60, 0x0F, 0x01, 85 | 0x98, 0x30, 0xC6, 0x07, 0xE0, 0x3E, 0x03, 0xE0, 0x30, 0xC0, 0x3C, 0x03, 86 | 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3F, 0xFF, 0x06, 0x00, 0x60, 87 | 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0xFF, 0xFC, 0x07, 0xC0, 88 | 0xE0, 0x0C, 0x01, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3E, 0x07, 0xC0, 0x78, 89 | 0x0F, 0x03, 0xF0, 0x3E, 0x03, 0xFF, 0xF0, 0xFC, 0xCC, 0xCC, 0xCC, 0xCC, 90 | 0xCC, 0xCC, 0xF0, 0x80, 0xC0, 0xC0, 0x40, 0x60, 0x20, 0x30, 0x10, 0x18, 91 | 0x18, 0x18, 0x1C, 0x1C, 0x0E, 0x0E, 0x07, 0x02, 0xF3, 0x33, 0x33, 0x33, 92 | 0x33, 0x33, 0x33, 0xF0, 0x06, 0x01, 0xC0, 0x6C, 0x18, 0xC6, 0x0D, 0x80, 93 | 0xC0, 0xFF, 0xC0, 0x88, 0x80, 0xFF, 0x80, 0x60, 0x18, 0x06, 0xFF, 0xB8, 94 | 0x6E, 0x1B, 0x86, 0xE1, 0xBF, 0xF0, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x07, 95 | 0xFF, 0x87, 0xC3, 0xE1, 0xF0, 0xF8, 0x7C, 0x3E, 0x1F, 0x0F, 0xFE, 0xFF, 96 | 0xE1, 0xF0, 0xF8, 0x0C, 0x06, 0x03, 0x01, 0x83, 0xC1, 0xFF, 0xC0, 0x01, 97 | 0x80, 0xC0, 0x60, 0x30, 0x1F, 0xFF, 0x87, 0xC3, 0xE1, 0xF0, 0xF8, 0x7C, 98 | 0x3E, 0x1F, 0x0F, 0xFE, 0xFF, 0xE0, 0xF0, 0x78, 0x3F, 0xFE, 0x03, 0x01, 99 | 0x83, 0xC1, 0xFF, 0xC0, 0x7F, 0xB0, 0xD8, 0x0C, 0x06, 0x07, 0xE1, 0x80, 100 | 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xFF, 0xE1, 0xB0, 101 | 0xD8, 0x6C, 0x37, 0xF9, 0x80, 0xC0, 0x60, 0x7F, 0xB8, 0xDC, 0x6E, 0x37, 102 | 0xF8, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x07, 0xFF, 0x87, 0xC3, 0xE1, 0xF0, 103 | 0xF8, 0x7C, 0x3E, 0x1F, 0x0F, 0x86, 0xC0, 0x6D, 0xB7, 0xFF, 0xFE, 0x03, 104 | 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 105 | 0x07, 0x07, 0xC7, 0xFF, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x0F, 0x87, 106 | 0xC3, 0xE1, 0xFF, 0xF8, 0x7C, 0x3E, 0x1F, 0x0F, 0x86, 0xDB, 0x6D, 0xB6, 107 | 0xDF, 0xFF, 0xF8, 0xFF, 0xFC, 0x63, 0xC6, 0x3C, 0x63, 0xC6, 0x3E, 0x63, 108 | 0xE6, 0x3E, 0x63, 0xE6, 0x3E, 0x63, 0xFF, 0xE0, 0xF0, 0x78, 0x3C, 0x1F, 109 | 0x0F, 0x87, 0xC3, 0xE1, 0xF0, 0xC0, 0xFF, 0xE0, 0xF0, 0x78, 0x3C, 0x3E, 110 | 0x1F, 0x0F, 0x87, 0xC3, 0xFF, 0xC0, 0xFF, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 111 | 0x0F, 0x07, 0x83, 0xC1, 0xFF, 0xF8, 0x1C, 0x0E, 0x07, 0x00, 0xFF, 0xE0, 112 | 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xFF, 0xC0, 0xE0, 0x70, 113 | 0x38, 0x1C, 0xFF, 0x8F, 0x1E, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC0, 0xFF, 114 | 0xE0, 0xF0, 0x78, 0x0F, 0xF8, 0x1C, 0x0F, 0x87, 0xC3, 0xFF, 0xC0, 0x61, 115 | 0x86, 0x3F, 0x7D, 0xF6, 0x18, 0x61, 0x86, 0x18, 0x78, 0xC1, 0xE0, 0xF0, 116 | 0x78, 0x3C, 0x1F, 0x0F, 0x87, 0xC3, 0xE1, 0xFF, 0xC0, 0xC0, 0xA0, 0xD8, 117 | 0x6C, 0x23, 0x31, 0x90, 0x58, 0x3C, 0x1C, 0x06, 0x00, 0xC6, 0x3C, 0x63, 118 | 0xC6, 0x3C, 0x63, 0xC6, 0x3E, 0x63, 0xE6, 0x3E, 0x63, 0xE6, 0x3F, 0xFF, 119 | 0xC3, 0xC3, 0x62, 0x36, 0x1C, 0x1C, 0x36, 0x62, 0xE1, 0xE1, 0xC1, 0xE0, 120 | 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xFF, 0xC0, 0xE0, 0x70, 121 | 0x38, 0x1C, 0xFF, 0xE1, 0xB1, 0xC1, 0xC3, 0xC1, 0xE1, 0xE1, 0xE0, 0xE1, 122 | 0xFF, 0xC0, 0x0E, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x31, 0xC0, 0xC0, 123 | 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x38, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 124 | 0xC0, 0xF0, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x0C, 0x07, 0x0C, 125 | 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x38, 0xF0, 0x3C, 0x0A, 0x38, 0xA0, 126 | 0x78 }; 127 | 128 | const GFXglyph Bitwise_m19x10pt7bGlyphs[] PROGMEM = { 129 | { 0, 1, 1, 9, 0, 0 }, // 0x20 ' ' 130 | { 1, 3, 15, 5, 1, -14 }, // 0x21 '!' 131 | { 7, 5, 5, 6, 0, -14 }, // 0x22 '"' 132 | { 11, 13, 15, 15, 1, -14 }, // 0x23 '#' 133 | { 36, 12, 17, 14, 1, -15 }, // 0x24 '$' 134 | { 62, 7, 15, 8, 1, -14 }, // 0x25 '%' 135 | { 76, 12, 15, 14, 1, -14 }, // 0x26 '&' 136 | { 99, 2, 5, 3, 0, -14 }, // 0x27 ''' 137 | { 101, 4, 15, 6, 1, -14 }, // 0x28 '(' 138 | { 109, 4, 15, 6, 1, -14 }, // 0x29 ')' 139 | { 117, 8, 7, 10, 1, -14 }, // 0x2A '*' 140 | { 124, 11, 12, 16, 2, -11 }, // 0x2B '+' 141 | { 141, 2, 2, 7, 2, 0 }, // 0x2C ',' 142 | { 142, 7, 1, 9, 1, -5 }, // 0x2D '-' 143 | { 143, 2, 1, 7, 2, 0 }, // 0x2E '.' 144 | { 144, 9, 17, 8, -1, -14 }, // 0x2F '/' 145 | { 164, 12, 15, 14, 1, -14 }, // 0x30 '0' 146 | { 187, 4, 15, 14, 5, -14 }, // 0x31 '1' 147 | { 195, 12, 15, 14, 1, -14 }, // 0x32 '2' 148 | { 218, 12, 15, 14, 1, -14 }, // 0x33 '3' 149 | { 241, 11, 15, 14, 1, -14 }, // 0x34 '4' 150 | { 262, 12, 15, 14, 1, -14 }, // 0x35 '5' 151 | { 285, 12, 15, 14, 1, -14 }, // 0x36 '6' 152 | { 308, 12, 15, 14, 1, -14 }, // 0x37 '7' 153 | { 331, 12, 15, 14, 1, -14 }, // 0x38 '8' 154 | { 354, 12, 15, 14, 1, -14 }, // 0x39 '9' 155 | { 377, 2, 4, 4, 1, -3 }, // 0x3A ':' 156 | { 378, 2, 5, 4, 1, -3 }, // 0x3B ';' 157 | { 380, 11, 11, 16, 2, -11 }, // 0x3C '<' 158 | { 396, 11, 5, 16, 2, -8 }, // 0x3D '=' 159 | { 403, 11, 11, 16, 2, -11 }, // 0x3E '>' 160 | { 419, 10, 15, 12, 1, -14 }, // 0x3F '?' 161 | { 438, 18, 17, 20, 1, -14 }, // 0x40 '@' 162 | { 477, 13, 15, 15, 1, -14 }, // 0x41 'A' 163 | { 502, 12, 15, 14, 1, -14 }, // 0x42 'B' 164 | { 525, 12, 15, 14, 1, -14 }, // 0x43 'C' 165 | { 548, 12, 15, 14, 1, -14 }, // 0x44 'D' 166 | { 571, 9, 15, 11, 1, -14 }, // 0x45 'E' 167 | { 588, 9, 15, 11, 1, -14 }, // 0x46 'F' 168 | { 605, 12, 15, 14, 1, -14 }, // 0x47 'G' 169 | { 628, 13, 15, 15, 1, -14 }, // 0x48 'H' 170 | { 653, 3, 15, 5, 1, -14 }, // 0x49 'I' 171 | { 659, 10, 15, 12, 1, -14 }, // 0x4A 'J' 172 | { 678, 12, 15, 14, 1, -14 }, // 0x4B 'K' 173 | { 701, 10, 15, 12, 1, -14 }, // 0x4C 'L' 174 | { 720, 14, 15, 16, 1, -14 }, // 0x4D 'M' 175 | { 747, 12, 15, 14, 1, -14 }, // 0x4E 'N' 176 | { 770, 12, 15, 14, 1, -14 }, // 0x4F 'O' 177 | { 793, 12, 15, 14, 1, -14 }, // 0x50 'P' 178 | { 816, 12, 16, 14, 1, -14 }, // 0x51 'Q' 179 | { 840, 12, 15, 14, 1, -14 }, // 0x52 'R' 180 | { 863, 12, 15, 14, 1, -14 }, // 0x53 'S' 181 | { 886, 12, 15, 13, 0, -14 }, // 0x54 'T' 182 | { 909, 12, 15, 14, 1, -14 }, // 0x55 'U' 183 | { 932, 12, 15, 12, 0, -14 }, // 0x56 'V' 184 | { 955, 14, 15, 16, 1, -14 }, // 0x57 'W' 185 | { 982, 12, 15, 14, 1, -14 }, // 0x58 'X' 186 | { 1005, 12, 15, 14, 1, -14 }, // 0x59 'Y' 187 | { 1028, 12, 15, 14, 1, -14 }, // 0x5A 'Z' 188 | { 1051, 4, 15, 6, 1, -14 }, // 0x5B '[' 189 | { 1059, 8, 17, 8, 1, -14 }, // 0x5C '\' 190 | { 1076, 4, 15, 6, 1, -14 }, // 0x5D ']' 191 | { 1084, 11, 6, 20, 4, -14 }, // 0x5E '^' 192 | { 1093, 10, 1, 11, 0, 5 }, // 0x5F '_' 193 | { 1095, 3, 3, 10, 3, -13 }, // 0x60 '`' 194 | { 1097, 10, 10, 11, 1, -9 }, // 0x61 'a' 195 | { 1110, 9, 15, 11, 1, -14 }, // 0x62 'b' 196 | { 1127, 9, 10, 11, 1, -9 }, // 0x63 'c' 197 | { 1139, 9, 15, 11, 1, -14 }, // 0x64 'd' 198 | { 1156, 9, 10, 11, 1, -9 }, // 0x65 'e' 199 | { 1168, 9, 15, 7, 1, -14 }, // 0x66 'f' 200 | { 1185, 9, 14, 10, 1, -9 }, // 0x67 'g' 201 | { 1201, 9, 15, 11, 1, -14 }, // 0x68 'h' 202 | { 1218, 3, 13, 5, 1, -12 }, // 0x69 'i' 203 | { 1223, 8, 17, 5, -4, -12 }, // 0x6A 'j' 204 | { 1240, 9, 15, 11, 1, -14 }, // 0x6B 'k' 205 | { 1257, 3, 15, 5, 1, -14 }, // 0x6C 'l' 206 | { 1263, 12, 10, 14, 1, -9 }, // 0x6D 'm' 207 | { 1278, 9, 10, 11, 1, -9 }, // 0x6E 'n' 208 | { 1290, 9, 10, 11, 1, -9 }, // 0x6F 'o' 209 | { 1302, 9, 14, 11, 1, -9 }, // 0x70 'p' 210 | { 1318, 9, 14, 11, 1, -9 }, // 0x71 'q' 211 | { 1334, 7, 10, 9, 1, -9 }, // 0x72 'r' 212 | { 1343, 9, 10, 11, 1, -9 }, // 0x73 's' 213 | { 1355, 6, 13, 7, 1, -12 }, // 0x74 't' 214 | { 1365, 9, 10, 11, 1, -9 }, // 0x75 'u' 215 | { 1377, 9, 10, 10, 0, -9 }, // 0x76 'v' 216 | { 1389, 12, 10, 14, 1, -9 }, // 0x77 'w' 217 | { 1404, 8, 10, 10, 1, -9 }, // 0x78 'x' 218 | { 1414, 9, 14, 11, 1, -9 }, // 0x79 'y' 219 | { 1430, 9, 10, 10, 1, -9 }, // 0x7A 'z' 220 | { 1442, 7, 19, 10, 1, -14 }, // 0x7B '{' 221 | { 1459, 2, 21, 10, 4, -16 }, // 0x7C '|' 222 | { 1465, 8, 19, 10, 1, -14 }, // 0x7D '}' 223 | { 1484, 13, 3, 17, 2, -7 } }; // 0x7E '~' 224 | 225 | const GFXfont Bitwise_m19x10pt7b PROGMEM = { 226 | (uint8_t *)Bitwise_m19x10pt7bBitmaps, 227 | (GFXglyph *)Bitwise_m19x10pt7bGlyphs, 228 | 0x20, 0x7E, 20 }; 229 | 230 | // Approx. 2161 bytes 231 | -------------------------------------------------------------------------------- /src/Fonts/UbuntuMono_B12pt7b.h: -------------------------------------------------------------------------------- 1 | const uint8_t UbuntuMono_B12pt7bBitmaps[] PROGMEM = { 2 | 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x0F, 0xF8, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 3 | 0xE7, 0x42, 0x0C, 0x60, 0xC6, 0x0C, 0x61, 0x8C, 0xFF, 0xFF, 0xFF, 0x18, 4 | 0xC3, 0x18, 0x31, 0x8F, 0xFF, 0xFF, 0xF3, 0x18, 0x63, 0x06, 0x30, 0x63, 5 | 0x00, 0x1C, 0x07, 0x03, 0xF9, 0xFE, 0xE0, 0x38, 0x0E, 0x03, 0xE0, 0x7E, 6 | 0x07, 0xE0, 0x3C, 0x07, 0x01, 0xD0, 0x7F, 0xF9, 0xFC, 0x1C, 0x07, 0x01, 7 | 0xC0, 0x78, 0x6F, 0xCC, 0xCD, 0xCC, 0xD8, 0xCF, 0x0F, 0xF0, 0x7E, 0x00, 8 | 0xE0, 0x0D, 0xE1, 0xBF, 0x1B, 0x33, 0x33, 0x73, 0x36, 0x3F, 0xC1, 0xE0, 9 | 0x1C, 0x07, 0xC1, 0xDC, 0x3B, 0x87, 0x70, 0xEC, 0x0F, 0x81, 0xC6, 0x7C, 10 | 0xDD, 0xDB, 0x1F, 0x61, 0xCE, 0x3C, 0xFF, 0x8F, 0x98, 0xFF, 0xFF, 0xD0, 11 | 0x02, 0x0F, 0x1E, 0x3C, 0x38, 0x70, 0x70, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 12 | 0xE0, 0xE0, 0x70, 0x70, 0x38, 0x3C, 0x1E, 0x0F, 0x02, 0x40, 0xF0, 0x78, 13 | 0x3C, 0x1C, 0x0E, 0x0E, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x0E, 14 | 0x0E, 0x1C, 0x3C, 0x78, 0xF0, 0x40, 0x1C, 0x0E, 0x17, 0x5D, 0x7F, 0xF8, 15 | 0xE0, 0xD8, 0xEE, 0x34, 0x00, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x0F, 0xFF, 16 | 0xFF, 0xC3, 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x33, 0xDE, 0x71, 0x9B, 0x98, 17 | 0xFF, 0xFF, 0xF8, 0x6F, 0xF6, 0x01, 0xC0, 0xF0, 0x38, 0x0E, 0x07, 0x81, 18 | 0xC0, 0x70, 0x1C, 0x0E, 0x03, 0x80, 0xE0, 0x70, 0x1C, 0x07, 0x03, 0x80, 19 | 0xE0, 0x38, 0x1C, 0x07, 0x01, 0xC0, 0xE0, 0x00, 0x1E, 0x0F, 0xC7, 0x3B, 20 | 0x86, 0xE1, 0xF8, 0x7E, 0xDF, 0xB7, 0xED, 0xF8, 0x7E, 0x1F, 0x8E, 0x73, 21 | 0x8F, 0xC1, 0xE0, 0x0E, 0x07, 0x83, 0xE3, 0xF8, 0xFE, 0x13, 0x80, 0xE0, 22 | 0x38, 0x0E, 0x03, 0x80, 0xE0, 0x38, 0x0E, 0x1F, 0xF7, 0xFC, 0x3E, 0x3F, 23 | 0xC6, 0x78, 0x0E, 0x03, 0x81, 0xE0, 0x70, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 24 | 0xC0, 0xE0, 0x3F, 0xFF, 0xFC, 0x7E, 0x3F, 0xC4, 0x78, 0x0E, 0x03, 0x81, 25 | 0xE1, 0xF0, 0x7C, 0x03, 0x80, 0x70, 0x1C, 0x07, 0x03, 0xFF, 0xE7, 0xE0, 26 | 0x03, 0x80, 0xF0, 0x3E, 0x0F, 0xC1, 0xB8, 0x77, 0x1C, 0xE3, 0x9C, 0xE3, 27 | 0x9F, 0xFF, 0xFF, 0x81, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x3F, 0x9F, 0xE7, 28 | 0x01, 0xC0, 0x70, 0x1F, 0x87, 0xF0, 0x1E, 0x03, 0xC0, 0x70, 0x1C, 0x07, 29 | 0x03, 0xBF, 0xEF, 0xE0, 0x07, 0x87, 0xE3, 0xC1, 0xC0, 0x70, 0x3B, 0x0F, 30 | 0xFB, 0xCE, 0xE1, 0xF8, 0x7E, 0x1F, 0x87, 0x73, 0x9F, 0xE1, 0xE0, 0xFF, 31 | 0xFF, 0xC0, 0xE0, 0xE0, 0xE0, 0x70, 0x70, 0x38, 0x18, 0x1C, 0x0E, 0x07, 32 | 0x07, 0x03, 0x81, 0xC0, 0x1F, 0x1F, 0xE7, 0x1F, 0x87, 0xE1, 0xDC, 0xE7, 33 | 0xF0, 0xFC, 0x77, 0xB8, 0xFE, 0x1F, 0x87, 0xF3, 0xDF, 0xE3, 0xF0, 0x1E, 34 | 0x1F, 0xE7, 0x3B, 0x87, 0xE1, 0xF8, 0x7E, 0x1D, 0xEF, 0x7F, 0xC3, 0x70, 35 | 0x38, 0x1E, 0x0F, 0x1F, 0x87, 0x00, 0x6F, 0xF6, 0x00, 0x06, 0xFF, 0x60, 36 | 0x33, 0xDE, 0x60, 0x00, 0x0E, 0x7B, 0xCE, 0x33, 0x73, 0x00, 0x00, 0x81, 37 | 0xF1, 0xFD, 0xF8, 0xF8, 0x3E, 0x07, 0xE0, 0x7F, 0x03, 0xC0, 0x20, 0xFF, 38 | 0xFF, 0xF0, 0x00, 0x00, 0xFF, 0xFF, 0xF0, 0x40, 0x3E, 0x0F, 0xE0, 0x7E, 39 | 0x07, 0xC1, 0xF1, 0xFB, 0xF8, 0xF8, 0x10, 0x00, 0x7C, 0xFE, 0x07, 0x07, 40 | 0x07, 0x0F, 0x1E, 0x3C, 0x3C, 0x38, 0x00, 0x00, 0x38, 0x38, 0x38, 0x0F, 41 | 0x07, 0xF9, 0xC3, 0x30, 0x36, 0x3F, 0x8F, 0xF3, 0x9E, 0x63, 0xCC, 0x79, 42 | 0x8F, 0x31, 0xE7, 0x3C, 0x7E, 0xC7, 0xD8, 0x01, 0xC0, 0x1F, 0xE0, 0xFC, 43 | 0x0F, 0x00, 0xF0, 0x0F, 0x81, 0xF8, 0x1F, 0x81, 0x98, 0x39, 0xC3, 0x9C, 44 | 0x39, 0xC7, 0x9E, 0x7F, 0xE7, 0xFE, 0x70, 0xEF, 0x0F, 0xE0, 0x70, 0xFE, 45 | 0x3F, 0xCE, 0x3B, 0x8E, 0xE3, 0xB9, 0xEF, 0xF3, 0xFC, 0xE3, 0xB8, 0x7E, 46 | 0x1F, 0x87, 0xE3, 0xFF, 0xEF, 0xE0, 0x0F, 0x8F, 0xF7, 0x89, 0xC0, 0xE0, 47 | 0x38, 0x0E, 0x03, 0x80, 0xE0, 0x38, 0x0E, 0x01, 0xC0, 0x78, 0x8F, 0xF1, 48 | 0xF8, 0xFC, 0x3F, 0xCE, 0x7B, 0x8E, 0xE1, 0xF8, 0x7E, 0x1F, 0x87, 0xE1, 49 | 0xF8, 0x7E, 0x1F, 0x8E, 0xE7, 0xBF, 0xCF, 0xC0, 0xFF, 0x7F, 0xB8, 0x1C, 50 | 0x0E, 0x07, 0x03, 0xFD, 0xFE, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0xFF, 51 | 0xFE, 0xFF, 0xFF, 0xF8, 0x1C, 0x0E, 0x07, 0x03, 0xFD, 0xFE, 0xE0, 0x70, 52 | 0x38, 0x1C, 0x0E, 0x07, 0x03, 0x80, 0x0F, 0xCF, 0xF7, 0x89, 0xC0, 0xE0, 53 | 0x38, 0x0E, 0x03, 0x87, 0xE1, 0xF8, 0x7E, 0x1D, 0xC7, 0x71, 0xCF, 0xF1, 54 | 0xFC, 0xE1, 0xF8, 0x7E, 0x1F, 0x87, 0xE1, 0xF8, 0x7F, 0xFF, 0xFF, 0xE1, 55 | 0xF8, 0x7E, 0x1F, 0x87, 0xE1, 0xF8, 0x7E, 0x1C, 0xFF, 0xFF, 0xC7, 0x03, 56 | 0x81, 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, 0x81, 0xC7, 0xFF, 57 | 0xFE, 0x3F, 0xCF, 0xF0, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1C, 0x07, 0x01, 58 | 0xC0, 0x70, 0x1C, 0x07, 0x43, 0xBF, 0xE7, 0xE0, 0xE1, 0xDC, 0x73, 0x8E, 59 | 0x73, 0x8E, 0xE1, 0xDC, 0x3F, 0x07, 0xE0, 0xFE, 0x1D, 0xE3, 0x9E, 0x71, 60 | 0xCE, 0x1D, 0xC3, 0xB8, 0x38, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, 61 | 0x81, 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0xFF, 0xFE, 0x61, 0x98, 62 | 0x67, 0x39, 0xCE, 0xD2, 0xBF, 0xAF, 0xFF, 0xFF, 0xED, 0xFB, 0x7E, 0x1F, 63 | 0x87, 0xE1, 0xF8, 0x7E, 0x1C, 0xE1, 0xFC, 0x7F, 0x1F, 0xC7, 0xF9, 0xFE, 64 | 0x7E, 0xDF, 0xB7, 0xE7, 0xF9, 0xFE, 0x7F, 0x8F, 0xE3, 0xF8, 0x7E, 0x1C, 65 | 0x1E, 0x0F, 0xC7, 0x39, 0x86, 0xE1, 0xF8, 0x7E, 0x1F, 0x87, 0xE1, 0xF8, 66 | 0x7E, 0x1D, 0x86, 0x73, 0x8F, 0xC1, 0xE0, 0xFE, 0x3F, 0xEE, 0x3F, 0x87, 67 | 0xE1, 0xF8, 0x7E, 0x1F, 0xCE, 0xFF, 0xBF, 0x8E, 0x03, 0x80, 0xE0, 0x38, 68 | 0x0E, 0x00, 0x1E, 0x0F, 0xC7, 0x39, 0x86, 0xE1, 0xF8, 0x7E, 0x1F, 0x87, 69 | 0xE1, 0xF8, 0x7E, 0x1F, 0x86, 0x73, 0x9F, 0xC1, 0xE0, 0x30, 0x0F, 0x01, 70 | 0xF0, 0x18, 0xFE, 0x3F, 0xEE, 0x3F, 0x87, 0xE1, 0xF8, 0x7E, 0x3B, 0xFC, 71 | 0xFE, 0x3B, 0x8E, 0x73, 0x9C, 0xE3, 0xB8, 0xEE, 0x1C, 0x3F, 0x1F, 0xEF, 72 | 0x13, 0x80, 0xE0, 0x3C, 0x07, 0xC0, 0xFC, 0x07, 0x80, 0xF0, 0x1C, 0x07, 73 | 0x43, 0xFF, 0xE7, 0xF0, 0xFF, 0xFF, 0xFC, 0x38, 0x07, 0x00, 0xE0, 0x1C, 74 | 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x1C, 0x03, 75 | 0x80, 0xE1, 0xF8, 0x7E, 0x1F, 0x87, 0xE1, 0xF8, 0x7E, 0x1F, 0x87, 0xE1, 76 | 0xF8, 0x7E, 0x1F, 0x87, 0xF3, 0xDF, 0xE3, 0xF0, 0xE0, 0xFC, 0x1D, 0x83, 77 | 0x38, 0xE7, 0x1C, 0xE3, 0x9C, 0x71, 0x8C, 0x3B, 0x87, 0x70, 0x6C, 0x0D, 78 | 0x81, 0xF0, 0x1C, 0x03, 0x80, 0xE1, 0xF8, 0x7E, 0x1F, 0x87, 0xE1, 0xFB, 79 | 0x7E, 0xDF, 0xFF, 0xDF, 0xF7, 0xBD, 0x2D, 0xCF, 0x73, 0x98, 0xE6, 0x18, 80 | 0x70, 0xF3, 0x0E, 0x39, 0xE1, 0x9C, 0x1F, 0x80, 0xF8, 0x0F, 0x00, 0xF0, 81 | 0x1F, 0x81, 0xF8, 0x39, 0xC3, 0x9C, 0x70, 0xE7, 0x0E, 0xF0, 0xF0, 0xE0, 82 | 0xEE, 0x39, 0xC7, 0x38, 0xE3, 0xB8, 0x77, 0x06, 0xC0, 0xF8, 0x0E, 0x01, 83 | 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0xFF, 0xFF, 0xF0, 0x3C, 84 | 0x1E, 0x07, 0x03, 0xC0, 0xE0, 0x78, 0x3C, 0x0E, 0x07, 0x81, 0xC0, 0xF0, 85 | 0x3F, 0xFF, 0xFC, 0xFF, 0xFE, 0x38, 0xE3, 0x8E, 0x38, 0xE3, 0x8E, 0x38, 86 | 0xE3, 0x8E, 0x38, 0xE3, 0x8E, 0x3F, 0xFC, 0xE0, 0x3C, 0x07, 0x01, 0xC0, 87 | 0x78, 0x0E, 0x03, 0x80, 0xF0, 0x1C, 0x07, 0x01, 0xE0, 0x38, 0x0E, 0x03, 88 | 0xC0, 0x70, 0x1C, 0x07, 0x80, 0xE0, 0x38, 0x0F, 0x01, 0xC0, 0xFF, 0xF1, 89 | 0xC7, 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x1C, 0x71, 90 | 0xFF, 0xFC, 0x0F, 0x00, 0xF0, 0x1F, 0x83, 0x9C, 0x78, 0xE7, 0x0E, 0x20, 91 | 0x40, 0xFF, 0xFF, 0xFF, 0x47, 0x9E, 0x20, 0x7F, 0x1F, 0xE0, 0x3C, 0x07, 92 | 0x3F, 0xDF, 0xFF, 0x1F, 0x87, 0xE1, 0xDF, 0xF3, 0xFC, 0xE0, 0x38, 0x0E, 93 | 0x03, 0x80, 0xE0, 0x38, 0x0E, 0xF3, 0xFE, 0xF3, 0xB8, 0x7E, 0x1F, 0x87, 94 | 0xE1, 0xF8, 0x7E, 0x3B, 0xFE, 0x7E, 0x00, 0x1F, 0xCF, 0xF7, 0x83, 0x80, 95 | 0xE0, 0x38, 0x0E, 0x03, 0x80, 0x70, 0x0F, 0xF1, 0xFC, 0x03, 0x81, 0xC0, 96 | 0xE0, 0x70, 0x38, 0x1C, 0xEE, 0xFF, 0xF3, 0xF1, 0xF8, 0xFC, 0x7E, 0x3F, 97 | 0x1D, 0xCE, 0xFF, 0x1F, 0x80, 0x1E, 0x0F, 0xE7, 0x3B, 0x87, 0xE1, 0xFF, 98 | 0xFF, 0xFF, 0x80, 0x70, 0x9F, 0xE1, 0xF8, 0x07, 0xE3, 0xFC, 0x70, 0x1C, 99 | 0x03, 0x80, 0x70, 0x3F, 0xF7, 0xFE, 0x38, 0x07, 0x00, 0xE0, 0x1C, 0x03, 100 | 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x00, 0x1F, 0xDF, 0xF7, 0x1F, 0x87, 101 | 0xE1, 0xF8, 0x7E, 0x1F, 0xC7, 0x7F, 0xCF, 0xF0, 0x1C, 0x07, 0x43, 0x9F, 102 | 0xE7, 0xE0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, 0xF9, 0xFE, 0xE3, 103 | 0xF1, 0xF8, 0xFC, 0x7E, 0x3F, 0x1F, 0x8F, 0xC7, 0xE3, 0x80, 0x18, 0x0F, 104 | 0x03, 0xC0, 0x60, 0x00, 0x3F, 0x0F, 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xC0, 105 | 0x70, 0x1C, 0x07, 0x01, 0xC4, 0x3F, 0x07, 0xC0, 0x06, 0x0F, 0x0F, 0x06, 106 | 0x00, 0xFF, 0xFF, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 107 | 0x07, 0x07, 0x87, 0xFE, 0x7C, 0xE0, 0x38, 0x0E, 0x03, 0x80, 0xE0, 0x38, 108 | 0x0E, 0x7B, 0x9C, 0xEE, 0x3B, 0x0F, 0xC3, 0xF0, 0xEE, 0x3B, 0xCE, 0x73, 109 | 0x8E, 0xE3, 0xC0, 0xFC, 0x3F, 0x01, 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xC0, 110 | 0x70, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xC4, 0x3F, 0x07, 111 | 0xC0, 0xFF, 0xBF, 0xFE, 0xDF, 0xB7, 0xED, 0xFB, 0x7E, 0xDF, 0x87, 0xE1, 112 | 0xF8, 0x7E, 0x1C, 0xFE, 0x7F, 0xB8, 0xFC, 0x7E, 0x3F, 0x1F, 0x8F, 0xC7, 113 | 0xE3, 0xF1, 0xF8, 0xE0, 0x1E, 0x1F, 0xE7, 0x3B, 0x87, 0xE1, 0xF8, 0x7E, 114 | 0x1F, 0x87, 0x73, 0x9F, 0xE1, 0xE0, 0xFC, 0x7F, 0xB9, 0xDC, 0x7E, 0x3F, 115 | 0x1F, 0x8F, 0xC7, 0xE7, 0x7F, 0xBF, 0x9C, 0x0E, 0x07, 0x03, 0x80, 0x1F, 116 | 0xDF, 0xF7, 0x1F, 0x87, 0xE1, 0xF8, 0x7E, 0x1F, 0x87, 0x71, 0xDF, 0xF3, 117 | 0xFC, 0x07, 0x01, 0xC0, 0x70, 0x1C, 0x7F, 0xFF, 0xF8, 0x1C, 0x0E, 0x07, 118 | 0x03, 0x81, 0xC0, 0xE0, 0x70, 0x38, 0x00, 0x3F, 0x9F, 0xEE, 0x0B, 0x80, 119 | 0xFC, 0x1F, 0xE0, 0xFC, 0x07, 0xC1, 0xFF, 0xE7, 0xF0, 0x1C, 0x07, 0x01, 120 | 0xC3, 0xFF, 0xFF, 0xC7, 0x01, 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xC0, 0x71, 121 | 0x1F, 0xC3, 0xF0, 0xE1, 0xF8, 0x7E, 0x1F, 0x87, 0xE1, 0xF8, 0x7E, 0x1F, 122 | 0x87, 0xF1, 0xDF, 0xF3, 0xF8, 0xE0, 0xEE, 0x1D, 0xC7, 0x38, 0xE3, 0x1C, 123 | 0x77, 0x0E, 0xE0, 0xD8, 0x1F, 0x01, 0xC0, 0x38, 0x00, 0xC0, 0x3C, 0x03, 124 | 0xCE, 0x3C, 0xE3, 0xCF, 0x36, 0xF6, 0x7B, 0x67, 0xBE, 0x79, 0xE7, 0x1E, 125 | 0x70, 0xC0, 0xF0, 0xF7, 0x8E, 0x3D, 0xC1, 0xF8, 0x0F, 0x80, 0xF0, 0x0F, 126 | 0x81, 0xFC, 0x39, 0xC7, 0x0E, 0xF0, 0x70, 0x70, 0xEE, 0x1C, 0xE7, 0x1C, 127 | 0xE3, 0x9C, 0x33, 0x07, 0x60, 0x7C, 0x0F, 0x00, 0xE0, 0x1C, 0x07, 0x0F, 128 | 0xE1, 0xF8, 0x3E, 0x00, 0xFF, 0xFF, 0x0F, 0x1E, 0x1C, 0x38, 0x38, 0x70, 129 | 0xE0, 0xFF, 0xFF, 0x07, 0xC3, 0xF1, 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xC0, 130 | 0x70, 0x1C, 0x06, 0x0F, 0x03, 0xE0, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1C, 131 | 0x07, 0x01, 0xC0, 0x7F, 0x0F, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 132 | 0xFF, 0xFE, 0xF0, 0xF8, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 133 | 0x0F, 0x1F, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0xF8, 0xF0, 0x38, 134 | 0x4F, 0x9F, 0xFF, 0xF3, 0xE4, 0x38 }; 135 | 136 | const GFXglyph UbuntuMono_B12pt7bGlyphs[] PROGMEM = { 137 | { 0, 1, 1, 12, 0, 0 }, // 0x20 ' ' 138 | { 1, 3, 15, 12, 4, -14 }, // 0x21 '!' 139 | { 7, 8, 7, 12, 2, -15 }, // 0x22 '"' 140 | { 14, 12, 15, 12, 0, -14 }, // 0x23 '#' 141 | { 37, 10, 19, 12, 1, -16 }, // 0x24 '$' 142 | { 61, 12, 15, 12, 0, -14 }, // 0x25 '%' 143 | { 84, 11, 15, 12, 1, -14 }, // 0x26 '&' 144 | { 105, 3, 7, 12, 3, -15 }, // 0x27 ''' 145 | { 108, 8, 21, 12, 2, -16 }, // 0x28 '(' 146 | { 129, 8, 21, 12, 2, -16 }, // 0x29 ')' 147 | { 150, 9, 9, 12, 1, -14 }, // 0x2A '*' 148 | { 161, 11, 10, 12, 1, -10 }, // 0x2B '+' 149 | { 175, 5, 8, 12, 3, -3 }, // 0x2C ',' 150 | { 180, 7, 3, 12, 3, -7 }, // 0x2D '-' 151 | { 183, 4, 4, 12, 4, -3 }, // 0x2E '.' 152 | { 185, 10, 21, 12, 1, -16 }, // 0x2F '/' 153 | { 212, 10, 15, 12, 1, -14 }, // 0x30 '0' 154 | { 231, 10, 15, 12, 1, -14 }, // 0x31 '1' 155 | { 250, 10, 15, 12, 1, -14 }, // 0x32 '2' 156 | { 269, 10, 15, 12, 1, -14 }, // 0x33 '3' 157 | { 288, 11, 15, 12, 1, -14 }, // 0x34 '4' 158 | { 309, 10, 15, 12, 1, -14 }, // 0x35 '5' 159 | { 328, 10, 15, 12, 1, -14 }, // 0x36 '6' 160 | { 347, 9, 15, 12, 1, -14 }, // 0x37 '7' 161 | { 364, 10, 15, 12, 1, -14 }, // 0x38 '8' 162 | { 383, 10, 15, 12, 1, -14 }, // 0x39 '9' 163 | { 402, 4, 11, 12, 4, -10 }, // 0x3A ':' 164 | { 408, 5, 15, 12, 3, -10 }, // 0x3B ';' 165 | { 418, 10, 10, 12, 1, -10 }, // 0x3C '<' 166 | { 431, 10, 6, 12, 1, -9 }, // 0x3D '=' 167 | { 439, 10, 10, 12, 1, -10 }, // 0x3E '>' 168 | { 452, 8, 15, 12, 2, -14 }, // 0x3F '?' 169 | { 467, 11, 18, 12, 0, -14 }, // 0x40 '@' 170 | { 492, 12, 15, 12, 0, -14 }, // 0x41 'A' 171 | { 515, 10, 15, 12, 1, -14 }, // 0x42 'B' 172 | { 534, 10, 15, 12, 1, -14 }, // 0x43 'C' 173 | { 553, 10, 15, 12, 1, -14 }, // 0x44 'D' 174 | { 572, 9, 15, 12, 2, -14 }, // 0x45 'E' 175 | { 589, 9, 15, 12, 2, -14 }, // 0x46 'F' 176 | { 606, 10, 15, 12, 1, -14 }, // 0x47 'G' 177 | { 625, 10, 15, 12, 1, -14 }, // 0x48 'H' 178 | { 644, 9, 15, 12, 1, -14 }, // 0x49 'I' 179 | { 661, 10, 15, 12, 1, -14 }, // 0x4A 'J' 180 | { 680, 11, 15, 12, 1, -14 }, // 0x4B 'K' 181 | { 701, 9, 15, 12, 2, -14 }, // 0x4C 'L' 182 | { 718, 10, 15, 12, 1, -14 }, // 0x4D 'M' 183 | { 737, 10, 15, 12, 1, -14 }, // 0x4E 'N' 184 | { 756, 10, 15, 12, 1, -14 }, // 0x4F 'O' 185 | { 775, 10, 15, 12, 1, -14 }, // 0x50 'P' 186 | { 794, 10, 19, 12, 1, -14 }, // 0x51 'Q' 187 | { 818, 10, 15, 12, 1, -14 }, // 0x52 'R' 188 | { 837, 10, 15, 12, 1, -14 }, // 0x53 'S' 189 | { 856, 11, 15, 12, 1, -14 }, // 0x54 'T' 190 | { 877, 10, 15, 12, 1, -14 }, // 0x55 'U' 191 | { 896, 11, 15, 12, 0, -14 }, // 0x56 'V' 192 | { 917, 10, 15, 12, 1, -14 }, // 0x57 'W' 193 | { 936, 12, 15, 12, 0, -14 }, // 0x58 'X' 194 | { 959, 11, 15, 12, 1, -14 }, // 0x59 'Y' 195 | { 980, 10, 15, 12, 1, -14 }, // 0x5A 'Z' 196 | { 999, 6, 21, 12, 3, -16 }, // 0x5B '[' 197 | { 1015, 10, 21, 12, 1, -16 }, // 0x5C '\' 198 | { 1042, 6, 21, 12, 3, -16 }, // 0x5D ']' 199 | { 1058, 12, 7, 12, 0, -14 }, // 0x5E '^' 200 | { 1069, 12, 2, 12, 0, 3 }, // 0x5F '_' 201 | { 1072, 5, 4, 12, 4, -16 }, // 0x60 '`' 202 | { 1075, 10, 11, 12, 1, -10 }, // 0x61 'a' 203 | { 1089, 10, 17, 12, 1, -16 }, // 0x62 'b' 204 | { 1111, 10, 11, 12, 1, -10 }, // 0x63 'c' 205 | { 1125, 9, 17, 12, 1, -16 }, // 0x64 'd' 206 | { 1145, 10, 11, 12, 1, -10 }, // 0x65 'e' 207 | { 1159, 11, 17, 12, 1, -16 }, // 0x66 'f' 208 | { 1183, 10, 15, 12, 1, -10 }, // 0x67 'g' 209 | { 1202, 9, 17, 12, 2, -16 }, // 0x68 'h' 210 | { 1222, 10, 17, 12, 1, -16 }, // 0x69 'i' 211 | { 1244, 8, 21, 12, 2, -16 }, // 0x6A 'j' 212 | { 1265, 10, 17, 12, 2, -16 }, // 0x6B 'k' 213 | { 1287, 10, 17, 12, 1, -16 }, // 0x6C 'l' 214 | { 1309, 10, 11, 12, 1, -10 }, // 0x6D 'm' 215 | { 1323, 9, 11, 12, 2, -10 }, // 0x6E 'n' 216 | { 1336, 10, 11, 12, 1, -10 }, // 0x6F 'o' 217 | { 1350, 9, 15, 12, 2, -10 }, // 0x70 'p' 218 | { 1367, 10, 15, 12, 1, -10 }, // 0x71 'q' 219 | { 1386, 9, 11, 12, 2, -10 }, // 0x72 'r' 220 | { 1399, 10, 11, 12, 1, -10 }, // 0x73 's' 221 | { 1413, 10, 14, 12, 1, -13 }, // 0x74 't' 222 | { 1431, 10, 11, 12, 1, -10 }, // 0x75 'u' 223 | { 1445, 11, 11, 12, 0, -10 }, // 0x76 'v' 224 | { 1461, 12, 11, 12, 0, -10 }, // 0x77 'w' 225 | { 1478, 12, 11, 12, 0, -10 }, // 0x78 'x' 226 | { 1495, 11, 15, 12, 0, -10 }, // 0x79 'y' 227 | { 1516, 8, 11, 12, 2, -10 }, // 0x7A 'z' 228 | { 1527, 10, 21, 12, 2, -16 }, // 0x7B '{' 229 | { 1554, 3, 21, 12, 5, -16 }, // 0x7C '|' 230 | { 1562, 8, 21, 12, 2, -16 }, // 0x7D '}' 231 | { 1583, 11, 5, 12, 1, -8 } }; // 0x7E '~' 232 | 233 | const GFXfont UbuntuMono_B12pt7b PROGMEM = { 234 | (uint8_t *)UbuntuMono_B12pt7bBitmaps, 235 | (GFXglyph *)UbuntuMono_B12pt7bGlyphs, 236 | 0x20, 0x7E, 24 }; 237 | 238 | // Approx. 2262 bytes 239 | -------------------------------------------------------------------------------- /src/Fonts/Okuda_A5PL16pt7b.h: -------------------------------------------------------------------------------- 1 | const uint8_t Okuda_A5PL16pt7bBitmaps[] PROGMEM = { 2 | 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xC0, 0x6F, 0x3D, 0xB6, 0x33, 0x06, 3 | 0x60, 0xCC, 0x7F, 0xFF, 0xFE, 0x66, 0x0C, 0xC1, 0x98, 0xFF, 0xFF, 0xFC, 4 | 0xCC, 0x19, 0x80, 0x31, 0xEF, 0xF3, 0xCF, 0x0C, 0x30, 0xE1, 0xC3, 0x8E, 5 | 0x1C, 0x30, 0xC3, 0xCF, 0x3F, 0xDE, 0x30, 0x7C, 0x7F, 0xE6, 0xC6, 0xEC, 6 | 0x6E, 0xC7, 0xCC, 0x7C, 0xC7, 0x8F, 0xF8, 0x7F, 0x80, 0x70, 0x0F, 0x00, 7 | 0xFE, 0x0F, 0xF1, 0xF3, 0x1F, 0x33, 0xF3, 0x3B, 0x37, 0xB3, 0x73, 0x36, 8 | 0x3F, 0xE1, 0xE0, 0x70, 0xF0, 0xC0, 0xC0, 0xC0, 0xC6, 0xC6, 0xC6, 0xC6, 9 | 0x7F, 0x7F, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xFC, 0x7C, 10 | 0x7B, 0x60, 0x39, 0x8C, 0xE6, 0x33, 0x98, 0xC6, 0x31, 0x8C, 0x63, 0x18, 11 | 0xC6, 0x30, 0xC6, 0x31, 0xC6, 0x30, 0xC0, 0xC3, 0x18, 0xE3, 0x18, 0xC3, 12 | 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0xC6, 0x63, 0x19, 0xCC, 0x66, 0x00, 13 | 0x00, 0x10, 0x00, 0x00, 0x60, 0x00, 0x00, 0xA0, 0x00, 0x02, 0xC0, 0x00, 14 | 0x05, 0x40, 0x00, 0x0A, 0x80, 0x00, 0x25, 0x00, 0x00, 0x49, 0x00, 0x07, 15 | 0x13, 0x80, 0x32, 0x24, 0xC0, 0xC5, 0xF4, 0x62, 0x11, 0xC8, 0x24, 0x23, 16 | 0x90, 0x50, 0x45, 0x10, 0x61, 0x00, 0x20, 0xC2, 0x00, 0x41, 0x84, 0x1E, 17 | 0x82, 0x88, 0x42, 0x89, 0x21, 0x03, 0x31, 0x44, 0x06, 0xC1, 0x90, 0x07, 18 | 0x01, 0x60, 0x18, 0x03, 0x3F, 0xD0, 0x0C, 0x00, 0x00, 0x08, 0x00, 0x00, 19 | 0x00, 0x00, 0x00, 0x30, 0x63, 0xFF, 0xF3, 0x06, 0x0C, 0x00, 0x7B, 0x60, 20 | 0xFF, 0xFC, 0xF0, 0x0E, 0x18, 0x30, 0x61, 0xC3, 0x06, 0x0C, 0x38, 0x70, 21 | 0xC1, 0x83, 0x0E, 0x18, 0x30, 0x60, 0xC3, 0x86, 0x0C, 0x00, 0x7D, 0xFB, 22 | 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xC7, 0x8F, 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 23 | 0xC7, 0x8F, 0x1F, 0xE7, 0xC0, 0x33, 0xFF, 0x33, 0x33, 0x33, 0x33, 0x33, 24 | 0x33, 0x33, 0x33, 0x30, 0x7D, 0xFB, 0x1E, 0x3C, 0x78, 0xC1, 0x83, 0x06, 25 | 0x1C, 0x71, 0xC3, 0x8E, 0x38, 0x60, 0xC1, 0x83, 0x07, 0xFF, 0xE0, 0x7D, 26 | 0xFF, 0x1E, 0x3C, 0x78, 0xC1, 0x83, 0x06, 0x78, 0xF0, 0x30, 0x60, 0xC1, 27 | 0xE3, 0xC7, 0x8F, 0x1F, 0xE7, 0xC0, 0x03, 0x01, 0xC0, 0x70, 0x1C, 0x0F, 28 | 0x03, 0xC1, 0xF0, 0x6C, 0x1B, 0x0E, 0xC3, 0x31, 0xCC, 0x63, 0x18, 0xCF, 29 | 0xFF, 0xFF, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xFF, 0xFF, 0x06, 30 | 0x0C, 0x18, 0x30, 0x7C, 0xFD, 0x8C, 0x18, 0x30, 0x60, 0xC1, 0xE3, 0xC7, 31 | 0x8F, 0x1B, 0xE7, 0xC0, 0x7D, 0xFF, 0x1E, 0x3C, 0x78, 0x30, 0x7C, 0xFD, 32 | 0x8F, 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xC7, 0x8F, 0x1F, 0xE7, 0xC0, 0xFF, 33 | 0xFF, 0x03, 0x07, 0x07, 0x06, 0x06, 0x0E, 0x0E, 0x0C, 0x0C, 0x0C, 0x1C, 34 | 0x1C, 0x18, 0x18, 0x38, 0x38, 0x30, 0x30, 0x30, 0x7D, 0xFB, 0x1E, 0x3C, 35 | 0x78, 0xF1, 0xE3, 0xC6, 0xF9, 0xF6, 0x3C, 0x78, 0xF1, 0xE3, 0xC7, 0x8F, 36 | 0x1F, 0xE7, 0xC0, 0x7D, 0xFB, 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xC7, 0x8F, 37 | 0x1B, 0xF7, 0xE0, 0xC1, 0xE3, 0xC7, 0x8F, 0x1F, 0xE7, 0xC0, 0xF0, 0x00, 38 | 0x0F, 0x6C, 0x00, 0x00, 0x03, 0xEC, 0x0E, 0x18, 0x70, 0xC3, 0x8E, 0x18, 39 | 0x70, 0xE0, 0xC1, 0xC1, 0xC1, 0x83, 0x83, 0x07, 0xFF, 0xFC, 0x00, 0x00, 40 | 0x1F, 0xFF, 0x80, 0xE0, 0xC1, 0xC1, 0xC1, 0x83, 0x83, 0x07, 0x0E, 0x18, 41 | 0x70, 0xC3, 0x8E, 0x18, 0x70, 0x7B, 0xFC, 0xF3, 0xCF, 0x30, 0xC3, 0x0C, 42 | 0x31, 0xC6, 0x18, 0xE3, 0x0C, 0x30, 0x00, 0x0C, 0x30, 0x7F, 0x9F, 0xEC, 43 | 0x0F, 0x03, 0xC1, 0xF1, 0xFC, 0xFF, 0x7F, 0xD8, 0xF6, 0x3D, 0x8F, 0x63, 44 | 0xD8, 0xF7, 0xFC, 0xFF, 0x00, 0xC0, 0x1F, 0xE7, 0xF8, 0x1C, 0x0E, 0x07, 45 | 0x03, 0xC3, 0xE1, 0xF0, 0xF8, 0x7C, 0x3E, 0x1F, 0x0D, 0x86, 0xE7, 0x73, 46 | 0xB9, 0xFC, 0xFE, 0x73, 0x31, 0x98, 0xCC, 0x7E, 0x38, 0xFE, 0xFE, 0xC3, 47 | 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xFE, 0xFE, 0xC3, 0xC3, 0xC3, 0xC3, 48 | 0xC3, 0xC3, 0xC3, 0xC3, 0xFE, 0xFE, 0x7E, 0xFF, 0xC3, 0xC3, 0xC3, 0xC0, 49 | 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC3, 0xC3, 50 | 0xC3, 0xFF, 0x7E, 0xFE, 0xFE, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 51 | 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xFE, 0xFE, 52 | 0xFF, 0xFF, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xFC, 0xFC, 0xC0, 53 | 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 54 | 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xFC, 0xFC, 0xC0, 0xC0, 0xC0, 0xC0, 55 | 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x7E, 0xFF, 0xC3, 0xC3, 0xC3, 0xC0, 56 | 0xC0, 0xC0, 0xC0, 0xC0, 0xCF, 0xCF, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 57 | 0xC3, 0x7F, 0x7F, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 58 | 0xFF, 0xFF, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 59 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 60 | 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0xC3, 0xC3, 61 | 0xC3, 0xFE, 0x7E, 0xC7, 0xC6, 0xCE, 0xDC, 0xDC, 0xF8, 0xF8, 0xF0, 0xE0, 62 | 0xE0, 0xE0, 0xF0, 0xF0, 0xF8, 0xF8, 0xDC, 0xDC, 0xCC, 0xCE, 0xC6, 0xC7, 63 | 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18, 64 | 0x30, 0x60, 0xC1, 0x83, 0x07, 0xFF, 0xE0, 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 65 | 0x7F, 0x0F, 0xE3, 0xFC, 0x7F, 0x8F, 0xF1, 0xFF, 0x7F, 0x6D, 0xED, 0xBD, 66 | 0xB7, 0xBE, 0xF7, 0xDE, 0xFB, 0xCE, 0x79, 0xCF, 0x39, 0xE7, 0x3C, 0xE6, 67 | 0xE3, 0xE3, 0xE3, 0xE3, 0xF3, 0xF3, 0xF3, 0xF3, 0xFB, 0xDB, 0xDB, 0xDB, 68 | 0xDF, 0xCF, 0xCF, 0xCF, 0xCF, 0xC7, 0xC7, 0xC7, 0xC7, 0x7E, 0xFE, 0xC3, 69 | 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 70 | 0xC3, 0xC3, 0xC3, 0xC3, 0xFE, 0x7E, 0xFE, 0xFE, 0xC3, 0xC3, 0xC3, 0xC3, 71 | 0xC3, 0xC3, 0xC3, 0xC3, 0xFE, 0xFC, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 72 | 0xC0, 0xC0, 0xC0, 0x7E, 0x7E, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 73 | 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xFF, 0x7E, 74 | 0x1C, 0x1F, 0x1F, 0xFC, 0xFC, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 75 | 0xC6, 0xFC, 0xFC, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 76 | 0x7E, 0xFF, 0xC3, 0xC3, 0xC3, 0xC0, 0xC0, 0xE0, 0x60, 0x78, 0x1C, 0x0E, 77 | 0x07, 0x03, 0x03, 0x03, 0xC3, 0xC3, 0xC3, 0xFE, 0x7E, 0xFF, 0xFF, 0x18, 78 | 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 79 | 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 80 | 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 81 | 0xC3, 0xFE, 0x7E, 0xE3, 0xB1, 0xD8, 0xCE, 0x67, 0x33, 0xB9, 0xDC, 0xEE, 82 | 0x77, 0x1B, 0x8D, 0x87, 0xC3, 0xE1, 0xF0, 0xF8, 0x7C, 0x3E, 0x0F, 0x07, 83 | 0x03, 0x81, 0xC0, 0xE3, 0x8C, 0xC7, 0x19, 0x8E, 0x33, 0x9C, 0xE7, 0x39, 84 | 0xCE, 0xF3, 0x9D, 0xF7, 0x3B, 0xEE, 0x77, 0xD8, 0x6F, 0xB0, 0xDF, 0x61, 85 | 0xF7, 0xC3, 0xEF, 0x87, 0xDF, 0x0F, 0xBE, 0x1F, 0x7C, 0x3E, 0xF0, 0x3D, 86 | 0xE0, 0x73, 0xC0, 0xE3, 0x81, 0xC7, 0x00, 0x63, 0xB1, 0x9D, 0xCE, 0xE3, 87 | 0x71, 0xF0, 0xF8, 0x7C, 0x1C, 0x0E, 0x07, 0x03, 0x81, 0xC1, 0xF0, 0xF8, 88 | 0x7C, 0x37, 0x3B, 0x9D, 0xCC, 0x66, 0x38, 0xE7, 0xE7, 0x66, 0x6E, 0x7E, 89 | 0x7E, 0x3C, 0x3C, 0x3C, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 90 | 0x18, 0x18, 0x18, 0x18, 0xFF, 0xFF, 0x07, 0x07, 0x06, 0x0E, 0x0E, 0x0C, 91 | 0x1C, 0x1C, 0x18, 0x38, 0x38, 0x30, 0x70, 0x70, 0x60, 0xE0, 0xE0, 0xFF, 92 | 0xFF, 0xFF, 0xFC, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 93 | 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xFF, 0xF0, 0xC1, 0x83, 0x83, 94 | 0x06, 0x0C, 0x18, 0x38, 0x30, 0x60, 0xC1, 0xC3, 0x83, 0x06, 0x0C, 0x1C, 95 | 0x18, 0x30, 0x60, 0xE0, 0xFF, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0xC6, 0x31, 96 | 0x8C, 0x63, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0xFF, 0xC0, 0x38, 0xDB, 0x98, 97 | 0xFF, 0xFF, 0xFC, 0x20, 0xF3, 0xF0, 0x70, 0x7D, 0xFB, 0x1E, 0x3C, 0x60, 98 | 0xCF, 0xBF, 0xFF, 0x8F, 0x1E, 0x3C, 0x78, 0xF1, 0xBF, 0x7E, 0xC1, 0x83, 99 | 0x06, 0x0F, 0xDF, 0xB1, 0xE3, 0xC7, 0x8F, 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 100 | 0xC7, 0x8F, 0x1F, 0xEF, 0xC0, 0x7D, 0xFB, 0x1E, 0x3C, 0x78, 0xF0, 0x60, 101 | 0xC1, 0x83, 0x06, 0x3C, 0x78, 0xF1, 0xFE, 0x7C, 0x06, 0x0C, 0x18, 0x37, 102 | 0xEF, 0xF1, 0xE3, 0xC7, 0x8F, 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xC7, 0x8F, 103 | 0x1B, 0xF7, 0xE0, 0x7D, 0xFF, 0x1E, 0x3C, 0x78, 0xF1, 0xFF, 0xFF, 0x83, 104 | 0x06, 0x3C, 0x78, 0xF1, 0xFE, 0x7C, 0x19, 0xCC, 0x6F, 0xFC, 0xC6, 0x31, 105 | 0x8C, 0x63, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x00, 0x3E, 0xFF, 0x1E, 0x3C, 106 | 0x78, 0xF1, 0xE3, 0xC7, 0x8F, 0x1E, 0x3C, 0x78, 0xF1, 0xBF, 0x7E, 0x0F, 107 | 0x1E, 0x3F, 0xCF, 0x80, 0xC1, 0x83, 0x06, 0x0F, 0xDF, 0xB1, 0xE3, 0xC7, 108 | 0x8F, 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xC7, 0x8F, 0x1E, 0x3C, 0x60, 0xF0, 109 | 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x18, 0xC0, 0x01, 0x8C, 0x63, 0x18, 0xC6, 110 | 0x31, 0x8C, 0x63, 0x18, 0xC6, 0x31, 0x8C, 0x7F, 0xF8, 0xC1, 0x83, 0x06, 111 | 0x0C, 0x79, 0xB3, 0x6C, 0xD9, 0xE3, 0xC7, 0x8F, 0x1E, 0x3C, 0x7C, 0xD9, 112 | 0xB3, 0x36, 0x6C, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, 0xEF, 113 | 0xFE, 0xC6, 0x3C, 0x63, 0xC6, 0x3C, 0x63, 0xC6, 0x3C, 0x63, 0xC6, 0x3C, 114 | 0x63, 0xC6, 0x3C, 0x63, 0xC6, 0x3C, 0x63, 0xC6, 0x3C, 0x63, 0xC6, 0x30, 115 | 0xFD, 0xFB, 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xC7, 0x8F, 0x1E, 0x3C, 0x78, 116 | 0xF1, 0xE3, 0xC6, 0x7D, 0xFB, 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xC7, 0x8F, 117 | 0x1E, 0x3C, 0x78, 0xF1, 0xFE, 0x7C, 0xFD, 0xFB, 0x1E, 0x3C, 0x78, 0xF1, 118 | 0xE3, 0xC7, 0x8F, 0x1E, 0x3C, 0x78, 0xF1, 0xFE, 0xFD, 0x83, 0x06, 0x0C, 119 | 0x00, 0x7E, 0xFF, 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xC7, 0x8F, 0x1E, 0x3C, 120 | 0x78, 0xF1, 0xBF, 0x7E, 0x0C, 0x18, 0x30, 0x60, 0xFD, 0xFB, 0x1E, 0x3C, 121 | 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0x7C, 122 | 0xFF, 0x1E, 0x3C, 0x78, 0x18, 0x38, 0x38, 0x38, 0x30, 0x7C, 0x78, 0xF1, 123 | 0xFE, 0x7C, 0x31, 0x8C, 0x6F, 0xFC, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0xC6, 124 | 0x31, 0x8C, 0x73, 0x80, 0xC7, 0x8F, 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xC7, 125 | 0x8F, 0x1E, 0x3C, 0x78, 0xF1, 0xBF, 0x7E, 0xC7, 0xC6, 0xE6, 0xE6, 0xE6, 126 | 0x6E, 0x6E, 0x6C, 0x6C, 0x7C, 0x7C, 0x3C, 0x3C, 0x38, 0x38, 0x38, 0x38, 127 | 0xCE, 0x79, 0xCF, 0x39, 0xF7, 0x3E, 0xEE, 0xDD, 0xDB, 0xB3, 0x7E, 0x7F, 128 | 0xCF, 0x79, 0xEF, 0x3D, 0xE7, 0xBC, 0x77, 0x0E, 0xE1, 0xDC, 0x31, 0x80, 129 | 0xC7, 0xE6, 0x66, 0x6E, 0x6C, 0x3C, 0x3C, 0x38, 0x38, 0x38, 0x3C, 0x7C, 130 | 0x6C, 0x6C, 0x66, 0xE6, 0xC6, 0xE3, 0xE3, 0xE7, 0x67, 0x66, 0x66, 0x76, 131 | 0x76, 0x36, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x1C, 0x18, 0x18, 0x18, 0x18, 132 | 0xF8, 0xF0, 0xFF, 0xFC, 0x38, 0x70, 0xC3, 0x87, 0x0C, 0x38, 0x61, 0xC3, 133 | 0x86, 0x1C, 0x38, 0x7F, 0xFE, 0x1C, 0xF3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 134 | 0xC3, 0x0C, 0xE3, 0x83, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x3C, 135 | 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xE3, 0x83, 0x0C, 0x30, 136 | 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x1C, 0x73, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 137 | 0xC3, 0x0C, 0xE3, 0x80, 0x7B, 0x7F, 0xBB, 0x80 }; 138 | 139 | const GFXglyph Okuda_A5PL16pt7bGlyphs[] PROGMEM = { 140 | { 0, 1, 1, 8, 0, 0 }, // 0x20 ' ' 141 | { 1, 2, 21, 4, 1, -20 }, // 0x21 '!' 142 | { 7, 6, 4, 8, 1, -22 }, // 0x22 '"' 143 | { 10, 11, 12, 13, 1, -19 }, // 0x23 '#' 144 | { 27, 6, 21, 8, 1, -20 }, // 0x24 '$' 145 | { 43, 12, 21, 14, 1, -20 }, // 0x25 '%' 146 | { 75, 8, 21, 9, 1, -20 }, // 0x26 '&' 147 | { 96, 3, 4, 5, 1, -22 }, // 0x27 ''' 148 | { 98, 5, 26, 7, 1, -23 }, // 0x28 '(' 149 | { 115, 5, 26, 7, 1, -23 }, // 0x29 ')' 150 | { 132, 23, 26, 25, 1, -22 }, // 0x2A '*' 151 | { 207, 7, 7, 9, 1, -14 }, // 0x2B '+' 152 | { 214, 3, 4, 5, 1, -2 }, // 0x2C ',' 153 | { 216, 7, 2, 9, 1, -11 }, // 0x2D '-' 154 | { 218, 2, 2, 4, 1, -1 }, // 0x2E '.' 155 | { 219, 7, 21, 8, 1, -20 }, // 0x2F '/' 156 | { 238, 7, 21, 9, 1, -20 }, // 0x30 '0' 157 | { 257, 4, 21, 5, 0, -20 }, // 0x31 '1' 158 | { 268, 7, 21, 9, 1, -20 }, // 0x32 '2' 159 | { 287, 7, 21, 9, 1, -20 }, // 0x33 '3' 160 | { 306, 10, 21, 10, 0, -20 }, // 0x34 '4' 161 | { 333, 7, 21, 9, 1, -20 }, // 0x35 '5' 162 | { 352, 7, 21, 9, 1, -20 }, // 0x36 '6' 163 | { 371, 8, 21, 10, 1, -20 }, // 0x37 '7' 164 | { 392, 7, 21, 9, 1, -20 }, // 0x38 '8' 165 | { 411, 7, 21, 9, 1, -20 }, // 0x39 '9' 166 | { 430, 2, 12, 4, 1, -11 }, // 0x3A ':' 167 | { 433, 3, 13, 5, 1, -11 }, // 0x3B ';' 168 | { 438, 7, 16, 9, 1, -18 }, // 0x3C '<' 169 | { 452, 7, 7, 9, 1, -14 }, // 0x3D '=' 170 | { 459, 7, 16, 9, 1, -18 }, // 0x3E '>' 171 | { 473, 6, 21, 8, 1, -20 }, // 0x3F '?' 172 | { 489, 10, 19, 12, 1, -19 }, // 0x40 '@' 173 | { 513, 9, 21, 9, 0, -20 }, // 0x41 'A' 174 | { 537, 8, 21, 10, 1, -20 }, // 0x42 'B' 175 | { 558, 8, 21, 10, 1, -20 }, // 0x43 'C' 176 | { 579, 8, 21, 10, 1, -20 }, // 0x44 'D' 177 | { 600, 8, 21, 9, 1, -20 }, // 0x45 'E' 178 | { 621, 8, 21, 9, 1, -20 }, // 0x46 'F' 179 | { 642, 8, 21, 10, 1, -20 }, // 0x47 'G' 180 | { 663, 8, 21, 10, 1, -20 }, // 0x48 'H' 181 | { 684, 2, 21, 4, 1, -20 }, // 0x49 'I' 182 | { 690, 8, 21, 10, 1, -20 }, // 0x4A 'J' 183 | { 711, 8, 21, 9, 1, -20 }, // 0x4B 'K' 184 | { 732, 7, 21, 9, 1, -20 }, // 0x4C 'L' 185 | { 751, 11, 21, 13, 1, -20 }, // 0x4D 'M' 186 | { 780, 8, 21, 10, 1, -20 }, // 0x4E 'N' 187 | { 801, 8, 21, 10, 1, -20 }, // 0x4F 'O' 188 | { 822, 8, 21, 10, 1, -20 }, // 0x50 'P' 189 | { 843, 8, 24, 10, 1, -20 }, // 0x51 'Q' 190 | { 867, 8, 21, 9, 1, -20 }, // 0x52 'R' 191 | { 888, 8, 21, 10, 1, -20 }, // 0x53 'S' 192 | { 909, 8, 21, 10, 1, -20 }, // 0x54 'T' 193 | { 930, 8, 21, 10, 1, -20 }, // 0x55 'U' 194 | { 951, 9, 21, 9, 0, -20 }, // 0x56 'V' 195 | { 975, 15, 21, 15, 0, -20 }, // 0x57 'W' 196 | { 1015, 9, 21, 9, 0, -20 }, // 0x58 'X' 197 | { 1039, 8, 21, 8, 0, -20 }, // 0x59 'Y' 198 | { 1060, 8, 21, 10, 1, -20 }, // 0x5A 'Z' 199 | { 1081, 6, 26, 7, 1, -23 }, // 0x5B '[' 200 | { 1101, 7, 21, 8, 1, -20 }, // 0x5C '\' 201 | { 1120, 5, 26, 7, 1, -23 }, // 0x5D ']' 202 | { 1137, 7, 3, 9, 1, -26 }, // 0x5E '^' 203 | { 1140, 11, 2, 11, 1, 3 }, // 0x5F '_' 204 | { 1143, 7, 4, 9, 1, -27 }, // 0x60 '`' 205 | { 1147, 7, 17, 9, 1, -16 }, // 0x61 'a' 206 | { 1162, 7, 21, 9, 1, -20 }, // 0x62 'b' 207 | { 1181, 7, 17, 9, 1, -16 }, // 0x63 'c' 208 | { 1196, 7, 21, 9, 1, -20 }, // 0x64 'd' 209 | { 1215, 7, 17, 9, 1, -16 }, // 0x65 'e' 210 | { 1230, 5, 21, 7, 1, -20 }, // 0x66 'f' 211 | { 1244, 7, 22, 9, 1, -16 }, // 0x67 'g' 212 | { 1264, 7, 21, 9, 1, -20 }, // 0x68 'h' 213 | { 1283, 2, 21, 4, 1, -20 }, // 0x69 'i' 214 | { 1289, 5, 25, 6, 0, -20 }, // 0x6A 'j' 215 | { 1305, 7, 21, 8, 1, -20 }, // 0x6B 'k' 216 | { 1324, 2, 21, 4, 1, -20 }, // 0x6C 'l' 217 | { 1330, 12, 17, 14, 1, -16 }, // 0x6D 'm' 218 | { 1356, 7, 17, 9, 1, -16 }, // 0x6E 'n' 219 | { 1371, 7, 17, 9, 1, -16 }, // 0x6F 'o' 220 | { 1386, 7, 21, 9, 1, -16 }, // 0x70 'p' 221 | { 1405, 7, 21, 9, 1, -16 }, // 0x71 'q' 222 | { 1424, 7, 17, 9, 1, -16 }, // 0x72 'r' 223 | { 1439, 7, 17, 9, 1, -16 }, // 0x73 's' 224 | { 1454, 5, 21, 7, 1, -20 }, // 0x74 't' 225 | { 1468, 7, 17, 9, 1, -16 }, // 0x75 'u' 226 | { 1483, 8, 17, 9, 1, -16 }, // 0x76 'v' 227 | { 1500, 11, 17, 13, 1, -16 }, // 0x77 'w' 228 | { 1524, 8, 17, 9, 1, -16 }, // 0x78 'x' 229 | { 1541, 8, 21, 10, 1, -16 }, // 0x79 'y' 230 | { 1562, 7, 17, 9, 1, -16 }, // 0x7A 'z' 231 | { 1577, 6, 26, 8, 1, -23 }, // 0x7B '{' 232 | { 1597, 2, 26, 4, 1, -23 }, // 0x7C '|' 233 | { 1604, 6, 26, 8, 1, -23 }, // 0x7D '}' 234 | { 1624, 9, 3, 10, 1, -26 } }; // 0x7E '~' 235 | 236 | const GFXfont Okuda_A5PL16pt7b PROGMEM = { 237 | (uint8_t *)Okuda_A5PL16pt7bBitmaps, 238 | (GFXglyph *)Okuda_A5PL16pt7bGlyphs, 239 | 0x20, 0x7E, 36 }; 240 | 241 | // Approx. 2300 bytes 242 | -------------------------------------------------------------------------------- /src/Fonts/Bitwise_m19x12pt7b.h: -------------------------------------------------------------------------------- 1 | const uint8_t Bitwise_m19x12pt7bBitmaps[] PROGMEM = { 2 | 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xEE, 0xFF, 0xFF, 0xEE, 0xE0, 0xFF, 0xFF, 3 | 0xDB, 0x6D, 0xB0, 0x01, 0x8C, 0x01, 0x8C, 0x01, 0x88, 0x03, 0x18, 0x03, 4 | 0x18, 0x3F, 0xFF, 0x3F, 0xFF, 0x06, 0x30, 0x06, 0x20, 0x0C, 0x60, 0xFF, 5 | 0xFC, 0xFF, 0xFC, 0x18, 0xC0, 0x18, 0xC0, 0x19, 0x80, 0x31, 0x80, 0x31, 6 | 0x80, 0x01, 0x03, 0xFF, 0xFF, 0xFF, 0xF0, 0x43, 0xC1, 0x0F, 0x04, 0x0C, 7 | 0x10, 0x30, 0x40, 0xFF, 0xFF, 0xFF, 0xF0, 0x11, 0xC0, 0x47, 0x01, 0x1F, 8 | 0x04, 0x7C, 0x11, 0xF0, 0x47, 0xFF, 0xFF, 0xFF, 0xF0, 0x10, 0x00, 0x40, 9 | 0x01, 0x98, 0xCC, 0xC6, 0x60, 0x30, 0x30, 0x18, 0x18, 0x0C, 0x0E, 0x07, 10 | 0x07, 0x83, 0xC3, 0xDD, 0xEF, 0xE7, 0xF0, 0x00, 0x3F, 0xF0, 0xFF, 0xC3, 11 | 0x03, 0x0C, 0x0C, 0x30, 0x30, 0xC0, 0xC3, 0x03, 0x1F, 0xFC, 0xFF, 0xE3, 12 | 0x80, 0x0E, 0x03, 0xF8, 0x0F, 0xE0, 0x1F, 0x80, 0x7E, 0x01, 0xFF, 0xFF, 13 | 0xFF, 0xFC, 0xFF, 0xB6, 0xC0, 0x03, 0x66, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 14 | 0x46, 0x33, 0x4C, 0x66, 0x33, 0x33, 0x33, 0x33, 0x33, 0x26, 0xCC, 0x18, 15 | 0x18, 0x19, 0xFF, 0x7E, 0x3C, 0x3E, 0x66, 0x03, 0x00, 0x0C, 0x00, 0x30, 16 | 0x00, 0xC0, 0x03, 0x00, 0x0C, 0x0F, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x0C, 17 | 0x00, 0x30, 0x00, 0xC0, 0x03, 0x00, 0x0C, 0x00, 0xF5, 0xFF, 0xFF, 0xF0, 18 | 0x00, 0xC0, 0x30, 0x18, 0x06, 0x01, 0x80, 0xC0, 0x30, 0x18, 0x06, 0x03, 19 | 0x00, 0xC0, 0x30, 0x1C, 0x07, 0x03, 0xC0, 0xF0, 0x78, 0x1E, 0x07, 0x01, 20 | 0x80, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 21 | 0x00, 0xF0, 0x03, 0xC0, 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 22 | 0x00, 0x7C, 0x01, 0xFF, 0xFF, 0xFF, 0xFC, 0xE7, 0x18, 0xC6, 0x31, 0x8C, 23 | 0x63, 0x18, 0xC6, 0x33, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0xC0, 24 | 0x03, 0x00, 0x0C, 0x00, 0x30, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x0C, 25 | 0x00, 0x30, 0x00, 0xC0, 0x03, 0x00, 0x0C, 0x00, 0x3F, 0xFF, 0xFF, 0xFC, 26 | 0xFF, 0xF7, 0xFF, 0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x18, 0x00, 0xDF, 27 | 0xFF, 0xFF, 0xF8, 0x01, 0xC0, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x1C, 0x00, 28 | 0xFF, 0xFF, 0xFF, 0xF8, 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x38, 0x00, 0xE0, 29 | 0x03, 0x80, 0x0E, 0x00, 0x38, 0x00, 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x38, 30 | 0x07, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xC0, 0x07, 0x00, 0x1C, 0xFF, 0xFF, 31 | 0xFF, 0xFC, 0x00, 0x30, 0x00, 0xC0, 0x03, 0x00, 0x0C, 0x00, 0x3F, 0xFF, 32 | 0xFF, 0xFC, 0x00, 0x30, 0x00, 0xC0, 0x03, 0x00, 0x0C, 0x00, 0x30, 0x00, 33 | 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xF3, 0xFF, 0xCC, 0x03, 0x30, 0x0C, 0xC0, 34 | 0x03, 0x00, 0x0C, 0x00, 0x30, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xF0, 35 | 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 36 | 0xFF, 0xFC, 0x01, 0xF0, 0x06, 0xC0, 0x30, 0x01, 0xC0, 0x06, 0x00, 0x70, 37 | 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 38 | 0x1E, 0x00, 0x70, 0x00, 0x3F, 0xF0, 0xFF, 0xC3, 0x03, 0x0C, 0x0C, 0x30, 39 | 0x30, 0xC0, 0xC3, 0x03, 0x0F, 0xFE, 0x7F, 0xFB, 0x80, 0x7E, 0x01, 0xF8, 40 | 0x07, 0xE0, 0x1F, 0x80, 0x7E, 0x01, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 41 | 0xFF, 0xFC, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xFF, 0xFF, 42 | 0xFF, 0xFC, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00, 0x70, 0x01, 43 | 0xC0, 0x07, 0x00, 0x1C, 0xF0, 0xF0, 0xF0, 0xF5, 0x00, 0x0C, 0x00, 0xF0, 44 | 0x0F, 0x01, 0xF0, 0x1E, 0x01, 0xE0, 0x0E, 0x00, 0x3C, 0x00, 0x1E, 0x00, 45 | 0x1E, 0x00, 0x1E, 0x00, 0x1F, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 46 | 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xC0, 0x80, 0x03, 0x80, 0x07, 47 | 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xE0, 0x01, 0xC0, 0x1E, 0x01, 0xE0, 48 | 0x3E, 0x03, 0xC0, 0x3C, 0x00, 0xC0, 0x00, 0xFF, 0xFF, 0xFF, 0xE0, 0x3E, 49 | 0x03, 0xE0, 0x30, 0x07, 0x07, 0xF1, 0xF8, 0x18, 0x01, 0x80, 0x1C, 0x01, 50 | 0xC0, 0x1E, 0x01, 0xE0, 0x00, 0x00, 0xC0, 0x0C, 0x00, 0x00, 0xFE, 0x00, 51 | 0x3F, 0xFC, 0x03, 0xC0, 0x78, 0x38, 0x00, 0xE3, 0x80, 0x03, 0x38, 0x39, 52 | 0x0D, 0x87, 0xE8, 0x7C, 0x31, 0xC3, 0xC3, 0x06, 0x1E, 0x18, 0x20, 0xF0, 53 | 0x81, 0x0D, 0x84, 0x18, 0x6C, 0x20, 0xC6, 0x71, 0x8E, 0x61, 0x87, 0x9E, 54 | 0x0E, 0x00, 0x00, 0x38, 0x00, 0x40, 0xF0, 0x1C, 0x03, 0xFF, 0xC0, 0x03, 55 | 0xF8, 0x00, 0x7F, 0xFC, 0xFF, 0xF9, 0x80, 0x33, 0x00, 0x66, 0x00, 0xCC, 56 | 0x01, 0x98, 0x03, 0x3F, 0xFE, 0xFF, 0xFF, 0xC0, 0x1F, 0x80, 0x3F, 0x00, 57 | 0x7E, 0x00, 0xFC, 0x01, 0xF8, 0x03, 0xF0, 0x07, 0xE0, 0x0E, 0xFF, 0xF3, 58 | 0xFF, 0xCC, 0x03, 0x30, 0x0C, 0xC0, 0x33, 0x00, 0xCC, 0x03, 0x3F, 0xFE, 59 | 0xFF, 0xFF, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0x80, 0x3E, 0x00, 60 | 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFC, 0x01, 0xF0, 0x07, 0xC0, 61 | 0x1F, 0x00, 0x0C, 0x00, 0x30, 0x00, 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x38, 62 | 0x03, 0xE0, 0x0F, 0x80, 0x3E, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFB, 63 | 0xFF, 0xFC, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x03, 64 | 0xE0, 0x0F, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0x80, 0x3E, 0x00, 65 | 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0x00, 0x60, 0x0C, 0x01, 0x80, 66 | 0x30, 0x07, 0xFF, 0xFF, 0xFC, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x38, 67 | 0x07, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFF, 0x00, 0x60, 0x0C, 0x01, 0x80, 68 | 0x30, 0x07, 0xFF, 0xFF, 0xFC, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x38, 69 | 0x07, 0x00, 0xE0, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xF0, 0x03, 0xC0, 70 | 0x0F, 0x00, 0x0C, 0x00, 0x30, 0x00, 0xE0, 0x03, 0x83, 0xFE, 0x0F, 0xF8, 71 | 0x03, 0xE0, 0x0F, 0x80, 0x3E, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x60, 0x0C, 72 | 0xC0, 0x19, 0x80, 0x33, 0x00, 0x66, 0x00, 0xCC, 0x01, 0x98, 0x03, 0x3F, 73 | 0xFE, 0xFF, 0xFF, 0xC0, 0x1F, 0x80, 0x3F, 0x00, 0x7E, 0x00, 0xFC, 0x01, 74 | 0xF8, 0x03, 0xF0, 0x07, 0xE0, 0x0E, 0xDB, 0x6D, 0xB6, 0xFF, 0xFF, 0xFF, 75 | 0xE0, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 76 | 0x03, 0x00, 0x70, 0x07, 0x00, 0x7C, 0x07, 0xC0, 0x7C, 0x07, 0xC0, 0x7F, 77 | 0xFF, 0xFF, 0xF0, 0x60, 0x0D, 0x80, 0x36, 0x00, 0xD8, 0x03, 0x60, 0x0D, 78 | 0x80, 0x36, 0x00, 0xDF, 0xFF, 0xFF, 0xFF, 0x80, 0x3E, 0x00, 0xF8, 0x03, 79 | 0xE0, 0x0F, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x0C, 0x30, 0x01, 0x80, 80 | 0x0C, 0x00, 0x60, 0x03, 0x00, 0x18, 0x00, 0xC0, 0x06, 0x00, 0x70, 0x03, 81 | 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1F, 0xFF, 0x7F, 82 | 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0x83, 0xC1, 0x83, 0xC1, 0x83, 0xC1, 83 | 0x83, 0xC1, 0x83, 0xC1, 0x83, 0xE1, 0x83, 0xE1, 0x83, 0xE1, 0x83, 0xE1, 84 | 0x83, 0xE1, 0x83, 0xE1, 0x83, 0xE1, 0x83, 0xE1, 0x83, 0xE1, 0x83, 0xE0, 85 | 0x0F, 0x80, 0x3F, 0x00, 0xFE, 0x03, 0xD8, 0x0F, 0x70, 0x3C, 0xE0, 0xF1, 86 | 0x83, 0xE3, 0x0F, 0x8E, 0x3E, 0x18, 0xF8, 0x33, 0xE0, 0xEF, 0x81, 0xBE, 87 | 0x03, 0xF8, 0x07, 0xE0, 0x1C, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xF0, 0x03, 88 | 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x1F, 0x00, 0x7C, 0x01, 89 | 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x01, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 90 | 0xFF, 0xFF, 0xFC, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xFF, 91 | 0xFF, 0xFF, 0xFF, 0x80, 0x0E, 0x00, 0x38, 0x00, 0xE0, 0x03, 0x80, 0x0E, 92 | 0x00, 0x38, 0x00, 0xE0, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xF0, 0x03, 93 | 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 94 | 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x0F, 0xFF, 0xFF, 0xFF, 0xFC, 0x03, 95 | 0xC0, 0x0F, 0x00, 0xFF, 0xF3, 0xFF, 0xCC, 0x03, 0x30, 0x0C, 0xC0, 0x33, 96 | 0x00, 0xCC, 0x03, 0x3F, 0xFE, 0xFF, 0xFF, 0x80, 0x3E, 0x00, 0xF8, 0x03, 97 | 0xE0, 0x0F, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x0C, 0xFF, 0xFF, 0xFF, 98 | 0xFC, 0x00, 0xF0, 0x03, 0xC0, 0x03, 0x00, 0x0C, 0x00, 0x3F, 0xFF, 0xFF, 99 | 0xFC, 0x00, 0x70, 0x01, 0xC0, 0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x01, 0xFF, 100 | 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xF0, 0x3F, 0xC0, 0xFF, 0x03, 0x00, 101 | 0x0C, 0x00, 0x30, 0x00, 0xC0, 0x03, 0x00, 0x0C, 0x00, 0x30, 0x00, 0xC0, 102 | 0x03, 0x00, 0x0C, 0x00, 0x30, 0x00, 0xC0, 0x03, 0x00, 0xC0, 0x0F, 0x00, 103 | 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xE0, 104 | 0x0F, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0x80, 0x3E, 0x00, 0xFF, 105 | 0xFF, 0xFF, 0xFC, 0xC0, 0x0F, 0x80, 0x36, 0x01, 0x98, 0x06, 0x30, 0x18, 106 | 0xC0, 0xC3, 0x03, 0x06, 0x0C, 0x18, 0x60, 0x61, 0x80, 0xC6, 0x03, 0x30, 107 | 0x0C, 0xC0, 0x1F, 0x00, 0x78, 0x01, 0xE0, 0x03, 0x00, 0xC1, 0x83, 0xC1, 108 | 0x83, 0xC1, 0x83, 0xC1, 0x83, 0xC1, 0x83, 0xC1, 0x83, 0xC1, 0x83, 0xC1, 109 | 0x83, 0xC1, 0x83, 0xE1, 0x83, 0xE1, 0x83, 0xE1, 0x83, 0xE1, 0x83, 0xE1, 110 | 0x83, 0xE1, 0x83, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x1F, 0x00, 0x7C, 0x01, 111 | 0xF8, 0x06, 0x70, 0x30, 0xE1, 0x81, 0xCC, 0x03, 0xE0, 0x07, 0x00, 0x1E, 112 | 0x00, 0xCE, 0x06, 0x1C, 0x30, 0x39, 0x80, 0x7E, 0x00, 0xF8, 0x03, 0xE0, 113 | 0x0C, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 114 | 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x1C, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00, 115 | 0x1C, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x01, 116 | 0xB0, 0x0C, 0x00, 0x70, 0x03, 0x80, 0x1C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 117 | 0x03, 0xC0, 0x1F, 0x00, 0xF8, 0x0F, 0xC0, 0x3E, 0x00, 0xFF, 0xFF, 0xFF, 118 | 0xFC, 0xFF, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCF, 0xF0, 0xC0, 0x30, 119 | 0x04, 0x01, 0x80, 0x60, 0x0C, 0x03, 0x00, 0x60, 0x18, 0x03, 0x00, 0xC0, 120 | 0x30, 0x1E, 0x07, 0x80, 0xF0, 0x3C, 0x07, 0x81, 0xE0, 0x38, 0x06, 0xFF, 121 | 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x3F, 0xF0, 0x03, 0x00, 0x1E, 0x00, 122 | 0xDC, 0x06, 0x30, 0x30, 0x61, 0x80, 0xCC, 0x01, 0x80, 0xFF, 0xFF, 0xFF, 123 | 0xC6, 0x31, 0xFF, 0xDF, 0xF8, 0x03, 0x00, 0x6F, 0xFD, 0xFF, 0xB8, 0x37, 124 | 0x06, 0xE0, 0xDC, 0x1B, 0xFF, 0xFF, 0xF0, 0xC0, 0x30, 0x0C, 0x03, 0x00, 125 | 0xC0, 0x3F, 0xFF, 0xFF, 0x83, 0xE0, 0xF8, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 126 | 0x3E, 0x0F, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, 0x07, 0xE0, 0xFC, 0x01, 127 | 0x80, 0x30, 0x06, 0x00, 0xC0, 0x78, 0x0F, 0xFF, 0xFF, 0xF0, 0x00, 0xC0, 128 | 0x30, 0x0C, 0x03, 0x00, 0xFF, 0xFF, 0xFF, 0x83, 0xE0, 0xF8, 0x3E, 0x0F, 129 | 0x83, 0xE0, 0xF8, 0x3E, 0x0F, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, 0x81, 130 | 0xF0, 0x3F, 0xFF, 0xFF, 0xF8, 0x07, 0x00, 0xE0, 0x7C, 0x0F, 0xFF, 0xFF, 131 | 0xF0, 0x3F, 0xCF, 0xF3, 0x8C, 0xE0, 0x38, 0x3F, 0x8F, 0xE0, 0xE0, 0x38, 132 | 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x00, 0xFF, 133 | 0xFF, 0xFF, 0x06, 0x60, 0xCC, 0x19, 0x83, 0x3F, 0xE7, 0xFC, 0x30, 0x06, 134 | 0x03, 0xFF, 0x7F, 0xEE, 0x0D, 0xC1, 0xB8, 0x37, 0xFE, 0xFF, 0xC0, 0xC0, 135 | 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x3F, 0xFF, 0xFF, 0x83, 0xE0, 0xF8, 0x3E, 136 | 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x0F, 0x83, 0xE0, 0xC0, 0xCC, 0x00, 0xCC, 137 | 0xCC, 0xCE, 0xEF, 0xFF, 0xFE, 0x01, 0x80, 0xC0, 0x00, 0x00, 0x18, 0x0C, 138 | 0x06, 0x03, 0x01, 0x81, 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, 139 | 0x81, 0xF0, 0xFF, 0xFF, 0xF8, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 140 | 0x3E, 0x0F, 0x83, 0xE0, 0xFF, 0xFF, 0xFF, 0x83, 0xE0, 0xF8, 0x3E, 0x0F, 141 | 0x83, 0xE0, 0xC0, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xEE, 0xFF, 0xFF, 0xF0, 142 | 0xFF, 0xFF, 0xFF, 0xFC, 0x30, 0xF0, 0xC3, 0xC3, 0x0F, 0x0C, 0x3E, 0x30, 143 | 0xF8, 0xC3, 0xE3, 0x0F, 0x8C, 0x3E, 0x30, 0xF8, 0xC3, 0xFF, 0xFF, 0xFC, 144 | 0x0F, 0x03, 0xC0, 0xF0, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x0F, 0x83, 145 | 0xFF, 0xFF, 0xFC, 0x0F, 0x03, 0xC0, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 146 | 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 147 | 0x03, 0xC0, 0xF0, 0x3F, 0xFF, 0xFF, 0xE0, 0x38, 0x0E, 0x03, 0x80, 0xE0, 148 | 0x00, 0xFF, 0xFF, 0xFC, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 149 | 0xF0, 0x3F, 0xFF, 0xFF, 0x01, 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xC0, 0xFF, 150 | 0xFF, 0xF0, 0x78, 0x3C, 0x07, 0x03, 0x81, 0xC0, 0xE0, 0x70, 0x38, 0x1C, 151 | 0x00, 0xFF, 0xFF, 0xFC, 0x0F, 0x03, 0xC0, 0x3F, 0xFF, 0xFC, 0x07, 0xC1, 152 | 0xF0, 0x7F, 0xFF, 0xFF, 0x30, 0x60, 0xC1, 0x8F, 0xFF, 0xCF, 0x98, 0x30, 153 | 0x60, 0xC1, 0x83, 0x06, 0x0F, 0x1E, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 154 | 0xF8, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3F, 0xFF, 0xFF, 0xC0, 0x6C, 0x0D, 155 | 0x83, 0xB0, 0x63, 0x0C, 0x63, 0x06, 0x60, 0xCC, 0x1B, 0x01, 0xE0, 0x38, 156 | 0x07, 0x00, 0xC3, 0x0F, 0x0C, 0x3C, 0x30, 0xF0, 0xC3, 0xC3, 0x0F, 0x8C, 157 | 0x3E, 0x30, 0xF8, 0xC3, 0xE3, 0x0F, 0x8C, 0x3F, 0xFF, 0xFF, 0xFF, 0xC1, 158 | 0xF0, 0x7E, 0x1D, 0xCE, 0x3F, 0x07, 0x81, 0xE0, 0xFC, 0x73, 0xB8, 0x7E, 159 | 0x0F, 0x83, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 160 | 0xC0, 0xF0, 0x3F, 0xFF, 0xFF, 0x01, 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xC0, 161 | 0xFF, 0xDF, 0xFF, 0x07, 0x60, 0xC0, 0x38, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 162 | 0x1E, 0x0F, 0xFF, 0xFF, 0xF0, 0x0F, 0x1F, 0x1C, 0x18, 0x18, 0x18, 0x18, 163 | 0x18, 0x18, 0x38, 0xF0, 0xF0, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 164 | 0x1C, 0x1F, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xF0, 0xF8, 165 | 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1C, 0x0F, 0x0F, 0x1C, 0x18, 166 | 0x18, 0x18, 0x18, 0x18, 0x18, 0x38, 0xF8, 0xF0, 0x3E, 0x03, 0x7F, 0x87, 167 | 0xE1, 0xFE, 0x80, 0x78 }; 168 | 169 | const GFXglyph Bitwise_m19x12pt7bGlyphs[] PROGMEM = { 170 | { 0, 1, 1, 10, 0, 0 }, // 0x20 ' ' 171 | { 1, 4, 17, 5, 1, -16 }, // 0x21 '!' 172 | { 10, 6, 6, 7, 0, -16 }, // 0x22 '"' 173 | { 15, 16, 17, 18, 1, -16 }, // 0x23 '#' 174 | { 49, 14, 20, 16, 1, -17 }, // 0x24 '$' 175 | { 84, 9, 17, 11, 1, -16 }, // 0x25 '%' 176 | { 104, 14, 17, 16, 1, -16 }, // 0x26 '&' 177 | { 134, 3, 6, 4, 0, -16 }, // 0x27 ''' 178 | { 137, 4, 18, 6, 1, -17 }, // 0x28 '(' 179 | { 146, 4, 18, 6, 1, -17 }, // 0x29 ')' 180 | { 155, 8, 8, 12, 2, -16 }, // 0x2A '*' 181 | { 163, 14, 14, 20, 3, -13 }, // 0x2B '+' 182 | { 188, 2, 4, 8, 3, -1 }, // 0x2C ',' 183 | { 189, 8, 2, 10, 1, -6 }, // 0x2D '-' 184 | { 191, 2, 2, 8, 3, -1 }, // 0x2E '.' 185 | { 192, 10, 20, 9, -1, -16 }, // 0x2F '/' 186 | { 217, 14, 17, 16, 1, -16 }, // 0x30 '0' 187 | { 247, 5, 17, 16, 6, -16 }, // 0x31 '1' 188 | { 258, 14, 17, 16, 1, -16 }, // 0x32 '2' 189 | { 288, 13, 17, 16, 2, -16 }, // 0x33 '3' 190 | { 316, 14, 17, 16, 1, -16 }, // 0x34 '4' 191 | { 346, 14, 17, 16, 1, -16 }, // 0x35 '5' 192 | { 376, 14, 17, 16, 1, -16 }, // 0x36 '6' 193 | { 406, 14, 17, 16, 1, -16 }, // 0x37 '7' 194 | { 436, 14, 17, 16, 1, -16 }, // 0x38 '8' 195 | { 466, 14, 17, 16, 1, -16 }, // 0x39 '9' 196 | { 496, 2, 6, 4, 1, -5 }, // 0x3A ':' 197 | { 498, 2, 8, 4, 1, -5 }, // 0x3B ';' 198 | { 500, 14, 13, 20, 3, -13 }, // 0x3C '<' 199 | { 523, 14, 7, 20, 3, -10 }, // 0x3D '=' 200 | { 536, 14, 13, 20, 3, -13 }, // 0x3E '>' 201 | { 559, 12, 17, 14, 1, -16 }, // 0x3F '?' 202 | { 585, 21, 20, 23, 1, -16 }, // 0x40 '@' 203 | { 638, 15, 17, 17, 1, -16 }, // 0x41 'A' 204 | { 670, 14, 17, 16, 1, -16 }, // 0x42 'B' 205 | { 700, 14, 17, 16, 1, -16 }, // 0x43 'C' 206 | { 730, 14, 17, 16, 1, -16 }, // 0x44 'D' 207 | { 760, 11, 17, 13, 1, -16 }, // 0x45 'E' 208 | { 784, 11, 17, 12, 1, -16 }, // 0x46 'F' 209 | { 808, 14, 17, 16, 1, -16 }, // 0x47 'G' 210 | { 838, 15, 17, 17, 1, -16 }, // 0x48 'H' 211 | { 870, 3, 17, 5, 1, -16 }, // 0x49 'I' 212 | { 877, 12, 17, 14, 1, -16 }, // 0x4A 'J' 213 | { 903, 14, 17, 16, 1, -16 }, // 0x4B 'K' 214 | { 933, 13, 17, 13, 0, -16 }, // 0x4C 'L' 215 | { 961, 16, 17, 18, 1, -16 }, // 0x4D 'M' 216 | { 995, 14, 17, 16, 1, -16 }, // 0x4E 'N' 217 | { 1025, 14, 17, 16, 1, -16 }, // 0x4F 'O' 218 | { 1055, 14, 17, 16, 1, -16 }, // 0x50 'P' 219 | { 1085, 14, 19, 16, 1, -16 }, // 0x51 'Q' 220 | { 1119, 14, 17, 16, 1, -16 }, // 0x52 'R' 221 | { 1149, 14, 17, 16, 1, -16 }, // 0x53 'S' 222 | { 1179, 14, 17, 16, 1, -16 }, // 0x54 'T' 223 | { 1209, 14, 17, 16, 1, -16 }, // 0x55 'U' 224 | { 1239, 14, 17, 14, 0, -16 }, // 0x56 'V' 225 | { 1269, 16, 17, 18, 1, -16 }, // 0x57 'W' 226 | { 1303, 14, 17, 16, 1, -16 }, // 0x58 'X' 227 | { 1333, 14, 17, 16, 1, -16 }, // 0x59 'Y' 228 | { 1363, 14, 17, 16, 1, -16 }, // 0x5A 'Z' 229 | { 1393, 4, 17, 6, 1, -16 }, // 0x5B '[' 230 | { 1402, 10, 20, 9, 1, -16 }, // 0x5C '\' 231 | { 1427, 4, 17, 6, 1, -16 }, // 0x5D ']' 232 | { 1436, 14, 7, 24, 5, -17 }, // 0x5E '^' 233 | { 1449, 12, 2, 13, 0, 5 }, // 0x5F '_' 234 | { 1452, 4, 4, 12, 3, -16 }, // 0x60 '`' 235 | { 1454, 11, 12, 12, 1, -11 }, // 0x61 'a' 236 | { 1471, 10, 17, 12, 1, -16 }, // 0x62 'b' 237 | { 1493, 11, 12, 13, 1, -11 }, // 0x63 'c' 238 | { 1510, 10, 17, 12, 1, -16 }, // 0x64 'd' 239 | { 1532, 11, 12, 13, 1, -11 }, // 0x65 'e' 240 | { 1549, 10, 17, 8, 1, -16 }, // 0x66 'f' 241 | { 1571, 11, 17, 13, 1, -11 }, // 0x67 'g' 242 | { 1595, 10, 17, 12, 1, -16 }, // 0x68 'h' 243 | { 1617, 4, 16, 5, 1, -15 }, // 0x69 'i' 244 | { 1625, 9, 21, 6, -4, -15 }, // 0x6A 'j' 245 | { 1649, 10, 17, 12, 1, -16 }, // 0x6B 'k' 246 | { 1671, 4, 17, 5, 1, -16 }, // 0x6C 'l' 247 | { 1680, 14, 12, 16, 1, -11 }, // 0x6D 'm' 248 | { 1701, 10, 12, 12, 1, -11 }, // 0x6E 'n' 249 | { 1716, 10, 12, 12, 1, -11 }, // 0x6F 'o' 250 | { 1731, 10, 17, 12, 1, -11 }, // 0x70 'p' 251 | { 1753, 10, 17, 12, 1, -11 }, // 0x71 'q' 252 | { 1775, 9, 12, 11, 1, -11 }, // 0x72 'r' 253 | { 1789, 10, 12, 12, 1, -11 }, // 0x73 's' 254 | { 1804, 7, 16, 8, 0, -15 }, // 0x74 't' 255 | { 1818, 10, 12, 12, 1, -11 }, // 0x75 'u' 256 | { 1833, 11, 12, 12, 0, -11 }, // 0x76 'v' 257 | { 1850, 14, 12, 16, 1, -11 }, // 0x77 'w' 258 | { 1871, 10, 12, 12, 1, -11 }, // 0x78 'x' 259 | { 1886, 10, 17, 12, 1, -11 }, // 0x79 'y' 260 | { 1908, 11, 12, 12, 1, -11 }, // 0x7A 'z' 261 | { 1925, 8, 22, 12, 2, -16 }, // 0x7B '{' 262 | { 1947, 2, 25, 12, 5, -19 }, // 0x7C '|' 263 | { 1954, 8, 22, 12, 2, -16 }, // 0x7D '}' 264 | { 1976, 16, 4, 20, 2, -9 } }; // 0x7E '~' 265 | 266 | const GFXfont Bitwise_m19x12pt7b PROGMEM = { 267 | (uint8_t *)Bitwise_m19x12pt7bBitmaps, 268 | (GFXglyph *)Bitwise_m19x12pt7bGlyphs, 269 | 0x20, 0x7E, 24 }; 270 | 271 | // Approx. 2656 bytes 272 | -------------------------------------------------------------------------------- /src/Watchy_Base.cpp: -------------------------------------------------------------------------------- 1 | #include "Watchy_Base.h" 2 | 3 | 4 | 5 | /* 6 | * DEFINITIONS 7 | */ 8 | 9 | #define FONT_SMALL FreeSans9pt7b 10 | 11 | 12 | // Store in RTC RAM, otherwise we loose information between different interrupts 13 | RTC_DATA_ATTR uint8_t rotation = 0; 14 | RTC_DATA_ATTR int16_t alarm_timer = -1; 15 | RTC_DATA_ATTR bool dark_mode = false; 16 | 17 | // Variables needed to show data from our MQTT broker 18 | RTC_DATA_ATTR bool show_mqqt_data = false; 19 | RTC_DATA_ATTR volatile int received_mqtt_data = false; 20 | 21 | #define MQTT_NUM_DATA 6 22 | #define MQTT_RECEIVED_ALL_DATA (received_mqtt_data >= MQTT_NUM_DATA) 23 | #define MQTT_CLEAR received_mqtt_data=0 24 | #define MQTT_RECEIVED_DATA received_mqtt_data++ 25 | 26 | RTC_DATA_ATTR float indoor_temp = 0.0; 27 | RTC_DATA_ATTR int indoor_co2 = 0.0; 28 | RTC_DATA_ATTR float outdoor_temp = 0.0; 29 | RTC_DATA_ATTR int outdoor_rain = 0.0; 30 | RTC_DATA_ATTR int outdoor_wind = 0; 31 | RTC_DATA_ATTR int outdoor_gusts = 0; 32 | RTC_DATA_ATTR bool sleep_mode = false; 33 | 34 | /* 35 | * FUNCTIONS 36 | */ 37 | WatchyBase::WatchyBase(){ 38 | 39 | } 40 | 41 | 42 | void WatchyBase::init(esp_sleep_wakeup_cause_t wakeup_reason){ 43 | 44 | Wire.begin(SDA, SCL); //init i2c 45 | 46 | switch (wakeup_reason) 47 | { 48 | case ESP_SLEEP_WAKEUP_EXT0: //RTC Alarm 49 | 50 | // Handle alarm 51 | if(RTC.alarm(ALARM_1) && alarm_timer >= 0){ 52 | RTC.alarmInterrupt(ALARM_1, false); // disable interrupt 53 | 54 | vibrate(3, 500); 55 | alarm_timer = -1; 56 | 57 | // Continue to update watch face 58 | } 59 | 60 | // Handle classical tick 61 | RTC.alarm(ALARM_2); //resets the alarm flag in the RTC 62 | 63 | // Only for visualization and to ensure that alarm is not triggered 64 | // again and a gain as the alarm flag is internally set every time... 65 | if(alarm_timer > 0){ 66 | alarm_timer--; 67 | } 68 | 69 | if(guiState == WATCHFACE_STATE && !show_mqqt_data){ 70 | RTC.read(currentTime); 71 | 72 | if(currentTime.Hour == SLEEP_HOUR && currentTime.Minute == SLEEP_MINUTE){ 73 | sleep_mode = true; 74 | RTC.alarmInterrupt(ALARM_2, false); 75 | } 76 | 77 | showWatchFace(true); //partial updates on tick 78 | } 79 | break; 80 | 81 | case ESP_SLEEP_WAKEUP_EXT1: //button Press + no handling if wakeup 82 | if(sleep_mode){ 83 | sleep_mode = false; 84 | RTC.alarmInterrupt(ALARM_2, true); 85 | RTC.alarm(ALARM_2); //resets the alarm flag in the RTC 86 | 87 | RTC.read(currentTime); 88 | showWatchFace(false); //full update on wakeup from sleep mode 89 | break; 90 | } 91 | 92 | handleButtonPress(); 93 | break; 94 | 95 | default: //reset 96 | _rtcConfig(); 97 | _bmaConfig(); 98 | showWatchFace(false); //full update on reset 99 | break; 100 | } 101 | 102 | // Sometimes BMA crashes - simply try to reinitialize bma... 103 | if(sensor.getErrorCode() != 0){ 104 | sensor.shutDown(); 105 | sensor.wakeUp(); 106 | sensor.softReset(); 107 | _bmaConfig(); 108 | } 109 | } 110 | 111 | 112 | bool WatchyBase::watchFaceDisabled(){ 113 | return show_mqqt_data || sleep_mode; 114 | } 115 | 116 | 117 | void WatchyBase::handleButtonPress(){ 118 | uint64_t wakeupBit = esp_sleep_get_ext1_wakeup_status(); 119 | 120 | if (IS_DOUBLE_TAP){ 121 | while(!sensor.getINT()){ 122 | // Wait until interrupt is cleared. 123 | // Otherwise it will fire again and again. 124 | } 125 | 126 | // To be defined in the watch face what we want exactly 127 | // to do. Therefore, no return; 128 | } 129 | 130 | if (IS_BTN_LEFT_UP){ 131 | 132 | RTC.read(currentTime); 133 | 134 | if(alarm_timer < 0){ 135 | alarm_timer = 0; 136 | } 137 | 138 | if(alarm_timer < 60 * 24){ 139 | alarm_timer += alarm_timer < 60 ? 5 : 10; 140 | } 141 | 142 | // Sum minutes to current time 143 | uint8_t hours; 144 | uint8_t minutes; 145 | uint8_t seconds = currentTime.Second; 146 | _minutesToHM(alarm_timer, hours, minutes); 147 | minutes += currentTime.Minute; 148 | hours += uint8_t(minutes / 60); 149 | hours += currentTime.Hour; 150 | 151 | RTC.setAlarm(ALM1_MATCH_HOURS, seconds, minutes % 60, hours % 24, 0); 152 | RTC.alarmInterrupt(ALARM_1, true); 153 | vibrate(); 154 | 155 | showWatchFace(true); 156 | return; 157 | } 158 | 159 | if(IS_BTN_RIGHT_UP){ 160 | show_mqqt_data = show_mqqt_data ? false : true; 161 | 162 | if(show_mqqt_data){ 163 | int result_code = loadMqqtData(); 164 | if(result_code != 0){ 165 | vibrate(1, 1000); 166 | } 167 | } 168 | 169 | RTC.read(currentTime); 170 | showWatchFace(false); 171 | 172 | return; 173 | } 174 | 175 | if(IS_BTN_RIGHT_DOWN){ 176 | //RTC.read(currentTime); 177 | //vibTime(); 178 | //return; 179 | 180 | vibrate(); 181 | uint8_t result_code = openDoor(); 182 | if(result_code <= 0){ 183 | vibrate(); 184 | } else { 185 | vibrate(1, 1000); 186 | } 187 | } 188 | 189 | Watchy::handleButtonPress(); 190 | } 191 | 192 | 193 | 194 | void WatchyBase::_minutesToHM(int16_t minutes, uint8_t &h, uint8_t &m) { 195 | uint32_t t = minutes * 60; 196 | uint8_t s = t % 60; 197 | 198 | t = (t - s)/60; 199 | m = t % 60; 200 | 201 | t = (t - m)/60; 202 | h = t; 203 | } 204 | 205 | 206 | void WatchyBase::vibrate(uint8_t times, uint32_t delay_time){ 207 | // Ensure that no false positive double tap is produced 208 | sensor.enableFeature(BMA423_WAKEUP, false); 209 | 210 | pinMode(VIB_MOTOR_PIN, OUTPUT); 211 | for(uint8_t i=0; i 0){ 265 | 266 | WIFI_CONFIGURED = false; 267 | WiFi.begin(WIFI_SSID, WIFI_PASS); 268 | delay(1000); 269 | 270 | int8_t retries = 3; 271 | while (!WIFI_CONFIGURED && retries > 0) { 272 | delay(1000); 273 | WIFI_CONFIGURED = (WiFi.status() == WL_CONNECTED); 274 | retries--; 275 | } 276 | 277 | if(WIFI_CONFIGURED){ 278 | break; 279 | } 280 | overall_retries--; 281 | } 282 | 283 | return WIFI_CONFIGURED; 284 | } 285 | 286 | void WatchyBase::disconnectWiFi(){ 287 | WIFI_CONFIGURED=false; 288 | WiFi.disconnect(); 289 | WiFi.mode(WIFI_OFF); 290 | btStop(); 291 | } 292 | 293 | 294 | uint8_t WatchyBase::loadMqqtData(){ 295 | MQTT_CLEAR; 296 | vibrate(); 297 | 298 | if(!connectWiFi()){ 299 | return 1; 300 | } 301 | 302 | WiFiClient wifi_client; 303 | PubSubClient mqtt_client(wifi_client); 304 | mqtt_client.setServer(MQTT_BROKER, 1883); 305 | mqtt_client.setCallback(callback); 306 | 307 | mqtt_client.connect("WatchyDavid"); 308 | if(!mqtt_client.connected()){ 309 | disconnectWiFi(); 310 | return 2; 311 | } 312 | 313 | mqtt_client.subscribe("weather/indoor/temperature"); 314 | mqtt_client.subscribe("weather/indoor/aussen/temperature"); 315 | mqtt_client.subscribe("weather/indoor/wind/windstrength"); 316 | mqtt_client.subscribe("weather/indoor/regenmesser/rain"); 317 | mqtt_client.subscribe("weather/indoor/wind/guststrength"); 318 | mqtt_client.subscribe("weather/indoor/zimmer von david/co2"); 319 | 320 | int8_t retries=25; 321 | while(!MQTT_RECEIVED_ALL_DATA){ 322 | mqtt_client.loop(); 323 | 324 | if(retries % 5 == 0){ 325 | vibrate(); 326 | } 327 | 328 | if(retries < 0){ 329 | break; 330 | } 331 | retries--; 332 | delay(100); 333 | } 334 | 335 | mqtt_client.disconnect(); 336 | disconnectWiFi(); 337 | 338 | if(!MQTT_RECEIVED_ALL_DATA){ 339 | return 3; 340 | } 341 | 342 | return 0; 343 | } 344 | 345 | 346 | // https://github.com/espressif/arduino-esp32/issues/3659 347 | uint8_t WatchyBase::openDoor(){ 348 | if(!connectWiFi()){ 349 | return 1; 350 | } 351 | 352 | WiFiClient wifi_client; 353 | PubSubClient mqtt_client(wifi_client); 354 | mqtt_client.setServer(MQTT_BROKER, 1883); 355 | 356 | int8_t retries = 20; 357 | while(!mqtt_client.connected()){ 358 | if(retries < 0){ 359 | break; 360 | } 361 | retries--; 362 | 363 | mqtt_client.connect("WatchyDavid"); 364 | delay(250); 365 | } 366 | 367 | int result = 0; 368 | if(mqtt_client.connected()){ 369 | mqtt_client.publish(MQTT_TOPIC, MQTT_PAYLOAD); 370 | mqtt_client.loop(); 371 | mqtt_client.disconnect(); 372 | } else { 373 | result = 2; 374 | } 375 | 376 | disconnectWiFi(); 377 | return result; 378 | } 379 | 380 | 381 | void WatchyBase::drawHelperGrid(){ 382 | for(int i=0; i<=200; i+=20){ 383 | display.drawLine(i,0,i,200,FOREGROUND_COLOR); 384 | display.drawLine(0,i,200,i,FOREGROUND_COLOR); 385 | } 386 | } 387 | 388 | 389 | void WatchyBase::drawWatchFace(){ 390 | display.setRotation(rotation); 391 | display.fillScreen(BACKGROUND_COLOR); 392 | display.setTextColor(FOREGROUND_COLOR); 393 | 394 | if(sleep_mode){ 395 | display.drawBitmap(0, 0, sleep_img, 200, 200, FOREGROUND_COLOR); 396 | return; 397 | } 398 | 399 | if(show_mqqt_data){ 400 | int16_t x1, y1; 401 | uint16_t w, h; 402 | //drawHelperGrid(); 403 | display.drawBitmap(0, 0, smart_home, 200, 200, FOREGROUND_COLOR); 404 | display.setFont(&FONT_SMALL); 405 | display.getTextBounds(String(indoor_temp), 100, 180, &x1, &y1, &w, &h); 406 | display.setCursor(55-w/2, 140); 407 | display.print(indoor_temp); 408 | display.println("C"); 409 | 410 | display.setCursor(116, 170); 411 | display.print(indoor_co2); 412 | display.println(" ppm"); 413 | display.drawLine(115, 165, 90, 150, FOREGROUND_COLOR); 414 | 415 | display.setCursor(130, 120); 416 | display.print(outdoor_temp); 417 | display.println("C"); 418 | 419 | display.getTextBounds(String(indoor_temp), 100, 180, &x1, &y1, &w, &h); 420 | display.setCursor(155-w/2, 40); 421 | display.print(outdoor_rain); 422 | display.println(" mm"); 423 | 424 | display.setCursor(10, 25); 425 | display.print(outdoor_wind); 426 | display.println(" km/h"); 427 | display.setCursor(10, 45); 428 | display.print(outdoor_gusts); 429 | display.println(" km/h"); 430 | 431 | if(!MQTT_RECEIVED_ALL_DATA){ 432 | display.setCursor(165, 195); 433 | display.println("[old]"); 434 | } 435 | } 436 | } 437 | 438 | 439 | uint8_t WatchyBase::getBattery(){ 440 | float voltage = getBatteryVoltage() + BATTERY_OFFSET; 441 | 442 | uint8_t percentage = 2808.3808 * pow(voltage, 4) 443 | - 43560.9157 * pow(voltage, 3) 444 | + 252848.5888 * pow(voltage, 2) 445 | - 650767.4615 * voltage 446 | + 626532.5703; 447 | percentage = min((uint8_t) 100, percentage); 448 | percentage = max((uint8_t) 0, percentage); 449 | return percentage; 450 | } 451 | 452 | 453 | void WatchyBase::drawPixel(int16_t x, int16_t y,uint16_t col){ 454 | if(x > 200 || y > 200 || x < 0 || y < 0){ 455 | return; 456 | } 457 | 458 | uint16_t real_color; 459 | switch (col){ 460 | case GREY: 461 | real_color = (x+y)%2==0 ? GxEPD_WHITE : GxEPD_BLACK; 462 | break; 463 | 464 | case DARK_GREY: 465 | real_color = (x+y)%4==0 ? GxEPD_WHITE : GxEPD_BLACK; 466 | break; 467 | 468 | case LIGHT_GREY: 469 | real_color = (x+y)%4==0 ? GxEPD_BLACK : GxEPD_WHITE; 470 | break; 471 | 472 | default: 473 | real_color = col; 474 | break; 475 | } 476 | 477 | display.drawPixel(x, y, real_color); 478 | } 479 | 480 | void WatchyBase::drawBitmapCol(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t color1){ 481 | int16_t i, j, byteWidth = (w + 7) / 8; 482 | for(j=0; j> (i & 7)))==0) { 485 | drawPixel(x+i, y+j, color1); 486 | } 487 | } 488 | } 489 | } 490 | 491 | 492 | int WatchyBase::getPixel(int16_t x, int16_t y, const uint8_t *bitmap){ 493 | int16_t imageWidth = pgm_read_byte(bitmap); 494 | int16_t byteWidth = (imageWidth + 7) / 8; 495 | return (pgm_read_byte(bitmap + 2 + y * byteWidth + x / 8) & (128 >> (x & 7))); 496 | } 497 | 498 | 499 | void WatchyBase::drawBitmapRotate(int xx, int yy, const uint8_t *bitmap, unsigned int fAngle, uint16_t color=GxEPD_BLACK){ 500 | 501 | int iWidth = pgm_read_byte(bitmap); 502 | int iHeight = pgm_read_byte(bitmap + 1); 503 | int hX = iWidth/2; 504 | int hY = iHeight; 505 | float angle = fAngle * PI / 180.0; 506 | 507 | int startX = -hX; 508 | int endX = startX + iWidth; 509 | int startY = -hY; 510 | int endY = startY + iHeight; 511 | 512 | for (int x = 0; x < 200; x++) { 513 | yield(); 514 | for (int y = 0; y < 200; y++) { 515 | int ux = (x-xx) * cos(-angle) - (y-yy) * sin(-angle); 516 | int uy = (x-xx) * sin(-angle) + (y-yy) * cos(-angle); 517 | 518 | if(ux >= startX && ux <= endX && uy >= startY && uy <= endY){ 519 | if(!getPixel(ux + hX, uy + hY, bitmap)){ 520 | drawPixel(x, y, color); 521 | } 522 | } 523 | } 524 | } 525 | } 526 | 527 | 528 | 529 | void WatchyBase::_rtcConfig(){ 530 | //https://github.com/JChristensen/DS3232RTC 531 | RTC.squareWave(SQWAVE_NONE); //disable square wave output 532 | //RTC.set(compileTime()); //set RTC time to compile time 533 | RTC.setAlarm(ALM2_EVERY_MINUTE, 0, 0, 0, 0); //alarm wakes up Watchy every minute 534 | RTC.alarmInterrupt(ALARM_2, true); //enable alarm interrupt 535 | RTC.read(currentTime); 536 | } 537 | 538 | 539 | void WatchyBase::_bmaConfig(){ 540 | 541 | if (sensor.begin(_readRegister, _writeRegister, delay) == false) { 542 | //fail to init BMA 543 | return; 544 | } 545 | 546 | // Accel parameter structure 547 | Acfg cfg; 548 | /*! 549 | Output data rate in Hz, Optional parameters: 550 | - BMA4_OUTPUT_DATA_RATE_0_78HZ 551 | - BMA4_OUTPUT_DATA_RATE_1_56HZ 552 | - BMA4_OUTPUT_DATA_RATE_3_12HZ 553 | - BMA4_OUTPUT_DATA_RATE_6_25HZ 554 | - BMA4_OUTPUT_DATA_RATE_12_5HZ 555 | - BMA4_OUTPUT_DATA_RATE_25HZ 556 | - BMA4_OUTPUT_DATA_RATE_50HZ 557 | - BMA4_OUTPUT_DATA_RATE_100HZ 558 | - BMA4_OUTPUT_DATA_RATE_200HZ 559 | - BMA4_OUTPUT_DATA_RATE_400HZ 560 | - BMA4_OUTPUT_DATA_RATE_800HZ 561 | - BMA4_OUTPUT_DATA_RATE_1600HZ 562 | */ 563 | cfg.odr = BMA4_OUTPUT_DATA_RATE_100HZ; 564 | /*! 565 | G-range, Optional parameters: 566 | - BMA4_ACCEL_RANGE_2G 567 | - BMA4_ACCEL_RANGE_4G 568 | - BMA4_ACCEL_RANGE_8G 569 | - BMA4_ACCEL_RANGE_16G 570 | */ 571 | cfg.range = BMA4_ACCEL_RANGE_2G; 572 | /*! 573 | Bandwidth parameter, determines filter configuration, Optional parameters: 574 | - BMA4_ACCEL_OSR4_AVG1 575 | - BMA4_ACCEL_OSR2_AVG2 576 | - BMA4_ACCEL_NORMAL_AVG4 577 | - BMA4_ACCEL_CIC_AVG8 578 | - BMA4_ACCEL_RES_AVG16 579 | - BMA4_ACCEL_RES_AVG32 580 | - BMA4_ACCEL_RES_AVG64 581 | - BMA4_ACCEL_RES_AVG128 582 | */ 583 | cfg.bandwidth = BMA4_ACCEL_NORMAL_AVG4; 584 | 585 | /*! Filter performance mode , Optional parameters: 586 | - BMA4_CIC_AVG_MODE 587 | - BMA4_CONTINUOUS_MODE 588 | */ 589 | cfg.perf_mode = BMA4_CONTINUOUS_MODE; 590 | 591 | // Configure the BMA423 accelerometer 592 | sensor.setAccelConfig(cfg); 593 | 594 | // Enable BMA423 accelerometer 595 | // Warning : Need to use feature, you must first enable the accelerometer 596 | // Warning : Need to use feature, you must first enable the accelerometer 597 | sensor.enableAccel(); 598 | 599 | struct bma4_int_pin_config config ; 600 | config.edge_ctrl = BMA4_LEVEL_TRIGGER; 601 | config.lvl = BMA4_ACTIVE_HIGH; 602 | config.od = BMA4_PUSH_PULL; 603 | config.output_en = BMA4_OUTPUT_ENABLE; 604 | config.input_en = BMA4_INPUT_DISABLE; 605 | // The correct trigger interrupt needs to be configured as needed 606 | sensor.setINTPinConfig(config, BMA4_INTR1_MAP); 607 | 608 | struct bma423_axes_remap remap_data; 609 | remap_data.x_axis = 1; 610 | remap_data.x_axis_sign = 0xFF; 611 | remap_data.y_axis = 0; 612 | remap_data.y_axis_sign = 0xFF; 613 | remap_data.z_axis = 2; 614 | remap_data.z_axis_sign = 0xFF; 615 | // Need to raise the wrist function, need to set the correct axis 616 | sensor.setRemapAxes(&remap_data); 617 | 618 | // Enable BMA423 isStepCounter feature 619 | sensor.enableFeature(BMA423_STEP_CNTR, true); 620 | // Enable BMA423 isTilt feature 621 | sensor.enableFeature(BMA423_TILT, true); 622 | // Enable BMA423 isDoubleClick feature 623 | //sensor.enableFeature(BMA423_WAKEUP, true); 624 | 625 | // Reset steps 626 | //sensor.resetStepCounter(); 627 | 628 | // Turn on feature interrupt 629 | //sensor.enableStepCountInterrupt(); 630 | //sensor.enableTiltInterrupt(); 631 | // It corresponds to isDoubleClick interrupt 632 | //sensor.enableWakeupInterrupt(); 633 | } 634 | 635 | 636 | uint16_t WatchyBase::_readRegister(uint8_t address, uint8_t reg, uint8_t *data, uint16_t len) 637 | { 638 | Wire.beginTransmission(address); 639 | Wire.write(reg); 640 | Wire.endTransmission(); 641 | Wire.requestFrom((uint8_t)address, (uint8_t)len); 642 | uint8_t i = 0; 643 | while (Wire.available()) { 644 | data[i++] = Wire.read(); 645 | } 646 | return 0; 647 | } 648 | 649 | uint16_t WatchyBase::_writeRegister(uint8_t address, uint8_t reg, uint8_t *data, uint16_t len) 650 | { 651 | Wire.beginTransmission(address); 652 | Wire.write(reg); 653 | Wire.write(data, len); 654 | return (0 != Wire.endTransmission()); 655 | } --------------------------------------------------------------------------------