├── app ├── src │ ├── hw │ │ ├── button.h │ │ ├── backlight.h │ │ ├── battery.h │ │ ├── display.h │ │ ├── clock.h │ │ ├── storage.h │ │ ├── battery.c │ │ ├── bt.h │ │ ├── backlight.c │ │ ├── clock.c │ │ ├── display.c │ │ ├── storage.c │ │ ├── button.c │ │ └── bt.c │ ├── service │ │ ├── cts_sync.h │ │ ├── bt_notify_service.h │ │ ├── powersave.h │ │ ├── msg_store.h │ │ ├── cts.h │ │ ├── powersave.c │ │ ├── msg_store.c │ │ ├── bt_notify_service.c │ │ ├── cts.c │ │ └── cts_sync.c │ ├── lib │ │ ├── log.c │ │ ├── log.h │ │ ├── log_dbg.h │ │ ├── Adafruit-GFX-Library │ │ │ ├── .gitignore │ │ │ ├── fontconvert │ │ │ │ ├── Makefile │ │ │ │ └── makefonts.sh │ │ │ ├── library.properties │ │ │ ├── gfxfont.h │ │ │ ├── license.txt │ │ │ ├── README.md │ │ │ ├── Fonts │ │ │ │ ├── Tiny3x3a2pt7b.h │ │ │ │ ├── Picopixel.h │ │ │ │ ├── Org_01.h │ │ │ │ ├── FreeMono9pt7b.h │ │ │ │ ├── FreeMonoOblique9pt7b.h │ │ │ │ ├── FreeMonoBold9pt7b.h │ │ │ │ ├── FreeSerif9pt7b.h │ │ │ │ ├── FreeSans9pt7b.h │ │ │ │ ├── FreeSerifBold9pt7b.h │ │ │ │ ├── FreeSerifItalic9pt7b.h │ │ │ │ └── FreeMonoBoldOblique9pt7b.h │ │ │ └── glcdfont.c │ │ ├── GFX.h │ │ └── GFX.cpp │ ├── ui │ │ ├── win │ │ │ ├── home.h │ │ │ ├── console.h │ │ │ ├── console.cpp │ │ │ └── home.cpp │ │ ├── widget │ │ │ ├── clock.h │ │ │ ├── console.h │ │ │ ├── clock.cpp │ │ │ └── console.cpp │ │ ├── win.h │ │ └── win.cpp │ └── main.cpp ├── include │ ├── WProgram.h │ ├── Arduino.h │ ├── common.h │ ├── Printable.h │ ├── common.cpp │ ├── Print.h │ └── Print.cpp ├── CMakeLists.txt └── nrf52_pca10040.overlay ├── .west └── config ├── jlink-connect.sh ├── screenshots ├── img_home.jpg ├── img_console.jpg ├── img_home_250.jpg └── img_console_250.jpg ├── .gitmodules ├── jlink-flash.sh ├── jlink-debug.sh ├── jlink-logger.sh ├── jlink-attach.sh ├── .gitignore ├── test-initial-setup.sh ├── README.md └── LICENSE /app/src/hw/button.h: -------------------------------------------------------------------------------- 1 | void button_init(); 2 | bool isButtonPressed(); -------------------------------------------------------------------------------- /app/src/service/cts_sync.h: -------------------------------------------------------------------------------- 1 | void cts_sync_init(); 2 | void cts_sync_loop(); -------------------------------------------------------------------------------- /.west/config: -------------------------------------------------------------------------------- 1 | [manifest] 2 | path = zephyr 3 | [zephyr] 4 | base = zephyr 5 | -------------------------------------------------------------------------------- /app/include/WProgram.h: -------------------------------------------------------------------------------- 1 | 2 | #include "common.h" 3 | 4 | #include "WString.h" 5 | 6 | -------------------------------------------------------------------------------- /app/src/lib/log.c: -------------------------------------------------------------------------------- 1 | #include 2 | LOG_MODULE_REGISTER(app, LOG_LEVEL_INF); -------------------------------------------------------------------------------- /app/src/lib/log.h: -------------------------------------------------------------------------------- 1 | #include 2 | LOG_MODULE_DECLARE(app, LOG_LEVEL_INF); 3 | -------------------------------------------------------------------------------- /app/src/lib/log_dbg.h: -------------------------------------------------------------------------------- 1 | #include 2 | LOG_MODULE_DECLARE(app, LOG_LEVEL_DBG); 3 | -------------------------------------------------------------------------------- /app/src/ui/win/home.h: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | #define WIN_HOME_ID 1 4 | 5 | win_t* win_home_get(); -------------------------------------------------------------------------------- /app/src/service/bt_notify_service.h: -------------------------------------------------------------------------------- 1 | void bt_notify_service_init(); 2 | void bt_notify_service_loop(); 3 | -------------------------------------------------------------------------------- /jlink-connect.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | JLinkExe -device nrf52 -if swd -speed 4000 -autoconnect 1 4 | 5 | -------------------------------------------------------------------------------- /app/src/ui/win/console.h: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | #define WIN_CONSOLE_ID 901 4 | 5 | win_t* win_console_get(); -------------------------------------------------------------------------------- /screenshots/img_home.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dejvino/pinetime-hermes-firmware/HEAD/screenshots/img_home.jpg -------------------------------------------------------------------------------- /screenshots/img_console.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dejvino/pinetime-hermes-firmware/HEAD/screenshots/img_console.jpg -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "zephyr"] 2 | path = zephyr 3 | url = https://github.com/Dejvino/zephyr.git 4 | branch = pinetime 5 | -------------------------------------------------------------------------------- /app/src/hw/backlight.h: -------------------------------------------------------------------------------- 1 | void backlight_init(void); 2 | void backlight_enable(bool enable); 3 | bool backlight_is_enabled(); 4 | -------------------------------------------------------------------------------- /jlink-flash.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | PATH=$PATH:/opt/SEGGER/JLink 4 | 5 | west flash --runner jlink --device NRF52 6 | 7 | 8 | -------------------------------------------------------------------------------- /screenshots/img_home_250.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dejvino/pinetime-hermes-firmware/HEAD/screenshots/img_home_250.jpg -------------------------------------------------------------------------------- /screenshots/img_console_250.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dejvino/pinetime-hermes-firmware/HEAD/screenshots/img_console_250.jpg -------------------------------------------------------------------------------- /app/src/hw/battery.h: -------------------------------------------------------------------------------- 1 | void battery_init(); 2 | void battery_loop(); 3 | uint8_t battery_get_percent(); 4 | uint16_t battery_get_voltage(); 5 | -------------------------------------------------------------------------------- /jlink-debug.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | PATH=$PATH:/opt/SEGGER/JLink 4 | 5 | $TERM JLinkRTTClient & 6 | west debug --runner jlink --device NRF52 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/service/powersave.h: -------------------------------------------------------------------------------- 1 | void powersave_init(); 2 | void powersave_loop(); 3 | void powersave_wakeup(uint8_t awake_timeout); 4 | bool powersave_is_awake(); 5 | -------------------------------------------------------------------------------- /app/src/lib/Adafruit-GFX-Library/.gitignore: -------------------------------------------------------------------------------- 1 | default.vim 2 | fontconvert/fontconvert 3 | # Our handy .gitignore for automation ease 4 | Doxyfile* 5 | doxygen_sqlite3.db 6 | html -------------------------------------------------------------------------------- /jlink-logger.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | MINITERM=$TERM 4 | 5 | 6 | $MINITERM JLinkRTTClient & 7 | 8 | JLinkExe -device nrf52 -if swd -speed 4000 -autoconnect 1 9 | 10 | -------------------------------------------------------------------------------- /app/src/hw/display.h: -------------------------------------------------------------------------------- 1 | void display_init(); 2 | struct device* display_get_device(); 3 | void display_scroll_region(u16_t top, u16_t middle, u16_t bottom); 4 | void display_scroll_offset(u16_t offset); -------------------------------------------------------------------------------- /app/src/hw/clock.h: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | void clock_init(); 4 | void clock_loop(); 5 | 6 | time_t clock_get_ticks(); 7 | struct tm* clock_get_datetime(); 8 | void clock_set_datetime(struct tm* datetime); 9 | -------------------------------------------------------------------------------- /app/include/Arduino.h: -------------------------------------------------------------------------------- 1 | 2 | #define boolean bool 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | 10 | #include "WString.h" 11 | 12 | -------------------------------------------------------------------------------- /app/src/hw/storage.h: -------------------------------------------------------------------------------- 1 | void storage_init(); 2 | void storage_loop(); 3 | int storage_read(int address, char* buffer, size_t size); 4 | int storage_write(int address, char* buffer, size_t size); 5 | void storage_delete(int address); 6 | -------------------------------------------------------------------------------- /jlink-attach.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | MINITERM=$TERM 4 | ELF_FILE="build/zephyr/zephyr.elf" 5 | 6 | $MINITERM -e "sleep 2; arm-none-eabi-gdb $ELF_FILE -ex 'target remote localhost:2331'" & 7 | 8 | JLinkGDBServerCLExe -device nrf52 -if swd -speed 4000 -autoconnect 1 9 | 10 | -------------------------------------------------------------------------------- /app/src/lib/Adafruit-GFX-Library/fontconvert/Makefile: -------------------------------------------------------------------------------- 1 | all: fontconvert 2 | 3 | CC = gcc 4 | CFLAGS = -Wall -I/usr/local/include/freetype2 -I/usr/include/freetype2 -I/usr/include 5 | LIBS = -lfreetype 6 | 7 | fontconvert: fontconvert.c 8 | $(CC) $(CFLAGS) $< $(LIBS) -o $@ 9 | strip $@ 10 | 11 | clean: 12 | rm -f fontconvert 13 | -------------------------------------------------------------------------------- /app/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # SPDX-License-Identifier: Apache-2.0 2 | 3 | cmake_minimum_required(VERSION 3.13.1) 4 | include($ENV{ZEPHYR_BASE}/cmake/app/boilerplate.cmake NO_POLICY_SCOPE) 5 | project(hermes) 6 | 7 | include_directories(include src/ src/lib/) 8 | FILE(GLOB_RECURSE app_sources include/*.cpp include/*.c src/*.cpp src/*.c) 9 | target_sources(app PRIVATE ${app_sources} src/main.cpp) 10 | 11 | -------------------------------------------------------------------------------- /app/src/hw/battery.c: -------------------------------------------------------------------------------- 1 | #include "zephyr.h" 2 | #include 3 | #include 4 | #include "battery.h" 5 | 6 | uint16_t battery_voltage = 0; 7 | uint8_t battery_percent = 0; 8 | 9 | void battery_init() 10 | { 11 | 12 | } 13 | 14 | void battery_loop() 15 | { 16 | 17 | } 18 | 19 | uint8_t battery_get_percent() 20 | { 21 | return battery_percent; 22 | } 23 | 24 | uint16_t battery_get_voltage() 25 | { 26 | return battery_voltage; 27 | } 28 | -------------------------------------------------------------------------------- /app/src/lib/Adafruit-GFX-Library/library.properties: -------------------------------------------------------------------------------- 1 | name=Adafruit GFX Library 2 | version=1.7.3 3 | author=Adafruit 4 | maintainer=Adafruit 5 | sentence=Adafruit GFX graphics core library, this is the 'core' class that all our other graphics libraries derive from. 6 | paragraph=Install this library in addition to the display library for your hardware. 7 | category=Display 8 | url=https://github.com/adafruit/Adafruit-GFX-Library 9 | architectures=* 10 | depends=Adafruit ILI9341 11 | -------------------------------------------------------------------------------- /app/src/ui/widget/clock.h: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | #define UIW_CLOCK_FORMAT_HMS 1 4 | #define UIW_CLOCK_FORMAT_HM 2 5 | 6 | /** 7 | * Convenience version, H:M:S clock in the middle of the display. 8 | */ 9 | void uiw_clock_draw(GFX* tft); 10 | 11 | /** 12 | * Convenience version, H:M:S clock in the middle of the display 13 | * with adjustable Y position. 14 | */ 15 | void uiw_clock_draw(GFX* tft, u16_t y); 16 | 17 | 18 | /** 19 | * Exposes all the options. 20 | */ 21 | void uiw_clock_draw(GFX* tft, u16_t x, u16_t y, u8_t text_size, u8_t format); -------------------------------------------------------------------------------- /app/src/ui/win.h: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #ifndef GFX_H 4 | #define GFX_H 5 | #include "lib/GFX.h" 6 | #endif 7 | 8 | #ifndef WIN_H 9 | #define WIN_H 10 | typedef void (*win_init_cb_t)(); 11 | typedef void (*win_loop_cb_t)(); 12 | typedef void (*win_deinit_cb_t)(); 13 | 14 | typedef struct { 15 | u16_t id; 16 | win_init_cb_t init; 17 | win_loop_cb_t loop; 18 | win_deinit_cb_t deinit; 19 | } win_t; 20 | 21 | void win_init(); 22 | void win_loop(); 23 | 24 | void win_activate(win_t* win); 25 | GFX* win_get_gfx(); 26 | #endif // WIN_H -------------------------------------------------------------------------------- /app/nrf52_pca10040.overlay: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2019 Creative Product Design 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | */ 6 | 7 | &spi0 { 8 | status = "okay"; 9 | sck-pin = <3>; 10 | mosi-pin = <5>; 11 | miso-pin = <26>; 12 | cs-gpios = <&gpio0 27 0>; 13 | 14 | st7789v@0 { 15 | compatible = "sitronix,st7789v"; 16 | label = "DISPLAY"; 17 | spi-max-frequency = <20000000>; 18 | reg = <0>; 19 | cmd-data-gpios = <&gpio0 25 0>; 20 | reset-gpios = <&gpio0 2 0>; 21 | width = <320>; 22 | height = <170>; 23 | y-offset = <35>; 24 | }; 25 | }; 26 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Prerequisites 2 | *.d 3 | 4 | # Compiled Object files 5 | *.slo 6 | *.lo 7 | *.o 8 | *.obj 9 | 10 | # Precompiled Headers 11 | *.gch 12 | *.pch 13 | 14 | # Compiled Dynamic libraries 15 | *.so 16 | *.dylib 17 | *.dll 18 | 19 | # Fortran module files 20 | *.mod 21 | *.smod 22 | 23 | # Compiled Static libraries 24 | *.lai 25 | *.la 26 | *.a 27 | *.lib 28 | 29 | # Executables 30 | *.exe 31 | *.out 32 | *.app 33 | *.elf 34 | 35 | # Temp files 36 | *.swp 37 | 38 | # Build output 39 | build/ 40 | 41 | # Zephyr & dependencies 42 | bootloader/ 43 | modules/ 44 | tools/ 45 | 46 | -------------------------------------------------------------------------------- /app/include/common.h: -------------------------------------------------------------------------------- 1 | 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | #define boolean bool 9 | 10 | char* itoa(int value, char* buffer, int base); 11 | char* utoa(unsigned int val, char * s, int radix); 12 | char* ultoa(unsigned long val, char * s, int radix); 13 | char* ltoa(long val, char * s, int radix); 14 | 15 | char *dtostrf(double val, signed char width, unsigned char prec, char *sout); 16 | 17 | #ifndef MIN 18 | #define MIN(X,Y) ((X) < (Y) ? : (X) : (Y)) 19 | #endif 20 | #ifndef MAX 21 | #define MAX(X,Y) ((X) > (Y) ? : (X) : (Y)) 22 | #endif -------------------------------------------------------------------------------- /app/src/ui/win.cpp: -------------------------------------------------------------------------------- 1 | #include "win.h" 2 | extern "C" { 3 | #include 4 | } 5 | 6 | static GFX* tft; 7 | 8 | static win_t* current_win; 9 | 10 | void win_activate(win_t* win) 11 | { 12 | if (current_win != NULL) { 13 | current_win->deinit(); 14 | } 15 | current_win = win; 16 | if (current_win != NULL) { 17 | current_win->init(); 18 | } 19 | } 20 | 21 | GFX* win_get_gfx() 22 | { 23 | return tft; 24 | } 25 | 26 | void win_init() 27 | { 28 | tft = createGFX(display_get_device()); 29 | k_sleep(K_MSEC(100)); 30 | tft->fillScreen(ST77XX_BLACK); 31 | } 32 | 33 | void win_loop() 34 | { 35 | if (!current_win) { 36 | return; 37 | } 38 | current_win->loop(); 39 | } 40 | -------------------------------------------------------------------------------- /app/src/service/msg_store.h: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | #define MSG_STORE_SIZE 20 5 | #define MSG_STORE_TEXT_LIMIT 64 6 | 7 | typedef struct { 8 | u16_t len; 9 | char* text; 10 | } msg_t; 11 | 12 | typedef struct { 13 | u16_t size; 14 | msg_t msgs[MSG_STORE_SIZE]; 15 | u16_t pointer_index; 16 | } msg_circular_array_t; 17 | 18 | void msg_store_init(); 19 | void msg_store_loop(); 20 | 21 | msg_circular_array_t* msg_store_get_storage(); 22 | u16_t msg_store_get_size(); 23 | msg_t msg_store_get_message(u16_t depth); 24 | void msg_store_push_message(char* text, u16_t len); 25 | 26 | typedef void (*msg_store_listener_cb_t)(char* text, u16_t len); 27 | void msg_store_register_listener(msg_store_listener_cb_t msg_store_listener_cb); -------------------------------------------------------------------------------- /app/src/ui/widget/console.h: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | class UiwConsole { 4 | public: 5 | UiwConsole(GFX* tft); 6 | 7 | void init(); 8 | void draw(); 9 | void append(char* text); 10 | void appendTimestamp(); 11 | void print(); 12 | void print(char* text); 13 | void println(char* text); 14 | void println(); 15 | void printTimestamp(); 16 | void printlnTimestamped(char* text); 17 | void clear(); 18 | void deinit(); 19 | 20 | private: 21 | GFX* tft; 22 | u16_t basex = 2; 23 | u16_t basey = 40; 24 | u16_t h = 10; 25 | u16_t lines = 18; 26 | 27 | u16_t line; 28 | char line_text[64]; 29 | 30 | void draw_history_line(char* text); 31 | void draw_current_line(char* text); 32 | void draw_newline(); 33 | }; 34 | -------------------------------------------------------------------------------- /app/src/hw/bt.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2015-2016 Intel Corporation 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | */ 6 | 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | 15 | #include 16 | 17 | #include 18 | #include 19 | #include 20 | #include 21 | #include 22 | #include 23 | #include 24 | 25 | void bt_setup(void); 26 | void bt_loop(); 27 | 28 | #define BT_STATUS_DISCONNECTED 0 29 | #define BT_STATUS_CONNECTING 1 30 | #define BT_STATUS_CONNECTED 2 31 | uint8_t bt_get_connection_status(); 32 | -------------------------------------------------------------------------------- /app/src/hw/backlight.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include "log.h" 5 | #include "backlight.h" 6 | 7 | #define LED_PORT DT_ALIAS_LED1_GPIOS_CONTROLLER 8 | #define LED DT_ALIAS_LED1_GPIOS_PIN 9 | 10 | struct device* backlight_dev; 11 | 12 | static bool backlight_enabled = false; 13 | 14 | void backlight_init(void) 15 | { 16 | LOG_DBG("Backlight starting..."); 17 | backlight_dev = device_get_binding(LED_PORT); 18 | gpio_pin_configure(backlight_dev, LED, GPIO_DIR_OUT); 19 | backlight_enable(true); 20 | LOG_INF("Backlight inited."); 21 | } 22 | 23 | void backlight_enable(bool enable) { 24 | gpio_pin_write(backlight_dev, LED, enable ? 0 : 1); 25 | backlight_enabled = enable; 26 | } 27 | 28 | bool backlight_is_enabled() 29 | { 30 | return backlight_enabled; 31 | } 32 | -------------------------------------------------------------------------------- /app/src/service/cts.h: -------------------------------------------------------------------------------- 1 | /** @file 2 | * @brief CTS Service 3 | */ 4 | 5 | /* 6 | * Copyright (c) 2016 Intel Corporation 7 | * 8 | * SPDX-License-Identifier: Apache-2.0 9 | */ 10 | 11 | #ifndef CTS_H 12 | #define CTS_H 13 | #include 14 | #include 15 | 16 | #ifdef __cplusplus 17 | extern "C" { 18 | #endif 19 | 20 | void cts_init(void); 21 | void cts_loop(void); 22 | 23 | typedef void (*cts_write_cb_t)(int); 24 | void cts_register_write_cb(cts_write_cb_t); 25 | 26 | typedef struct { 27 | uint16_t year; 28 | uint8_t month; 29 | uint8_t day; 30 | uint8_t hours; 31 | uint8_t minutes; 32 | uint8_t seconds; 33 | uint8_t day_of_week; 34 | uint8_t exact_time_256; 35 | uint8_t adjust_reason; 36 | } cts_datetime_t; 37 | 38 | void cts_get_datetime(cts_datetime_t*); 39 | 40 | #ifdef __cplusplus 41 | } 42 | #endif 43 | #endif -------------------------------------------------------------------------------- /app/src/hw/clock.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include "log.h" 6 | #include "clock.h" 7 | 8 | /** 9 | * Local time maintained by the watch. 10 | */ 11 | static time_t local_time = 0; 12 | 13 | void clock_init() 14 | { 15 | local_time = 0; 16 | } 17 | 18 | void clock_loop() 19 | { 20 | // TODO: use timer to increment 21 | local_time++; 22 | } 23 | 24 | time_t clock_get_ticks() 25 | { 26 | return local_time; 27 | } 28 | 29 | struct tm* clock_get_datetime() 30 | { 31 | return localtime(&local_time); 32 | } 33 | 34 | void clock_set_datetime(struct tm* datetime) 35 | { 36 | local_time = mktime(datetime); 37 | LOG_INF("Local clock se to: %02d:%02d:%02d, %04d-%02d-%02d\n", 38 | datetime->tm_hour, datetime->tm_min, datetime->tm_sec, 39 | datetime->tm_year, datetime->tm_mon, datetime->tm_mday); 40 | } 41 | -------------------------------------------------------------------------------- /app/src/service/powersave.c: -------------------------------------------------------------------------------- 1 | #include "zephyr.h" 2 | #include 3 | #include 4 | #include 5 | #include "log.h" 6 | #include "powersave.h" 7 | 8 | time_t last_event = 0; 9 | time_t next_sleep = 0; 10 | const uint8_t backlight_timeout = 3; // sec 11 | 12 | void powersave_init() 13 | { 14 | backlight_enable(false); 15 | 16 | LOG_INF("Powersave inited."); 17 | } 18 | 19 | void powersave_loop() 20 | { 21 | if (isButtonPressed()) { 22 | powersave_wakeup(backlight_timeout); 23 | } 24 | 25 | if (!powersave_is_awake() && backlight_is_enabled()) { 26 | backlight_enable(false); 27 | } 28 | } 29 | 30 | void powersave_wakeup(uint8_t awake_timeout) 31 | { 32 | last_event = clock_get_ticks(); 33 | next_sleep = last_event + awake_timeout; 34 | 35 | backlight_enable(true); 36 | } 37 | 38 | bool powersave_is_awake() 39 | { 40 | return next_sleep > clock_get_ticks(); 41 | } 42 | -------------------------------------------------------------------------------- /test-initial-setup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | # Test Initial Repository Setup 4 | # 5 | # This is an automated test script that simulates a new user trying out this repository. 6 | # It should be run once in a while to check that the installation steps work even for 7 | # a freshly cloned repository. It could also serve as a reference setup. 8 | # 9 | # NOTE: this test assumes the zephyr tool 'west' is already installed and available. 10 | # Follow the official steps to set it up first: 11 | # https://docs.zephyrproject.org/latest/getting_started/index.html 12 | # 13 | 14 | # cleanup from previous attempt 15 | rm -rf ~/tmp/pinetime-hermes-firmware 16 | 17 | # prepare a testing directory 18 | mkdir -p ~/tmp 19 | cd ~/tmp 20 | 21 | # clone the repository with all its submodules 22 | git clone --recurse-submodules https://github.com/Dejvino/pinetime-hermes-firmware 23 | cd pinetime-hermes-firmware 24 | 25 | # setup project dependencies via west 26 | west update 27 | 28 | # build the project 29 | west build -p -b pinetime app && echo "TEST PASSED!" 30 | 31 | -------------------------------------------------------------------------------- /app/src/hw/display.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include "log.h" 8 | #include "display.h" 9 | 10 | struct device* display_dev; 11 | 12 | void display_scroll_region(u16_t top, u16_t middle, u16_t bottom) 13 | { 14 | display_set_scroll_region(display_dev, top, middle, bottom); 15 | } 16 | 17 | void display_scroll_offset(u16_t offset) 18 | { 19 | display_set_scroll_offset(display_dev, offset); 20 | } 21 | 22 | void display_init() { 23 | #ifdef CONFIG_ST7789V_RGB565 24 | //const size_t rgb_size = 2; 25 | #else 26 | //const size_t rgb_size = 3; 27 | LOG_ERR("RGB888 mode not supported. Aborting test."); 28 | return; 29 | #endif 30 | 31 | display_dev = device_get_binding(DT_INST_0_SITRONIX_ST7789V_LABEL); 32 | 33 | if (display_dev == NULL) { 34 | LOG_ERR("Device not found. Aborting test."); 35 | return; 36 | } 37 | 38 | display_blanking_off(display_dev); 39 | 40 | LOG_INF("Display inited."); 41 | } 42 | 43 | struct device* display_get_device() 44 | { 45 | return display_dev; 46 | } 47 | -------------------------------------------------------------------------------- /app/src/lib/Adafruit-GFX-Library/gfxfont.h: -------------------------------------------------------------------------------- 1 | // Font structures for newer Adafruit_GFX (1.1 and later). 2 | // Example fonts are included in 'Fonts' directory. 3 | // To use a font in your Arduino sketch, #include the corresponding .h 4 | // file and pass address of GFXfont struct to setFont(). Pass NULL to 5 | // revert to 'classic' fixed-space bitmap font. 6 | 7 | #ifndef _GFXFONT_H_ 8 | #define _GFXFONT_H_ 9 | 10 | /// Font data stored PER GLYPH 11 | typedef struct { 12 | uint16_t bitmapOffset; ///< Pointer into GFXfont->bitmap 13 | uint8_t width; ///< Bitmap dimensions in pixels 14 | uint8_t height; ///< Bitmap dimensions in pixels 15 | uint8_t xAdvance; ///< Distance to advance cursor (x axis) 16 | int8_t xOffset; ///< X dist from cursor pos to UL corner 17 | int8_t yOffset; ///< Y dist from cursor pos to UL corner 18 | } GFXglyph; 19 | 20 | /// Data stored for FONT AS A WHOLE 21 | typedef struct { 22 | uint8_t *bitmap; ///< Glyph bitmaps, concatenated 23 | GFXglyph *glyph; ///< Glyph array 24 | uint8_t first; ///< ASCII extents (first char) 25 | uint8_t last; ///< ASCII extents (last char) 26 | uint8_t yAdvance; ///< Newline distance (y axis) 27 | } GFXfont; 28 | 29 | #endif // _GFXFONT_H_ 30 | -------------------------------------------------------------------------------- /app/src/ui/widget/clock.cpp: -------------------------------------------------------------------------------- 1 | #include "clock.h" 2 | extern "C" { 3 | #include 4 | } 5 | 6 | void uiw_clock_draw(GFX* tft, u16_t x, u16_t y, u8_t text_size, u8_t format) 7 | { 8 | struct tm* tm_ptr = clock_get_datetime(); 9 | uint8_t hours = tm_ptr->tm_hour; 10 | uint8_t minutes = tm_ptr->tm_min; 11 | uint8_t seconds = tm_ptr->tm_sec; 12 | char separator = seconds % 2 == 0 ? ':' : ' '; 13 | 14 | int w = tft->width() - x*2; 15 | int h = 8 * text_size; 16 | 17 | static char clockText[32]; 18 | switch (format) { 19 | case UIW_CLOCK_FORMAT_HM: 20 | sprintf(clockText, "%02d%c%02d", 21 | hours, separator, minutes); 22 | break; 23 | case UIW_CLOCK_FORMAT_HMS: 24 | default: 25 | sprintf(clockText, "%02d:%02d:%02d", 26 | hours, minutes, seconds); 27 | break; 28 | } 29 | 30 | tft->setCursor(x, y); 31 | tft->setTextSize(text_size); 32 | tft->setTextColor(ST77XX_GREEN); 33 | tft->openBuffer(x, y, w, h); 34 | tft->fillRect(x, y, w, h, ST77XX_BLACK); 35 | tft->print(clockText); 36 | tft->flushBuffer(); 37 | } 38 | 39 | void uiw_clock_draw(GFX* tft) 40 | { 41 | uiw_clock_draw(tft, 100); 42 | } 43 | 44 | void uiw_clock_draw(GFX* tft, u16_t y) 45 | { 46 | uiw_clock_draw(tft, 25, y, 4, UIW_CLOCK_FORMAT_HMS); 47 | } 48 | -------------------------------------------------------------------------------- /app/src/ui/win/console.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | extern "C" { 5 | #include 6 | } 7 | #include "console.h" 8 | 9 | static GFX* tft; 10 | static UiwConsole* console; 11 | 12 | static void console_log(char* line) 13 | { 14 | console->println(); 15 | console->appendTimestamp(); 16 | console->print(line); 17 | } 18 | 19 | static void msg_store_listener(char* text, u16_t len) 20 | { 21 | console_log(text); 22 | } 23 | 24 | static void init() 25 | { 26 | tft = win_get_gfx(); 27 | tft->fillScreen(ST77XX_BLACK); 28 | 29 | console = new UiwConsole(tft); 30 | console->init(); 31 | 32 | msg_store_register_listener(msg_store_listener); 33 | } 34 | 35 | static void loop() 36 | { 37 | uiw_clock_draw(tft, 5); 38 | 39 | /*/ console test 40 | char line[128]; 41 | sprintf(line, "Random text every second.\nAnd this one is really long! %d", (int)(z_tick_get() % 99)); 42 | console_log(line); 43 | /**/ 44 | 45 | console->draw(); 46 | } 47 | 48 | void deinit() 49 | { 50 | console->deinit(); 51 | delete console; 52 | console = NULL; 53 | } 54 | 55 | static win_t win = { 56 | .id = WIN_CONSOLE_ID, 57 | .init = init, 58 | .loop = loop, 59 | .deinit = deinit, 60 | }; 61 | 62 | win_t* win_console_get() 63 | { 64 | return &win; 65 | } 66 | -------------------------------------------------------------------------------- /app/src/lib/Adafruit-GFX-Library/fontconvert/makefonts.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Ugly little Bash script, generates a set of .h files for GFX using 4 | # GNU FreeFont sources. There are three fonts: 'Mono' (Courier-like), 5 | # 'Sans' (Helvetica-like) and 'Serif' (Times-like); four styles: regular, 6 | # bold, oblique or italic, and bold+oblique or bold+italic; and four 7 | # sizes: 9, 12, 18 and 24 point. No real error checking or anything, 8 | # this just powers through all the combinations, calling the fontconvert 9 | # utility and redirecting the output to a .h file for each combo. 10 | 11 | # Adafruit_GFX repository does not include the source outline fonts 12 | # (huge zipfile, different license) but they're easily acquired: 13 | # http://savannah.gnu.org/projects/freefont/ 14 | 15 | convert=./fontconvert 16 | inpath=~/Desktop/freefont/ 17 | outpath=../Fonts/ 18 | fonts=(FreeMono FreeSans FreeSerif) 19 | styles=("" Bold Italic BoldItalic Oblique BoldOblique) 20 | sizes=(9 12 18 24) 21 | 22 | for f in ${fonts[*]} 23 | do 24 | for index in ${!styles[*]} 25 | do 26 | st=${styles[$index]} 27 | for si in ${sizes[*]} 28 | do 29 | infile=$inpath$f$st".ttf" 30 | if [ -f $infile ] # Does source combination exist? 31 | then 32 | outfile=$outpath$f$st$si"pt7b.h" 33 | # printf "%s %s %s > %s\n" $convert $infile $si $outfile 34 | $convert $infile $si > $outfile 35 | fi 36 | done 37 | done 38 | done 39 | -------------------------------------------------------------------------------- /app/src/lib/Adafruit-GFX-Library/license.txt: -------------------------------------------------------------------------------- 1 | Software License Agreement (BSD License) 2 | 3 | Copyright (c) 2012 Adafruit Industries. All rights reserved. 4 | 5 | Redistribution and use in source and binary forms, with or without 6 | modification, are permitted provided that the following conditions are met: 7 | 8 | - Redistributions of source code must retain the above copyright notice, 9 | this list of conditions and the following disclaimer. 10 | - Redistributions in binary form must reproduce the above copyright notice, 11 | this list of conditions and the following disclaimer in the documentation 12 | and/or other materials provided with the distribution. 13 | 14 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 15 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17 | ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 18 | LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 19 | CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 20 | SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 21 | INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 22 | CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 23 | ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 24 | POSSIBILITY OF SUCH DAMAGE. 25 | -------------------------------------------------------------------------------- /app/include/Printable.h: -------------------------------------------------------------------------------- 1 | /* 2 | Printable.h - Interface class that allows printing of complex types 3 | Copyright (c) 2011 Adrian McEwen. All right reserved. 4 | 5 | This library is free software; you can redistribute it and/or 6 | modify it under the terms of the GNU Lesser General Public 7 | License as published by the Free Software Foundation; either 8 | version 2.1 of the License, or (at your option) any later version. 9 | 10 | This library is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 | Lesser General Public License for more details. 14 | 15 | You should have received a copy of the GNU Lesser General Public 16 | License along with this library; if not, write to the Free Software 17 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 18 | */ 19 | 20 | #ifndef Printable_h 21 | #define Printable_h 22 | 23 | #include 24 | 25 | class Print; 26 | 27 | /** The Printable class provides a way for new classes to allow themselves to be printed. 28 | By deriving from Printable and implementing the printTo method, it will then be possible 29 | for users to print out instances of this class by passing them into the usual 30 | Print::print and Print::println methods. 31 | */ 32 | 33 | class Printable { 34 | public: 35 | virtual size_t printTo(Print& p) const = 0; 36 | }; 37 | 38 | #endif 39 | 40 | 41 | -------------------------------------------------------------------------------- /app/src/hw/storage.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include "log.h" 8 | #include "storage.h" 9 | 10 | static struct nvs_fs fs; 11 | #define TEST_ID 99 12 | 13 | int storage_read(int address, char* buffer, size_t size) 14 | { 15 | return nvs_read(&fs, address, buffer, size); 16 | } 17 | 18 | int storage_write(int address, char* buffer, size_t size) 19 | { 20 | return nvs_write(&fs, address, buffer, size); 21 | } 22 | 23 | void storage_delete(int address) 24 | { 25 | nvs_delete(&fs, address); 26 | } 27 | 28 | void storage_init() 29 | { 30 | int rc = 0; 31 | struct flash_pages_info info; 32 | 33 | fs.offset = DT_FLASH_AREA_STORAGE_OFFSET; 34 | rc = flash_get_page_info_by_offs(device_get_binding(DT_FLASH_DEV_NAME), 35 | fs.offset, &info); 36 | if (rc) { 37 | LOG_ERR("Storage init: Unable to get page info"); 38 | return; 39 | } 40 | fs.sector_size = info.size; 41 | fs.sector_count = 3U; 42 | 43 | rc = nvs_init(&fs, DT_FLASH_DEV_NAME); 44 | if (rc) { 45 | LOG_ERR("Storage init: Flash Init failed\n"); 46 | return; 47 | } 48 | 49 | /* 50 | uint8_t test = 0; 51 | storage_read(TEST_ID, &test, 1); 52 | LOG_INF("Storage test | loaded: %d", test); 53 | test++; 54 | storage_write(TEST_ID, &test, 1); 55 | */ 56 | 57 | LOG_INF("Storage inited."); 58 | } 59 | 60 | void storage_loop() 61 | { 62 | 63 | } 64 | -------------------------------------------------------------------------------- /app/src/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | extern "C" { 6 | #include "lib/log.h" 7 | #include "hw/storage.h" 8 | #include "hw/clock.h" 9 | #include "hw/backlight.h" 10 | #include "hw/display.h" 11 | #include "hw/button.h" 12 | #include "hw/battery.h" 13 | #include "hw/bt.h" 14 | #include "service/msg_store.h" 15 | #include "service/powersave.h" 16 | #include "service/cts.h" 17 | #include "service/cts_sync.h" 18 | #include "service/bt_notify_service.h" 19 | } 20 | #include "ui/win.h" 21 | #include "ui/win/home.h" 22 | #include "ui/win/console.h" // TESTING 23 | 24 | void delay(int ms) { 25 | k_sleep(K_MSEC(ms)); 26 | } 27 | 28 | void setup(void) { 29 | 30 | settings_subsys_init(); 31 | // HW 32 | LOG_INF("App setup: hardware"); 33 | //storage_init(); 34 | clock_init(); 35 | backlight_init(); 36 | button_init(); 37 | display_init(); 38 | battery_init(); 39 | bt_setup(); 40 | 41 | // Services 42 | LOG_INF("App setup: services"); 43 | msg_store_init(); 44 | powersave_init(); 45 | cts_init(); 46 | cts_sync_init(); 47 | bt_notify_service_init(); 48 | 49 | win_init(); 50 | 51 | win_activate(win_home_get()); 52 | // TESTING: 53 | win_activate(win_console_get()); 54 | 55 | LOG_INF("App setup complete."); 56 | } 57 | 58 | inline void loop() { 59 | delay(990); 60 | 61 | // HW 62 | //storage_loop(); 63 | clock_loop(); 64 | battery_loop(); 65 | bt_loop(); 66 | 67 | // Services 68 | msg_store_loop(); 69 | powersave_loop(); 70 | cts_loop(); 71 | cts_sync_loop(); 72 | bt_notify_service_loop(); 73 | 74 | win_loop(); 75 | } 76 | 77 | void main(void) 78 | { 79 | LOG_INF("PineTime Hermes starting."); 80 | 81 | setup(); 82 | 83 | while (1) { 84 | loop(); 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /app/include/common.cpp: -------------------------------------------------------------------------------- 1 | 2 | #include "common.h" 3 | 4 | // inline function to swap two numbers 5 | inline void swap(char *x, char *y) { 6 | char t = *x; *x = *y; *y = t; 7 | } 8 | 9 | // function to reverse buffer[i..j] 10 | char* reverse(char *buffer, int i, int j) 11 | { 12 | while (i < j) 13 | swap(&buffer[i++], &buffer[j--]); 14 | 15 | return buffer; 16 | } 17 | 18 | // Iterative function to implement itoa() function in C 19 | char* itoa(int value, char* buffer, int base) 20 | { 21 | // invalid input 22 | if (base < 2 || base > 32) 23 | return buffer; 24 | 25 | // consider absolute value of number 26 | int n = abs(value); 27 | 28 | int i = 0; 29 | while (n) 30 | { 31 | int r = n % base; 32 | 33 | if (r >= 10) 34 | buffer[i++] = 65 + (r - 10); 35 | else 36 | buffer[i++] = 48 + r; 37 | 38 | n = n / base; 39 | } 40 | 41 | // if number is 0 42 | if (i == 0) 43 | buffer[i++] = '0'; 44 | 45 | // If base is 10 and value is negative, the resulting string 46 | // is preceded with a minus sign (-) 47 | // With any other base, value is always considered unsigned 48 | if (value < 0 && base == 10) 49 | buffer[i++] = '-'; 50 | 51 | buffer[i] = '\0'; // null terminate string 52 | 53 | // reverse the string and return it 54 | return reverse(buffer, 0, i - 1); 55 | } 56 | 57 | 58 | char * utoa(unsigned int val, char * s, int radix) { return itoa(val, s, radix); } 59 | char * ultoa(unsigned int val, char * s, int radix) { return utoa(val, s, radix); } 60 | char * ltoa(unsigned int val, char * s, int radix) { return ltoa(val, s, radix); } 61 | 62 | 63 | char *dtostrf (double val, signed char width, unsigned char prec, char *sout) { 64 | asm(".global _printf_float"); 65 | 66 | char fmt[20]; 67 | sprintf(fmt, "%%%d.%df", width, prec); 68 | sprintf(sout, fmt, val); 69 | return sout; 70 | } 71 | 72 | -------------------------------------------------------------------------------- /app/src/lib/GFX.h: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | #define ST77XX_BLACK 0x0000 6 | #define ST77XX_WHITE 0xFFFF 7 | #define ST77XX_RED 0xF800 8 | #define ST77XX_GREEN 0x07E0 9 | #define ST77XX_BLUE 0x001F 10 | #define ST77XX_CYAN 0x07FF 11 | #define ST77XX_MAGENTA 0xF81F 12 | #define ST77XX_YELLOW 0xFFE0 13 | #define ST77XX_ORANGE 0xFC00 14 | 15 | #include "Adafruit-GFX-Library/Adafruit_GFX.h" 16 | 17 | /** 18 | * Implementation of Adafruit_GFX graphics library for ST7789V display on Zephyr. 19 | */ 20 | class GFX : public Adafruit_GFX { 21 | 22 | public: 23 | GFX(struct device* display_dev, int16_t w, int16_t h); // Constructor 24 | 25 | // This MUST be defined by the subclass: 26 | void drawPixel( 27 | int16_t x, int16_t y, 28 | uint16_t color); ///< Virtual drawPixel() function to draw to the 29 | ///< screen/framebuffer/etc, must be overridden in 30 | ///< subclass. @param x X coordinate. @param y Y 31 | ///< coordinate. @param color 16-bit pixel color. 32 | virtual void startWrite(void); 33 | virtual void writePixel(int16_t x, int16_t y, uint16_t color); 34 | virtual void writeFillRect(int16_t x, int16_t y, int16_t w, int16_t h, 35 | uint16_t color); 36 | virtual void writeFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color); 37 | virtual void writeFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color); 38 | virtual void endWrite(void); 39 | 40 | void openBuffer(int16_t x, int16_t y, int16_t w, int16_t h); 41 | void flushBuffer(); 42 | 43 | private: 44 | struct device *display_dev; 45 | struct display_buffer_descriptor pixelBufferDesc; 46 | 47 | u8_t *buffer; 48 | int16_t bx, by, bw, bh; 49 | }; 50 | 51 | /** 52 | * GFX Factory 53 | */ 54 | GFX* createGFX(struct device* display_dev); 55 | 56 | 57 | -------------------------------------------------------------------------------- /app/src/hw/button.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include "backlight.h" 5 | #include "button.h" 6 | #include "log.h" 7 | 8 | /* change this to use another GPIO port */ 9 | #ifndef DT_ALIAS_SW0_GPIOS_CONTROLLER 10 | #ifdef SW0_GPIO_NAME 11 | #define DT_ALIAS_SW0_GPIOS_CONTROLLER SW0_GPIO_NAME 12 | #else 13 | #error SW0_GPIO_NAME or DT_ALIAS_SW0_GPIOS_CONTROLLER needs to be set in board.h 14 | #endif 15 | #endif 16 | #define PORT DT_ALIAS_SW0_GPIOS_CONTROLLER 17 | 18 | /* change this to use another GPIO pin */ 19 | #ifdef DT_ALIAS_SW0_GPIOS_PIN 20 | #define PIN DT_ALIAS_SW0_GPIOS_PIN 21 | #else 22 | #error DT_ALIAS_SW0_GPIOS_PIN needs to be set in board.h 23 | #endif 24 | 25 | #define EDGE (GPIO_INT_EDGE | GPIO_INT_DOUBLE_EDGE) 26 | 27 | /* change this to enable pull-up/pull-down */ 28 | #ifndef DT_ALIAS_SW0_GPIOS_FLAGS 29 | #ifdef DT_ALIAS_SW0_GPIOS_PIN_PUD 30 | #define DT_ALIAS_SW0_GPIOS_FLAGS DT_ALIAS_SW0_GPIOS_PIN_PUD 31 | #else 32 | #define DT_ALIAS_SW0_GPIOS_FLAGS 0 33 | #endif 34 | #endif 35 | #define PULL_UP DT_ALIAS_SW0_GPIOS_FLAGS 36 | 37 | struct device* button_dev; 38 | 39 | bool isButtonPressed() { 40 | u32_t val = 0U; 41 | gpio_pin_read(button_dev, PIN, &val); 42 | return val == 1U; 43 | } 44 | 45 | void button_pressed(struct device *gpiob, struct gpio_callback *cb, 46 | u32_t pins) 47 | { 48 | // TODO: callback! 49 | bool b = isButtonPressed(); 50 | LOG_DBG("Button pressed: %d", b); 51 | if (b) { 52 | backlight_enable(b); 53 | } 54 | } 55 | 56 | static struct gpio_callback gpio_cb; 57 | 58 | void button_init() 59 | { 60 | u32_t button_out = 1U; 61 | 62 | button_dev = device_get_binding(PORT); 63 | if (!button_dev) { 64 | LOG_ERR("Button device not found."); 65 | return; 66 | } 67 | 68 | gpio_pin_configure(button_dev, PIN, 69 | GPIO_DIR_IN | GPIO_INT | PULL_UP | EDGE); 70 | 71 | gpio_init_callback(&gpio_cb, button_pressed, BIT(PIN)); 72 | gpio_add_callback(button_dev, &gpio_cb); 73 | gpio_pin_enable_callback(button_dev, PIN); 74 | 75 | //port 15 has to be high in order for the button to work 76 | gpio_pin_configure(button_dev, 15,GPIO_DIR_OUT); //push button out 77 | gpio_pin_write(button_dev, 15, button_out); //set port high 78 | LOG_INF("Button inited."); 79 | } 80 | -------------------------------------------------------------------------------- /app/src/service/msg_store.c: -------------------------------------------------------------------------------- 1 | #include "log.h" 2 | #include "msg_store.h" 3 | 4 | #define MSG_STORE_MEMPOOL 5 | #ifdef MSG_STORE_MEMPOOL 6 | #define MSG_STORE_MEMPOOL_MAX MSG_STORE_TEXT_LIMIT 7 | K_MEM_POOL_DEFINE(msg_store_pool, MSG_STORE_MEMPOOL_MAX / 4, MSG_STORE_MEMPOOL_MAX, MSG_STORE_SIZE, 4); 8 | #endif 9 | 10 | 11 | static msg_circular_array_t store; 12 | static msg_store_listener_cb_t listener_cb; 13 | 14 | void msg_store_init() 15 | { 16 | memset(&store, 0, sizeof(store)); 17 | store.size = MSG_STORE_SIZE; 18 | } 19 | 20 | void msg_store_loop() 21 | { 22 | 23 | } 24 | 25 | msg_circular_array_t* msg_store_get_storage() 26 | { 27 | return &store; 28 | } 29 | 30 | u16_t msg_store_get_size() 31 | { 32 | return store.size; 33 | } 34 | 35 | msg_t msg_store_get_message(u16_t depth) 36 | { 37 | u16_t index = (store.pointer_index 38 | + (store.size - 1 - (depth % store.size))) % store.size; 39 | return store.msgs[index]; 40 | } 41 | 42 | void msg_store_push_message(char* text, u16_t len) 43 | { 44 | if (len > MSG_STORE_TEXT_LIMIT) { 45 | LOG_WRN("Msg of length %d B not stored, limit %d B exceeded.", 46 | len, MSG_STORE_TEXT_LIMIT); 47 | return; 48 | } 49 | LOG_INF("Msg #%d pushed to store (%d B): %s", 50 | store.pointer_index, len, log_strdup(text)); 51 | 52 | char* stored = store.msgs[store.pointer_index].text; 53 | if (stored) { 54 | #ifdef MSG_STORE_MEMPOOL 55 | k_free(stored); 56 | #else 57 | free(stored); 58 | #endif 59 | } 60 | 61 | store.msgs[store.pointer_index].len = len; 62 | #ifdef MSG_STORE_MEMPOOL 63 | if (len > MSG_STORE_MEMPOOL_MAX) { 64 | stored = NULL; 65 | LOG_WRN("Mem pool alloc for %d B is out of bounds.", len); 66 | } else if (0 != (stored = (u8_t*)k_mem_pool_malloc(&msg_store_pool, len))) { 67 | LOG_DBG("Mem pool alloc for %d B succeeded.", len); 68 | } else { 69 | LOG_WRN("Mem pool alloc for %d B failed.", len); 70 | } 71 | #else 72 | stored = (char*)malloc(len); 73 | #endif 74 | 75 | store.msgs[store.pointer_index].text = stored; 76 | if (stored) { 77 | memcpy(stored, text, len); 78 | store.pointer_index = (store.pointer_index + 1) % store.size; 79 | } else { 80 | LOG_ERR("Msg storage of %d B could not be allocated.", len); 81 | } 82 | 83 | if (listener_cb) { 84 | listener_cb(text, len); 85 | } 86 | } 87 | 88 | void msg_store_register_listener(msg_store_listener_cb_t msg_store_listener_cb) 89 | { 90 | listener_cb = msg_store_listener_cb; 91 | } 92 | -------------------------------------------------------------------------------- /app/src/ui/win/home.cpp: -------------------------------------------------------------------------------- 1 | #include "home.h" 2 | extern "C" { 3 | #include 4 | #include 5 | #include 6 | } 7 | #include 8 | 9 | static GFX* tft; 10 | 11 | char notify[MSG_STORE_TEXT_LIMIT]; 12 | u8_t notify_redraw = 0; 13 | 14 | static void msg_store_listener(char* text, u16_t len) 15 | { 16 | memset(notify, 0, sizeof(notify)); 17 | memcpy(notify, text, len); 18 | notify_redraw = 1; 19 | } 20 | 21 | void draw_notify() { 22 | if (notify_redraw == 0) { 23 | return; 24 | } 25 | 26 | int w = 240; 27 | int h = 80; 28 | int x = 0; 29 | int y = 240 - h; 30 | tft->setCursor(x, y); 31 | tft->setTextSize(2); 32 | tft->setTextWrap(true); 33 | tft->setTextColor(ST77XX_GREEN); 34 | tft->fillRect(x, y, w, h, ST77XX_BLACK); 35 | tft->print(notify); 36 | 37 | notify_redraw = 0; 38 | } 39 | 40 | void draw_battery() { 41 | uint8_t battery_percent = battery_get_percent(); 42 | 43 | static char text[16]; 44 | sprintf(text, "%02d%s", battery_percent, "%"); 45 | 46 | int w = 40; 47 | int h = 15; 48 | int x = tft->width() - w; 49 | int y = 0; 50 | tft->openBuffer(x, y, w, h); 51 | tft->setCursor(x, y); 52 | tft->setTextSize(2); 53 | tft->setTextColor(ST77XX_GREEN); 54 | tft->fillRect(x, y, w, h, ST77XX_BLACK); 55 | tft->print(text); 56 | tft->flushBuffer(); 57 | } 58 | 59 | void draw_bt_status() { 60 | uint8_t bt_status = bt_get_connection_status(); 61 | 62 | uint16_t color; 63 | switch (bt_status) { 64 | case BT_STATUS_DISCONNECTED: 65 | color = ST77XX_RED; 66 | break; 67 | case BT_STATUS_CONNECTING: 68 | color = ST77XX_ORANGE; 69 | break; 70 | case BT_STATUS_CONNECTED: 71 | color = ST77XX_GREEN; 72 | break; 73 | default: 74 | color = ST77XX_MAGENTA; 75 | } 76 | int w = 20; 77 | int h = 15; 78 | int x = 0; 79 | int y = 0; 80 | //tft->openBuffer(x, y, w, h); 81 | tft->setCursor(x, y); 82 | tft->setTextSize(2); 83 | tft->setTextColor(color); 84 | //tft->fillRect(x, y, w, h, ST77XX_BLACK); // no need for now 85 | tft->print("BT"); 86 | //tft->flushBuffer(); 87 | } 88 | 89 | 90 | void home_init() 91 | { 92 | tft = win_get_gfx(); 93 | tft->fillScreen(ST77XX_BLACK); 94 | 95 | msg_store_register_listener(msg_store_listener); 96 | } 97 | 98 | void home_loop() 99 | { 100 | uiw_clock_draw(tft, 46, 90, 5, UIW_CLOCK_FORMAT_HM); 101 | draw_battery(); 102 | draw_bt_status(); 103 | draw_notify(); 104 | } 105 | 106 | void home_deinit() {} 107 | 108 | static win_t win_home = { 109 | .id = WIN_HOME_ID, 110 | .init = home_init, 111 | .loop = home_loop, 112 | .deinit = home_deinit, 113 | }; 114 | 115 | win_t* win_home_get() 116 | { 117 | return &win_home; 118 | } 119 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PineTime Hermes - Firmware 2 | Firmware for the smart watch [PineTime](https://wiki.pine64.org/index.php/PineTime) from [PINE64](https://www.pine64.org/). 3 | Primarily focused on displaying time and notifications. 4 | 5 | Built using [Zephyr Project](https://zephyrproject.org/). 6 | 7 | Home Screen | Console Screen 8 | ------------ | ------------- 9 | ![Home Screen](screenshots/img_home.jpg) | ![Console Screen](screenshots/img_console.jpg) 10 | 11 | > **Hermes**, messenger of the gods. 12 | > He can convey messages between the divine realms, the underworld, and the world of mortals. 13 | 14 | # Getting Started 15 | ## Install Zephyr Dependencies 16 | Follow the official steps: https://docs.zephyrproject.org/latest/getting_started/index.html 17 | 18 | *Note:* use this repository's directory whenever you see mention of '~/zephyrproject' 19 | 20 | 1. OS Update 21 | 2. Install Dependencies 22 | 3. Get the Source Code (don't create a new project, clone this repository!) 23 | ``` 24 | cd ~/ 25 | git clone --recurse-submodules https://github.com/Dejvino/pinetime-hermes-firmware.git 26 | cd pinetime-hermes-firmware 27 | west update 28 | ``` 29 | 4. Install Needed Python Packages 30 | 5. Install Software Development Toolchain 31 | 32 | ## Build the App 33 | ``` 34 | cd ~/pinetime-hermes-firmware 35 | west build -p -b pinetime ./app 36 | ``` 37 | 38 | ## Flash the App 39 | ``` 40 | west flash 41 | ``` 42 | or 43 | ``` 44 | ./jlink-flash.sh 45 | ``` 46 | 47 | Enjoy! 48 | 49 | # Current Status 50 | * **clock** 51 | * renders green digital clock with low precision time updates. 52 | * **power management** 53 | * backlight is enabled by holding the button, remains turned on for a few seconds. 54 | * mocked battery level is available 55 | * **windows** 56 | * basic support for different windows (AKA screens/views/apps) shown on the display 57 | * **home** shows a big clock, Bluetooth status, Battery level and a single notification message 58 | * **console** shows a clock and a large scrolling console with several notification messages 59 | * support for switching between the windows (not tested or used) 60 | * **notifications** 61 | * local in-memory storage of last X notifications 62 | * **Bluetooth** 63 | * connection status is indicated on the display 64 | * advertises mock Battery level, Heart-rate sensor data, Current Time Service (CTS). 65 | * synchronizes its clock from a connected device (if it provides CTS service). 66 | * accepts notifications pushed to the device 67 | 68 | Note: for the notifications to work you need a compatible Companion App, see below. 69 | 70 | # Related Links 71 | * Hermes Companion Apps: https://github.com/Dejvino/pinetime-hermes-companion 72 | * Linux / PinePhone: [companion-linux](https://github.com/Dejvino/pinetime-hermes-companion-linux) 73 | * Android: [companion-android](https://github.com/Dejvino/pinetime-hermes-companion-android) 74 | * PineTime Zephyr Toolkit: https://github.com/Dejvino/pinetime-zephyr 75 | * PineTime Zephyr-RTOS: https://github.com/Dejvino/zephyr.git (pinetime branch) 76 | 77 | -------------------------------------------------------------------------------- /app/src/lib/Adafruit-GFX-Library/README.md: -------------------------------------------------------------------------------- 1 | # Adafruit GFX Library ![Build Status](https://github.com/adafruit/Adafruit-GFX-Library/workflows/Arduino%20Library%20CI/badge.svg) 2 | 3 | This is the core graphics library for all our displays, providing a common set of graphics primitives (points, lines, circles, etc.). It needs to be paired with a hardware-specific library for each display device we carry (to handle the lower-level functions). 4 | 5 | Adafruit invests time and resources providing this open source code, please support Adafruit and open-source hardware by purchasing products from Adafruit! 6 | 7 | Written by Limor Fried/Ladyada for Adafruit Industries. 8 | BSD license, check license.txt for more information. 9 | All text above must be included in any redistribution. 10 | 11 | Recent Arduino IDE releases include the Library Manager for easy installation. Otherwise, to download, click the DOWNLOAD ZIP button, uncompress and rename the uncompressed folder Adafruit_GFX. Confirm that the Adafruit_GFX folder contains Adafruit_GFX.cpp and Adafruit_GFX.h. Place the Adafruit_GFX library folder your ArduinoSketchFolder/Libraries/ folder. You may need to create the Libraries subfolder if its your first library. Restart the IDE. 12 | 13 | # Useful Resources 14 | 15 | - Image2Code: This is a handy Java GUI utility to convert a BMP file into the array code necessary to display the image with the drawBitmap function. Check out the code at ehubin's GitHub repository: https://github.com/ehubin/Adafruit-GFX-Library/tree/master/Img2Code 16 | 17 | - drawXBitmap function: You can use the GIMP photo editor to save a .xbm file and use the array saved in the file to draw a bitmap with the drawXBitmap function. See the pull request here for more details: https://github.com/adafruit/Adafruit-GFX-Library/pull/31 18 | 19 | - 'Fonts' folder contains bitmap fonts for use with recent (1.1 and later) Adafruit_GFX. To use a font in your Arduino sketch, \#include the corresponding .h file and pass address of GFXfont struct to setFont(). Pass NULL to revert to 'classic' fixed-space bitmap font. 20 | 21 | - 'fontconvert' folder contains a command-line tool for converting TTF fonts to Adafruit_GFX header format. 22 | 23 | --- 24 | 25 | ### Roadmap 26 | 27 | The PRIME DIRECTIVE is to maintain backward compatibility with existing Arduino sketches -- many are hosted elsewhere and don't track changes here, some are in print and can never be changed! This "little" library has grown organically over time and sometimes we paint ourselves into a design corner and just have to live with it or add ungainly workarounds. 28 | 29 | Highly unlikely to merge any changes for additional or incompatible font formats (see Prime Directive above). There are already two formats and the code is quite bloaty there as it is (this also creates liabilities for tools and documentation). If you *must* have a more sophisticated font format, consider creating a fork with the features required for your project. For similar reasons, also unlikely to add any more bitmap formats, it's getting messy. 30 | 31 | Please don't reformat code for the sake of reformatting code. The resulting large "visual diff" makes it impossible to untangle actual bug fixes from merely rearranged lines. 32 | -------------------------------------------------------------------------------- /app/src/service/bt_notify_service.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | #include 9 | 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | 18 | #include "log.h" 19 | #include 20 | #include 21 | 22 | /* Custom Service Variables */ 23 | static struct bt_uuid_128 vnd_uuid = BT_UUID_INIT_128( 24 | 0xf0, 0xde, 0xbc, 0x9a, 0x78, 0x56, 0x34, 0x12, 25 | 0x78, 0x56, 0x34, 0x12, 0x78, 0x56, 0x34, 0x12); 26 | static struct bt_uuid_128 vnd_notify_uuid = BT_UUID_INIT_128( 27 | 0xde, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 28 | 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab); 29 | 30 | static u8_t vnd_value[MSG_STORE_TEXT_LIMIT]; 31 | 32 | static ssize_t read_vnd(struct bt_conn *conn, const struct bt_gatt_attr *attr, 33 | void *buf, u16_t len, u16_t offset) 34 | { 35 | char *value = attr->user_data; 36 | 37 | return bt_gatt_attr_read(conn, attr, buf, len, offset, value, 38 | strlen(value)); 39 | } 40 | 41 | static ssize_t write_notify(struct bt_conn *conn, const struct bt_gatt_attr *attr, 42 | const void *buf, u16_t len, u16_t offset, 43 | u8_t flags) 44 | { 45 | u8_t header_length = 1; 46 | u8_t buffer_length = sizeof(vnd_value); 47 | 48 | u8_t *value = attr->user_data; 49 | 50 | if (offset + len > sizeof(vnd_value)) { 51 | LOG_WRN("BT attempted to send more data than the buffer can hold."); 52 | return BT_GATT_ERR(BT_ATT_ERR_INVALID_OFFSET); 53 | } 54 | 55 | if (offset == 0) { 56 | memset(value, 0, sizeof(vnd_value)); 57 | u8_t msg_length = ((u8_t*)buf)[0]; 58 | u8_t requested = msg_length + header_length; 59 | if (requested > buffer_length) { 60 | LOG_WRN("BT requested to send more data than the buffer can hold: %d / %d", 61 | msg_length, buffer_length); 62 | return BT_GATT_ERR(BT_ATT_ERR_INSUFFICIENT_RESOURCES); 63 | } 64 | LOG_DBG("BT Notify msg initiated, expecting %d bytes.", msg_length); 65 | } 66 | 67 | memcpy(value + offset, buf, len); 68 | 69 | u8_t msg_length = value[0]; 70 | u8_t sent_length = offset + len; 71 | bool last_message = (sent_length >= msg_length); 72 | if (last_message) { 73 | LOG_DBG("BT Notify msg ended. Recvd %d bytes, expected %d.", 74 | sent_length, msg_length); 75 | msg_store_push_message((char*)value + 1, msg_length); 76 | } else { 77 | LOG_DBG("BT Notify msg ongoing. Recvd %d bytes, expected %d.", 78 | sent_length, msg_length); 79 | } 80 | 81 | return len; 82 | } 83 | 84 | /* Vendor Primary Service Declaration */ 85 | BT_GATT_SERVICE_DEFINE(vnd_svc, 86 | BT_GATT_PRIMARY_SERVICE(&vnd_uuid), 87 | BT_GATT_CHARACTERISTIC(&vnd_notify_uuid.uuid, 88 | BT_GATT_CHRC_WRITE, 89 | BT_GATT_PERM_WRITE_ENCRYPT, 90 | read_vnd, write_notify, vnd_value), 91 | ); 92 | 93 | void bt_notify_service_init() 94 | { 95 | 96 | } 97 | 98 | void bt_notify_service_loop() 99 | { 100 | 101 | } 102 | -------------------------------------------------------------------------------- /app/src/service/cts.c: -------------------------------------------------------------------------------- 1 | /** @file 2 | * @brief CTS Service sample 3 | */ 4 | 5 | /* 6 | * Copyright (c) 2016 Intel Corporation 7 | * 8 | * SPDX-License-Identifier: Apache-2.0 9 | */ 10 | 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | 19 | #include 20 | #include 21 | #include 22 | #include 23 | #include 24 | 25 | #include "cts.h" 26 | 27 | static u8_t ct[10]; 28 | static u8_t ct_update; 29 | 30 | cts_datetime_t cts_datetime; 31 | void cts_get_datetime(cts_datetime_t* datetime) 32 | { 33 | memcpy(datetime, ct, sizeof(cts_datetime_t)); 34 | } 35 | 36 | void empty_cb(int val) {} 37 | static cts_write_cb_t cts_write_cb = empty_cb; 38 | 39 | void cts_register_write_cb(cts_write_cb_t cb) 40 | { 41 | cts_write_cb = cb; 42 | } 43 | 44 | static void ct_ccc_cfg_changed(const struct bt_gatt_attr *attr, u16_t value) 45 | { 46 | printk("Bluetooth CCC cfg changed: %04x", value); 47 | 48 | /* TODO: Handle value */ 49 | // if (cts_write_cb != NULL) { 50 | cts_write_cb(value); 51 | // } 52 | } 53 | 54 | static ssize_t read_ct(struct bt_conn *conn, const struct bt_gatt_attr *attr, 55 | void *buf, u16_t len, u16_t offset) 56 | { 57 | const char *value = attr->user_data; 58 | 59 | return bt_gatt_attr_read(conn, attr, buf, len, offset, value, 60 | sizeof(ct)); 61 | } 62 | 63 | static ssize_t write_ct(struct bt_conn *conn, const struct bt_gatt_attr *attr, 64 | const void *buf, u16_t len, u16_t offset, 65 | u8_t flags) 66 | { 67 | u8_t *value = attr->user_data; 68 | 69 | if (offset + len > sizeof(ct)) { 70 | return BT_GATT_ERR(BT_ATT_ERR_INVALID_OFFSET); 71 | } 72 | 73 | memcpy(value + offset, buf, len); 74 | ct_update = 1U; 75 | 76 | return len; 77 | } 78 | 79 | /* Current Time Service Declaration */ 80 | BT_GATT_SERVICE_DEFINE(cts_cvs, 81 | BT_GATT_PRIMARY_SERVICE(BT_UUID_CTS), 82 | BT_GATT_CHARACTERISTIC(BT_UUID_CTS_CURRENT_TIME, BT_GATT_CHRC_READ | 83 | BT_GATT_CHRC_NOTIFY | BT_GATT_CHRC_WRITE, 84 | BT_GATT_PERM_READ | BT_GATT_PERM_WRITE, 85 | read_ct, write_ct, ct), 86 | BT_GATT_CCC(ct_ccc_cfg_changed, BT_GATT_PERM_READ | BT_GATT_PERM_WRITE), 87 | ); 88 | 89 | static void generate_current_time(u8_t *buf) 90 | { 91 | u16_t year; 92 | 93 | /* 'Exact Time 256' contains 'Day Date Time' which contains 94 | * 'Date Time' - characteristic contains fields for: 95 | * year, month, day, hours, minutes and seconds. 96 | */ 97 | 98 | year = sys_cpu_to_le16(2020); 99 | memcpy(buf, &year, 2); /* year */ 100 | buf[2] = 1U; /* months starting from 1 */ 101 | buf[3] = 2U; /* day */ 102 | buf[4] = 3U; /* hours */ 103 | buf[5] = 4U; /* minutes */ 104 | buf[6] = 5U; /* seconds */ 105 | 106 | /* 'Day of Week' part of 'Day Date Time' */ 107 | buf[7] = 1U; /* day of week starting from 1 */ 108 | 109 | /* 'Fractions 256 part of 'Exact Time 256' */ 110 | buf[8] = 0U; 111 | 112 | /* Adjust reason */ 113 | buf[9] = 0U; /* No update, change, etc */ 114 | } 115 | 116 | void cts_init(void) 117 | { 118 | /* Simulate current time for Current Time Service */ 119 | generate_current_time(ct); 120 | } 121 | 122 | void cts_loop(void) 123 | { /* Current Time Service updates only when time is changed */ 124 | if (!ct_update) { 125 | return; 126 | } 127 | 128 | ct_update = 0U; 129 | bt_gatt_notify(NULL, &cts_cvs.attrs[1], &ct, sizeof(ct)); 130 | printk("Bluetooth CTS time updated: %01x%01x...", ct[0], ct[1]); 131 | } 132 | -------------------------------------------------------------------------------- /app/include/Print.h: -------------------------------------------------------------------------------- 1 | /* 2 | Print.h - Base class that provides print() and println() 3 | Copyright (c) 2008 David A. Mellis. All right reserved. 4 | 5 | This library is free software; you can redistribute it and/or 6 | modify it under the terms of the GNU Lesser General Public 7 | License as published by the Free Software Foundation; either 8 | version 2.1 of the License, or (at your option) any later version. 9 | 10 | This library is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 | Lesser General Public License for more details. 14 | 15 | You should have received a copy of the GNU Lesser General Public 16 | License along with this library; if not, write to the Free Software 17 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 18 | */ 19 | 20 | #ifndef Print_h 21 | #define Print_h 22 | 23 | #include 24 | #include 25 | 26 | #include "WString.h" 27 | #include "Printable.h" 28 | 29 | #define DEC 10 30 | #define HEX 16 31 | #define OCT 8 32 | #define BIN 2 33 | 34 | class Print { 35 | private: 36 | int write_error; 37 | size_t printNumber(unsigned long, uint8_t); 38 | size_t printFloat(double, uint8_t); 39 | protected: 40 | void setWriteError(int err = 1) { 41 | write_error = err; 42 | } 43 | public: 44 | Print() : 45 | write_error(0) { 46 | } 47 | 48 | int getWriteError() { 49 | return write_error; 50 | } 51 | void clearWriteError() { 52 | setWriteError(0); 53 | } 54 | 55 | virtual size_t write(uint8_t) = 0; 56 | size_t write(const char *str) { 57 | if(str == NULL) 58 | return 0; 59 | return write((const uint8_t *) str, strlen(str)); 60 | } 61 | virtual size_t write(const uint8_t *buffer, size_t size); 62 | size_t write(const char *buffer, size_t size) { 63 | return write((const uint8_t *) buffer, size); 64 | } 65 | // These handle ambiguity for write(0) case, because (0) can be a pointer or an integer 66 | inline size_t write(short t) { return write((uint8_t)t); } 67 | inline size_t write(unsigned short t) { return write((uint8_t)t); } 68 | inline size_t write(int t) { return write((uint8_t)t); } 69 | inline size_t write(unsigned int t) { return write((uint8_t)t); } 70 | inline size_t write(long t) { return write((uint8_t)t); } 71 | inline size_t write(unsigned long t) { return write((uint8_t)t); } 72 | // Enable write(char) to fall through to write(uint8_t) 73 | inline size_t write(char c) { return write((uint8_t) c); } 74 | inline size_t write(int8_t c) { return write((uint8_t) c); } 75 | 76 | size_t printf(const char * format, ...) __attribute__ ((format (printf, 2, 3))); 77 | size_t print(const String &); 78 | size_t print(const char[]); 79 | size_t print(char); 80 | size_t print(unsigned char, int = DEC); 81 | size_t print(int, int = DEC); 82 | size_t print(unsigned int, int = DEC); 83 | size_t print(long, int = DEC); 84 | size_t print(unsigned long, int = DEC); 85 | size_t print(double, int = 2); 86 | size_t print(const Printable&); 87 | 88 | size_t println(const __FlashStringHelper *); 89 | size_t println(const String &s); 90 | size_t println(const char[]); 91 | size_t println(char); 92 | size_t println(unsigned char, int = DEC); 93 | size_t println(int, int = DEC); 94 | size_t println(unsigned int, int = DEC); 95 | size_t println(long, int = DEC); 96 | size_t println(unsigned long, int = DEC); 97 | size_t println(double, int = 2); 98 | size_t println(const Printable&); 99 | size_t println(void); 100 | 101 | virtual void flush() { /* Empty implementation for backward compatibility */ } 102 | }; 103 | 104 | #endif 105 | 106 | -------------------------------------------------------------------------------- /app/src/lib/GFX.cpp: -------------------------------------------------------------------------------- 1 | #include "log.h" 2 | #include "GFX.h" 3 | #include "Adafruit-GFX-Library/Adafruit_GFX.h" 4 | 5 | #define GFX_MEMPOOL 6 | #ifdef GFX_MEMPOOL 7 | #define GFX_MEMPOOL_MAX 16384 8 | K_MEM_POOL_DEFINE(gfx_pool, 64, GFX_MEMPOOL_MAX, 1, 4); 9 | #endif 10 | 11 | #define color_size 2 12 | 13 | inline void write_buffer(device* display_dev, int16_t x, int16_t y, int16_t w, int16_t h, u8_t* b) { 14 | struct display_buffer_descriptor d; 15 | d.pitch = w; 16 | d.width = w; 17 | d.height = h; 18 | display_write(display_dev, x, y, &d, b); 19 | } 20 | 21 | GFX::GFX(struct device* display_dev, int16_t w, int16_t h) : Adafruit_GFX(w,h) { 22 | this->display_dev = display_dev; 23 | this->pixelBufferDesc.pitch = 1; 24 | this->pixelBufferDesc.width = 1; 25 | this->pixelBufferDesc.height = 1; 26 | }; 27 | 28 | void GFX::drawPixel(int16_t x, int16_t y, uint16_t color) 29 | { 30 | if (this->buffer == NULL) { 31 | u8_t b[2]; 32 | b[0] = (color >> 8); 33 | b[1] = (color >> 0); 34 | display_write(display_dev, x, y, &this->pixelBufferDesc, &b); 35 | } else { 36 | this->writePixel(x, y, color); 37 | } 38 | } 39 | 40 | void GFX::startWrite() {} 41 | 42 | void GFX::writePixel(int16_t x, int16_t y, uint16_t color) { 43 | if (this->buffer == NULL) { 44 | drawPixel(x, y, color); 45 | } else { 46 | if (x < this->bx || x >= this->bx + this->bw 47 | || y < this->by || y >= this->by + this->bh) { 48 | return; // out of buffer bounds 49 | } 50 | 51 | int i = x - this->bx + (y - this->by) * this->bw; 52 | this->buffer[i * color_size + 0] = color >> 8; 53 | this->buffer[i * color_size + 1] = color >> 0; 54 | // waiting to flush the buffer 55 | } 56 | } 57 | 58 | void GFX::writeFastVLine(int16_t x, int16_t y, int16_t h, 59 | uint16_t color) { 60 | writeFillRect(x, y, 1, h, color); 61 | } 62 | 63 | void GFX::writeFastHLine(int16_t x, int16_t y, int16_t w, 64 | uint16_t color) { 65 | writeFillRect(x, y, w, 1, color); 66 | } 67 | 68 | void GFX::writeFillRect(int16_t x, int16_t y, int16_t w, int16_t h, 69 | uint16_t color) { 70 | if (this->buffer == NULL) { 71 | u8_t b[2 * w * h]; 72 | // TODO: optimize 73 | for (int i = 0; i < w * h; i++) { 74 | b[i * 2 + 0] = color >> 8; 75 | b[i * 2 + 1] = color >> 0; 76 | } 77 | write_buffer(display_dev, x, y, w, h, b); 78 | } else { 79 | for (int rx = 0; rx < w; rx++) { 80 | for (int ry = 0; ry < h; ry++) { 81 | this->writePixel(x + rx, y + ry, color); 82 | } 83 | } 84 | // waiting to flush the buffer 85 | } 86 | } 87 | 88 | void GFX::endWrite() {} 89 | 90 | void GFX::openBuffer(int16_t x, int16_t y, int16_t w, int16_t h) { 91 | size_t bufsize = w*h*color_size; 92 | #ifdef GFX_MEMPOOL 93 | if (bufsize > GFX_MEMPOOL_MAX) { 94 | this->buffer = NULL; 95 | LOG_WRN("Mem pool alloc for %d B is out of bounds.", bufsize); 96 | } else if (0 != (this->buffer = (u8_t*)k_mem_pool_malloc(&gfx_pool, bufsize))) { 97 | memset(this->buffer, 0, bufsize); 98 | LOG_DBG("Mem pool alloc for %d B allocated.", bufsize); 99 | } else { 100 | LOG_WRN("Mem pool alloc for %d B failed.", bufsize); 101 | } 102 | #else 103 | this->buffer = new u8_t[bufsize]; 104 | if (!this->buffer) { 105 | LOG_WRN("Failed to allocate GFX buffer %d x %d pixels.", w, h); 106 | } 107 | #endif 108 | this->bx = x; 109 | this->by = y; 110 | this->bw = w; 111 | this->bh = h; 112 | } 113 | 114 | void GFX::flushBuffer() { 115 | write_buffer(display_dev, this->bx, this->by, this->bw, this->bh, 116 | this->buffer); 117 | #ifdef GFX_MEMPOOL 118 | k_free(this->buffer); 119 | #else 120 | delete[] this->buffer; 121 | #endif 122 | this->buffer = NULL; 123 | } 124 | 125 | /** 126 | * GFX Factory 127 | */ 128 | GFX* createGFX(struct device* display_dev) 129 | { 130 | struct display_capabilities capabilities; 131 | display_get_capabilities(display_dev, &capabilities); 132 | 133 | int sw = capabilities.x_resolution; 134 | int sh = capabilities.y_resolution; 135 | 136 | return new GFX(display_dev, sw, sh); 137 | } 138 | 139 | 140 | -------------------------------------------------------------------------------- /app/src/ui/widget/console.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | extern "C" { 3 | #include 4 | #include 5 | } 6 | #include "console.h" 7 | 8 | static int console_w = 39; 9 | static unsigned int COLOR_TEXT_OLD = 0x05A0; 10 | static unsigned int COLOR_TEXT_NEW = 0x0FE0; 11 | 12 | void draw_line_text(GFX* tft, u16_t basex, u16_t basey, u16_t h, char* line_text, 13 | u16_t line, bool highlight) 14 | { 15 | int x = basex; 16 | int w = tft->width() - 2*x; 17 | int y = basey + line * h; 18 | 19 | tft->openBuffer(x, y, w, h); 20 | tft->setCursor(x + 1, y + 1); 21 | tft->setTextSize(1); 22 | if (highlight) { 23 | tft->setTextColor(COLOR_TEXT_NEW); 24 | tft->fillRect(x, y, w, h, ST77XX_BLACK); 25 | } else { 26 | tft->setTextColor(COLOR_TEXT_OLD); 27 | tft->fillRect(x, y, w, h, ST77XX_BLACK); 28 | } 29 | tft->print(line_text); 30 | tft->flushBuffer(); 31 | } 32 | 33 | UiwConsole::UiwConsole(GFX* tft) 34 | { 35 | this->tft = tft; 36 | memset(this->line_text, 0, sizeof(this->line_text)); 37 | } 38 | 39 | void UiwConsole::init() 40 | { 41 | u16_t top = 40; 42 | u16_t middle = this->lines * this->h; 43 | u16_t bottom = 320 - (top + middle); 44 | display_scroll_region(top, middle, bottom); 45 | } 46 | 47 | void UiwConsole::draw() 48 | { 49 | } 50 | 51 | void UiwConsole::append(char* text) 52 | { 53 | strcat(this->line_text, text); 54 | } 55 | 56 | void UiwConsole::print() 57 | { 58 | char* subline = this->line_text; 59 | char console_line[console_w + 1]; 60 | while (strlen(subline) > console_w 61 | || (strlen(subline) > 0 && strchr(subline, '\n') != NULL)) { 62 | int line_length = MIN(strlen(subline), console_w); 63 | memset(console_line, 0, sizeof(console_line)); 64 | memcpy(console_line, subline, line_length); 65 | char* newlinePtr = strchr(console_line, '\n'); 66 | if (newlinePtr != NULL) { 67 | (*newlinePtr) = 0; 68 | line_length = strlen(console_line) + 1; 69 | } 70 | this->draw_history_line(console_line); 71 | this->draw_newline(); 72 | subline = subline + line_length; 73 | } 74 | strcpy(console_line, subline); 75 | memset(this->line_text, 0, sizeof(this->line_text)); 76 | strcpy(this->line_text, console_line); 77 | 78 | this->draw_current_line(this->line_text); 79 | } 80 | 81 | void UiwConsole::print(char* text) 82 | { 83 | this->append(text); 84 | this->print(); 85 | } 86 | 87 | void UiwConsole::println(char* text) 88 | { 89 | this->append(text); 90 | this->println(); 91 | } 92 | 93 | void UiwConsole::println() 94 | { 95 | this->draw_history_line(this->line_text); 96 | this->draw_newline(); 97 | memset(this->line_text, 0, sizeof(this->line_text)); 98 | } 99 | 100 | void UiwConsole::appendTimestamp() 101 | { 102 | struct tm* tm_ptr = clock_get_datetime(); 103 | uint8_t hours = tm_ptr->tm_hour; 104 | uint8_t minutes = tm_ptr->tm_min; 105 | uint8_t seconds = tm_ptr->tm_sec; 106 | 107 | static char timestamp[32]; 108 | memset(timestamp, 0, sizeof(timestamp)); 109 | sprintf(timestamp, "[%02d:%02d:%02d] ", hours, minutes, seconds); 110 | 111 | this->append(timestamp); 112 | } 113 | 114 | void UiwConsole::printTimestamp() 115 | { 116 | this->appendTimestamp(); 117 | this->print(); 118 | } 119 | 120 | void UiwConsole::printlnTimestamped(char* text) 121 | { 122 | this->appendTimestamp(); 123 | this->println(text); 124 | } 125 | 126 | void UiwConsole::clear() 127 | {} 128 | 129 | void UiwConsole::deinit() 130 | {} 131 | 132 | void UiwConsole::draw_history_line(char* text) 133 | { 134 | draw_line_text(this->tft, this->basex, this->basey, this->h, 135 | text, (this->line + this->lines - 2) % this->lines, false); 136 | } 137 | 138 | void UiwConsole::draw_current_line(char* text) 139 | { 140 | draw_line_text(this->tft, this->basex, this->basey, this->h, 141 | text, (this->line + this->lines - 2) % this->lines, true); 142 | } 143 | 144 | void UiwConsole::draw_newline() 145 | { 146 | display_scroll_offset(40 + this->line * this->h); 147 | this->line = (this->line + 1) % this->lines; 148 | } -------------------------------------------------------------------------------- /app/src/service/cts_sync.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include "log.h" 8 | #include 9 | #include 10 | #include "cts.h" 11 | #include "cts_sync.h" 12 | 13 | #define TIME_SYNC_WAIT 60 // TODO: tune 14 | int time_sync_timeout = TIME_SYNC_WAIT; 15 | static struct bt_gatt_discover_params cts_discovery_params; 16 | static struct bt_uuid_16 uuid = BT_UUID_INIT_16(0); 17 | static struct bt_gatt_read_params read_params; 18 | 19 | static void sync_cts_to_clock(cts_datetime_t* cts_datetime) 20 | { 21 | LOG_DBG("CTS sync to clock started.\n Y%04d D%03d T%2d:%2d:%2d", 22 | cts_datetime->year, cts_datetime->day, 23 | cts_datetime->hours, cts_datetime->minutes, cts_datetime->seconds); 24 | 25 | struct tm clock_datetime; 26 | memset(&clock_datetime, 0, sizeof(struct tm)); 27 | clock_datetime.tm_year = cts_datetime->year; 28 | clock_datetime.tm_mon = cts_datetime->month; 29 | clock_datetime.tm_mday = cts_datetime->day; 30 | clock_datetime.tm_hour = cts_datetime->hours; 31 | clock_datetime.tm_min = cts_datetime->minutes; 32 | clock_datetime.tm_sec = cts_datetime->seconds; 33 | 34 | clock_set_datetime(&clock_datetime); 35 | 36 | LOG_INF("CTS sync to clock complete."); 37 | 38 | time_sync_timeout = TIME_SYNC_WAIT; 39 | } 40 | 41 | static void sync_local_cts_to_clock() 42 | { 43 | cts_datetime_t cts_datetime; 44 | cts_get_datetime(&cts_datetime); 45 | sync_cts_to_clock(&cts_datetime); 46 | } 47 | 48 | static void cts_write_cb(int val) 49 | { 50 | sync_local_cts_to_clock(); 51 | } 52 | 53 | int offset = 0; 54 | cts_datetime_t datetime_buf; 55 | u8_t cts_sync_read(struct bt_conn *conn, u8_t err, 56 | struct bt_gatt_read_params *params, 57 | const void *data, u16_t length) 58 | { 59 | LOG_DBG("Reading CCC data: err %d, %d bytes, offset %d.", err, length, offset); 60 | 61 | if (!data || length <= 0) { 62 | sync_cts_to_clock(&datetime_buf); 63 | return BT_GATT_ITER_STOP; 64 | } 65 | 66 | memcpy(&datetime_buf + offset, data, length); 67 | offset += length; 68 | 69 | return BT_GATT_ITER_CONTINUE; 70 | } 71 | 72 | u8_t cts_sync_service_discovered(struct bt_conn* conn, const struct bt_gatt_attr* attr, 73 | struct bt_gatt_discover_params* params) 74 | { 75 | if (!attr) { 76 | LOG_DBG("CTS Service Discovery completed"); 77 | return BT_GATT_ITER_STOP; 78 | } 79 | LOG_DBG("Discovered attribute, handle: %u\n", attr->handle); 80 | 81 | memset(&read_params, 0, sizeof(read_params)); 82 | read_params.func = cts_sync_read; 83 | read_params.by_uuid.uuid = &uuid; 84 | read_params.by_uuid.start_handle = attr->handle; 85 | read_params.by_uuid.end_handle = 0xffff; 86 | offset = 0; 87 | if (bt_gatt_read(conn, &read_params) < 0) { 88 | LOG_WRN("Could not initiate read of CCC data."); 89 | } 90 | 91 | return BT_GATT_ITER_STOP; 92 | } 93 | 94 | static void cts_sync_processor(struct bt_conn *conn, void *data) 95 | { 96 | memcpy(&uuid, BT_UUID_CTS_CURRENT_TIME, sizeof(uuid)); 97 | cts_discovery_params.func = cts_sync_service_discovered; 98 | cts_discovery_params.start_handle = 0x0001; 99 | cts_discovery_params.end_handle = 0xFFFF; 100 | cts_discovery_params.type = BT_GATT_DISCOVER_CHARACTERISTIC; 101 | cts_discovery_params.uuid = &uuid; 102 | 103 | if (bt_gatt_discover(conn, &cts_discovery_params) != 0) { 104 | LOG_ERR("CTS Sync > GATT discovery FAILED.\n"); 105 | } 106 | } 107 | 108 | static void connected(struct bt_conn *conn, u8_t err) 109 | { 110 | if (err) { 111 | return; 112 | } 113 | cts_sync_processor(conn, NULL); 114 | } 115 | 116 | static void disconnected(struct bt_conn *conn, u8_t reason) 117 | { 118 | } 119 | 120 | static struct bt_conn_cb conn_callbacks = { 121 | .connected = connected, 122 | .disconnected = disconnected, 123 | }; 124 | 125 | void cts_sync_init() 126 | { 127 | bt_conn_cb_register(&conn_callbacks); 128 | cts_register_write_cb(cts_write_cb); 129 | sync_local_cts_to_clock(); 130 | } 131 | 132 | void cts_sync_loop() 133 | { 134 | if (time_sync_timeout > 0) { 135 | time_sync_timeout--; 136 | } else { 137 | bt_conn_foreach(BT_CONN_TYPE_ALL, cts_sync_processor, NULL); 138 | time_sync_timeout = TIME_SYNC_WAIT; 139 | } 140 | } 141 | -------------------------------------------------------------------------------- /app/src/hw/bt.c: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2015-2016 Intel Corporation 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | */ 6 | 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | 15 | #include 16 | 17 | #include 18 | #include 19 | #include 20 | #include 21 | #include 22 | #include 23 | #include 24 | 25 | #include "log.h" 26 | #include "bt.h" 27 | 28 | static uint8_t bt_connection_status = BT_STATUS_DISCONNECTED; 29 | 30 | static bool advertising = false; 31 | #define ADVERTISING_TIMEOUT 10 32 | static u16_t advertising_timeout = ADVERTISING_TIMEOUT; 33 | 34 | static const struct bt_data ad[] = { 35 | BT_DATA_BYTES(BT_DATA_FLAGS, (BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR)), 36 | BT_DATA_BYTES(BT_DATA_UUID16_ALL, 37 | 0x0d, 0x18, 0x0f, 0x18, 0x05, 0x18), 38 | BT_DATA_BYTES(BT_DATA_UUID128_ALL, 39 | 0xf0, 0xde, 0xbc, 0x9a, 0x78, 0x56, 0x34, 0x12, 40 | 0x78, 0x56, 0x34, 0x12, 0x78, 0x56, 0x34, 0x12), 41 | }; 42 | 43 | static void connected(struct bt_conn *conn, u8_t err) 44 | { 45 | if (err) { 46 | LOG_WRN("BT Connection failed (err 0x%02x).", err); 47 | } else { 48 | LOG_INF("BT Connected."); 49 | bt_connection_status = BT_STATUS_CONNECTED; 50 | } 51 | } 52 | 53 | static void disconnected(struct bt_conn *conn, u8_t reason) 54 | { 55 | LOG_INF("BT Disconnected (reason 0x%02x).", reason); 56 | bt_connection_status = BT_STATUS_DISCONNECTED; 57 | } 58 | 59 | static struct bt_conn_cb conn_callbacks = { 60 | .connected = connected, 61 | .disconnected = disconnected, 62 | }; 63 | 64 | static void bt_advertising_stop() 65 | { 66 | if (!advertising) { 67 | return; 68 | } 69 | 70 | int err = bt_le_adv_stop(); 71 | if (err) { 72 | LOG_ERR("Bluetooth advertising failed to stop (err %d).", err); 73 | advertising = true; 74 | return; 75 | } 76 | advertising = false; 77 | advertising_timeout = ADVERTISING_TIMEOUT; 78 | LOG_INF("Bluetooth advertising successfully stopped."); 79 | } 80 | 81 | static void bt_advertising_start() 82 | { 83 | if (advertising) { 84 | return; 85 | } 86 | 87 | int err = bt_le_adv_start(BT_LE_ADV_CONN_NAME, ad, ARRAY_SIZE(ad), NULL, 0); 88 | if (err) { 89 | LOG_ERR("Bluetooth advertising failed to start (err %d).", err); 90 | advertising = false; 91 | advertising_timeout = ADVERTISING_TIMEOUT; 92 | return; 93 | } 94 | advertising = true; 95 | LOG_INF("Bluetooth advertising successfully started."); 96 | } 97 | 98 | static void bt_ready(void) 99 | { 100 | if (IS_ENABLED(CONFIG_SETTINGS)) { 101 | LOG_INF("Settings loading."); 102 | settings_load(); 103 | } else { 104 | LOG_INF("Settings not enabled"); 105 | } 106 | 107 | bt_advertising_start(); 108 | } 109 | 110 | static void auth_passkey_display(struct bt_conn *conn, unsigned int passkey) 111 | { 112 | char addr[BT_ADDR_LE_STR_LEN]; 113 | 114 | bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr)); 115 | 116 | LOG_INF("Passkey for %s: %06u\n", addr, passkey); 117 | } 118 | 119 | static void auth_cancel(struct bt_conn *conn) 120 | { 121 | char addr[BT_ADDR_LE_STR_LEN]; 122 | 123 | bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr)); 124 | 125 | LOG_INF("Pairing cancelled: %s\n", addr); 126 | } 127 | 128 | static struct bt_conn_auth_cb auth_cb_display = { 129 | .passkey_display = auth_passkey_display, 130 | .passkey_entry = NULL, 131 | .cancel = auth_cancel, 132 | }; 133 | 134 | static void bas_notify(void) 135 | { 136 | u8_t battery_level = bt_gatt_bas_get_battery_level(); 137 | 138 | battery_level--; 139 | 140 | if (!battery_level) { 141 | battery_level = 100U; 142 | } 143 | 144 | bt_gatt_bas_set_battery_level(battery_level); 145 | } 146 | 147 | static void hrs_notify(void) 148 | { 149 | static u8_t heartrate = 90U; 150 | 151 | /* Heartrate measurements simulation */ 152 | heartrate++; 153 | if (heartrate == 160U) { 154 | heartrate = 90U; 155 | } 156 | 157 | bt_gatt_hrs_notify(heartrate); 158 | } 159 | 160 | void bt_setup(void) 161 | { 162 | int err; 163 | 164 | err = bt_enable(NULL); 165 | if (err) { 166 | LOG_ERR("Bluetooth init failed (err %d)\n", err); 167 | return; 168 | } 169 | 170 | bt_ready(); 171 | 172 | bt_conn_cb_register(&conn_callbacks); 173 | bt_conn_auth_cb_register(&auth_cb_display); 174 | 175 | LOG_INF("Bluetooth inited."); 176 | } 177 | 178 | void bt_loop() 179 | { 180 | /* Implement notification. At the moment there is no suitable way 181 | * of starting delayed work so we do it here 182 | */ 183 | 184 | /* Heartrate measurements simulation */ 185 | hrs_notify(); 186 | 187 | /* Battery level simulation */ 188 | bas_notify(); 189 | 190 | if (!advertising) { 191 | if (advertising_timeout <= 0) { 192 | bt_advertising_start(); 193 | advertising_timeout = ADVERTISING_TIMEOUT; 194 | } else { 195 | advertising_timeout--; 196 | } 197 | } 198 | } 199 | 200 | uint8_t bt_get_connection_status() 201 | { 202 | return bt_connection_status; 203 | } 204 | -------------------------------------------------------------------------------- /app/src/lib/Adafruit-GFX-Library/Fonts/Tiny3x3a2pt7b.h: -------------------------------------------------------------------------------- 1 | /** 2 | ** The FontStruction “Tiny3x3a” 3 | ** (https://fontstruct.com/fontstructions/show/670512) by “Michaelangel007” is 4 | ** licensed under a Creative Commons Attribution Non-commercial Share Alike 5 | *license 6 | ** (http://creativecommons.org/licenses/by-nc-sa/3.0/). 7 | ** “Tiny3x3a” was originally cloned (copied) from the FontStruction 8 | ** “CHECKER” (https://fontstruct.com/fontstructions/show/2391) by Wolf grant 9 | ** Grant, which is licensed under a Creative Commons Attribution Non-commercial 10 | ** Share Alike license (http://creativecommons.org/licenses/by-nc-sa/3.0/). 11 | * 12 | * Converted by eadmaster with fontconvert 13 | **/ 14 | 15 | const uint8_t Tiny3x3a2pt7bBitmaps[] PROGMEM = { 16 | 0xC0, 0xB4, 0xBF, 0x80, 0x6B, 0x00, 0xDD, 0x80, 0x59, 0x80, 0x80, 0x64, 17 | 0x98, 0xF0, 0x5D, 0x00, 0xC0, 0xE0, 0x80, 0x2A, 0x00, 0x55, 0x00, 0x94, 18 | 0xC9, 0x80, 0xEF, 0x80, 0xBC, 0x80, 0x6B, 0x00, 0x9F, 0x80, 0xE4, 0x80, 19 | 0x7F, 0x00, 0xFC, 0x80, 0xA0, 0x58, 0x64, 0xE3, 0x80, 0x98, 0xD8, 0xD8, 20 | 0x80, 0x5E, 0x80, 0xDF, 0x80, 0x71, 0x80, 0xD7, 0x00, 0xFB, 0x80, 0xFA, 21 | 0x00, 0xD7, 0x80, 0xBE, 0x80, 0xE0, 0x27, 0x00, 0xBA, 0x80, 0x93, 0x80, 22 | 0xFE, 0x80, 0xF6, 0x80, 0xF7, 0x80, 0xFE, 0x00, 0xF7, 0x00, 0xDE, 0x80, 23 | 0x6B, 0x00, 0xE9, 0x00, 0xB7, 0x80, 0xB5, 0x00, 0xBF, 0x80, 0xAA, 0x80, 24 | 0xA9, 0x00, 0xEB, 0x80, 0xEC, 0x88, 0x80, 0xDC, 0x54, 0xE0, 0x90, 0x70, 25 | 0xBC, 0xF0, 0x7C, 0xB0, 0x68, 0xFC, 0xBC, 0xC0, 0x58, 0x9A, 0x80, 0xA4, 26 | 0xDC, 0xD4, 0xF0, 0xF8, 0xF4, 0xE0, 0x60, 0x59, 0x80, 0xBC, 0xA8, 0xEC, 27 | 0xF0, 0xAC, 0x80, 0x90, 0x79, 0x80, 0xF0, 0xCF, 0x00, 0x78}; 28 | 29 | const GFXglyph Tiny3x3a2pt7bGlyphs[] PROGMEM = { 30 | {0, 0, 0, 4, 0, 1}, // 0x20 ' ' 31 | {0, 1, 2, 3, 1, -2}, // 0x21 '!' 32 | {1, 3, 2, 4, 0, -2}, // 0x22 '"' 33 | {2, 3, 3, 4, 0, -2}, // 0x23 '#' 34 | {4, 3, 3, 4, 0, -2}, // 0x24 '$' 35 | {6, 3, 3, 4, 0, -2}, // 0x25 '%' 36 | {8, 3, 3, 4, 0, -2}, // 0x26 '&' 37 | {10, 1, 1, 3, 1, -2}, // 0x27 ''' 38 | {11, 2, 3, 3, 0, -2}, // 0x28 '(' 39 | {12, 2, 3, 4, 1, -2}, // 0x29 ')' 40 | {13, 2, 2, 4, 1, -2}, // 0x2A '*' 41 | {14, 3, 3, 4, 0, -2}, // 0x2B '+' 42 | {16, 1, 2, 2, 0, 0}, // 0x2C ',' 43 | {17, 3, 1, 4, 0, -1}, // 0x2D '-' 44 | {18, 1, 1, 2, 0, 0}, // 0x2E '.' 45 | {19, 3, 3, 4, 0, -2}, // 0x2F '/' 46 | {21, 3, 3, 4, 0, -2}, // 0x30 '0' 47 | {23, 2, 3, 3, 0, -2}, // 0x31 '1' 48 | {24, 3, 3, 4, 0, -2}, // 0x32 '2' 49 | {26, 3, 3, 4, 0, -2}, // 0x33 '3' 50 | {28, 3, 3, 4, 0, -2}, // 0x34 '4' 51 | {30, 3, 3, 4, 0, -2}, // 0x35 '5' 52 | {32, 3, 3, 4, 0, -2}, // 0x36 '6' 53 | {34, 3, 3, 4, 0, -2}, // 0x37 '7' 54 | {36, 3, 3, 4, 0, -2}, // 0x38 '8' 55 | {38, 3, 3, 4, 0, -2}, // 0x39 '9' 56 | {40, 1, 3, 3, 1, -2}, // 0x3A ':' 57 | {41, 2, 3, 3, 0, -1}, // 0x3B ';' 58 | {42, 2, 3, 3, 0, -2}, // 0x3C '<' 59 | {43, 3, 3, 4, 0, -2}, // 0x3D '=' 60 | {45, 2, 3, 4, 1, -2}, // 0x3E '>' 61 | {46, 2, 3, 4, 1, -2}, // 0x3F '?' 62 | {47, 3, 3, 4, 0, -2}, // 0x40 '@' 63 | {49, 3, 3, 4, 0, -2}, // 0x41 'A' 64 | {51, 3, 3, 4, 0, -2}, // 0x42 'B' 65 | {53, 3, 3, 4, 0, -2}, // 0x43 'C' 66 | {55, 3, 3, 4, 0, -2}, // 0x44 'D' 67 | {57, 3, 3, 4, 0, -2}, // 0x45 'E' 68 | {59, 3, 3, 4, 0, -2}, // 0x46 'F' 69 | {61, 3, 3, 4, 0, -2}, // 0x47 'G' 70 | {63, 3, 3, 4, 0, -2}, // 0x48 'H' 71 | {65, 1, 3, 3, 1, -2}, // 0x49 'I' 72 | {66, 3, 3, 4, 0, -2}, // 0x4A 'J' 73 | {68, 3, 3, 4, 0, -2}, // 0x4B 'K' 74 | {70, 3, 3, 4, 0, -2}, // 0x4C 'L' 75 | {72, 3, 3, 4, 0, -2}, // 0x4D 'M' 76 | {74, 3, 3, 4, 0, -2}, // 0x4E 'N' 77 | {76, 3, 3, 4, 0, -2}, // 0x4F 'O' 78 | {78, 3, 3, 4, 0, -2}, // 0x50 'P' 79 | {80, 3, 3, 4, 0, -2}, // 0x51 'Q' 80 | {82, 3, 3, 4, 0, -2}, // 0x52 'R' 81 | {84, 3, 3, 4, 0, -2}, // 0x53 'S' 82 | {86, 3, 3, 4, 0, -2}, // 0x54 'T' 83 | {88, 3, 3, 4, 0, -2}, // 0x55 'U' 84 | {90, 3, 3, 4, 0, -2}, // 0x56 'V' 85 | {92, 3, 3, 4, 0, -2}, // 0x57 'W' 86 | {94, 3, 3, 4, 0, -2}, // 0x58 'X' 87 | {96, 3, 3, 4, 0, -2}, // 0x59 'Y' 88 | {98, 3, 3, 4, 0, -2}, // 0x5A 'Z' 89 | {100, 2, 3, 3, 0, -2}, // 0x5B '[' 90 | {101, 3, 3, 4, 0, -2}, // 0x5C '\' 91 | {103, 2, 3, 4, 1, -2}, // 0x5D ']' 92 | {104, 3, 2, 4, 0, -2}, // 0x5E '^' 93 | {105, 3, 1, 4, 0, 0}, // 0x5F '_' 94 | {106, 2, 2, 3, 0, -2}, // 0x60 '`' 95 | {107, 2, 2, 3, 0, -1}, // 0x61 'a' 96 | {108, 2, 3, 3, 0, -2}, // 0x62 'b' 97 | {109, 2, 2, 3, 0, -1}, // 0x63 'c' 98 | {110, 2, 3, 3, 0, -2}, // 0x64 'd' 99 | {111, 2, 2, 3, 0, -1}, // 0x65 'e' 100 | {112, 2, 3, 3, 0, -2}, // 0x66 'f' 101 | {113, 2, 3, 3, 0, -1}, // 0x67 'g' 102 | {114, 2, 3, 3, 0, -2}, // 0x68 'h' 103 | {115, 1, 2, 2, 0, -1}, // 0x69 'i' 104 | {116, 2, 3, 3, 0, -1}, // 0x6A 'j' 105 | {117, 3, 3, 4, 0, -2}, // 0x6B 'k' 106 | {119, 2, 3, 3, 0, -2}, // 0x6C 'l' 107 | {120, 3, 2, 4, 0, -1}, // 0x6D 'm' 108 | {121, 3, 2, 4, 0, -1}, // 0x6E 'n' 109 | {122, 2, 2, 3, 0, -1}, // 0x6F 'o' 110 | {123, 2, 3, 3, 0, -1}, // 0x70 'p' 111 | {124, 2, 3, 3, 0, -1}, // 0x71 'q' 112 | {125, 2, 2, 3, 0, -1}, // 0x72 'r' 113 | {126, 2, 2, 3, 0, -1}, // 0x73 's' 114 | {127, 3, 3, 4, 0, -2}, // 0x74 't' 115 | {129, 3, 2, 4, 0, -1}, // 0x75 'u' 116 | {130, 3, 2, 4, 0, -1}, // 0x76 'v' 117 | {131, 3, 2, 4, 0, -1}, // 0x77 'w' 118 | {132, 2, 2, 3, 0, -1}, // 0x78 'x' 119 | {133, 3, 3, 4, 0, -1}, // 0x79 'y' 120 | {135, 2, 2, 3, 0, -1}, // 0x7A 'z' 121 | {136, 3, 3, 4, 0, -2}, // 0x7B '{' 122 | {138, 1, 4, 3, 1, -2}, // 0x7C '|' 123 | {139, 3, 3, 4, 0, -2}, // 0x7D '}' 124 | {141, 3, 2, 4, 0, -2}}; // 0x7E '~' 125 | 126 | const GFXfont Tiny3x3a2pt7b PROGMEM = {(uint8_t *)Tiny3x3a2pt7bBitmaps, 127 | (GFXglyph *)Tiny3x3a2pt7bGlyphs, 0x20, 128 | 0x7E, 4}; 129 | 130 | // Approx. 814 bytes 131 | -------------------------------------------------------------------------------- /app/include/Print.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | Print.cpp - Base class that provides print() and println() 3 | Copyright (c) 2008 David A. Mellis. All right reserved. 4 | 5 | This library is free software; you can redistribute it and/or 6 | modify it under the terms of the GNU Lesser General Public 7 | License as published by the Free Software Foundation; either 8 | version 2.1 of the License, or (at your option) any later version. 9 | 10 | This library is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 | Lesser General Public License for more details. 14 | 15 | You should have received a copy of the GNU Lesser General Public 16 | License along with this library; if not, write to the Free Software 17 | Foundation, Inc., 52 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 18 | 19 | Modified 23 November 2006 by David A. Mellis 20 | Modified December 2014 by Ivan Grokhotkov 21 | Modified May 2015 by Michael C. Miller - esp8266 progmem support 22 | */ 23 | 24 | #include 25 | #include 26 | #include 27 | #include 28 | #include 29 | 30 | #include "Print.h" 31 | 32 | // Public Methods ////////////////////////////////////////////////////////////// 33 | 34 | /* default implementation: may be overridden */ 35 | size_t Print::write(const uint8_t *buffer, size_t size) { 36 | 37 | #ifdef DEBUG_ESP_CORE 38 | static char not_the_best_way [] PROGMEM STORE_ATTR = "Print::write(data,len) should be overridden for better efficiency\r\n"; 39 | static bool once = false; 40 | if (!once) { 41 | once = true; 42 | os_printf_plus(not_the_best_way); 43 | } 44 | #endif 45 | 46 | size_t n = 0; 47 | int i = 0; 48 | while (size--) { 49 | size_t ret = write(buffer[i++]); 50 | if (ret == 0) { 51 | // Write of last byte didn't complete, abort additional processing 52 | break; 53 | } 54 | n += ret; 55 | } 56 | return n; 57 | } 58 | 59 | size_t Print::printf(const char *format, ...) { 60 | va_list arg; 61 | va_start(arg, format); 62 | char temp[64]; 63 | char* buffer = temp; 64 | size_t len = vsnprintf(temp, sizeof(temp), format, arg); 65 | va_end(arg); 66 | if (len > sizeof(temp) - 1) { 67 | buffer = new char[len + 1]; 68 | if (!buffer) { 69 | return 0; 70 | } 71 | va_start(arg, format); 72 | vsnprintf(buffer, len + 1, format, arg); 73 | va_end(arg); 74 | } 75 | len = write((const uint8_t*) buffer, len); 76 | if (buffer != temp) { 77 | delete[] buffer; 78 | } 79 | return len; 80 | } 81 | 82 | size_t Print::print(const String &s) { 83 | return write(s.c_str(), s.length()); 84 | } 85 | 86 | size_t Print::print(const char str[]) { 87 | return write(str); 88 | } 89 | 90 | size_t Print::print(char c) { 91 | return write(c); 92 | } 93 | 94 | size_t Print::print(unsigned char b, int base) { 95 | return print((unsigned long) b, base); 96 | } 97 | 98 | size_t Print::print(int n, int base) { 99 | return print((long) n, base); 100 | } 101 | 102 | size_t Print::print(unsigned int n, int base) { 103 | return print((unsigned long) n, base); 104 | } 105 | 106 | size_t Print::print(long n, int base) { 107 | if(base == 0) { 108 | return write(n); 109 | } else if(base == 10) { 110 | if(n < 0) { 111 | int t = print('-'); 112 | n = -n; 113 | return printNumber(n, 10) + t; 114 | } 115 | return printNumber(n, 10); 116 | } else { 117 | return printNumber(n, base); 118 | } 119 | } 120 | 121 | size_t Print::print(unsigned long n, int base) { 122 | if(base == 0) 123 | return write(n); 124 | else 125 | return printNumber(n, base); 126 | } 127 | 128 | size_t Print::print(double n, int digits) { 129 | return printFloat(n, digits); 130 | } 131 | 132 | size_t Print::println(const __FlashStringHelper *ifsh) { 133 | size_t n = print(ifsh); 134 | n += println(); 135 | return n; 136 | } 137 | 138 | size_t Print::print(const Printable& x) { 139 | return x.printTo(*this); 140 | } 141 | 142 | size_t Print::println(void) { 143 | return print("\r\n"); 144 | } 145 | 146 | size_t Print::println(const String &s) { 147 | size_t n = print(s); 148 | n += println(); 149 | return n; 150 | } 151 | 152 | size_t Print::println(const char c[]) { 153 | size_t n = print(c); 154 | n += println(); 155 | return n; 156 | } 157 | 158 | size_t Print::println(char c) { 159 | size_t n = print(c); 160 | n += println(); 161 | return n; 162 | } 163 | 164 | size_t Print::println(unsigned char b, int base) { 165 | size_t n = print(b, base); 166 | n += println(); 167 | return n; 168 | } 169 | 170 | size_t Print::println(int num, int base) { 171 | size_t n = print(num, base); 172 | n += println(); 173 | return n; 174 | } 175 | 176 | size_t Print::println(unsigned int num, int base) { 177 | size_t n = print(num, base); 178 | n += println(); 179 | return n; 180 | } 181 | 182 | size_t Print::println(long num, int base) { 183 | size_t n = print(num, base); 184 | n += println(); 185 | return n; 186 | } 187 | 188 | size_t Print::println(unsigned long num, int base) { 189 | size_t n = print(num, base); 190 | n += println(); 191 | return n; 192 | } 193 | 194 | size_t Print::println(double num, int digits) { 195 | size_t n = print(num, digits); 196 | n += println(); 197 | return n; 198 | } 199 | 200 | size_t Print::println(const Printable& x) { 201 | size_t n = print(x); 202 | n += println(); 203 | return n; 204 | } 205 | 206 | // Private Methods ///////////////////////////////////////////////////////////// 207 | 208 | size_t Print::printNumber(unsigned long n, uint8_t base) { 209 | char buf[8 * sizeof(long) + 1]; // Assumes 8-bit chars plus zero byte. 210 | char *str = &buf[sizeof(buf) - 1]; 211 | 212 | *str = '\0'; 213 | 214 | // prevent crash if called with base == 1 215 | if(base < 2) 216 | base = 10; 217 | 218 | do { 219 | unsigned long m = n; 220 | n /= base; 221 | char c = m - base * n; 222 | *--str = c < 10 ? c + '0' : c + 'A' - 10; 223 | } while(n); 224 | 225 | return write(str); 226 | } 227 | 228 | size_t Print::printFloat(double number, uint8_t digits) { 229 | size_t n = 0; 230 | 231 | if(isnan(number)) 232 | return print("nan"); 233 | if(isinf(number)) 234 | return print("inf"); 235 | if(number > 4294967040.0) 236 | return print("ovf"); // constant determined empirically 237 | if(number < -4294967040.0) 238 | return print("ovf"); // constant determined empirically 239 | 240 | // Handle negative numbers 241 | if(number < 0.0) { 242 | n += print('-'); 243 | number = -number; 244 | } 245 | 246 | // Round correctly so that print(1.999, 2) prints as "2.00" 247 | double rounding = 0.5; 248 | for(uint8_t i = 0; i < digits; ++i) 249 | rounding /= 10.0; 250 | 251 | number += rounding; 252 | 253 | // Extract the integer part of the number and print it 254 | unsigned long int_part = (unsigned long) number; 255 | double remainder = number - (double) int_part; 256 | n += print(int_part); 257 | 258 | // Print the decimal point, but only if there are digits beyond 259 | if(digits > 0) { 260 | n += print("."); 261 | } 262 | 263 | // Extract digits from the remainder one at a time 264 | while(digits-- > 0) { 265 | remainder *= 10.0; 266 | int toPrint = int(remainder); 267 | n += print(toPrint); 268 | remainder -= toPrint; 269 | } 270 | 271 | return n; 272 | } 273 | 274 | -------------------------------------------------------------------------------- /app/src/lib/Adafruit-GFX-Library/Fonts/Picopixel.h: -------------------------------------------------------------------------------- 1 | // Picopixel by Sebastian Weber. A tiny font 2 | // with all characters within a 6 pixel height. 3 | 4 | const uint8_t PicopixelBitmaps[] PROGMEM = { 5 | 0xE8, 0xB4, 0x57, 0xD5, 0xF5, 0x00, 0x4E, 0x3E, 0x80, 0xA5, 0x4A, 0x4A, 6 | 0x5A, 0x50, 0xC0, 0x6A, 0x40, 0x95, 0x80, 0xAA, 0x80, 0x5D, 0x00, 0x60, 7 | 0xE0, 0x80, 0x25, 0x48, 0x56, 0xD4, 0x75, 0x40, 0xC5, 0x4E, 0xC5, 0x1C, 8 | 0x97, 0x92, 0xF3, 0x1C, 0x53, 0x54, 0xE5, 0x48, 0x55, 0x54, 0x55, 0x94, 9 | 0xA0, 0x46, 0x64, 0xE3, 0x80, 0x98, 0xC5, 0x04, 0x56, 0xC6, 0x57, 0xDA, 10 | 0xD7, 0x5C, 0x72, 0x46, 0xD6, 0xDC, 0xF3, 0xCE, 0xF3, 0x48, 0x72, 0xD4, 11 | 0xB7, 0xDA, 0xF8, 0x24, 0xD4, 0xBB, 0x5A, 0x92, 0x4E, 0x8E, 0xEB, 0x58, 12 | 0x80, 0x9D, 0xB9, 0x90, 0x56, 0xD4, 0xD7, 0x48, 0x56, 0xD4, 0x40, 0xD7, 13 | 0x5A, 0x71, 0x1C, 0xE9, 0x24, 0xB6, 0xD4, 0xB6, 0xA4, 0x8C, 0x6B, 0x55, 14 | 0x00, 0xB5, 0x5A, 0xB5, 0x24, 0xE5, 0x4E, 0xEA, 0xC0, 0x91, 0x12, 0xD5, 15 | 0xC0, 0x54, 0xF0, 0x90, 0xC7, 0xF0, 0x93, 0x5E, 0x71, 0x80, 0x25, 0xDE, 16 | 0x5E, 0x30, 0x6E, 0x80, 0x77, 0x9C, 0x93, 0x5A, 0xB8, 0x45, 0x60, 0x92, 17 | 0xEA, 0xAA, 0x40, 0xD5, 0x6A, 0xD6, 0x80, 0x55, 0x00, 0xD7, 0x40, 0x75, 18 | 0x90, 0xE8, 0x71, 0xE0, 0xBA, 0x40, 0xB5, 0x80, 0xB5, 0x00, 0x8D, 0x54, 19 | 0xAA, 0x80, 0xAC, 0xE0, 0xE5, 0x70, 0x6A, 0x26, 0xFC, 0xC8, 0xAC, 0x5A}; 20 | 21 | const GFXglyph PicopixelGlyphs[] PROGMEM = {{0, 0, 0, 2, 0, 1}, // 0x20 ' ' 22 | {0, 1, 5, 2, 0, -4}, // 0x21 '!' 23 | {1, 3, 2, 4, 0, -4}, // 0x22 '"' 24 | {2, 5, 5, 6, 0, -4}, // 0x23 '#' 25 | {6, 3, 6, 4, 0, -4}, // 0x24 '$' 26 | {9, 3, 5, 4, 0, -4}, // 0x25 '%' 27 | {11, 4, 5, 5, 0, -4}, // 0x26 '&' 28 | {14, 1, 2, 2, 0, -4}, // 0x27 ''' 29 | {15, 2, 5, 3, 0, -4}, // 0x28 '(' 30 | {17, 2, 5, 3, 0, -4}, // 0x29 ')' 31 | {19, 3, 3, 4, 0, -3}, // 0x2A '*' 32 | {21, 3, 3, 4, 0, -3}, // 0x2B '+' 33 | {23, 2, 2, 3, 0, 0}, // 0x2C ',' 34 | {24, 3, 1, 4, 0, -2}, // 0x2D '-' 35 | {25, 1, 1, 2, 0, 0}, // 0x2E '.' 36 | {26, 3, 5, 4, 0, -4}, // 0x2F '/' 37 | {28, 3, 5, 4, 0, -4}, // 0x30 '0' 38 | {30, 2, 5, 3, 0, -4}, // 0x31 '1' 39 | {32, 3, 5, 4, 0, -4}, // 0x32 '2' 40 | {34, 3, 5, 4, 0, -4}, // 0x33 '3' 41 | {36, 3, 5, 4, 0, -4}, // 0x34 '4' 42 | {38, 3, 5, 4, 0, -4}, // 0x35 '5' 43 | {40, 3, 5, 4, 0, -4}, // 0x36 '6' 44 | {42, 3, 5, 4, 0, -4}, // 0x37 '7' 45 | {44, 3, 5, 4, 0, -4}, // 0x38 '8' 46 | {46, 3, 5, 4, 0, -4}, // 0x39 '9' 47 | {48, 1, 3, 2, 0, -3}, // 0x3A ':' 48 | {49, 2, 4, 3, 0, -3}, // 0x3B ';' 49 | {50, 2, 3, 3, 0, -3}, // 0x3C '<' 50 | {51, 3, 3, 4, 0, -3}, // 0x3D '=' 51 | {53, 2, 3, 3, 0, -3}, // 0x3E '>' 52 | {54, 3, 5, 4, 0, -4}, // 0x3F '?' 53 | {56, 3, 5, 4, 0, -4}, // 0x40 '@' 54 | {58, 3, 5, 4, 0, -4}, // 0x41 'A' 55 | {60, 3, 5, 4, 0, -4}, // 0x42 'B' 56 | {62, 3, 5, 4, 0, -4}, // 0x43 'C' 57 | {64, 3, 5, 4, 0, -4}, // 0x44 'D' 58 | {66, 3, 5, 4, 0, -4}, // 0x45 'E' 59 | {68, 3, 5, 4, 0, -4}, // 0x46 'F' 60 | {70, 3, 5, 4, 0, -4}, // 0x47 'G' 61 | {72, 3, 5, 4, 0, -4}, // 0x48 'H' 62 | {74, 1, 5, 2, 0, -4}, // 0x49 'I' 63 | {75, 3, 5, 4, 0, -4}, // 0x4A 'J' 64 | {77, 3, 5, 4, 0, -4}, // 0x4B 'K' 65 | {79, 3, 5, 4, 0, -4}, // 0x4C 'L' 66 | {81, 5, 5, 6, 0, -4}, // 0x4D 'M' 67 | {85, 4, 5, 5, 0, -4}, // 0x4E 'N' 68 | {88, 3, 5, 4, 0, -4}, // 0x4F 'O' 69 | {90, 3, 5, 4, 0, -4}, // 0x50 'P' 70 | {92, 3, 6, 4, 0, -4}, // 0x51 'Q' 71 | {95, 3, 5, 4, 0, -4}, // 0x52 'R' 72 | {97, 3, 5, 4, 0, -4}, // 0x53 'S' 73 | {99, 3, 5, 4, 0, -4}, // 0x54 'T' 74 | {101, 3, 5, 4, 0, -4}, // 0x55 'U' 75 | {103, 3, 5, 4, 0, -4}, // 0x56 'V' 76 | {105, 5, 5, 6, 0, -4}, // 0x57 'W' 77 | {109, 3, 5, 4, 0, -4}, // 0x58 'X' 78 | {111, 3, 5, 4, 0, -4}, // 0x59 'Y' 79 | {113, 3, 5, 4, 0, -4}, // 0x5A 'Z' 80 | {115, 2, 5, 3, 0, -4}, // 0x5B '[' 81 | {117, 3, 5, 4, 0, -4}, // 0x5C '\' 82 | {119, 2, 5, 3, 0, -4}, // 0x5D ']' 83 | {121, 3, 2, 4, 0, -4}, // 0x5E '^' 84 | {122, 4, 1, 4, 0, 1}, // 0x5F '_' 85 | {123, 2, 2, 3, 0, -4}, // 0x60 '`' 86 | {124, 3, 4, 4, 0, -3}, // 0x61 'a' 87 | {126, 3, 5, 4, 0, -4}, // 0x62 'b' 88 | {128, 3, 3, 4, 0, -2}, // 0x63 'c' 89 | {130, 3, 5, 4, 0, -4}, // 0x64 'd' 90 | {132, 3, 4, 4, 0, -3}, // 0x65 'e' 91 | {134, 2, 5, 3, 0, -4}, // 0x66 'f' 92 | {136, 3, 5, 4, 0, -3}, // 0x67 'g' 93 | {138, 3, 5, 4, 0, -4}, // 0x68 'h' 94 | {140, 1, 5, 2, 0, -4}, // 0x69 'i' 95 | {141, 2, 6, 3, 0, -4}, // 0x6A 'j' 96 | {143, 3, 5, 4, 0, -4}, // 0x6B 'k' 97 | {145, 2, 5, 3, 0, -4}, // 0x6C 'l' 98 | {147, 5, 3, 6, 0, -2}, // 0x6D 'm' 99 | {149, 3, 3, 4, 0, -2}, // 0x6E 'n' 100 | {151, 3, 3, 4, 0, -2}, // 0x6F 'o' 101 | {153, 3, 4, 4, 0, -2}, // 0x70 'p' 102 | {155, 3, 4, 4, 0, -2}, // 0x71 'q' 103 | {157, 2, 3, 3, 0, -2}, // 0x72 'r' 104 | {158, 3, 4, 4, 0, -3}, // 0x73 's' 105 | {160, 2, 5, 3, 0, -4}, // 0x74 't' 106 | {162, 3, 3, 4, 0, -2}, // 0x75 'u' 107 | {164, 3, 3, 4, 0, -2}, // 0x76 'v' 108 | {166, 5, 3, 6, 0, -2}, // 0x77 'w' 109 | {168, 3, 3, 4, 0, -2}, // 0x78 'x' 110 | {170, 3, 4, 4, 0, -2}, // 0x79 'y' 111 | {172, 3, 4, 4, 0, -3}, // 0x7A 'z' 112 | {174, 3, 5, 4, 0, -4}, // 0x7B '{' 113 | {176, 1, 6, 2, 0, -4}, // 0x7C '|' 114 | {177, 3, 5, 4, 0, -4}, // 0x7D '}' 115 | {179, 4, 2, 5, 0, -3}}; // 0x7E '~' 116 | 117 | const GFXfont Picopixel PROGMEM = {(uint8_t *)PicopixelBitmaps, 118 | (GFXglyph *)PicopixelGlyphs, 0x20, 0x7E, 7}; 119 | 120 | // Approx. 852 bytes 121 | -------------------------------------------------------------------------------- /app/src/lib/Adafruit-GFX-Library/glcdfont.c: -------------------------------------------------------------------------------- 1 | // This is the 'classic' fixed-space bitmap font for Adafruit_GFX since 1.0. 2 | // See gfxfont.h for newer custom bitmap font info. 3 | 4 | #ifndef FONT5X7_H 5 | #define FONT5X7_H 6 | 7 | #ifdef __AVR__ 8 | #include 9 | #include 10 | #elif defined(ESP8266) 11 | #include 12 | #elif defined(__IMXRT1052__) || defined(__IMXRT1062__) 13 | // PROGMEM is defefind for T4 to place data in specific memory section 14 | #undef PROGMEM 15 | #define PROGMEM 16 | #else 17 | #define PROGMEM 18 | #endif 19 | 20 | // Standard ASCII 5x7 font 21 | 22 | static const unsigned char font[] PROGMEM = { 23 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x5B, 0x4F, 0x5B, 0x3E, 0x3E, 0x6B, 24 | 0x4F, 0x6B, 0x3E, 0x1C, 0x3E, 0x7C, 0x3E, 0x1C, 0x18, 0x3C, 0x7E, 0x3C, 25 | 0x18, 0x1C, 0x57, 0x7D, 0x57, 0x1C, 0x1C, 0x5E, 0x7F, 0x5E, 0x1C, 0x00, 26 | 0x18, 0x3C, 0x18, 0x00, 0xFF, 0xE7, 0xC3, 0xE7, 0xFF, 0x00, 0x18, 0x24, 27 | 0x18, 0x00, 0xFF, 0xE7, 0xDB, 0xE7, 0xFF, 0x30, 0x48, 0x3A, 0x06, 0x0E, 28 | 0x26, 0x29, 0x79, 0x29, 0x26, 0x40, 0x7F, 0x05, 0x05, 0x07, 0x40, 0x7F, 29 | 0x05, 0x25, 0x3F, 0x5A, 0x3C, 0xE7, 0x3C, 0x5A, 0x7F, 0x3E, 0x1C, 0x1C, 30 | 0x08, 0x08, 0x1C, 0x1C, 0x3E, 0x7F, 0x14, 0x22, 0x7F, 0x22, 0x14, 0x5F, 31 | 0x5F, 0x00, 0x5F, 0x5F, 0x06, 0x09, 0x7F, 0x01, 0x7F, 0x00, 0x66, 0x89, 32 | 0x95, 0x6A, 0x60, 0x60, 0x60, 0x60, 0x60, 0x94, 0xA2, 0xFF, 0xA2, 0x94, 33 | 0x08, 0x04, 0x7E, 0x04, 0x08, 0x10, 0x20, 0x7E, 0x20, 0x10, 0x08, 0x08, 34 | 0x2A, 0x1C, 0x08, 0x08, 0x1C, 0x2A, 0x08, 0x08, 0x1E, 0x10, 0x10, 0x10, 35 | 0x10, 0x0C, 0x1E, 0x0C, 0x1E, 0x0C, 0x30, 0x38, 0x3E, 0x38, 0x30, 0x06, 36 | 0x0E, 0x3E, 0x0E, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 37 | 0x00, 0x00, 0x00, 0x07, 0x00, 0x07, 0x00, 0x14, 0x7F, 0x14, 0x7F, 0x14, 38 | 0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x23, 0x13, 0x08, 0x64, 0x62, 0x36, 0x49, 39 | 0x56, 0x20, 0x50, 0x00, 0x08, 0x07, 0x03, 0x00, 0x00, 0x1C, 0x22, 0x41, 40 | 0x00, 0x00, 0x41, 0x22, 0x1C, 0x00, 0x2A, 0x1C, 0x7F, 0x1C, 0x2A, 0x08, 41 | 0x08, 0x3E, 0x08, 0x08, 0x00, 0x80, 0x70, 0x30, 0x00, 0x08, 0x08, 0x08, 42 | 0x08, 0x08, 0x00, 0x00, 0x60, 0x60, 0x00, 0x20, 0x10, 0x08, 0x04, 0x02, 43 | 0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00, 0x42, 0x7F, 0x40, 0x00, 0x72, 0x49, 44 | 0x49, 0x49, 0x46, 0x21, 0x41, 0x49, 0x4D, 0x33, 0x18, 0x14, 0x12, 0x7F, 45 | 0x10, 0x27, 0x45, 0x45, 0x45, 0x39, 0x3C, 0x4A, 0x49, 0x49, 0x31, 0x41, 46 | 0x21, 0x11, 0x09, 0x07, 0x36, 0x49, 0x49, 0x49, 0x36, 0x46, 0x49, 0x49, 47 | 0x29, 0x1E, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x40, 0x34, 0x00, 0x00, 48 | 0x00, 0x08, 0x14, 0x22, 0x41, 0x14, 0x14, 0x14, 0x14, 0x14, 0x00, 0x41, 49 | 0x22, 0x14, 0x08, 0x02, 0x01, 0x59, 0x09, 0x06, 0x3E, 0x41, 0x5D, 0x59, 50 | 0x4E, 0x7C, 0x12, 0x11, 0x12, 0x7C, 0x7F, 0x49, 0x49, 0x49, 0x36, 0x3E, 51 | 0x41, 0x41, 0x41, 0x22, 0x7F, 0x41, 0x41, 0x41, 0x3E, 0x7F, 0x49, 0x49, 52 | 0x49, 0x41, 0x7F, 0x09, 0x09, 0x09, 0x01, 0x3E, 0x41, 0x41, 0x51, 0x73, 53 | 0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00, 0x41, 0x7F, 0x41, 0x00, 0x20, 0x40, 54 | 0x41, 0x3F, 0x01, 0x7F, 0x08, 0x14, 0x22, 0x41, 0x7F, 0x40, 0x40, 0x40, 55 | 0x40, 0x7F, 0x02, 0x1C, 0x02, 0x7F, 0x7F, 0x04, 0x08, 0x10, 0x7F, 0x3E, 56 | 0x41, 0x41, 0x41, 0x3E, 0x7F, 0x09, 0x09, 0x09, 0x06, 0x3E, 0x41, 0x51, 57 | 0x21, 0x5E, 0x7F, 0x09, 0x19, 0x29, 0x46, 0x26, 0x49, 0x49, 0x49, 0x32, 58 | 0x03, 0x01, 0x7F, 0x01, 0x03, 0x3F, 0x40, 0x40, 0x40, 0x3F, 0x1F, 0x20, 59 | 0x40, 0x20, 0x1F, 0x3F, 0x40, 0x38, 0x40, 0x3F, 0x63, 0x14, 0x08, 0x14, 60 | 0x63, 0x03, 0x04, 0x78, 0x04, 0x03, 0x61, 0x59, 0x49, 0x4D, 0x43, 0x00, 61 | 0x7F, 0x41, 0x41, 0x41, 0x02, 0x04, 0x08, 0x10, 0x20, 0x00, 0x41, 0x41, 62 | 0x41, 0x7F, 0x04, 0x02, 0x01, 0x02, 0x04, 0x40, 0x40, 0x40, 0x40, 0x40, 63 | 0x00, 0x03, 0x07, 0x08, 0x00, 0x20, 0x54, 0x54, 0x78, 0x40, 0x7F, 0x28, 64 | 0x44, 0x44, 0x38, 0x38, 0x44, 0x44, 0x44, 0x28, 0x38, 0x44, 0x44, 0x28, 65 | 0x7F, 0x38, 0x54, 0x54, 0x54, 0x18, 0x00, 0x08, 0x7E, 0x09, 0x02, 0x18, 66 | 0xA4, 0xA4, 0x9C, 0x78, 0x7F, 0x08, 0x04, 0x04, 0x78, 0x00, 0x44, 0x7D, 67 | 0x40, 0x00, 0x20, 0x40, 0x40, 0x3D, 0x00, 0x7F, 0x10, 0x28, 0x44, 0x00, 68 | 0x00, 0x41, 0x7F, 0x40, 0x00, 0x7C, 0x04, 0x78, 0x04, 0x78, 0x7C, 0x08, 69 | 0x04, 0x04, 0x78, 0x38, 0x44, 0x44, 0x44, 0x38, 0xFC, 0x18, 0x24, 0x24, 70 | 0x18, 0x18, 0x24, 0x24, 0x18, 0xFC, 0x7C, 0x08, 0x04, 0x04, 0x08, 0x48, 71 | 0x54, 0x54, 0x54, 0x24, 0x04, 0x04, 0x3F, 0x44, 0x24, 0x3C, 0x40, 0x40, 72 | 0x20, 0x7C, 0x1C, 0x20, 0x40, 0x20, 0x1C, 0x3C, 0x40, 0x30, 0x40, 0x3C, 73 | 0x44, 0x28, 0x10, 0x28, 0x44, 0x4C, 0x90, 0x90, 0x90, 0x7C, 0x44, 0x64, 74 | 0x54, 0x4C, 0x44, 0x00, 0x08, 0x36, 0x41, 0x00, 0x00, 0x00, 0x77, 0x00, 75 | 0x00, 0x00, 0x41, 0x36, 0x08, 0x00, 0x02, 0x01, 0x02, 0x04, 0x02, 0x3C, 76 | 0x26, 0x23, 0x26, 0x3C, 0x1E, 0xA1, 0xA1, 0x61, 0x12, 0x3A, 0x40, 0x40, 77 | 0x20, 0x7A, 0x38, 0x54, 0x54, 0x55, 0x59, 0x21, 0x55, 0x55, 0x79, 0x41, 78 | 0x22, 0x54, 0x54, 0x78, 0x42, // a-umlaut 79 | 0x21, 0x55, 0x54, 0x78, 0x40, 0x20, 0x54, 0x55, 0x79, 0x40, 0x0C, 0x1E, 80 | 0x52, 0x72, 0x12, 0x39, 0x55, 0x55, 0x55, 0x59, 0x39, 0x54, 0x54, 0x54, 81 | 0x59, 0x39, 0x55, 0x54, 0x54, 0x58, 0x00, 0x00, 0x45, 0x7C, 0x41, 0x00, 82 | 0x02, 0x45, 0x7D, 0x42, 0x00, 0x01, 0x45, 0x7C, 0x40, 0x7D, 0x12, 0x11, 83 | 0x12, 0x7D, // A-umlaut 84 | 0xF0, 0x28, 0x25, 0x28, 0xF0, 0x7C, 0x54, 0x55, 0x45, 0x00, 0x20, 0x54, 85 | 0x54, 0x7C, 0x54, 0x7C, 0x0A, 0x09, 0x7F, 0x49, 0x32, 0x49, 0x49, 0x49, 86 | 0x32, 0x3A, 0x44, 0x44, 0x44, 0x3A, // o-umlaut 87 | 0x32, 0x4A, 0x48, 0x48, 0x30, 0x3A, 0x41, 0x41, 0x21, 0x7A, 0x3A, 0x42, 88 | 0x40, 0x20, 0x78, 0x00, 0x9D, 0xA0, 0xA0, 0x7D, 0x3D, 0x42, 0x42, 0x42, 89 | 0x3D, // O-umlaut 90 | 0x3D, 0x40, 0x40, 0x40, 0x3D, 0x3C, 0x24, 0xFF, 0x24, 0x24, 0x48, 0x7E, 91 | 0x49, 0x43, 0x66, 0x2B, 0x2F, 0xFC, 0x2F, 0x2B, 0xFF, 0x09, 0x29, 0xF6, 92 | 0x20, 0xC0, 0x88, 0x7E, 0x09, 0x03, 0x20, 0x54, 0x54, 0x79, 0x41, 0x00, 93 | 0x00, 0x44, 0x7D, 0x41, 0x30, 0x48, 0x48, 0x4A, 0x32, 0x38, 0x40, 0x40, 94 | 0x22, 0x7A, 0x00, 0x7A, 0x0A, 0x0A, 0x72, 0x7D, 0x0D, 0x19, 0x31, 0x7D, 95 | 0x26, 0x29, 0x29, 0x2F, 0x28, 0x26, 0x29, 0x29, 0x29, 0x26, 0x30, 0x48, 96 | 0x4D, 0x40, 0x20, 0x38, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 97 | 0x38, 0x2F, 0x10, 0xC8, 0xAC, 0xBA, 0x2F, 0x10, 0x28, 0x34, 0xFA, 0x00, 98 | 0x00, 0x7B, 0x00, 0x00, 0x08, 0x14, 0x2A, 0x14, 0x22, 0x22, 0x14, 0x2A, 99 | 0x14, 0x08, 0x55, 0x00, 0x55, 0x00, 0x55, // #176 (25% block) missing in old 100 | // code 101 | 0xAA, 0x55, 0xAA, 0x55, 0xAA, // 50% block 102 | 0xFF, 0x55, 0xFF, 0x55, 0xFF, // 75% block 103 | 0x00, 0x00, 0x00, 0xFF, 0x00, 0x10, 0x10, 0x10, 0xFF, 0x00, 0x14, 0x14, 104 | 0x14, 0xFF, 0x00, 0x10, 0x10, 0xFF, 0x00, 0xFF, 0x10, 0x10, 0xF0, 0x10, 105 | 0xF0, 0x14, 0x14, 0x14, 0xFC, 0x00, 0x14, 0x14, 0xF7, 0x00, 0xFF, 0x00, 106 | 0x00, 0xFF, 0x00, 0xFF, 0x14, 0x14, 0xF4, 0x04, 0xFC, 0x14, 0x14, 0x17, 107 | 0x10, 0x1F, 0x10, 0x10, 0x1F, 0x10, 0x1F, 0x14, 0x14, 0x14, 0x1F, 0x00, 108 | 0x10, 0x10, 0x10, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x10, 0x10, 0x10, 109 | 0x10, 0x1F, 0x10, 0x10, 0x10, 0x10, 0xF0, 0x10, 0x00, 0x00, 0x00, 0xFF, 110 | 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x00, 111 | 0x00, 0x00, 0xFF, 0x14, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x1F, 112 | 0x10, 0x17, 0x00, 0x00, 0xFC, 0x04, 0xF4, 0x14, 0x14, 0x17, 0x10, 0x17, 113 | 0x14, 0x14, 0xF4, 0x04, 0xF4, 0x00, 0x00, 0xFF, 0x00, 0xF7, 0x14, 0x14, 114 | 0x14, 0x14, 0x14, 0x14, 0x14, 0xF7, 0x00, 0xF7, 0x14, 0x14, 0x14, 0x17, 115 | 0x14, 0x10, 0x10, 0x1F, 0x10, 0x1F, 0x14, 0x14, 0x14, 0xF4, 0x14, 0x10, 116 | 0x10, 0xF0, 0x10, 0xF0, 0x00, 0x00, 0x1F, 0x10, 0x1F, 0x00, 0x00, 0x00, 117 | 0x1F, 0x14, 0x00, 0x00, 0x00, 0xFC, 0x14, 0x00, 0x00, 0xF0, 0x10, 0xF0, 118 | 0x10, 0x10, 0xFF, 0x10, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x14, 0x10, 0x10, 119 | 0x10, 0x1F, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 120 | 0xFF, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 121 | 0x00, 0x00, 0xFF, 0xFF, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x38, 0x44, 0x44, 122 | 0x38, 0x44, 0xFC, 0x4A, 0x4A, 0x4A, 0x34, // sharp-s or beta 123 | 0x7E, 0x02, 0x02, 0x06, 0x06, 0x02, 0x7E, 0x02, 0x7E, 0x02, 0x63, 0x55, 124 | 0x49, 0x41, 0x63, 0x38, 0x44, 0x44, 0x3C, 0x04, 0x40, 0x7E, 0x20, 0x1E, 125 | 0x20, 0x06, 0x02, 0x7E, 0x02, 0x02, 0x99, 0xA5, 0xE7, 0xA5, 0x99, 0x1C, 126 | 0x2A, 0x49, 0x2A, 0x1C, 0x4C, 0x72, 0x01, 0x72, 0x4C, 0x30, 0x4A, 0x4D, 127 | 0x4D, 0x30, 0x30, 0x48, 0x78, 0x48, 0x30, 0xBC, 0x62, 0x5A, 0x46, 0x3D, 128 | 0x3E, 0x49, 0x49, 0x49, 0x00, 0x7E, 0x01, 0x01, 0x01, 0x7E, 0x2A, 0x2A, 129 | 0x2A, 0x2A, 0x2A, 0x44, 0x44, 0x5F, 0x44, 0x44, 0x40, 0x51, 0x4A, 0x44, 130 | 0x40, 0x40, 0x44, 0x4A, 0x51, 0x40, 0x00, 0x00, 0xFF, 0x01, 0x03, 0xE0, 131 | 0x80, 0xFF, 0x00, 0x00, 0x08, 0x08, 0x6B, 0x6B, 0x08, 0x36, 0x12, 0x36, 132 | 0x24, 0x36, 0x06, 0x0F, 0x09, 0x0F, 0x06, 0x00, 0x00, 0x18, 0x18, 0x00, 133 | 0x00, 0x00, 0x10, 0x10, 0x00, 0x30, 0x40, 0xFF, 0x01, 0x01, 0x00, 0x1F, 134 | 0x01, 0x01, 0x1E, 0x00, 0x19, 0x1D, 0x17, 0x12, 0x00, 0x3C, 0x3C, 0x3C, 135 | 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00 // #255 NBSP 136 | }; 137 | 138 | // allow clean compilation with [-Wunused-const-variable=] and [-Wall] 139 | static inline void avoid_unused_const_variable_compiler_warning(void) { 140 | (void)font; 141 | } 142 | 143 | #endif // FONT5X7_H 144 | -------------------------------------------------------------------------------- /app/src/lib/Adafruit-GFX-Library/Fonts/Org_01.h: -------------------------------------------------------------------------------- 1 | // Org_v01 by Orgdot (www.orgdot.com/aliasfonts). A tiny, 2 | // stylized font with all characters within a 6 pixel height. 3 | 4 | const uint8_t Org_01Bitmaps[] PROGMEM = { 5 | 0xE8, 0xA0, 0x57, 0xD5, 0xF5, 0x00, 0xFD, 0x3E, 0x5F, 0x80, 0x88, 0x88, 6 | 0x88, 0x80, 0xF4, 0xBF, 0x2E, 0x80, 0x80, 0x6A, 0x40, 0x95, 0x80, 0xAA, 7 | 0x80, 0x5D, 0x00, 0xC0, 0xF0, 0x80, 0x08, 0x88, 0x88, 0x00, 0xFC, 0x63, 8 | 0x1F, 0x80, 0xF8, 0xF8, 0x7F, 0x0F, 0x80, 0xF8, 0x7E, 0x1F, 0x80, 0x8C, 9 | 0x7E, 0x10, 0x80, 0xFC, 0x3E, 0x1F, 0x80, 0xFC, 0x3F, 0x1F, 0x80, 0xF8, 10 | 0x42, 0x10, 0x80, 0xFC, 0x7F, 0x1F, 0x80, 0xFC, 0x7E, 0x1F, 0x80, 0x90, 11 | 0xB0, 0x2A, 0x22, 0xF0, 0xF0, 0x88, 0xA8, 0xF8, 0x4E, 0x02, 0x00, 0xFD, 12 | 0x6F, 0x0F, 0x80, 0xFC, 0x7F, 0x18, 0x80, 0xF4, 0x7D, 0x1F, 0x00, 0xFC, 13 | 0x21, 0x0F, 0x80, 0xF4, 0x63, 0x1F, 0x00, 0xFC, 0x3F, 0x0F, 0x80, 0xFC, 14 | 0x3F, 0x08, 0x00, 0xFC, 0x2F, 0x1F, 0x80, 0x8C, 0x7F, 0x18, 0x80, 0xF9, 15 | 0x08, 0x4F, 0x80, 0x78, 0x85, 0x2F, 0x80, 0x8D, 0xB1, 0x68, 0x80, 0x84, 16 | 0x21, 0x0F, 0x80, 0xFD, 0x6B, 0x5A, 0x80, 0xFC, 0x63, 0x18, 0x80, 0xFC, 17 | 0x63, 0x1F, 0x80, 0xFC, 0x7F, 0x08, 0x00, 0xFC, 0x63, 0x3F, 0x80, 0xFC, 18 | 0x7F, 0x29, 0x00, 0xFC, 0x3E, 0x1F, 0x80, 0xF9, 0x08, 0x42, 0x00, 0x8C, 19 | 0x63, 0x1F, 0x80, 0x8C, 0x62, 0xA2, 0x00, 0xAD, 0x6B, 0x5F, 0x80, 0x8A, 20 | 0x88, 0xA8, 0x80, 0x8C, 0x54, 0x42, 0x00, 0xF8, 0x7F, 0x0F, 0x80, 0xEA, 21 | 0xC0, 0x82, 0x08, 0x20, 0x80, 0xD5, 0xC0, 0x54, 0xF8, 0x80, 0xF1, 0xFF, 22 | 0x8F, 0x99, 0xF0, 0xF8, 0x8F, 0x1F, 0x99, 0xF0, 0xFF, 0x8F, 0x6B, 0xA4, 23 | 0xF9, 0x9F, 0x10, 0x8F, 0x99, 0x90, 0xF0, 0x55, 0xC0, 0x8A, 0xF9, 0x90, 24 | 0xF8, 0xFD, 0x63, 0x10, 0xF9, 0x99, 0xF9, 0x9F, 0xF9, 0x9F, 0x80, 0xF9, 25 | 0x9F, 0x20, 0xF8, 0x88, 0x47, 0x1F, 0x27, 0xC8, 0x42, 0x00, 0x99, 0x9F, 26 | 0x99, 0x97, 0x8C, 0x6B, 0xF0, 0x96, 0x69, 0x99, 0x9F, 0x10, 0x2E, 0x8F, 27 | 0x2B, 0x22, 0xF8, 0x89, 0xA8, 0x0F, 0xE0}; 28 | 29 | const GFXglyph Org_01Glyphs[] PROGMEM = {{0, 0, 0, 6, 0, 1}, // 0x20 ' ' 30 | {0, 1, 5, 2, 0, -4}, // 0x21 '!' 31 | {1, 3, 1, 4, 0, -4}, // 0x22 '"' 32 | {2, 5, 5, 6, 0, -4}, // 0x23 '#' 33 | {6, 5, 5, 6, 0, -4}, // 0x24 '$' 34 | {10, 5, 5, 6, 0, -4}, // 0x25 '%' 35 | {14, 5, 5, 6, 0, -4}, // 0x26 '&' 36 | {18, 1, 1, 2, 0, -4}, // 0x27 ''' 37 | {19, 2, 5, 3, 0, -4}, // 0x28 '(' 38 | {21, 2, 5, 3, 0, -4}, // 0x29 ')' 39 | {23, 3, 3, 4, 0, -3}, // 0x2A '*' 40 | {25, 3, 3, 4, 0, -3}, // 0x2B '+' 41 | {27, 1, 2, 2, 0, 0}, // 0x2C ',' 42 | {28, 4, 1, 5, 0, -2}, // 0x2D '-' 43 | {29, 1, 1, 2, 0, 0}, // 0x2E '.' 44 | {30, 5, 5, 6, 0, -4}, // 0x2F '/' 45 | {34, 5, 5, 6, 0, -4}, // 0x30 '0' 46 | {38, 1, 5, 2, 0, -4}, // 0x31 '1' 47 | {39, 5, 5, 6, 0, -4}, // 0x32 '2' 48 | {43, 5, 5, 6, 0, -4}, // 0x33 '3' 49 | {47, 5, 5, 6, 0, -4}, // 0x34 '4' 50 | {51, 5, 5, 6, 0, -4}, // 0x35 '5' 51 | {55, 5, 5, 6, 0, -4}, // 0x36 '6' 52 | {59, 5, 5, 6, 0, -4}, // 0x37 '7' 53 | {63, 5, 5, 6, 0, -4}, // 0x38 '8' 54 | {67, 5, 5, 6, 0, -4}, // 0x39 '9' 55 | {71, 1, 4, 2, 0, -3}, // 0x3A ':' 56 | {72, 1, 4, 2, 0, -3}, // 0x3B ';' 57 | {73, 3, 5, 4, 0, -4}, // 0x3C '<' 58 | {75, 4, 3, 5, 0, -3}, // 0x3D '=' 59 | {77, 3, 5, 4, 0, -4}, // 0x3E '>' 60 | {79, 5, 5, 6, 0, -4}, // 0x3F '?' 61 | {83, 5, 5, 6, 0, -4}, // 0x40 '@' 62 | {87, 5, 5, 6, 0, -4}, // 0x41 'A' 63 | {91, 5, 5, 6, 0, -4}, // 0x42 'B' 64 | {95, 5, 5, 6, 0, -4}, // 0x43 'C' 65 | {99, 5, 5, 6, 0, -4}, // 0x44 'D' 66 | {103, 5, 5, 6, 0, -4}, // 0x45 'E' 67 | {107, 5, 5, 6, 0, -4}, // 0x46 'F' 68 | {111, 5, 5, 6, 0, -4}, // 0x47 'G' 69 | {115, 5, 5, 6, 0, -4}, // 0x48 'H' 70 | {119, 5, 5, 6, 0, -4}, // 0x49 'I' 71 | {123, 5, 5, 6, 0, -4}, // 0x4A 'J' 72 | {127, 5, 5, 6, 0, -4}, // 0x4B 'K' 73 | {131, 5, 5, 6, 0, -4}, // 0x4C 'L' 74 | {135, 5, 5, 6, 0, -4}, // 0x4D 'M' 75 | {139, 5, 5, 6, 0, -4}, // 0x4E 'N' 76 | {143, 5, 5, 6, 0, -4}, // 0x4F 'O' 77 | {147, 5, 5, 6, 0, -4}, // 0x50 'P' 78 | {151, 5, 5, 6, 0, -4}, // 0x51 'Q' 79 | {155, 5, 5, 6, 0, -4}, // 0x52 'R' 80 | {159, 5, 5, 6, 0, -4}, // 0x53 'S' 81 | {163, 5, 5, 6, 0, -4}, // 0x54 'T' 82 | {167, 5, 5, 6, 0, -4}, // 0x55 'U' 83 | {171, 5, 5, 6, 0, -4}, // 0x56 'V' 84 | {175, 5, 5, 6, 0, -4}, // 0x57 'W' 85 | {179, 5, 5, 6, 0, -4}, // 0x58 'X' 86 | {183, 5, 5, 6, 0, -4}, // 0x59 'Y' 87 | {187, 5, 5, 6, 0, -4}, // 0x5A 'Z' 88 | {191, 2, 5, 3, 0, -4}, // 0x5B '[' 89 | {193, 5, 5, 6, 0, -4}, // 0x5C '\' 90 | {197, 2, 5, 3, 0, -4}, // 0x5D ']' 91 | {199, 3, 2, 4, 0, -4}, // 0x5E '^' 92 | {200, 5, 1, 6, 0, 1}, // 0x5F '_' 93 | {201, 1, 1, 2, 0, -4}, // 0x60 '`' 94 | {202, 4, 4, 5, 0, -3}, // 0x61 'a' 95 | {204, 4, 5, 5, 0, -4}, // 0x62 'b' 96 | {207, 4, 4, 5, 0, -3}, // 0x63 'c' 97 | {209, 4, 5, 5, 0, -4}, // 0x64 'd' 98 | {212, 4, 4, 5, 0, -3}, // 0x65 'e' 99 | {214, 3, 5, 4, 0, -4}, // 0x66 'f' 100 | {216, 4, 5, 5, 0, -3}, // 0x67 'g' 101 | {219, 4, 5, 5, 0, -4}, // 0x68 'h' 102 | {222, 1, 4, 2, 0, -3}, // 0x69 'i' 103 | {223, 2, 5, 3, 0, -3}, // 0x6A 'j' 104 | {225, 4, 5, 5, 0, -4}, // 0x6B 'k' 105 | {228, 1, 5, 2, 0, -4}, // 0x6C 'l' 106 | {229, 5, 4, 6, 0, -3}, // 0x6D 'm' 107 | {232, 4, 4, 5, 0, -3}, // 0x6E 'n' 108 | {234, 4, 4, 5, 0, -3}, // 0x6F 'o' 109 | {236, 4, 5, 5, 0, -3}, // 0x70 'p' 110 | {239, 4, 5, 5, 0, -3}, // 0x71 'q' 111 | {242, 4, 4, 5, 0, -3}, // 0x72 'r' 112 | {244, 4, 4, 5, 0, -3}, // 0x73 's' 113 | {246, 5, 5, 6, 0, -4}, // 0x74 't' 114 | {250, 4, 4, 5, 0, -3}, // 0x75 'u' 115 | {252, 4, 4, 5, 0, -3}, // 0x76 'v' 116 | {254, 5, 4, 6, 0, -3}, // 0x77 'w' 117 | {257, 4, 4, 5, 0, -3}, // 0x78 'x' 118 | {259, 4, 5, 5, 0, -3}, // 0x79 'y' 119 | {262, 4, 4, 5, 0, -3}, // 0x7A 'z' 120 | {264, 3, 5, 4, 0, -4}, // 0x7B '{' 121 | {266, 1, 5, 2, 0, -4}, // 0x7C '|' 122 | {267, 3, 5, 4, 0, -4}, // 0x7D '}' 123 | {269, 5, 3, 6, 0, -3}}; // 0x7E '~' 124 | 125 | const GFXfont Org_01 PROGMEM = {(uint8_t *)Org_01Bitmaps, 126 | (GFXglyph *)Org_01Glyphs, 0x20, 0x7E, 7}; 127 | 128 | // Approx. 943 bytes 129 | -------------------------------------------------------------------------------- /app/src/lib/Adafruit-GFX-Library/Fonts/FreeMono9pt7b.h: -------------------------------------------------------------------------------- 1 | const uint8_t FreeMono9pt7bBitmaps[] PROGMEM = { 2 | 0xAA, 0xA8, 0x0C, 0xED, 0x24, 0x92, 0x48, 0x24, 0x48, 0x91, 0x2F, 0xE4, 3 | 0x89, 0x7F, 0x28, 0x51, 0x22, 0x40, 0x08, 0x3E, 0x62, 0x40, 0x30, 0x0E, 4 | 0x01, 0x81, 0xC3, 0xBE, 0x08, 0x08, 0x71, 0x12, 0x23, 0x80, 0x23, 0xB8, 5 | 0x0E, 0x22, 0x44, 0x70, 0x38, 0x81, 0x02, 0x06, 0x1A, 0x65, 0x46, 0xC8, 6 | 0xEC, 0xE9, 0x24, 0x5A, 0xAA, 0xA9, 0x40, 0xA9, 0x55, 0x5A, 0x80, 0x10, 7 | 0x22, 0x4B, 0xE3, 0x05, 0x11, 0x00, 0x10, 0x20, 0x47, 0xF1, 0x02, 0x04, 8 | 0x00, 0x6B, 0x48, 0xFF, 0x00, 0xF0, 0x02, 0x08, 0x10, 0x60, 0x81, 0x04, 9 | 0x08, 0x20, 0x41, 0x02, 0x08, 0x00, 0x38, 0x8A, 0x0C, 0x18, 0x30, 0x60, 10 | 0xC1, 0x82, 0x88, 0xE0, 0x27, 0x28, 0x42, 0x10, 0x84, 0x21, 0x3E, 0x38, 11 | 0x8A, 0x08, 0x10, 0x20, 0x82, 0x08, 0x61, 0x03, 0xF8, 0x7C, 0x06, 0x02, 12 | 0x02, 0x1C, 0x06, 0x01, 0x01, 0x01, 0x42, 0x3C, 0x18, 0xA2, 0x92, 0x8A, 13 | 0x28, 0xBF, 0x08, 0x21, 0xC0, 0x7C, 0x81, 0x03, 0xE4, 0x40, 0x40, 0x81, 14 | 0x03, 0x88, 0xE0, 0x1E, 0x41, 0x04, 0x0B, 0x98, 0xB0, 0xC1, 0xC2, 0x88, 15 | 0xE0, 0xFE, 0x04, 0x08, 0x20, 0x40, 0x82, 0x04, 0x08, 0x20, 0x40, 0x38, 16 | 0x8A, 0x0C, 0x14, 0x47, 0x11, 0x41, 0x83, 0x8C, 0xE0, 0x38, 0x8A, 0x1C, 17 | 0x18, 0x68, 0xCE, 0x81, 0x04, 0x13, 0xC0, 0xF0, 0x0F, 0x6C, 0x00, 0xD2, 18 | 0xD2, 0x00, 0x03, 0x04, 0x18, 0x60, 0x60, 0x18, 0x04, 0x03, 0xFF, 0x80, 19 | 0x00, 0x1F, 0xF0, 0x40, 0x18, 0x03, 0x00, 0x60, 0x20, 0x60, 0xC0, 0x80, 20 | 0x3D, 0x84, 0x08, 0x30, 0xC2, 0x00, 0x00, 0x00, 0x30, 0x3C, 0x46, 0x82, 21 | 0x8E, 0xB2, 0xA2, 0xA2, 0x9F, 0x80, 0x80, 0x40, 0x3C, 0x3C, 0x01, 0x40, 22 | 0x28, 0x09, 0x01, 0x10, 0x42, 0x0F, 0xC1, 0x04, 0x40, 0x9E, 0x3C, 0xFE, 23 | 0x21, 0x90, 0x48, 0x67, 0xE2, 0x09, 0x02, 0x81, 0x41, 0xFF, 0x80, 0x3E, 24 | 0xB0, 0xF0, 0x30, 0x08, 0x04, 0x02, 0x00, 0x80, 0x60, 0x8F, 0x80, 0xFE, 25 | 0x21, 0x90, 0x68, 0x14, 0x0A, 0x05, 0x02, 0x83, 0x43, 0x7F, 0x00, 0xFF, 26 | 0x20, 0x90, 0x08, 0x87, 0xC2, 0x21, 0x00, 0x81, 0x40, 0xFF, 0xC0, 0xFF, 27 | 0xA0, 0x50, 0x08, 0x87, 0xC2, 0x21, 0x00, 0x80, 0x40, 0x78, 0x00, 0x1E, 28 | 0x98, 0x6C, 0x0A, 0x00, 0x80, 0x20, 0xF8, 0x0B, 0x02, 0x60, 0x87, 0xC0, 29 | 0xE3, 0xA0, 0x90, 0x48, 0x27, 0xF2, 0x09, 0x04, 0x82, 0x41, 0x71, 0xC0, 30 | 0xF9, 0x08, 0x42, 0x10, 0x84, 0x27, 0xC0, 0x1F, 0x02, 0x02, 0x02, 0x02, 31 | 0x02, 0x82, 0x82, 0xC6, 0x78, 0xE3, 0xA1, 0x11, 0x09, 0x05, 0x83, 0x21, 32 | 0x08, 0x84, 0x41, 0x70, 0xC0, 0xE0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x41, 33 | 0x41, 0x41, 0xFF, 0xE0, 0xEC, 0x19, 0x45, 0x28, 0xA4, 0xA4, 0x94, 0x91, 34 | 0x12, 0x02, 0x40, 0x5C, 0x1C, 0xC3, 0xB0, 0x94, 0x4A, 0x24, 0x92, 0x49, 35 | 0x14, 0x8A, 0x43, 0x70, 0x80, 0x1E, 0x31, 0x90, 0x50, 0x18, 0x0C, 0x06, 36 | 0x02, 0x82, 0x63, 0x0F, 0x00, 0xFE, 0x43, 0x41, 0x41, 0x42, 0x7C, 0x40, 37 | 0x40, 0x40, 0xF0, 0x1C, 0x31, 0x90, 0x50, 0x18, 0x0C, 0x06, 0x02, 0x82, 38 | 0x63, 0x1F, 0x04, 0x07, 0x92, 0x30, 0xFE, 0x21, 0x90, 0x48, 0x24, 0x23, 39 | 0xE1, 0x10, 0x84, 0x41, 0x70, 0xC0, 0x3A, 0xCD, 0x0A, 0x03, 0x01, 0x80, 40 | 0xC1, 0xC7, 0x78, 0xFF, 0xC4, 0x62, 0x21, 0x00, 0x80, 0x40, 0x20, 0x10, 41 | 0x08, 0x1F, 0x00, 0xE3, 0xA0, 0x90, 0x48, 0x24, 0x12, 0x09, 0x04, 0x82, 42 | 0x22, 0x0E, 0x00, 0xF1, 0xE8, 0x10, 0x82, 0x10, 0x42, 0x10, 0x22, 0x04, 43 | 0x80, 0x50, 0x0C, 0x00, 0x80, 0xF1, 0xE8, 0x09, 0x11, 0x25, 0x44, 0xA8, 44 | 0x55, 0x0C, 0xA1, 0x8C, 0x31, 0x84, 0x30, 0xE3, 0xA0, 0x88, 0x82, 0x80, 45 | 0x80, 0xC0, 0x90, 0x44, 0x41, 0x71, 0xC0, 0xE3, 0xA0, 0x88, 0x82, 0x81, 46 | 0x40, 0x40, 0x20, 0x10, 0x08, 0x1F, 0x00, 0xFD, 0x0A, 0x20, 0x81, 0x04, 47 | 0x10, 0x21, 0x83, 0xFC, 0xEA, 0xAA, 0xAA, 0xC0, 0x80, 0x81, 0x03, 0x02, 48 | 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0xD5, 0x55, 0x55, 0xC0, 49 | 0x10, 0x51, 0x22, 0x28, 0x20, 0xFF, 0xE0, 0x88, 0x80, 0x7E, 0x00, 0x80, 50 | 0x47, 0xEC, 0x14, 0x0A, 0x0C, 0xFB, 0xC0, 0x20, 0x10, 0x0B, 0xC6, 0x12, 51 | 0x05, 0x02, 0x81, 0x40, 0xB0, 0xB7, 0x80, 0x3A, 0x8E, 0x0C, 0x08, 0x10, 52 | 0x10, 0x9E, 0x03, 0x00, 0x80, 0x47, 0xA4, 0x34, 0x0A, 0x05, 0x02, 0x81, 53 | 0x21, 0x8F, 0x60, 0x3C, 0x43, 0x81, 0xFF, 0x80, 0x80, 0x61, 0x3E, 0x3D, 54 | 0x04, 0x3E, 0x41, 0x04, 0x10, 0x41, 0x0F, 0x80, 0x3D, 0xA1, 0xA0, 0x50, 55 | 0x28, 0x14, 0x09, 0x0C, 0x7A, 0x01, 0x01, 0x87, 0x80, 0xC0, 0x20, 0x10, 56 | 0x0B, 0xC6, 0x32, 0x09, 0x04, 0x82, 0x41, 0x20, 0xB8, 0xE0, 0x10, 0x01, 57 | 0xC0, 0x81, 0x02, 0x04, 0x08, 0x11, 0xFC, 0x10, 0x3E, 0x10, 0x84, 0x21, 58 | 0x08, 0x42, 0x3F, 0x00, 0xC0, 0x40, 0x40, 0x4F, 0x44, 0x58, 0x70, 0x48, 59 | 0x44, 0x42, 0xC7, 0x70, 0x20, 0x40, 0x81, 0x02, 0x04, 0x08, 0x10, 0x23, 60 | 0xF8, 0xB7, 0x64, 0x62, 0x31, 0x18, 0x8C, 0x46, 0x23, 0x91, 0x5E, 0x31, 61 | 0x90, 0x48, 0x24, 0x12, 0x09, 0x05, 0xC7, 0x3E, 0x31, 0xA0, 0x30, 0x18, 62 | 0x0C, 0x05, 0x8C, 0x7C, 0xDE, 0x30, 0x90, 0x28, 0x14, 0x0A, 0x05, 0x84, 63 | 0xBC, 0x40, 0x20, 0x38, 0x00, 0x3D, 0xA1, 0xA0, 0x50, 0x28, 0x14, 0x09, 64 | 0x0C, 0x7A, 0x01, 0x00, 0x80, 0xE0, 0xCE, 0xA1, 0x82, 0x04, 0x08, 0x10, 65 | 0x7C, 0x3A, 0x8D, 0x0B, 0x80, 0xF0, 0x70, 0xDE, 0x40, 0x40, 0xFC, 0x40, 66 | 0x40, 0x40, 0x40, 0x40, 0x41, 0x3E, 0xC3, 0x41, 0x41, 0x41, 0x41, 0x41, 67 | 0x43, 0x3D, 0xE3, 0xA0, 0x90, 0x84, 0x42, 0x20, 0xA0, 0x50, 0x10, 0xE3, 68 | 0xC0, 0x92, 0x4B, 0x25, 0x92, 0xA9, 0x98, 0x44, 0xE3, 0x31, 0x05, 0x01, 69 | 0x01, 0x41, 0x11, 0x05, 0xC7, 0xE3, 0xA0, 0x90, 0x84, 0x42, 0x40, 0xA0, 70 | 0x60, 0x10, 0x10, 0x08, 0x3E, 0x00, 0xFD, 0x08, 0x20, 0x82, 0x08, 0x10, 71 | 0xBF, 0x29, 0x24, 0xA2, 0x49, 0x26, 0xFF, 0xF8, 0x89, 0x24, 0x8A, 0x49, 72 | 0x2C, 0x61, 0x24, 0x30}; 73 | 74 | const GFXglyph FreeMono9pt7bGlyphs[] PROGMEM = { 75 | {0, 0, 0, 11, 0, 1}, // 0x20 ' ' 76 | {0, 2, 11, 11, 4, -10}, // 0x21 '!' 77 | {3, 6, 5, 11, 2, -10}, // 0x22 '"' 78 | {7, 7, 12, 11, 2, -10}, // 0x23 '#' 79 | {18, 8, 12, 11, 1, -10}, // 0x24 '$' 80 | {30, 7, 11, 11, 2, -10}, // 0x25 '%' 81 | {40, 7, 10, 11, 2, -9}, // 0x26 '&' 82 | {49, 3, 5, 11, 4, -10}, // 0x27 ''' 83 | {51, 2, 13, 11, 5, -10}, // 0x28 '(' 84 | {55, 2, 13, 11, 4, -10}, // 0x29 ')' 85 | {59, 7, 7, 11, 2, -10}, // 0x2A '*' 86 | {66, 7, 7, 11, 2, -8}, // 0x2B '+' 87 | {73, 3, 5, 11, 2, -1}, // 0x2C ',' 88 | {75, 9, 1, 11, 1, -5}, // 0x2D '-' 89 | {77, 2, 2, 11, 4, -1}, // 0x2E '.' 90 | {78, 7, 13, 11, 2, -11}, // 0x2F '/' 91 | {90, 7, 11, 11, 2, -10}, // 0x30 '0' 92 | {100, 5, 11, 11, 3, -10}, // 0x31 '1' 93 | {107, 7, 11, 11, 2, -10}, // 0x32 '2' 94 | {117, 8, 11, 11, 1, -10}, // 0x33 '3' 95 | {128, 6, 11, 11, 3, -10}, // 0x34 '4' 96 | {137, 7, 11, 11, 2, -10}, // 0x35 '5' 97 | {147, 7, 11, 11, 2, -10}, // 0x36 '6' 98 | {157, 7, 11, 11, 2, -10}, // 0x37 '7' 99 | {167, 7, 11, 11, 2, -10}, // 0x38 '8' 100 | {177, 7, 11, 11, 2, -10}, // 0x39 '9' 101 | {187, 2, 8, 11, 4, -7}, // 0x3A ':' 102 | {189, 3, 11, 11, 3, -7}, // 0x3B ';' 103 | {194, 8, 8, 11, 1, -8}, // 0x3C '<' 104 | {202, 9, 4, 11, 1, -6}, // 0x3D '=' 105 | {207, 9, 8, 11, 1, -8}, // 0x3E '>' 106 | {216, 7, 10, 11, 2, -9}, // 0x3F '?' 107 | {225, 8, 12, 11, 2, -10}, // 0x40 '@' 108 | {237, 11, 10, 11, 0, -9}, // 0x41 'A' 109 | {251, 9, 10, 11, 1, -9}, // 0x42 'B' 110 | {263, 9, 10, 11, 1, -9}, // 0x43 'C' 111 | {275, 9, 10, 11, 1, -9}, // 0x44 'D' 112 | {287, 9, 10, 11, 1, -9}, // 0x45 'E' 113 | {299, 9, 10, 11, 1, -9}, // 0x46 'F' 114 | {311, 10, 10, 11, 1, -9}, // 0x47 'G' 115 | {324, 9, 10, 11, 1, -9}, // 0x48 'H' 116 | {336, 5, 10, 11, 3, -9}, // 0x49 'I' 117 | {343, 8, 10, 11, 2, -9}, // 0x4A 'J' 118 | {353, 9, 10, 11, 1, -9}, // 0x4B 'K' 119 | {365, 8, 10, 11, 2, -9}, // 0x4C 'L' 120 | {375, 11, 10, 11, 0, -9}, // 0x4D 'M' 121 | {389, 9, 10, 11, 1, -9}, // 0x4E 'N' 122 | {401, 9, 10, 11, 1, -9}, // 0x4F 'O' 123 | {413, 8, 10, 11, 1, -9}, // 0x50 'P' 124 | {423, 9, 13, 11, 1, -9}, // 0x51 'Q' 125 | {438, 9, 10, 11, 1, -9}, // 0x52 'R' 126 | {450, 7, 10, 11, 2, -9}, // 0x53 'S' 127 | {459, 9, 10, 11, 1, -9}, // 0x54 'T' 128 | {471, 9, 10, 11, 1, -9}, // 0x55 'U' 129 | {483, 11, 10, 11, 0, -9}, // 0x56 'V' 130 | {497, 11, 10, 11, 0, -9}, // 0x57 'W' 131 | {511, 9, 10, 11, 1, -9}, // 0x58 'X' 132 | {523, 9, 10, 11, 1, -9}, // 0x59 'Y' 133 | {535, 7, 10, 11, 2, -9}, // 0x5A 'Z' 134 | {544, 2, 13, 11, 5, -10}, // 0x5B '[' 135 | {548, 7, 13, 11, 2, -11}, // 0x5C '\' 136 | {560, 2, 13, 11, 4, -10}, // 0x5D ']' 137 | {564, 7, 5, 11, 2, -10}, // 0x5E '^' 138 | {569, 11, 1, 11, 0, 2}, // 0x5F '_' 139 | {571, 3, 3, 11, 3, -11}, // 0x60 '`' 140 | {573, 9, 8, 11, 1, -7}, // 0x61 'a' 141 | {582, 9, 11, 11, 1, -10}, // 0x62 'b' 142 | {595, 7, 8, 11, 2, -7}, // 0x63 'c' 143 | {602, 9, 11, 11, 1, -10}, // 0x64 'd' 144 | {615, 8, 8, 11, 1, -7}, // 0x65 'e' 145 | {623, 6, 11, 11, 3, -10}, // 0x66 'f' 146 | {632, 9, 11, 11, 1, -7}, // 0x67 'g' 147 | {645, 9, 11, 11, 1, -10}, // 0x68 'h' 148 | {658, 7, 10, 11, 2, -9}, // 0x69 'i' 149 | {667, 5, 13, 11, 3, -9}, // 0x6A 'j' 150 | {676, 8, 11, 11, 2, -10}, // 0x6B 'k' 151 | {687, 7, 11, 11, 2, -10}, // 0x6C 'l' 152 | {697, 9, 8, 11, 1, -7}, // 0x6D 'm' 153 | {706, 9, 8, 11, 1, -7}, // 0x6E 'n' 154 | {715, 9, 8, 11, 1, -7}, // 0x6F 'o' 155 | {724, 9, 11, 11, 1, -7}, // 0x70 'p' 156 | {737, 9, 11, 11, 1, -7}, // 0x71 'q' 157 | {750, 7, 8, 11, 3, -7}, // 0x72 'r' 158 | {757, 7, 8, 11, 2, -7}, // 0x73 's' 159 | {764, 8, 10, 11, 2, -9}, // 0x74 't' 160 | {774, 8, 8, 11, 1, -7}, // 0x75 'u' 161 | {782, 9, 8, 11, 1, -7}, // 0x76 'v' 162 | {791, 9, 8, 11, 1, -7}, // 0x77 'w' 163 | {800, 9, 8, 11, 1, -7}, // 0x78 'x' 164 | {809, 9, 11, 11, 1, -7}, // 0x79 'y' 165 | {822, 7, 8, 11, 2, -7}, // 0x7A 'z' 166 | {829, 3, 13, 11, 4, -10}, // 0x7B '{' 167 | {834, 1, 13, 11, 5, -10}, // 0x7C '|' 168 | {836, 3, 13, 11, 4, -10}, // 0x7D '}' 169 | {841, 7, 3, 11, 2, -6}}; // 0x7E '~' 170 | 171 | const GFXfont FreeMono9pt7b PROGMEM = {(uint8_t *)FreeMono9pt7bBitmaps, 172 | (GFXglyph *)FreeMono9pt7bGlyphs, 0x20, 173 | 0x7E, 18}; 174 | 175 | // Approx. 1516 bytes 176 | -------------------------------------------------------------------------------- /app/src/lib/Adafruit-GFX-Library/Fonts/FreeMonoOblique9pt7b.h: -------------------------------------------------------------------------------- 1 | const uint8_t FreeMonoOblique9pt7bBitmaps[] PROGMEM = { 2 | 0x11, 0x22, 0x24, 0x40, 0x00, 0xC0, 0xDE, 0xE5, 0x29, 0x00, 0x09, 0x05, 3 | 0x02, 0x82, 0x47, 0xF8, 0xA0, 0x51, 0xFE, 0x28, 0x14, 0x0A, 0x09, 0x00, 4 | 0x08, 0x1D, 0x23, 0x40, 0x70, 0x1C, 0x02, 0x82, 0x84, 0x78, 0x20, 0x20, 5 | 0x1C, 0x11, 0x08, 0x83, 0x80, 0x18, 0x71, 0xC0, 0x1C, 0x11, 0x08, 0x83, 6 | 0x80, 0x1E, 0x60, 0x81, 0x03, 0x0A, 0x65, 0x46, 0x88, 0xE8, 0xFA, 0x80, 7 | 0x12, 0x24, 0x48, 0x88, 0x88, 0x88, 0x80, 0x01, 0x11, 0x11, 0x11, 0x22, 8 | 0x44, 0x80, 0x10, 0x22, 0x5B, 0xC3, 0x0A, 0x22, 0x00, 0x04, 0x02, 0x02, 9 | 0x1F, 0xF0, 0x80, 0x40, 0x20, 0x00, 0x36, 0x4C, 0x80, 0xFF, 0x80, 0xF0, 10 | 0x00, 0x80, 0x80, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 11 | 0x08, 0x08, 0x00, 0x1C, 0x45, 0x0A, 0x18, 0x30, 0x61, 0x42, 0x85, 0x11, 12 | 0xC0, 0x04, 0x38, 0x90, 0x20, 0x81, 0x02, 0x04, 0x08, 0x23, 0xF8, 0x07, 13 | 0x04, 0xC4, 0x20, 0x10, 0x10, 0x30, 0x20, 0x20, 0x60, 0x40, 0x3F, 0x80, 14 | 0x0F, 0x00, 0x40, 0x20, 0x20, 0x60, 0x18, 0x04, 0x02, 0x01, 0x43, 0x1E, 15 | 0x00, 0x03, 0x05, 0x0A, 0x12, 0x22, 0x22, 0x42, 0x7F, 0x04, 0x04, 0x1E, 16 | 0x1F, 0x88, 0x08, 0x05, 0xC3, 0x30, 0x08, 0x04, 0x02, 0x02, 0x42, 0x1E, 17 | 0x00, 0x07, 0x18, 0x20, 0x40, 0x5C, 0xA6, 0xC2, 0x82, 0x82, 0xC4, 0x78, 18 | 0xFF, 0x04, 0x10, 0x20, 0x82, 0x04, 0x10, 0x20, 0x81, 0x00, 0x1E, 0x23, 19 | 0x41, 0x41, 0x62, 0x1C, 0x66, 0x82, 0x82, 0x84, 0x78, 0x1E, 0x23, 0x41, 20 | 0x41, 0x43, 0x65, 0x3A, 0x02, 0x04, 0x18, 0xE0, 0x6C, 0x00, 0x36, 0x18, 21 | 0xC0, 0x00, 0x19, 0x8C, 0xC4, 0x00, 0x01, 0x83, 0x06, 0x0C, 0x06, 0x00, 22 | 0x80, 0x30, 0x04, 0xFF, 0x80, 0x00, 0x1F, 0xF0, 0x20, 0x0C, 0x01, 0x00, 23 | 0x60, 0x20, 0x60, 0xC1, 0x80, 0x3D, 0x8E, 0x08, 0x10, 0xC6, 0x08, 0x00, 24 | 0x01, 0x80, 0x1C, 0x45, 0x0A, 0x79, 0x34, 0x69, 0x4E, 0x81, 0x03, 0x03, 25 | 0xC0, 0x0F, 0x00, 0x60, 0x12, 0x02, 0x40, 0x88, 0x21, 0x07, 0xE1, 0x04, 26 | 0x20, 0x5E, 0x3C, 0x3F, 0x84, 0x11, 0x04, 0x82, 0x3F, 0x88, 0x32, 0x04, 27 | 0x81, 0x60, 0xBF, 0xC0, 0x1E, 0x98, 0xD0, 0x28, 0x08, 0x04, 0x02, 0x01, 28 | 0x00, 0x41, 0x1F, 0x00, 0x3F, 0x0C, 0x22, 0x04, 0x81, 0x20, 0x48, 0x12, 29 | 0x09, 0x02, 0x43, 0x3F, 0x00, 0x3F, 0xC4, 0x11, 0x00, 0x88, 0x3E, 0x08, 30 | 0x82, 0x00, 0x82, 0x60, 0xBF, 0xE0, 0x3F, 0xE2, 0x08, 0x40, 0x11, 0x03, 31 | 0xE0, 0x44, 0x08, 0x01, 0x00, 0x60, 0x1F, 0x00, 0x1E, 0x98, 0xD0, 0x08, 32 | 0x08, 0x04, 0x7A, 0x05, 0x02, 0x41, 0x1F, 0x00, 0x3D, 0xE2, 0x18, 0x42, 33 | 0x08, 0x43, 0xF8, 0x41, 0x08, 0x21, 0x08, 0x21, 0x1E, 0xF0, 0x3F, 0x82, 34 | 0x02, 0x01, 0x00, 0x80, 0x40, 0x20, 0x20, 0x10, 0x7F, 0x00, 0x0F, 0xE0, 35 | 0x20, 0x04, 0x00, 0x80, 0x10, 0x02, 0x20, 0x84, 0x10, 0x84, 0x0F, 0x00, 36 | 0x3C, 0xE2, 0x10, 0x44, 0x11, 0x02, 0xC0, 0x64, 0x08, 0x81, 0x08, 0x61, 37 | 0x1E, 0x38, 0x3E, 0x02, 0x00, 0x80, 0x20, 0x10, 0x04, 0x01, 0x04, 0x42, 38 | 0x10, 0xBF, 0xE0, 0x38, 0x38, 0xC3, 0x05, 0x28, 0x29, 0x42, 0x52, 0x13, 39 | 0x10, 0x99, 0x84, 0x08, 0x20, 0x47, 0x8F, 0x00, 0x70, 0xE6, 0x08, 0xA1, 40 | 0x14, 0x22, 0x48, 0x49, 0x11, 0x22, 0x14, 0x43, 0x1E, 0x20, 0x1E, 0x18, 41 | 0x90, 0x28, 0x18, 0x0C, 0x06, 0x05, 0x02, 0x46, 0x1E, 0x00, 0x3F, 0x84, 42 | 0x31, 0x04, 0x81, 0x20, 0x8F, 0xC2, 0x00, 0x80, 0x60, 0x3E, 0x00, 0x1E, 43 | 0x18, 0x90, 0x28, 0x18, 0x0C, 0x06, 0x05, 0x02, 0x46, 0x1E, 0x08, 0x0F, 44 | 0x44, 0x60, 0x3F, 0x84, 0x31, 0x04, 0x81, 0x20, 0x8F, 0xC2, 0x10, 0x84, 45 | 0x60, 0xBC, 0x10, 0x0F, 0x88, 0xC8, 0x24, 0x01, 0x80, 0x38, 0x05, 0x02, 46 | 0xC2, 0x5E, 0x00, 0xFF, 0xC4, 0x44, 0x02, 0x01, 0x00, 0x80, 0x40, 0x60, 47 | 0x20, 0x7E, 0x00, 0xF1, 0xD0, 0x24, 0x09, 0x02, 0x41, 0xA0, 0x48, 0x12, 48 | 0x04, 0xC6, 0x1F, 0x00, 0xF1, 0xE8, 0x11, 0x02, 0x20, 0x82, 0x20, 0x44, 49 | 0x09, 0x01, 0x40, 0x28, 0x02, 0x00, 0xF1, 0xE8, 0x09, 0x12, 0x26, 0x45, 50 | 0x48, 0xAA, 0x29, 0x45, 0x28, 0xC6, 0x18, 0xC0, 0x38, 0xE2, 0x08, 0x26, 51 | 0x05, 0x00, 0x40, 0x18, 0x04, 0x81, 0x08, 0x41, 0x1C, 0x70, 0xE3, 0xA0, 52 | 0x90, 0x84, 0x81, 0x80, 0x80, 0x40, 0x20, 0x20, 0x7E, 0x00, 0x3F, 0x90, 53 | 0x88, 0x80, 0x80, 0x80, 0x80, 0x80, 0x82, 0x82, 0x7F, 0x00, 0x39, 0x08, 54 | 0x44, 0x21, 0x08, 0x42, 0x21, 0x0E, 0x00, 0x88, 0x44, 0x44, 0x22, 0x22, 55 | 0x11, 0x11, 0x38, 0x42, 0x11, 0x08, 0x42, 0x10, 0x84, 0x2E, 0x00, 0x08, 56 | 0x28, 0x92, 0x18, 0x20, 0xFF, 0xC0, 0xA4, 0x3E, 0x00, 0x80, 0x47, 0xA4, 57 | 0x34, 0x12, 0x18, 0xF7, 0x38, 0x01, 0x00, 0x40, 0x09, 0xE1, 0xC6, 0x20, 58 | 0x44, 0x09, 0x01, 0x30, 0x46, 0x13, 0xBC, 0x00, 0x1F, 0x48, 0x74, 0x0A, 59 | 0x00, 0x80, 0x20, 0x0C, 0x18, 0xF8, 0x01, 0x80, 0x40, 0x23, 0x96, 0x32, 60 | 0x0A, 0x05, 0x02, 0x81, 0x61, 0x1F, 0xE0, 0x1F, 0x30, 0xD0, 0x3F, 0xF8, 61 | 0x04, 0x01, 0x00, 0x7C, 0x07, 0xC3, 0x00, 0x80, 0xFE, 0x10, 0x04, 0x01, 62 | 0x00, 0x40, 0x10, 0x08, 0x0F, 0xE0, 0x1D, 0xD8, 0xC4, 0x12, 0x04, 0x82, 63 | 0x20, 0x8C, 0x61, 0xE8, 0x02, 0x01, 0x07, 0x80, 0x30, 0x04, 0x01, 0x00, 64 | 0x5C, 0x38, 0x88, 0x22, 0x08, 0x82, 0x21, 0x18, 0x4F, 0x3C, 0x04, 0x04, 65 | 0x00, 0x38, 0x08, 0x08, 0x08, 0x08, 0x10, 0x10, 0xFF, 0x01, 0x00, 0x80, 66 | 0x03, 0xF0, 0x10, 0x08, 0x04, 0x02, 0x02, 0x01, 0x00, 0x80, 0x40, 0x47, 67 | 0xC0, 0x38, 0x08, 0x04, 0x02, 0x71, 0x20, 0xA0, 0xA0, 0x68, 0x24, 0x11, 68 | 0x38, 0xE0, 0x3C, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, 0x08, 0x10, 0x10, 69 | 0xFF, 0x3E, 0xE2, 0x64, 0x88, 0x91, 0x12, 0x24, 0x48, 0x91, 0x17, 0x33, 70 | 0x37, 0x14, 0x4C, 0x24, 0x12, 0x09, 0x08, 0x85, 0xE3, 0x1E, 0x10, 0x90, 71 | 0x30, 0x18, 0x0C, 0x0B, 0x08, 0x78, 0x33, 0xC3, 0x8C, 0x40, 0x88, 0x12, 72 | 0x02, 0x60, 0x8C, 0x31, 0x78, 0x20, 0x08, 0x03, 0xE0, 0x00, 0x1C, 0xD8, 73 | 0xC4, 0x12, 0x04, 0x81, 0x20, 0x4C, 0x21, 0xF8, 0x02, 0x00, 0x81, 0xF0, 74 | 0x73, 0x8E, 0x04, 0x04, 0x02, 0x01, 0x00, 0x81, 0xFC, 0x1F, 0x61, 0x40, 75 | 0x3C, 0x03, 0x81, 0x82, 0xFC, 0x10, 0x63, 0xF9, 0x02, 0x04, 0x10, 0x20, 76 | 0x40, 0x7C, 0xE3, 0x10, 0x90, 0x48, 0x24, 0x22, 0x11, 0x18, 0xF6, 0xF3, 77 | 0xD0, 0x44, 0x10, 0x88, 0x24, 0x09, 0x02, 0x80, 0x40, 0xE1, 0xD0, 0x24, 78 | 0x91, 0x24, 0x55, 0x19, 0x86, 0x61, 0x10, 0x39, 0xC4, 0x20, 0xB0, 0x30, 79 | 0x0C, 0x04, 0x86, 0x13, 0x8E, 0x3C, 0x71, 0x04, 0x10, 0x40, 0x88, 0x09, 80 | 0x00, 0xA0, 0x06, 0x00, 0x40, 0x08, 0x01, 0x00, 0xFC, 0x00, 0x7F, 0x42, 81 | 0x04, 0x08, 0x10, 0x20, 0x42, 0xFE, 0x0C, 0x41, 0x04, 0x30, 0x8C, 0x08, 82 | 0x21, 0x04, 0x10, 0x60, 0x24, 0x94, 0x92, 0x52, 0x40, 0x18, 0x20, 0x82, 83 | 0x10, 0x40, 0xC4, 0x10, 0x82, 0x08, 0xC0, 0x61, 0x24, 0x30}; 84 | 85 | const GFXglyph FreeMonoOblique9pt7bGlyphs[] PROGMEM = { 86 | {0, 0, 0, 11, 0, 1}, // 0x20 ' ' 87 | {0, 4, 11, 11, 4, -10}, // 0x21 '!' 88 | {6, 5, 5, 11, 4, -10}, // 0x22 '"' 89 | {10, 9, 12, 11, 2, -10}, // 0x23 '#' 90 | {24, 8, 12, 11, 3, -10}, // 0x24 '$' 91 | {36, 9, 11, 11, 2, -10}, // 0x25 '%' 92 | {49, 7, 10, 11, 2, -9}, // 0x26 '&' 93 | {58, 2, 5, 11, 6, -10}, // 0x27 ''' 94 | {60, 4, 13, 11, 6, -10}, // 0x28 '(' 95 | {67, 4, 13, 11, 3, -10}, // 0x29 ')' 96 | {74, 7, 7, 11, 4, -10}, // 0x2A '*' 97 | {81, 9, 8, 11, 2, -8}, // 0x2B '+' 98 | {90, 4, 5, 11, 2, -1}, // 0x2C ',' 99 | {93, 9, 1, 11, 2, -5}, // 0x2D '-' 100 | {95, 2, 2, 11, 4, -1}, // 0x2E '.' 101 | {96, 9, 13, 11, 2, -11}, // 0x2F '/' 102 | {111, 7, 11, 11, 3, -10}, // 0x30 '0' 103 | {121, 7, 11, 11, 2, -10}, // 0x31 '1' 104 | {131, 9, 11, 11, 2, -10}, // 0x32 '2' 105 | {144, 9, 11, 11, 2, -10}, // 0x33 '3' 106 | {157, 8, 11, 11, 2, -10}, // 0x34 '4' 107 | {168, 9, 11, 11, 2, -10}, // 0x35 '5' 108 | {181, 8, 11, 11, 3, -10}, // 0x36 '6' 109 | {192, 7, 11, 11, 4, -10}, // 0x37 '7' 110 | {202, 8, 11, 11, 3, -10}, // 0x38 '8' 111 | {213, 8, 11, 11, 3, -10}, // 0x39 '9' 112 | {224, 3, 8, 11, 4, -7}, // 0x3A ':' 113 | {227, 5, 11, 11, 2, -7}, // 0x3B ';' 114 | {234, 9, 8, 11, 2, -8}, // 0x3C '<' 115 | {243, 9, 4, 11, 2, -6}, // 0x3D '=' 116 | {248, 9, 8, 11, 2, -8}, // 0x3E '>' 117 | {257, 7, 10, 11, 4, -9}, // 0x3F '?' 118 | {266, 7, 12, 11, 3, -10}, // 0x40 '@' 119 | {277, 11, 10, 11, 0, -9}, // 0x41 'A' 120 | {291, 10, 10, 11, 1, -9}, // 0x42 'B' 121 | {304, 9, 10, 11, 2, -9}, // 0x43 'C' 122 | {316, 10, 10, 11, 1, -9}, // 0x44 'D' 123 | {329, 10, 10, 11, 1, -9}, // 0x45 'E' 124 | {342, 11, 10, 11, 1, -9}, // 0x46 'F' 125 | {356, 9, 10, 11, 2, -9}, // 0x47 'G' 126 | {368, 11, 10, 11, 1, -9}, // 0x48 'H' 127 | {382, 9, 10, 11, 2, -9}, // 0x49 'I' 128 | {394, 11, 10, 11, 2, -9}, // 0x4A 'J' 129 | {408, 11, 10, 11, 1, -9}, // 0x4B 'K' 130 | {422, 10, 10, 11, 1, -9}, // 0x4C 'L' 131 | {435, 13, 10, 11, 0, -9}, // 0x4D 'M' 132 | {452, 11, 10, 11, 1, -9}, // 0x4E 'N' 133 | {466, 9, 10, 11, 2, -9}, // 0x4F 'O' 134 | {478, 10, 10, 11, 1, -9}, // 0x50 'P' 135 | {491, 9, 13, 11, 2, -9}, // 0x51 'Q' 136 | {506, 10, 10, 11, 1, -9}, // 0x52 'R' 137 | {519, 9, 10, 11, 2, -9}, // 0x53 'S' 138 | {531, 9, 10, 11, 3, -9}, // 0x54 'T' 139 | {543, 10, 10, 11, 2, -9}, // 0x55 'U' 140 | {556, 11, 10, 11, 2, -9}, // 0x56 'V' 141 | {570, 11, 10, 11, 2, -9}, // 0x57 'W' 142 | {584, 11, 10, 11, 1, -9}, // 0x58 'X' 143 | {598, 9, 10, 11, 3, -9}, // 0x59 'Y' 144 | {610, 9, 10, 11, 2, -9}, // 0x5A 'Z' 145 | {622, 5, 13, 11, 5, -10}, // 0x5B '[' 146 | {631, 4, 14, 11, 4, -11}, // 0x5C '\' 147 | {638, 5, 13, 11, 2, -10}, // 0x5D ']' 148 | {647, 7, 5, 11, 3, -10}, // 0x5E '^' 149 | {652, 11, 1, 11, 0, 2}, // 0x5F '_' 150 | {654, 2, 3, 11, 5, -11}, // 0x60 '`' 151 | {655, 9, 8, 11, 2, -7}, // 0x61 'a' 152 | {664, 11, 11, 11, 0, -10}, // 0x62 'b' 153 | {680, 10, 8, 11, 2, -7}, // 0x63 'c' 154 | {690, 9, 11, 11, 2, -10}, // 0x64 'd' 155 | {703, 9, 8, 11, 2, -7}, // 0x65 'e' 156 | {712, 10, 11, 11, 2, -10}, // 0x66 'f' 157 | {726, 10, 11, 11, 2, -7}, // 0x67 'g' 158 | {740, 10, 11, 11, 1, -10}, // 0x68 'h' 159 | {754, 8, 11, 11, 2, -10}, // 0x69 'i' 160 | {765, 9, 14, 11, 1, -10}, // 0x6A 'j' 161 | {781, 9, 11, 11, 1, -10}, // 0x6B 'k' 162 | {794, 8, 11, 11, 2, -10}, // 0x6C 'l' 163 | {805, 11, 8, 11, 0, -7}, // 0x6D 'm' 164 | {816, 9, 8, 11, 1, -7}, // 0x6E 'n' 165 | {825, 9, 8, 11, 2, -7}, // 0x6F 'o' 166 | {834, 11, 11, 11, 0, -7}, // 0x70 'p' 167 | {850, 10, 11, 11, 2, -7}, // 0x71 'q' 168 | {864, 9, 8, 11, 2, -7}, // 0x72 'r' 169 | {873, 8, 8, 11, 2, -7}, // 0x73 's' 170 | {881, 7, 10, 11, 2, -9}, // 0x74 't' 171 | {890, 9, 8, 11, 2, -7}, // 0x75 'u' 172 | {899, 10, 8, 11, 2, -7}, // 0x76 'v' 173 | {909, 10, 8, 11, 2, -7}, // 0x77 'w' 174 | {919, 10, 8, 11, 1, -7}, // 0x78 'x' 175 | {929, 12, 11, 11, 0, -7}, // 0x79 'y' 176 | {946, 8, 8, 11, 2, -7}, // 0x7A 'z' 177 | {954, 6, 13, 11, 4, -10}, // 0x7B '{' 178 | {964, 3, 12, 11, 5, -9}, // 0x7C '|' 179 | {969, 6, 13, 11, 3, -10}, // 0x7D '}' 180 | {979, 7, 3, 11, 3, -6}}; // 0x7E '~' 181 | 182 | const GFXfont FreeMonoOblique9pt7b PROGMEM = { 183 | (uint8_t *)FreeMonoOblique9pt7bBitmaps, 184 | (GFXglyph *)FreeMonoOblique9pt7bGlyphs, 0x20, 0x7E, 18}; 185 | 186 | // Approx. 1654 bytes 187 | -------------------------------------------------------------------------------- /app/src/lib/Adafruit-GFX-Library/Fonts/FreeMonoBold9pt7b.h: -------------------------------------------------------------------------------- 1 | const uint8_t FreeMonoBold9pt7bBitmaps[] PROGMEM = { 2 | 0xFF, 0xFF, 0xD2, 0x1F, 0x80, 0xEC, 0x89, 0x12, 0x24, 0x40, 0x36, 0x36, 3 | 0x36, 0x7F, 0x7F, 0x36, 0xFF, 0xFF, 0x3C, 0x3C, 0x3C, 0x00, 0x18, 0xFF, 4 | 0xFE, 0x3C, 0x1F, 0x1F, 0x83, 0x46, 0x8D, 0xF0, 0xC1, 0x83, 0x00, 0x61, 5 | 0x22, 0x44, 0x86, 0x67, 0x37, 0x11, 0x22, 0x4C, 0x70, 0x3C, 0x7E, 0x60, 6 | 0x60, 0x30, 0x7B, 0xDF, 0xCE, 0xFF, 0x7F, 0xC9, 0x24, 0x37, 0x66, 0xCC, 7 | 0xCC, 0xCC, 0x66, 0x31, 0xCE, 0x66, 0x33, 0x33, 0x33, 0x66, 0xC8, 0x18, 8 | 0x18, 0xFF, 0xFF, 0x3C, 0x3C, 0x66, 0x18, 0x18, 0x18, 0xFF, 0xFF, 0x18, 9 | 0x18, 0x18, 0x18, 0x6B, 0x48, 0xFF, 0xFF, 0xC0, 0xF0, 0x02, 0x0C, 0x18, 10 | 0x60, 0xC3, 0x06, 0x0C, 0x30, 0x61, 0x83, 0x0C, 0x18, 0x20, 0x00, 0x38, 11 | 0xFB, 0xBE, 0x3C, 0x78, 0xF1, 0xE3, 0xC7, 0xDD, 0xF1, 0xC0, 0x38, 0xF3, 12 | 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0xFD, 0xF8, 0x3C, 0xFE, 0xC7, 0x03, 13 | 0x03, 0x06, 0x0C, 0x18, 0x70, 0xE3, 0xFF, 0xFF, 0x7C, 0xFE, 0x03, 0x03, 14 | 0x03, 0x1E, 0x1E, 0x07, 0x03, 0x03, 0xFE, 0x7C, 0x1C, 0x38, 0xB1, 0x64, 15 | 0xD9, 0xBF, 0xFF, 0x3E, 0x7C, 0x7E, 0x3F, 0x18, 0x0F, 0xC7, 0xF3, 0x1C, 16 | 0x06, 0x03, 0xC3, 0xFF, 0x9F, 0x80, 0x0F, 0x3F, 0x30, 0x60, 0x60, 0xDC, 17 | 0xFE, 0xE3, 0xC3, 0x63, 0x7E, 0x3C, 0xFF, 0xFF, 0xC3, 0x03, 0x06, 0x06, 18 | 0x06, 0x0C, 0x0C, 0x0C, 0x18, 0x38, 0xFB, 0x1E, 0x3C, 0x6F, 0x9F, 0x63, 19 | 0xC7, 0x8F, 0xF1, 0xC0, 0x3C, 0x7E, 0xE6, 0xC3, 0xC3, 0xE7, 0x7F, 0x3B, 20 | 0x06, 0x0E, 0xFC, 0xF0, 0xF0, 0x0F, 0x6C, 0x00, 0x1A, 0xD2, 0x00, 0x01, 21 | 0x83, 0x87, 0x0E, 0x0F, 0x80, 0xE0, 0x1C, 0x03, 0xFF, 0xFF, 0xC0, 0x00, 22 | 0x0F, 0xFF, 0xFC, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0xF9, 0xE3, 0xC1, 0x80, 23 | 0x7C, 0xFE, 0xC7, 0x03, 0x0E, 0x1C, 0x00, 0x00, 0x00, 0x30, 0x30, 0x1E, 24 | 0x1F, 0x1C, 0xDC, 0x6C, 0x76, 0x7B, 0x6D, 0xB6, 0xDB, 0x6F, 0xF3, 0xFC, 25 | 0x06, 0x33, 0xF8, 0x78, 0x3C, 0x07, 0xC0, 0x38, 0x05, 0x81, 0xB0, 0x36, 26 | 0x0F, 0xE1, 0xFC, 0x71, 0xDF, 0x7F, 0xEF, 0x80, 0xFF, 0x3F, 0xE6, 0x19, 27 | 0x86, 0x7F, 0x1F, 0xE6, 0x1D, 0x83, 0x60, 0xFF, 0xFF, 0xF0, 0x1F, 0xBF, 28 | 0xD8, 0xF8, 0x3C, 0x06, 0x03, 0x01, 0x80, 0x61, 0xBF, 0xC7, 0xC0, 0xFE, 29 | 0x3F, 0xE6, 0x19, 0x83, 0x60, 0xD8, 0x36, 0x0D, 0x83, 0x61, 0xBF, 0xEF, 30 | 0xE0, 0xFF, 0xFF, 0xD8, 0x6D, 0xB7, 0xC3, 0xE1, 0xB0, 0xC3, 0x61, 0xFF, 31 | 0xFF, 0xE0, 0xFF, 0xFF, 0xD8, 0x6D, 0xB7, 0xC3, 0xE1, 0xB0, 0xC0, 0x60, 32 | 0x7C, 0x3E, 0x00, 0x1F, 0x9F, 0xE6, 0x1B, 0x06, 0xC0, 0x30, 0x0C, 0x7F, 33 | 0x1F, 0xE1, 0x9F, 0xE3, 0xF0, 0xF7, 0xFB, 0xD8, 0xCC, 0x66, 0x33, 0xF9, 34 | 0xFC, 0xC6, 0x63, 0x7B, 0xFD, 0xE0, 0xFF, 0xF3, 0x0C, 0x30, 0xC3, 0x0C, 35 | 0x33, 0xFF, 0xC0, 0x1F, 0xC7, 0xF0, 0x30, 0x0C, 0x03, 0x00, 0xCC, 0x33, 36 | 0x0C, 0xC7, 0x3F, 0x87, 0xC0, 0xF7, 0xBD, 0xE6, 0x61, 0xB0, 0x78, 0x1F, 37 | 0x06, 0xE1, 0x98, 0x63, 0x3C, 0xFF, 0x3C, 0xFC, 0x7E, 0x0C, 0x06, 0x03, 38 | 0x01, 0x80, 0xC6, 0x63, 0x31, 0xFF, 0xFF, 0xE0, 0xE0, 0xFE, 0x3D, 0xC7, 39 | 0x3D, 0xE7, 0xBC, 0xD7, 0x9B, 0xB3, 0x76, 0x60, 0xDE, 0x3F, 0xC7, 0x80, 40 | 0xE1, 0xFE, 0x3D, 0xE3, 0x3C, 0x66, 0xCC, 0xDD, 0x99, 0xB3, 0x1E, 0x63, 41 | 0xDE, 0x3B, 0xC3, 0x00, 0x1F, 0x07, 0xF1, 0xC7, 0x70, 0x7C, 0x07, 0x80, 42 | 0xF0, 0x1F, 0x07, 0x71, 0xC7, 0xF0, 0x7C, 0x00, 0xFE, 0x7F, 0x98, 0x6C, 43 | 0x36, 0x1B, 0xF9, 0xF8, 0xC0, 0x60, 0x7C, 0x3E, 0x00, 0x1F, 0x07, 0xF1, 44 | 0xC7, 0x70, 0x7C, 0x07, 0x80, 0xF0, 0x1F, 0x07, 0x71, 0xC7, 0xF0, 0x7C, 45 | 0x0C, 0x33, 0xFE, 0x7F, 0x80, 0xFC, 0x7F, 0x18, 0xCC, 0x66, 0x73, 0xF1, 46 | 0xF0, 0xCC, 0x63, 0x7D, 0xFE, 0x60, 0x3F, 0xBF, 0xF0, 0x78, 0x0F, 0x03, 47 | 0xF8, 0x3F, 0x83, 0xC3, 0xFF, 0xBF, 0x80, 0xFF, 0xFF, 0xF6, 0x7B, 0x3D, 48 | 0x98, 0xC0, 0x60, 0x30, 0x18, 0x3F, 0x1F, 0x80, 0xF1, 0xFE, 0x3D, 0x83, 49 | 0x30, 0x66, 0x0C, 0xC1, 0x98, 0x33, 0x06, 0x60, 0xC7, 0xF0, 0x7C, 0x00, 50 | 0xFB, 0xFF, 0x7D, 0xC3, 0x18, 0xC3, 0x18, 0x36, 0x06, 0xC0, 0x50, 0x0E, 51 | 0x01, 0xC0, 0x10, 0x00, 0xFB, 0xFE, 0xF6, 0x0D, 0x93, 0x6E, 0xDB, 0xB7, 52 | 0xAD, 0xEE, 0x7B, 0x8E, 0xE3, 0x18, 0xF3, 0xFC, 0xF7, 0x38, 0xFC, 0x1E, 53 | 0x03, 0x01, 0xE0, 0xCC, 0x73, 0xBC, 0xFF, 0x3C, 0xF3, 0xFC, 0xF7, 0x38, 54 | 0xCC, 0x1E, 0x07, 0x80, 0xC0, 0x30, 0x0C, 0x0F, 0xC3, 0xF0, 0xFE, 0xFE, 55 | 0xC6, 0xCC, 0x18, 0x18, 0x30, 0x63, 0xC3, 0xFF, 0xFF, 0xFF, 0xCC, 0xCC, 56 | 0xCC, 0xCC, 0xCC, 0xFF, 0x01, 0x03, 0x06, 0x06, 0x0C, 0x0C, 0x18, 0x18, 57 | 0x30, 0x30, 0x60, 0x60, 0xC0, 0x80, 0xFF, 0x33, 0x33, 0x33, 0x33, 0x33, 58 | 0xFF, 0x10, 0x71, 0xE3, 0x6C, 0x70, 0x40, 0xFF, 0xFF, 0xFC, 0x88, 0x80, 59 | 0x7E, 0x3F, 0x8F, 0xCF, 0xEE, 0x36, 0x1B, 0xFE, 0xFF, 0xE0, 0x38, 0x06, 60 | 0x01, 0xBC, 0x7F, 0x9C, 0x76, 0x0D, 0x83, 0x71, 0xFF, 0xEE, 0xF0, 0x3F, 61 | 0xBF, 0xF8, 0x78, 0x3C, 0x07, 0x05, 0xFE, 0x7E, 0x03, 0x80, 0xE0, 0x18, 62 | 0xF6, 0x7F, 0xB8, 0xEC, 0x1B, 0x06, 0xE3, 0x9F, 0xF3, 0xFC, 0x3E, 0x3F, 63 | 0xB0, 0xFF, 0xFF, 0xFE, 0x01, 0xFE, 0x7E, 0x1F, 0x3F, 0x30, 0x7E, 0x7E, 64 | 0x30, 0x30, 0x30, 0x30, 0xFE, 0xFE, 0x3F, 0xBF, 0xF9, 0xD8, 0x6C, 0x37, 65 | 0x39, 0xFC, 0x76, 0x03, 0x01, 0x8F, 0xC7, 0xC0, 0xE0, 0x70, 0x18, 0x0D, 66 | 0xC7, 0xF3, 0x99, 0x8C, 0xC6, 0x63, 0x7B, 0xFD, 0xE0, 0x18, 0x18, 0x00, 67 | 0x78, 0x78, 0x18, 0x18, 0x18, 0x18, 0xFF, 0xFF, 0x18, 0x60, 0x3F, 0xFC, 68 | 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0F, 0xFF, 0x80, 0xE0, 0x70, 0x18, 0x0D, 69 | 0xE6, 0xF3, 0xE1, 0xE0, 0xF8, 0x6E, 0x73, 0xF9, 0xE0, 0x78, 0x78, 0x18, 70 | 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0xFF, 0xFD, 0x9F, 0xF9, 0x9B, 71 | 0x33, 0x66, 0x6C, 0xCD, 0xBD, 0xFF, 0xBF, 0xEE, 0x7F, 0x98, 0xCC, 0x66, 72 | 0x33, 0x1B, 0xDF, 0xEF, 0x3E, 0x3F, 0xB8, 0xF8, 0x3C, 0x1F, 0x1D, 0xFC, 73 | 0x7C, 0xEF, 0x1F, 0xF9, 0xC3, 0xB0, 0x36, 0x06, 0xE1, 0xDF, 0xF3, 0x78, 74 | 0x60, 0x0C, 0x03, 0xE0, 0x7C, 0x00, 0x1E, 0xEF, 0xFF, 0x87, 0x60, 0x6C, 75 | 0x0D, 0xC3, 0x9F, 0xF0, 0xF6, 0x00, 0xC0, 0x18, 0x0F, 0x81, 0xF0, 0x77, 76 | 0xBF, 0xCF, 0x06, 0x03, 0x01, 0x83, 0xF9, 0xFC, 0x3F, 0xFF, 0xC3, 0xFC, 77 | 0x3F, 0xC3, 0xFF, 0xFC, 0x60, 0x60, 0x60, 0xFE, 0xFE, 0x60, 0x60, 0x60, 78 | 0x61, 0x7F, 0x3E, 0xE7, 0x73, 0x98, 0xCC, 0x66, 0x33, 0x19, 0xFE, 0x7F, 79 | 0xFB, 0xFF, 0x7C, 0xC6, 0x18, 0xC1, 0xB0, 0x36, 0x03, 0x80, 0x70, 0xF1, 80 | 0xFE, 0x3D, 0xBB, 0x37, 0x63, 0xF8, 0x77, 0x0E, 0xE1, 0x8C, 0xF7, 0xFB, 81 | 0xCD, 0x83, 0x83, 0xC3, 0xBB, 0xDF, 0xEF, 0xF3, 0xFC, 0xF6, 0x18, 0xCC, 82 | 0x33, 0x07, 0x81, 0xE0, 0x30, 0x0C, 0x06, 0x0F, 0xC3, 0xF0, 0xFF, 0xFF, 83 | 0x30, 0xC3, 0x0C, 0x7F, 0xFF, 0x37, 0x66, 0x66, 0xCC, 0x66, 0x66, 0x73, 84 | 0xFF, 0xFF, 0xFF, 0xF0, 0xCE, 0x66, 0x66, 0x33, 0x66, 0x66, 0xEC, 0x70, 85 | 0x7C, 0xF3, 0xC0, 0xC0}; 86 | 87 | const GFXglyph FreeMonoBold9pt7bGlyphs[] PROGMEM = { 88 | {0, 0, 0, 11, 0, 1}, // 0x20 ' ' 89 | {0, 3, 11, 11, 4, -10}, // 0x21 '!' 90 | {5, 7, 5, 11, 2, -10}, // 0x22 '"' 91 | {10, 8, 12, 11, 1, -10}, // 0x23 '#' 92 | {22, 7, 14, 11, 2, -11}, // 0x24 '$' 93 | {35, 7, 11, 11, 2, -10}, // 0x25 '%' 94 | {45, 8, 10, 11, 1, -9}, // 0x26 '&' 95 | {55, 3, 5, 11, 4, -10}, // 0x27 ''' 96 | {57, 4, 14, 11, 5, -10}, // 0x28 '(' 97 | {64, 4, 14, 11, 2, -10}, // 0x29 ')' 98 | {71, 8, 7, 11, 2, -10}, // 0x2A '*' 99 | {78, 8, 9, 11, 2, -8}, // 0x2B '+' 100 | {87, 3, 5, 11, 3, -1}, // 0x2C ',' 101 | {89, 9, 2, 11, 1, -5}, // 0x2D '-' 102 | {92, 2, 2, 11, 4, -1}, // 0x2E '.' 103 | {93, 7, 15, 11, 2, -12}, // 0x2F '/' 104 | {107, 7, 12, 11, 2, -11}, // 0x30 '0' 105 | {118, 7, 11, 11, 2, -10}, // 0x31 '1' 106 | {128, 8, 12, 11, 1, -11}, // 0x32 '2' 107 | {140, 8, 12, 11, 2, -11}, // 0x33 '3' 108 | {152, 7, 10, 11, 2, -9}, // 0x34 '4' 109 | {161, 9, 11, 11, 1, -10}, // 0x35 '5' 110 | {174, 8, 12, 11, 2, -11}, // 0x36 '6' 111 | {186, 8, 11, 11, 1, -10}, // 0x37 '7' 112 | {197, 7, 12, 11, 2, -11}, // 0x38 '8' 113 | {208, 8, 12, 11, 2, -11}, // 0x39 '9' 114 | {220, 2, 8, 11, 4, -7}, // 0x3A ':' 115 | {222, 3, 11, 11, 3, -7}, // 0x3B ';' 116 | {227, 9, 8, 11, 1, -8}, // 0x3C '<' 117 | {236, 9, 6, 11, 1, -7}, // 0x3D '=' 118 | {243, 9, 8, 11, 1, -8}, // 0x3E '>' 119 | {252, 8, 11, 11, 2, -10}, // 0x3F '?' 120 | {263, 9, 15, 11, 1, -11}, // 0x40 '@' 121 | {280, 11, 11, 11, 0, -10}, // 0x41 'A' 122 | {296, 10, 11, 11, 1, -10}, // 0x42 'B' 123 | {310, 9, 11, 11, 1, -10}, // 0x43 'C' 124 | {323, 10, 11, 11, 0, -10}, // 0x44 'D' 125 | {337, 9, 11, 11, 1, -10}, // 0x45 'E' 126 | {350, 9, 11, 11, 1, -10}, // 0x46 'F' 127 | {363, 10, 11, 11, 1, -10}, // 0x47 'G' 128 | {377, 9, 11, 11, 1, -10}, // 0x48 'H' 129 | {390, 6, 11, 11, 3, -10}, // 0x49 'I' 130 | {399, 10, 11, 11, 1, -10}, // 0x4A 'J' 131 | {413, 10, 11, 11, 1, -10}, // 0x4B 'K' 132 | {427, 9, 11, 11, 1, -10}, // 0x4C 'L' 133 | {440, 11, 11, 11, 0, -10}, // 0x4D 'M' 134 | {456, 11, 11, 11, 0, -10}, // 0x4E 'N' 135 | {472, 11, 11, 11, 0, -10}, // 0x4F 'O' 136 | {488, 9, 11, 11, 1, -10}, // 0x50 'P' 137 | {501, 11, 14, 11, 0, -10}, // 0x51 'Q' 138 | {521, 9, 11, 11, 1, -10}, // 0x52 'R' 139 | {534, 9, 11, 11, 1, -10}, // 0x53 'S' 140 | {547, 9, 11, 11, 1, -10}, // 0x54 'T' 141 | {560, 11, 11, 11, 0, -10}, // 0x55 'U' 142 | {576, 11, 11, 11, 0, -10}, // 0x56 'V' 143 | {592, 10, 11, 11, 0, -10}, // 0x57 'W' 144 | {606, 10, 11, 11, 0, -10}, // 0x58 'X' 145 | {620, 10, 11, 11, 0, -10}, // 0x59 'Y' 146 | {634, 8, 11, 11, 2, -10}, // 0x5A 'Z' 147 | {645, 4, 14, 11, 5, -10}, // 0x5B '[' 148 | {652, 7, 15, 11, 2, -12}, // 0x5C '\' 149 | {666, 4, 14, 11, 2, -10}, // 0x5D ']' 150 | {673, 7, 6, 11, 2, -11}, // 0x5E '^' 151 | {679, 11, 2, 11, 0, 3}, // 0x5F '_' 152 | {682, 3, 3, 11, 3, -11}, // 0x60 '`' 153 | {684, 9, 8, 11, 1, -7}, // 0x61 'a' 154 | {693, 10, 11, 11, 0, -10}, // 0x62 'b' 155 | {707, 9, 8, 11, 1, -7}, // 0x63 'c' 156 | {716, 10, 11, 11, 1, -10}, // 0x64 'd' 157 | {730, 9, 8, 11, 1, -7}, // 0x65 'e' 158 | {739, 8, 11, 11, 2, -10}, // 0x66 'f' 159 | {750, 9, 12, 11, 1, -7}, // 0x67 'g' 160 | {764, 9, 11, 11, 1, -10}, // 0x68 'h' 161 | {777, 8, 11, 11, 2, -10}, // 0x69 'i' 162 | {788, 6, 15, 11, 2, -10}, // 0x6A 'j' 163 | {800, 9, 11, 11, 1, -10}, // 0x6B 'k' 164 | {813, 8, 11, 11, 2, -10}, // 0x6C 'l' 165 | {824, 11, 8, 11, 0, -7}, // 0x6D 'm' 166 | {835, 9, 8, 11, 1, -7}, // 0x6E 'n' 167 | {844, 9, 8, 11, 1, -7}, // 0x6F 'o' 168 | {853, 11, 12, 11, 0, -7}, // 0x70 'p' 169 | {870, 11, 12, 11, 0, -7}, // 0x71 'q' 170 | {887, 9, 8, 11, 1, -7}, // 0x72 'r' 171 | {896, 8, 8, 11, 2, -7}, // 0x73 's' 172 | {904, 8, 11, 11, 1, -10}, // 0x74 't' 173 | {915, 9, 8, 11, 1, -7}, // 0x75 'u' 174 | {924, 11, 8, 11, 0, -7}, // 0x76 'v' 175 | {935, 11, 8, 11, 0, -7}, // 0x77 'w' 176 | {946, 9, 8, 11, 1, -7}, // 0x78 'x' 177 | {955, 10, 12, 11, 0, -7}, // 0x79 'y' 178 | {970, 7, 8, 11, 2, -7}, // 0x7A 'z' 179 | {977, 4, 14, 11, 3, -10}, // 0x7B '{' 180 | {984, 2, 14, 11, 5, -10}, // 0x7C '|' 181 | {988, 4, 14, 11, 4, -10}, // 0x7D '}' 182 | {995, 9, 4, 11, 1, -6}}; // 0x7E '~' 183 | 184 | const GFXfont FreeMonoBold9pt7b PROGMEM = {(uint8_t *)FreeMonoBold9pt7bBitmaps, 185 | (GFXglyph *)FreeMonoBold9pt7bGlyphs, 186 | 0x20, 0x7E, 18}; 187 | 188 | // Approx. 1672 bytes 189 | -------------------------------------------------------------------------------- /app/src/lib/Adafruit-GFX-Library/Fonts/FreeSerif9pt7b.h: -------------------------------------------------------------------------------- 1 | const uint8_t FreeSerif9pt7bBitmaps[] PROGMEM = { 2 | 0xFF, 0xEA, 0x03, 0xDE, 0xF7, 0x20, 0x11, 0x09, 0x04, 0x82, 0x4F, 0xF9, 3 | 0x10, 0x89, 0xFF, 0x24, 0x12, 0x09, 0x0C, 0x80, 0x10, 0x7C, 0xD6, 0xD2, 4 | 0xD0, 0xF0, 0x38, 0x1E, 0x17, 0x93, 0x93, 0xD6, 0x7C, 0x10, 0x38, 0x43, 5 | 0x3C, 0x39, 0x21, 0x8A, 0x0C, 0x50, 0x65, 0x39, 0xCB, 0x20, 0xB9, 0x05, 6 | 0x88, 0x4C, 0x44, 0x64, 0x21, 0xC0, 0x0E, 0x00, 0xC8, 0x06, 0x40, 0x32, 7 | 0x01, 0xA0, 0x07, 0x78, 0x31, 0x87, 0x88, 0x46, 0x86, 0x34, 0x30, 0xC1, 8 | 0xC7, 0x17, 0xCF, 0x00, 0xFE, 0x08, 0x88, 0x84, 0x63, 0x18, 0xC6, 0x10, 9 | 0x82, 0x08, 0x20, 0x82, 0x08, 0x21, 0x0C, 0x63, 0x18, 0xC4, 0x22, 0x22, 10 | 0x00, 0x63, 0x9A, 0xDC, 0x72, 0xB6, 0x08, 0x08, 0x04, 0x02, 0x01, 0x0F, 11 | 0xF8, 0x40, 0x20, 0x10, 0x08, 0x00, 0xD8, 0xF0, 0xF0, 0x08, 0x84, 0x22, 12 | 0x10, 0x8C, 0x42, 0x31, 0x00, 0x1C, 0x31, 0x98, 0xD8, 0x3C, 0x1E, 0x0F, 13 | 0x07, 0x83, 0xC1, 0xE0, 0xD8, 0xC4, 0x61, 0xC0, 0x13, 0x8C, 0x63, 0x18, 14 | 0xC6, 0x31, 0x8C, 0x67, 0x80, 0x3C, 0x4E, 0x86, 0x06, 0x06, 0x04, 0x0C, 15 | 0x08, 0x10, 0x20, 0x41, 0xFE, 0x3C, 0xC6, 0x06, 0x04, 0x1C, 0x3E, 0x07, 16 | 0x03, 0x03, 0x03, 0x06, 0xF8, 0x04, 0x18, 0x71, 0x64, 0xC9, 0xA3, 0x46, 17 | 0xFE, 0x18, 0x30, 0x60, 0x0F, 0x10, 0x20, 0x3C, 0x0E, 0x07, 0x03, 0x03, 18 | 0x03, 0x02, 0x04, 0xF8, 0x07, 0x1C, 0x30, 0x60, 0x60, 0xDC, 0xE6, 0xC3, 19 | 0xC3, 0xC3, 0x43, 0x66, 0x3C, 0x7F, 0x82, 0x02, 0x02, 0x04, 0x04, 0x04, 20 | 0x08, 0x08, 0x08, 0x10, 0x10, 0x3C, 0x8F, 0x1E, 0x3E, 0x4F, 0x06, 0x36, 21 | 0xC7, 0x8F, 0x1B, 0x33, 0xC0, 0x3C, 0x66, 0xC2, 0xC3, 0xC3, 0xC3, 0xC3, 22 | 0x63, 0x3F, 0x06, 0x06, 0x0C, 0x38, 0x60, 0xF0, 0x0F, 0xD8, 0x00, 0x03, 23 | 0x28, 0x01, 0x87, 0x0E, 0x1C, 0x0C, 0x03, 0x80, 0x70, 0x0E, 0x00, 0x80, 24 | 0xFF, 0x80, 0x00, 0x00, 0x0F, 0xF8, 0x80, 0x1C, 0x01, 0xC0, 0x1C, 0x01, 25 | 0xC0, 0xE0, 0xE0, 0xE0, 0xC0, 0x00, 0x79, 0x1A, 0x18, 0x30, 0x60, 0x83, 26 | 0x04, 0x10, 0x20, 0x40, 0x03, 0x00, 0x0F, 0x83, 0x8C, 0x60, 0x26, 0x02, 27 | 0xC7, 0x9C, 0xC9, 0xD8, 0x9D, 0x99, 0xD9, 0x26, 0xEC, 0x60, 0x03, 0x04, 28 | 0x0F, 0x80, 0x02, 0x00, 0x10, 0x01, 0xC0, 0x16, 0x00, 0x98, 0x04, 0xC0, 29 | 0x43, 0x03, 0xF8, 0x20, 0x61, 0x03, 0x18, 0x1D, 0xE1, 0xF0, 0xFF, 0x86, 30 | 0x1C, 0xC1, 0x98, 0x33, 0x0C, 0x7E, 0x0C, 0x31, 0x83, 0x30, 0x66, 0x0C, 31 | 0xC3, 0x7F, 0xC0, 0x1F, 0x26, 0x1D, 0x81, 0xE0, 0x1C, 0x01, 0x80, 0x30, 32 | 0x06, 0x00, 0xC0, 0x0C, 0x00, 0xC1, 0x8F, 0xC0, 0xFF, 0x03, 0x1C, 0x30, 33 | 0x63, 0x07, 0x30, 0x33, 0x03, 0x30, 0x33, 0x03, 0x30, 0x33, 0x06, 0x30, 34 | 0xCF, 0xF0, 0xFF, 0x98, 0x26, 0x01, 0x80, 0x61, 0x1F, 0xC6, 0x11, 0x80, 35 | 0x60, 0x18, 0x16, 0x0F, 0xFE, 0xFF, 0xB0, 0x58, 0x0C, 0x06, 0x13, 0xF9, 36 | 0x84, 0xC0, 0x60, 0x30, 0x18, 0x1E, 0x00, 0x1F, 0x23, 0x0E, 0x60, 0x26, 37 | 0x00, 0xC0, 0x0C, 0x0F, 0xC0, 0x6C, 0x06, 0xC0, 0x66, 0x06, 0x30, 0x60, 38 | 0xF8, 0xF1, 0xEC, 0x19, 0x83, 0x30, 0x66, 0x0C, 0xFF, 0x98, 0x33, 0x06, 39 | 0x60, 0xCC, 0x19, 0x83, 0x78, 0xF0, 0xF6, 0x66, 0x66, 0x66, 0x66, 0x6F, 40 | 0x3C, 0x61, 0x86, 0x18, 0x61, 0x86, 0x18, 0x6D, 0xBC, 0xF3, 0xE6, 0x08, 41 | 0x61, 0x06, 0x20, 0x64, 0x07, 0x80, 0x6C, 0x06, 0x60, 0x63, 0x06, 0x18, 42 | 0x60, 0xCF, 0x3F, 0xF0, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 43 | 0x80, 0x60, 0x18, 0x16, 0x0B, 0xFE, 0xF0, 0x0E, 0x70, 0x38, 0xE0, 0x71, 44 | 0xE1, 0x62, 0xC2, 0xC5, 0xC9, 0x89, 0x93, 0x13, 0x26, 0x23, 0x8C, 0x47, 45 | 0x18, 0x84, 0x33, 0x88, 0xF0, 0xE0, 0xEE, 0x09, 0xC1, 0x2C, 0x25, 0xC4, 46 | 0x9C, 0x91, 0x92, 0x1A, 0x41, 0xC8, 0x19, 0x03, 0x70, 0x20, 0x1F, 0x06, 47 | 0x31, 0x83, 0x20, 0x2C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x68, 0x09, 48 | 0x83, 0x18, 0xC1, 0xF0, 0xFE, 0x31, 0x98, 0x6C, 0x36, 0x1B, 0x19, 0xF8, 49 | 0xC0, 0x60, 0x30, 0x18, 0x1E, 0x00, 0x1F, 0x06, 0x31, 0x83, 0x20, 0x2C, 50 | 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x68, 0x19, 0x83, 0x18, 0xC0, 0xE0, 51 | 0x0E, 0x00, 0xE0, 0x07, 0xFE, 0x0C, 0x61, 0x86, 0x30, 0xC6, 0x18, 0xC6, 52 | 0x1F, 0x83, 0x70, 0x67, 0x0C, 0x71, 0x87, 0x78, 0x70, 0x1D, 0x31, 0x98, 53 | 0x4C, 0x07, 0x80, 0xE0, 0x1C, 0x07, 0x01, 0xA0, 0xD8, 0xCB, 0xC0, 0xFF, 54 | 0xF8, 0xCE, 0x18, 0x83, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 55 | 0xC0, 0x18, 0x07, 0x80, 0xF0, 0xEC, 0x09, 0x81, 0x30, 0x26, 0x04, 0xC0, 56 | 0x98, 0x13, 0x02, 0x60, 0x4C, 0x08, 0xC2, 0x0F, 0x80, 0xF8, 0x77, 0x02, 57 | 0x30, 0x23, 0x04, 0x18, 0x41, 0x84, 0x0C, 0x80, 0xC8, 0x07, 0x00, 0x70, 58 | 0x02, 0x00, 0x20, 0xFB, 0xE7, 0xB0, 0xC0, 0x8C, 0x20, 0x86, 0x18, 0x41, 59 | 0x8C, 0x40, 0xCB, 0x20, 0x65, 0x90, 0x1A, 0x70, 0x0E, 0x38, 0x03, 0x1C, 60 | 0x01, 0x04, 0x00, 0x82, 0x00, 0xFC, 0xF9, 0x83, 0x06, 0x10, 0x19, 0x00, 61 | 0xD0, 0x03, 0x00, 0x1C, 0x01, 0x30, 0x11, 0xC1, 0x86, 0x08, 0x19, 0xE3, 62 | 0xF0, 0xF8, 0xF6, 0x06, 0x30, 0x41, 0x88, 0x1D, 0x00, 0xD0, 0x06, 0x00, 63 | 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0xF0, 0x3F, 0xCC, 0x11, 0x06, 0x01, 64 | 0x80, 0x70, 0x0C, 0x03, 0x00, 0xE0, 0x38, 0x06, 0x05, 0xC1, 0x7F, 0xE0, 65 | 0xFB, 0x6D, 0xB6, 0xDB, 0x6D, 0xB8, 0x82, 0x10, 0x82, 0x10, 0x86, 0x10, 66 | 0x86, 0x10, 0xED, 0xB6, 0xDB, 0x6D, 0xB6, 0xF8, 0x18, 0x1C, 0x34, 0x26, 67 | 0x62, 0x42, 0xC1, 0xFF, 0x80, 0x84, 0x20, 0x79, 0x98, 0x30, 0xE6, 0xD9, 68 | 0xB3, 0x3F, 0x20, 0x70, 0x18, 0x0C, 0x06, 0x03, 0x71, 0xCC, 0xC3, 0x61, 69 | 0xB0, 0xD8, 0x6C, 0x63, 0xE0, 0x3C, 0xCF, 0x06, 0x0C, 0x18, 0x18, 0x9E, 70 | 0x01, 0x03, 0x80, 0xC0, 0x60, 0x31, 0xD9, 0x9D, 0x86, 0xC3, 0x61, 0xB0, 71 | 0xCC, 0x63, 0xF0, 0x3C, 0x46, 0xFE, 0xC0, 0xC0, 0xE1, 0x62, 0x3C, 0x1E, 72 | 0x41, 0x83, 0x06, 0x1E, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x0F, 0x00, 0x3C, 73 | 0x19, 0xF6, 0x31, 0x8C, 0x1E, 0x08, 0x04, 0x01, 0xFC, 0x40, 0xB0, 0x2E, 74 | 0x11, 0xF8, 0x20, 0x70, 0x18, 0x0C, 0x06, 0x03, 0x71, 0xCC, 0xC6, 0x63, 75 | 0x31, 0x98, 0xCC, 0x6F, 0x78, 0x60, 0x02, 0xE6, 0x66, 0x66, 0xF0, 0x18, 76 | 0x00, 0x33, 0x8C, 0x63, 0x18, 0xC6, 0x31, 0x8B, 0x80, 0x20, 0x70, 0x18, 77 | 0x0C, 0x06, 0x03, 0x3D, 0x88, 0xD8, 0x78, 0x36, 0x19, 0x8C, 0x6F, 0x78, 78 | 0x2E, 0x66, 0x66, 0x66, 0x66, 0x66, 0xF0, 0xEE, 0x71, 0xCE, 0x66, 0x31, 79 | 0x98, 0xC6, 0x63, 0x19, 0x8C, 0x66, 0x31, 0xBD, 0xEF, 0xEE, 0x39, 0x98, 80 | 0xCC, 0x66, 0x33, 0x19, 0x8D, 0xEF, 0x3E, 0x31, 0xB0, 0x78, 0x3C, 0x1E, 81 | 0x0D, 0x8C, 0x7C, 0xEE, 0x39, 0x98, 0x6C, 0x36, 0x1B, 0x0D, 0x8C, 0xFC, 82 | 0x60, 0x30, 0x18, 0x1E, 0x00, 0x3D, 0x31, 0xB0, 0xD8, 0x6C, 0x36, 0x1B, 83 | 0x8C, 0xFE, 0x03, 0x01, 0x80, 0xC0, 0xF0, 0x6D, 0xC6, 0x18, 0x61, 0x86, 84 | 0x3C, 0x76, 0x38, 0x58, 0x3E, 0x38, 0xFE, 0x27, 0x98, 0xC6, 0x31, 0x8C, 85 | 0x38, 0xE7, 0x31, 0x98, 0xCC, 0x66, 0x33, 0x19, 0x8C, 0x7F, 0xF3, 0x61, 86 | 0x22, 0x32, 0x14, 0x1C, 0x08, 0x08, 0xEF, 0x36, 0x61, 0x62, 0x22, 0x32, 87 | 0x35, 0x41, 0x9C, 0x18, 0x81, 0x08, 0xF7, 0x12, 0x0E, 0x03, 0x01, 0xC1, 88 | 0x21, 0x09, 0xCF, 0xF3, 0x61, 0x62, 0x32, 0x34, 0x14, 0x1C, 0x08, 0x08, 89 | 0x08, 0x10, 0xE0, 0xFD, 0x18, 0x60, 0x83, 0x0C, 0x70, 0xFE, 0x19, 0x8C, 90 | 0x63, 0x18, 0xC4, 0x61, 0x8C, 0x63, 0x18, 0xC3, 0xFF, 0xF0, 0xC3, 0x18, 91 | 0xC6, 0x31, 0x84, 0x33, 0x18, 0xC6, 0x31, 0x98, 0x70, 0x24, 0xC1, 0xC0}; 92 | 93 | const GFXglyph FreeSerif9pt7bGlyphs[] PROGMEM = { 94 | {0, 0, 0, 5, 0, 1}, // 0x20 ' ' 95 | {0, 2, 12, 6, 2, -11}, // 0x21 '!' 96 | {3, 5, 4, 7, 1, -11}, // 0x22 '"' 97 | {6, 9, 12, 9, 0, -11}, // 0x23 '#' 98 | {20, 8, 14, 9, 1, -12}, // 0x24 '$' 99 | {34, 13, 12, 15, 1, -11}, // 0x25 '%' 100 | {54, 13, 13, 14, 1, -12}, // 0x26 '&' 101 | {76, 2, 4, 4, 1, -11}, // 0x27 ''' 102 | {77, 5, 15, 6, 1, -11}, // 0x28 '(' 103 | {87, 5, 15, 6, 0, -11}, // 0x29 ')' 104 | {97, 6, 8, 9, 3, -11}, // 0x2A '*' 105 | {103, 9, 9, 10, 0, -8}, // 0x2B '+' 106 | {114, 2, 3, 4, 2, 0}, // 0x2C ',' 107 | {115, 4, 1, 6, 1, -3}, // 0x2D '-' 108 | {116, 2, 2, 5, 1, -1}, // 0x2E '.' 109 | {117, 5, 12, 5, 0, -11}, // 0x2F '/' 110 | {125, 9, 13, 9, 0, -12}, // 0x30 '0' 111 | {140, 5, 13, 9, 2, -12}, // 0x31 '1' 112 | {149, 8, 12, 9, 1, -11}, // 0x32 '2' 113 | {161, 8, 12, 9, 0, -11}, // 0x33 '3' 114 | {173, 7, 12, 9, 1, -11}, // 0x34 '4' 115 | {184, 8, 12, 9, 0, -11}, // 0x35 '5' 116 | {196, 8, 13, 9, 1, -12}, // 0x36 '6' 117 | {209, 8, 12, 9, 0, -11}, // 0x37 '7' 118 | {221, 7, 13, 9, 1, -12}, // 0x38 '8' 119 | {233, 8, 14, 9, 1, -12}, // 0x39 '9' 120 | {247, 2, 8, 5, 1, -7}, // 0x3A ':' 121 | {249, 3, 10, 5, 1, -7}, // 0x3B ';' 122 | {253, 9, 9, 10, 1, -8}, // 0x3C '<' 123 | {264, 9, 5, 10, 1, -6}, // 0x3D '=' 124 | {270, 10, 9, 10, 0, -8}, // 0x3E '>' 125 | {282, 7, 13, 8, 1, -12}, // 0x3F '?' 126 | {294, 12, 13, 16, 2, -12}, // 0x40 '@' 127 | {314, 13, 12, 13, 0, -11}, // 0x41 'A' 128 | {334, 11, 12, 11, 0, -11}, // 0x42 'B' 129 | {351, 11, 12, 12, 1, -11}, // 0x43 'C' 130 | {368, 12, 12, 13, 0, -11}, // 0x44 'D' 131 | {386, 10, 12, 11, 1, -11}, // 0x45 'E' 132 | {401, 9, 12, 10, 1, -11}, // 0x46 'F' 133 | {415, 12, 12, 13, 1, -11}, // 0x47 'G' 134 | {433, 11, 12, 13, 1, -11}, // 0x48 'H' 135 | {450, 4, 12, 6, 1, -11}, // 0x49 'I' 136 | {456, 6, 12, 7, 0, -11}, // 0x4A 'J' 137 | {465, 12, 12, 13, 1, -11}, // 0x4B 'K' 138 | {483, 10, 12, 11, 1, -11}, // 0x4C 'L' 139 | {498, 15, 12, 16, 0, -11}, // 0x4D 'M' 140 | {521, 11, 12, 13, 1, -11}, // 0x4E 'N' 141 | {538, 11, 13, 13, 1, -12}, // 0x4F 'O' 142 | {556, 9, 12, 10, 1, -11}, // 0x50 'P' 143 | {570, 11, 16, 13, 1, -12}, // 0x51 'Q' 144 | {592, 11, 12, 12, 1, -11}, // 0x52 'R' 145 | {609, 9, 12, 10, 0, -11}, // 0x53 'S' 146 | {623, 11, 12, 11, 0, -11}, // 0x54 'T' 147 | {640, 11, 12, 13, 1, -11}, // 0x55 'U' 148 | {657, 12, 12, 13, 0, -11}, // 0x56 'V' 149 | {675, 17, 12, 17, 0, -11}, // 0x57 'W' 150 | {701, 13, 12, 13, 0, -11}, // 0x58 'X' 151 | {721, 12, 12, 13, 0, -11}, // 0x59 'Y' 152 | {739, 11, 12, 11, 0, -11}, // 0x5A 'Z' 153 | {756, 3, 15, 6, 2, -11}, // 0x5B '[' 154 | {762, 5, 12, 5, 0, -11}, // 0x5C '\' 155 | {770, 3, 15, 6, 1, -11}, // 0x5D ']' 156 | {776, 8, 7, 8, 0, -11}, // 0x5E '^' 157 | {783, 9, 1, 9, 0, 2}, // 0x5F '_' 158 | {785, 4, 3, 5, 0, -11}, // 0x60 '`' 159 | {787, 7, 8, 8, 1, -7}, // 0x61 'a' 160 | {794, 9, 13, 9, 0, -12}, // 0x62 'b' 161 | {809, 7, 8, 8, 0, -7}, // 0x63 'c' 162 | {816, 9, 13, 9, 0, -12}, // 0x64 'd' 163 | {831, 8, 8, 8, 0, -7}, // 0x65 'e' 164 | {839, 7, 13, 7, 1, -12}, // 0x66 'f' 165 | {851, 10, 12, 8, 0, -7}, // 0x67 'g' 166 | {866, 9, 13, 9, 0, -12}, // 0x68 'h' 167 | {881, 4, 11, 5, 1, -10}, // 0x69 'i' 168 | {887, 5, 15, 6, 0, -10}, // 0x6A 'j' 169 | {897, 9, 13, 9, 1, -12}, // 0x6B 'k' 170 | {912, 4, 13, 5, 1, -12}, // 0x6C 'l' 171 | {919, 14, 8, 14, 0, -7}, // 0x6D 'm' 172 | {933, 9, 8, 9, 0, -7}, // 0x6E 'n' 173 | {942, 9, 8, 9, 0, -7}, // 0x6F 'o' 174 | {951, 9, 12, 9, 0, -7}, // 0x70 'p' 175 | {965, 9, 12, 9, 0, -7}, // 0x71 'q' 176 | {979, 6, 8, 6, 0, -7}, // 0x72 'r' 177 | {985, 6, 8, 7, 1, -7}, // 0x73 's' 178 | {991, 5, 9, 5, 0, -8}, // 0x74 't' 179 | {997, 9, 8, 9, 0, -7}, // 0x75 'u' 180 | {1006, 8, 8, 8, 0, -7}, // 0x76 'v' 181 | {1014, 12, 8, 12, 0, -7}, // 0x77 'w' 182 | {1026, 9, 8, 9, 0, -7}, // 0x78 'x' 183 | {1035, 8, 12, 8, 0, -7}, // 0x79 'y' 184 | {1047, 7, 8, 7, 1, -7}, // 0x7A 'z' 185 | {1054, 5, 16, 9, 1, -12}, // 0x7B '{' 186 | {1064, 1, 12, 4, 1, -11}, // 0x7C '|' 187 | {1066, 5, 16, 9, 3, -11}, // 0x7D '}' 188 | {1076, 9, 3, 9, 0, -5}}; // 0x7E '~' 189 | 190 | const GFXfont FreeSerif9pt7b PROGMEM = {(uint8_t *)FreeSerif9pt7bBitmaps, 191 | (GFXglyph *)FreeSerif9pt7bGlyphs, 0x20, 192 | 0x7E, 22}; 193 | 194 | // Approx. 1752 bytes 195 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /app/src/lib/Adafruit-GFX-Library/Fonts/FreeSans9pt7b.h: -------------------------------------------------------------------------------- 1 | const uint8_t FreeSans9pt7bBitmaps[] PROGMEM = { 2 | 0xFF, 0xFF, 0xF8, 0xC0, 0xDE, 0xF7, 0x20, 0x09, 0x86, 0x41, 0x91, 0xFF, 3 | 0x13, 0x04, 0xC3, 0x20, 0xC8, 0xFF, 0x89, 0x82, 0x61, 0x90, 0x10, 0x1F, 4 | 0x14, 0xDA, 0x3D, 0x1E, 0x83, 0x40, 0x78, 0x17, 0x08, 0xF4, 0x7A, 0x35, 5 | 0x33, 0xF0, 0x40, 0x20, 0x38, 0x10, 0xEC, 0x20, 0xC6, 0x20, 0xC6, 0x40, 6 | 0xC6, 0x40, 0x6C, 0x80, 0x39, 0x00, 0x01, 0x3C, 0x02, 0x77, 0x02, 0x63, 7 | 0x04, 0x63, 0x04, 0x77, 0x08, 0x3C, 0x0E, 0x06, 0x60, 0xCC, 0x19, 0x81, 8 | 0xE0, 0x18, 0x0F, 0x03, 0x36, 0xC2, 0xD8, 0x73, 0x06, 0x31, 0xE3, 0xC4, 9 | 0xFE, 0x13, 0x26, 0x6C, 0xCC, 0xCC, 0xC4, 0x66, 0x23, 0x10, 0x8C, 0x46, 10 | 0x63, 0x33, 0x33, 0x32, 0x66, 0x4C, 0x80, 0x25, 0x7E, 0xA5, 0x00, 0x30, 11 | 0xC3, 0x3F, 0x30, 0xC3, 0x0C, 0xD6, 0xF0, 0xC0, 0x08, 0x44, 0x21, 0x10, 12 | 0x84, 0x42, 0x11, 0x08, 0x00, 0x3C, 0x66, 0x42, 0xC3, 0xC3, 0xC3, 0xC3, 13 | 0xC3, 0xC3, 0xC3, 0x42, 0x66, 0x3C, 0x11, 0x3F, 0x33, 0x33, 0x33, 0x33, 14 | 0x30, 0x3E, 0x31, 0xB0, 0x78, 0x30, 0x18, 0x1C, 0x1C, 0x1C, 0x18, 0x18, 15 | 0x10, 0x08, 0x07, 0xF8, 0x3C, 0x66, 0xC3, 0xC3, 0x03, 0x06, 0x1C, 0x07, 16 | 0x03, 0xC3, 0xC3, 0x66, 0x3C, 0x0C, 0x18, 0x71, 0x62, 0xC9, 0xA3, 0x46, 17 | 0xFE, 0x18, 0x30, 0x60, 0xC0, 0x7F, 0x20, 0x10, 0x08, 0x08, 0x07, 0xF3, 18 | 0x8C, 0x03, 0x01, 0x80, 0xF0, 0x6C, 0x63, 0xE0, 0x1E, 0x31, 0x98, 0x78, 19 | 0x0C, 0x06, 0xF3, 0x8D, 0x83, 0xC1, 0xE0, 0xD0, 0x6C, 0x63, 0xE0, 0xFF, 20 | 0x03, 0x02, 0x06, 0x04, 0x0C, 0x08, 0x18, 0x18, 0x18, 0x10, 0x30, 0x30, 21 | 0x3E, 0x31, 0xB0, 0x78, 0x3C, 0x1B, 0x18, 0xF8, 0xC6, 0xC1, 0xE0, 0xF0, 22 | 0x6C, 0x63, 0xE0, 0x3C, 0x66, 0xC2, 0xC3, 0xC3, 0xC3, 0x67, 0x3B, 0x03, 23 | 0x03, 0xC2, 0x66, 0x3C, 0xC0, 0x00, 0x30, 0xC0, 0x00, 0x00, 0x64, 0xA0, 24 | 0x00, 0x81, 0xC7, 0x8E, 0x0C, 0x07, 0x80, 0x70, 0x0E, 0x01, 0x80, 0xFF, 25 | 0x80, 0x00, 0x1F, 0xF0, 0x00, 0x70, 0x0E, 0x01, 0xC0, 0x18, 0x38, 0x71, 26 | 0xC0, 0x80, 0x00, 0x3E, 0x31, 0xB0, 0x78, 0x30, 0x18, 0x18, 0x38, 0x18, 27 | 0x18, 0x0C, 0x00, 0x00, 0x01, 0x80, 0x03, 0xF0, 0x06, 0x0E, 0x06, 0x01, 28 | 0x86, 0x00, 0x66, 0x1D, 0xBB, 0x31, 0xCF, 0x18, 0xC7, 0x98, 0x63, 0xCC, 29 | 0x31, 0xE6, 0x11, 0xB3, 0x99, 0xCC, 0xF7, 0x86, 0x00, 0x01, 0x80, 0x00, 30 | 0x70, 0x40, 0x0F, 0xE0, 0x06, 0x00, 0xF0, 0x0F, 0x00, 0x90, 0x19, 0x81, 31 | 0x98, 0x10, 0x83, 0x0C, 0x3F, 0xC2, 0x04, 0x60, 0x66, 0x06, 0xC0, 0x30, 32 | 0xFF, 0x18, 0x33, 0x03, 0x60, 0x6C, 0x0D, 0x83, 0x3F, 0xC6, 0x06, 0xC0, 33 | 0x78, 0x0F, 0x01, 0xE0, 0x6F, 0xF8, 0x1F, 0x86, 0x19, 0x81, 0xA0, 0x3C, 34 | 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x68, 0x0D, 0x83, 0x18, 0x61, 0xF0, 35 | 0xFF, 0x18, 0x33, 0x03, 0x60, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 36 | 0x78, 0x0F, 0x03, 0x60, 0xCF, 0xF0, 0xFF, 0xE0, 0x30, 0x18, 0x0C, 0x06, 37 | 0x03, 0xFD, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0F, 0xF8, 0xFF, 0xC0, 0xC0, 38 | 0xC0, 0xC0, 0xC0, 0xFE, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x0F, 0x83, 39 | 0x0E, 0x60, 0x66, 0x03, 0xC0, 0x0C, 0x00, 0xC1, 0xFC, 0x03, 0xC0, 0x36, 40 | 0x03, 0x60, 0x73, 0x0F, 0x0F, 0x10, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 41 | 0x07, 0x80, 0xFF, 0xFE, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x06, 42 | 0xFF, 0xFF, 0xFF, 0xC0, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x07, 43 | 0x8F, 0x1E, 0x27, 0x80, 0xC0, 0xD8, 0x33, 0x0C, 0x63, 0x0C, 0xC1, 0xB8, 44 | 0x3F, 0x07, 0x30, 0xC3, 0x18, 0x63, 0x06, 0x60, 0x6C, 0x0C, 0xC0, 0xC0, 45 | 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xFF, 0xE0, 46 | 0x3F, 0x01, 0xFC, 0x1F, 0xE0, 0xFD, 0x05, 0xEC, 0x6F, 0x63, 0x79, 0x13, 47 | 0xCD, 0x9E, 0x6C, 0xF1, 0x47, 0x8E, 0x3C, 0x71, 0x80, 0xE0, 0x7C, 0x0F, 48 | 0xC1, 0xE8, 0x3D, 0x87, 0x98, 0xF1, 0x1E, 0x33, 0xC3, 0x78, 0x6F, 0x07, 49 | 0xE0, 0x7C, 0x0E, 0x0F, 0x81, 0x83, 0x18, 0x0C, 0xC0, 0x6C, 0x01, 0xE0, 50 | 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1B, 0x01, 0x98, 0x0C, 0x60, 0xC0, 0xF8, 51 | 0x00, 0xFF, 0x30, 0x6C, 0x0F, 0x03, 0xC0, 0xF0, 0x6F, 0xF3, 0x00, 0xC0, 52 | 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x00, 0x0F, 0x81, 0x83, 0x18, 0x0C, 0xC0, 53 | 0x6C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1B, 0x01, 0x98, 0x6C, 54 | 0x60, 0xC0, 0xFB, 0x00, 0x08, 0xFF, 0x8C, 0x0E, 0xC0, 0x6C, 0x06, 0xC0, 55 | 0x6C, 0x0C, 0xFF, 0x8C, 0x0E, 0xC0, 0x6C, 0x06, 0xC0, 0x6C, 0x06, 0xC0, 56 | 0x70, 0x3F, 0x18, 0x6C, 0x0F, 0x03, 0xC0, 0x1E, 0x01, 0xF0, 0x0E, 0x00, 57 | 0xF0, 0x3C, 0x0D, 0x86, 0x3F, 0x00, 0xFF, 0x86, 0x03, 0x01, 0x80, 0xC0, 58 | 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xC0, 0xC0, 0x78, 0x0F, 59 | 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, 60 | 0xB0, 0x61, 0xF0, 0xC0, 0x6C, 0x0D, 0x81, 0x10, 0x63, 0x0C, 0x61, 0x04, 61 | 0x60, 0xCC, 0x19, 0x01, 0x60, 0x3C, 0x07, 0x00, 0x60, 0xC1, 0x81, 0x30, 62 | 0xE1, 0x98, 0x70, 0xCC, 0x28, 0x66, 0x26, 0x21, 0x13, 0x30, 0xC8, 0x98, 63 | 0x6C, 0x4C, 0x14, 0x34, 0x0A, 0x1A, 0x07, 0x07, 0x03, 0x03, 0x80, 0x81, 64 | 0x80, 0x60, 0x63, 0x0C, 0x30, 0xC1, 0x98, 0x0F, 0x00, 0xE0, 0x06, 0x00, 65 | 0xF0, 0x19, 0x01, 0x98, 0x30, 0xC6, 0x0E, 0x60, 0x60, 0xC0, 0x36, 0x06, 66 | 0x30, 0xC3, 0x0C, 0x19, 0x81, 0xD8, 0x0F, 0x00, 0x60, 0x06, 0x00, 0x60, 67 | 0x06, 0x00, 0x60, 0x06, 0x00, 0xFF, 0xC0, 0x60, 0x30, 0x0C, 0x06, 0x03, 68 | 0x01, 0xC0, 0x60, 0x30, 0x18, 0x06, 0x03, 0x00, 0xFF, 0xC0, 0xFB, 0x6D, 69 | 0xB6, 0xDB, 0x6D, 0xB6, 0xE0, 0x84, 0x10, 0x84, 0x10, 0x84, 0x10, 0x84, 70 | 0x10, 0x80, 0xED, 0xB6, 0xDB, 0x6D, 0xB6, 0xDB, 0xE0, 0x30, 0x60, 0xA2, 71 | 0x44, 0xD8, 0xA1, 0x80, 0xFF, 0xC0, 0xC6, 0x30, 0x7E, 0x71, 0xB0, 0xC0, 72 | 0x60, 0xF3, 0xDB, 0x0D, 0x86, 0xC7, 0x3D, 0xC0, 0xC0, 0x60, 0x30, 0x1B, 73 | 0xCE, 0x36, 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x7C, 0x6D, 0xE0, 0x3C, 74 | 0x66, 0xC3, 0xC0, 0xC0, 0xC0, 0xC0, 0xC3, 0x66, 0x3C, 0x03, 0x03, 0x03, 75 | 0x3B, 0x67, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x67, 0x3B, 0x3C, 0x66, 76 | 0xC3, 0xC3, 0xFF, 0xC0, 0xC0, 0xC3, 0x66, 0x3C, 0x36, 0x6F, 0x66, 0x66, 77 | 0x66, 0x66, 0x60, 0x3B, 0x67, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x67, 78 | 0x3B, 0x03, 0x03, 0xC6, 0x7C, 0xC0, 0xC0, 0xC0, 0xDE, 0xE3, 0xC3, 0xC3, 79 | 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xFF, 0xFF, 0xC0, 0x30, 0x03, 80 | 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0xE0, 0xC0, 0x60, 0x30, 0x18, 0x4C, 81 | 0x46, 0x63, 0x61, 0xF0, 0xEC, 0x62, 0x31, 0x98, 0x6C, 0x30, 0xFF, 0xFF, 82 | 0xFF, 0xC0, 0xDE, 0xF7, 0x1C, 0xF0, 0xC7, 0x86, 0x3C, 0x31, 0xE1, 0x8F, 83 | 0x0C, 0x78, 0x63, 0xC3, 0x1E, 0x18, 0xC0, 0xDE, 0xE3, 0xC3, 0xC3, 0xC3, 84 | 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x3C, 0x66, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 85 | 0xC3, 0x66, 0x3C, 0xDE, 0x71, 0xB0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 86 | 0xE3, 0x6F, 0x30, 0x18, 0x0C, 0x00, 0x3B, 0x67, 0xC3, 0xC3, 0xC3, 0xC3, 87 | 0xC3, 0xC3, 0x67, 0x3B, 0x03, 0x03, 0x03, 0xDF, 0x31, 0x8C, 0x63, 0x18, 88 | 0xC6, 0x00, 0x3E, 0xE3, 0xC0, 0xC0, 0xE0, 0x3C, 0x07, 0xC3, 0xE3, 0x7E, 89 | 0x66, 0xF6, 0x66, 0x66, 0x66, 0x67, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 90 | 0xC3, 0xC3, 0xC7, 0x7B, 0xC1, 0xA0, 0x98, 0xCC, 0x42, 0x21, 0xB0, 0xD0, 91 | 0x28, 0x1C, 0x0C, 0x00, 0xC6, 0x1E, 0x38, 0x91, 0xC4, 0xCA, 0x66, 0xD3, 92 | 0x16, 0xD0, 0xA6, 0x87, 0x1C, 0x38, 0xC0, 0xC6, 0x00, 0x43, 0x62, 0x36, 93 | 0x1C, 0x18, 0x1C, 0x3C, 0x26, 0x62, 0x43, 0xC1, 0x21, 0x98, 0xCC, 0x42, 94 | 0x61, 0xB0, 0xD0, 0x38, 0x1C, 0x0C, 0x06, 0x03, 0x01, 0x03, 0x00, 0xFE, 95 | 0x0C, 0x30, 0xC1, 0x86, 0x18, 0x20, 0xC1, 0xFC, 0x36, 0x66, 0x66, 0x6E, 96 | 0xCE, 0x66, 0x66, 0x66, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xC6, 0x66, 97 | 0x66, 0x67, 0x37, 0x66, 0x66, 0x66, 0xC0, 0x61, 0x24, 0x38}; 98 | 99 | const GFXglyph FreeSans9pt7bGlyphs[] PROGMEM = { 100 | {0, 0, 0, 5, 0, 1}, // 0x20 ' ' 101 | {0, 2, 13, 6, 2, -12}, // 0x21 '!' 102 | {4, 5, 4, 6, 1, -12}, // 0x22 '"' 103 | {7, 10, 12, 10, 0, -11}, // 0x23 '#' 104 | {22, 9, 16, 10, 1, -13}, // 0x24 '$' 105 | {40, 16, 13, 16, 1, -12}, // 0x25 '%' 106 | {66, 11, 13, 12, 1, -12}, // 0x26 '&' 107 | {84, 2, 4, 4, 1, -12}, // 0x27 ''' 108 | {85, 4, 17, 6, 1, -12}, // 0x28 '(' 109 | {94, 4, 17, 6, 1, -12}, // 0x29 ')' 110 | {103, 5, 5, 7, 1, -12}, // 0x2A '*' 111 | {107, 6, 8, 11, 3, -7}, // 0x2B '+' 112 | {113, 2, 4, 5, 2, 0}, // 0x2C ',' 113 | {114, 4, 1, 6, 1, -4}, // 0x2D '-' 114 | {115, 2, 1, 5, 1, 0}, // 0x2E '.' 115 | {116, 5, 13, 5, 0, -12}, // 0x2F '/' 116 | {125, 8, 13, 10, 1, -12}, // 0x30 '0' 117 | {138, 4, 13, 10, 3, -12}, // 0x31 '1' 118 | {145, 9, 13, 10, 1, -12}, // 0x32 '2' 119 | {160, 8, 13, 10, 1, -12}, // 0x33 '3' 120 | {173, 7, 13, 10, 2, -12}, // 0x34 '4' 121 | {185, 9, 13, 10, 1, -12}, // 0x35 '5' 122 | {200, 9, 13, 10, 1, -12}, // 0x36 '6' 123 | {215, 8, 13, 10, 0, -12}, // 0x37 '7' 124 | {228, 9, 13, 10, 1, -12}, // 0x38 '8' 125 | {243, 8, 13, 10, 1, -12}, // 0x39 '9' 126 | {256, 2, 10, 5, 1, -9}, // 0x3A ':' 127 | {259, 3, 12, 5, 1, -8}, // 0x3B ';' 128 | {264, 9, 9, 11, 1, -8}, // 0x3C '<' 129 | {275, 9, 4, 11, 1, -5}, // 0x3D '=' 130 | {280, 9, 9, 11, 1, -8}, // 0x3E '>' 131 | {291, 9, 13, 10, 1, -12}, // 0x3F '?' 132 | {306, 17, 16, 18, 1, -12}, // 0x40 '@' 133 | {340, 12, 13, 12, 0, -12}, // 0x41 'A' 134 | {360, 11, 13, 12, 1, -12}, // 0x42 'B' 135 | {378, 11, 13, 13, 1, -12}, // 0x43 'C' 136 | {396, 11, 13, 13, 1, -12}, // 0x44 'D' 137 | {414, 9, 13, 11, 1, -12}, // 0x45 'E' 138 | {429, 8, 13, 11, 1, -12}, // 0x46 'F' 139 | {442, 12, 13, 14, 1, -12}, // 0x47 'G' 140 | {462, 11, 13, 13, 1, -12}, // 0x48 'H' 141 | {480, 2, 13, 5, 2, -12}, // 0x49 'I' 142 | {484, 7, 13, 10, 1, -12}, // 0x4A 'J' 143 | {496, 11, 13, 12, 1, -12}, // 0x4B 'K' 144 | {514, 8, 13, 10, 1, -12}, // 0x4C 'L' 145 | {527, 13, 13, 15, 1, -12}, // 0x4D 'M' 146 | {549, 11, 13, 13, 1, -12}, // 0x4E 'N' 147 | {567, 13, 13, 14, 1, -12}, // 0x4F 'O' 148 | {589, 10, 13, 12, 1, -12}, // 0x50 'P' 149 | {606, 13, 14, 14, 1, -12}, // 0x51 'Q' 150 | {629, 12, 13, 13, 1, -12}, // 0x52 'R' 151 | {649, 10, 13, 12, 1, -12}, // 0x53 'S' 152 | {666, 9, 13, 11, 1, -12}, // 0x54 'T' 153 | {681, 11, 13, 13, 1, -12}, // 0x55 'U' 154 | {699, 11, 13, 12, 0, -12}, // 0x56 'V' 155 | {717, 17, 13, 17, 0, -12}, // 0x57 'W' 156 | {745, 12, 13, 12, 0, -12}, // 0x58 'X' 157 | {765, 12, 13, 12, 0, -12}, // 0x59 'Y' 158 | {785, 10, 13, 11, 1, -12}, // 0x5A 'Z' 159 | {802, 3, 17, 5, 1, -12}, // 0x5B '[' 160 | {809, 5, 13, 5, 0, -12}, // 0x5C '\' 161 | {818, 3, 17, 5, 0, -12}, // 0x5D ']' 162 | {825, 7, 7, 8, 1, -12}, // 0x5E '^' 163 | {832, 10, 1, 10, 0, 3}, // 0x5F '_' 164 | {834, 4, 3, 5, 0, -12}, // 0x60 '`' 165 | {836, 9, 10, 10, 1, -9}, // 0x61 'a' 166 | {848, 9, 13, 10, 1, -12}, // 0x62 'b' 167 | {863, 8, 10, 9, 1, -9}, // 0x63 'c' 168 | {873, 8, 13, 10, 1, -12}, // 0x64 'd' 169 | {886, 8, 10, 10, 1, -9}, // 0x65 'e' 170 | {896, 4, 13, 5, 1, -12}, // 0x66 'f' 171 | {903, 8, 14, 10, 1, -9}, // 0x67 'g' 172 | {917, 8, 13, 10, 1, -12}, // 0x68 'h' 173 | {930, 2, 13, 4, 1, -12}, // 0x69 'i' 174 | {934, 4, 17, 4, 0, -12}, // 0x6A 'j' 175 | {943, 9, 13, 9, 1, -12}, // 0x6B 'k' 176 | {958, 2, 13, 4, 1, -12}, // 0x6C 'l' 177 | {962, 13, 10, 15, 1, -9}, // 0x6D 'm' 178 | {979, 8, 10, 10, 1, -9}, // 0x6E 'n' 179 | {989, 8, 10, 10, 1, -9}, // 0x6F 'o' 180 | {999, 9, 13, 10, 1, -9}, // 0x70 'p' 181 | {1014, 8, 13, 10, 1, -9}, // 0x71 'q' 182 | {1027, 5, 10, 6, 1, -9}, // 0x72 'r' 183 | {1034, 8, 10, 9, 1, -9}, // 0x73 's' 184 | {1044, 4, 12, 5, 1, -11}, // 0x74 't' 185 | {1050, 8, 10, 10, 1, -9}, // 0x75 'u' 186 | {1060, 9, 10, 9, 0, -9}, // 0x76 'v' 187 | {1072, 13, 10, 13, 0, -9}, // 0x77 'w' 188 | {1089, 8, 10, 9, 0, -9}, // 0x78 'x' 189 | {1099, 9, 14, 9, 0, -9}, // 0x79 'y' 190 | {1115, 7, 10, 9, 1, -9}, // 0x7A 'z' 191 | {1124, 4, 17, 6, 1, -12}, // 0x7B '{' 192 | {1133, 2, 17, 4, 2, -12}, // 0x7C '|' 193 | {1138, 4, 17, 6, 1, -12}, // 0x7D '}' 194 | {1147, 7, 3, 9, 1, -7}}; // 0x7E '~' 195 | 196 | const GFXfont FreeSans9pt7b PROGMEM = {(uint8_t *)FreeSans9pt7bBitmaps, 197 | (GFXglyph *)FreeSans9pt7bGlyphs, 0x20, 198 | 0x7E, 22}; 199 | 200 | // Approx. 1822 bytes 201 | -------------------------------------------------------------------------------- /app/src/lib/Adafruit-GFX-Library/Fonts/FreeSerifBold9pt7b.h: -------------------------------------------------------------------------------- 1 | const uint8_t FreeSerifBold9pt7bBitmaps[] PROGMEM = { 2 | 0xFF, 0xF4, 0x92, 0x1F, 0xF0, 0xCF, 0x3C, 0xE3, 0x88, 0x13, 0x09, 0x84, 3 | 0xC2, 0x47, 0xF9, 0x90, 0xC8, 0x4C, 0xFF, 0x13, 0x09, 0x0C, 0x86, 0x40, 4 | 0x10, 0x38, 0xD6, 0x92, 0xD2, 0xF0, 0x7C, 0x3E, 0x17, 0x93, 0x93, 0xD6, 5 | 0x7C, 0x10, 0x3C, 0x21, 0xCF, 0x0E, 0x24, 0x30, 0xA0, 0xC5, 0x03, 0x34, 6 | 0xE7, 0x26, 0x40, 0xB9, 0x04, 0xC4, 0x23, 0x30, 0x8C, 0x84, 0x1C, 0x0F, 7 | 0x00, 0xCC, 0x06, 0x60, 0x3E, 0x00, 0xE7, 0x8F, 0x18, 0x9C, 0x8C, 0xE4, 8 | 0xE3, 0xC7, 0x9E, 0x3C, 0x72, 0xFD, 0xE0, 0xFF, 0x80, 0x32, 0x44, 0xCC, 9 | 0xCC, 0xCC, 0xC4, 0x62, 0x10, 0x84, 0x22, 0x33, 0x33, 0x33, 0x32, 0x64, 10 | 0x80, 0x31, 0x6B, 0xB1, 0x8E, 0xD6, 0x8C, 0x00, 0x08, 0x04, 0x02, 0x01, 11 | 0x0F, 0xF8, 0x40, 0x20, 0x10, 0x08, 0x00, 0xDF, 0x95, 0x00, 0xFF, 0xFF, 12 | 0x80, 0x0C, 0x21, 0x86, 0x10, 0xC3, 0x08, 0x61, 0x84, 0x30, 0xC0, 0x1C, 13 | 0x33, 0x98, 0xDC, 0x7E, 0x3F, 0x1F, 0x8F, 0xC7, 0xE3, 0xB1, 0x98, 0xC3, 14 | 0x80, 0x08, 0xE3, 0x8E, 0x38, 0xE3, 0x8E, 0x38, 0xE3, 0xBF, 0x3C, 0x3F, 15 | 0x23, 0xC0, 0xE0, 0x70, 0x30, 0x38, 0x18, 0x18, 0x18, 0x5F, 0xDF, 0xE0, 16 | 0x7C, 0x8E, 0x0E, 0x0E, 0x0C, 0x1E, 0x07, 0x03, 0x03, 0x02, 0xE6, 0xF8, 17 | 0x06, 0x0E, 0x0E, 0x3E, 0x2E, 0x4E, 0x8E, 0x8E, 0xFF, 0xFF, 0x0E, 0x0E, 18 | 0x3F, 0x7E, 0x40, 0x40, 0xF8, 0xFC, 0x1E, 0x06, 0x02, 0x02, 0xE4, 0xF8, 19 | 0x07, 0x1C, 0x30, 0x70, 0xFC, 0xE6, 0xE7, 0xE7, 0xE7, 0x67, 0x66, 0x3C, 20 | 0x7F, 0x3F, 0xA0, 0xD0, 0x40, 0x60, 0x30, 0x10, 0x18, 0x0C, 0x04, 0x06, 21 | 0x03, 0x00, 0x3C, 0xC6, 0xC6, 0xC6, 0xFC, 0x7C, 0x3E, 0xCF, 0xC7, 0xC7, 22 | 0xC6, 0x7C, 0x3E, 0x33, 0xB8, 0xDC, 0x7E, 0x3F, 0x1D, 0xCE, 0x7F, 0x07, 23 | 0x07, 0x0F, 0x1C, 0x00, 0xFF, 0x80, 0x3F, 0xE0, 0xFF, 0x80, 0x37, 0xE5, 24 | 0x40, 0x00, 0x00, 0x70, 0x78, 0x78, 0x78, 0x38, 0x03, 0x80, 0x3C, 0x03, 25 | 0xC0, 0x30, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0xC0, 0x3C, 0x03, 26 | 0xC0, 0x1C, 0x01, 0xC1, 0xE1, 0xE1, 0xE0, 0xE0, 0x00, 0x00, 0x3D, 0x9F, 27 | 0x3E, 0x70, 0xE1, 0x04, 0x08, 0x00, 0x70, 0xE1, 0xC0, 0x0F, 0x81, 0x83, 28 | 0x18, 0xC4, 0x89, 0x9C, 0x4C, 0xE4, 0x67, 0x22, 0x39, 0x22, 0x4F, 0xE3, 29 | 0x00, 0x0C, 0x10, 0x1F, 0x00, 0x02, 0x00, 0x30, 0x01, 0xC0, 0x0E, 0x00, 30 | 0xB8, 0x05, 0xC0, 0x4F, 0x02, 0x38, 0x3F, 0xE1, 0x07, 0x18, 0x3D, 0xE3, 31 | 0xF0, 0xFF, 0x87, 0x1C, 0xE3, 0x9C, 0x73, 0x9C, 0x7F, 0x0E, 0x71, 0xC7, 32 | 0x38, 0xE7, 0x1C, 0xE7, 0x7F, 0xC0, 0x1F, 0x26, 0x1D, 0xC1, 0xB0, 0x1E, 33 | 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x0E, 0x04, 0xE1, 0x0F, 0xC0, 0xFF, 34 | 0x0E, 0x71, 0xC7, 0x38, 0x77, 0x0E, 0xE1, 0xDC, 0x3B, 0x87, 0x70, 0xCE, 35 | 0x39, 0xC6, 0x7F, 0x80, 0xFF, 0xCE, 0x19, 0xC1, 0x38, 0x87, 0x30, 0xFE, 36 | 0x1C, 0xC3, 0x88, 0x70, 0x2E, 0x0D, 0xC3, 0x7F, 0xE0, 0xFF, 0xDC, 0x37, 37 | 0x05, 0xC4, 0x73, 0x1F, 0xC7, 0x31, 0xC4, 0x70, 0x1C, 0x07, 0x03, 0xE0, 38 | 0x1F, 0x23, 0x0E, 0x70, 0x6E, 0x02, 0xE0, 0x0E, 0x00, 0xE1, 0xFE, 0x0E, 39 | 0x60, 0xE7, 0x0E, 0x38, 0xE0, 0xF8, 0xF9, 0xF7, 0x0E, 0x70, 0xE7, 0x0E, 40 | 0x70, 0xE7, 0xFE, 0x70, 0xE7, 0x0E, 0x70, 0xE7, 0x0E, 0x70, 0xEF, 0x9F, 41 | 0xFB, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9D, 0xF0, 0x1F, 0x0E, 0x0E, 0x0E, 42 | 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0xCE, 0xCC, 0x78, 0xF9, 0xF3, 43 | 0x82, 0x1C, 0x20, 0xE2, 0x07, 0x20, 0x3F, 0x01, 0xDC, 0x0E, 0x70, 0x73, 44 | 0xC3, 0x8F, 0x1C, 0x3D, 0xF3, 0xF0, 0xF8, 0x0E, 0x01, 0xC0, 0x38, 0x07, 45 | 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x2E, 0x09, 0xC3, 0x7F, 0xE0, 0xF8, 46 | 0x0F, 0x3C, 0x1E, 0x3C, 0x1E, 0x2E, 0x2E, 0x2E, 0x2E, 0x26, 0x4E, 0x27, 47 | 0x4E, 0x27, 0x4E, 0x23, 0x8E, 0x23, 0x8E, 0x21, 0x0E, 0x71, 0x1F, 0xF0, 48 | 0xEE, 0x09, 0xE1, 0x3E, 0x25, 0xE4, 0x9E, 0x91, 0xD2, 0x1E, 0x43, 0xC8, 49 | 0x39, 0x03, 0x70, 0x20, 0x1F, 0x83, 0x0C, 0x70, 0xEE, 0x07, 0xE0, 0x7E, 50 | 0x07, 0xE0, 0x7E, 0x07, 0xE0, 0x77, 0x0E, 0x30, 0xC1, 0xF8, 0xFF, 0x1C, 51 | 0xE7, 0x1D, 0xC7, 0x71, 0xDC, 0xE7, 0xF1, 0xC0, 0x70, 0x1C, 0x07, 0x03, 52 | 0xE0, 0x0F, 0x83, 0x9C, 0x70, 0xE6, 0x06, 0xE0, 0x7E, 0x07, 0xE0, 0x7E, 53 | 0x07, 0xE0, 0x76, 0x06, 0x30, 0xC1, 0x98, 0x0F, 0x00, 0x78, 0x03, 0xE0, 54 | 0xFF, 0x07, 0x38, 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x38, 0x7E, 0x07, 0x70, 55 | 0x77, 0x87, 0x3C, 0x71, 0xEF, 0x8F, 0x39, 0x47, 0xC1, 0xC0, 0xF0, 0x7C, 56 | 0x3E, 0x0F, 0x83, 0xC3, 0xC6, 0xBC, 0xFF, 0xFC, 0xE3, 0x8E, 0x10, 0xE0, 57 | 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x01, 0xF0, 58 | 0xF8, 0xEE, 0x09, 0xC1, 0x38, 0x27, 0x04, 0xE0, 0x9C, 0x13, 0x82, 0x70, 59 | 0x4E, 0x08, 0xE2, 0x0F, 0x80, 0xFC, 0x7B, 0xC1, 0x0E, 0x08, 0x70, 0x81, 60 | 0xC4, 0x0E, 0x20, 0x7A, 0x01, 0xD0, 0x0E, 0x80, 0x38, 0x01, 0xC0, 0x04, 61 | 0x00, 0x20, 0x00, 0xFD, 0xFB, 0xDC, 0x38, 0x43, 0x87, 0x10, 0xE1, 0xC4, 62 | 0x38, 0xF2, 0x07, 0x2E, 0x81, 0xD3, 0xA0, 0x34, 0x70, 0x0E, 0x1C, 0x03, 63 | 0x87, 0x00, 0x60, 0x80, 0x10, 0x20, 0xFE, 0xF3, 0xC3, 0x0F, 0x10, 0x39, 64 | 0x00, 0xF0, 0x03, 0x80, 0x1E, 0x01, 0x70, 0x09, 0xC0, 0x8F, 0x08, 0x3D, 65 | 0xF3, 0xF0, 0xFC, 0x7B, 0xC1, 0x8E, 0x08, 0x38, 0x81, 0xE8, 0x07, 0x40, 66 | 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x38, 0x01, 0xC0, 0x1F, 0x00, 0xFF, 0xD8, 67 | 0x72, 0x1E, 0x43, 0x80, 0xE0, 0x1C, 0x07, 0x01, 0xC0, 0x38, 0x2E, 0x0F, 68 | 0x83, 0x7F, 0xE0, 0xFC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xF0, 0xC1, 69 | 0x06, 0x18, 0x20, 0xC3, 0x04, 0x18, 0x60, 0x83, 0x0C, 0xF3, 0x33, 0x33, 70 | 0x33, 0x33, 0x33, 0x33, 0xF0, 0x18, 0x1C, 0x34, 0x26, 0x62, 0x43, 0xC1, 71 | 0xFF, 0x80, 0xC6, 0x30, 0x7C, 0x63, 0xB1, 0xC0, 0xE1, 0xF3, 0x3B, 0x9D, 72 | 0xCE, 0xFF, 0x80, 0xF0, 0x1C, 0x07, 0x01, 0xDC, 0x7B, 0x9C, 0x77, 0x1D, 73 | 0xC7, 0x71, 0xDC, 0x77, 0x39, 0x3C, 0x3C, 0xED, 0x9F, 0x0E, 0x1C, 0x38, 74 | 0x39, 0x3C, 0x07, 0x80, 0xE0, 0x38, 0xEE, 0x77, 0xB8, 0xEE, 0x3B, 0x8E, 75 | 0xE3, 0xB8, 0xE7, 0x78, 0xEF, 0x3C, 0x66, 0xE6, 0xFE, 0xE0, 0xE0, 0xE0, 76 | 0x72, 0x3C, 0x3E, 0xED, 0xC7, 0xC7, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC7, 77 | 0xC0, 0x31, 0xDF, 0xBF, 0x7E, 0xE7, 0x90, 0x60, 0xFC, 0xFE, 0x0C, 0x17, 78 | 0xC0, 0xF0, 0x1C, 0x07, 0x01, 0xDC, 0x7B, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 79 | 0x9C, 0xE7, 0x3B, 0xFF, 0x73, 0x9D, 0xE7, 0x39, 0xCE, 0x73, 0x9D, 0xF0, 80 | 0x1C, 0x71, 0xCF, 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x1C, 0x7D, 0xBE, 81 | 0xF0, 0x1C, 0x07, 0x01, 0xCE, 0x71, 0x1C, 0x87, 0x41, 0xF8, 0x77, 0x1C, 82 | 0xE7, 0x1B, 0xEF, 0xF3, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9D, 0xF0, 0xF7, 83 | 0x38, 0xF7, 0xB9, 0xCE, 0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 84 | 0x39, 0xCE, 0xFF, 0xFE, 0xF7, 0x1E, 0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 85 | 0x39, 0xCE, 0xFF, 0xC0, 0x3E, 0x31, 0xB8, 0xFC, 0x7E, 0x3F, 0x1F, 0x8E, 86 | 0xC6, 0x3E, 0x00, 0xF7, 0x1E, 0xE7, 0x1D, 0xC7, 0x71, 0xDC, 0x77, 0x1D, 87 | 0xCE, 0x7F, 0x1C, 0x07, 0x01, 0xC0, 0xF8, 0x00, 0x3C, 0x9C, 0xEE, 0x3B, 88 | 0x8E, 0xE3, 0xB8, 0xEE, 0x39, 0xCE, 0x3F, 0x80, 0xE0, 0x38, 0x0E, 0x07, 89 | 0xC0, 0xF7, 0x7B, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0xF8, 0x7E, 0x73, 90 | 0xC7, 0x8E, 0x39, 0xB0, 0x10, 0xCF, 0x9C, 0x71, 0xC7, 0x1C, 0x71, 0xD3, 91 | 0x80, 0xF7, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x3F, 92 | 0xC0, 0xFB, 0xB8, 0x8C, 0x87, 0x43, 0xC0, 0xE0, 0x70, 0x10, 0x08, 0x00, 93 | 0xF7, 0xB6, 0x31, 0x73, 0xA3, 0x3A, 0x3D, 0xA3, 0xDC, 0x18, 0xC1, 0x88, 94 | 0x10, 0x80, 0xFB, 0xB8, 0x8E, 0x83, 0x81, 0xC0, 0xF0, 0x98, 0xCE, 0xEF, 95 | 0x80, 0xF7, 0x62, 0x72, 0x34, 0x34, 0x3C, 0x18, 0x18, 0x10, 0x10, 0x10, 96 | 0xE0, 0xE0, 0xFF, 0x1C, 0x70, 0xE3, 0x87, 0x1C, 0x71, 0xFE, 0x19, 0x8C, 97 | 0x63, 0x18, 0xCC, 0x61, 0x8C, 0x63, 0x18, 0xC3, 0xFF, 0xF8, 0xC3, 0x18, 98 | 0xC6, 0x31, 0x86, 0x33, 0x18, 0xC6, 0x31, 0x98, 0xF0, 0x8E}; 99 | 100 | const GFXglyph FreeSerifBold9pt7bGlyphs[] PROGMEM = { 101 | {0, 0, 0, 5, 0, 1}, // 0x20 ' ' 102 | {0, 3, 12, 6, 1, -11}, // 0x21 '!' 103 | {5, 6, 5, 10, 2, -11}, // 0x22 '"' 104 | {9, 9, 13, 9, 0, -12}, // 0x23 '#' 105 | {24, 8, 14, 9, 1, -12}, // 0x24 '$' 106 | {38, 14, 12, 18, 2, -11}, // 0x25 '%' 107 | {59, 13, 12, 15, 1, -11}, // 0x26 '&' 108 | {79, 2, 5, 5, 1, -11}, // 0x27 ''' 109 | {81, 4, 15, 6, 1, -11}, // 0x28 '(' 110 | {89, 4, 15, 6, 1, -11}, // 0x29 ')' 111 | {97, 7, 7, 9, 2, -11}, // 0x2A '*' 112 | {104, 9, 9, 12, 1, -8}, // 0x2B '+' 113 | {115, 3, 6, 4, 1, -2}, // 0x2C ',' 114 | {118, 4, 2, 6, 1, -4}, // 0x2D '-' 115 | {119, 3, 3, 4, 1, -2}, // 0x2E '.' 116 | {121, 6, 13, 5, 0, -11}, // 0x2F '/' 117 | {131, 9, 12, 9, 0, -11}, // 0x30 '0' 118 | {145, 6, 12, 9, 1, -11}, // 0x31 '1' 119 | {154, 9, 12, 9, 0, -11}, // 0x32 '2' 120 | {168, 8, 12, 9, 0, -11}, // 0x33 '3' 121 | {180, 8, 12, 9, 1, -11}, // 0x34 '4' 122 | {192, 8, 12, 9, 1, -11}, // 0x35 '5' 123 | {204, 8, 12, 9, 1, -11}, // 0x36 '6' 124 | {216, 9, 12, 9, 0, -11}, // 0x37 '7' 125 | {230, 8, 12, 9, 1, -11}, // 0x38 '8' 126 | {242, 9, 12, 9, 0, -11}, // 0x39 '9' 127 | {256, 3, 9, 6, 1, -8}, // 0x3A ':' 128 | {260, 3, 12, 6, 2, -8}, // 0x3B ';' 129 | {265, 10, 10, 12, 1, -9}, // 0x3C '<' 130 | {278, 10, 5, 12, 1, -6}, // 0x3D '=' 131 | {285, 10, 10, 12, 1, -8}, // 0x3E '>' 132 | {298, 7, 12, 9, 1, -11}, // 0x3F '?' 133 | {309, 13, 12, 17, 2, -11}, // 0x40 '@' 134 | {329, 13, 12, 13, 0, -11}, // 0x41 'A' 135 | {349, 11, 12, 12, 0, -11}, // 0x42 'B' 136 | {366, 11, 12, 13, 1, -11}, // 0x43 'C' 137 | {383, 11, 12, 13, 1, -11}, // 0x44 'D' 138 | {400, 11, 12, 12, 1, -11}, // 0x45 'E' 139 | {417, 10, 12, 11, 1, -11}, // 0x46 'F' 140 | {432, 12, 12, 14, 1, -11}, // 0x47 'G' 141 | {450, 12, 12, 14, 1, -11}, // 0x48 'H' 142 | {468, 5, 12, 7, 1, -11}, // 0x49 'I' 143 | {476, 8, 14, 9, 0, -11}, // 0x4A 'J' 144 | {490, 13, 12, 14, 1, -11}, // 0x4B 'K' 145 | {510, 11, 12, 12, 1, -11}, // 0x4C 'L' 146 | {527, 16, 12, 17, 0, -11}, // 0x4D 'M' 147 | {551, 11, 12, 13, 1, -11}, // 0x4E 'N' 148 | {568, 12, 12, 14, 1, -11}, // 0x4F 'O' 149 | {586, 10, 12, 11, 1, -11}, // 0x50 'P' 150 | {601, 12, 15, 14, 1, -11}, // 0x51 'Q' 151 | {624, 12, 12, 13, 1, -11}, // 0x52 'R' 152 | {642, 8, 12, 10, 1, -11}, // 0x53 'S' 153 | {654, 12, 12, 12, 0, -11}, // 0x54 'T' 154 | {672, 11, 12, 13, 1, -11}, // 0x55 'U' 155 | {689, 13, 13, 13, 0, -11}, // 0x56 'V' 156 | {711, 18, 12, 18, 0, -11}, // 0x57 'W' 157 | {738, 13, 12, 13, 0, -11}, // 0x58 'X' 158 | {758, 13, 12, 13, 0, -11}, // 0x59 'Y' 159 | {778, 11, 12, 12, 1, -11}, // 0x5A 'Z' 160 | {795, 4, 15, 6, 1, -11}, // 0x5B '[' 161 | {803, 6, 13, 5, 0, -11}, // 0x5C '\' 162 | {813, 4, 15, 6, 1, -11}, // 0x5D ']' 163 | {821, 8, 7, 10, 1, -11}, // 0x5E '^' 164 | {828, 9, 1, 9, 0, 3}, // 0x5F '_' 165 | {830, 4, 3, 6, 0, -12}, // 0x60 '`' 166 | {832, 9, 9, 9, 0, -8}, // 0x61 'a' 167 | {843, 10, 12, 10, 0, -11}, // 0x62 'b' 168 | {858, 7, 9, 8, 0, -8}, // 0x63 'c' 169 | {866, 10, 12, 10, 0, -11}, // 0x64 'd' 170 | {881, 8, 9, 8, 0, -8}, // 0x65 'e' 171 | {890, 7, 12, 7, 0, -11}, // 0x66 'f' 172 | {901, 7, 13, 9, 1, -8}, // 0x67 'g' 173 | {913, 10, 12, 10, 0, -11}, // 0x68 'h' 174 | {928, 5, 12, 5, 0, -11}, // 0x69 'i' 175 | {936, 6, 16, 7, 0, -11}, // 0x6A 'j' 176 | {948, 10, 12, 10, 0, -11}, // 0x6B 'k' 177 | {963, 5, 12, 5, 0, -11}, // 0x6C 'l' 178 | {971, 15, 9, 15, 0, -8}, // 0x6D 'm' 179 | {988, 10, 9, 10, 0, -8}, // 0x6E 'n' 180 | {1000, 9, 9, 9, 0, -8}, // 0x6F 'o' 181 | {1011, 10, 13, 10, 0, -8}, // 0x70 'p' 182 | {1028, 10, 13, 10, 0, -8}, // 0x71 'q' 183 | {1045, 8, 9, 8, 0, -8}, // 0x72 'r' 184 | {1054, 5, 9, 7, 1, -8}, // 0x73 's' 185 | {1060, 6, 11, 6, 0, -10}, // 0x74 't' 186 | {1069, 10, 9, 10, 0, -8}, // 0x75 'u' 187 | {1081, 9, 9, 9, 0, -8}, // 0x76 'v' 188 | {1092, 12, 9, 13, 0, -8}, // 0x77 'w' 189 | {1106, 9, 9, 9, 0, -8}, // 0x78 'x' 190 | {1117, 8, 13, 9, 0, -8}, // 0x79 'y' 191 | {1130, 7, 9, 8, 1, -8}, // 0x7A 'z' 192 | {1138, 5, 16, 7, 0, -12}, // 0x7B '{' 193 | {1148, 1, 13, 4, 1, -11}, // 0x7C '|' 194 | {1150, 5, 16, 7, 2, -12}, // 0x7D '}' 195 | {1160, 8, 2, 9, 1, -4}}; // 0x7E '~' 196 | 197 | const GFXfont FreeSerifBold9pt7b PROGMEM = { 198 | (uint8_t *)FreeSerifBold9pt7bBitmaps, (GFXglyph *)FreeSerifBold9pt7bGlyphs, 199 | 0x20, 0x7E, 22}; 200 | 201 | // Approx. 1834 bytes 202 | -------------------------------------------------------------------------------- /app/src/lib/Adafruit-GFX-Library/Fonts/FreeSerifItalic9pt7b.h: -------------------------------------------------------------------------------- 1 | const uint8_t FreeSerifItalic9pt7bBitmaps[] PROGMEM = { 2 | 0x11, 0x12, 0x22, 0x24, 0x40, 0x0C, 0xDE, 0xE5, 0x40, 0x04, 0x82, 0x20, 3 | 0x98, 0x24, 0x7F, 0xC4, 0x82, 0x23, 0xFC, 0x24, 0x11, 0x04, 0x83, 0x20, 4 | 0x1C, 0x1B, 0x99, 0x4D, 0x26, 0x81, 0xC0, 0x70, 0x1C, 0x13, 0x49, 0xA4, 5 | 0xDA, 0xC7, 0xC1, 0x00, 0x80, 0x1C, 0x61, 0xCF, 0x0E, 0x28, 0x30, 0xA0, 6 | 0xC5, 0x03, 0x34, 0xE7, 0xAE, 0x40, 0xB1, 0x05, 0x84, 0x26, 0x20, 0x99, 7 | 0x84, 0x3C, 0x03, 0x80, 0x6C, 0x06, 0xC0, 0x78, 0x06, 0x01, 0xEF, 0x66, 8 | 0x24, 0x24, 0xC3, 0x8C, 0x10, 0xE3, 0x87, 0xCE, 0xFA, 0x08, 0x21, 0x08, 9 | 0x61, 0x8C, 0x30, 0xC3, 0x0C, 0x30, 0x41, 0x02, 0x00, 0x10, 0x40, 0x82, 10 | 0x0C, 0x30, 0xC3, 0x0C, 0x61, 0x84, 0x21, 0x08, 0x00, 0x30, 0xCA, 0x5E, 11 | 0x6A, 0x93, 0x08, 0x08, 0x04, 0x02, 0x01, 0x0F, 0xF8, 0x40, 0x20, 0x10, 12 | 0x08, 0x00, 0x56, 0xF0, 0xF0, 0x03, 0x02, 0x06, 0x04, 0x08, 0x08, 0x10, 13 | 0x30, 0x20, 0x60, 0x40, 0xC0, 0x0E, 0x0C, 0x8C, 0x6C, 0x36, 0x1F, 0x0F, 14 | 0x07, 0x87, 0xC3, 0x61, 0xB1, 0x88, 0x83, 0x80, 0x04, 0x70, 0xC3, 0x08, 15 | 0x21, 0x86, 0x10, 0x43, 0x08, 0xF8, 0x1C, 0x67, 0x83, 0x03, 0x02, 0x06, 16 | 0x0C, 0x08, 0x10, 0x20, 0x42, 0xFC, 0x0F, 0x08, 0xC0, 0x60, 0xC1, 0xE0, 17 | 0x38, 0x0C, 0x06, 0x03, 0x01, 0x01, 0x1F, 0x00, 0x01, 0x01, 0x81, 0x41, 18 | 0x61, 0x21, 0x11, 0x18, 0x88, 0xFF, 0x02, 0x03, 0x01, 0x00, 0x0F, 0x84, 19 | 0x04, 0x03, 0x80, 0x60, 0x18, 0x0C, 0x06, 0x03, 0x03, 0x03, 0x1E, 0x00, 20 | 0x01, 0x83, 0x87, 0x07, 0x03, 0x03, 0x73, 0xCD, 0x86, 0xC3, 0x61, 0xB1, 21 | 0x88, 0xC3, 0xC0, 0x7F, 0x40, 0x80, 0x80, 0x40, 0x40, 0x60, 0x20, 0x20, 22 | 0x10, 0x10, 0x18, 0x08, 0x00, 0x1E, 0x19, 0xCC, 0x66, 0x33, 0xB0, 0xE0, 23 | 0x50, 0xCC, 0xC3, 0x61, 0xB0, 0xCC, 0xC3, 0xC0, 0x0E, 0x19, 0x8C, 0x6C, 24 | 0x36, 0x1B, 0x0D, 0x86, 0xE6, 0x3F, 0x03, 0x03, 0x06, 0x0C, 0x00, 0x33, 25 | 0x00, 0x00, 0xCC, 0x33, 0x00, 0x00, 0x44, 0x48, 0x01, 0x83, 0x86, 0x1C, 26 | 0x0C, 0x03, 0x80, 0x30, 0x07, 0x00, 0x80, 0xFF, 0x80, 0x00, 0x00, 0x0F, 27 | 0xF8, 0xC0, 0x1C, 0x03, 0x80, 0x70, 0x18, 0x38, 0x70, 0xC0, 0x80, 0x00, 28 | 0x3C, 0x8C, 0x18, 0x30, 0xC3, 0x0C, 0x20, 0x40, 0x80, 0x06, 0x00, 0x0F, 29 | 0xC0, 0xC3, 0x0C, 0x04, 0xC7, 0xBC, 0x64, 0xE2, 0x27, 0x31, 0x39, 0x91, 30 | 0xCC, 0x93, 0x3B, 0x0E, 0x00, 0x1F, 0x80, 0x01, 0x00, 0x60, 0x14, 0x04, 31 | 0xC0, 0x98, 0x23, 0x07, 0xE1, 0x04, 0x20, 0x88, 0x1B, 0x8F, 0x80, 0x3F, 32 | 0xC1, 0x8C, 0x21, 0x8C, 0x31, 0x8C, 0x3E, 0x04, 0x61, 0x86, 0x30, 0xC4, 33 | 0x19, 0x86, 0x7F, 0x80, 0x07, 0x91, 0x86, 0x30, 0x26, 0x02, 0x60, 0x0C, 34 | 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0x61, 0x83, 0xE0, 0x3F, 0xC0, 35 | 0x63, 0x82, 0x0C, 0x30, 0x31, 0x81, 0x8C, 0x0C, 0x40, 0x66, 0x07, 0x30, 36 | 0x31, 0x03, 0x18, 0x71, 0xFE, 0x00, 0x3F, 0xF0, 0xC2, 0x08, 0x21, 0x80, 37 | 0x19, 0x81, 0xF8, 0x11, 0x03, 0x10, 0x30, 0x02, 0x04, 0x60, 0x8F, 0xF8, 38 | 0x3F, 0xF0, 0xC2, 0x08, 0x21, 0x80, 0x19, 0x81, 0xF8, 0x11, 0x03, 0x10, 39 | 0x30, 0x02, 0x00, 0x60, 0x0F, 0x80, 0x07, 0x91, 0x87, 0x30, 0x26, 0x02, 40 | 0x60, 0x0C, 0x00, 0xC1, 0xFC, 0x0C, 0xC0, 0xCC, 0x0C, 0x60, 0x83, 0xF0, 41 | 0x3E, 0x3C, 0x30, 0x60, 0x81, 0x06, 0x0C, 0x18, 0x30, 0x7F, 0x81, 0x06, 42 | 0x0C, 0x18, 0x30, 0x60, 0x81, 0x06, 0x0C, 0x3C, 0x78, 0x1E, 0x18, 0x20, 43 | 0xC1, 0x83, 0x04, 0x18, 0x30, 0x41, 0x87, 0x80, 0x0F, 0x81, 0x80, 0x80, 44 | 0xC0, 0x60, 0x20, 0x30, 0x18, 0x0C, 0x04, 0x36, 0x1E, 0x00, 0x3E, 0x78, 45 | 0x61, 0x82, 0x10, 0x31, 0x01, 0xB0, 0x0E, 0x00, 0x58, 0x06, 0x60, 0x33, 46 | 0x01, 0x0C, 0x18, 0x61, 0xE7, 0xC0, 0x3E, 0x01, 0x80, 0x20, 0x0C, 0x01, 47 | 0x80, 0x30, 0x04, 0x01, 0x80, 0x30, 0x04, 0x0D, 0x83, 0x7F, 0xE0, 0x1C, 48 | 0x07, 0x0C, 0x0E, 0x0C, 0x14, 0x14, 0x1C, 0x14, 0x2C, 0x16, 0x4C, 0x26, 49 | 0x48, 0x26, 0x98, 0x27, 0x18, 0x27, 0x10, 0x42, 0x30, 0xF4, 0x7C, 0x38, 50 | 0x78, 0x60, 0x83, 0x04, 0x2C, 0x41, 0x22, 0x09, 0x10, 0x4D, 0x84, 0x28, 51 | 0x21, 0x41, 0x06, 0x10, 0x21, 0xE1, 0x00, 0x07, 0x83, 0x18, 0xC1, 0xB0, 52 | 0x36, 0x07, 0xC0, 0xF0, 0x3E, 0x06, 0xC0, 0xD8, 0x31, 0x8C, 0x1E, 0x00, 53 | 0x3F, 0xC1, 0x9C, 0x21, 0x8C, 0x31, 0x86, 0x31, 0x87, 0xE1, 0x80, 0x30, 54 | 0x04, 0x01, 0x80, 0x78, 0x00, 0x07, 0x83, 0x18, 0xC1, 0x98, 0x36, 0x07, 55 | 0xC0, 0xF0, 0x1E, 0x06, 0xC0, 0xD8, 0x31, 0x04, 0x13, 0x01, 0x80, 0x70, 56 | 0xB7, 0xE0, 0x3F, 0xC1, 0x8C, 0x21, 0x8C, 0x31, 0x8C, 0x3F, 0x04, 0xC1, 57 | 0x98, 0x31, 0x84, 0x31, 0x86, 0x78, 0x70, 0x1E, 0x4C, 0x63, 0x08, 0xC0, 58 | 0x38, 0x07, 0x00, 0x60, 0x0C, 0x43, 0x10, 0xC6, 0x62, 0x70, 0x7F, 0xE9, 59 | 0x8E, 0x31, 0x04, 0x01, 0x80, 0x30, 0x06, 0x00, 0x80, 0x30, 0x06, 0x00, 60 | 0x80, 0x7E, 0x00, 0x7C, 0xF3, 0x02, 0x30, 0x46, 0x04, 0x60, 0x46, 0x04, 61 | 0x40, 0x8C, 0x08, 0xC0, 0x8C, 0x10, 0xE3, 0x03, 0xC0, 0xF8, 0xEC, 0x0C, 62 | 0x81, 0x18, 0x43, 0x08, 0x62, 0x0C, 0x81, 0x90, 0x14, 0x03, 0x00, 0x60, 63 | 0x08, 0x00, 0xFB, 0xCE, 0x43, 0x0C, 0x86, 0x11, 0x8C, 0x43, 0x38, 0x86, 64 | 0xB2, 0x0D, 0x24, 0x1C, 0x50, 0x38, 0xA0, 0x21, 0x80, 0x42, 0x01, 0x04, 65 | 0x00, 0x3E, 0x71, 0x82, 0x0C, 0x40, 0xC8, 0x07, 0x00, 0x60, 0x06, 0x00, 66 | 0xB0, 0x13, 0x02, 0x18, 0x61, 0x8F, 0x3E, 0xF9, 0xC8, 0x23, 0x10, 0xC8, 67 | 0x34, 0x05, 0x01, 0x80, 0x40, 0x30, 0x0C, 0x03, 0x03, 0xE0, 0x3F, 0xE4, 68 | 0x19, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0x40, 0x18, 0x06, 0x05, 69 | 0x81, 0x7F, 0xE0, 0x0E, 0x10, 0x20, 0x81, 0x02, 0x04, 0x10, 0x20, 0x40, 70 | 0x82, 0x04, 0x08, 0x1C, 0x00, 0x81, 0x04, 0x18, 0x20, 0xC1, 0x04, 0x08, 71 | 0x20, 0x41, 0x38, 0x20, 0x82, 0x08, 0x41, 0x04, 0x10, 0xC2, 0x08, 0x20, 72 | 0x8C, 0x00, 0x18, 0x18, 0x2C, 0x24, 0x46, 0x42, 0x83, 0xFF, 0x80, 0xD8, 73 | 0x80, 0x1F, 0x98, 0x98, 0x4C, 0x2C, 0x36, 0x33, 0x3A, 0xEE, 0x38, 0x08, 74 | 0x04, 0x02, 0x03, 0x71, 0xCC, 0xC6, 0xC3, 0x63, 0x21, 0x93, 0x8F, 0x00, 75 | 0x1F, 0x33, 0x60, 0xC0, 0xC0, 0xC0, 0xC4, 0x78, 0x01, 0x80, 0x40, 0x60, 76 | 0x20, 0xF1, 0x89, 0x8C, 0xC4, 0xC2, 0x63, 0x33, 0xAE, 0xE0, 0x0E, 0x65, 77 | 0x8B, 0x2F, 0x98, 0x31, 0x3C, 0x01, 0xE0, 0x40, 0x08, 0x02, 0x00, 0x40, 78 | 0x3E, 0x03, 0x00, 0x40, 0x08, 0x01, 0x00, 0x60, 0x0C, 0x01, 0x00, 0x20, 79 | 0x04, 0x01, 0x00, 0xC0, 0x00, 0x1E, 0x19, 0xD8, 0xCC, 0xE1, 0xC3, 0x01, 80 | 0xE0, 0xBC, 0x82, 0x41, 0x31, 0x0F, 0x00, 0x38, 0x08, 0x04, 0x02, 0x03, 81 | 0x39, 0x6C, 0xC6, 0x46, 0x63, 0x21, 0x11, 0xB8, 0xE0, 0x30, 0x00, 0xE2, 82 | 0x44, 0xC8, 0xCE, 0x06, 0x00, 0x00, 0x00, 0xC0, 0x83, 0x04, 0x08, 0x10, 83 | 0x60, 0x81, 0x02, 0x04, 0x70, 0x38, 0x10, 0x10, 0x10, 0x37, 0x22, 0x24, 84 | 0x38, 0x78, 0x48, 0x4D, 0xC6, 0x73, 0x32, 0x26, 0x64, 0x4C, 0xDE, 0x77, 85 | 0x39, 0x5E, 0xCC, 0xCC, 0xCE, 0x66, 0x62, 0x22, 0x11, 0x11, 0xB9, 0x8E, 86 | 0x77, 0x3B, 0x33, 0x62, 0x62, 0x42, 0x4D, 0xCE, 0x0F, 0x18, 0xD8, 0x7C, 87 | 0x3C, 0x3E, 0x1B, 0x18, 0xF0, 0x3B, 0x87, 0x31, 0x8C, 0x43, 0x31, 0x88, 88 | 0x62, 0x30, 0xF0, 0x60, 0x10, 0x04, 0x03, 0x80, 0x0F, 0x18, 0x98, 0x4C, 89 | 0x2C, 0x26, 0x33, 0x38, 0xEC, 0x04, 0x02, 0x03, 0x03, 0xC0, 0x76, 0x50, 90 | 0xC1, 0x06, 0x08, 0x10, 0x60, 0x1A, 0x6C, 0xC8, 0xC0, 0xD1, 0xB3, 0x5C, 91 | 0x23, 0xC8, 0xC4, 0x21, 0x18, 0xE0, 0xC3, 0x42, 0x42, 0xC6, 0x86, 0x8C, 92 | 0x9D, 0xEE, 0x62, 0xC4, 0x89, 0xA3, 0x47, 0x0C, 0x10, 0xE2, 0x2C, 0x44, 93 | 0xD8, 0x9D, 0x23, 0xA4, 0x65, 0x0C, 0xC1, 0x10, 0x19, 0x95, 0x43, 0x01, 94 | 0x80, 0xC0, 0xA0, 0x91, 0x8E, 0x70, 0x88, 0x46, 0x23, 0x20, 0x90, 0x50, 95 | 0x28, 0x18, 0x08, 0x08, 0x08, 0x18, 0x00, 0x3F, 0x42, 0x04, 0x08, 0x10, 96 | 0x20, 0x40, 0x72, 0x0E, 0x08, 0x61, 0x04, 0x30, 0x86, 0x08, 0x61, 0x04, 97 | 0x30, 0xC3, 0x8F, 0x00, 0xFF, 0xF0, 0x1E, 0x0C, 0x10, 0x20, 0xC1, 0x82, 98 | 0x04, 0x1C, 0x30, 0x40, 0x83, 0x04, 0x08, 0x20, 0x60, 0x99, 0x8E}; 99 | 100 | const GFXglyph FreeSerifItalic9pt7bGlyphs[] PROGMEM = { 101 | {0, 0, 0, 5, 0, 1}, // 0x20 ' ' 102 | {0, 4, 12, 6, 1, -11}, // 0x21 '!' 103 | {6, 5, 4, 6, 3, -11}, // 0x22 '"' 104 | {9, 10, 12, 9, 0, -11}, // 0x23 '#' 105 | {24, 9, 15, 9, 1, -12}, // 0x24 '$' 106 | {41, 14, 12, 15, 1, -11}, // 0x25 '%' 107 | {62, 12, 12, 14, 1, -11}, // 0x26 '&' 108 | {80, 2, 4, 4, 3, -11}, // 0x27 ''' 109 | {81, 6, 15, 6, 1, -11}, // 0x28 '(' 110 | {93, 6, 15, 6, 0, -11}, // 0x29 ')' 111 | {105, 6, 8, 9, 3, -11}, // 0x2A '*' 112 | {111, 9, 9, 12, 1, -8}, // 0x2B '+' 113 | {122, 2, 4, 5, 0, -1}, // 0x2C ',' 114 | {123, 4, 1, 6, 1, -3}, // 0x2D '-' 115 | {124, 2, 2, 5, 0, -1}, // 0x2E '.' 116 | {125, 8, 12, 5, 0, -11}, // 0x2F '/' 117 | {137, 9, 13, 9, 1, -12}, // 0x30 '0' 118 | {152, 6, 13, 9, 1, -12}, // 0x31 '1' 119 | {162, 8, 12, 9, 1, -11}, // 0x32 '2' 120 | {174, 9, 12, 9, 0, -11}, // 0x33 '3' 121 | {188, 9, 12, 9, 0, -11}, // 0x34 '4' 122 | {202, 9, 12, 9, 0, -11}, // 0x35 '5' 123 | {216, 9, 13, 9, 1, -12}, // 0x36 '6' 124 | {231, 9, 12, 9, 1, -11}, // 0x37 '7' 125 | {245, 9, 13, 9, 1, -12}, // 0x38 '8' 126 | {260, 9, 13, 9, 0, -12}, // 0x39 '9' 127 | {275, 4, 8, 4, 1, -7}, // 0x3A ':' 128 | {279, 4, 10, 4, 1, -7}, // 0x3B ';' 129 | {284, 9, 9, 10, 1, -8}, // 0x3C '<' 130 | {295, 9, 5, 12, 2, -6}, // 0x3D '=' 131 | {301, 9, 9, 10, 1, -8}, // 0x3E '>' 132 | {312, 7, 12, 8, 2, -11}, // 0x3F '?' 133 | {323, 13, 12, 14, 1, -11}, // 0x40 '@' 134 | {343, 11, 11, 12, 0, -10}, // 0x41 'A' 135 | {359, 11, 12, 11, 0, -11}, // 0x42 'B' 136 | {376, 12, 12, 11, 1, -11}, // 0x43 'C' 137 | {394, 13, 12, 13, 0, -11}, // 0x44 'D' 138 | {414, 12, 12, 10, 0, -11}, // 0x45 'E' 139 | {432, 12, 12, 10, 0, -11}, // 0x46 'F' 140 | {450, 12, 12, 12, 1, -11}, // 0x47 'G' 141 | {468, 14, 12, 13, 0, -11}, // 0x48 'H' 142 | {489, 7, 12, 6, 0, -11}, // 0x49 'I' 143 | {500, 9, 12, 8, 0, -11}, // 0x4A 'J' 144 | {514, 13, 12, 12, 0, -11}, // 0x4B 'K' 145 | {534, 11, 12, 10, 0, -11}, // 0x4C 'L' 146 | {551, 16, 12, 15, 0, -11}, // 0x4D 'M' 147 | {575, 13, 12, 12, 0, -11}, // 0x4E 'N' 148 | {595, 11, 12, 12, 1, -11}, // 0x4F 'O' 149 | {612, 11, 12, 10, 0, -11}, // 0x50 'P' 150 | {629, 11, 15, 12, 1, -11}, // 0x51 'Q' 151 | {650, 11, 12, 11, 0, -11}, // 0x52 'R' 152 | {667, 10, 12, 8, 0, -11}, // 0x53 'S' 153 | {682, 11, 12, 11, 2, -11}, // 0x54 'T' 154 | {699, 12, 12, 13, 2, -11}, // 0x55 'U' 155 | {717, 11, 12, 12, 2, -11}, // 0x56 'V' 156 | {734, 15, 12, 16, 2, -11}, // 0x57 'W' 157 | {757, 12, 12, 12, 0, -11}, // 0x58 'X' 158 | {775, 10, 12, 11, 2, -11}, // 0x59 'Y' 159 | {790, 11, 12, 10, 0, -11}, // 0x5A 'Z' 160 | {807, 7, 15, 7, 0, -11}, // 0x5B '[' 161 | {821, 6, 12, 9, 2, -11}, // 0x5C '\' 162 | {830, 6, 15, 7, 1, -11}, // 0x5D ']' 163 | {842, 8, 7, 8, 0, -11}, // 0x5E '^' 164 | {849, 9, 1, 9, 0, 2}, // 0x5F '_' 165 | {851, 3, 3, 5, 2, -11}, // 0x60 '`' 166 | {853, 9, 8, 9, 0, -7}, // 0x61 'a' 167 | {862, 9, 12, 9, 0, -11}, // 0x62 'b' 168 | {876, 8, 8, 7, 0, -7}, // 0x63 'c' 169 | {884, 9, 12, 9, 0, -11}, // 0x64 'd' 170 | {898, 7, 8, 7, 0, -7}, // 0x65 'e' 171 | {905, 11, 17, 8, -1, -12}, // 0x66 'f' 172 | {929, 9, 12, 8, 0, -7}, // 0x67 'g' 173 | {943, 9, 12, 9, 0, -11}, // 0x68 'h' 174 | {957, 4, 12, 4, 1, -11}, // 0x69 'i' 175 | {963, 7, 16, 5, -1, -11}, // 0x6A 'j' 176 | {977, 8, 12, 8, 0, -11}, // 0x6B 'k' 177 | {989, 4, 12, 5, 1, -11}, // 0x6C 'l' 178 | {995, 13, 8, 13, 0, -7}, // 0x6D 'm' 179 | {1008, 8, 8, 9, 0, -7}, // 0x6E 'n' 180 | {1016, 9, 8, 9, 0, -7}, // 0x6F 'o' 181 | {1025, 10, 12, 8, -1, -7}, // 0x70 'p' 182 | {1040, 9, 12, 9, 0, -7}, // 0x71 'q' 183 | {1054, 7, 8, 7, 0, -7}, // 0x72 'r' 184 | {1061, 7, 8, 6, 0, -7}, // 0x73 's' 185 | {1068, 5, 9, 4, 0, -8}, // 0x74 't' 186 | {1074, 8, 8, 9, 1, -7}, // 0x75 'u' 187 | {1082, 7, 8, 8, 1, -7}, // 0x76 'v' 188 | {1089, 11, 8, 12, 1, -7}, // 0x77 'w' 189 | {1100, 9, 8, 8, -1, -7}, // 0x78 'x' 190 | {1109, 9, 12, 9, 0, -7}, // 0x79 'y' 191 | {1123, 8, 9, 7, 0, -7}, // 0x7A 'z' 192 | {1132, 6, 15, 7, 1, -11}, // 0x7B '{' 193 | {1144, 1, 12, 5, 2, -11}, // 0x7C '|' 194 | {1146, 7, 16, 7, 0, -12}, // 0x7D '}' 195 | {1160, 8, 3, 10, 1, -5}}; // 0x7E '~' 196 | 197 | const GFXfont FreeSerifItalic9pt7b PROGMEM = { 198 | (uint8_t *)FreeSerifItalic9pt7bBitmaps, 199 | (GFXglyph *)FreeSerifItalic9pt7bGlyphs, 0x20, 0x7E, 22}; 200 | 201 | // Approx. 1835 bytes 202 | -------------------------------------------------------------------------------- /app/src/lib/Adafruit-GFX-Library/Fonts/FreeMonoBoldOblique9pt7b.h: -------------------------------------------------------------------------------- 1 | const uint8_t FreeMonoBoldOblique9pt7bBitmaps[] PROGMEM = { 2 | 0x39, 0xCC, 0x67, 0x31, 0x8C, 0x07, 0x38, 0x6C, 0xD9, 0x36, 0x48, 0x80, 3 | 0x09, 0x0D, 0x86, 0xCF, 0xF7, 0xF9, 0xB3, 0xFD, 0xFE, 0x6C, 0x36, 0x1B, 4 | 0x00, 0x00, 0x06, 0x07, 0x07, 0xE6, 0x33, 0x01, 0xE0, 0x7C, 0x06, 0x43, 5 | 0x33, 0xBF, 0x83, 0x03, 0x00, 0x80, 0x1C, 0x11, 0x10, 0x88, 0x83, 0xB8, 6 | 0xF3, 0xB8, 0x22, 0x21, 0x11, 0x07, 0x00, 0x0F, 0x1F, 0x30, 0x30, 0x38, 7 | 0x7B, 0xDF, 0xCE, 0xFF, 0x7E, 0xFA, 0x80, 0x19, 0x8C, 0xC6, 0x63, 0x18, 8 | 0xC6, 0x31, 0xC6, 0x30, 0x31, 0xC6, 0x31, 0x8C, 0x63, 0x31, 0x98, 0xCC, 9 | 0x40, 0x08, 0x08, 0xFF, 0xFF, 0x38, 0x6C, 0x6C, 0x0C, 0x06, 0x03, 0x1F, 10 | 0xFF, 0xF8, 0xC0, 0x60, 0x30, 0x10, 0x00, 0x36, 0x4C, 0x80, 0xFF, 0xFF, 11 | 0xC0, 0xFC, 0x00, 0x00, 0x0C, 0x03, 0x00, 0xC0, 0x18, 0x06, 0x01, 0x80, 12 | 0x30, 0x0C, 0x03, 0x00, 0x60, 0x18, 0x06, 0x00, 0xC0, 0x30, 0x00, 0x0F, 13 | 0x0F, 0xCC, 0x6C, 0x36, 0x1B, 0x0D, 0x05, 0x86, 0xC3, 0x63, 0x3F, 0x8F, 14 | 0x00, 0x06, 0x1C, 0x3C, 0x6C, 0x0C, 0x0C, 0x08, 0x18, 0x18, 0x18, 0xFE, 15 | 0xFE, 0x07, 0x83, 0xF1, 0x8C, 0x43, 0x00, 0xC0, 0xE0, 0x70, 0x38, 0x38, 16 | 0x1C, 0x6F, 0xF3, 0xFC, 0x1F, 0x1F, 0xC0, 0x60, 0x30, 0x30, 0x70, 0x38, 17 | 0x06, 0x03, 0x03, 0xBF, 0x9F, 0x80, 0x03, 0x07, 0x0B, 0x1B, 0x32, 0x66, 18 | 0xFF, 0xFF, 0x1E, 0x1E, 0x3F, 0x9F, 0x98, 0x0F, 0xC7, 0xF3, 0x18, 0x0C, 19 | 0x06, 0x06, 0x7F, 0x1E, 0x00, 0x07, 0x87, 0xCE, 0x06, 0x06, 0x03, 0xF3, 20 | 0xFD, 0xC6, 0xC3, 0x63, 0xBF, 0x8F, 0x80, 0xFF, 0xFF, 0xC3, 0x06, 0x06, 21 | 0x0C, 0x18, 0x18, 0x30, 0x30, 0x60, 0x1F, 0x1F, 0xDC, 0x6C, 0x36, 0x31, 22 | 0xF1, 0xF8, 0xC6, 0xC3, 0x63, 0xBF, 0x8F, 0x80, 0x1E, 0x3F, 0x33, 0x63, 23 | 0x63, 0x67, 0x7F, 0x3E, 0x06, 0x1C, 0xF8, 0xF0, 0x77, 0x00, 0x00, 0xEE, 24 | 0x1C, 0x70, 0x00, 0x00, 0x03, 0x0C, 0x61, 0x08, 0x00, 0x00, 0xC1, 0xE1, 25 | 0xE1, 0xE0, 0xF0, 0x07, 0x00, 0xF0, 0x0C, 0x7F, 0xDF, 0xF0, 0x00, 0x00, 26 | 0x7F, 0xFF, 0xF0, 0x30, 0x0F, 0x00, 0xE0, 0x1E, 0x07, 0xC7, 0x87, 0x83, 27 | 0x00, 0x7D, 0xFF, 0x18, 0x30, 0xE3, 0x9C, 0x30, 0x01, 0xC3, 0x80, 0x0F, 28 | 0x0F, 0xCC, 0x6C, 0x36, 0x72, 0x79, 0x7D, 0xB6, 0xDA, 0x6F, 0xB3, 0xD8, 29 | 0x0C, 0x07, 0xE1, 0xE0, 0x0F, 0x83, 0xF0, 0x1E, 0x03, 0xC0, 0xD8, 0x31, 30 | 0x87, 0xF1, 0xFE, 0x30, 0xDF, 0x3F, 0xC7, 0x80, 0x3F, 0xC7, 0xFC, 0x61, 31 | 0x8C, 0x31, 0xFC, 0x3F, 0x84, 0x19, 0x83, 0x30, 0x6F, 0xFB, 0xFE, 0x00, 32 | 0x0F, 0xF1, 0xFF, 0x30, 0x66, 0x06, 0x60, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 33 | 0xE0, 0xC7, 0xF8, 0x3F, 0x00, 0x3F, 0x87, 0xF8, 0x63, 0x8C, 0x31, 0x06, 34 | 0x60, 0xCC, 0x19, 0x86, 0x31, 0xCF, 0xF3, 0xF8, 0x00, 0x3F, 0xE3, 0xFE, 35 | 0x18, 0x61, 0xB6, 0x1F, 0x01, 0xF0, 0x32, 0x03, 0x00, 0x30, 0x4F, 0xFC, 36 | 0xFF, 0xC0, 0x3F, 0xF3, 0xFE, 0x18, 0x61, 0xB6, 0x1F, 0x03, 0xF0, 0x32, 37 | 0x03, 0x00, 0x30, 0x0F, 0xC0, 0xFC, 0x00, 0x0F, 0xE3, 0xFC, 0xC1, 0x30, 38 | 0x06, 0x01, 0x80, 0x31, 0xF6, 0x3E, 0xE1, 0x9F, 0xF0, 0xF8, 0x00, 0x1E, 39 | 0xF3, 0xCF, 0x18, 0x61, 0x84, 0x10, 0xC3, 0xFC, 0x3F, 0xC3, 0x08, 0x31, 40 | 0x8F, 0xBC, 0xFB, 0xC0, 0x3F, 0xCF, 0xF0, 0x60, 0x10, 0x0C, 0x03, 0x00, 41 | 0xC0, 0x20, 0x18, 0x3F, 0xCF, 0xF0, 0x07, 0xF0, 0x7F, 0x00, 0x80, 0x18, 42 | 0x01, 0x80, 0x18, 0x61, 0x84, 0x10, 0xC3, 0x0F, 0xE0, 0x7C, 0x00, 0x3E, 43 | 0xE7, 0xFC, 0x66, 0x0D, 0x81, 0x60, 0x7C, 0x0E, 0xC1, 0x98, 0x31, 0x1F, 44 | 0x3B, 0xE7, 0x00, 0x3F, 0x07, 0xE0, 0x30, 0x06, 0x00, 0xC0, 0x10, 0x06, 45 | 0x00, 0xC3, 0x18, 0x6F, 0xFB, 0xFF, 0x00, 0x38, 0x39, 0xC3, 0xC7, 0x3C, 46 | 0x79, 0xE3, 0xDA, 0x1F, 0xF0, 0x9D, 0x8C, 0xCC, 0x60, 0x67, 0xCF, 0x3C, 47 | 0x78, 0x3C, 0xF9, 0xE7, 0x87, 0x18, 0x3C, 0xC1, 0x66, 0x1B, 0xB0, 0xCD, 48 | 0x06, 0x78, 0x31, 0xC3, 0xCE, 0x3E, 0x30, 0x0F, 0x0F, 0xE7, 0x1D, 0x83, 49 | 0xC0, 0xF0, 0x3C, 0x0F, 0x06, 0xE3, 0x9F, 0xC3, 0xC0, 0x3F, 0xC7, 0xFC, 50 | 0x61, 0x8C, 0x31, 0x8E, 0x3F, 0x87, 0xE1, 0x80, 0x30, 0x0F, 0xC3, 0xF0, 51 | 0x00, 0x0F, 0x0F, 0xE7, 0x1D, 0x83, 0xC0, 0xF0, 0x3C, 0x0F, 0x06, 0xE3, 52 | 0x1F, 0xC3, 0xC0, 0x80, 0x7F, 0x3F, 0xC0, 0x3F, 0xC3, 0xFE, 0x18, 0x61, 53 | 0x86, 0x10, 0xE3, 0xFC, 0x3F, 0x83, 0x18, 0x31, 0xCF, 0x8F, 0xF8, 0x70, 54 | 0x1E, 0xCF, 0xF7, 0x19, 0x80, 0x70, 0x1F, 0x81, 0xF3, 0x0C, 0xC3, 0x3F, 55 | 0x8B, 0xC0, 0x7F, 0xCF, 0xF9, 0x93, 0x66, 0x60, 0xC0, 0x18, 0x02, 0x00, 56 | 0xC0, 0x18, 0x0F, 0xC1, 0xF8, 0x00, 0xF9, 0xFF, 0x7D, 0x83, 0x30, 0x64, 57 | 0x09, 0x83, 0x30, 0x66, 0x0C, 0xE3, 0x0F, 0xC0, 0xF0, 0x00, 0xF9, 0xFE, 58 | 0x3D, 0x83, 0x30, 0xC6, 0x30, 0xE6, 0x0D, 0x81, 0xB0, 0x3C, 0x07, 0x00, 59 | 0x60, 0x00, 0xF9, 0xFF, 0x3D, 0x83, 0x36, 0x64, 0xC8, 0xBF, 0x35, 0xE7, 60 | 0xB8, 0xE7, 0x1C, 0xE3, 0x18, 0x00, 0x3C, 0xF3, 0xCF, 0x1C, 0xC0, 0xD8, 61 | 0x0F, 0x00, 0x60, 0x0F, 0x01, 0xB8, 0x31, 0x8F, 0x3C, 0xF3, 0xC0, 0x79, 62 | 0xEE, 0x38, 0xC6, 0x19, 0x81, 0xE0, 0x38, 0x06, 0x00, 0xC0, 0x18, 0x0F, 63 | 0xC3, 0xF8, 0x00, 0x3F, 0xCF, 0xF3, 0x18, 0xCC, 0x06, 0x03, 0x01, 0x80, 64 | 0xC6, 0x61, 0xBF, 0xCF, 0xF0, 0x1E, 0x3C, 0xC1, 0x83, 0x06, 0x08, 0x30, 65 | 0x60, 0xC1, 0x06, 0x0F, 0x1E, 0x00, 0x06, 0x31, 0x86, 0x31, 0x8C, 0x31, 66 | 0x8C, 0x61, 0x8C, 0x60, 0x1E, 0x78, 0x30, 0x60, 0xC1, 0x86, 0x0C, 0x18, 67 | 0x30, 0x41, 0x8F, 0x1E, 0x00, 0x08, 0x1C, 0x3C, 0x76, 0xE7, 0xC3, 0x7F, 68 | 0xFF, 0xFC, 0x88, 0x80, 0x0F, 0x07, 0xE1, 0xF9, 0xFE, 0xE3, 0x30, 0xCF, 69 | 0xFD, 0xFF, 0x38, 0x07, 0x00, 0x60, 0x0F, 0xC1, 0xFC, 0x71, 0xCC, 0x19, 70 | 0x83, 0x30, 0xDF, 0xFB, 0xBC, 0x00, 0x1F, 0xCF, 0xF6, 0x1B, 0x00, 0xC0, 71 | 0x30, 0x0F, 0xF1, 0xF8, 0x01, 0xE0, 0x38, 0x03, 0x0F, 0x63, 0xFC, 0xC3, 72 | 0x30, 0x66, 0x0C, 0xC3, 0x9F, 0xF9, 0xF7, 0x00, 0x1F, 0x1F, 0xD8, 0x3F, 73 | 0xFF, 0xFE, 0x1B, 0xFC, 0xF8, 0x07, 0xC3, 0xF1, 0x81, 0xFE, 0x7F, 0x84, 74 | 0x03, 0x00, 0xC0, 0x30, 0x3F, 0x8F, 0xE0, 0x1E, 0xE7, 0xFD, 0x86, 0x60, 75 | 0xCC, 0x19, 0xC6, 0x3F, 0xC1, 0xD8, 0x03, 0x00, 0xE1, 0xF8, 0x3E, 0x00, 76 | 0x38, 0x1E, 0x01, 0x00, 0xDC, 0x3F, 0x8C, 0x62, 0x19, 0x84, 0x63, 0x3D, 77 | 0xFF, 0x7C, 0x06, 0x03, 0x00, 0x03, 0xC3, 0xE0, 0x20, 0x30, 0x18, 0x0C, 78 | 0x3F, 0xFF, 0xE0, 0x01, 0x81, 0x80, 0x07, 0xF3, 0xF8, 0x0C, 0x04, 0x06, 79 | 0x03, 0x01, 0x80, 0xC0, 0x40, 0x67, 0xE3, 0xE0, 0x38, 0x0E, 0x01, 0x80, 80 | 0x4F, 0x37, 0xCF, 0x83, 0xC0, 0xF0, 0x26, 0x39, 0xEE, 0x78, 0x1F, 0x0F, 81 | 0x01, 0x80, 0xC0, 0x60, 0x20, 0x30, 0x18, 0x0C, 0x3F, 0xFF, 0xE0, 0x7E, 82 | 0xE7, 0xFF, 0x33, 0x32, 0x63, 0x66, 0x36, 0x62, 0xF7, 0x7F, 0x67, 0x77, 83 | 0x8F, 0xF8, 0xC3, 0x10, 0x66, 0x08, 0xC3, 0x3C, 0x7F, 0x8F, 0x1F, 0x0F, 84 | 0xE6, 0x1F, 0x03, 0xC0, 0xF8, 0x67, 0xF0, 0xF8, 0x3F, 0xE3, 0xFF, 0x1C, 85 | 0x31, 0x83, 0x18, 0x31, 0x86, 0x3F, 0xE3, 0x78, 0x30, 0x03, 0x00, 0xFC, 86 | 0x0F, 0x80, 0x1E, 0xEF, 0xFD, 0x86, 0x60, 0xCC, 0x19, 0xC7, 0x3F, 0xE1, 87 | 0xE8, 0x03, 0x00, 0x60, 0x3E, 0x07, 0xC0, 0x39, 0xDF, 0xF1, 0xC0, 0x60, 88 | 0x10, 0x0C, 0x0F, 0xF3, 0xF8, 0x1F, 0x7F, 0x63, 0x7E, 0x1F, 0xC3, 0xFE, 89 | 0xFC, 0x10, 0x08, 0x0C, 0x1F, 0xEF, 0xF1, 0x80, 0x80, 0xC0, 0x60, 0x3F, 90 | 0x8F, 0x80, 0xF3, 0xFC, 0xF6, 0x09, 0x86, 0x61, 0x98, 0xE7, 0xF8, 0xFE, 91 | 0xFB, 0xFF, 0x7C, 0xC6, 0x19, 0x83, 0x60, 0x6C, 0x07, 0x00, 0xC0, 0xF1, 92 | 0xFE, 0x3D, 0xB3, 0x37, 0xC7, 0xF8, 0xEE, 0x1D, 0xC3, 0x30, 0x79, 0xEF, 93 | 0x38, 0xEE, 0x0F, 0x01, 0xE0, 0x6E, 0x3C, 0xE7, 0xBC, 0x3C, 0xF3, 0x8F, 94 | 0x18, 0xC1, 0x9C, 0x19, 0x81, 0xF0, 0x0E, 0x00, 0xE0, 0x0C, 0x01, 0x80, 95 | 0xFC, 0x0F, 0xC0, 0x7F, 0xBF, 0xD9, 0xC1, 0x83, 0x83, 0x1B, 0xFD, 0xFE, 96 | 0x06, 0x1C, 0x60, 0xC1, 0x86, 0x3C, 0x70, 0x30, 0x41, 0x83, 0x07, 0x06, 97 | 0x00, 0x33, 0x32, 0x26, 0x66, 0x44, 0xCC, 0xC8, 0x0C, 0x0E, 0x04, 0x0C, 98 | 0x0C, 0x0C, 0x0F, 0x0F, 0x18, 0x18, 0x10, 0x30, 0xF0, 0xE0, 0x38, 0x7C, 99 | 0xF7, 0xC1, 0xC0}; 100 | 101 | const GFXglyph FreeMonoBoldOblique9pt7bGlyphs[] PROGMEM = { 102 | {0, 0, 0, 11, 0, 1}, // 0x20 ' ' 103 | {0, 5, 11, 11, 4, -10}, // 0x21 '!' 104 | {7, 7, 5, 11, 4, -10}, // 0x22 '"' 105 | {12, 9, 12, 11, 2, -10}, // 0x23 '#' 106 | {26, 9, 14, 11, 2, -11}, // 0x24 '$' 107 | {42, 9, 11, 11, 2, -10}, // 0x25 '%' 108 | {55, 8, 10, 11, 2, -9}, // 0x26 '&' 109 | {65, 2, 5, 11, 6, -10}, // 0x27 ''' 110 | {67, 5, 14, 11, 5, -10}, // 0x28 '(' 111 | {76, 5, 14, 11, 2, -10}, // 0x29 ')' 112 | {85, 8, 7, 11, 3, -10}, // 0x2A '*' 113 | {92, 9, 9, 11, 2, -8}, // 0x2B '+' 114 | {103, 4, 5, 11, 2, -1}, // 0x2C ',' 115 | {106, 9, 2, 11, 2, -5}, // 0x2D '-' 116 | {109, 3, 2, 11, 4, -1}, // 0x2E '.' 117 | {110, 11, 15, 11, 1, -12}, // 0x2F '/' 118 | {131, 9, 12, 11, 2, -11}, // 0x30 '0' 119 | {145, 8, 12, 11, 2, -11}, // 0x31 '1' 120 | {157, 10, 12, 11, 1, -11}, // 0x32 '2' 121 | {172, 9, 12, 11, 2, -11}, // 0x33 '3' 122 | {186, 8, 10, 11, 2, -9}, // 0x34 '4' 123 | {196, 9, 11, 11, 3, -10}, // 0x35 '5' 124 | {209, 9, 12, 11, 3, -11}, // 0x36 '6' 125 | {223, 8, 11, 11, 3, -10}, // 0x37 '7' 126 | {234, 9, 12, 11, 2, -11}, // 0x38 '8' 127 | {248, 8, 12, 11, 3, -11}, // 0x39 '9' 128 | {260, 4, 8, 11, 4, -7}, // 0x3A ':' 129 | {264, 6, 11, 11, 2, -7}, // 0x3B ';' 130 | {273, 10, 8, 11, 2, -8}, // 0x3C '<' 131 | {283, 10, 6, 11, 1, -7}, // 0x3D '=' 132 | {291, 10, 8, 11, 1, -8}, // 0x3E '>' 133 | {301, 7, 11, 11, 4, -10}, // 0x3F '?' 134 | {311, 9, 15, 11, 2, -11}, // 0x40 '@' 135 | {328, 11, 11, 11, 0, -10}, // 0x41 'A' 136 | {344, 11, 11, 11, 0, -10}, // 0x42 'B' 137 | {360, 12, 11, 11, 1, -10}, // 0x43 'C' 138 | {377, 11, 11, 11, 0, -10}, // 0x44 'D' 139 | {393, 12, 11, 11, 0, -10}, // 0x45 'E' 140 | {410, 12, 11, 11, 0, -10}, // 0x46 'F' 141 | {427, 11, 11, 11, 1, -10}, // 0x47 'G' 142 | {443, 12, 11, 11, 0, -10}, // 0x48 'H' 143 | {460, 10, 11, 11, 1, -10}, // 0x49 'I' 144 | {474, 12, 11, 11, 0, -10}, // 0x4A 'J' 145 | {491, 11, 11, 11, 0, -10}, // 0x4B 'K' 146 | {507, 11, 11, 11, 0, -10}, // 0x4C 'L' 147 | {523, 13, 11, 11, 0, -10}, // 0x4D 'M' 148 | {541, 13, 11, 11, 0, -10}, // 0x4E 'N' 149 | {559, 10, 11, 11, 1, -10}, // 0x4F 'O' 150 | {573, 11, 11, 11, 0, -10}, // 0x50 'P' 151 | {589, 10, 14, 11, 1, -10}, // 0x51 'Q' 152 | {607, 12, 11, 11, 0, -10}, // 0x52 'R' 153 | {624, 10, 11, 11, 2, -10}, // 0x53 'S' 154 | {638, 11, 11, 11, 1, -10}, // 0x54 'T' 155 | {654, 11, 11, 11, 1, -10}, // 0x55 'U' 156 | {670, 11, 11, 11, 1, -10}, // 0x56 'V' 157 | {686, 11, 11, 11, 1, -10}, // 0x57 'W' 158 | {702, 12, 11, 11, 0, -10}, // 0x58 'X' 159 | {719, 11, 11, 11, 1, -10}, // 0x59 'Y' 160 | {735, 10, 11, 11, 1, -10}, // 0x5A 'Z' 161 | {749, 7, 14, 11, 4, -10}, // 0x5B '[' 162 | {762, 5, 15, 11, 4, -12}, // 0x5C '\' 163 | {772, 7, 14, 11, 2, -10}, // 0x5D ']' 164 | {785, 8, 6, 11, 3, -11}, // 0x5E '^' 165 | {791, 11, 2, 11, -1, 3}, // 0x5F '_' 166 | {794, 3, 3, 11, 5, -11}, // 0x60 '`' 167 | {796, 10, 8, 11, 1, -7}, // 0x61 'a' 168 | {806, 11, 11, 11, 0, -10}, // 0x62 'b' 169 | {822, 10, 8, 11, 1, -7}, // 0x63 'c' 170 | {832, 11, 11, 11, 1, -10}, // 0x64 'd' 171 | {848, 9, 8, 11, 1, -7}, // 0x65 'e' 172 | {857, 10, 11, 11, 2, -10}, // 0x66 'f' 173 | {871, 11, 12, 11, 1, -7}, // 0x67 'g' 174 | {888, 10, 11, 11, 1, -10}, // 0x68 'h' 175 | {902, 9, 11, 11, 1, -10}, // 0x69 'i' 176 | {915, 9, 15, 11, 1, -10}, // 0x6A 'j' 177 | {932, 10, 11, 11, 1, -10}, // 0x6B 'k' 178 | {946, 9, 11, 11, 1, -10}, // 0x6C 'l' 179 | {959, 12, 8, 11, 0, -7}, // 0x6D 'm' 180 | {971, 11, 8, 11, 1, -7}, // 0x6E 'n' 181 | {982, 10, 8, 11, 1, -7}, // 0x6F 'o' 182 | {992, 12, 12, 11, -1, -7}, // 0x70 'p' 183 | {1010, 11, 12, 11, 1, -7}, // 0x71 'q' 184 | {1027, 10, 8, 11, 1, -7}, // 0x72 'r' 185 | {1037, 8, 8, 11, 2, -7}, // 0x73 's' 186 | {1045, 9, 11, 11, 1, -10}, // 0x74 't' 187 | {1058, 10, 8, 11, 1, -7}, // 0x75 'u' 188 | {1068, 11, 8, 11, 1, -7}, // 0x76 'v' 189 | {1079, 11, 8, 11, 1, -7}, // 0x77 'w' 190 | {1090, 11, 8, 11, 1, -7}, // 0x78 'x' 191 | {1101, 12, 12, 11, 0, -7}, // 0x79 'y' 192 | {1119, 9, 8, 11, 2, -7}, // 0x7A 'z' 193 | {1128, 7, 14, 11, 3, -10}, // 0x7B '{' 194 | {1141, 4, 14, 11, 4, -10}, // 0x7C '|' 195 | {1148, 8, 14, 11, 2, -10}, // 0x7D '}' 196 | {1162, 9, 4, 11, 2, -6}}; // 0x7E '~' 197 | 198 | const GFXfont FreeMonoBoldOblique9pt7b PROGMEM = { 199 | (uint8_t *)FreeMonoBoldOblique9pt7bBitmaps, 200 | (GFXglyph *)FreeMonoBoldOblique9pt7bGlyphs, 0x20, 0x7E, 18}; 201 | 202 | // Approx. 1839 bytes 203 | --------------------------------------------------------------------------------