From 437a0ed2241e60405bfbee32babeb8b87a7db1b9 Mon Sep 17 00:00:00 2001 From: Thomas Maier-Komor Date: Sun, 3 Dec 2023 23:07:39 +0100 Subject: [PATCH] release R2311 --- ChangeLog | 13 + README.md | 3 + components/actions/actions.cpp | 1 + components/env/env.cpp | 12 +- components/event/event.cpp | 4 +- components/logging/logging.c | 20 +- components/logging/modules.c | 142 +- components/logging/modules.h | 8 +- components/streams/estring.h | 18 +- components/streams/stream.cpp | 22 + components/streams/stream.h | 1 + components/term/jtag_terminal.cpp | 8 +- components/term/terminal.cpp | 38 + components/term/terminal.h | 2 + components/wfc/hwcfg_esp32.cpp | 2495 ++++--- components/wfc/hwcfg_esp32.h | 1430 +++- components/wfc/hwcfg_esp8266.cpp | 2044 ++++-- components/wfc/hwcfg_esp8266.h | 1467 +++- components/wfc/hwcfg_esp8285.cpp | 2032 ++++-- components/wfc/hwcfg_esp8285.h | 1466 +++- components/wfc/hwcfg_pc.cpp | 2678 ++++++-- components/wfc/hwcfg_pc.h | 1481 +++- components/wfc/swcfg_esp32.cpp | 58 +- components/wfc/swcfg_esp32.h | 6 +- components/wfc/swcfg_esp8266.cpp | 58 +- components/wfc/swcfg_esp8266.h | 6 +- components/wfc/swcfg_esp8285.cpp | 58 +- components/wfc/swcfg_esp8285.h | 6 +- components/wfc/swcfg_pc.cpp | 60 +- components/wfc/swcfg_pc.h | 6 +- components/wfc/wfccore_esp32.cpp | 6 +- components/wfc/wfccore_esp32.h | 6 +- components/wfc/wfccore_esp8266.cpp | 6 +- components/wfc/wfccore_esp8266.h | 6 +- components/wfc/wfccore_esp8285.cpp | 6 +- components/wfc/wfccore_esp8285.h | 6 +- components/wfc/wfccore_pc.cpp | 6 +- components/wfc/wfccore_pc.h | 6 +- drv/display/CMakeLists.txt | 3 +- drv/display/FreeMono12pt7b.h | 10 +- drv/display/FreeMono18pt7b.h | 10 +- drv/display/FreeMono24pt7b.h | 10 +- drv/display/FreeMono9pt7b.h | 10 +- drv/display/FreeSans12pt7b.h | 10 +- drv/display/FreeSans9pt7b.h | 8 +- drv/display/Org_01.h | 6 +- drv/display/TomThumb.h | 4 +- drv/display/display.cpp | 93 +- drv/display/display.h | 19 +- drv/display/font.h | 20 +- drv/display/font6x8_ssd130x.c | 6 +- drv/display/fonts.c | 7465 ++++++++++++++++++++ drv/display/fonts.h | 9 +- drv/display/fonts_byte_column_major.c | 8961 ------------------------- drv/display/fonts_row_major.c | 5120 -------------- drv/display/glyphs.c | 1290 ---- drv/display/glyphs.h | 30 +- drv/display/opensanslight-10.h | 8 +- drv/display/opensanslight-12.h | 8 +- drv/display/opensanslight-14.h | 8 +- drv/display/opensanslight-16.h | 24 +- drv/display/ssd130x.cpp | 163 +- drv/display/ssd130x.h | 20 +- drv/i2c/CMakeLists.txt | 1 + drv/i2c/bh1750.cpp | 3 +- drv/i2c/bmp388.cpp | 49 +- drv/i2c/bmp388.h | 4 +- drv/i2c/bmx.cpp | 1 + drv/i2c/bmx.h | 6 +- drv/i2c/bq25601d.cpp | 633 ++ drv/i2c/bq25601d.h | 65 + drv/i2c/ccs811b.cpp | 9 +- drv/i2c/i2cdrv.cpp | 29 + drv/i2c/ina2xx.cpp | 18 +- drv/i2c/opt3001.cpp | 13 +- drv/i2c/sgp30.cpp | 15 +- drv/i2c/sgp30.h | 2 +- drv/i2c/sh1106.cpp | 190 +- drv/i2c/sh1106.h | 6 - drv/i2c/si7021.cpp | 10 + drv/i2c/ssd1306.cpp | 18 +- drv/spi/ili9341.cpp | 35 +- drv/spi/ili9341.h | 6 +- drv/spi/ssd1309.cpp | 7 +- drv/spi/sx1276.cpp | 3 +- drv/spi/xpt2046.cpp | 31 +- drv/xio/CMakeLists.txt | 2 +- drv/xio/buzzer.cpp | 274 + drv/xio/buzzer.h | 36 + drv/xio/charger.h | 35 + drv/xio/esp32-c3_io.cpp | 48 +- drv/xio/esp32_io.cpp | 90 +- drv/xio/esp8266_io.cpp | 23 + drv/xio/xio.cpp | 3 +- drv/xio/xio.h | 5 +- hwcfg.wfc | 33 +- main/CMakeLists.txt | 1 + main/Kconfig | 147 +- main/adc.cpp | 147 +- main/adc.h | 31 + main/console.cpp | 15 +- main/dimmer.cpp | 7 +- main/ftpd.cpp | 2 - main/gpios.cpp | 24 +- main/leds.cpp | 4 +- main/luaext.cpp | 1 + main/mqtt.cpp | 52 +- main/screen.cpp | 257 +- main/screen.h | 3 + main/settings.cpp | 7 +- main/shell.cpp | 84 +- main/shell.h | 2 +- main/spi.cpp | 5 +- main/startup.cpp | 15 +- main/statemach.cpp | 3 +- main/usb.cpp | 171 +- patches/idf-esp8266-v3.3.diff | 14 + projects/esp32-c3_4m | 24 +- projects/esp32-c3_4m_dev | 22 +- projects/esp32-c6_4m | 25 +- projects/esp32-s2_4m | 22 +- projects/esp32-s3_4m | 113 +- projects/esp32-s3_4m_dev | 107 +- projects/esp32-s3_8m | 22 +- projects/esp32-s3_8m_dev | 22 +- projects/esp32_4m | 24 +- projects/esp32_4m_dev | 1235 ++-- projects/esp32_4m_min | 1 + projects/esp32_8m_full | 28 +- projects/esp8266_2m | 20 +- projects/esp8266_4m | 20 +- projects/esp8266_4m_full | 24 +- projects/esp8266_4m_min | 6 +- projects/esp8285 | 6 +- setupenv.sh | 18 +- 135 files changed, 22378 insertions(+), 21062 deletions(-) create mode 100644 drv/display/fonts.c delete mode 100644 drv/display/fonts_byte_column_major.c delete mode 100644 drv/display/fonts_row_major.c delete mode 100644 drv/display/glyphs.c create mode 100644 drv/i2c/bq25601d.cpp create mode 100644 drv/i2c/bq25601d.h create mode 100644 drv/xio/buzzer.cpp create mode 100644 drv/xio/buzzer.h create mode 100644 drv/xio/charger.h create mode 100644 main/adc.h diff --git a/ChangeLog b/ChangeLog index 58dd18f..fdeb6ad 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +R2311: +====== +- added driver foc.config_init_high()r BQ25601D charging IC +- added BMP388 +- added buzzer driver +- added USB-C interface driver for CC1/CC2 power detection +- added SPI per device bus frequency setting +- added LED init level support +- update to head of ESP8266 IDF v3.3 +- screen/display caching +- font unifications and optimization +- many bug-fixes (ADC, XIO, SM, SSD130x, display, ...) + R2310: ====== - fixes for SGP30: re-initialize after error, false detection diff --git a/README.md b/README.md index e443277..8d8ebae 100644 --- a/README.md +++ b/README.md @@ -483,6 +483,9 @@ action. Parasite power is supported and is enabled if you configure the related gpio. +1-Wire does not work when the CPU runs in a lower frequency mode, as an +internal ROM function does not adjust to that alternate frequency. + Lua support: ============ diff --git a/components/actions/actions.cpp b/components/actions/actions.cpp index d611652..c7bd024 100644 --- a/components/actions/actions.cpp +++ b/components/actions/actions.cpp @@ -77,6 +77,7 @@ void Action::activate(void *a) if (arg != 0) a = arg; assert(func); + log_dbug(TAG,"activate %s",name); uint64_t st = esp_timer_get_time(); func(a); uint64_t end = esp_timer_get_time(); diff --git a/components/env/env.cpp b/components/env/env.cpp index 34e477b..f34ec7f 100644 --- a/components/env/env.cpp +++ b/components/env/env.cpp @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +#include "sdkconfig.h" + #include "env.h" #include "stream.h" @@ -85,6 +87,7 @@ void EnvBool::writeValue(stream &o) const void EnvNumber::set(float v) { m_value = v; +#ifdef CONFIG_THRESHOLDS if (m_evhi) { if (m_tst <= 0) { if (v > m_high) { @@ -100,19 +103,24 @@ void EnvNumber::set(float v) } } } +#endif } int EnvNumber::setThresholds(float l, float h, const char *n) { +#ifdef CONFIG_THRESHOLDS if (l+FLT_EPSILON >= h) return 1; if (m_evhi == 0) { - m_evhi = event_register(n ? n : m_name,"`high"); - m_evlo = event_register(n ? n : m_name,"`low"); + if (n == 0) + n = concat(getParent()->name(),m_name); + m_evhi = event_register(n,"`high"); + m_evlo = event_register(n,"`low"); } m_low = l; m_high = h; +#endif return 0; } diff --git a/components/event/event.cpp b/components/event/event.cpp index b466f44..24a804b 100644 --- a/components/event/event.cpp +++ b/components/event/event.cpp @@ -373,7 +373,7 @@ void event_trigger_arg(event_t id, void *arg) } -void event_isr_trigger(event_t id) +void IRAM_ATTR event_isr_trigger(event_t id) { // ! don't log from ISR if (id != 0) { @@ -385,7 +385,7 @@ void event_isr_trigger(event_t id) } -void event_isr_trigger_arg(event_t id, void *arg) +void IRAM_ATTR event_isr_trigger_arg(event_t id, void *arg) { // ! don't log from ISR if (id != 0) { diff --git a/components/logging/logging.c b/components/logging/logging.c index 43852c4..26bee30 100644 --- a/components/logging/logging.c +++ b/components/logging/logging.c @@ -36,7 +36,7 @@ #include #endif -#ifdef CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG +#if defined CONFIG_USB_CONSOLE || defined CONFIG_USB_DIAGLOG #include #endif @@ -91,6 +91,7 @@ extern void log_usb(const char *, size_t n); +uint8_t UsbDiag = 1; static SemaphoreHandle_t UartLock; #if CONFIG_CONSOLE_UART_NONE != 1 static uart_port_t LogUart = (uart_port_t) CONFIG_CONSOLE_UART_NUM; @@ -131,7 +132,7 @@ void con_print(const char *str) xSemaphoreGive(UartLock); } #endif -#if defined CONFIG_USB_DIAGLOG && (defined CONFIG_IDF_TARGET_ESP32C3 || defined CONFIG_IDF_TARGET_ESP32S3) +#if defined CONFIG_USB_DIAGLOG // will block until a jtag connection is present // therefore, max delay: 10ms usb_serial_jtag_write_bytes(str,s,10); @@ -166,7 +167,7 @@ void con_printv(const char *f, va_list val) xSemaphoreGive(UartLock); } #endif -#ifdef CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG +#ifdef CONFIG_USB_DIAGLOG usb_serial_jtag_write_bytes(buf,n,portMAX_DELAY); #endif } @@ -182,7 +183,7 @@ void con_write(const char *str, ssize_t s) xSemaphoreGive(UartLock); } #endif -#ifdef CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG +#ifdef CONFIG_USB_DIAGLOG usb_serial_jtag_write_bytes(str,s,portMAX_DELAY); #endif } @@ -205,7 +206,7 @@ void log_setup() #endif #endif -#ifdef CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG +#if defined CONFIG_USB_DIAGLOG || defined CONFIG_USB_CONSOLE usb_serial_jtag_driver_config_t cfg; bzero(&cfg,sizeof(cfg)); cfg.rx_buffer_size = 256; @@ -301,7 +302,9 @@ void log_common(log_level_t l, logmod_t m, const char *f, va_list val) if (pdTRUE != xSemaphoreTake(UartLock,MUTEX_ABORT_TIMEOUT)) abort_on_mutex(UartLock,__BASE_FILE__); uart_write_bytes((uart_port_t)LogUart,buf,s); -// if (l <= ll_warn) +#ifndef CONFIG_DEVEL + if (l <= ll_warn) +#endif uart_wait_tx_done((uart_port_t)LogUart,portMAX_DELAY); xSemaphoreGive(UartLock); } @@ -316,8 +319,9 @@ void log_common(log_level_t l, logmod_t m, const char *f, va_list val) if ((l != ll_local) && (m != MODULE_LOG) && (m != MODULE_LWTCP)) log_syslog(l,m,buf+p,s-p-2,&tv); #endif -#ifdef CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG - usb_serial_jtag_write_bytes(buf,s,0); +#ifdef CONFIG_USB_DIAGLOG + if (UsbDiag) + usb_serial_jtag_write_bytes(buf,s,0); #endif #if 0 // defined CONFIG_USB_CONSOLE && defined CONFIG_TINYUSB_CDC_ENABLED // Logging to CDC would only work if driver is ready. diff --git a/components/logging/modules.c b/components/logging/modules.c index c47dc76..7376c3b 100644 --- a/components/logging/modules.c +++ b/components/logging/modules.c @@ -19,7 +19,7 @@ #include "modules.h" const char ModNames[] = - "\0action\0adc\0alarms\0apds\0bh1750\0bmx\0button\0cam\0ccs811b\0cfg\0con\0cyclic\0dht\0dim\0disp\0ds18b20\0event\0fs\0ftpd\0gpio\0hcsr04\0hd44780u\0hdc1000\0hlw8012\0ht16k33\0http\0i2c\0ili9341\0ina219\0influx\0init\0led\0ledc\0log\0lua\0lwtcp\0max7219\0mcp230xx\0mqtt\0nightsky\0ns\0nvm\0opt3001\0ota\0owb\0pca9685\0pcf8574\0relay\0rgbleds\0romfs\0screen\0sgp30\0shell\0si7021\0sm\0sntp\0spi\0ssd130x\0sx1276\0tca9555\0telnet\0ti\0timefuse\0tlc5916\0tlc5947\0tp\0uart\0udns\0udpctrl\0usb\0wlan\0ws2812\0www\0xio\0xpt2046\0"; + "\0action\0adc\0alarms\0apds\0bh1750\0bmx\0bq25\0button\0buzzer\0cam\0ccs811b\0cfg\0con\0cyclic\0dht\0dim\0disp\0ds18b20\0event\0fs\0ftpd\0gpio\0hcsr04\0hd44780u\0hdc1000\0hlw8012\0ht16k33\0http\0i2c\0ili9341\0ina219\0influx\0init\0led\0ledc\0log\0lua\0lwtcp\0max7219\0mcp230xx\0mqtt\0nightsky\0ns\0nvm\0opt3001\0ota\0owb\0pca9685\0pcf8574\0relay\0rgbleds\0romfs\0screen\0sgp30\0shell\0si7021\0sm\0sntp\0spi\0ssd130x\0sx1276\0tca9555\0telnet\0ti\0timefuse\0tlc5916\0tlc5947\0tp\0uart\0udns\0udpctrl\0usb\0wlan\0ws2812\0www\0xio\0xpt2046\0"; const uint16_t ModNameOff[] = { 0, @@ -29,73 +29,75 @@ const uint16_t ModNameOff[] = { 26, // apds 31, // bh1750 38, // bmx - 42, // button - 49, // cam - 53, // ccs811b - 61, // cfg - 65, // con - 69, // cyclic - 76, // dht - 80, // dim - 84, // disp - 89, // ds18b20 - 97, // event - 103, // fs - 106, // ftpd - 111, // gpio - 116, // hcsr04 - 123, // hd44780u - 132, // hdc1000 - 140, // hlw8012 - 148, // ht16k33 - 156, // http - 161, // i2c - 165, // ili9341 - 173, // ina219 - 180, // influx - 187, // init - 192, // led - 196, // ledc - 201, // log - 205, // lua - 209, // lwtcp - 215, // max7219 - 223, // mcp230xx - 232, // mqtt - 237, // nightsky - 246, // ns - 249, // nvm - 253, // opt3001 - 261, // ota - 265, // owb - 269, // pca9685 - 277, // pcf8574 - 285, // relay - 291, // rgbleds - 299, // romfs - 305, // screen - 312, // sgp30 - 318, // shell - 324, // si7021 - 331, // sm - 334, // sntp - 339, // spi - 343, // ssd130x - 351, // sx1276 - 358, // tca9555 - 366, // telnet - 373, // ti - 376, // timefuse - 385, // tlc5916 - 393, // tlc5947 - 401, // tp - 404, // uart - 409, // udns - 414, // udpctrl - 422, // usb - 426, // wlan - 431, // ws2812 - 438, // www - 442, // xio - 446, // xpt2046 + 42, // bq25 + 47, // button + 54, // buzzer + 61, // cam + 65, // ccs811b + 73, // cfg + 77, // con + 81, // cyclic + 88, // dht + 92, // dim + 96, // disp + 101, // ds18b20 + 109, // event + 115, // fs + 118, // ftpd + 123, // gpio + 128, // hcsr04 + 135, // hd44780u + 144, // hdc1000 + 152, // hlw8012 + 160, // ht16k33 + 168, // http + 173, // i2c + 177, // ili9341 + 185, // ina219 + 192, // influx + 199, // init + 204, // led + 208, // ledc + 213, // log + 217, // lua + 221, // lwtcp + 227, // max7219 + 235, // mcp230xx + 244, // mqtt + 249, // nightsky + 258, // ns + 261, // nvm + 265, // opt3001 + 273, // ota + 277, // owb + 281, // pca9685 + 289, // pcf8574 + 297, // relay + 303, // rgbleds + 311, // romfs + 317, // screen + 324, // sgp30 + 330, // shell + 336, // si7021 + 343, // sm + 346, // sntp + 351, // spi + 355, // ssd130x + 363, // sx1276 + 370, // tca9555 + 378, // telnet + 385, // ti + 388, // timefuse + 397, // tlc5916 + 405, // tlc5947 + 413, // tp + 416, // uart + 421, // udns + 426, // udpctrl + 434, // usb + 438, // wlan + 443, // ws2812 + 450, // www + 454, // xio + 458, // xpt2046 }; diff --git a/components/logging/modules.h b/components/logging/modules.h index b708e57..5aefabf 100644 --- a/components/logging/modules.h +++ b/components/logging/modules.h @@ -35,7 +35,9 @@ typedef enum logmod_e { logmod_apds, logmod_bh1750, logmod_bmx, + logmod_bq25, logmod_button, + logmod_buzzer, logmod_cam, logmod_ccs811b, logmod_cfg, @@ -113,7 +115,9 @@ typedef enum logmod_e { #define MODULE_APDS logmod_apds #define MODULE_BH1750 logmod_bh1750 #define MODULE_BMX logmod_bmx +#define MODULE_BQ25 logmod_bq25 #define MODULE_BUTTON logmod_button +#define MODULE_BUZZER logmod_buzzer #define MODULE_CAM logmod_cam #define MODULE_CCS811B logmod_ccs811b #define MODULE_CFG logmod_cfg @@ -182,8 +186,8 @@ typedef enum logmod_e { #define MODULE_WWW logmod_www #define MODULE_XIO logmod_xio #define MODULE_XPT2046 logmod_xpt2046 -#define MAX_MODULE_ID 75 -#define NUM_MODULES 76 +#define MAX_MODULE_ID 77 +#define NUM_MODULES 78 #ifdef USE_MODULE #define TAG USE_MODULE diff --git a/components/streams/estring.h b/components/streams/estring.h index 0aff0ea..95103d0 100644 --- a/components/streams/estring.h +++ b/components/streams/estring.h @@ -57,12 +57,6 @@ class estring bool operator != (const estring &a) const { return (a.len != len) || (0 != memcmp(str,a.str,len)); } - bool operator == (const char *s) const - { return (str == 0) ? (*s == 0) : (0 == strcmp(str,s)); } - - bool operator != (const char *s) const - { return (str == 0) ? (*s != 0) : (0 != strcmp(str,s)); } - const char *c_str() const { if (str == 0) @@ -103,6 +97,8 @@ class estring friend bool operator <= (const estring &, const char *); friend bool operator > (const estring &, const char *); friend bool operator >= (const estring &, const char *); + friend bool operator == (const estring &, const char *); + friend bool operator != (const estring &, const char *); private: friend struct estring_cmp; @@ -170,4 +166,14 @@ inline bool operator >= (const estring &l, const char *rs) return strcmp(l.str,rs) >= 0; } +inline bool operator == (const estring &l, const char *rs) +{ + return strcmp(l.str,rs) == 0; +} + +inline bool operator != (const estring &l, const char *rs) +{ + return strcmp(l.str,rs) != 0; +} + #endif diff --git a/components/streams/stream.cpp b/components/streams/stream.cpp index 7e6d5c3..10977dd 100644 --- a/components/streams/stream.cpp +++ b/components/streams/stream.cpp @@ -27,6 +27,10 @@ #include +static const char *OnStr[] = { "true","on","yes","enable" }; +static const char *OffStr[] = { "false","off","no","disable" }; + + #ifdef CONFIG_NEWLIB_LIBRARY_LEVEL_NANO char *float_to_str(char *buf, float f) { @@ -84,6 +88,24 @@ size_t chrcntn(const char *s, char c, size_t n) } +int arg_bool(const char *v, bool *b) +{ + for (const char *on : OnStr) { + if (0 == strcasecmp(on,v)) { + *b = true; + return 0; + } + } + for (const char *off : OffStr) { + if (0 == strcasecmp(off,v)) { + *b = false; + return 0; + } + } + return 1; +} + + int stream::print(const char *buf, size_t s) { if (s == 0) { diff --git a/components/streams/stream.h b/components/streams/stream.h index c8a84e7..a1c73db 100644 --- a/components/streams/stream.h +++ b/components/streams/stream.h @@ -207,5 +207,6 @@ class countstream : public stream size_t chrcnt(const char *s, char c); size_t chrcntn(const char *s, char c, size_t n); char *float_to_str(char *buf, float f); +int arg_bool(const char *v, bool *b); #endif diff --git a/components/term/jtag_terminal.cpp b/components/term/jtag_terminal.cpp index fc6462d..2114046 100644 --- a/components/term/jtag_terminal.cpp +++ b/components/term/jtag_terminal.cpp @@ -18,7 +18,7 @@ #include -#if defined CONFIG_IDF_TARGET_ESP32C3 || defined CONFIG_IDF_TARGET_ESP32S3 +#ifdef CONFIG_USB_CONSOLE #include "jtag_terminal.h" #include @@ -32,9 +32,7 @@ using namespace std; JtagTerminal::JtagTerminal(bool crnl) : Terminal(crnl) { -// usb_serial_jtag_driver_config_t cfg = USB_SERIAL_JTAG_DRIVER_CONFIG_DEFAULT(); - usb_serial_jtag_driver_config_t cfg; - bzero(&cfg,sizeof(cfg)); + usb_serial_jtag_driver_config_t cfg = USB_SERIAL_JTAG_DRIVER_CONFIG_DEFAULT(); cfg.rx_buffer_size = 256; cfg.tx_buffer_size = 256; usb_serial_jtag_driver_install(&cfg); @@ -44,7 +42,7 @@ JtagTerminal::JtagTerminal(bool crnl) int JtagTerminal::read(char *buf, size_t s, bool block) { int n = usb_serial_jtag_read_bytes(buf,s,0); - if (n > 0) + if ((n > 0) || (!block)) return n; n = usb_serial_jtag_read_bytes(buf,1,portMAX_DELAY); if (s == 1) diff --git a/components/term/terminal.cpp b/components/term/terminal.cpp index be2994a..3b46805 100644 --- a/components/term/terminal.cpp +++ b/components/term/terminal.cpp @@ -154,6 +154,44 @@ int Terminal::readInput(char *buf, size_t l, bool echo) return x; } + +void Terminal::print_hex(const uint8_t *b, size_t s, size_t off) +{ + const uint8_t *a = b, *e = b + s; + while (a != e) { + char tmp[64], *t = tmp; + t += sprintf(t,"%04x: ",a-b+off); + int i = 0; + while ((a < e) && (i < 16)) { + *t++ = ' '; + if (i == 8) + *t++ = ' '; +#if 0 + uint8_t d = *a; + uint8_t h = d >> 4; + if (h > 9) + *t = 'a' - 10 + h; + else + *t = '0' + h; + ++t; + uint8_t l = d & 0xf; + if (l > 9) + *t = 'a' - 10 + l; + else + *t = '0' + l; + ++t; +#else + t += sprintf(t,"%02x",*a); +#endif + ++i; + ++a; + } + *t = 0; + println(tmp); + } +} + + int Terminal::setPwd(const char *cd) { if (cd == 0) diff --git a/components/term/terminal.h b/components/term/terminal.h index 460b6bb..0e01dc5 100644 --- a/components/term/terminal.h +++ b/components/term/terminal.h @@ -68,6 +68,8 @@ class Terminal : public stream virtual bool isInteractive() const { return true; } + void print_hex(const uint8_t *b, size_t s, size_t off = 0); + protected: const char *m_error = 0; estring m_pwd; diff --git a/components/wfc/hwcfg_esp32.cpp b/components/wfc/hwcfg_esp32.cpp index dfe1542..0cc87bb 100644 --- a/components/wfc/hwcfg_esp32.cpp +++ b/components/wfc/hwcfg_esp32.cpp @@ -1,8 +1,8 @@ /**************************************************************************** * * Code generated by Wire-Format-Compiler (WFC) - * WFC Version: P2304 (hg:456/095c4982cbea) - * WFC is Copyright 2015-2022, Thomas Maier-Komor + * WFC Version: P2304.3 (hg:459/5fefa02bc543) + * WFC is Copyright 2015-2023, Thomas Maier-Komor * * Source Information: * =================== @@ -10,7 +10,7 @@ * Copyright: 2018-2023 * Author : Thomas Maier-Komor * - * Code generated on 2023-10-24, 21:26:41 (CET). + * Code generated on 2023-11-26, 14:29:43 (CET). * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -606,6 +606,12 @@ void SystemConfig::clear() #ifdef CONFIG_USB_CONSOLE m_usb_con = true; #endif // CONFIG_USB_CONSOLE + #ifdef CONFIG_ESP_PHY_ENABLE_USB + m_cc1_gpio = -1; + #endif // CONFIG_ESP_PHY_ENABLE_USB + #ifdef CONFIG_ESP_PHY_ENABLE_USB + m_cc2_gpio = -1; + #endif // CONFIG_ESP_PHY_ENABLE_USB p_validbits = 0; } @@ -627,6 +633,12 @@ void SystemConfig::toASCII(stream &o, size_t indent) const #ifdef CONFIG_USB_CONSOLE ascii_bool(o, indent, "usb_con", m_usb_con); #endif // CONFIG_USB_CONSOLE + #ifdef CONFIG_ESP_PHY_ENABLE_USB + ascii_numeric(o, indent, "cc1_gpio", (signed) m_cc1_gpio); + #endif // CONFIG_ESP_PHY_ENABLE_USB + #ifdef CONFIG_ESP_PHY_ENABLE_USB + ascii_numeric(o, indent, "cc2_gpio", (signed) m_cc2_gpio); + #endif // CONFIG_ESP_PHY_ENABLE_USB --indent; ascii_indent(o,indent); o << '}'; @@ -742,12 +754,36 @@ ssize_t SystemConfig::fromMemory(const void *b, ssize_t s) set_usb_con(*a++); break; #endif // CONFIG_USB_CONSOLE + #ifdef CONFIG_ESP_PHY_ENABLE_USB + case 0x58: // cc1_gpio id 11, type int8_t, coding signed varint + { + varint_t v; + int n = read_varint(a,e-a,&v); + if (n <= 0) + return -12; + a += n; + set_cc1_gpio(varint_sint(v)); + } + break; + #endif // CONFIG_ESP_PHY_ENABLE_USB + #ifdef CONFIG_ESP_PHY_ENABLE_USB + case 0x60: // cc2_gpio id 12, type int8_t, coding signed varint + { + varint_t v; + int n = read_varint(a,e-a,&v); + if (n <= 0) + return -13; + a += n; + set_cc2_gpio(varint_sint(v)); + } + break; + #endif // CONFIG_ESP_PHY_ENABLE_USB default: // unknown field (option unknown=skip) { ssize_t s = skip_content(a,e-a,fid&7); if (s <= 0) - return -12; + return -14; a += s; break; } @@ -755,7 +791,7 @@ ssize_t SystemConfig::fromMemory(const void *b, ssize_t s) } assert((a-(const uint8_t *)b) == s); if (a > e) - return -13; + return -15; return a-(const uint8_t *)b; } @@ -768,13 +804,13 @@ ssize_t SystemConfig::toMemory(uint8_t *b, ssize_t s) const if (!m_manufacturer.empty()) { // 'manufacturer': id=1, encoding=lenpfx, tag=0xa if (a >= e) - return -14; + return -16; *a++ = 0xa; ssize_t manufacturer_s = m_manufacturer.size(); n = write_varint(a,e-a,manufacturer_s); a += n; if ((n <= 0) || ((e-a) < manufacturer_s)) - return -15; + return -17; memcpy(a,m_manufacturer.data(),manufacturer_s); a += manufacturer_s; } @@ -782,13 +818,13 @@ ssize_t SystemConfig::toMemory(uint8_t *b, ssize_t s) const if (!m_board_name.empty()) { // 'board_name': id=2, encoding=lenpfx, tag=0x12 if (a >= e) - return -16; + return -18; *a++ = 0x12; ssize_t board_name_s = m_board_name.size(); n = write_varint(a,e-a,board_name_s); a += n; if ((n <= 0) || ((e-a) < board_name_s)) - return -17; + return -19; memcpy(a,m_board_name.data(),board_name_s); a += board_name_s; } @@ -796,13 +832,13 @@ ssize_t SystemConfig::toMemory(uint8_t *b, ssize_t s) const if (!m_board_rev.empty()) { // 'board_rev': id=3, encoding=lenpfx, tag=0x1a if (a >= e) - return -18; + return -20; *a++ = 0x1a; ssize_t board_rev_s = m_board_rev.size(); n = write_varint(a,e-a,board_rev_s); a += n; if ((n <= 0) || ((e-a) < board_rev_s)) - return -19; + return -21; memcpy(a,m_board_rev.data(),board_rev_s); a += board_rev_s; } @@ -810,46 +846,46 @@ ssize_t SystemConfig::toMemory(uint8_t *b, ssize_t s) const if (m_diag_uart != 0) { // 'diag_uart': id=4, encoding=varint, tag=0x20 if (a >= e) - return -20; + return -22; *a++ = 0x20; n = write_varint(a,e-a,sint_varint(m_diag_uart)); if (n <= 0) - return -21; + return -23; a += n; } // has console_rx? if (0 != (p_validbits & ((uint8_t)1U << 0))) { // 'console_rx': id=5, encoding=varint, tag=0x28 if (a >= e) - return -22; + return -24; *a++ = 0x28; n = write_varint(a,e-a,sint_varint(m_console_rx)); if (n <= 0) - return -23; + return -25; a += n; } // has console_tx? if (0 != (p_validbits & ((uint8_t)1U << 1))) { // 'console_tx': id=6, encoding=varint, tag=0x30 if (a >= e) - return -24; + return -26; *a++ = 0x30; n = write_varint(a,e-a,sint_varint(m_console_tx)); if (n <= 0) - return -25; + return -27; a += n; } // has model_name? if (!m_model_name.empty()) { // 'model_name': id=7, encoding=lenpfx, tag=0x3a if (a >= e) - return -26; + return -28; *a++ = 0x3a; ssize_t model_name_s = m_model_name.size(); n = write_varint(a,e-a,model_name_s); a += n; if ((n <= 0) || ((e-a) < model_name_s)) - return -27; + return -29; memcpy(a,m_model_name.data(),model_name_s); a += model_name_s; } @@ -857,13 +893,13 @@ ssize_t SystemConfig::toMemory(uint8_t *b, ssize_t s) const if (!m_model_number.empty()) { // 'model_number': id=8, encoding=lenpfx, tag=0x42 if (a >= e) - return -28; + return -30; *a++ = 0x42; ssize_t model_number_s = m_model_number.size(); n = write_varint(a,e-a,model_number_s); a += n; if ((n <= 0) || ((e-a) < model_number_s)) - return -29; + return -31; memcpy(a,m_model_number.data(),model_number_s); a += model_number_s; } @@ -872,7 +908,7 @@ ssize_t SystemConfig::toMemory(uint8_t *b, ssize_t s) const if (m_usb_diag != true) { // 'usb_diag': id=9, encoding=8bit, tag=0x4b if (2 > (e-a)) - return -30; + return -32; *a++ = 0x4b; *a++ = m_usb_diag; } @@ -882,11 +918,37 @@ ssize_t SystemConfig::toMemory(uint8_t *b, ssize_t s) const if (m_usb_con != true) { // 'usb_con': id=10, encoding=8bit, tag=0x53 if (2 > (e-a)) - return -31; + return -33; *a++ = 0x53; *a++ = m_usb_con; } #endif // CONFIG_USB_CONSOLE + #ifdef CONFIG_ESP_PHY_ENABLE_USB + // has cc1_gpio? + if (m_cc1_gpio != -1) { + // 'cc1_gpio': id=11, encoding=varint, tag=0x58 + if (a >= e) + return -34; + *a++ = 0x58; + n = write_varint(a,e-a,sint_varint(m_cc1_gpio)); + if (n <= 0) + return -35; + a += n; + } + #endif // CONFIG_ESP_PHY_ENABLE_USB + #ifdef CONFIG_ESP_PHY_ENABLE_USB + // has cc2_gpio? + if (m_cc2_gpio != -1) { + // 'cc2_gpio': id=12, encoding=varint, tag=0x60 + if (a >= e) + return -36; + *a++ = 0x60; + n = write_varint(a,e-a,sint_varint(m_cc2_gpio)); + if (n <= 0) + return -37; + a += n; + } + #endif // CONFIG_ESP_PHY_ENABLE_USB assert(a <= e); return a-b; } @@ -939,6 +1001,18 @@ void SystemConfig::toJSON(stream &json, unsigned indLvl) const json << (m_usb_con ? "true" : "false"); } #endif // CONFIG_USB_CONSOLE + #ifdef CONFIG_ESP_PHY_ENABLE_USB + if (has_cc1_gpio()) { + fsep = json_indent(json,indLvl,fsep,"cc1_gpio"); + json << (int) m_cc1_gpio; + } + #endif // CONFIG_ESP_PHY_ENABLE_USB + #ifdef CONFIG_ESP_PHY_ENABLE_USB + if (has_cc2_gpio()) { + fsep = json_indent(json,indLvl,fsep,"cc2_gpio"); + json << (int) m_cc2_gpio; + } + #endif // CONFIG_ESP_PHY_ENABLE_USB if (fsep == '{') json.put('{'); json.put('\n'); @@ -1001,6 +1075,18 @@ size_t SystemConfig::calcSize() const r += 2; } #endif // CONFIG_USB_CONSOLE + #ifdef CONFIG_ESP_PHY_ENABLE_USB + // optional sint8 cc1_gpio, id 11 + if (m_cc1_gpio != -1) { + r += wiresize_s((varint_t)m_cc1_gpio) + 1 /* tag(cc1_gpio) 0x58 */; + } + #endif // CONFIG_ESP_PHY_ENABLE_USB + #ifdef CONFIG_ESP_PHY_ENABLE_USB + // optional sint8 cc2_gpio, id 12 + if (m_cc2_gpio != -1) { + r += wiresize_s((varint_t)m_cc2_gpio) + 1 /* tag(cc2_gpio) 0x60 */; + } + #endif // CONFIG_ESP_PHY_ENABLE_USB return r; } @@ -1032,6 +1118,14 @@ bool SystemConfig::operator != (const SystemConfig &r) const if (has_usb_con() && (m_usb_con != r.m_usb_con)) return true; #endif // CONFIG_USB_CONSOLE + #ifdef CONFIG_ESP_PHY_ENABLE_USB + if (has_cc1_gpio() && (m_cc1_gpio != r.m_cc1_gpio)) + return true; + #endif // CONFIG_ESP_PHY_ENABLE_USB + #ifdef CONFIG_ESP_PHY_ENABLE_USB + if (has_cc2_gpio() && (m_cc2_gpio != r.m_cc2_gpio)) + return true; + #endif // CONFIG_ESP_PHY_ENABLE_USB return false; } @@ -1144,7 +1238,27 @@ int SystemConfig::setByName(const char *name, const char *value) return r; } #endif // CONFIG_USB_CONSOLE - return -32; + #ifdef CONFIG_ESP_PHY_ENABLE_USB + if (0 == strcmp(name,"cc1_gpio")) { + if (value == 0) { + clear_cc1_gpio(); + return 0; + } + int r = parse_ascii_s8(&m_cc1_gpio,value); + return r; + } + #endif // CONFIG_ESP_PHY_ENABLE_USB + #ifdef CONFIG_ESP_PHY_ENABLE_USB + if (0 == strcmp(name,"cc2_gpio")) { + if (value == 0) { + clear_cc2_gpio(); + return 0; + } + int r = parse_ascii_s8(&m_cc2_gpio,value); + return r; + } + #endif // CONFIG_ESP_PHY_ENABLE_USB + return -38; } Message *SystemConfig::p_getMember(const char *s, unsigned n) @@ -1191,12 +1305,12 @@ ssize_t TouchpadConfig::fromMemory(const void *b, ssize_t s) varint_t fid; int fn = read_varint(a,e-a,&fid); if (fn <= 0) - return -33; + return -39; a += fn; switch (fid) { case 0xb: // fsm_mode id 1, type bool, coding 8bit if (a >= e) - return -34; + return -40; set_fsm_mode(*a++); break; case 0x10: // lvolt id 2, type int8_t, coding signed varint @@ -1204,7 +1318,7 @@ ssize_t TouchpadConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -35; + return -41; a += n; set_lvolt(varint_sint(v)); } @@ -1214,7 +1328,7 @@ ssize_t TouchpadConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -36; + return -42; a += n; set_hvolt(varint_sint(v)); } @@ -1224,7 +1338,7 @@ ssize_t TouchpadConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -37; + return -43; a += n; set_atten(varint_sint(v)); } @@ -1234,7 +1348,7 @@ ssize_t TouchpadConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -38; + return -44; a += n; set_interval(v); } @@ -1244,7 +1358,7 @@ ssize_t TouchpadConfig::fromMemory(const void *b, ssize_t s) { ssize_t s = skip_content(a,e-a,fid&7); if (s <= 0) - return -39; + return -45; a += s; break; } @@ -1252,7 +1366,7 @@ ssize_t TouchpadConfig::fromMemory(const void *b, ssize_t s) } assert((a-(const uint8_t *)b) == s); if (a > e) - return -40; + return -46; return a-(const uint8_t *)b; } @@ -1265,7 +1379,7 @@ ssize_t TouchpadConfig::toMemory(uint8_t *b, ssize_t s) const if (m_fsm_mode != false) { // 'fsm_mode': id=1, encoding=8bit, tag=0xb if (2 > (e-a)) - return -41; + return -47; *a++ = 0xb; *a++ = m_fsm_mode; } @@ -1273,44 +1387,44 @@ ssize_t TouchpadConfig::toMemory(uint8_t *b, ssize_t s) const if (m_lvolt != -1) { // 'lvolt': id=2, encoding=varint, tag=0x10 if (a >= e) - return -42; + return -48; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_lvolt)); if (n <= 0) - return -43; + return -49; a += n; } // has hvolt? if (m_hvolt != -1) { // 'hvolt': id=3, encoding=varint, tag=0x18 if (a >= e) - return -44; + return -50; *a++ = 0x18; n = write_varint(a,e-a,sint_varint(m_hvolt)); if (n <= 0) - return -45; + return -51; a += n; } // has atten? if (m_atten != -1) { // 'atten': id=4, encoding=varint, tag=0x20 if (a >= e) - return -46; + return -52; *a++ = 0x20; n = write_varint(a,e-a,sint_varint(m_atten)); if (n <= 0) - return -47; + return -53; a += n; } // has interval? if (0 != (p_validbits & ((uint8_t)1U << 0))) { // 'interval': id=7, encoding=varint, tag=0x38 if (a >= e) - return -48; + return -54; *a++ = 0x38; n = write_varint(a,e-a,m_interval); if (n <= 0) - return -49; + return -55; a += n; } assert(a <= e); @@ -1452,7 +1566,7 @@ int TouchpadConfig::setByName(const char *name, const char *value) p_validbits |= ((uint8_t)1U << 0); return r; } - return -50; + return -56; } Message *TouchpadConfig::p_getMember(const char *s, unsigned n) @@ -1499,7 +1613,7 @@ ssize_t TouchChannelConfig::fromMemory(const void *b, ssize_t s) varint_t fid; int fn = read_varint(a,e-a,&fid); if (fn <= 0) - return -51; + return -57; a += fn; switch (fid) { case 0xa: // name id 1, type estring, coding byte[] @@ -1508,7 +1622,7 @@ ssize_t TouchChannelConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -52; + return -58; m_name.assign((const char*)a,v); a += v; } @@ -1518,14 +1632,14 @@ ssize_t TouchChannelConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -53; + return -59; a += n; set_channel(varint_sint(v)); } break; case 0x1c: // threshold id 3, type uint16_t, coding 16bit if ((a+1) >= e) - return -54; + return -60; set_threshold((uint16_t) read_u16(a)); a += 2; break; @@ -1534,7 +1648,7 @@ ssize_t TouchChannelConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -55; + return -61; a += n; set_slope(v); } @@ -1544,7 +1658,7 @@ ssize_t TouchChannelConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -56; + return -62; a += n; set_tieopt(v); } @@ -1554,7 +1668,7 @@ ssize_t TouchChannelConfig::fromMemory(const void *b, ssize_t s) { ssize_t s = skip_content(a,e-a,fid&7); if (s <= 0) - return -57; + return -63; a += s; break; } @@ -1562,7 +1676,7 @@ ssize_t TouchChannelConfig::fromMemory(const void *b, ssize_t s) } assert((a-(const uint8_t *)b) == s); if (a > e) - return -58; + return -64; return a-(const uint8_t *)b; } @@ -1575,13 +1689,13 @@ ssize_t TouchChannelConfig::toMemory(uint8_t *b, ssize_t s) const if (!m_name.empty()) { // 'name': id=1, encoding=lenpfx, tag=0xa if (a >= e) - return -59; + return -65; *a++ = 0xa; ssize_t name_s = m_name.size(); n = write_varint(a,e-a,name_s); a += n; if ((n <= 0) || ((e-a) < name_s)) - return -60; + return -66; memcpy(a,m_name.data(),name_s); a += name_s; } @@ -1589,18 +1703,18 @@ ssize_t TouchChannelConfig::toMemory(uint8_t *b, ssize_t s) const if (m_channel != -1) { // 'channel': id=2, encoding=varint, tag=0x10 if (a >= e) - return -61; + return -67; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_channel)); if (n <= 0) - return -62; + return -68; a += n; } // has threshold? if (0 != (p_validbits & ((uint8_t)1U << 0))) { // 'threshold': id=3, encoding=16bit, tag=0x1c if (3 > (e-a)) - return -63; + return -69; *a++ = 0x1c; write_u16(a,m_threshold); a += 2; @@ -1609,22 +1723,22 @@ ssize_t TouchChannelConfig::toMemory(uint8_t *b, ssize_t s) const if (0 != (p_validbits & ((uint8_t)1U << 1))) { // 'slope': id=4, encoding=varint, tag=0x20 if (a >= e) - return -64; + return -70; *a++ = 0x20; n = write_varint(a,e-a,m_slope); if (n <= 0) - return -65; + return -71; a += n; } // has tieopt? if (0 != (p_validbits & ((uint8_t)1U << 2))) { // 'tieopt': id=5, encoding=varint, tag=0x28 if (a >= e) - return -66; + return -72; *a++ = 0x28; n = write_varint(a,e-a,m_tieopt); if (n <= 0) - return -67; + return -73; a += n; } assert(a <= e); @@ -1772,7 +1886,7 @@ int TouchChannelConfig::setByName(const char *name, const char *value) p_validbits |= ((uint8_t)1U << 2); return r; } - return -68; + return -74; } Message *TouchChannelConfig::p_getMember(const char *s, unsigned n) @@ -1836,7 +1950,7 @@ ssize_t ButtonConfig::fromMemory(const void *b, ssize_t s) varint_t fid; int fn = read_varint(a,e-a,&fid); if (fn <= 0) - return -69; + return -75; a += fn; switch (fid) { case 0xa: // name id 1, type estring, coding byte[] @@ -1845,7 +1959,7 @@ ssize_t ButtonConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -70; + return -76; m_name.assign((const char*)a,v); a += v; } @@ -1855,14 +1969,14 @@ ssize_t ButtonConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -71; + return -77; a += n; set_gpio(varint_sint(v)); } break; case 0x1b: // presslvl id 3, type bool, coding 8bit if (a >= e) - return -72; + return -78; set_presslvl(*a++); break; case 0x20: // pull_mode id 4, type pull_mode_t, coding varint @@ -1870,7 +1984,7 @@ ssize_t ButtonConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -73; + return -79; a += n; set_pull_mode((pull_mode_t) v); } @@ -1881,7 +1995,7 @@ ssize_t ButtonConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -74; + return -80; a += n; set_clk(varint_sint(v)); } @@ -1893,7 +2007,7 @@ ssize_t ButtonConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -75; + return -81; a += n; set_dt(varint_sint(v)); } @@ -1904,7 +2018,7 @@ ssize_t ButtonConfig::fromMemory(const void *b, ssize_t s) { ssize_t s = skip_content(a,e-a,fid&7); if (s <= 0) - return -76; + return -82; a += s; break; } @@ -1912,7 +2026,7 @@ ssize_t ButtonConfig::fromMemory(const void *b, ssize_t s) } assert((a-(const uint8_t *)b) == s); if (a > e) - return -77; + return -83; return a-(const uint8_t *)b; } @@ -1925,13 +2039,13 @@ ssize_t ButtonConfig::toMemory(uint8_t *b, ssize_t s) const if (!m_name.empty()) { // 'name': id=1, encoding=lenpfx, tag=0xa if (a >= e) - return -78; + return -84; *a++ = 0xa; ssize_t name_s = m_name.size(); n = write_varint(a,e-a,name_s); a += n; if ((n <= 0) || ((e-a) < name_s)) - return -79; + return -85; memcpy(a,m_name.data(),name_s); a += name_s; } @@ -1939,18 +2053,18 @@ ssize_t ButtonConfig::toMemory(uint8_t *b, ssize_t s) const if (m_gpio != -1) { // 'gpio': id=2, encoding=varint, tag=0x10 if (a >= e) - return -80; + return -86; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_gpio)); if (n <= 0) - return -81; + return -87; a += n; } // has presslvl? if (m_presslvl != 0) { // 'presslvl': id=3, encoding=8bit, tag=0x1b if (2 > (e-a)) - return -82; + return -88; *a++ = 0x1b; *a++ = m_presslvl; } @@ -1958,11 +2072,11 @@ ssize_t ButtonConfig::toMemory(uint8_t *b, ssize_t s) const if (m_pull_mode != pull_none) { // 'pull_mode': id=4, encoding=varint, tag=0x20 if (a >= e) - return -83; + return -89; *a++ = 0x20; n = write_varint(a,e-a,m_pull_mode); if (n <= 0) - return -84; + return -90; a += n; } #ifdef CONFIG_ROTARYENCODER @@ -1970,11 +2084,11 @@ ssize_t ButtonConfig::toMemory(uint8_t *b, ssize_t s) const if (m_clk != -1) { // 'clk': id=5, encoding=varint, tag=0x28 if (a >= e) - return -85; + return -91; *a++ = 0x28; n = write_varint(a,e-a,sint_varint(m_clk)); if (n <= 0) - return -86; + return -92; a += n; } #endif // CONFIG_ROTARYENCODER @@ -1983,11 +2097,11 @@ ssize_t ButtonConfig::toMemory(uint8_t *b, ssize_t s) const if (m_dt != -1) { // 'dt': id=6, encoding=varint, tag=0x30 if (a >= e) - return -87; + return -93; *a++ = 0x30; n = write_varint(a,e-a,sint_varint(m_dt)); if (n <= 0) - return -88; + return -94; a += n; } #endif // CONFIG_ROTARYENCODER @@ -2147,23 +2261,21 @@ int ButtonConfig::setByName(const char *name, const char *value) set_pull_mode_up((bool)ull); return eptr - value; } - #ifndef CONFIG_ESPTOOLPY_FLASHSIZE_1MB if (*name++ != '.') { - return -89; + return -95; } else if (!strcmp(name,"enable")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_pull_mode(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_pull_mode_enable(tmp); return r; } else if (!strcmp(name,"up")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_pull_mode(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_pull_mode_up(tmp); return r; } - #endif // !CONFIG_ESPTOOLPY_FLASHSIZE_1MB } #ifdef CONFIG_ROTARYENCODER if (0 == strcmp(name,"clk")) { @@ -2185,7 +2297,7 @@ int ButtonConfig::setByName(const char *name, const char *value) return r; } #endif // CONFIG_ROTARYENCODER - return -90; + return -96; } Message *ButtonConfig::p_getMember(const char *s, unsigned n) @@ -2249,7 +2361,7 @@ ssize_t RelayConfig::fromMemory(const void *b, ssize_t s) varint_t fid; int fn = read_varint(a,e-a,&fid); if (fn <= 0) - return -91; + return -97; a += fn; switch (fid) { case 0xa: // name id 1, type estring, coding byte[] @@ -2258,7 +2370,7 @@ ssize_t RelayConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -92; + return -98; m_name.assign((const char*)a,v); a += v; } @@ -2268,7 +2380,7 @@ ssize_t RelayConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -93; + return -99; a += n; set_gpio(varint_sint(v)); } @@ -2278,7 +2390,7 @@ ssize_t RelayConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -94; + return -100; a += n; set_config((relay_cfg_t) v); } @@ -2288,7 +2400,7 @@ ssize_t RelayConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -95; + return -101; a += n; set_min_itv(v); } @@ -2298,7 +2410,7 @@ ssize_t RelayConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -96; + return -102; a += n; set_interlock(varint_sint(v)); } @@ -2308,7 +2420,7 @@ ssize_t RelayConfig::fromMemory(const void *b, ssize_t s) { ssize_t s = skip_content(a,e-a,fid&7); if (s <= 0) - return -97; + return -103; a += s; break; } @@ -2316,7 +2428,7 @@ ssize_t RelayConfig::fromMemory(const void *b, ssize_t s) } assert((a-(const uint8_t *)b) == s); if (a > e) - return -98; + return -104; return a-(const uint8_t *)b; } @@ -2329,13 +2441,13 @@ ssize_t RelayConfig::toMemory(uint8_t *b, ssize_t s) const if (!m_name.empty()) { // 'name': id=1, encoding=lenpfx, tag=0xa if (a >= e) - return -99; + return -105; *a++ = 0xa; ssize_t name_s = m_name.size(); n = write_varint(a,e-a,name_s); a += n; if ((n <= 0) || ((e-a) < name_s)) - return -100; + return -106; memcpy(a,m_name.data(),name_s); a += name_s; } @@ -2343,44 +2455,44 @@ ssize_t RelayConfig::toMemory(uint8_t *b, ssize_t s) const if (m_gpio != -1) { // 'gpio': id=2, encoding=varint, tag=0x10 if (a >= e) - return -101; + return -107; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_gpio)); if (n <= 0) - return -102; + return -108; a += n; } // has config? if (m_config != 0) { // 'config': id=3, encoding=varint, tag=0x18 if (a >= e) - return -103; + return -109; *a++ = 0x18; n = write_varint(a,e-a,m_config); if (n <= 0) - return -104; + return -110; a += n; } // has min_itv? if (0 != (p_validbits & ((uint8_t)1U << 0))) { // 'min_itv': id=4, encoding=varint, tag=0x20 if (a >= e) - return -105; + return -111; *a++ = 0x20; n = write_varint(a,e-a,m_min_itv); if (n <= 0) - return -106; + return -112; a += n; } // has interlock? if (m_interlock != -1) { // 'interlock': id=5, encoding=varint, tag=0x28 if (a >= e) - return -107; + return -113; *a++ = 0x28; n = write_varint(a,e-a,sint_varint(m_interlock)); if (n <= 0) - return -108; + return -114; a += n; } assert(a <= e); @@ -2517,41 +2629,39 @@ int RelayConfig::setByName(const char *name, const char *value) set_config_mqtt((bool)ull); return eptr - value; } - #ifndef CONFIG_ESPTOOLPY_FLASHSIZE_1MB if (*name++ != '.') { - return -109; + return -115; } else if (!strcmp(name,"active_high")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_active_high(tmp); return r; } else if (!strcmp(name,"init_on")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_init_on(tmp); return r; } else if (!strcmp(name,"persistent")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_persistent(tmp); return r; } else if (!strcmp(name,"opendrain")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_opendrain(tmp); return r; } else if (!strcmp(name,"mqtt")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_mqtt(tmp); return r; } - #endif // !CONFIG_ESPTOOLPY_FLASHSIZE_1MB } if (0 == strcmp(name,"min_itv")) { if (value == 0) { @@ -2571,7 +2681,7 @@ int RelayConfig::setByName(const char *name, const char *value) int r = parse_ascii_s8(&m_interlock,value); return r; } - return -110; + return -116; } Message *RelayConfig::p_getMember(const char *s, unsigned n) @@ -2617,7 +2727,7 @@ ssize_t Max7219Config::fromMemory(const void *b, ssize_t s) varint_t fid; int fn = read_varint(a,e-a,&fid); if (fn <= 0) - return -111; + return -117; a += fn; switch (fid) { case 0x8: // clk id 1, type int8_t, coding signed varint @@ -2625,7 +2735,7 @@ ssize_t Max7219Config::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -112; + return -118; a += n; set_clk(varint_sint(v)); } @@ -2635,7 +2745,7 @@ ssize_t Max7219Config::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -113; + return -119; a += n; set_dout(varint_sint(v)); } @@ -2645,14 +2755,14 @@ ssize_t Max7219Config::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -114; + return -120; a += n; set_cs(varint_sint(v)); } break; case 0x23: // odrain id 4, type bool, coding 8bit if (a >= e) - return -115; + return -121; set_odrain(*a++); break; case 0x28: // digits id 5, type uint8_t, coding varint @@ -2660,7 +2770,7 @@ ssize_t Max7219Config::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -116; + return -122; a += n; set_digits(v); } @@ -2670,7 +2780,7 @@ ssize_t Max7219Config::fromMemory(const void *b, ssize_t s) { ssize_t s = skip_content(a,e-a,fid&7); if (s <= 0) - return -117; + return -123; a += s; break; } @@ -2678,7 +2788,7 @@ ssize_t Max7219Config::fromMemory(const void *b, ssize_t s) } assert((a-(const uint8_t *)b) == s); if (a > e) - return -118; + return -124; return a-(const uint8_t *)b; } @@ -2691,40 +2801,40 @@ ssize_t Max7219Config::toMemory(uint8_t *b, ssize_t s) const if (m_clk != -1) { // 'clk': id=1, encoding=varint, tag=0x8 if (a >= e) - return -119; + return -125; *a++ = 0x8; n = write_varint(a,e-a,sint_varint(m_clk)); if (n <= 0) - return -120; + return -126; a += n; } // has dout? if (m_dout != -1) { // 'dout': id=2, encoding=varint, tag=0x10 if (a >= e) - return -121; + return -127; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_dout)); if (n <= 0) - return -122; + return -128; a += n; } // has cs? if (m_cs != -1) { // 'cs': id=3, encoding=varint, tag=0x18 if (a >= e) - return -123; + return -129; *a++ = 0x18; n = write_varint(a,e-a,sint_varint(m_cs)); if (n <= 0) - return -124; + return -130; a += n; } // has odrain? if (m_odrain != false) { // 'odrain': id=4, encoding=8bit, tag=0x23 if (2 > (e-a)) - return -125; + return -131; *a++ = 0x23; *a++ = m_odrain; } @@ -2732,11 +2842,11 @@ ssize_t Max7219Config::toMemory(uint8_t *b, ssize_t s) const if (m_digits != 0) { // 'digits': id=5, encoding=varint, tag=0x28 if (a >= e) - return -126; + return -132; *a++ = 0x28; n = write_varint(a,e-a,m_digits); if (n <= 0) - return -127; + return -133; a += n; } assert(a <= e); @@ -2874,7 +2984,7 @@ int Max7219Config::setByName(const char *name, const char *value) int r = parse_ascii_u8(&m_digits,value); return r; } - return -128; + return -134; } Message *Max7219Config::p_getMember(const char *s, unsigned n) @@ -2920,7 +3030,7 @@ ssize_t Tlc5947Config::fromMemory(const void *b, ssize_t s) varint_t fid; int fn = read_varint(a,e-a,&fid); if (fn <= 0) - return -129; + return -135; a += fn; switch (fid) { case 0x8: // sin id 1, type int8_t, coding signed varint @@ -2928,7 +3038,7 @@ ssize_t Tlc5947Config::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -130; + return -136; a += n; set_sin(varint_sint(v)); } @@ -2938,7 +3048,7 @@ ssize_t Tlc5947Config::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -131; + return -137; a += n; set_sclk(varint_sint(v)); } @@ -2948,7 +3058,7 @@ ssize_t Tlc5947Config::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -132; + return -138; a += n; set_xlat(varint_sint(v)); } @@ -2958,7 +3068,7 @@ ssize_t Tlc5947Config::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -133; + return -139; a += n; set_blank(varint_sint(v)); } @@ -2968,7 +3078,7 @@ ssize_t Tlc5947Config::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -134; + return -140; a += n; set_ntlc(v); } @@ -2978,7 +3088,7 @@ ssize_t Tlc5947Config::fromMemory(const void *b, ssize_t s) { ssize_t s = skip_content(a,e-a,fid&7); if (s <= 0) - return -135; + return -141; a += s; break; } @@ -2986,7 +3096,7 @@ ssize_t Tlc5947Config::fromMemory(const void *b, ssize_t s) } assert((a-(const uint8_t *)b) == s); if (a > e) - return -136; + return -142; return a-(const uint8_t *)b; } @@ -2999,55 +3109,55 @@ ssize_t Tlc5947Config::toMemory(uint8_t *b, ssize_t s) const if (m_sin != -1) { // 'sin': id=1, encoding=varint, tag=0x8 if (a >= e) - return -137; + return -143; *a++ = 0x8; n = write_varint(a,e-a,sint_varint(m_sin)); if (n <= 0) - return -138; + return -144; a += n; } // has sclk? if (m_sclk != -1) { // 'sclk': id=2, encoding=varint, tag=0x10 if (a >= e) - return -139; + return -145; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_sclk)); if (n <= 0) - return -140; + return -146; a += n; } // has xlat? if (m_xlat != -1) { // 'xlat': id=3, encoding=varint, tag=0x18 if (a >= e) - return -141; + return -147; *a++ = 0x18; n = write_varint(a,e-a,sint_varint(m_xlat)); if (n <= 0) - return -142; + return -148; a += n; } // has blank? if (m_blank != -1) { // 'blank': id=4, encoding=varint, tag=0x20 if (a >= e) - return -143; + return -149; *a++ = 0x20; n = write_varint(a,e-a,sint_varint(m_blank)); if (n <= 0) - return -144; + return -150; a += n; } // has ntlc? if (m_ntlc != 0) { // 'ntlc': id=5, encoding=varint, tag=0x28 if (a >= e) - return -145; + return -151; *a++ = 0x28; n = write_varint(a,e-a,m_ntlc); if (n <= 0) - return -146; + return -152; a += n; } assert(a <= e); @@ -3185,7 +3295,7 @@ int Tlc5947Config::setByName(const char *name, const char *value) int r = parse_ascii_u8(&m_ntlc,value); return r; } - return -147; + return -153; } Message *Tlc5947Config::p_getMember(const char *s, unsigned n) @@ -3229,7 +3339,7 @@ ssize_t Ws2812bConfig::fromMemory(const void *b, ssize_t s) varint_t fid; int fn = read_varint(a,e-a,&fid); if (fn <= 0) - return -148; + return -154; a += fn; switch (fid) { case 0x8: // gpio id 1, type int8_t, coding signed varint @@ -3237,7 +3347,7 @@ ssize_t Ws2812bConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -149; + return -155; a += n; set_gpio(varint_sint(v)); } @@ -3247,7 +3357,7 @@ ssize_t Ws2812bConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -150; + return -156; a += n; set_ch(varint_sint(v)); } @@ -3257,7 +3367,7 @@ ssize_t Ws2812bConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -151; + return -157; a += n; set_nleds(v); } @@ -3268,7 +3378,7 @@ ssize_t Ws2812bConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -152; + return -158; m_name.assign((const char*)a,v); a += v; } @@ -3278,7 +3388,7 @@ ssize_t Ws2812bConfig::fromMemory(const void *b, ssize_t s) { ssize_t s = skip_content(a,e-a,fid&7); if (s <= 0) - return -153; + return -159; a += s; break; } @@ -3286,7 +3396,7 @@ ssize_t Ws2812bConfig::fromMemory(const void *b, ssize_t s) } assert((a-(const uint8_t *)b) == s); if (a > e) - return -154; + return -160; return a-(const uint8_t *)b; } @@ -3299,46 +3409,46 @@ ssize_t Ws2812bConfig::toMemory(uint8_t *b, ssize_t s) const if (m_gpio != -1) { // 'gpio': id=1, encoding=varint, tag=0x8 if (a >= e) - return -155; + return -161; *a++ = 0x8; n = write_varint(a,e-a,sint_varint(m_gpio)); if (n <= 0) - return -156; + return -162; a += n; } // has ch? if (m_ch != -1) { // 'ch': id=2, encoding=varint, tag=0x10 if (a >= e) - return -157; + return -163; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_ch)); if (n <= 0) - return -158; + return -164; a += n; } // has nleds? if (m_nleds != 0) { // 'nleds': id=3, encoding=varint, tag=0x18 if (a >= e) - return -159; + return -165; *a++ = 0x18; n = write_varint(a,e-a,m_nleds); if (n <= 0) - return -160; + return -166; a += n; } // has name? if (!m_name.empty()) { // 'name': id=4, encoding=lenpfx, tag=0x22 if (a >= e) - return -161; + return -167; *a++ = 0x22; ssize_t name_s = m_name.size(); n = write_varint(a,e-a,name_s); a += n; if ((n <= 0) || ((e-a) < name_s)) - return -162; + return -168; memcpy(a,m_name.data(),name_s); a += name_s; } @@ -3461,7 +3571,7 @@ int Ws2812bConfig::setByName(const char *name, const char *value) int r = m_name.size(); return r; } - return -163; + return -169; } Message *Ws2812bConfig::p_getMember(const char *s, unsigned n) @@ -3506,7 +3616,7 @@ ssize_t DhtConfig::fromMemory(const void *b, ssize_t s) varint_t fid; int fn = read_varint(a,e-a,&fid); if (fn <= 0) - return -164; + return -170; a += fn; switch (fid) { case 0x8: // model id 1, type dht_model_t, coding varint @@ -3514,7 +3624,7 @@ ssize_t DhtConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -165; + return -171; a += n; set_model((dht_model_t) v); } @@ -3524,7 +3634,7 @@ ssize_t DhtConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -166; + return -172; a += n; set_gpio(varint_sint(v)); } @@ -3534,7 +3644,7 @@ ssize_t DhtConfig::fromMemory(const void *b, ssize_t s) { ssize_t s = skip_content(a,e-a,fid&7); if (s <= 0) - return -167; + return -173; a += s; break; } @@ -3542,7 +3652,7 @@ ssize_t DhtConfig::fromMemory(const void *b, ssize_t s) } assert((a-(const uint8_t *)b) == s); if (a > e) - return -168; + return -174; return a-(const uint8_t *)b; } @@ -3555,22 +3665,22 @@ ssize_t DhtConfig::toMemory(uint8_t *b, ssize_t s) const if (m_model != DHT_NONE) { // 'model': id=1, encoding=varint, tag=0x8 if (a >= e) - return -169; + return -175; *a++ = 0x8; n = write_varint(a,e-a,m_model); if (n <= 0) - return -170; + return -176; a += n; } // has gpio? if (m_gpio != -1) { // 'gpio': id=2, encoding=varint, tag=0x10 if (a >= e) - return -171; + return -177; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_gpio)); if (n <= 0) - return -172; + return -178; a += n; } assert(a <= e); @@ -3652,7 +3762,7 @@ int DhtConfig::setByName(const char *name, const char *value) dht_model_t v; size_t r = parse_ascii_dht_model_t(&v,value); if (r == 0) - return -173; + return -179; set_model(v); return r; } @@ -3664,7 +3774,7 @@ int DhtConfig::setByName(const char *name, const char *value) int r = parse_ascii_s8(&m_gpio,value); return r; } - return -174; + return -180; } Message *DhtConfig::p_getMember(const char *s, unsigned n) @@ -3742,7 +3852,7 @@ ssize_t I2CConfig::fromMemory(const void *b, ssize_t s) varint_t fid; int fn = read_varint(a,e-a,&fid); if (fn <= 0) - return -175; + return -181; a += fn; switch (fid) { case 0x8: // port id 1, type uint8_t, coding varint @@ -3750,7 +3860,7 @@ ssize_t I2CConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -176; + return -182; a += n; set_port(v); } @@ -3760,7 +3870,7 @@ ssize_t I2CConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -177; + return -183; a += n; set_sda(varint_sint(v)); } @@ -3770,7 +3880,7 @@ ssize_t I2CConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -178; + return -184; a += n; set_scl(varint_sint(v)); } @@ -3780,14 +3890,14 @@ ssize_t I2CConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -179; + return -185; a += n; set_freq(v); } break; case 0x2b: // xpullup id 5, type bool, coding 8bit if (a >= e) - return -180; + return -186; set_xpullup(*a++); break; #ifdef CONFIG_I2C_XDEV @@ -3795,14 +3905,14 @@ ssize_t I2CConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); // length of packed if (n <= 0) - return -181; + return -187; a += n; const uint8_t *ae = a + v; do { varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -182; + return -188; a += n; m_devices.push_back((i2cdev_t)v); } while (a < ae); @@ -3813,7 +3923,7 @@ ssize_t I2CConfig::fromMemory(const void *b, ssize_t s) { ssize_t s = skip_content(a,e-a,fid&7); if (s <= 0) - return -183; + return -189; a += s; break; } @@ -3821,7 +3931,7 @@ ssize_t I2CConfig::fromMemory(const void *b, ssize_t s) } assert((a-(const uint8_t *)b) == s); if (a > e) - return -184; + return -190; return a-(const uint8_t *)b; } @@ -3834,51 +3944,51 @@ ssize_t I2CConfig::toMemory(uint8_t *b, ssize_t s) const if (0 != (p_validbits & ((uint8_t)1U << 0))) { // 'port': id=1, encoding=varint, tag=0x8 if (a >= e) - return -185; + return -191; *a++ = 0x8; n = write_varint(a,e-a,m_port); if (n <= 0) - return -186; + return -192; a += n; } // has sda? if (m_sda != -1) { // 'sda': id=2, encoding=varint, tag=0x10 if (a >= e) - return -187; + return -193; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_sda)); if (n <= 0) - return -188; + return -194; a += n; } // has scl? if (m_scl != -1) { // 'scl': id=3, encoding=varint, tag=0x18 if (a >= e) - return -189; + return -195; *a++ = 0x18; n = write_varint(a,e-a,sint_varint(m_scl)); if (n <= 0) - return -190; + return -196; a += n; } // has freq? if (0 != (p_validbits & ((uint8_t)1U << 1))) { // 'freq': id=4, encoding=varint, tag=0x20 if (a >= e) - return -191; + return -197; *a++ = 0x20; n = write_varint(a,e-a,m_freq); if (n <= 0) - return -192; + return -198; a += n; } // has xpullup? if (m_xpullup != false) { // 'xpullup': id=5, encoding=8bit, tag=0x2b if (2 > (e-a)) - return -193; + return -199; *a++ = 0x2b; *a++ = m_xpullup; } @@ -3886,7 +3996,7 @@ ssize_t I2CConfig::toMemory(uint8_t *b, ssize_t s) const if (size_t devices_ne = m_devices.size()) { // 'devices': id=6, encoding=lenpfx, tag=0x32 if (a >= e) - return -194; + return -200; *a++ = 0x32; ssize_t devices_ws = 0; for (size_t x = 0; x != devices_ne; ++x) @@ -3894,7 +4004,7 @@ ssize_t I2CConfig::toMemory(uint8_t *b, ssize_t s) const n = write_varint(a,e-a,devices_ws); a += n; if ((n <= 0) || (devices_ws > (e-a))) - return -195; + return -201; for (size_t x = 0; x != devices_ne; ++x) a += write_varint(a,e-a,m_devices[x]); } @@ -4091,9 +4201,9 @@ int I2CConfig::setByName(const char *name, const char *value) } else { x = strtoul(name+8,&idxe,0); if ((idxe[0] != ']') || (idxe == (name+8))) - return -196; + return -202; if (m_devices.size() <= x) - return -197; + return -203; if ((idxe[1] == 0) && (value == 0)) { m_devices.erase(m_devices.begin()+x); return 0; @@ -4106,7 +4216,7 @@ int I2CConfig::setByName(const char *name, const char *value) return eptr - value; } if (idxe[1] != '.') - return -198; + return -204; idxe += 2; if (!strcmp("addr",idxe)) { if (eptr != value) { @@ -4133,11 +4243,11 @@ int I2CConfig::setByName(const char *name, const char *value) return 0; } } - return -199; + return -205; } } #endif // CONFIG_I2C_XDEV - return -200; + return -206; } Message *I2CConfig::p_getMember(const char *s, unsigned n) @@ -4179,7 +4289,7 @@ ssize_t HcSr04Config::fromMemory(const void *b, ssize_t s) varint_t fid; int fn = read_varint(a,e-a,&fid); if (fn <= 0) - return -201; + return -207; a += fn; switch (fid) { case 0x8: // trigger id 1, type int8_t, coding signed varint @@ -4187,7 +4297,7 @@ ssize_t HcSr04Config::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -202; + return -208; a += n; set_trigger(varint_sint(v)); } @@ -4197,7 +4307,7 @@ ssize_t HcSr04Config::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -203; + return -209; a += n; set_echo(varint_sint(v)); } @@ -4208,7 +4318,7 @@ ssize_t HcSr04Config::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -204; + return -210; m_name.assign((const char*)a,v); a += v; } @@ -4218,7 +4328,7 @@ ssize_t HcSr04Config::fromMemory(const void *b, ssize_t s) { ssize_t s = skip_content(a,e-a,fid&7); if (s <= 0) - return -205; + return -211; a += s; break; } @@ -4226,7 +4336,7 @@ ssize_t HcSr04Config::fromMemory(const void *b, ssize_t s) } assert((a-(const uint8_t *)b) == s); if (a > e) - return -206; + return -212; return a-(const uint8_t *)b; } @@ -4239,35 +4349,35 @@ ssize_t HcSr04Config::toMemory(uint8_t *b, ssize_t s) const if (m_trigger != -1) { // 'trigger': id=1, encoding=varint, tag=0x8 if (a >= e) - return -207; + return -213; *a++ = 0x8; n = write_varint(a,e-a,sint_varint(m_trigger)); if (n <= 0) - return -208; + return -214; a += n; } // has echo? if (m_echo != -1) { // 'echo': id=2, encoding=varint, tag=0x10 if (a >= e) - return -209; + return -215; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_echo)); if (n <= 0) - return -210; + return -216; a += n; } // has name? if (!m_name.empty()) { // 'name': id=3, encoding=lenpfx, tag=0x1a if (a >= e) - return -211; + return -217; *a++ = 0x1a; ssize_t name_s = m_name.size(); n = write_varint(a,e-a,name_s); a += n; if ((n <= 0) || ((e-a) < name_s)) - return -212; + return -218; memcpy(a,m_name.data(),name_s); a += name_s; } @@ -4372,7 +4482,7 @@ int HcSr04Config::setByName(const char *name, const char *value) int r = m_name.size(); return r; } - return -213; + return -219; } Message *HcSr04Config::p_getMember(const char *s, unsigned n) @@ -4409,6 +4519,9 @@ void LedConfig::toASCII(stream &o, size_t indent) const ascii_indent(o,indent); o << ".open_drain"; o << (config_open_drain() ? " = true;" : " = false;"); + ascii_indent(o,indent); + o << ".init_high"; + o << (config_init_high() ? " = true;" : " = false;"); --indent; ascii_string(o,indent,m_name.data(),m_name.size(),"name"); ascii_numeric(o, indent, "pwm_ch", (signed) m_pwm_ch); @@ -4425,7 +4538,7 @@ ssize_t LedConfig::fromMemory(const void *b, ssize_t s) varint_t fid; int fn = read_varint(a,e-a,&fid); if (fn <= 0) - return -214; + return -220; a += fn; switch (fid) { case 0x8: // gpio id 1, type int8_t, coding signed varint @@ -4433,7 +4546,7 @@ ssize_t LedConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -215; + return -221; a += n; set_gpio(varint_sint(v)); } @@ -4443,7 +4556,7 @@ ssize_t LedConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -216; + return -222; a += n; set_config((ledcfg_t) v); } @@ -4454,7 +4567,7 @@ ssize_t LedConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -217; + return -223; m_name.assign((const char*)a,v); a += v; } @@ -4464,7 +4577,7 @@ ssize_t LedConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -218; + return -224; a += n; set_pwm_ch(varint_sint(v)); } @@ -4474,7 +4587,7 @@ ssize_t LedConfig::fromMemory(const void *b, ssize_t s) { ssize_t s = skip_content(a,e-a,fid&7); if (s <= 0) - return -219; + return -225; a += s; break; } @@ -4482,7 +4595,7 @@ ssize_t LedConfig::fromMemory(const void *b, ssize_t s) } assert((a-(const uint8_t *)b) == s); if (a > e) - return -220; + return -226; return a-(const uint8_t *)b; } @@ -4495,35 +4608,35 @@ ssize_t LedConfig::toMemory(uint8_t *b, ssize_t s) const if (m_gpio != -1) { // 'gpio': id=1, encoding=varint, tag=0x8 if (a >= e) - return -221; + return -227; *a++ = 0x8; n = write_varint(a,e-a,sint_varint(m_gpio)); if (n <= 0) - return -222; + return -228; a += n; } // has config? if (0 != (p_validbits & ((uint8_t)1U << 0))) { // 'config': id=2, encoding=varint, tag=0x10 if (a >= e) - return -223; + return -229; *a++ = 0x10; n = write_varint(a,e-a,m_config); if (n <= 0) - return -224; + return -230; a += n; } // has name? if (!m_name.empty()) { // 'name': id=3, encoding=lenpfx, tag=0x1a if (a >= e) - return -225; + return -231; *a++ = 0x1a; ssize_t name_s = m_name.size(); n = write_varint(a,e-a,name_s); a += n; if ((n <= 0) || ((e-a) < name_s)) - return -226; + return -232; memcpy(a,m_name.data(),name_s); a += name_s; } @@ -4531,11 +4644,11 @@ ssize_t LedConfig::toMemory(uint8_t *b, ssize_t s) const if (m_pwm_ch != -1) { // 'pwm_ch': id=4, encoding=varint, tag=0x20 if (a >= e) - return -227; + return -233; *a++ = 0x20; n = write_varint(a,e-a,sint_varint(m_pwm_ch)); if (n <= 0) - return -228; + return -234; a += n; } assert(a <= e); @@ -4645,25 +4758,31 @@ int LedConfig::setByName(const char *name, const char *value) set_config_active_high((bool)ull); else if (!strcmp(name,"open_drain")) set_config_open_drain((bool)ull); + else if (!strcmp(name,"init_high")) + set_config_init_high((bool)ull); return eptr - value; } - #ifndef CONFIG_ESPTOOLPY_FLASHSIZE_1MB if (*name++ != '.') { - return -229; + return -235; } else if (!strcmp(name,"active_high")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_active_high(tmp); return r; } else if (!strcmp(name,"open_drain")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_open_drain(tmp); + return r; + } else if (!strcmp(name,"init_high")) { + bool tmp; + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_init_high(tmp); return r; } - #endif // !CONFIG_ESPTOOLPY_FLASHSIZE_1MB } if (0 == strcmp(name,"name")) { if (value == 0) { @@ -4682,7 +4801,7 @@ int LedConfig::setByName(const char *name, const char *value) int r = parse_ascii_s8(&m_pwm_ch,value); return r; } - return -230; + return -236; } Message *LedConfig::p_getMember(const char *s, unsigned n) @@ -4724,7 +4843,7 @@ ssize_t OneWireConfig::fromMemory(const void *b, ssize_t s) varint_t fid; int fn = read_varint(a,e-a,&fid); if (fn <= 0) - return -231; + return -237; a += fn; switch (fid) { case 0x8: // gpio id 1, type int8_t, coding signed varint @@ -4732,14 +4851,14 @@ ssize_t OneWireConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -232; + return -238; a += n; set_gpio(varint_sint(v)); } break; case 0x13: // pullup id 2, type bool, coding 8bit if (a >= e) - return -233; + return -239; set_pullup(*a++); break; case 0x18: // power id 3, type int8_t, coding signed varint @@ -4747,7 +4866,7 @@ ssize_t OneWireConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -234; + return -240; a += n; set_power(varint_sint(v)); } @@ -4757,7 +4876,7 @@ ssize_t OneWireConfig::fromMemory(const void *b, ssize_t s) { ssize_t s = skip_content(a,e-a,fid&7); if (s <= 0) - return -235; + return -241; a += s; break; } @@ -4765,7 +4884,7 @@ ssize_t OneWireConfig::fromMemory(const void *b, ssize_t s) } assert((a-(const uint8_t *)b) == s); if (a > e) - return -236; + return -242; return a-(const uint8_t *)b; } @@ -4778,18 +4897,18 @@ ssize_t OneWireConfig::toMemory(uint8_t *b, ssize_t s) const if (m_gpio != -1) { // 'gpio': id=1, encoding=varint, tag=0x8 if (a >= e) - return -237; + return -243; *a++ = 0x8; n = write_varint(a,e-a,sint_varint(m_gpio)); if (n <= 0) - return -238; + return -244; a += n; } // has pullup? if (m_pullup != false) { // 'pullup': id=2, encoding=8bit, tag=0x13 if (2 > (e-a)) - return -239; + return -245; *a++ = 0x13; *a++ = m_pullup; } @@ -4797,11 +4916,11 @@ ssize_t OneWireConfig::toMemory(uint8_t *b, ssize_t s) const if (m_power != -1) { // 'power': id=3, encoding=varint, tag=0x18 if (a >= e) - return -240; + return -246; *a++ = 0x18; n = write_varint(a,e-a,sint_varint(m_power)); if (n <= 0) - return -241; + return -247; a += n; } assert(a <= e); @@ -4903,7 +5022,7 @@ int OneWireConfig::setByName(const char *name, const char *value) int r = parse_ascii_s8(&m_power,value); return r; } - return -242; + return -248; } Message *OneWireConfig::p_getMember(const char *s, unsigned n) @@ -4949,7 +5068,7 @@ ssize_t UartConfig::fromMemory(const void *b, ssize_t s) varint_t fid; int fn = read_varint(a,e-a,&fid); if (fn <= 0) - return -243; + return -249; a += fn; switch (fid) { case 0x8: // port id 1, type int8_t, coding signed varint @@ -4957,7 +5076,7 @@ ssize_t UartConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -244; + return -250; a += n; set_port(varint_sint(v)); } @@ -4967,7 +5086,7 @@ ssize_t UartConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -245; + return -251; a += n; set_tx_gpio(varint_sint(v)); } @@ -4977,7 +5096,7 @@ ssize_t UartConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -246; + return -252; a += n; set_rx_gpio(varint_sint(v)); } @@ -4987,7 +5106,7 @@ ssize_t UartConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -247; + return -253; a += n; set_cts_gpio(varint_sint(v)); } @@ -4997,7 +5116,7 @@ ssize_t UartConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -248; + return -254; a += n; set_rts_gpio(varint_sint(v)); } @@ -5007,7 +5126,7 @@ ssize_t UartConfig::fromMemory(const void *b, ssize_t s) { ssize_t s = skip_content(a,e-a,fid&7); if (s <= 0) - return -249; + return -255; a += s; break; } @@ -5015,7 +5134,7 @@ ssize_t UartConfig::fromMemory(const void *b, ssize_t s) } assert((a-(const uint8_t *)b) == s); if (a > e) - return -250; + return -256; return a-(const uint8_t *)b; } @@ -5028,55 +5147,55 @@ ssize_t UartConfig::toMemory(uint8_t *b, ssize_t s) const if (m_port != -1) { // 'port': id=1, encoding=varint, tag=0x8 if (a >= e) - return -251; + return -257; *a++ = 0x8; n = write_varint(a,e-a,sint_varint(m_port)); if (n <= 0) - return -252; + return -258; a += n; } // has tx_gpio? if (m_tx_gpio != -1) { // 'tx_gpio': id=2, encoding=varint, tag=0x10 if (a >= e) - return -253; + return -259; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_tx_gpio)); if (n <= 0) - return -254; + return -260; a += n; } // has rx_gpio? if (m_rx_gpio != -1) { // 'rx_gpio': id=3, encoding=varint, tag=0x18 if (a >= e) - return -255; + return -261; *a++ = 0x18; n = write_varint(a,e-a,sint_varint(m_rx_gpio)); if (n <= 0) - return -256; + return -262; a += n; } // has cts_gpio? if (m_cts_gpio != -1) { // 'cts_gpio': id=4, encoding=varint, tag=0x20 if (a >= e) - return -257; + return -263; *a++ = 0x20; n = write_varint(a,e-a,sint_varint(m_cts_gpio)); if (n <= 0) - return -258; + return -264; a += n; } // has rts_gpio? if (m_rts_gpio != -1) { // 'rts_gpio': id=5, encoding=varint, tag=0x28 if (a >= e) - return -259; + return -265; *a++ = 0x28; n = write_varint(a,e-a,sint_varint(m_rts_gpio)); if (n <= 0) - return -260; + return -266; a += n; } assert(a <= e); @@ -5214,7 +5333,7 @@ int UartConfig::setByName(const char *name, const char *value) int r = parse_ascii_s8(&m_rts_gpio,value); return r; } - return -261; + return -267; } Message *UartConfig::p_getMember(const char *s, unsigned n) @@ -5269,7 +5388,7 @@ ssize_t AdcChannel::fromMemory(const void *b, ssize_t s) varint_t fid; int fn = read_varint(a,e-a,&fid); if (fn <= 0) - return -262; + return -268; a += fn; switch (fid) { case 0xa: // name id 1, type estring, coding byte[] @@ -5278,7 +5397,7 @@ ssize_t AdcChannel::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -263; + return -269; m_name.assign((const char*)a,v); a += v; } @@ -5288,7 +5407,7 @@ ssize_t AdcChannel::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -264; + return -270; a += n; set_unit(v); } @@ -5298,7 +5417,7 @@ ssize_t AdcChannel::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -265; + return -271; a += n; set_ch(varint_sint(v)); } @@ -5308,7 +5427,7 @@ ssize_t AdcChannel::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -266; + return -272; a += n; set_atten(v); } @@ -5318,7 +5437,7 @@ ssize_t AdcChannel::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -267; + return -273; a += n; set_interval(v); } @@ -5328,20 +5447,20 @@ ssize_t AdcChannel::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -268; + return -274; a += n; set_window(v); } break; case 0x45: // scale id 8, type float, coding 32bit if ((a+3) >= e) - return -269; + return -275; set_scale(read_float(a)); a += 4; break; case 0x4d: // offset id 9, type float, coding 32bit if ((a+3) >= e) - return -270; + return -276; set_offset(read_float(a)); a += 4; break; @@ -5351,7 +5470,7 @@ ssize_t AdcChannel::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -271; + return -277; m_dim.assign((const char*)a,v); a += v; } @@ -5361,7 +5480,7 @@ ssize_t AdcChannel::fromMemory(const void *b, ssize_t s) { ssize_t s = skip_content(a,e-a,fid&7); if (s <= 0) - return -272; + return -278; a += s; break; } @@ -5369,7 +5488,7 @@ ssize_t AdcChannel::fromMemory(const void *b, ssize_t s) } assert((a-(const uint8_t *)b) == s); if (a > e) - return -273; + return -279; return a-(const uint8_t *)b; } @@ -5382,13 +5501,13 @@ ssize_t AdcChannel::toMemory(uint8_t *b, ssize_t s) const if (!m_name.empty()) { // 'name': id=1, encoding=lenpfx, tag=0xa if (a >= e) - return -274; + return -280; *a++ = 0xa; ssize_t name_s = m_name.size(); n = write_varint(a,e-a,name_s); a += n; if ((n <= 0) || ((e-a) < name_s)) - return -275; + return -281; memcpy(a,m_name.data(),name_s); a += name_s; } @@ -5396,65 +5515,65 @@ ssize_t AdcChannel::toMemory(uint8_t *b, ssize_t s) const if (m_unit != 0) { // 'unit': id=2, encoding=varint, tag=0x10 if (a >= e) - return -276; + return -282; *a++ = 0x10; n = write_varint(a,e-a,m_unit); if (n <= 0) - return -277; + return -283; a += n; } // has ch? if (m_ch != -1) { // 'ch': id=3, encoding=varint, tag=0x18 if (a >= e) - return -278; + return -284; *a++ = 0x18; n = write_varint(a,e-a,sint_varint(m_ch)); if (n <= 0) - return -279; + return -285; a += n; } // has atten? if (0 != (p_validbits & ((uint8_t)1U << 0))) { // 'atten': id=4, encoding=varint, tag=0x20 if (a >= e) - return -280; + return -286; *a++ = 0x20; n = write_varint(a,e-a,m_atten); if (n <= 0) - return -281; + return -287; a += n; } // has interval? if (m_interval != 0) { // 'interval': id=5, encoding=varint, tag=0x28 if (a >= e) - return -282; + return -288; *a++ = 0x28; n = write_varint(a,e-a,m_interval); if (n <= 0) - return -283; + return -289; a += n; } // has window? if (m_window != 0) { // 'window': id=6, encoding=varint, tag=0x30 if (a >= e) - return -284; + return -290; *a++ = 0x30; n = write_varint(a,e-a,m_window); if (n <= 0) - return -285; + return -291; a += n; } // has scale? if (0 != (p_validbits & ((uint8_t)1U << 1))) { // 'scale': id=8, encoding=32bit, tag=0x45 if (5 > (e-a)) - return -286; + return -292; *a++ = 0x45; if ((e-a) < 4) - return -287; + return -293; write_u32(a,mangle_float(m_scale)); a += 4; } @@ -5462,10 +5581,10 @@ ssize_t AdcChannel::toMemory(uint8_t *b, ssize_t s) const if (0 != (p_validbits & ((uint8_t)1U << 2))) { // 'offset': id=9, encoding=32bit, tag=0x4d if (5 > (e-a)) - return -288; + return -294; *a++ = 0x4d; if ((e-a) < 4) - return -289; + return -295; write_u32(a,mangle_float(m_offset)); a += 4; } @@ -5473,13 +5592,13 @@ ssize_t AdcChannel::toMemory(uint8_t *b, ssize_t s) const if (!m_dim.empty()) { // 'dim': id=10, encoding=lenpfx, tag=0x52 if (a >= e) - return -290; + return -296; *a++ = 0x52; ssize_t dim_s = m_dim.size(); n = write_varint(a,e-a,dim_s); a += n; if ((n <= 0) || ((e-a) < dim_s)) - return -291; + return -297; memcpy(a,m_dim.data(),dim_s); a += dim_s; } @@ -5702,7 +5821,7 @@ int AdcChannel::setByName(const char *name, const char *value) int r = m_dim.size(); return r; } - return -292; + return -298; } Message *AdcChannel::p_getMember(const char *s, unsigned n) @@ -5760,7 +5879,7 @@ ssize_t AdcConfig::fromMemory(const void *b, ssize_t s) varint_t fid; int fn = read_varint(a,e-a,&fid); if (fn <= 0) - return -293; + return -299; a += fn; switch (fid) { case 0xa: // adc_name id 1, type estring, coding byte[] @@ -5769,7 +5888,7 @@ ssize_t AdcConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -294; + return -300; m_adc_name.assign((const char*)a,v); a += v; } @@ -5779,7 +5898,7 @@ ssize_t AdcConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -295; + return -301; a += n; set_adc1_bits(v); } @@ -5789,7 +5908,7 @@ ssize_t AdcConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -296; + return -302; a += n; set_adc2_bits(v); } @@ -5800,7 +5919,7 @@ ssize_t AdcConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -297; + return -303; m_hall_name.assign((const char*)a,v); a += v; } @@ -5811,14 +5930,14 @@ ssize_t AdcConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -298; + return -304; m_channels.emplace_back(); if (v != 0) { n = m_channels.back().fromMemory((const uint8_t*)a,v); if (n < 0) return n; if (n != (ssize_t)v) - return -299; + return -305; a += v; } } @@ -5828,7 +5947,7 @@ ssize_t AdcConfig::fromMemory(const void *b, ssize_t s) { ssize_t s = skip_content(a,e-a,fid&7); if (s <= 0) - return -300; + return -306; a += s; break; } @@ -5836,7 +5955,7 @@ ssize_t AdcConfig::fromMemory(const void *b, ssize_t s) } assert((a-(const uint8_t *)b) == s); if (a > e) - return -301; + return -307; return a-(const uint8_t *)b; } @@ -5849,13 +5968,13 @@ ssize_t AdcConfig::toMemory(uint8_t *b, ssize_t s) const if (!m_adc_name.empty()) { // 'adc_name': id=1, encoding=lenpfx, tag=0xa if (a >= e) - return -302; + return -308; *a++ = 0xa; ssize_t adc_name_s = m_adc_name.size(); n = write_varint(a,e-a,adc_name_s); a += n; if ((n <= 0) || ((e-a) < adc_name_s)) - return -303; + return -309; memcpy(a,m_adc_name.data(),adc_name_s); a += adc_name_s; } @@ -5863,22 +5982,22 @@ ssize_t AdcConfig::toMemory(uint8_t *b, ssize_t s) const if (0 != (p_validbits & ((uint8_t)1U << 0))) { // 'adc1_bits': id=2, encoding=varint, tag=0x10 if (a >= e) - return -304; + return -310; *a++ = 0x10; n = write_varint(a,e-a,m_adc1_bits); if (n <= 0) - return -305; + return -311; a += n; } // has adc2_bits? if (0 != (p_validbits & ((uint8_t)1U << 1))) { // 'adc2_bits': id=3, encoding=varint, tag=0x18 if (a >= e) - return -306; + return -312; *a++ = 0x18; n = write_varint(a,e-a,m_adc2_bits); if (n <= 0) - return -307; + return -313; a += n; } // 'mode' is unused. Therefore no data will be written. @@ -5887,26 +6006,26 @@ ssize_t AdcConfig::toMemory(uint8_t *b, ssize_t s) const if (!m_hall_name.empty()) { // 'hall_name': id=6, encoding=lenpfx, tag=0x32 if (a >= e) - return -308; + return -314; *a++ = 0x32; ssize_t hall_name_s = m_hall_name.size(); n = write_varint(a,e-a,hall_name_s); a += n; if ((n <= 0) || ((e-a) < hall_name_s)) - return -309; + return -315; memcpy(a,m_hall_name.data(),hall_name_s); a += hall_name_s; } for (const auto &x : m_channels) { // 'channels': id=7, encoding=lenpfx, tag=0x3a if (a >= e) - return -310; + return -316; *a++ = 0x3a; ssize_t channels_ws = x.calcSize(); n = write_varint(a,e-a,channels_ws); a += n; if ((n <= 0) || (channels_ws > (e-a))) - return -311; + return -317; n = x.toMemory(a,e-a); a += n; assert(n == channels_ws); @@ -6083,20 +6202,20 @@ int AdcConfig::setByName(const char *name, const char *value) } else { x = strtoul(name+9,&idxe,0); if ((idxe[0] != ']') || (idxe == (name+9))) - return -312; + return -318; if (m_channels.size() <= x) - return -313; + return -319; if ((idxe[1] == 0) && (value == 0)) { m_channels.erase(m_channels.begin()+x); return 0; } } if (idxe[1] != '.') - return -314; + return -320; return m_channels[x].setByName(idxe+2,value); } } - return -315; + return -321; } Message *AdcConfig::p_getMember(const char *s, unsigned n) @@ -6151,9 +6270,6 @@ void GpioConfig::toASCII(stream &o, size_t indent) const ascii_indent(o,indent); o << ".pulldown"; o << (config_pulldown() ? " = true;" : " = false;"); - ascii_indent(o,indent); - o << ".cap_freq_r2r"; - o << (config_cap_freq_r2r() ? " = true;" : " = false;"); --indent; --indent; ascii_indent(o,indent); @@ -6168,7 +6284,7 @@ ssize_t GpioConfig::fromMemory(const void *b, ssize_t s) varint_t fid; int fn = read_varint(a,e-a,&fid); if (fn <= 0) - return -316; + return -322; a += fn; switch (fid) { case 0xa: // name id 1, type estring, coding byte[] @@ -6177,7 +6293,7 @@ ssize_t GpioConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -317; + return -323; m_name.assign((const char*)a,v); a += v; } @@ -6187,7 +6303,7 @@ ssize_t GpioConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -318; + return -324; a += n; set_gpio(varint_sint(v)); } @@ -6197,7 +6313,7 @@ ssize_t GpioConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -319; + return -325; a += n; set_config((gpiocfg_t) v); } @@ -6207,7 +6323,7 @@ ssize_t GpioConfig::fromMemory(const void *b, ssize_t s) { ssize_t s = skip_content(a,e-a,fid&7); if (s <= 0) - return -320; + return -326; a += s; break; } @@ -6215,7 +6331,7 @@ ssize_t GpioConfig::fromMemory(const void *b, ssize_t s) } assert((a-(const uint8_t *)b) == s); if (a > e) - return -321; + return -327; return a-(const uint8_t *)b; } @@ -6228,13 +6344,13 @@ ssize_t GpioConfig::toMemory(uint8_t *b, ssize_t s) const if (!m_name.empty()) { // 'name': id=1, encoding=lenpfx, tag=0xa if (a >= e) - return -322; + return -328; *a++ = 0xa; ssize_t name_s = m_name.size(); n = write_varint(a,e-a,name_s); a += n; if ((n <= 0) || ((e-a) < name_s)) - return -323; + return -329; memcpy(a,m_name.data(),name_s); a += name_s; } @@ -6242,22 +6358,22 @@ ssize_t GpioConfig::toMemory(uint8_t *b, ssize_t s) const if (m_gpio != -1) { // 'gpio': id=2, encoding=varint, tag=0x10 if (a >= e) - return -324; + return -330; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_gpio)); if (n <= 0) - return -325; + return -331; a += n; } // has config? if (0 != (p_validbits & ((uint8_t)1U << 0))) { // 'config': id=3, encoding=varint, tag=0x18 if (a >= e) - return -326; + return -332; *a++ = 0x18; n = write_varint(a,e-a,m_config); if (n <= 0) - return -327; + return -333; a += n; } assert(a <= e); @@ -6374,59 +6490,49 @@ int GpioConfig::setByName(const char *name, const char *value) set_config_pullup((bool)ull); else if (!strcmp(name,"pulldown")) set_config_pulldown((bool)ull); - else if (!strcmp(name,"cap_freq_r2r")) - set_config_cap_freq_r2r((bool)ull); return eptr - value; } - #ifndef CONFIG_ESPTOOLPY_FLASHSIZE_1MB if (*name++ != '.') { - return -328; + return -334; } else if (!strcmp(name,"mode")) { uint8_t tmp; - size_t r = parse_ascii_u8(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_u8(&tmp,value); + if (r > 0) + set_config_mode(tmp); return r; } else if (!strcmp(name,"intrtype")) { uint8_t tmp; - size_t r = parse_ascii_u8(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_u8(&tmp,value); + if (r > 0) + set_config_intrtype(tmp); return r; } else if (!strcmp(name,"setinit")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_setinit(tmp); return r; } else if (!strcmp(name,"initlvl")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_initlvl(tmp); return r; } else if (!strcmp(name,"pullup")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_pullup(tmp); return r; } else if (!strcmp(name,"pulldown")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_config(tmp); - return r; - } else if (!strcmp(name,"cap_freq_r2r")) { - bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_pulldown(tmp); return r; } - #endif // !CONFIG_ESPTOOLPY_FLASHSIZE_1MB } - return -329; + return -335; } Message *GpioConfig::p_getMember(const char *s, unsigned n) @@ -6476,7 +6582,7 @@ ssize_t DisplayConfig::fromMemory(const void *b, ssize_t s) varint_t fid; int fn = read_varint(a,e-a,&fid); if (fn <= 0) - return -330; + return -336; a += fn; switch (fid) { case 0x8: // type id 1, type disp_t, coding varint @@ -6484,7 +6590,7 @@ ssize_t DisplayConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -331; + return -337; a += n; set_type((disp_t) v); } @@ -6494,7 +6600,7 @@ ssize_t DisplayConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -332; + return -338; a += n; set_options(v); } @@ -6504,7 +6610,7 @@ ssize_t DisplayConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -333; + return -339; a += n; set_maxx(v); } @@ -6514,7 +6620,7 @@ ssize_t DisplayConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -334; + return -340; a += n; set_maxy(v); } @@ -6524,7 +6630,7 @@ ssize_t DisplayConfig::fromMemory(const void *b, ssize_t s) { ssize_t s = skip_content(a,e-a,fid&7); if (s <= 0) - return -335; + return -341; a += s; break; } @@ -6532,7 +6638,7 @@ ssize_t DisplayConfig::fromMemory(const void *b, ssize_t s) } assert((a-(const uint8_t *)b) == s); if (a > e) - return -336; + return -342; return a-(const uint8_t *)b; } @@ -6545,44 +6651,44 @@ ssize_t DisplayConfig::toMemory(uint8_t *b, ssize_t s) const if (m_type != dt_none) { // 'type': id=1, encoding=varint, tag=0x8 if (a >= e) - return -337; + return -343; *a++ = 0x8; n = write_varint(a,e-a,m_type); if (n <= 0) - return -338; + return -344; a += n; } // has options? if (0 != (p_validbits & ((uint8_t)1U << 0))) { // 'options': id=2, encoding=varint, tag=0x10 if (a >= e) - return -339; + return -345; *a++ = 0x10; n = write_varint(a,e-a,m_options); if (n <= 0) - return -340; + return -346; a += n; } // has maxx? if (0 != (p_validbits & ((uint8_t)1U << 1))) { // 'maxx': id=3, encoding=varint, tag=0x18 if (a >= e) - return -341; + return -347; *a++ = 0x18; n = write_varint(a,e-a,m_maxx); if (n <= 0) - return -342; + return -348; a += n; } // has maxy? if (0 != (p_validbits & ((uint8_t)1U << 2))) { // 'maxy': id=4, encoding=varint, tag=0x20 if (a >= e) - return -343; + return -349; *a++ = 0x20; n = write_varint(a,e-a,m_maxy); if (n <= 0) - return -344; + return -350; a += n; } assert(a <= e); @@ -6686,7 +6792,7 @@ int DisplayConfig::setByName(const char *name, const char *value) disp_t v; size_t r = parse_ascii_disp_t(&v,value); if (r == 0) - return -345; + return -351; set_type(v); return r; } @@ -6720,7 +6826,7 @@ int DisplayConfig::setByName(const char *name, const char *value) p_validbits |= ((uint8_t)1U << 2); return r; } - return -346; + return -352; } Message *DisplayConfig::p_getMember(const char *s, unsigned n) @@ -6742,6 +6848,7 @@ void SpiDeviceConfig::clear() m_intr = -1; m_reset = -1; m_cd = -1; + m_freq = 0; } void SpiDeviceConfig::toASCII(stream &o, size_t indent) const @@ -6758,6 +6865,7 @@ void SpiDeviceConfig::toASCII(stream &o, size_t indent) const ascii_numeric(o, indent, "intr", (signed) m_intr); ascii_numeric(o, indent, "reset", (signed) m_reset); ascii_numeric(o, indent, "cd", (signed) m_cd); + ascii_numeric(o, indent, "freq", m_freq); --indent; ascii_indent(o,indent); o << '}'; @@ -6771,7 +6879,7 @@ ssize_t SpiDeviceConfig::fromMemory(const void *b, ssize_t s) varint_t fid; int fn = read_varint(a,e-a,&fid); if (fn <= 0) - return -347; + return -353; a += fn; switch (fid) { case 0x8: // drv id 1, type spidrv_t, coding varint @@ -6779,7 +6887,7 @@ ssize_t SpiDeviceConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -348; + return -354; a += n; set_drv((spidrv_t) v); } @@ -6789,7 +6897,7 @@ ssize_t SpiDeviceConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -349; + return -355; a += n; set_cs(varint_sint(v)); } @@ -6799,7 +6907,7 @@ ssize_t SpiDeviceConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -350; + return -356; a += n; set_intr(varint_sint(v)); } @@ -6809,7 +6917,7 @@ ssize_t SpiDeviceConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -351; + return -357; a += n; set_reset(varint_sint(v)); } @@ -6819,17 +6927,27 @@ ssize_t SpiDeviceConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -352; + return -358; a += n; set_cd(varint_sint(v)); } break; - default: + case 0x30: // freq id 6, type uint32_t, coding varint + { + varint_t v; + int n = read_varint(a,e-a,&v); + if (n <= 0) + return -359; + a += n; + set_freq(v); + } + break; + default: // unknown field (option unknown=skip) { ssize_t s = skip_content(a,e-a,fid&7); if (s <= 0) - return -353; + return -360; a += s; break; } @@ -6837,7 +6955,7 @@ ssize_t SpiDeviceConfig::fromMemory(const void *b, ssize_t s) } assert((a-(const uint8_t *)b) == s); if (a > e) - return -354; + return -361; return a-(const uint8_t *)b; } @@ -6850,55 +6968,66 @@ ssize_t SpiDeviceConfig::toMemory(uint8_t *b, ssize_t s) const if (m_drv != spidrv_invalid) { // 'drv': id=1, encoding=varint, tag=0x8 if (a >= e) - return -355; + return -362; *a++ = 0x8; n = write_varint(a,e-a,m_drv); if (n <= 0) - return -356; + return -363; a += n; } // has cs? if (m_cs != -1) { // 'cs': id=2, encoding=varint, tag=0x10 if (a >= e) - return -357; + return -364; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_cs)); if (n <= 0) - return -358; + return -365; a += n; } // has intr? if (m_intr != -1) { // 'intr': id=3, encoding=varint, tag=0x18 if (a >= e) - return -359; + return -366; *a++ = 0x18; n = write_varint(a,e-a,sint_varint(m_intr)); if (n <= 0) - return -360; + return -367; a += n; } // has reset? if (m_reset != -1) { // 'reset': id=4, encoding=varint, tag=0x20 if (a >= e) - return -361; + return -368; *a++ = 0x20; n = write_varint(a,e-a,sint_varint(m_reset)); if (n <= 0) - return -362; + return -369; a += n; } // has cd? if (m_cd != -1) { // 'cd': id=5, encoding=varint, tag=0x28 if (a >= e) - return -363; + return -370; *a++ = 0x28; n = write_varint(a,e-a,sint_varint(m_cd)); if (n <= 0) - return -364; + return -371; + a += n; + } + // has freq? + if (m_freq != 0) { + // 'freq': id=6, encoding=varint, tag=0x30 + if (a >= e) + return -372; + *a++ = 0x30; + n = write_varint(a,e-a,m_freq); + if (n <= 0) + return -373; a += n; } assert(a <= e); @@ -6935,6 +7064,10 @@ void SpiDeviceConfig::toJSON(stream &json, unsigned indLvl) const fsep = json_indent(json,indLvl,fsep,"cd"); json << (int) m_cd; } + if (has_freq()) { + fsep = json_indent(json,indLvl,fsep,"freq"); + json << m_freq; + } if (fsep == '{') json.put('{'); json.put('\n'); @@ -6968,6 +7101,10 @@ size_t SpiDeviceConfig::calcSize() const if (m_cd != -1) { r += wiresize_s((varint_t)m_cd) + 1 /* tag(cd) 0x28 */; } + // optional unsigned freq, id 6 + if (m_freq != 0) { + r += wiresize((varint_t)m_freq) + 1 /* tag(freq) 0x30 */; + } return r; } @@ -6983,6 +7120,8 @@ bool SpiDeviceConfig::operator != (const SpiDeviceConfig &r) const return true; if (has_cd() && (m_cd != r.m_cd)) return true; + if (has_freq() && (m_freq != r.m_freq)) + return true; return false; } @@ -7010,7 +7149,7 @@ int SpiDeviceConfig::setByName(const char *name, const char *value) spidrv_t v; size_t r = parse_ascii_spidrv_t(&v,value); if (r == 0) - return -365; + return -374; set_drv(v); return r; } @@ -7046,7 +7185,15 @@ int SpiDeviceConfig::setByName(const char *name, const char *value) int r = parse_ascii_s8(&m_cd,value); return r; } - return -366; + if (0 == strcmp(name,"freq")) { + if (value == 0) { + clear_freq(); + return 0; + } + int r = parse_ascii_u32(&m_freq,value); + return r; + } + return -375; } Message *SpiDeviceConfig::p_getMember(const char *s, unsigned n) @@ -7135,7 +7282,7 @@ ssize_t SpiBusConfig::fromMemory(const void *b, ssize_t s) varint_t fid; int fn = read_varint(a,e-a,&fid); if (fn <= 0) - return -367; + return -376; a += fn; switch (fid) { case 0x8: // host id 1, type int8_t, coding signed varint @@ -7143,7 +7290,7 @@ ssize_t SpiBusConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -368; + return -377; a += n; set_host(varint_sint(v)); } @@ -7153,7 +7300,7 @@ ssize_t SpiBusConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -369; + return -378; a += n; set_mosi(varint_sint(v)); } @@ -7163,7 +7310,7 @@ ssize_t SpiBusConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -370; + return -379; a += n; set_miso(varint_sint(v)); } @@ -7173,7 +7320,7 @@ ssize_t SpiBusConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -371; + return -380; a += n; set_sclk(varint_sint(v)); } @@ -7183,7 +7330,7 @@ ssize_t SpiBusConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -372; + return -381; a += n; set_wp(varint_sint(v)); } @@ -7193,7 +7340,7 @@ ssize_t SpiBusConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -373; + return -382; a += n; set_hold(varint_sint(v)); } @@ -7203,7 +7350,7 @@ ssize_t SpiBusConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -374; + return -383; a += n; set_options((spiopt_t) v); } @@ -7213,7 +7360,7 @@ ssize_t SpiBusConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -375; + return -384; a += n; set_dma(varint_sint(v)); } @@ -7224,14 +7371,14 @@ ssize_t SpiBusConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -376; + return -385; m_devices.emplace_back(); if (v != 0) { n = m_devices.back().fromMemory((const uint8_t*)a,v); if (n < 0) return n; if (n != (ssize_t)v) - return -377; + return -386; a += v; } } @@ -7241,7 +7388,7 @@ ssize_t SpiBusConfig::fromMemory(const void *b, ssize_t s) { ssize_t s = skip_content(a,e-a,fid&7); if (s <= 0) - return -378; + return -387; a += s; break; } @@ -7249,7 +7396,7 @@ ssize_t SpiBusConfig::fromMemory(const void *b, ssize_t s) } assert((a-(const uint8_t *)b) == s); if (a > e) - return -379; + return -388; return a-(const uint8_t *)b; } @@ -7262,100 +7409,100 @@ ssize_t SpiBusConfig::toMemory(uint8_t *b, ssize_t s) const if (m_host != -1) { // 'host': id=1, encoding=varint, tag=0x8 if (a >= e) - return -380; + return -389; *a++ = 0x8; n = write_varint(a,e-a,sint_varint(m_host)); if (n <= 0) - return -381; + return -390; a += n; } // has mosi? if (m_mosi != -1) { // 'mosi': id=2, encoding=varint, tag=0x10 if (a >= e) - return -382; + return -391; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_mosi)); if (n <= 0) - return -383; + return -392; a += n; } // has miso? if (m_miso != -1) { // 'miso': id=3, encoding=varint, tag=0x18 if (a >= e) - return -384; + return -393; *a++ = 0x18; n = write_varint(a,e-a,sint_varint(m_miso)); if (n <= 0) - return -385; + return -394; a += n; } // has sclk? if (m_sclk != -1) { // 'sclk': id=4, encoding=varint, tag=0x20 if (a >= e) - return -386; + return -395; *a++ = 0x20; n = write_varint(a,e-a,sint_varint(m_sclk)); if (n <= 0) - return -387; + return -396; a += n; } // has wp? if (m_wp != -1) { // 'wp': id=5, encoding=varint, tag=0x28 if (a >= e) - return -388; + return -397; *a++ = 0x28; n = write_varint(a,e-a,sint_varint(m_wp)); if (n <= 0) - return -389; + return -398; a += n; } // has hold? if (m_hold != -1) { // 'hold': id=6, encoding=varint, tag=0x30 if (a >= e) - return -390; + return -399; *a++ = 0x30; n = write_varint(a,e-a,sint_varint(m_hold)); if (n <= 0) - return -391; + return -400; a += n; } // has options? if (0 != (p_validbits & ((uint8_t)1U << 0))) { // 'options': id=7, encoding=varint, tag=0x38 if (a >= e) - return -392; + return -401; *a++ = 0x38; n = write_varint(a,e-a,m_options); if (n <= 0) - return -393; + return -402; a += n; } // has dma? if (m_dma != -1) { // 'dma': id=8, encoding=varint, tag=0x40 if (a >= e) - return -394; + return -403; *a++ = 0x40; n = write_varint(a,e-a,sint_varint(m_dma)); if (n <= 0) - return -395; + return -404; a += n; } for (const auto &x : m_devices) { // 'devices': id=9, encoding=lenpfx, tag=0x4a if (a >= e) - return -396; + return -405; *a++ = 0x4a; ssize_t devices_ws = x.calcSize(); n = write_varint(a,e-a,devices_ws); a += n; if ((n <= 0) || (devices_ws > (e-a))) - return -397; + return -406; n = x.toMemory(a,e-a); a += n; assert(n == devices_ws); @@ -7585,53 +7732,51 @@ int SpiBusConfig::setByName(const char *name, const char *value) set_options_pha_hi((bool)ull); return eptr - value; } - #ifndef CONFIG_ESPTOOLPY_FLASHSIZE_1MB if (*name++ != '.') { - return -398; + return -407; } else if (!strcmp(name,"txlsbfirst")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_options(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_options_txlsbfirst(tmp); return r; } else if (!strcmp(name,"rxlsbfirst")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_options(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_options_rxlsbfirst(tmp); return r; } else if (!strcmp(name,"mosi_as_miso")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_options(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_options_mosi_as_miso(tmp); return r; } else if (!strcmp(name,"positive_cs")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_options(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_options_positive_cs(tmp); return r; } else if (!strcmp(name,"full_duplex")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_options(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_options_full_duplex(tmp); return r; } else if (!strcmp(name,"pol_hi")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_options(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_options_pol_hi(tmp); return r; } else if (!strcmp(name,"pha_hi")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_options(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_options_pha_hi(tmp); return r; } - #endif // !CONFIG_ESPTOOLPY_FLASHSIZE_1MB } if (0 == strcmp(name,"dma")) { if (value == 0) { @@ -7657,20 +7802,20 @@ int SpiBusConfig::setByName(const char *name, const char *value) } else { x = strtoul(name+8,&idxe,0); if ((idxe[0] != ']') || (idxe == (name+8))) - return -399; + return -408; if (m_devices.size() <= x) - return -400; + return -409; if ((idxe[1] == 0) && (value == 0)) { m_devices.erase(m_devices.begin()+x); return 0; } } if (idxe[1] != '.') - return -401; + return -410; return m_devices[x].setByName(idxe+2,value); } } - return -402; + return -411; } Message *SpiBusConfig::p_getMember(const char *s, unsigned n) @@ -7720,7 +7865,7 @@ ssize_t GpioCluster::fromMemory(const void *b, ssize_t s) varint_t fid; int fn = read_varint(a,e-a,&fid); if (fn <= 0) - return -403; + return -412; a += fn; switch (fid) { case 0xa: // name id 1, type estring, coding byte[] @@ -7729,7 +7874,7 @@ ssize_t GpioCluster::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -404; + return -413; m_name.assign((const char*)a,v); a += v; } @@ -7739,7 +7884,7 @@ ssize_t GpioCluster::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -405; + return -414; a += n; set_base(v); } @@ -7749,7 +7894,7 @@ ssize_t GpioCluster::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -406; + return -415; a += n; set_numio(v); } @@ -7759,7 +7904,7 @@ ssize_t GpioCluster::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -407; + return -416; a += n; set_int_a(varint_sint(v)); } @@ -7769,7 +7914,7 @@ ssize_t GpioCluster::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -408; + return -417; a += n; set_int_b(varint_sint(v)); } @@ -7779,7 +7924,7 @@ ssize_t GpioCluster::fromMemory(const void *b, ssize_t s) { ssize_t s = skip_content(a,e-a,fid&7); if (s <= 0) - return -409; + return -418; a += s; break; } @@ -7787,7 +7932,7 @@ ssize_t GpioCluster::fromMemory(const void *b, ssize_t s) } assert((a-(const uint8_t *)b) == s); if (a > e) - return -410; + return -419; return a-(const uint8_t *)b; } @@ -7800,13 +7945,13 @@ ssize_t GpioCluster::toMemory(uint8_t *b, ssize_t s) const if (!m_name.empty()) { // 'name': id=1, encoding=lenpfx, tag=0xa if (a >= e) - return -411; + return -420; *a++ = 0xa; ssize_t name_s = m_name.size(); n = write_varint(a,e-a,name_s); a += n; if ((n <= 0) || ((e-a) < name_s)) - return -412; + return -421; memcpy(a,m_name.data(),name_s); a += name_s; } @@ -7814,44 +7959,44 @@ ssize_t GpioCluster::toMemory(uint8_t *b, ssize_t s) const if (m_base != 0) { // 'base': id=2, encoding=varint, tag=0x10 if (a >= e) - return -413; + return -422; *a++ = 0x10; n = write_varint(a,e-a,m_base); if (n <= 0) - return -414; + return -423; a += n; } // has numio? if (m_numio != 0) { // 'numio': id=3, encoding=varint, tag=0x18 if (a >= e) - return -415; + return -424; *a++ = 0x18; n = write_varint(a,e-a,m_numio); if (n <= 0) - return -416; + return -425; a += n; } // has int_a? if (m_int_a != -1) { // 'int_a': id=4, encoding=varint, tag=0x20 if (a >= e) - return -417; + return -426; *a++ = 0x20; n = write_varint(a,e-a,sint_varint(m_int_a)); if (n <= 0) - return -418; + return -427; a += n; } // has int_b? if (m_int_b != -1) { // 'int_b': id=5, encoding=varint, tag=0x28 if (a >= e) - return -419; + return -428; *a++ = 0x28; n = write_varint(a,e-a,sint_varint(m_int_b)); if (n <= 0) - return -420; + return -429; a += n; } assert(a <= e); @@ -7991,7 +8136,7 @@ int GpioCluster::setByName(const char *name, const char *value) int r = parse_ascii_s8(&m_int_b,value); return r; } - return -421; + return -430; } Message *GpioCluster::p_getMember(const char *s, unsigned n) @@ -8033,7 +8178,7 @@ ssize_t Hlw8012Config::fromMemory(const void *b, ssize_t s) varint_t fid; int fn = read_varint(a,e-a,&fid); if (fn <= 0) - return -422; + return -431; a += fn; switch (fid) { case 0x10: // sel id 2, type int8_t, coding signed varint @@ -8041,7 +8186,7 @@ ssize_t Hlw8012Config::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -423; + return -432; a += n; set_sel(varint_sint(v)); } @@ -8051,7 +8196,7 @@ ssize_t Hlw8012Config::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -424; + return -433; a += n; set_cf(varint_sint(v)); } @@ -8061,7 +8206,7 @@ ssize_t Hlw8012Config::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -425; + return -434; a += n; set_cf1(varint_sint(v)); } @@ -8071,7 +8216,7 @@ ssize_t Hlw8012Config::fromMemory(const void *b, ssize_t s) { ssize_t s = skip_content(a,e-a,fid&7); if (s <= 0) - return -426; + return -435; a += s; break; } @@ -8079,7 +8224,7 @@ ssize_t Hlw8012Config::fromMemory(const void *b, ssize_t s) } assert((a-(const uint8_t *)b) == s); if (a > e) - return -427; + return -436; return a-(const uint8_t *)b; } @@ -8092,33 +8237,33 @@ ssize_t Hlw8012Config::toMemory(uint8_t *b, ssize_t s) const if (m_sel != -1) { // 'sel': id=2, encoding=varint, tag=0x10 if (a >= e) - return -428; + return -437; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_sel)); if (n <= 0) - return -429; + return -438; a += n; } // has cf? if (m_cf != -1) { // 'cf': id=3, encoding=varint, tag=0x18 if (a >= e) - return -430; + return -439; *a++ = 0x18; n = write_varint(a,e-a,sint_varint(m_cf)); if (n <= 0) - return -431; + return -440; a += n; } // has cf1? if (m_cf1 != -1) { // 'cf1': id=4, encoding=varint, tag=0x20 if (a >= e) - return -432; + return -441; *a++ = 0x20; n = write_varint(a,e-a,sint_varint(m_cf1)); if (n <= 0) - return -433; + return -442; a += n; } assert(a <= e); @@ -8220,7 +8365,7 @@ int Hlw8012Config::setByName(const char *name, const char *value) int r = parse_ascii_s8(&m_cf1,value); return r; } - return -434; + return -443; } Message *Hlw8012Config::p_getMember(const char *s, unsigned n) @@ -8268,7 +8413,7 @@ ssize_t SX1276Config::fromMemory(const void *b, ssize_t s) varint_t fid; int fn = read_varint(a,e-a,&fid); if (fn <= 0) - return -435; + return -444; a += fn; switch (fid) { case 0x8: // dio0 id 1, type int8_t, coding signed varint @@ -8276,7 +8421,7 @@ ssize_t SX1276Config::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -436; + return -445; a += n; set_dio0(varint_sint(v)); } @@ -8286,7 +8431,7 @@ ssize_t SX1276Config::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -437; + return -446; a += n; set_dio1(varint_sint(v)); } @@ -8296,7 +8441,7 @@ ssize_t SX1276Config::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -438; + return -447; a += n; set_dio2(varint_sint(v)); } @@ -8306,7 +8451,7 @@ ssize_t SX1276Config::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -439; + return -448; a += n; set_dio3(varint_sint(v)); } @@ -8316,7 +8461,7 @@ ssize_t SX1276Config::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -440; + return -449; a += n; set_dio4(varint_sint(v)); } @@ -8326,7 +8471,7 @@ ssize_t SX1276Config::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -441; + return -450; a += n; set_dio5(varint_sint(v)); } @@ -8336,7 +8481,7 @@ ssize_t SX1276Config::fromMemory(const void *b, ssize_t s) { ssize_t s = skip_content(a,e-a,fid&7); if (s <= 0) - return -442; + return -451; a += s; break; } @@ -8344,7 +8489,7 @@ ssize_t SX1276Config::fromMemory(const void *b, ssize_t s) } assert((a-(const uint8_t *)b) == s); if (a > e) - return -443; + return -452; return a-(const uint8_t *)b; } @@ -8357,99 +8502,810 @@ ssize_t SX1276Config::toMemory(uint8_t *b, ssize_t s) const if (m_dio0 != -1) { // 'dio0': id=1, encoding=varint, tag=0x8 if (a >= e) - return -444; + return -453; *a++ = 0x8; n = write_varint(a,e-a,sint_varint(m_dio0)); if (n <= 0) - return -445; + return -454; a += n; } // has dio1? if (m_dio1 != -1) { // 'dio1': id=2, encoding=varint, tag=0x10 if (a >= e) - return -446; + return -455; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_dio1)); if (n <= 0) - return -447; + return -456; a += n; } // has dio2? if (m_dio2 != -1) { // 'dio2': id=3, encoding=varint, tag=0x18 if (a >= e) - return -448; + return -457; *a++ = 0x18; n = write_varint(a,e-a,sint_varint(m_dio2)); if (n <= 0) - return -449; + return -458; a += n; } // has dio3? if (m_dio3 != -1) { // 'dio3': id=4, encoding=varint, tag=0x20 if (a >= e) - return -450; + return -459; *a++ = 0x20; n = write_varint(a,e-a,sint_varint(m_dio3)); if (n <= 0) - return -451; + return -460; a += n; } // has dio4? if (m_dio4 != -1) { // 'dio4': id=5, encoding=varint, tag=0x28 if (a >= e) - return -452; + return -461; *a++ = 0x28; n = write_varint(a,e-a,sint_varint(m_dio4)); if (n <= 0) - return -453; + return -462; + a += n; + } + // has dio5? + if (m_dio5 != -1) { + // 'dio5': id=6, encoding=varint, tag=0x30 + if (a >= e) + return -463; + *a++ = 0x30; + n = write_varint(a,e-a,sint_varint(m_dio5)); + if (n <= 0) + return -464; + a += n; + } + assert(a <= e); + return a-b; +} + +void SX1276Config::toJSON(stream &json, unsigned indLvl) const +{ + char fsep = '{'; + ++indLvl; + if (has_dio0()) { + fsep = json_indent(json,indLvl,fsep,"dio0"); + json << (int) m_dio0; + } + if (has_dio1()) { + fsep = json_indent(json,indLvl,fsep,"dio1"); + json << (int) m_dio1; + } + if (has_dio2()) { + fsep = json_indent(json,indLvl,fsep,"dio2"); + json << (int) m_dio2; + } + if (has_dio3()) { + fsep = json_indent(json,indLvl,fsep,"dio3"); + json << (int) m_dio3; + } + if (has_dio4()) { + fsep = json_indent(json,indLvl,fsep,"dio4"); + json << (int) m_dio4; + } + if (has_dio5()) { + fsep = json_indent(json,indLvl,fsep,"dio5"); + json << (int) m_dio5; + } + if (fsep == '{') + json.put('{'); + json.put('\n'); + --indLvl; + json_indent(json,indLvl,0); + json.put('}'); + if (indLvl == 0) + json.put('\n'); +} + +size_t SX1276Config::calcSize() const +{ + size_t r = 0; // required size, default is fixed length + // optional sint8 dio0, id 1 + if (m_dio0 != -1) { + r += wiresize_s((varint_t)m_dio0) + 1 /* tag(dio0) 0x8 */; + } + // optional sint8 dio1, id 2 + if (m_dio1 != -1) { + r += wiresize_s((varint_t)m_dio1) + 1 /* tag(dio1) 0x10 */; + } + // optional sint8 dio2, id 3 + if (m_dio2 != -1) { + r += wiresize_s((varint_t)m_dio2) + 1 /* tag(dio2) 0x18 */; + } + // optional sint8 dio3, id 4 + if (m_dio3 != -1) { + r += wiresize_s((varint_t)m_dio3) + 1 /* tag(dio3) 0x20 */; + } + // optional sint8 dio4, id 5 + if (m_dio4 != -1) { + r += wiresize_s((varint_t)m_dio4) + 1 /* tag(dio4) 0x28 */; + } + // optional sint8 dio5, id 6 + if (m_dio5 != -1) { + r += wiresize_s((varint_t)m_dio5) + 1 /* tag(dio5) 0x30 */; + } + return r; +} + +bool SX1276Config::operator != (const SX1276Config &r) const +{ + if (has_dio0() && (m_dio0 != r.m_dio0)) + return true; + if (has_dio1() && (m_dio1 != r.m_dio1)) + return true; + if (has_dio2() && (m_dio2 != r.m_dio2)) + return true; + if (has_dio3() && (m_dio3 != r.m_dio3)) + return true; + if (has_dio4() && (m_dio4 != r.m_dio4)) + return true; + if (has_dio5() && (m_dio5 != r.m_dio5)) + return true; + return false; +} + + +bool SX1276Config::operator == (const SX1276Config &r) const +{ + return !((*this) != r); +} + + +/* + * Function for setting an element in dot notation with an ASCII value. + * It will call the specified parse_ascii function for parsing the value. + * + * @return number of bytes successfully parsed or negative value indicating + * an error. + */ +int SX1276Config::setByName(const char *name, const char *value) +{ + if (0 == strcmp(name,"dio0")) { + if (value == 0) { + clear_dio0(); + return 0; + } + int r = parse_ascii_s8(&m_dio0,value); + return r; + } + if (0 == strcmp(name,"dio1")) { + if (value == 0) { + clear_dio1(); + return 0; + } + int r = parse_ascii_s8(&m_dio1,value); + return r; + } + if (0 == strcmp(name,"dio2")) { + if (value == 0) { + clear_dio2(); + return 0; + } + int r = parse_ascii_s8(&m_dio2,value); + return r; + } + if (0 == strcmp(name,"dio3")) { + if (value == 0) { + clear_dio3(); + return 0; + } + int r = parse_ascii_s8(&m_dio3,value); + return r; + } + if (0 == strcmp(name,"dio4")) { + if (value == 0) { + clear_dio4(); + return 0; + } + int r = parse_ascii_s8(&m_dio4,value); + return r; + } + if (0 == strcmp(name,"dio5")) { + if (value == 0) { + clear_dio5(); + return 0; + } + int r = parse_ascii_s8(&m_dio5,value); + return r; + } + return -465; +} + +Message *SX1276Config::p_getMember(const char *s, unsigned n) +{ + // caller guarantee: s[n] == '.' + return 0; +} + +Message *SX1276Config::p_getMember(const char *s, unsigned n, unsigned x) +{ + // caller guarantee: s[n] == '[' + return 0; +} + +void Tone::clear() +{ + m_freq = 0; + m_duration = 0; + p_validbits = 0; +} + +void Tone::toASCII(stream &o, size_t indent) const +{ + o << "Tone {"; + ++indent; + ascii_numeric(o, indent, "freq", m_freq); + ascii_numeric(o, indent, "duration", m_duration); + --indent; + ascii_indent(o,indent); + o << '}'; +} + +ssize_t Tone::fromMemory(const void *b, ssize_t s) +{ + const uint8_t *a = (const uint8_t *)b; + const uint8_t *e = a + s; + while (a < e) { + varint_t fid; + int fn = read_varint(a,e-a,&fid); + if (fn <= 0) + return -466; + a += fn; + switch (fid) { + case 0x8: // freq id 1, type uint32_t, coding varint + { + varint_t v; + int n = read_varint(a,e-a,&v); + if (n <= 0) + return -467; + a += n; + set_freq(v); + } + break; + case 0x10: // duration id 2, type uint32_t, coding varint + { + varint_t v; + int n = read_varint(a,e-a,&v); + if (n <= 0) + return -468; + a += n; + set_duration(v); + } + break; + default: + // unknown field (option unknown=skip) + { + ssize_t s = skip_content(a,e-a,fid&7); + if (s <= 0) + return -469; + a += s; + break; + } + } + } + assert((a-(const uint8_t *)b) == s); + if (a > e) + return -470; + return a-(const uint8_t *)b; +} + +ssize_t Tone::toMemory(uint8_t *b, ssize_t s) const +{ + assert(s >= 0); + uint8_t *a = b, *e = b + s; + signed n; + // has freq? + if (0 != (p_validbits & ((uint8_t)1U << 0))) { + // 'freq': id=1, encoding=varint, tag=0x8 + if (a >= e) + return -471; + *a++ = 0x8; + n = write_varint(a,e-a,m_freq); + if (n <= 0) + return -472; + a += n; + } + // has duration? + if (0 != (p_validbits & ((uint8_t)1U << 1))) { + // 'duration': id=2, encoding=varint, tag=0x10 + if (a >= e) + return -473; + *a++ = 0x10; + n = write_varint(a,e-a,m_duration); + if (n <= 0) + return -474; + a += n; + } + assert(a <= e); + return a-b; +} + +void Tone::toJSON(stream &json, unsigned indLvl) const +{ + char fsep = '{'; + ++indLvl; + if (has_freq()) { + fsep = json_indent(json,indLvl,fsep,"freq"); + json << m_freq; + } + if (has_duration()) { + fsep = json_indent(json,indLvl,fsep,"duration"); + json << m_duration; + } + if (fsep == '{') + json.put('{'); + json.put('\n'); + --indLvl; + json_indent(json,indLvl,0); + json.put('}'); + if (indLvl == 0) + json.put('\n'); +} + +size_t Tone::calcSize() const +{ + size_t r = 0; // required size, default is fixed length + // optional unsigned freq, id 1 + if (0 != (p_validbits & ((uint8_t)1U << 0))) { + r += wiresize((varint_t)m_freq) + 1 /* tag(freq) 0x8 */; + } + // optional unsigned duration, id 2 + if (0 != (p_validbits & ((uint8_t)1U << 1))) { + r += wiresize((varint_t)m_duration) + 1 /* tag(duration) 0x10 */; + } + return r; +} + +bool Tone::operator != (const Tone &r) const +{ + if (p_validbits != r.p_validbits) + return true; + if (has_freq() && (m_freq != r.m_freq)) + return true; + if (has_duration() && (m_duration != r.m_duration)) + return true; + return false; +} + + +bool Tone::operator == (const Tone &r) const +{ + return !((*this) != r); +} + + +/* + * Function for setting an element in dot notation with an ASCII value. + * It will call the specified parse_ascii function for parsing the value. + * + * @return number of bytes successfully parsed or negative value indicating + * an error. + */ +int Tone::setByName(const char *name, const char *value) +{ + if (0 == strcmp(name,"freq")) { + if (value == 0) { + clear_freq(); + return 0; + } + int r = parse_ascii_u32(&m_freq,value); + if (r > 0) + p_validbits |= ((uint8_t)1U << 0); + return r; + } + if (0 == strcmp(name,"duration")) { + if (value == 0) { + clear_duration(); + return 0; + } + int r = parse_ascii_u32(&m_duration,value); + if (r > 0) + p_validbits |= ((uint8_t)1U << 1); + return r; + } + return -475; +} + +Message *Tone::p_getMember(const char *s, unsigned n) +{ + // caller guarantee: s[n] == '.' + return 0; +} + +Message *Tone::p_getMember(const char *s, unsigned n, unsigned x) +{ + // caller guarantee: s[n] == '[' + return 0; +} + +void Melody::clear() +{ + m_name.clear(); + m_tones.clear(); +} + +void Melody::toASCII(stream &o, size_t indent) const +{ + o << "Melody {"; + ++indent; + ascii_string(o,indent,m_name.data(),m_name.size(),"name"); + ascii_indent(o,indent); + size_t s_tones = m_tones.size(); + o << "tones[" << s_tones << "] = {"; + ++indent; + for (size_t i = 0, e = s_tones; i != e; ++i) { + ascii_indent(o,indent); + o << i << ": "; + ascii_numeric(o, indent, 0, m_tones[i]); + } + --indent; + ascii_indent(o,indent); + o << '}'; + --indent; + ascii_indent(o,indent); + o << '}'; +} + +ssize_t Melody::fromMemory(const void *b, ssize_t s) +{ + const uint8_t *a = (const uint8_t *)b; + const uint8_t *e = a + s; + while (a < e) { + varint_t fid; + int fn = read_varint(a,e-a,&fid); + if (fn <= 0) + return -476; + a += fn; + switch (fid) { + case 0xa: // name id 1, type estring, coding byte[] + { + varint_t v; + int n = read_varint(a,e-a,&v); + a += n; + if ((n <= 0) || ((a+v) > e)) + return -477; + m_name.assign((const char*)a,v); + a += v; + } + break; + case 0x14: // tones id 2, type uint16_t, coding 16bit + if ((a+1) >= e) + return -478; + m_tones.push_back((uint16_t) read_u16(a)); + a += 2; + break; + default: + // unknown field (option unknown=skip) + { + ssize_t s = skip_content(a,e-a,fid&7); + if (s <= 0) + return -479; + a += s; + break; + } + } + } + assert((a-(const uint8_t *)b) == s); + if (a > e) + return -480; + return a-(const uint8_t *)b; +} + +ssize_t Melody::toMemory(uint8_t *b, ssize_t s) const +{ + assert(s >= 0); + uint8_t *a = b, *e = b + s; + signed n; + // has name? + if (!m_name.empty()) { + // 'name': id=1, encoding=lenpfx, tag=0xa + if (a >= e) + return -481; + *a++ = 0xa; + ssize_t name_s = m_name.size(); + n = write_varint(a,e-a,name_s); + a += n; + if ((n <= 0) || ((e-a) < name_s)) + return -482; + memcpy(a,m_name.data(),name_s); + a += name_s; + } + for (auto x : m_tones) { + // 'tones': id=2, encoding=16bit, tag=0x14 + if (3 > (e-a)) + return -483; + *a++ = 0x14; + if ((e-a) < 2) + return -484; + write_u16(a,x); + a += 2; + } + assert(a <= e); + return a-b; +} + +void Melody::toJSON(stream &json, unsigned indLvl) const +{ + char fsep = '{'; + ++indLvl; + if (has_name()) { + fsep = json_indent(json,indLvl,fsep,"name"); + json_cstr(json,m_name.c_str()); + } + if (size_t s = m_tones.size()) { + fsep = json_indent(json,indLvl,fsep); + indLvl += 2; + json << "\"tones\":[\n"; + size_t i = 0; + for (;;) { + json_indent(json,indLvl,0); + json << m_tones[i]; + ++i; + if (i == s) + break; + json << ",\n"; + } + indLvl -= 2; + json.put('\n'); + json_indent(json,indLvl,0); + json.put(']'); + } + if (fsep == '{') + json.put('{'); + json.put('\n'); + --indLvl; + json_indent(json,indLvl,0); + json.put('}'); + if (indLvl == 0) + json.put('\n'); +} + +size_t Melody::calcSize() const +{ + size_t r = 0; // required size, default is fixed length + // optional string name, id 1 + if (!m_name.empty()) { + size_t name_s = m_name.size(); + r += name_s + wiresize(name_s) + 1 /* tag(name) 0x8 */; + } + // repeated fixed16 tones, id 2 + if (!m_tones.empty()) { + // tones: non-packed, fixed size elements + r += m_tones.size() * 3; // including tag + } + return r; +} + +bool Melody::operator != (const Melody &r) const +{ + if (has_name() && (m_name != r.m_name)) + return true; + if (m_tones != r.m_tones) + return true; + return false; +} + + +bool Melody::operator == (const Melody &r) const +{ + return !((*this) != r); +} + + +/* + * Function for setting an element in dot notation with an ASCII value. + * It will call the specified parse_ascii function for parsing the value. + * + * @return number of bytes successfully parsed or negative value indicating + * an error. + */ +int Melody::setByName(const char *name, const char *value) +{ + if (0 == strcmp(name,"name")) { + if (value == 0) { + clear_name(); + return 0; + } + m_name = value; + int r = m_name.size(); + return r; + } + if (0 == memcmp(name,"tones",5)) { + if ((name[5] == 0) && (value == 0)) { + clear_tones(); + return 0; + } else if (name[5] == '[') { + char *idxe; + unsigned long x; + if ((name[6] == '+') && (name[7] == ']')) { + x = m_tones.size(); + m_tones.resize(x+1); + idxe = (char*)(name + 7); + if (value == 0) + return 0; + } else { + x = strtoul(name+6,&idxe,0); + if ((idxe[0] != ']') || (idxe == (name+6))) + return -485; + if (m_tones.size() <= x) + return -486; + if ((idxe[1] == 0) && (value == 0)) { + m_tones.erase(m_tones.begin()+x); + return 0; + } + } + if (idxe[1] != 0) + return -487; + return parse_ascii_u16(&m_tones[x],value); + } + } + return -488; +} + +Message *Melody::p_getMember(const char *s, unsigned n) +{ + // caller guarantee: s[n] == '.' + return 0; +} + +Message *Melody::p_getMember(const char *s, unsigned n, unsigned x) +{ + // caller guarantee: s[n] == '[' + return 0; +} + +void BuzzerConfig::clear() +{ + m_gpio = -1; + m_melodies.clear(); +} + +void BuzzerConfig::toASCII(stream &o, size_t indent) const +{ + o << "BuzzerConfig {"; + ++indent; + ascii_numeric(o, indent, "gpio", (signed) m_gpio); + ascii_indent(o,indent); + size_t s_melodies = m_melodies.size(); + o << "melodies[" << s_melodies << "] = {"; + ++indent; + for (size_t i = 0, e = s_melodies; i != e; ++i) { + ascii_indent(o,indent); + o << i << ": "; + m_melodies[i].toASCII(o,indent); + } + --indent; + ascii_indent(o,indent); + o << '}'; + --indent; + ascii_indent(o,indent); + o << '}'; +} + +ssize_t BuzzerConfig::fromMemory(const void *b, ssize_t s) +{ + const uint8_t *a = (const uint8_t *)b; + const uint8_t *e = a + s; + while (a < e) { + varint_t fid; + int fn = read_varint(a,e-a,&fid); + if (fn <= 0) + return -489; + a += fn; + switch (fid) { + case 0x8: // gpio id 1, type int8_t, coding signed varint + { + varint_t v; + int n = read_varint(a,e-a,&v); + if (n <= 0) + return -490; + a += n; + set_gpio(varint_sint(v)); + } + break; + case 0x12: // melodies id 2, type Melody, coding byte[] + { + varint_t v; + int n = read_varint(a,e-a,&v); + a += n; + if ((n <= 0) || ((a+v) > e)) + return -491; + m_melodies.emplace_back(); + if (v != 0) { + n = m_melodies.back().fromMemory((const uint8_t*)a,v); + if (n < 0) + return n; + if (n != (ssize_t)v) + return -492; + a += v; + } + } + break; + default: + // unknown field (option unknown=skip) + { + ssize_t s = skip_content(a,e-a,fid&7); + if (s <= 0) + return -493; + a += s; + break; + } + } + } + assert((a-(const uint8_t *)b) == s); + if (a > e) + return -494; + return a-(const uint8_t *)b; +} + +ssize_t BuzzerConfig::toMemory(uint8_t *b, ssize_t s) const +{ + assert(s >= 0); + uint8_t *a = b, *e = b + s; + signed n; + // has gpio? + if (m_gpio != -1) { + // 'gpio': id=1, encoding=varint, tag=0x8 + if (a >= e) + return -495; + *a++ = 0x8; + n = write_varint(a,e-a,sint_varint(m_gpio)); + if (n <= 0) + return -496; a += n; } - // has dio5? - if (m_dio5 != -1) { - // 'dio5': id=6, encoding=varint, tag=0x30 + for (const auto &x : m_melodies) { + // 'melodies': id=2, encoding=lenpfx, tag=0x12 if (a >= e) - return -454; - *a++ = 0x30; - n = write_varint(a,e-a,sint_varint(m_dio5)); - if (n <= 0) - return -455; + return -497; + *a++ = 0x12; + ssize_t melodies_ws = x.calcSize(); + n = write_varint(a,e-a,melodies_ws); + a += n; + if ((n <= 0) || (melodies_ws > (e-a))) + return -498; + n = x.toMemory(a,e-a); a += n; + assert(n == melodies_ws); } assert(a <= e); return a-b; } -void SX1276Config::toJSON(stream &json, unsigned indLvl) const +void BuzzerConfig::toJSON(stream &json, unsigned indLvl) const { char fsep = '{'; ++indLvl; - if (has_dio0()) { - fsep = json_indent(json,indLvl,fsep,"dio0"); - json << (int) m_dio0; - } - if (has_dio1()) { - fsep = json_indent(json,indLvl,fsep,"dio1"); - json << (int) m_dio1; - } - if (has_dio2()) { - fsep = json_indent(json,indLvl,fsep,"dio2"); - json << (int) m_dio2; - } - if (has_dio3()) { - fsep = json_indent(json,indLvl,fsep,"dio3"); - json << (int) m_dio3; - } - if (has_dio4()) { - fsep = json_indent(json,indLvl,fsep,"dio4"); - json << (int) m_dio4; + if (has_gpio()) { + fsep = json_indent(json,indLvl,fsep,"gpio"); + json << (int) m_gpio; } - if (has_dio5()) { - fsep = json_indent(json,indLvl,fsep,"dio5"); - json << (int) m_dio5; + if (size_t s = m_melodies.size()) { + fsep = json_indent(json,indLvl,fsep); + indLvl += 2; + json << "\"melodies\":[\n"; + size_t i = 0; + for (;;) { + json_indent(json,indLvl,0); + m_melodies[i].toJSON(json,indLvl); + ++i; + if (i == s) + break; + json << ",\n"; + } + indLvl -= 2; + json.put('\n'); + json_indent(json,indLvl,0); + json.put(']'); } if (fsep == '{') json.put('{'); @@ -8461,55 +9317,34 @@ void SX1276Config::toJSON(stream &json, unsigned indLvl) const json.put('\n'); } -size_t SX1276Config::calcSize() const +size_t BuzzerConfig::calcSize() const { size_t r = 0; // required size, default is fixed length - // optional sint8 dio0, id 1 - if (m_dio0 != -1) { - r += wiresize_s((varint_t)m_dio0) + 1 /* tag(dio0) 0x8 */; - } - // optional sint8 dio1, id 2 - if (m_dio1 != -1) { - r += wiresize_s((varint_t)m_dio1) + 1 /* tag(dio1) 0x10 */; - } - // optional sint8 dio2, id 3 - if (m_dio2 != -1) { - r += wiresize_s((varint_t)m_dio2) + 1 /* tag(dio2) 0x18 */; - } - // optional sint8 dio3, id 4 - if (m_dio3 != -1) { - r += wiresize_s((varint_t)m_dio3) + 1 /* tag(dio3) 0x20 */; - } - // optional sint8 dio4, id 5 - if (m_dio4 != -1) { - r += wiresize_s((varint_t)m_dio4) + 1 /* tag(dio4) 0x28 */; + // optional sint8 gpio, id 1 + if (m_gpio != -1) { + r += wiresize_s((varint_t)m_gpio) + 1 /* tag(gpio) 0x8 */; } - // optional sint8 dio5, id 6 - if (m_dio5 != -1) { - r += wiresize_s((varint_t)m_dio5) + 1 /* tag(dio5) 0x30 */; + // repeated Melody melodies, id 2 + // repeated message melodies + for (size_t x = 0, y = m_melodies.size(); x < y; ++x) { + size_t s = m_melodies[x].calcSize(); + r += wiresize(s); + r += s + 1 /* tag(melodies) 0x10 */; } return r; } -bool SX1276Config::operator != (const SX1276Config &r) const +bool BuzzerConfig::operator != (const BuzzerConfig &r) const { - if (has_dio0() && (m_dio0 != r.m_dio0)) - return true; - if (has_dio1() && (m_dio1 != r.m_dio1)) - return true; - if (has_dio2() && (m_dio2 != r.m_dio2)) - return true; - if (has_dio3() && (m_dio3 != r.m_dio3)) - return true; - if (has_dio4() && (m_dio4 != r.m_dio4)) + if (has_gpio() && (m_gpio != r.m_gpio)) return true; - if (has_dio5() && (m_dio5 != r.m_dio5)) + if (m_melodies != r.m_melodies) return true; return false; } -bool SX1276Config::operator == (const SX1276Config &r) const +bool BuzzerConfig::operator == (const BuzzerConfig &r) const { return !((*this) != r); } @@ -8522,68 +9357,61 @@ bool SX1276Config::operator == (const SX1276Config &r) const * @return number of bytes successfully parsed or negative value indicating * an error. */ -int SX1276Config::setByName(const char *name, const char *value) +int BuzzerConfig::setByName(const char *name, const char *value) { - if (0 == strcmp(name,"dio0")) { - if (value == 0) { - clear_dio0(); - return 0; - } - int r = parse_ascii_s8(&m_dio0,value); - return r; - } - if (0 == strcmp(name,"dio1")) { - if (value == 0) { - clear_dio1(); - return 0; - } - int r = parse_ascii_s8(&m_dio1,value); - return r; - } - if (0 == strcmp(name,"dio2")) { - if (value == 0) { - clear_dio2(); - return 0; - } - int r = parse_ascii_s8(&m_dio2,value); - return r; - } - if (0 == strcmp(name,"dio3")) { - if (value == 0) { - clear_dio3(); - return 0; - } - int r = parse_ascii_s8(&m_dio3,value); - return r; - } - if (0 == strcmp(name,"dio4")) { + if (0 == strcmp(name,"gpio")) { if (value == 0) { - clear_dio4(); + clear_gpio(); return 0; } - int r = parse_ascii_s8(&m_dio4,value); + int r = parse_ascii_s8(&m_gpio,value); return r; } - if (0 == strcmp(name,"dio5")) { - if (value == 0) { - clear_dio5(); + if (0 == memcmp(name,"melodies",8)) { + if ((name[8] == 0) && (value == 0)) { + clear_melodies(); return 0; + } else if (name[8] == '[') { + char *idxe; + unsigned long x; + if ((name[9] == '+') && (name[10] == ']')) { + x = m_melodies.size(); + m_melodies.resize(x+1); + idxe = (char*)(name + 10); + if (value == 0) + return 0; + } else { + x = strtoul(name+9,&idxe,0); + if ((idxe[0] != ']') || (idxe == (name+9))) + return -499; + if (m_melodies.size() <= x) + return -500; + if ((idxe[1] == 0) && (value == 0)) { + m_melodies.erase(m_melodies.begin()+x); + return 0; + } + } + if (idxe[1] != '.') + return -501; + return m_melodies[x].setByName(idxe+2,value); } - int r = parse_ascii_s8(&m_dio5,value); - return r; } - return -456; + return -502; } -Message *SX1276Config::p_getMember(const char *s, unsigned n) +Message *BuzzerConfig::p_getMember(const char *s, unsigned n) { // caller guarantee: s[n] == '.' return 0; } -Message *SX1276Config::p_getMember(const char *s, unsigned n, unsigned x) +Message *BuzzerConfig::p_getMember(const char *s, unsigned n, unsigned x) { // caller guarantee: s[n] == '[' + if ((n == 8) && (0 == memcmp("melodies",s,8))) { + if (x < m_melodies.size()) + return &m_melodies[x]; + } return 0; } @@ -8612,6 +9440,9 @@ void HardwareConfig::clear() #ifdef CONFIG_LEDS m_led.clear(); #endif // CONFIG_LEDS + #ifdef CONFIG_BUZZER + m_buzzer.clear(); + #endif // CONFIG_BUZZER #ifdef CONFIG_HLW8012 m_hlw8012.clear(); #endif // CONFIG_HLW8012 @@ -8755,6 +9586,10 @@ void HardwareConfig::toASCII(stream &o, size_t indent) const ascii_indent(o,indent); o << '}'; #endif // CONFIG_LEDS + #ifdef CONFIG_BUZZER + ascii_indent(o,indent,"buzzer"); + m_buzzer.toASCII(o,indent); + #endif // CONFIG_BUZZER #ifdef CONFIG_HLW8012 ascii_indent(o,indent,"hlw8012"); m_hlw8012.toASCII(o,indent); @@ -8852,12 +9687,12 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) varint_t fid; int fn = read_varint(a,e-a,&fid); if (fn <= 0) - return -457; + return -503; a += fn; switch (fid) { case 0x5: // magic id 0, type uint32_t, coding 32bit if ((a+3) >= e) - return -458; + return -504; set_magic((uint32_t) read_u32(a)); a += 4; break; @@ -8867,13 +9702,13 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -459; + return -505; if (v != 0) { n = m_system.fromMemory((const uint8_t*)a,v); if (n < 0) return n; if (n != (ssize_t)v) - return -460; + return -506; a += v; } } @@ -8885,14 +9720,14 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -461; + return -507; m_uart.emplace_back(); if (v != 0) { n = m_uart.back().fromMemory((const uint8_t*)a,v); if (n < 0) return n; if (n != (ssize_t)v) - return -462; + return -508; a += v; } } @@ -8903,13 +9738,13 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -463; + return -509; if (v != 0) { n = m_adc.fromMemory((const uint8_t*)a,v); if (n < 0) return n; if (n != (ssize_t)v) - return -464; + return -510; a += v; } } @@ -8922,13 +9757,13 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -465; + return -511; if (v != 0) { n = m_touchpad.fromMemory((const uint8_t*)a,v); if (n < 0) return n; if (n != (ssize_t)v) - return -466; + return -512; a += v; } } @@ -8942,14 +9777,14 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -467; + return -513; m_tp_channel.emplace_back(); if (v != 0) { n = m_tp_channel.back().fromMemory((const uint8_t*)a,v); if (n < 0) return n; if (n != (ssize_t)v) - return -468; + return -514; a += v; } } @@ -8961,14 +9796,14 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -469; + return -515; m_gpios.emplace_back(); if (v != 0) { n = m_gpios.back().fromMemory((const uint8_t*)a,v); if (n < 0) return n; if (n != (ssize_t)v) - return -470; + return -516; a += v; } } @@ -8980,14 +9815,14 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -471; + return -517; m_spibus.emplace_back(); if (v != 0) { n = m_spibus.back().fromMemory((const uint8_t*)a,v); if (n < 0) return n; if (n != (ssize_t)v) - return -472; + return -518; a += v; } } @@ -9000,14 +9835,14 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -473; + return -519; m_button.emplace_back(); if (v != 0) { n = m_button.back().fromMemory((const uint8_t*)a,v); if (n < 0) return n; if (n != (ssize_t)v) - return -474; + return -520; a += v; } } @@ -9020,14 +9855,14 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -475; + return -521; m_relay.emplace_back(); if (v != 0) { n = m_relay.back().fromMemory((const uint8_t*)a,v); if (n < 0) return n; if (n != (ssize_t)v) - return -476; + return -522; a += v; } } @@ -9040,19 +9875,39 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -477; + return -523; m_led.emplace_back(); if (v != 0) { n = m_led.back().fromMemory((const uint8_t*)a,v); if (n < 0) return n; if (n != (ssize_t)v) - return -478; + return -524; a += v; } } break; #endif // CONFIG_LEDS + #ifdef CONFIG_BUZZER + case 0x9a: // buzzer id 19, type BuzzerConfig, coding byte[] + { + varint_t v; + int n = read_varint(a,e-a,&v); + a += n; + if ((n <= 0) || ((a+v) > e)) + return -525; + if (v != 0) { + n = m_buzzer.fromMemory((const uint8_t*)a,v); + if (n < 0) + return n; + if (n != (ssize_t)v) + return -526; + a += v; + } + } + p_validbits |= ((uint16_t)1U << 4); + break; + #endif // CONFIG_BUZZER #ifdef CONFIG_HLW8012 case 0xa2: // hlw8012 id 20, type Hlw8012Config, coding byte[] { @@ -9060,17 +9915,17 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -479; + return -527; if (v != 0) { n = m_hlw8012.fromMemory((const uint8_t*)a,v); if (n < 0) return n; if (n != (ssize_t)v) - return -480; + return -528; a += v; } } - p_validbits |= ((uint16_t)1U << 4); + p_validbits |= ((uint16_t)1U << 5); break; #endif // CONFIG_HLW8012 #ifdef CONFIG_MAX7219 @@ -9080,17 +9935,17 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -481; + return -529; if (v != 0) { n = m_max7219.fromMemory((const uint8_t*)a,v); if (n < 0) return n; if (n != (ssize_t)v) - return -482; + return -530; a += v; } } - p_validbits |= ((uint16_t)1U << 5); + p_validbits |= ((uint16_t)1U << 6); break; #endif // CONFIG_MAX7219 #ifdef CONFIG_TLC5947 @@ -9100,17 +9955,17 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -483; + return -531; if (v != 0) { n = m_tlc5947.fromMemory((const uint8_t*)a,v); if (n < 0) return n; if (n != (ssize_t)v) - return -484; + return -532; a += v; } } - p_validbits |= ((uint16_t)1U << 6); + p_validbits |= ((uint16_t)1U << 7); break; #endif // CONFIG_TLC5947 #ifdef CONFIG_RGBLEDS @@ -9120,14 +9975,14 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -485; + return -533; m_ws2812b.emplace_back(); if (v != 0) { n = m_ws2812b.back().fromMemory((const uint8_t*)a,v); if (n < 0) return n; if (n != (ssize_t)v) - return -486; + return -534; a += v; } } @@ -9140,17 +9995,17 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -487; + return -535; if (v != 0) { n = m_dht.fromMemory((const uint8_t*)a,v); if (n < 0) return n; if (n != (ssize_t)v) - return -488; + return -536; a += v; } } - p_validbits |= ((uint16_t)1U << 7); + p_validbits |= ((uint16_t)1U << 8); break; #endif // CONFIG_DHT #ifdef CONFIG_I2C @@ -9160,14 +10015,14 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -489; + return -537; m_i2c.emplace_back(); if (v != 0) { n = m_i2c.back().fromMemory((const uint8_t*)a,v); if (n < 0) return n; if (n != (ssize_t)v) - return -490; + return -538; a += v; } } @@ -9180,14 +10035,14 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -491; + return -539; m_hcsr04.emplace_back(); if (v != 0) { n = m_hcsr04.back().fromMemory((const uint8_t*)a,v); if (n < 0) return n; if (n != (ssize_t)v) - return -492; + return -540; a += v; } } @@ -9200,17 +10055,17 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -493; + return -541; if (v != 0) { n = m_onewire.fromMemory((const uint8_t*)a,v); if (n < 0) return n; if (n != (ssize_t)v) - return -494; + return -542; a += v; } } - p_validbits |= ((uint16_t)1U << 8); + p_validbits |= ((uint16_t)1U << 9); break; #endif // CONFIG_ONEWIRE #ifdef CONFIG_SX1276 @@ -9220,17 +10075,17 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -495; + return -543; if (v != 0) { n = m_sx1276.fromMemory((const uint8_t*)a,v); if (n < 0) return n; if (n != (ssize_t)v) - return -496; + return -544; a += v; } } - p_validbits |= ((uint16_t)1U << 9); + p_validbits |= ((uint16_t)1U << 10); break; #endif // CONFIG_SX1276 #ifdef CONFIG_IOEXTENDERS @@ -9240,14 +10095,14 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -497; + return -545; m_iocluster.emplace_back(); if (v != 0) { n = m_iocluster.back().fromMemory((const uint8_t*)a,v); if (n < 0) return n; if (n != (ssize_t)v) - return -498; + return -546; a += v; } } @@ -9260,17 +10115,17 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -499; + return -547; if (v != 0) { n = m_display.fromMemory((const uint8_t*)a,v); if (n < 0) return n; if (n != (ssize_t)v) - return -500; + return -548; a += v; } } - p_validbits |= ((uint16_t)1U << 10); + p_validbits |= ((uint16_t)1U << 11); break; #endif // CONFIG_DISPLAY default: @@ -9278,7 +10133,7 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) { ssize_t s = skip_content(a,e-a,fid&7); if (s <= 0) - return -501; + return -549; a += s; break; } @@ -9286,7 +10141,7 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) } assert((a-(const uint8_t *)b) == s); if (a > e) - return -502; + return -550; return a-(const uint8_t *)b; } @@ -9299,10 +10154,10 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const if (0 != (p_validbits & ((uint16_t)1U << 0))) { // 'magic': id=0, encoding=32bit, tag=0x5 if (5 > (e-a)) - return -503; + return -551; *a++ = 0x5; if ((e-a) < 4) - return -504; + return -552; write_u32(a,(uint32_t)m_magic); a += 4; } @@ -9310,13 +10165,13 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const if (0 != (p_validbits & ((uint16_t)1U << 1))) { // 'system': id=1, encoding=lenpfx, tag=0xa if (a >= e) - return -505; + return -553; *a++ = 0xa; ssize_t system_ws = m_system.calcSize(); n = write_varint(a,e-a,system_ws); a += n; if ((n <= 0) || (system_ws > (e-a))) - return -506; + return -554; n = m_system.toMemory(a,e-a); a += n; assert(n == system_ws); @@ -9324,13 +10179,13 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const for (const auto &x : m_uart) { // 'uart': id=3, encoding=lenpfx, tag=0x1a if (a >= e) - return -507; + return -555; *a++ = 0x1a; ssize_t uart_ws = x.calcSize(); n = write_varint(a,e-a,uart_ws); a += n; if ((n <= 0) || (uart_ws > (e-a))) - return -508; + return -556; n = x.toMemory(a,e-a); a += n; assert(n == uart_ws); @@ -9339,13 +10194,13 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const if (0 != (p_validbits & ((uint16_t)1U << 2))) { // 'adc': id=4, encoding=lenpfx, tag=0x22 if (a >= e) - return -509; + return -557; *a++ = 0x22; ssize_t adc_ws = m_adc.calcSize(); n = write_varint(a,e-a,adc_ws); a += n; if ((n <= 0) || (adc_ws > (e-a))) - return -510; + return -558; n = m_adc.toMemory(a,e-a); a += n; assert(n == adc_ws); @@ -9355,13 +10210,13 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const if (0 != (p_validbits & ((uint16_t)1U << 3))) { // 'touchpad': id=5, encoding=lenpfx, tag=0x2a if (a >= e) - return -511; + return -559; *a++ = 0x2a; ssize_t touchpad_ws = m_touchpad.calcSize(); n = write_varint(a,e-a,touchpad_ws); a += n; if ((n <= 0) || (touchpad_ws > (e-a))) - return -512; + return -560; n = m_touchpad.toMemory(a,e-a); a += n; assert(n == touchpad_ws); @@ -9371,13 +10226,13 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const for (const auto &x : m_tp_channel) { // 'tp_channel': id=6, encoding=lenpfx, tag=0x32 if (a >= e) - return -513; + return -561; *a++ = 0x32; ssize_t tp_channel_ws = x.calcSize(); n = write_varint(a,e-a,tp_channel_ws); a += n; if ((n <= 0) || (tp_channel_ws > (e-a))) - return -514; + return -562; n = x.toMemory(a,e-a); a += n; assert(n == tp_channel_ws); @@ -9386,13 +10241,13 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const for (const auto &x : m_gpios) { // 'gpios': id=7, encoding=lenpfx, tag=0x3a if (a >= e) - return -515; + return -563; *a++ = 0x3a; ssize_t gpios_ws = x.calcSize(); n = write_varint(a,e-a,gpios_ws); a += n; if ((n <= 0) || (gpios_ws > (e-a))) - return -516; + return -564; n = x.toMemory(a,e-a); a += n; assert(n == gpios_ws); @@ -9401,13 +10256,13 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const for (const auto &x : m_spibus) { // 'spibus': id=8, encoding=lenpfx, tag=0x42 if (a >= e) - return -517; + return -565; *a++ = 0x42; ssize_t spibus_ws = x.calcSize(); n = write_varint(a,e-a,spibus_ws); a += n; if ((n <= 0) || (spibus_ws > (e-a))) - return -518; + return -566; n = x.toMemory(a,e-a); a += n; assert(n == spibus_ws); @@ -9417,14 +10272,14 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const for (const auto &x : m_button) { // 'button': id=16, encoding=lenpfx, tag=0x82 if (2 > (e-a)) - return -519; + return -567; *a++ = 0x82; *a++ = 0x1; ssize_t button_ws = x.calcSize(); n = write_varint(a,e-a,button_ws); a += n; if ((n <= 0) || (button_ws > (e-a))) - return -520; + return -568; n = x.toMemory(a,e-a); a += n; assert(n == button_ws); @@ -9434,14 +10289,14 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const for (const auto &x : m_relay) { // 'relay': id=17, encoding=lenpfx, tag=0x8a if (2 > (e-a)) - return -521; + return -569; *a++ = 0x8a; *a++ = 0x1; ssize_t relay_ws = x.calcSize(); n = write_varint(a,e-a,relay_ws); a += n; if ((n <= 0) || (relay_ws > (e-a))) - return -522; + return -570; n = x.toMemory(a,e-a); a += n; assert(n == relay_ws); @@ -9451,32 +10306,50 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const for (const auto &x : m_led) { // 'led': id=18, encoding=lenpfx, tag=0x92 if (2 > (e-a)) - return -523; + return -571; *a++ = 0x92; *a++ = 0x1; ssize_t led_ws = x.calcSize(); n = write_varint(a,e-a,led_ws); a += n; if ((n <= 0) || (led_ws > (e-a))) - return -524; + return -572; n = x.toMemory(a,e-a); a += n; assert(n == led_ws); } #endif // CONFIG_LEDS + #ifdef CONFIG_BUZZER + // has buzzer? + if (0 != (p_validbits & ((uint16_t)1U << 4))) { + // 'buzzer': id=19, encoding=lenpfx, tag=0x9a + if (2 > (e-a)) + return -573; + *a++ = 0x9a; + *a++ = 0x1; + ssize_t buzzer_ws = m_buzzer.calcSize(); + n = write_varint(a,e-a,buzzer_ws); + a += n; + if ((n <= 0) || (buzzer_ws > (e-a))) + return -574; + n = m_buzzer.toMemory(a,e-a); + a += n; + assert(n == buzzer_ws); + } + #endif // CONFIG_BUZZER #ifdef CONFIG_HLW8012 // has hlw8012? - if (0 != (p_validbits & ((uint16_t)1U << 4))) { + if (0 != (p_validbits & ((uint16_t)1U << 5))) { // 'hlw8012': id=20, encoding=lenpfx, tag=0xa2 if (2 > (e-a)) - return -525; + return -575; *a++ = 0xa2; *a++ = 0x1; ssize_t hlw8012_ws = m_hlw8012.calcSize(); n = write_varint(a,e-a,hlw8012_ws); a += n; if ((n <= 0) || (hlw8012_ws > (e-a))) - return -526; + return -576; n = m_hlw8012.toMemory(a,e-a); a += n; assert(n == hlw8012_ws); @@ -9484,17 +10357,17 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const #endif // CONFIG_HLW8012 #ifdef CONFIG_MAX7219 // has max7219? - if (0 != (p_validbits & ((uint16_t)1U << 5))) { + if (0 != (p_validbits & ((uint16_t)1U << 6))) { // 'max7219': id=32, encoding=lenpfx, tag=0x102 if (2 > (e-a)) - return -527; + return -577; *a++ = 0x82; *a++ = 0x2; ssize_t max7219_ws = m_max7219.calcSize(); n = write_varint(a,e-a,max7219_ws); a += n; if ((n <= 0) || (max7219_ws > (e-a))) - return -528; + return -578; n = m_max7219.toMemory(a,e-a); a += n; assert(n == max7219_ws); @@ -9502,17 +10375,17 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const #endif // CONFIG_MAX7219 #ifdef CONFIG_TLC5947 // has tlc5947? - if (0 != (p_validbits & ((uint16_t)1U << 6))) { + if (0 != (p_validbits & ((uint16_t)1U << 7))) { // 'tlc5947': id=33, encoding=lenpfx, tag=0x10a if (2 > (e-a)) - return -529; + return -579; *a++ = 0x8a; *a++ = 0x2; ssize_t tlc5947_ws = m_tlc5947.calcSize(); n = write_varint(a,e-a,tlc5947_ws); a += n; if ((n <= 0) || (tlc5947_ws > (e-a))) - return -530; + return -580; n = m_tlc5947.toMemory(a,e-a); a += n; assert(n == tlc5947_ws); @@ -9522,14 +10395,14 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const for (const auto &x : m_ws2812b) { // 'ws2812b': id=34, encoding=lenpfx, tag=0x112 if (2 > (e-a)) - return -531; + return -581; *a++ = 0x92; *a++ = 0x2; ssize_t ws2812b_ws = x.calcSize(); n = write_varint(a,e-a,ws2812b_ws); a += n; if ((n <= 0) || (ws2812b_ws > (e-a))) - return -532; + return -582; n = x.toMemory(a,e-a); a += n; assert(n == ws2812b_ws); @@ -9537,17 +10410,17 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const #endif // CONFIG_RGBLEDS #ifdef CONFIG_DHT // has dht? - if (0 != (p_validbits & ((uint16_t)1U << 7))) { + if (0 != (p_validbits & ((uint16_t)1U << 8))) { // 'dht': id=35, encoding=lenpfx, tag=0x11a if (2 > (e-a)) - return -533; + return -583; *a++ = 0x9a; *a++ = 0x2; ssize_t dht_ws = m_dht.calcSize(); n = write_varint(a,e-a,dht_ws); a += n; if ((n <= 0) || (dht_ws > (e-a))) - return -534; + return -584; n = m_dht.toMemory(a,e-a); a += n; assert(n == dht_ws); @@ -9557,14 +10430,14 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const for (const auto &x : m_i2c) { // 'i2c': id=36, encoding=lenpfx, tag=0x122 if (2 > (e-a)) - return -535; + return -585; *a++ = 0xa2; *a++ = 0x2; ssize_t i2c_ws = x.calcSize(); n = write_varint(a,e-a,i2c_ws); a += n; if ((n <= 0) || (i2c_ws > (e-a))) - return -536; + return -586; n = x.toMemory(a,e-a); a += n; assert(n == i2c_ws); @@ -9574,14 +10447,14 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const for (const auto &x : m_hcsr04) { // 'hcsr04': id=37, encoding=lenpfx, tag=0x12a if (2 > (e-a)) - return -537; + return -587; *a++ = 0xaa; *a++ = 0x2; ssize_t hcsr04_ws = x.calcSize(); n = write_varint(a,e-a,hcsr04_ws); a += n; if ((n <= 0) || (hcsr04_ws > (e-a))) - return -538; + return -588; n = x.toMemory(a,e-a); a += n; assert(n == hcsr04_ws); @@ -9589,17 +10462,17 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const #endif // CONFIG_HCSR04 #ifdef CONFIG_ONEWIRE // has onewire? - if (0 != (p_validbits & ((uint16_t)1U << 8))) { + if (0 != (p_validbits & ((uint16_t)1U << 9))) { // 'onewire': id=38, encoding=lenpfx, tag=0x132 if (2 > (e-a)) - return -539; + return -589; *a++ = 0xb2; *a++ = 0x2; ssize_t onewire_ws = m_onewire.calcSize(); n = write_varint(a,e-a,onewire_ws); a += n; if ((n <= 0) || (onewire_ws > (e-a))) - return -540; + return -590; n = m_onewire.toMemory(a,e-a); a += n; assert(n == onewire_ws); @@ -9607,17 +10480,17 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const #endif // CONFIG_ONEWIRE #ifdef CONFIG_SX1276 // has sx1276? - if (0 != (p_validbits & ((uint16_t)1U << 9))) { + if (0 != (p_validbits & ((uint16_t)1U << 10))) { // 'sx1276': id=39, encoding=lenpfx, tag=0x13a if (2 > (e-a)) - return -541; + return -591; *a++ = 0xba; *a++ = 0x2; ssize_t sx1276_ws = m_sx1276.calcSize(); n = write_varint(a,e-a,sx1276_ws); a += n; if ((n <= 0) || (sx1276_ws > (e-a))) - return -542; + return -592; n = m_sx1276.toMemory(a,e-a); a += n; assert(n == sx1276_ws); @@ -9627,14 +10500,14 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const for (const auto &x : m_iocluster) { // 'iocluster': id=40, encoding=lenpfx, tag=0x142 if (2 > (e-a)) - return -543; + return -593; *a++ = 0xc2; *a++ = 0x2; ssize_t iocluster_ws = x.calcSize(); n = write_varint(a,e-a,iocluster_ws); a += n; if ((n <= 0) || (iocluster_ws > (e-a))) - return -544; + return -594; n = x.toMemory(a,e-a); a += n; assert(n == iocluster_ws); @@ -9642,17 +10515,17 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const #endif // CONFIG_IOEXTENDERS #ifdef CONFIG_DISPLAY // has display? - if (0 != (p_validbits & ((uint16_t)1U << 10))) { + if (0 != (p_validbits & ((uint16_t)1U << 11))) { // 'display': id=50, encoding=lenpfx, tag=0x192 if (2 > (e-a)) - return -545; + return -595; *a++ = 0x92; *a++ = 0x3; ssize_t display_ws = m_display.calcSize(); n = write_varint(a,e-a,display_ws); a += n; if ((n <= 0) || (display_ws > (e-a))) - return -546; + return -596; n = m_display.toMemory(a,e-a); a += n; assert(n == display_ws); @@ -9820,6 +10693,12 @@ void HardwareConfig::toJSON(stream &json, unsigned indLvl) const json.put(']'); } #endif // CONFIG_LEDS + #ifdef CONFIG_BUZZER + if (has_buzzer()) { + fsep = json_indent(json,indLvl,fsep,"buzzer"); + m_buzzer.toJSON(json,indLvl); + } + #endif // CONFIG_BUZZER #ifdef CONFIG_HLW8012 if (has_hlw8012()) { fsep = json_indent(json,indLvl,fsep,"hlw8012"); @@ -10035,23 +10914,30 @@ size_t HardwareConfig::calcSize() const r += s + 2 /* tag(led) 0x90 */; } #endif // CONFIG_LEDS + #ifdef CONFIG_BUZZER + // optional BuzzerConfig buzzer, id 19 + if (0 != (p_validbits & ((uint16_t)1U << 4))) { + size_t buzzer_s = m_buzzer.calcSize(); + r += buzzer_s + wiresize(buzzer_s) + 2 /* tag(buzzer) 0x98 */; + } + #endif // CONFIG_BUZZER #ifdef CONFIG_HLW8012 // optional Hlw8012Config hlw8012, id 20 - if (0 != (p_validbits & ((uint16_t)1U << 4))) { + if (0 != (p_validbits & ((uint16_t)1U << 5))) { size_t hlw8012_s = m_hlw8012.calcSize(); r += hlw8012_s + wiresize(hlw8012_s) + 2 /* tag(hlw8012) 0xa0 */; } #endif // CONFIG_HLW8012 #ifdef CONFIG_MAX7219 // optional Max7219Config max7219, id 32 - if (0 != (p_validbits & ((uint16_t)1U << 5))) { + if (0 != (p_validbits & ((uint16_t)1U << 6))) { size_t max7219_s = m_max7219.calcSize(); r += max7219_s + wiresize(max7219_s) + 2 /* tag(max7219) 0x100 */; } #endif // CONFIG_MAX7219 #ifdef CONFIG_TLC5947 // optional Tlc5947Config tlc5947, id 33 - if (0 != (p_validbits & ((uint16_t)1U << 6))) { + if (0 != (p_validbits & ((uint16_t)1U << 7))) { size_t tlc5947_s = m_tlc5947.calcSize(); r += tlc5947_s + wiresize(tlc5947_s) + 2 /* tag(tlc5947) 0x108 */; } @@ -10067,7 +10953,7 @@ size_t HardwareConfig::calcSize() const #endif // CONFIG_RGBLEDS #ifdef CONFIG_DHT // optional DhtConfig dht, id 35 - if (0 != (p_validbits & ((uint16_t)1U << 7))) { + if (0 != (p_validbits & ((uint16_t)1U << 8))) { size_t dht_s = m_dht.calcSize(); r += dht_s + wiresize(dht_s) + 2 /* tag(dht) 0x118 */; } @@ -10092,14 +10978,14 @@ size_t HardwareConfig::calcSize() const #endif // CONFIG_HCSR04 #ifdef CONFIG_ONEWIRE // optional OneWireConfig onewire, id 38 - if (0 != (p_validbits & ((uint16_t)1U << 8))) { + if (0 != (p_validbits & ((uint16_t)1U << 9))) { size_t onewire_s = m_onewire.calcSize(); r += onewire_s + wiresize(onewire_s) + 2 /* tag(onewire) 0x130 */; } #endif // CONFIG_ONEWIRE #ifdef CONFIG_SX1276 // optional SX1276Config sx1276, id 39 - if (0 != (p_validbits & ((uint16_t)1U << 9))) { + if (0 != (p_validbits & ((uint16_t)1U << 10))) { size_t sx1276_s = m_sx1276.calcSize(); r += sx1276_s + wiresize(sx1276_s) + 2 /* tag(sx1276) 0x138 */; } @@ -10115,7 +11001,7 @@ size_t HardwareConfig::calcSize() const #endif // CONFIG_IOEXTENDERS #ifdef CONFIG_DISPLAY // optional DisplayConfig display, id 50 - if (0 != (p_validbits & ((uint16_t)1U << 10))) { + if (0 != (p_validbits & ((uint16_t)1U << 11))) { size_t display_s = m_display.calcSize(); r += display_s + wiresize(display_s) + 2 /* tag(display) 0x190 */; } @@ -10161,6 +11047,10 @@ bool HardwareConfig::operator != (const HardwareConfig &r) const if (m_led != r.m_led) return true; #endif // CONFIG_LEDS + #ifdef CONFIG_BUZZER + if (has_buzzer() && (m_buzzer != r.m_buzzer)) + return true; + #endif // CONFIG_BUZZER #ifdef CONFIG_HLW8012 if (has_hlw8012() && (m_hlw8012 != r.m_hlw8012)) return true; @@ -10259,16 +11149,16 @@ int HardwareConfig::setByName(const char *name, const char *value) } else { x = strtoul(name+5,&idxe,0); if ((idxe[0] != ']') || (idxe == (name+5))) - return -547; + return -597; if (m_uart.size() <= x) - return -548; + return -598; if ((idxe[1] == 0) && (value == 0)) { m_uart.erase(m_uart.begin()+x); return 0; } } if (idxe[1] != '.') - return -549; + return -599; return m_uart[x].setByName(idxe+2,value); } } @@ -10309,16 +11199,16 @@ int HardwareConfig::setByName(const char *name, const char *value) } else { x = strtoul(name+11,&idxe,0); if ((idxe[0] != ']') || (idxe == (name+11))) - return -550; + return -600; if (m_tp_channel.size() <= x) - return -551; + return -601; if ((idxe[1] == 0) && (value == 0)) { m_tp_channel.erase(m_tp_channel.begin()+x); return 0; } } if (idxe[1] != '.') - return -552; + return -602; return m_tp_channel[x].setByName(idxe+2,value); } } @@ -10339,16 +11229,16 @@ int HardwareConfig::setByName(const char *name, const char *value) } else { x = strtoul(name+6,&idxe,0); if ((idxe[0] != ']') || (idxe == (name+6))) - return -553; + return -603; if (m_gpios.size() <= x) - return -554; + return -604; if ((idxe[1] == 0) && (value == 0)) { m_gpios.erase(m_gpios.begin()+x); return 0; } } if (idxe[1] != '.') - return -555; + return -605; return m_gpios[x].setByName(idxe+2,value); } } @@ -10369,16 +11259,16 @@ int HardwareConfig::setByName(const char *name, const char *value) } else { x = strtoul(name+7,&idxe,0); if ((idxe[0] != ']') || (idxe == (name+7))) - return -556; + return -606; if (m_spibus.size() <= x) - return -557; + return -607; if ((idxe[1] == 0) && (value == 0)) { m_spibus.erase(m_spibus.begin()+x); return 0; } } if (idxe[1] != '.') - return -558; + return -608; return m_spibus[x].setByName(idxe+2,value); } } @@ -10400,16 +11290,16 @@ int HardwareConfig::setByName(const char *name, const char *value) } else { x = strtoul(name+7,&idxe,0); if ((idxe[0] != ']') || (idxe == (name+7))) - return -559; + return -609; if (m_button.size() <= x) - return -560; + return -610; if ((idxe[1] == 0) && (value == 0)) { m_button.erase(m_button.begin()+x); return 0; } } if (idxe[1] != '.') - return -561; + return -611; return m_button[x].setByName(idxe+2,value); } } @@ -10431,16 +11321,16 @@ int HardwareConfig::setByName(const char *name, const char *value) } else { x = strtoul(name+6,&idxe,0); if ((idxe[0] != ']') || (idxe == (name+6))) - return -562; + return -612; if (m_relay.size() <= x) - return -563; + return -613; if ((idxe[1] == 0) && (value == 0)) { m_relay.erase(m_relay.begin()+x); return 0; } } if (idxe[1] != '.') - return -564; + return -614; return m_relay[x].setByName(idxe+2,value); } } @@ -10462,27 +11352,38 @@ int HardwareConfig::setByName(const char *name, const char *value) } else { x = strtoul(name+4,&idxe,0); if ((idxe[0] != ']') || (idxe == (name+4))) - return -565; + return -615; if (m_led.size() <= x) - return -566; + return -616; if ((idxe[1] == 0) && (value == 0)) { m_led.erase(m_led.begin()+x); return 0; } } if (idxe[1] != '.') - return -567; + return -617; return m_led[x].setByName(idxe+2,value); } } #endif // CONFIG_LEDS + #ifdef CONFIG_BUZZER + if (0 == memcmp(name,"buzzer",6)) { + if ((name[6] == 0) && (value == 0)) { + clear_buzzer(); + return 0; + } else if (name[6] == '.') { + p_validbits |= ((uint16_t)1U << 4); + return m_buzzer.setByName(name+7,value); + } + } + #endif // CONFIG_BUZZER #ifdef CONFIG_HLW8012 if (0 == memcmp(name,"hlw8012",7)) { if ((name[7] == 0) && (value == 0)) { clear_hlw8012(); return 0; } else if (name[7] == '.') { - p_validbits |= ((uint16_t)1U << 4); + p_validbits |= ((uint16_t)1U << 5); return m_hlw8012.setByName(name+8,value); } } @@ -10493,7 +11394,7 @@ int HardwareConfig::setByName(const char *name, const char *value) clear_max7219(); return 0; } else if (name[7] == '.') { - p_validbits |= ((uint16_t)1U << 5); + p_validbits |= ((uint16_t)1U << 6); return m_max7219.setByName(name+8,value); } } @@ -10504,7 +11405,7 @@ int HardwareConfig::setByName(const char *name, const char *value) clear_tlc5947(); return 0; } else if (name[7] == '.') { - p_validbits |= ((uint16_t)1U << 6); + p_validbits |= ((uint16_t)1U << 7); return m_tlc5947.setByName(name+8,value); } } @@ -10526,16 +11427,16 @@ int HardwareConfig::setByName(const char *name, const char *value) } else { x = strtoul(name+8,&idxe,0); if ((idxe[0] != ']') || (idxe == (name+8))) - return -568; + return -618; if (m_ws2812b.size() <= x) - return -569; + return -619; if ((idxe[1] == 0) && (value == 0)) { m_ws2812b.erase(m_ws2812b.begin()+x); return 0; } } if (idxe[1] != '.') - return -570; + return -620; return m_ws2812b[x].setByName(idxe+2,value); } } @@ -10546,7 +11447,7 @@ int HardwareConfig::setByName(const char *name, const char *value) clear_dht(); return 0; } else if (name[3] == '.') { - p_validbits |= ((uint16_t)1U << 7); + p_validbits |= ((uint16_t)1U << 8); return m_dht.setByName(name+4,value); } } @@ -10568,16 +11469,16 @@ int HardwareConfig::setByName(const char *name, const char *value) } else { x = strtoul(name+4,&idxe,0); if ((idxe[0] != ']') || (idxe == (name+4))) - return -571; + return -621; if (m_i2c.size() <= x) - return -572; + return -622; if ((idxe[1] == 0) && (value == 0)) { m_i2c.erase(m_i2c.begin()+x); return 0; } } if (idxe[1] != '.') - return -573; + return -623; return m_i2c[x].setByName(idxe+2,value); } } @@ -10599,16 +11500,16 @@ int HardwareConfig::setByName(const char *name, const char *value) } else { x = strtoul(name+7,&idxe,0); if ((idxe[0] != ']') || (idxe == (name+7))) - return -574; + return -624; if (m_hcsr04.size() <= x) - return -575; + return -625; if ((idxe[1] == 0) && (value == 0)) { m_hcsr04.erase(m_hcsr04.begin()+x); return 0; } } if (idxe[1] != '.') - return -576; + return -626; return m_hcsr04[x].setByName(idxe+2,value); } } @@ -10619,7 +11520,7 @@ int HardwareConfig::setByName(const char *name, const char *value) clear_onewire(); return 0; } else if (name[7] == '.') { - p_validbits |= ((uint16_t)1U << 8); + p_validbits |= ((uint16_t)1U << 9); return m_onewire.setByName(name+8,value); } } @@ -10630,7 +11531,7 @@ int HardwareConfig::setByName(const char *name, const char *value) clear_sx1276(); return 0; } else if (name[6] == '.') { - p_validbits |= ((uint16_t)1U << 9); + p_validbits |= ((uint16_t)1U << 10); return m_sx1276.setByName(name+7,value); } } @@ -10652,16 +11553,16 @@ int HardwareConfig::setByName(const char *name, const char *value) } else { x = strtoul(name+10,&idxe,0); if ((idxe[0] != ']') || (idxe == (name+10))) - return -577; + return -627; if (m_iocluster.size() <= x) - return -578; + return -628; if ((idxe[1] == 0) && (value == 0)) { m_iocluster.erase(m_iocluster.begin()+x); return 0; } } if (idxe[1] != '.') - return -579; + return -629; return m_iocluster[x].setByName(idxe+2,value); } } @@ -10672,12 +11573,12 @@ int HardwareConfig::setByName(const char *name, const char *value) clear_display(); return 0; } else if (name[7] == '.') { - p_validbits |= ((uint16_t)1U << 10); + p_validbits |= ((uint16_t)1U << 11); return m_display.setByName(name+8,value); } } #endif // CONFIG_DISPLAY - return -580; + return -630; } Message *HardwareConfig::p_getMember(const char *s, unsigned n) @@ -10691,6 +11592,10 @@ Message *HardwareConfig::p_getMember(const char *s, unsigned n) if ((n == 8) && (0 == memcmp("touchpad",s,8))) return &m_touchpad; #endif // CONFIG_TOUCHPAD + #ifdef CONFIG_BUZZER + if ((n == 6) && (0 == memcmp("buzzer",s,6))) + return &m_buzzer; + #endif // CONFIG_BUZZER #ifdef CONFIG_HLW8012 if ((n == 7) && (0 == memcmp("hlw8012",s,7))) return &m_hlw8012; diff --git a/components/wfc/hwcfg_esp32.h b/components/wfc/hwcfg_esp32.h index a6be31b..6e55cc3 100644 --- a/components/wfc/hwcfg_esp32.h +++ b/components/wfc/hwcfg_esp32.h @@ -1,8 +1,8 @@ /**************************************************************************** * * Code generated by Wire-Format-Compiler (WFC) - * WFC Version: P2304 (hg:456/095c4982cbea) - * WFC is Copyright 2015-2022, Thomas Maier-Komor + * WFC Version: P2304.3 (hg:459/5fefa02bc543) + * WFC is Copyright 2015-2023, Thomas Maier-Komor * * Source Information: * =================== @@ -10,7 +10,7 @@ * Copyright: 2018-2023 * Author : Thomas Maier-Komor * - * Code generated on 2023-10-24, 21:26:41 (CET). + * Code generated on 2023-11-26, 14:29:43 (CET). * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -508,6 +508,46 @@ class SystemConfig : public Message bool *mutable_usb_con(); #endif // CONFIG_USB_CONSOLE + #ifdef CONFIG_ESP_PHY_ENABLE_USB + // optional sint8 cc1_gpio, id 11 + /*! + * Function for querying if cc1_gpio has been set. + * @return true if cc1_gpio is set. + */ + bool has_cc1_gpio() const; + //! Function to reset cc1_gpio to its default/unset value. + void clear_cc1_gpio(); + //! Get value of cc1_gpio. + int8_t cc1_gpio() const; + //! Set cc1_gpio using a constant reference + void set_cc1_gpio(int8_t v); + /*! + * Provide mutable access to cc1_gpio. + * @return pointer to member variable of cc1_gpio. + */ + int8_t *mutable_cc1_gpio(); + #endif // CONFIG_ESP_PHY_ENABLE_USB + + #ifdef CONFIG_ESP_PHY_ENABLE_USB + // optional sint8 cc2_gpio, id 12 + /*! + * Function for querying if cc2_gpio has been set. + * @return true if cc2_gpio is set. + */ + bool has_cc2_gpio() const; + //! Function to reset cc2_gpio to its default/unset value. + void clear_cc2_gpio(); + //! Get value of cc2_gpio. + int8_t cc2_gpio() const; + //! Set cc2_gpio using a constant reference + void set_cc2_gpio(int8_t v); + /*! + * Provide mutable access to cc2_gpio. + * @return pointer to member variable of cc2_gpio. + */ + int8_t *mutable_cc2_gpio(); + #endif // CONFIG_ESP_PHY_ENABLE_USB + protected: Message *p_getMember(const char *s, unsigned n); @@ -536,6 +576,14 @@ class SystemConfig : public Message //! bool usb_con, id 10 bool m_usb_con = true; #endif // CONFIG_USB_CONSOLE + #ifdef CONFIG_ESP_PHY_ENABLE_USB + //! sint8 cc1_gpio, id 11 + int8_t m_cc1_gpio = -1; + #endif // CONFIG_ESP_PHY_ENABLE_USB + #ifdef CONFIG_ESP_PHY_ENABLE_USB + //! sint8 cc2_gpio, id 12 + int8_t m_cc2_gpio = -1; + #endif // CONFIG_ESP_PHY_ENABLE_USB private: uint8_t p_validbits = 0; @@ -2426,6 +2474,10 @@ class LedConfig : public Message bool config_open_drain() const; //! Function to set the open_drain part of bitset config. void set_config_open_drain(bool); + //! Function to get the init_high part of bitset config. + bool config_init_high() const; + //! Function to set the init_high part of bitset config. + void set_config_init_high(bool); //! Set config using a constant reference void set_config(ledcfg_t v); /*! @@ -3428,10 +3480,6 @@ class GpioConfig : public Message bool config_pulldown() const; //! Function to set the pulldown part of bitset config. void set_config_pulldown(bool); - //! Function to get the cap_freq_r2r part of bitset config. - bool config_cap_freq_r2r() const; - //! Function to set the cap_freq_r2r part of bitset config. - void set_config_cap_freq_r2r(bool); //! Set config using a constant reference void set_config(gpiocfg_t v); /*! @@ -3772,12 +3820,32 @@ class SpiDeviceConfig : public Message */ int8_t *mutable_cd(); + // optional unsigned freq, id 6 + /*! + * Function for querying if freq has been set. + * @return true if freq is set. + */ + bool has_freq() const; + //! Function to reset freq to its default/unset value. + void clear_freq(); + //! Get value of freq. + uint32_t freq() const; + //! Set freq using a constant reference + void set_freq(uint32_t v); + /*! + * Provide mutable access to freq. + * @return pointer to member variable of freq. + */ + uint32_t *mutable_freq(); + protected: Message *p_getMember(const char *s, unsigned n); Message *p_getMember(const char *s, unsigned n, unsigned i); //! spidrv_t drv, id 1 spidrv_t m_drv = spidrv_invalid; + //! unsigned freq, id 6 + uint32_t m_freq = 0; //! sint8 cs, id 2 int8_t m_cs = -1; //! sint8 intr, id 3 @@ -4596,15 +4664,15 @@ class SX1276Config : public Message -class HardwareConfig : public Message +class Tone : public Message { public: - HardwareConfig() + Tone() { } - bool operator != (const HardwareConfig &r) const; - bool operator == (const HardwareConfig &r) const; + bool operator != (const Tone &r) const; + bool operator == (const Tone &r) const; //! Function for resetting all members to their default values. void clear(); @@ -4662,159 +4730,527 @@ class HardwareConfig : public Message //! @return number of bytes parsed from value or negative value if an error occurs int setByName(const char *param, const char *value); - // optional fixed32 magic, id 0 + // optional unsigned freq, id 1 /*! - * Function for querying if magic has been set. - * @return true if magic is set. + * Function for querying if freq has been set. + * @return true if freq is set. */ - bool has_magic() const; - //! Function to reset magic to its default/unset value. - void clear_magic(); - //! Get value of magic. - uint32_t magic() const; - //! Set magic using a constant reference - void set_magic(uint32_t v); + bool has_freq() const; + //! Function to reset freq to its default/unset value. + void clear_freq(); + //! Get value of freq. + uint32_t freq() const; + //! Set freq using a constant reference + void set_freq(uint32_t v); /*! - * Provide mutable access to magic. - * @return pointer to member variable of magic. + * Provide mutable access to freq. + * @return pointer to member variable of freq. */ - uint32_t *mutable_magic(); + uint32_t *mutable_freq(); - // optional SystemConfig system, id 1 + // optional unsigned duration, id 2 /*! - * Function for querying if system has been set. - * @return true if system is set. + * Function for querying if duration has been set. + * @return true if duration is set. */ - bool has_system() const; - //! Function to reset system to its default/unset value. - void clear_system(); - //! Get value of system. - const SystemConfig &system() const; + bool has_duration() const; + //! Function to reset duration to its default/unset value. + void clear_duration(); + //! Get value of duration. + uint32_t duration() const; + //! Set duration using a constant reference + void set_duration(uint32_t v); /*! - * Function for setting members of system using data from a serialized object. - * @param data pointer to binary data - * @param s number of bytes at data pointer + * Provide mutable access to duration. + * @return pointer to member variable of duration. */ - void set_system(const void *data, size_t s); - //! Set system using a constant reference - void set_system(const SystemConfig &v); + uint32_t *mutable_duration(); + + + protected: + Message *p_getMember(const char *s, unsigned n); + Message *p_getMember(const char *s, unsigned n, unsigned i); + //! unsigned freq, id 1 + uint32_t m_freq = 0; + //! unsigned duration, id 2 + uint32_t m_duration = 0; + + private: + uint8_t p_validbits = 0; +}; + + + + +class Melody : public Message +{ + public: + Melody() + { + } + + bool operator != (const Melody &r) const; + bool operator == (const Melody &r) const; + + //! Function for resetting all members to their default values. + void clear(); + /*! - * Provide mutable access to system. - * @return pointer to member variable of system. + * Calculates the required number of bytes for serializing this object. + * If member variables of the object are modified, the number of bytes + * needed for serialization may change, too. + * @return bytes needed for a serialized object representation */ - SystemConfig *mutable_system(); + size_t calcSize() const; - // repeated UartConfig uart, id 3 - //! Function get const-access to the elements of uart. - const std::vector &uart() const; - //! Function to get the number of elements in uart. - size_t uart_size() const; /*! - * Function to append a element to uart. - * @return point to newly added element. + * Function for parsing serialized data and update this object accordingly. + * Member variables that are not in the serialized data are not reset. + * @param b buffer of serialized data + * @param s number of bytes available in the buffer + * @return number of bytes successfully parsed (can be < s) + * or a negative value indicating the error encountered */ - UartConfig* add_uart(); - //! Function to reset uart to its default/unset value. - void clear_uart(); - //! Get value of element x of uart. - const UartConfig &uart(unsigned x) const; - //! Set uart using a constant reference - void set_uart(unsigned x, const UartConfig &v); + ssize_t fromMemory(const void *b, ssize_t s); + /*! - * Provide mutable access to uart. - * @return pointer to member variable of uart. + * Function for serializing the object to memory. + * @param b buffer to serialize the object to + * @param s number of bytes available in the buffer + * @return number of bytes successfully serialized */ - UartConfig *mutable_uart(unsigned x); - //! Function to get mutable access to all elements of uart. - std::vector *mutable_uart(); + ssize_t toMemory(uint8_t *, ssize_t) const; - // optional AdcConfig adc, id 4 /*! - * Function for querying if adc has been set. - * @return true if adc is set. + * Function for writing a JSON representation of this object to a stream. + * @param json stream object the JSON output shall be written to + * @indLvl current indention level */ - bool has_adc() const; - //! Function to reset adc to its default/unset value. - void clear_adc(); - //! Get value of adc. - const AdcConfig &adc() const; + void toJSON(stream &json, unsigned indLvl = 0) const; + /*! - * Function for setting adc using binary data. - * @param data pointer to binary data - * @param s number of bytes at data pointer + * Function for writing an ASCII representation of this object to a stream. + * @param o output stream + * @param indent initial indention level */ - void set_adc(const void *data, size_t s); - //! Set adc using a constant reference - void set_adc(const AdcConfig &v); + void toASCII(stream &o, size_t indent = 0) const; + /*! - * Provide mutable access to adc. - * @return pointer to member variable of adc. + * Function for determining the maximum size that the object may need for + * its serialized representation + * @return maximum number of bytes or SIZE_MAX if no limit can be determined */ - AdcConfig *mutable_adc(); + static size_t getMaxSize(); - #ifdef CONFIG_TOUCHPAD - // optional TouchpadConfig touchpad, id 5 + //! Function for setting a parameter by its ASCII name using an ASCII representation of value. + //! @param param parameter name + //! @param value ASCII representation of the value + //! @return number of bytes parsed from value or negative value if an error occurs + int setByName(const char *param, const char *value); + + // optional string name, id 1 /*! - * Function for querying if touchpad has been set. - * @return true if touchpad is set. + * Function for querying if name has been set. + * @return true if name is set. */ - bool has_touchpad() const; - //! Function to reset touchpad to its default/unset value. - void clear_touchpad(); - //! Get value of touchpad. - const TouchpadConfig &touchpad() const; + bool has_name() const; + //! Function to reset name to its default/unset value. + void clear_name(); + //! Get value of name. + const estring &name() const; /*! - * Function for setting touchpad using binary data. + * Function for setting name using binary data. * @param data pointer to binary data * @param s number of bytes at data pointer */ - void set_touchpad(const void *data, size_t s); - //! Set touchpad using a constant reference - void set_touchpad(const TouchpadConfig &v); + void set_name(const void *data, size_t s); + //! Set name using a constant reference + void set_name(const estring &v); + //! Set name using a pointer to a null-terminated C-string. + void set_name(const char *); /*! - * Provide mutable access to touchpad. - * @return pointer to member variable of touchpad. + * Provide mutable access to name. + * @return pointer to member variable of name. */ - TouchpadConfig *mutable_touchpad(); - #endif // CONFIG_TOUCHPAD + estring *mutable_name(); - #ifdef CONFIG_TOUCHPAD - // repeated TouchChannelConfig tp_channel, id 6 - //! Function get const-access to the elements of tp_channel. - const std::vector &tp_channel() const; - //! Function to get the number of elements in tp_channel. - size_t tp_channel_size() const; + // repeated fixed16 tones, id 2 + //! Function get const-access to the elements of tones. + const std::vector &tones() const; + //! Function to get the number of elements in tones. + size_t tones_size() const; /*! - * Function to append a element to tp_channel. + * Function to append a element to tones. * @return point to newly added element. */ - TouchChannelConfig* add_tp_channel(); - //! Function to reset tp_channel to its default/unset value. - void clear_tp_channel(); - //! Get value of element x of tp_channel. - const TouchChannelConfig &tp_channel(unsigned x) const; - //! Set tp_channel using a constant reference - void set_tp_channel(unsigned x, const TouchChannelConfig &v); + void add_tones(uint16_t v); + //! Function to reset tones to its default/unset value. + void clear_tones(); + //! Get value of element x of tones. + uint16_t tones(unsigned x) const; + //! Set tones using a constant reference + void set_tones(unsigned x, uint16_t v); /*! - * Provide mutable access to tp_channel. - * @return pointer to member variable of tp_channel. + * Provide mutable access to tones. + * @return pointer to member variable of tones. */ - TouchChannelConfig *mutable_tp_channel(unsigned x); - //! Function to get mutable access to all elements of tp_channel. - std::vector *mutable_tp_channel(); - #endif // CONFIG_TOUCHPAD + uint16_t *mutable_tones(unsigned x); + //! Function to get mutable access to all elements of tones. + std::vector *mutable_tones(); + + + protected: + Message *p_getMember(const char *s, unsigned n); + Message *p_getMember(const char *s, unsigned n, unsigned i); + //! string name, id 1 + estring m_name; + //! fixed16 tones, id 2 + std::vector m_tones; +}; + + + + +class BuzzerConfig : public Message +{ + public: + BuzzerConfig() + { + } + + bool operator != (const BuzzerConfig &r) const; + bool operator == (const BuzzerConfig &r) const; + + //! Function for resetting all members to their default values. + void clear(); - // repeated GpioConfig gpios, id 7 - //! Function get const-access to the elements of gpios. - const std::vector &gpios() const; - //! Function to get the number of elements in gpios. - size_t gpios_size() const; /*! - * Function to append a element to gpios. - * @return point to newly added element. + * Calculates the required number of bytes for serializing this object. + * If member variables of the object are modified, the number of bytes + * needed for serialization may change, too. + * @return bytes needed for a serialized object representation */ - GpioConfig* add_gpios(); - //! Function to reset gpios to its default/unset value. + size_t calcSize() const; + + /*! + * Function for parsing serialized data and update this object accordingly. + * Member variables that are not in the serialized data are not reset. + * @param b buffer of serialized data + * @param s number of bytes available in the buffer + * @return number of bytes successfully parsed (can be < s) + * or a negative value indicating the error encountered + */ + ssize_t fromMemory(const void *b, ssize_t s); + + /*! + * Function for serializing the object to memory. + * @param b buffer to serialize the object to + * @param s number of bytes available in the buffer + * @return number of bytes successfully serialized + */ + ssize_t toMemory(uint8_t *, ssize_t) const; + + /*! + * Function for writing a JSON representation of this object to a stream. + * @param json stream object the JSON output shall be written to + * @indLvl current indention level + */ + void toJSON(stream &json, unsigned indLvl = 0) const; + + /*! + * Function for writing an ASCII representation of this object to a stream. + * @param o output stream + * @param indent initial indention level + */ + void toASCII(stream &o, size_t indent = 0) const; + + /*! + * Function for determining the maximum size that the object may need for + * its serialized representation + * @return maximum number of bytes or SIZE_MAX if no limit can be determined + */ + static size_t getMaxSize(); + + //! Function for setting a parameter by its ASCII name using an ASCII representation of value. + //! @param param parameter name + //! @param value ASCII representation of the value + //! @return number of bytes parsed from value or negative value if an error occurs + int setByName(const char *param, const char *value); + + // optional sint8 gpio, id 1 + /*! + * Function for querying if gpio has been set. + * @return true if gpio is set. + */ + bool has_gpio() const; + //! Function to reset gpio to its default/unset value. + void clear_gpio(); + //! Get value of gpio. + int8_t gpio() const; + //! Set gpio using a constant reference + void set_gpio(int8_t v); + /*! + * Provide mutable access to gpio. + * @return pointer to member variable of gpio. + */ + int8_t *mutable_gpio(); + + // repeated Melody melodies, id 2 + //! Function get const-access to the elements of melodies. + const std::vector &melodies() const; + //! Function to get the number of elements in melodies. + size_t melodies_size() const; + /*! + * Function to append a element to melodies. + * @return point to newly added element. + */ + Melody* add_melodies(); + //! Function to reset melodies to its default/unset value. + void clear_melodies(); + //! Get value of element x of melodies. + const Melody &melodies(unsigned x) const; + //! Set melodies using a constant reference + void set_melodies(unsigned x, const Melody &v); + /*! + * Provide mutable access to melodies. + * @return pointer to member variable of melodies. + */ + Melody *mutable_melodies(unsigned x); + //! Function to get mutable access to all elements of melodies. + std::vector *mutable_melodies(); + + + protected: + Message *p_getMember(const char *s, unsigned n); + Message *p_getMember(const char *s, unsigned n, unsigned i); + //! sint8 gpio, id 1 + int8_t m_gpio = -1; + //! Melody melodies, id 2 + std::vector m_melodies; +}; + + + + +class HardwareConfig : public Message +{ + public: + HardwareConfig() + { + } + + bool operator != (const HardwareConfig &r) const; + bool operator == (const HardwareConfig &r) const; + + //! Function for resetting all members to their default values. + void clear(); + + /*! + * Calculates the required number of bytes for serializing this object. + * If member variables of the object are modified, the number of bytes + * needed for serialization may change, too. + * @return bytes needed for a serialized object representation + */ + size_t calcSize() const; + + /*! + * Function for parsing serialized data and update this object accordingly. + * Member variables that are not in the serialized data are not reset. + * @param b buffer of serialized data + * @param s number of bytes available in the buffer + * @return number of bytes successfully parsed (can be < s) + * or a negative value indicating the error encountered + */ + ssize_t fromMemory(const void *b, ssize_t s); + + /*! + * Function for serializing the object to memory. + * @param b buffer to serialize the object to + * @param s number of bytes available in the buffer + * @return number of bytes successfully serialized + */ + ssize_t toMemory(uint8_t *, ssize_t) const; + + /*! + * Function for writing a JSON representation of this object to a stream. + * @param json stream object the JSON output shall be written to + * @indLvl current indention level + */ + void toJSON(stream &json, unsigned indLvl = 0) const; + + /*! + * Function for writing an ASCII representation of this object to a stream. + * @param o output stream + * @param indent initial indention level + */ + void toASCII(stream &o, size_t indent = 0) const; + + /*! + * Function for determining the maximum size that the object may need for + * its serialized representation + * @return maximum number of bytes or SIZE_MAX if no limit can be determined + */ + static size_t getMaxSize(); + + //! Function for setting a parameter by its ASCII name using an ASCII representation of value. + //! @param param parameter name + //! @param value ASCII representation of the value + //! @return number of bytes parsed from value or negative value if an error occurs + int setByName(const char *param, const char *value); + + // optional fixed32 magic, id 0 + /*! + * Function for querying if magic has been set. + * @return true if magic is set. + */ + bool has_magic() const; + //! Function to reset magic to its default/unset value. + void clear_magic(); + //! Get value of magic. + uint32_t magic() const; + //! Set magic using a constant reference + void set_magic(uint32_t v); + /*! + * Provide mutable access to magic. + * @return pointer to member variable of magic. + */ + uint32_t *mutable_magic(); + + // optional SystemConfig system, id 1 + /*! + * Function for querying if system has been set. + * @return true if system is set. + */ + bool has_system() const; + //! Function to reset system to its default/unset value. + void clear_system(); + //! Get value of system. + const SystemConfig &system() const; + /*! + * Function for setting members of system using data from a serialized object. + * @param data pointer to binary data + * @param s number of bytes at data pointer + */ + void set_system(const void *data, size_t s); + //! Set system using a constant reference + void set_system(const SystemConfig &v); + /*! + * Provide mutable access to system. + * @return pointer to member variable of system. + */ + SystemConfig *mutable_system(); + + // repeated UartConfig uart, id 3 + //! Function get const-access to the elements of uart. + const std::vector &uart() const; + //! Function to get the number of elements in uart. + size_t uart_size() const; + /*! + * Function to append a element to uart. + * @return point to newly added element. + */ + UartConfig* add_uart(); + //! Function to reset uart to its default/unset value. + void clear_uart(); + //! Get value of element x of uart. + const UartConfig &uart(unsigned x) const; + //! Set uart using a constant reference + void set_uart(unsigned x, const UartConfig &v); + /*! + * Provide mutable access to uart. + * @return pointer to member variable of uart. + */ + UartConfig *mutable_uart(unsigned x); + //! Function to get mutable access to all elements of uart. + std::vector *mutable_uart(); + + // optional AdcConfig adc, id 4 + /*! + * Function for querying if adc has been set. + * @return true if adc is set. + */ + bool has_adc() const; + //! Function to reset adc to its default/unset value. + void clear_adc(); + //! Get value of adc. + const AdcConfig &adc() const; + /*! + * Function for setting adc using binary data. + * @param data pointer to binary data + * @param s number of bytes at data pointer + */ + void set_adc(const void *data, size_t s); + //! Set adc using a constant reference + void set_adc(const AdcConfig &v); + /*! + * Provide mutable access to adc. + * @return pointer to member variable of adc. + */ + AdcConfig *mutable_adc(); + + #ifdef CONFIG_TOUCHPAD + // optional TouchpadConfig touchpad, id 5 + /*! + * Function for querying if touchpad has been set. + * @return true if touchpad is set. + */ + bool has_touchpad() const; + //! Function to reset touchpad to its default/unset value. + void clear_touchpad(); + //! Get value of touchpad. + const TouchpadConfig &touchpad() const; + /*! + * Function for setting touchpad using binary data. + * @param data pointer to binary data + * @param s number of bytes at data pointer + */ + void set_touchpad(const void *data, size_t s); + //! Set touchpad using a constant reference + void set_touchpad(const TouchpadConfig &v); + /*! + * Provide mutable access to touchpad. + * @return pointer to member variable of touchpad. + */ + TouchpadConfig *mutable_touchpad(); + #endif // CONFIG_TOUCHPAD + + #ifdef CONFIG_TOUCHPAD + // repeated TouchChannelConfig tp_channel, id 6 + //! Function get const-access to the elements of tp_channel. + const std::vector &tp_channel() const; + //! Function to get the number of elements in tp_channel. + size_t tp_channel_size() const; + /*! + * Function to append a element to tp_channel. + * @return point to newly added element. + */ + TouchChannelConfig* add_tp_channel(); + //! Function to reset tp_channel to its default/unset value. + void clear_tp_channel(); + //! Get value of element x of tp_channel. + const TouchChannelConfig &tp_channel(unsigned x) const; + //! Set tp_channel using a constant reference + void set_tp_channel(unsigned x, const TouchChannelConfig &v); + /*! + * Provide mutable access to tp_channel. + * @return pointer to member variable of tp_channel. + */ + TouchChannelConfig *mutable_tp_channel(unsigned x); + //! Function to get mutable access to all elements of tp_channel. + std::vector *mutable_tp_channel(); + #endif // CONFIG_TOUCHPAD + + // repeated GpioConfig gpios, id 7 + //! Function get const-access to the elements of gpios. + const std::vector &gpios() const; + //! Function to get the number of elements in gpios. + size_t gpios_size() const; + /*! + * Function to append a element to gpios. + * @return point to newly added element. + */ + GpioConfig* add_gpios(); + //! Function to reset gpios to its default/unset value. void clear_gpios(); //! Get value of element x of gpios. const GpioConfig &gpios(unsigned x) const; @@ -4932,6 +5368,32 @@ class HardwareConfig : public Message std::vector *mutable_led(); #endif // CONFIG_LEDS + #ifdef CONFIG_BUZZER + // optional BuzzerConfig buzzer, id 19 + /*! + * Function for querying if buzzer has been set. + * @return true if buzzer is set. + */ + bool has_buzzer() const; + //! Function to reset buzzer to its default/unset value. + void clear_buzzer(); + //! Get value of buzzer. + const BuzzerConfig &buzzer() const; + /*! + * Function for setting buzzer using binary data. + * @param data pointer to binary data + * @param s number of bytes at data pointer + */ + void set_buzzer(const void *data, size_t s); + //! Set buzzer using a constant reference + void set_buzzer(const BuzzerConfig &v); + /*! + * Provide mutable access to buzzer. + * @return pointer to member variable of buzzer. + */ + BuzzerConfig *mutable_buzzer(); + #endif // CONFIG_BUZZER + #ifdef CONFIG_HLW8012 // optional Hlw8012Config hlw8012, id 20 /*! @@ -5224,10 +5686,10 @@ class HardwareConfig : public Message Message *p_getMember(const char *s, unsigned n, unsigned i); //! fixed32 magic, id 0 uint32_t m_magic = 0; - #ifdef CONFIG_HLW8012 - //! Hlw8012Config hlw8012, id 20 - Hlw8012Config m_hlw8012; - #endif // CONFIG_HLW8012 + #ifdef CONFIG_BUZZER + //! BuzzerConfig buzzer, id 19 + BuzzerConfig m_buzzer; + #endif // CONFIG_BUZZER #ifdef CONFIG_DISPLAY //! DisplayConfig display, id 50 DisplayConfig m_display; @@ -5268,6 +5730,10 @@ class HardwareConfig : public Message //! Max7219Config max7219, id 32 Max7219Config m_max7219; #endif // CONFIG_MAX7219 + #ifdef CONFIG_HLW8012 + //! Hlw8012Config hlw8012, id 20 + Hlw8012Config m_hlw8012; + #endif // CONFIG_HLW8012 #ifdef CONFIG_LEDS //! LedConfig led, id 18 std::vector m_led; @@ -5318,6 +5784,8 @@ inline size_t SystemConfig::getMaxSize() // optional string model_number, id 8 has unlimited size // optional bool usb_diag, id 9 has maximum size 2 // optional bool usb_con, id 10 has maximum size 2 + // optional sint8 cc1_gpio, id 11 has maximum size 3 + // optional sint8 cc2_gpio, id 12 has maximum size 3 return SIZE_MAX; } @@ -5653,48 +6121,114 @@ inline void SystemConfig::clear_usb_diag() inline bool *SystemConfig::mutable_usb_diag() { - return &m_usb_diag; + return &m_usb_diag; +} + +inline void SystemConfig::set_usb_diag(bool v) +{ + m_usb_diag = v; +} + +#endif // CONFIG_USB_DIAGLOG + + +#ifdef CONFIG_USB_CONSOLE +inline bool SystemConfig::usb_con() const +{ + return m_usb_con; +} + +inline bool SystemConfig::has_usb_con() const +{ + return m_usb_con != true; +} + +/*! + * Function for clearing the associated member variable. + * It will reset the value to the default value. + */ +inline void SystemConfig::clear_usb_con() +{ + m_usb_con = true; +} + +inline bool *SystemConfig::mutable_usb_con() +{ + return &m_usb_con; +} + +inline void SystemConfig::set_usb_con(bool v) +{ + m_usb_con = v; +} + +#endif // CONFIG_USB_CONSOLE + + +#ifdef CONFIG_ESP_PHY_ENABLE_USB +inline int8_t SystemConfig::cc1_gpio() const +{ + return m_cc1_gpio; +} + +inline bool SystemConfig::has_cc1_gpio() const +{ + return m_cc1_gpio != -1; +} + +/*! + * Function for clearing the associated member variable. + * It will reset the value to the default value. + */ +inline void SystemConfig::clear_cc1_gpio() +{ + m_cc1_gpio = -1; +} + +inline int8_t *SystemConfig::mutable_cc1_gpio() +{ + return &m_cc1_gpio; } -inline void SystemConfig::set_usb_diag(bool v) +inline void SystemConfig::set_cc1_gpio(int8_t v) { - m_usb_diag = v; + m_cc1_gpio = v; } -#endif // CONFIG_USB_DIAGLOG +#endif // CONFIG_ESP_PHY_ENABLE_USB -#ifdef CONFIG_USB_CONSOLE -inline bool SystemConfig::usb_con() const +#ifdef CONFIG_ESP_PHY_ENABLE_USB +inline int8_t SystemConfig::cc2_gpio() const { - return m_usb_con; + return m_cc2_gpio; } -inline bool SystemConfig::has_usb_con() const +inline bool SystemConfig::has_cc2_gpio() const { - return m_usb_con != true; + return m_cc2_gpio != -1; } /*! * Function for clearing the associated member variable. * It will reset the value to the default value. */ -inline void SystemConfig::clear_usb_con() +inline void SystemConfig::clear_cc2_gpio() { - m_usb_con = true; + m_cc2_gpio = -1; } -inline bool *SystemConfig::mutable_usb_con() +inline int8_t *SystemConfig::mutable_cc2_gpio() { - return &m_usb_con; + return &m_cc2_gpio; } -inline void SystemConfig::set_usb_con(bool v) +inline void SystemConfig::set_cc2_gpio(int8_t v) { - m_usb_con = v; + m_cc2_gpio = v; } -#endif // CONFIG_USB_CONSOLE +#endif // CONFIG_ESP_PHY_ENABLE_USB inline size_t TouchpadConfig::getMaxSize() @@ -7500,6 +8034,11 @@ inline bool LedConfig::config_open_drain() const return (bool)((m_config >> 1) & 0x1); } +inline bool LedConfig::config_init_high() const +{ + return (bool)((m_config >> 2) & 0x1); +} + inline bool LedConfig::has_config() const { return 0 != (p_validbits & ((uint8_t)1U << 0)); @@ -7538,6 +8077,13 @@ inline void LedConfig::set_config_open_drain(bool v) p_validbits |= ((uint8_t)1U << 0); } +inline void LedConfig::set_config_init_high(bool v) +{ + m_config &= ~(0x1ULL << 2); + m_config |= ((uint8_t) v << 2); + p_validbits |= ((uint8_t)1U << 0); +} + inline void LedConfig::set_config(ledcfg_t v) { m_config = v; @@ -8548,11 +9094,6 @@ inline bool GpioConfig::config_pulldown() const return (bool)((m_config >> 8) & 0x1); } -inline bool GpioConfig::config_cap_freq_r2r() const -{ - return (bool)((m_config >> 9) & 0x1); -} - inline bool GpioConfig::has_config() const { return 0 != (p_validbits & ((uint8_t)1U << 0)); @@ -8619,13 +9160,6 @@ inline void GpioConfig::set_config_pulldown(bool v) p_validbits |= ((uint8_t)1U << 0); } -inline void GpioConfig::set_config_cap_freq_r2r(bool v) -{ - m_config &= ~(0x1ULL << 9); - m_config |= ((uint16_t) v << 9); - p_validbits |= ((uint8_t)1U << 0); -} - inline void GpioConfig::set_config(gpiocfg_t v) { m_config = v; @@ -8792,7 +9326,8 @@ inline size_t SpiDeviceConfig::getMaxSize() // optional sint8 intr, id 3 has maximum size 3 // optional sint8 reset, id 4 has maximum size 3 // optional sint8 cd, id 5 has maximum size 3 - return 14; + // optional unsigned freq, id 6 has maximum size 6 + return 20; } inline spidrv_t SpiDeviceConfig::drv() const @@ -8950,6 +9485,37 @@ inline void SpiDeviceConfig::set_cd(int8_t v) +inline uint32_t SpiDeviceConfig::freq() const +{ + return m_freq; +} + +inline bool SpiDeviceConfig::has_freq() const +{ + return m_freq != 0; +} + +/*! + * Function for clearing the associated member variable. + * It will reset the value to the default value. + */ +inline void SpiDeviceConfig::clear_freq() +{ + m_freq = 0; +} + +inline uint32_t *SpiDeviceConfig::mutable_freq() +{ + return &m_freq; +} + +inline void SpiDeviceConfig::set_freq(uint32_t v) +{ + m_freq = v; +} + + + inline size_t SpiBusConfig::getMaxSize() { // optional sint8 host, id 1 has maximum size 3 @@ -9599,228 +10165,494 @@ inline void Hlw8012Config::set_cf(int8_t v) inline int8_t Hlw8012Config::cf1() const { - return m_cf1; + return m_cf1; +} + +inline bool Hlw8012Config::has_cf1() const +{ + return m_cf1 != -1; +} + +/*! + * Function for clearing the associated member variable. + * It will reset the value to the default value. + */ +inline void Hlw8012Config::clear_cf1() +{ + m_cf1 = -1; +} + +inline int8_t *Hlw8012Config::mutable_cf1() +{ + return &m_cf1; +} + +inline void Hlw8012Config::set_cf1(int8_t v) +{ + m_cf1 = v; +} + + + +inline size_t SX1276Config::getMaxSize() +{ + // optional sint8 dio0, id 1 has maximum size 3 + // optional sint8 dio1, id 2 has maximum size 3 + // optional sint8 dio2, id 3 has maximum size 3 + // optional sint8 dio3, id 4 has maximum size 3 + // optional sint8 dio4, id 5 has maximum size 3 + // optional sint8 dio5, id 6 has maximum size 3 + return 18; +} + +inline int8_t SX1276Config::dio0() const +{ + return m_dio0; +} + +inline bool SX1276Config::has_dio0() const +{ + return m_dio0 != -1; +} + +/*! + * Function for clearing the associated member variable. + * It will reset the value to the default value. + */ +inline void SX1276Config::clear_dio0() +{ + m_dio0 = -1; +} + +inline int8_t *SX1276Config::mutable_dio0() +{ + return &m_dio0; +} + +inline void SX1276Config::set_dio0(int8_t v) +{ + m_dio0 = v; +} + + + +inline int8_t SX1276Config::dio1() const +{ + return m_dio1; +} + +inline bool SX1276Config::has_dio1() const +{ + return m_dio1 != -1; +} + +/*! + * Function for clearing the associated member variable. + * It will reset the value to the default value. + */ +inline void SX1276Config::clear_dio1() +{ + m_dio1 = -1; +} + +inline int8_t *SX1276Config::mutable_dio1() +{ + return &m_dio1; +} + +inline void SX1276Config::set_dio1(int8_t v) +{ + m_dio1 = v; +} + + + +inline int8_t SX1276Config::dio2() const +{ + return m_dio2; +} + +inline bool SX1276Config::has_dio2() const +{ + return m_dio2 != -1; +} + +/*! + * Function for clearing the associated member variable. + * It will reset the value to the default value. + */ +inline void SX1276Config::clear_dio2() +{ + m_dio2 = -1; +} + +inline int8_t *SX1276Config::mutable_dio2() +{ + return &m_dio2; +} + +inline void SX1276Config::set_dio2(int8_t v) +{ + m_dio2 = v; +} + + + +inline int8_t SX1276Config::dio3() const +{ + return m_dio3; +} + +inline bool SX1276Config::has_dio3() const +{ + return m_dio3 != -1; +} + +/*! + * Function for clearing the associated member variable. + * It will reset the value to the default value. + */ +inline void SX1276Config::clear_dio3() +{ + m_dio3 = -1; +} + +inline int8_t *SX1276Config::mutable_dio3() +{ + return &m_dio3; +} + +inline void SX1276Config::set_dio3(int8_t v) +{ + m_dio3 = v; +} + + + +inline int8_t SX1276Config::dio4() const +{ + return m_dio4; +} + +inline bool SX1276Config::has_dio4() const +{ + return m_dio4 != -1; +} + +/*! + * Function for clearing the associated member variable. + * It will reset the value to the default value. + */ +inline void SX1276Config::clear_dio4() +{ + m_dio4 = -1; +} + +inline int8_t *SX1276Config::mutable_dio4() +{ + return &m_dio4; +} + +inline void SX1276Config::set_dio4(int8_t v) +{ + m_dio4 = v; +} + + + +inline int8_t SX1276Config::dio5() const +{ + return m_dio5; } -inline bool Hlw8012Config::has_cf1() const +inline bool SX1276Config::has_dio5() const { - return m_cf1 != -1; + return m_dio5 != -1; } /*! * Function for clearing the associated member variable. * It will reset the value to the default value. */ -inline void Hlw8012Config::clear_cf1() +inline void SX1276Config::clear_dio5() { - m_cf1 = -1; + m_dio5 = -1; } -inline int8_t *Hlw8012Config::mutable_cf1() +inline int8_t *SX1276Config::mutable_dio5() { - return &m_cf1; + return &m_dio5; } -inline void Hlw8012Config::set_cf1(int8_t v) +inline void SX1276Config::set_dio5(int8_t v) { - m_cf1 = v; + m_dio5 = v; } -inline size_t SX1276Config::getMaxSize() +inline size_t Tone::getMaxSize() { - // optional sint8 dio0, id 1 has maximum size 3 - // optional sint8 dio1, id 2 has maximum size 3 - // optional sint8 dio2, id 3 has maximum size 3 - // optional sint8 dio3, id 4 has maximum size 3 - // optional sint8 dio4, id 5 has maximum size 3 - // optional sint8 dio5, id 6 has maximum size 3 - return 18; + // optional unsigned freq, id 1 has maximum size 6 + // optional unsigned duration, id 2 has maximum size 6 + return 12; } -inline int8_t SX1276Config::dio0() const +inline uint32_t Tone::freq() const { - return m_dio0; + return m_freq; } -inline bool SX1276Config::has_dio0() const +inline bool Tone::has_freq() const { - return m_dio0 != -1; + return 0 != (p_validbits & ((uint8_t)1U << 0)); } /*! * Function for clearing the associated member variable. * It will reset the value to the default value. */ -inline void SX1276Config::clear_dio0() +inline void Tone::clear_freq() { - m_dio0 = -1; + p_validbits &= ~((uint8_t)1U << 0); + m_freq = 0; } -inline int8_t *SX1276Config::mutable_dio0() +inline uint32_t *Tone::mutable_freq() { - return &m_dio0; + if (0 == (p_validbits & ((uint8_t)1U << 0))) { + p_validbits |= ((uint8_t)1U << 0); + m_freq = 0; + } + return &m_freq; } -inline void SX1276Config::set_dio0(int8_t v) +inline void Tone::set_freq(uint32_t v) { - m_dio0 = v; + m_freq = v; + p_validbits |= ((uint8_t)1U << 0); } -inline int8_t SX1276Config::dio1() const +inline uint32_t Tone::duration() const { - return m_dio1; + return m_duration; } -inline bool SX1276Config::has_dio1() const +inline bool Tone::has_duration() const { - return m_dio1 != -1; + return 0 != (p_validbits & ((uint8_t)1U << 1)); } /*! * Function for clearing the associated member variable. * It will reset the value to the default value. */ -inline void SX1276Config::clear_dio1() +inline void Tone::clear_duration() { - m_dio1 = -1; + p_validbits &= ~((uint8_t)1U << 1); + m_duration = 0; } -inline int8_t *SX1276Config::mutable_dio1() +inline uint32_t *Tone::mutable_duration() { - return &m_dio1; + if (0 == (p_validbits & ((uint8_t)1U << 1))) { + p_validbits |= ((uint8_t)1U << 1); + m_duration = 0; + } + return &m_duration; } -inline void SX1276Config::set_dio1(int8_t v) +inline void Tone::set_duration(uint32_t v) { - m_dio1 = v; + m_duration = v; + p_validbits |= ((uint8_t)1U << 1); } -inline int8_t SX1276Config::dio2() const +inline size_t Melody::getMaxSize() { - return m_dio2; + // optional string name, id 1 has unlimited size + // repeated fixed16 tones, id 2 has unlimited size + return SIZE_MAX; } -inline bool SX1276Config::has_dio2() const +inline const estring &Melody::name() const { - return m_dio2 != -1; + return m_name; +} + +inline bool Melody::has_name() const +{ + return !m_name.empty(); } /*! * Function for clearing the associated member variable. * It will reset the value to the default value. */ -inline void SX1276Config::clear_dio2() +inline void Melody::clear_name() { - m_dio2 = -1; + m_name.clear(); } -inline int8_t *SX1276Config::mutable_dio2() +inline estring *Melody::mutable_name() { - return &m_dio2; + return &m_name; } -inline void SX1276Config::set_dio2(int8_t v) +inline void Melody::set_name(const void *data, size_t s) { - m_dio2 = v; + m_name.assign((const char *)data,s); } +inline void Melody::set_name(const char *data) +{ + m_name = data; +} +inline void Melody::set_name(const estring &v) +{ + m_name = v; +} -inline int8_t SX1276Config::dio3() const + + +inline uint16_t Melody::tones(unsigned x) const { - return m_dio3; + return m_tones[x]; } -inline bool SX1276Config::has_dio3() const +inline const std::vector &Melody::tones() const { - return m_dio3 != -1; + return m_tones; } /*! * Function for clearing the associated member variable. * It will reset the value to the default value. */ -inline void SX1276Config::clear_dio3() +inline void Melody::clear_tones() { - m_dio3 = -1; + m_tones.clear(); } -inline int8_t *SX1276Config::mutable_dio3() +inline uint16_t *Melody::mutable_tones(unsigned x) { - return &m_dio3; + if (x >= m_tones.size()) + m_tones.resize(x+1); + return &m_tones[x]; } -inline void SX1276Config::set_dio3(int8_t v) +inline std::vector *Melody::mutable_tones() { - m_dio3 = v; + return &m_tones; } +inline void Melody::add_tones(uint16_t v) +{ + m_tones.push_back(v); +} +inline void Melody::set_tones(unsigned x, uint16_t v) +{ + assert(x < m_tones.size()); + m_tones[x] = v; +} -inline int8_t SX1276Config::dio4() const +inline size_t Melody::tones_size() const { - return m_dio4; + return m_tones.size(); } -inline bool SX1276Config::has_dio4() const + + +inline size_t BuzzerConfig::getMaxSize() { - return m_dio4 != -1; + // optional sint8 gpio, id 1 has maximum size 3 + // repeated Melody melodies, id 2 has unlimited size + return SIZE_MAX; +} + +inline int8_t BuzzerConfig::gpio() const +{ + return m_gpio; +} + +inline bool BuzzerConfig::has_gpio() const +{ + return m_gpio != -1; } /*! * Function for clearing the associated member variable. * It will reset the value to the default value. */ -inline void SX1276Config::clear_dio4() +inline void BuzzerConfig::clear_gpio() { - m_dio4 = -1; + m_gpio = -1; } -inline int8_t *SX1276Config::mutable_dio4() +inline int8_t *BuzzerConfig::mutable_gpio() { - return &m_dio4; + return &m_gpio; } -inline void SX1276Config::set_dio4(int8_t v) +inline void BuzzerConfig::set_gpio(int8_t v) { - m_dio4 = v; + m_gpio = v; } -inline int8_t SX1276Config::dio5() const +inline const Melody &BuzzerConfig::melodies(unsigned x) const { - return m_dio5; + return m_melodies[x]; } -inline bool SX1276Config::has_dio5() const +inline const std::vector &BuzzerConfig::melodies() const { - return m_dio5 != -1; + return m_melodies; } /*! * Function for clearing the associated member variable. * It will reset the value to the default value. */ -inline void SX1276Config::clear_dio5() +inline void BuzzerConfig::clear_melodies() { - m_dio5 = -1; + m_melodies.clear(); } -inline int8_t *SX1276Config::mutable_dio5() +inline Melody *BuzzerConfig::mutable_melodies(unsigned x) { - return &m_dio5; + if (x >= m_melodies.size()) + m_melodies.resize(x+1); + return &m_melodies[x]; } -inline void SX1276Config::set_dio5(int8_t v) +inline std::vector *BuzzerConfig::mutable_melodies() { - m_dio5 = v; + return &m_melodies; +} + +inline Melody *BuzzerConfig::add_melodies() +{ + m_melodies.resize(m_melodies.size()+1); + return &m_melodies.back(); +} + +inline void BuzzerConfig::set_melodies(unsigned x, const Melody &v) +{ + assert(x < m_melodies.size()); + m_melodies[x] = v; +} + +inline size_t BuzzerConfig::melodies_size() const +{ + return m_melodies.size(); } @@ -9828,7 +10660,7 @@ inline void SX1276Config::set_dio5(int8_t v) inline size_t HardwareConfig::getMaxSize() { // optional fixed32 magic, id 0 has maximum size 5 - // optional SystemConfig system, id 1 has maximum size 9 + // optional SystemConfig system, id 1 has maximum size 15 // repeated UartConfig uart, id 3 has unlimited size // optional AdcConfig adc, id 4 has maximum size 10 // optional TouchpadConfig touchpad, id 5 has maximum size 18 @@ -9838,6 +10670,7 @@ inline size_t HardwareConfig::getMaxSize() // repeated ButtonConfig button, id 16 has unlimited size // repeated RelayConfig relay, id 17 has unlimited size // repeated LedConfig led, id 18 has unlimited size + // optional BuzzerConfig buzzer, id 19 has maximum size 4 // optional Hlw8012Config hlw8012, id 20 has maximum size 11 // optional Max7219Config max7219, id 32 has maximum size 16 // optional Tlc5947Config tlc5947, id 33 has maximum size 17 @@ -10380,6 +11213,51 @@ inline size_t HardwareConfig::led_size() const #endif // CONFIG_LEDS +#ifdef CONFIG_BUZZER +inline const BuzzerConfig &HardwareConfig::buzzer() const +{ + return m_buzzer; +} + +inline bool HardwareConfig::has_buzzer() const +{ + return 0 != (p_validbits & ((uint16_t)1U << 4)); +} + +/*! + * Function for clearing the associated member variable. + * It will reset the value to the default value. + */ +inline void HardwareConfig::clear_buzzer() +{ + p_validbits &= ~((uint16_t)1U << 4); + m_buzzer.clear(); +} + +inline BuzzerConfig *HardwareConfig::mutable_buzzer() +{ + if (0 == (p_validbits & ((uint16_t)1U << 4))) { + p_validbits |= ((uint16_t)1U << 4); + m_buzzer.clear(); + } + return &m_buzzer; +} + +inline void HardwareConfig::set_buzzer(const void *data, size_t s) +{ + m_buzzer.fromMemory((const char *)data,s); + p_validbits |= ((uint16_t)1U << 4); +} + +inline void HardwareConfig::set_buzzer(const BuzzerConfig &v) +{ + m_buzzer = v; + p_validbits |= ((uint16_t)1U << 4); +} + +#endif // CONFIG_BUZZER + + #ifdef CONFIG_HLW8012 inline const Hlw8012Config &HardwareConfig::hlw8012() const { @@ -10388,7 +11266,7 @@ inline const Hlw8012Config &HardwareConfig::hlw8012() const inline bool HardwareConfig::has_hlw8012() const { - return 0 != (p_validbits & ((uint16_t)1U << 4)); + return 0 != (p_validbits & ((uint16_t)1U << 5)); } /*! @@ -10397,14 +11275,14 @@ inline bool HardwareConfig::has_hlw8012() const */ inline void HardwareConfig::clear_hlw8012() { - p_validbits &= ~((uint16_t)1U << 4); + p_validbits &= ~((uint16_t)1U << 5); m_hlw8012.clear(); } inline Hlw8012Config *HardwareConfig::mutable_hlw8012() { - if (0 == (p_validbits & ((uint16_t)1U << 4))) { - p_validbits |= ((uint16_t)1U << 4); + if (0 == (p_validbits & ((uint16_t)1U << 5))) { + p_validbits |= ((uint16_t)1U << 5); m_hlw8012.clear(); } return &m_hlw8012; @@ -10413,13 +11291,13 @@ inline Hlw8012Config *HardwareConfig::mutable_hlw8012() inline void HardwareConfig::set_hlw8012(const void *data, size_t s) { m_hlw8012.fromMemory((const char *)data,s); - p_validbits |= ((uint16_t)1U << 4); + p_validbits |= ((uint16_t)1U << 5); } inline void HardwareConfig::set_hlw8012(const Hlw8012Config &v) { m_hlw8012 = v; - p_validbits |= ((uint16_t)1U << 4); + p_validbits |= ((uint16_t)1U << 5); } #endif // CONFIG_HLW8012 @@ -10433,7 +11311,7 @@ inline const Max7219Config &HardwareConfig::max7219() const inline bool HardwareConfig::has_max7219() const { - return 0 != (p_validbits & ((uint16_t)1U << 5)); + return 0 != (p_validbits & ((uint16_t)1U << 6)); } /*! @@ -10442,14 +11320,14 @@ inline bool HardwareConfig::has_max7219() const */ inline void HardwareConfig::clear_max7219() { - p_validbits &= ~((uint16_t)1U << 5); + p_validbits &= ~((uint16_t)1U << 6); m_max7219.clear(); } inline Max7219Config *HardwareConfig::mutable_max7219() { - if (0 == (p_validbits & ((uint16_t)1U << 5))) { - p_validbits |= ((uint16_t)1U << 5); + if (0 == (p_validbits & ((uint16_t)1U << 6))) { + p_validbits |= ((uint16_t)1U << 6); m_max7219.clear(); } return &m_max7219; @@ -10458,13 +11336,13 @@ inline Max7219Config *HardwareConfig::mutable_max7219() inline void HardwareConfig::set_max7219(const void *data, size_t s) { m_max7219.fromMemory((const char *)data,s); - p_validbits |= ((uint16_t)1U << 5); + p_validbits |= ((uint16_t)1U << 6); } inline void HardwareConfig::set_max7219(const Max7219Config &v) { m_max7219 = v; - p_validbits |= ((uint16_t)1U << 5); + p_validbits |= ((uint16_t)1U << 6); } #endif // CONFIG_MAX7219 @@ -10478,7 +11356,7 @@ inline const Tlc5947Config &HardwareConfig::tlc5947() const inline bool HardwareConfig::has_tlc5947() const { - return 0 != (p_validbits & ((uint16_t)1U << 6)); + return 0 != (p_validbits & ((uint16_t)1U << 7)); } /*! @@ -10487,14 +11365,14 @@ inline bool HardwareConfig::has_tlc5947() const */ inline void HardwareConfig::clear_tlc5947() { - p_validbits &= ~((uint16_t)1U << 6); + p_validbits &= ~((uint16_t)1U << 7); m_tlc5947.clear(); } inline Tlc5947Config *HardwareConfig::mutable_tlc5947() { - if (0 == (p_validbits & ((uint16_t)1U << 6))) { - p_validbits |= ((uint16_t)1U << 6); + if (0 == (p_validbits & ((uint16_t)1U << 7))) { + p_validbits |= ((uint16_t)1U << 7); m_tlc5947.clear(); } return &m_tlc5947; @@ -10503,13 +11381,13 @@ inline Tlc5947Config *HardwareConfig::mutable_tlc5947() inline void HardwareConfig::set_tlc5947(const void *data, size_t s) { m_tlc5947.fromMemory((const char *)data,s); - p_validbits |= ((uint16_t)1U << 6); + p_validbits |= ((uint16_t)1U << 7); } inline void HardwareConfig::set_tlc5947(const Tlc5947Config &v) { m_tlc5947 = v; - p_validbits |= ((uint16_t)1U << 6); + p_validbits |= ((uint16_t)1U << 7); } #endif // CONFIG_TLC5947 @@ -10575,7 +11453,7 @@ inline const DhtConfig &HardwareConfig::dht() const inline bool HardwareConfig::has_dht() const { - return 0 != (p_validbits & ((uint16_t)1U << 7)); + return 0 != (p_validbits & ((uint16_t)1U << 8)); } /*! @@ -10584,14 +11462,14 @@ inline bool HardwareConfig::has_dht() const */ inline void HardwareConfig::clear_dht() { - p_validbits &= ~((uint16_t)1U << 7); + p_validbits &= ~((uint16_t)1U << 8); m_dht.clear(); } inline DhtConfig *HardwareConfig::mutable_dht() { - if (0 == (p_validbits & ((uint16_t)1U << 7))) { - p_validbits |= ((uint16_t)1U << 7); + if (0 == (p_validbits & ((uint16_t)1U << 8))) { + p_validbits |= ((uint16_t)1U << 8); m_dht.clear(); } return &m_dht; @@ -10600,13 +11478,13 @@ inline DhtConfig *HardwareConfig::mutable_dht() inline void HardwareConfig::set_dht(const void *data, size_t s) { m_dht.fromMemory((const char *)data,s); - p_validbits |= ((uint16_t)1U << 7); + p_validbits |= ((uint16_t)1U << 8); } inline void HardwareConfig::set_dht(const DhtConfig &v) { m_dht = v; - p_validbits |= ((uint16_t)1U << 7); + p_validbits |= ((uint16_t)1U << 8); } #endif // CONFIG_DHT @@ -10724,7 +11602,7 @@ inline const OneWireConfig &HardwareConfig::onewire() const inline bool HardwareConfig::has_onewire() const { - return 0 != (p_validbits & ((uint16_t)1U << 8)); + return 0 != (p_validbits & ((uint16_t)1U << 9)); } /*! @@ -10733,14 +11611,14 @@ inline bool HardwareConfig::has_onewire() const */ inline void HardwareConfig::clear_onewire() { - p_validbits &= ~((uint16_t)1U << 8); + p_validbits &= ~((uint16_t)1U << 9); m_onewire.clear(); } inline OneWireConfig *HardwareConfig::mutable_onewire() { - if (0 == (p_validbits & ((uint16_t)1U << 8))) { - p_validbits |= ((uint16_t)1U << 8); + if (0 == (p_validbits & ((uint16_t)1U << 9))) { + p_validbits |= ((uint16_t)1U << 9); m_onewire.clear(); } return &m_onewire; @@ -10749,13 +11627,13 @@ inline OneWireConfig *HardwareConfig::mutable_onewire() inline void HardwareConfig::set_onewire(const void *data, size_t s) { m_onewire.fromMemory((const char *)data,s); - p_validbits |= ((uint16_t)1U << 8); + p_validbits |= ((uint16_t)1U << 9); } inline void HardwareConfig::set_onewire(const OneWireConfig &v) { m_onewire = v; - p_validbits |= ((uint16_t)1U << 8); + p_validbits |= ((uint16_t)1U << 9); } #endif // CONFIG_ONEWIRE @@ -10769,7 +11647,7 @@ inline const SX1276Config &HardwareConfig::sx1276() const inline bool HardwareConfig::has_sx1276() const { - return 0 != (p_validbits & ((uint16_t)1U << 9)); + return 0 != (p_validbits & ((uint16_t)1U << 10)); } /*! @@ -10778,14 +11656,14 @@ inline bool HardwareConfig::has_sx1276() const */ inline void HardwareConfig::clear_sx1276() { - p_validbits &= ~((uint16_t)1U << 9); + p_validbits &= ~((uint16_t)1U << 10); m_sx1276.clear(); } inline SX1276Config *HardwareConfig::mutable_sx1276() { - if (0 == (p_validbits & ((uint16_t)1U << 9))) { - p_validbits |= ((uint16_t)1U << 9); + if (0 == (p_validbits & ((uint16_t)1U << 10))) { + p_validbits |= ((uint16_t)1U << 10); m_sx1276.clear(); } return &m_sx1276; @@ -10794,13 +11672,13 @@ inline SX1276Config *HardwareConfig::mutable_sx1276() inline void HardwareConfig::set_sx1276(const void *data, size_t s) { m_sx1276.fromMemory((const char *)data,s); - p_validbits |= ((uint16_t)1U << 9); + p_validbits |= ((uint16_t)1U << 10); } inline void HardwareConfig::set_sx1276(const SX1276Config &v) { m_sx1276 = v; - p_validbits |= ((uint16_t)1U << 9); + p_validbits |= ((uint16_t)1U << 10); } #endif // CONFIG_SX1276 @@ -10866,7 +11744,7 @@ inline const DisplayConfig &HardwareConfig::display() const inline bool HardwareConfig::has_display() const { - return 0 != (p_validbits & ((uint16_t)1U << 10)); + return 0 != (p_validbits & ((uint16_t)1U << 11)); } /*! @@ -10875,14 +11753,14 @@ inline bool HardwareConfig::has_display() const */ inline void HardwareConfig::clear_display() { - p_validbits &= ~((uint16_t)1U << 10); + p_validbits &= ~((uint16_t)1U << 11); m_display.clear(); } inline DisplayConfig *HardwareConfig::mutable_display() { - if (0 == (p_validbits & ((uint16_t)1U << 10))) { - p_validbits |= ((uint16_t)1U << 10); + if (0 == (p_validbits & ((uint16_t)1U << 11))) { + p_validbits |= ((uint16_t)1U << 11); m_display.clear(); } return &m_display; @@ -10891,13 +11769,13 @@ inline DisplayConfig *HardwareConfig::mutable_display() inline void HardwareConfig::set_display(const void *data, size_t s) { m_display.fromMemory((const char *)data,s); - p_validbits |= ((uint16_t)1U << 10); + p_validbits |= ((uint16_t)1U << 11); } inline void HardwareConfig::set_display(const DisplayConfig &v) { m_display = v; - p_validbits |= ((uint16_t)1U << 10); + p_validbits |= ((uint16_t)1U << 11); } #endif // CONFIG_DISPLAY diff --git a/components/wfc/hwcfg_esp8266.cpp b/components/wfc/hwcfg_esp8266.cpp index 8c15e35..9306645 100644 --- a/components/wfc/hwcfg_esp8266.cpp +++ b/components/wfc/hwcfg_esp8266.cpp @@ -1,8 +1,8 @@ /**************************************************************************** * * Code generated by Wire-Format-Compiler (WFC) - * WFC Version: P2304 (hg:456/095c4982cbea) - * WFC is Copyright 2015-2022, Thomas Maier-Komor + * WFC Version: P2304.3 (hg:459/5fefa02bc543) + * WFC is Copyright 2015-2023, Thomas Maier-Komor * * Source Information: * =================== @@ -10,7 +10,7 @@ * Copyright: 2018-2023 * Author : Thomas Maier-Komor * - * Code generated on 2023-10-24, 21:26:41 (CET). + * Code generated on 2023-11-26, 14:29:43 (CET). * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -610,6 +610,12 @@ void SystemConfig::clear() #ifdef CONFIG_USB_CONSOLE m_usb_con = true; #endif // CONFIG_USB_CONSOLE + #ifdef CONFIG_ESP_PHY_ENABLE_USB + m_cc1_gpio = -1; + #endif // CONFIG_ESP_PHY_ENABLE_USB + #ifdef CONFIG_ESP_PHY_ENABLE_USB + m_cc2_gpio = -1; + #endif // CONFIG_ESP_PHY_ENABLE_USB p_validbits = 0; } @@ -631,6 +637,12 @@ void SystemConfig::toASCII(stream &o, size_t indent) const #ifdef CONFIG_USB_CONSOLE ascii_bool(o, indent, "usb_con", m_usb_con); #endif // CONFIG_USB_CONSOLE + #ifdef CONFIG_ESP_PHY_ENABLE_USB + ascii_numeric(o, indent, "cc1_gpio", (signed) m_cc1_gpio); + #endif // CONFIG_ESP_PHY_ENABLE_USB + #ifdef CONFIG_ESP_PHY_ENABLE_USB + ascii_numeric(o, indent, "cc2_gpio", (signed) m_cc2_gpio); + #endif // CONFIG_ESP_PHY_ENABLE_USB --indent; ascii_indent(o,indent); o << '}'; @@ -702,6 +714,16 @@ ssize_t SystemConfig::fromMemory(const void *b, ssize_t s) set_usb_con(ud.u8); break; #endif // CONFIG_USB_CONSOLE + #ifdef CONFIG_ESP_PHY_ENABLE_USB + case 0x58: // cc1_gpio id 11, type int8_t, coding signed varint + set_cc1_gpio(varint_sint(ud.u8)); + break; + #endif // CONFIG_ESP_PHY_ENABLE_USB + #ifdef CONFIG_ESP_PHY_ENABLE_USB + case 0x60: // cc2_gpio id 12, type int8_t, coding signed varint + set_cc2_gpio(varint_sint(ud.u8)); + break; + #endif // CONFIG_ESP_PHY_ENABLE_USB default: if ((fid & 7) == 2) { // need only to skip len prefixed data @@ -830,6 +852,32 @@ ssize_t SystemConfig::toMemory(uint8_t *b, ssize_t s) const *a++ = m_usb_con; } #endif // CONFIG_USB_CONSOLE + #ifdef CONFIG_ESP_PHY_ENABLE_USB + // has cc1_gpio? + if (m_cc1_gpio != -1) { + // 'cc1_gpio': id=11, encoding=varint, tag=0x58 + if (a >= e) + return -27; + *a++ = 0x58; + n = write_varint(a,e-a,sint_varint(m_cc1_gpio)); + if (n <= 0) + return -28; + a += n; + } + #endif // CONFIG_ESP_PHY_ENABLE_USB + #ifdef CONFIG_ESP_PHY_ENABLE_USB + // has cc2_gpio? + if (m_cc2_gpio != -1) { + // 'cc2_gpio': id=12, encoding=varint, tag=0x60 + if (a >= e) + return -29; + *a++ = 0x60; + n = write_varint(a,e-a,sint_varint(m_cc2_gpio)); + if (n <= 0) + return -30; + a += n; + } + #endif // CONFIG_ESP_PHY_ENABLE_USB assert(a <= e); return a-b; } @@ -882,6 +930,18 @@ void SystemConfig::toJSON(stream &json, unsigned indLvl) const json << (m_usb_con ? "true" : "false"); } #endif // CONFIG_USB_CONSOLE + #ifdef CONFIG_ESP_PHY_ENABLE_USB + if (has_cc1_gpio()) { + fsep = json_indent(json,indLvl,fsep,"cc1_gpio"); + to_decstr(json,(int) m_cc1_gpio); + } + #endif // CONFIG_ESP_PHY_ENABLE_USB + #ifdef CONFIG_ESP_PHY_ENABLE_USB + if (has_cc2_gpio()) { + fsep = json_indent(json,indLvl,fsep,"cc2_gpio"); + to_decstr(json,(int) m_cc2_gpio); + } + #endif // CONFIG_ESP_PHY_ENABLE_USB if (fsep == '{') json.put('{'); json.put('\n'); @@ -944,6 +1004,18 @@ size_t SystemConfig::calcSize() const r += 2; } #endif // CONFIG_USB_CONSOLE + #ifdef CONFIG_ESP_PHY_ENABLE_USB + // optional sint8 cc1_gpio, id 11 + if (has_cc1_gpio()) { + r += wiresize_s((varint_t)m_cc1_gpio) + 1 /* tag(cc1_gpio) 0x58 */; + } + #endif // CONFIG_ESP_PHY_ENABLE_USB + #ifdef CONFIG_ESP_PHY_ENABLE_USB + // optional sint8 cc2_gpio, id 12 + if (has_cc2_gpio()) { + r += wiresize_s((varint_t)m_cc2_gpio) + 1 /* tag(cc2_gpio) 0x60 */; + } + #endif // CONFIG_ESP_PHY_ENABLE_USB return r; } @@ -975,6 +1047,14 @@ bool SystemConfig::operator == (const SystemConfig &r) const if (has_usb_con() && (!(m_usb_con == r.m_usb_con))) return false; #endif // CONFIG_USB_CONSOLE + #ifdef CONFIG_ESP_PHY_ENABLE_USB + if (has_cc1_gpio() && (!(m_cc1_gpio == r.m_cc1_gpio))) + return false; + #endif // CONFIG_ESP_PHY_ENABLE_USB + #ifdef CONFIG_ESP_PHY_ENABLE_USB + if (has_cc2_gpio() && (!(m_cc2_gpio == r.m_cc2_gpio))) + return false; + #endif // CONFIG_ESP_PHY_ENABLE_USB return true; } @@ -1081,7 +1161,27 @@ int SystemConfig::setByName(const char *name, const char *value) return r; } #endif // CONFIG_USB_CONSOLE - return -27; + #ifdef CONFIG_ESP_PHY_ENABLE_USB + if (0 == strcmp(name,"cc1_gpio")) { + if (value == 0) { + clear_cc1_gpio(); + return 0; + } + int r = parse_ascii_s8(&m_cc1_gpio,value); + return r; + } + #endif // CONFIG_ESP_PHY_ENABLE_USB + #ifdef CONFIG_ESP_PHY_ENABLE_USB + if (0 == strcmp(name,"cc2_gpio")) { + if (value == 0) { + clear_cc2_gpio(); + return 0; + } + int r = parse_ascii_s8(&m_cc2_gpio,value); + return r; + } + #endif // CONFIG_ESP_PHY_ENABLE_USB + return -31; } TouchpadConfig::TouchpadConfig() @@ -1121,7 +1221,7 @@ ssize_t TouchpadConfig::fromMemory(const void *b, ssize_t s) union decode_union ud; ssize_t x = decode_early(a,e,&ud,&fid); if (x < 0) - return -28; + return -32; a += x; switch (fid) { case 0xb: // fsm_mode id 1, type bool, coding 8bit @@ -1144,13 +1244,13 @@ ssize_t TouchpadConfig::fromMemory(const void *b, ssize_t s) // need only to skip len prefixed data a += ud.vi; if (a > e) - return -29; + return -33; } } } assert((a-(const uint8_t *)b) == s); if (a > e) - return -30; + return -34; return a-(const uint8_t *)b; } @@ -1163,7 +1263,7 @@ ssize_t TouchpadConfig::toMemory(uint8_t *b, ssize_t s) const if (m_fsm_mode != false) { // 'fsm_mode': id=1, encoding=8bit, tag=0xb if (2 > (e-a)) - return -31; + return -35; *a++ = 0xb; *a++ = m_fsm_mode; } @@ -1171,44 +1271,44 @@ ssize_t TouchpadConfig::toMemory(uint8_t *b, ssize_t s) const if (m_lvolt != -1) { // 'lvolt': id=2, encoding=varint, tag=0x10 if (a >= e) - return -32; + return -36; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_lvolt)); if (n <= 0) - return -33; + return -37; a += n; } // has hvolt? if (m_hvolt != -1) { // 'hvolt': id=3, encoding=varint, tag=0x18 if (a >= e) - return -34; + return -38; *a++ = 0x18; n = write_varint(a,e-a,sint_varint(m_hvolt)); if (n <= 0) - return -35; + return -39; a += n; } // has atten? if (m_atten != -1) { // 'atten': id=4, encoding=varint, tag=0x20 if (a >= e) - return -36; + return -40; *a++ = 0x20; n = write_varint(a,e-a,sint_varint(m_atten)); if (n <= 0) - return -37; + return -41; a += n; } // has interval? if (0 != (p_validbits & ((uint8_t)1U << 0))) { // 'interval': id=7, encoding=varint, tag=0x38 if (a >= e) - return -38; + return -42; *a++ = 0x38; n = write_varint(a,e-a,m_interval); if (n <= 0) - return -39; + return -43; a += n; } assert(a <= e); @@ -1344,7 +1444,7 @@ int TouchpadConfig::setByName(const char *name, const char *value) p_validbits |= ((uint8_t)1U << 0); return r; } - return -40; + return -44; } TouchChannelConfig::TouchChannelConfig() @@ -1384,12 +1484,12 @@ ssize_t TouchChannelConfig::fromMemory(const void *b, ssize_t s) union decode_union ud; ssize_t x = decode_early(a,e,&ud,&fid); if (x < 0) - return -41; + return -45; a += x; switch (fid) { case 0xa: // name id 1, type estring, coding byte[] if ((ssize_t)ud.vi > e-a) { - return -42; + return -46; } m_name.assign((const char*)a,ud.vi); a += ud.vi; @@ -1411,13 +1511,13 @@ ssize_t TouchChannelConfig::fromMemory(const void *b, ssize_t s) // need only to skip len prefixed data a += ud.vi; if (a > e) - return -43; + return -47; } } } assert((a-(const uint8_t *)b) == s); if (a > e) - return -44; + return -48; return a-(const uint8_t *)b; } @@ -1430,29 +1530,29 @@ ssize_t TouchChannelConfig::toMemory(uint8_t *b, ssize_t s) const if (!m_name.empty()) { // 'name': id=1, encoding=lenpfx, tag=0xa if (a >= e) - return -45; + return -49; *a++ = 0xa; n = encode_bytes(m_name,a,e); if (n < 0) - return -46; + return -50; a += n; } // has channel? if (m_channel != -1) { // 'channel': id=2, encoding=varint, tag=0x10 if (a >= e) - return -47; + return -51; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_channel)); if (n <= 0) - return -48; + return -52; a += n; } // has threshold? if (0 != (p_validbits & ((uint8_t)1U << 0))) { // 'threshold': id=3, encoding=16bit, tag=0x1c if (3 > (e-a)) - return -49; + return -53; *a++ = 0x1c; write_u16(a,m_threshold); a += 2; @@ -1461,22 +1561,22 @@ ssize_t TouchChannelConfig::toMemory(uint8_t *b, ssize_t s) const if (0 != (p_validbits & ((uint8_t)1U << 1))) { // 'slope': id=4, encoding=varint, tag=0x20 if (a >= e) - return -50; + return -54; *a++ = 0x20; n = write_varint(a,e-a,m_slope); if (n <= 0) - return -51; + return -55; a += n; } // has tieopt? if (0 != (p_validbits & ((uint8_t)1U << 2))) { // 'tieopt': id=5, encoding=varint, tag=0x28 if (a >= e) - return -52; + return -56; *a++ = 0x28; n = write_varint(a,e-a,m_tieopt); if (n <= 0) - return -53; + return -57; a += n; } assert(a <= e); @@ -1618,7 +1718,7 @@ int TouchChannelConfig::setByName(const char *name, const char *value) p_validbits |= ((uint8_t)1U << 2); return r; } - return -54; + return -58; } ButtonConfig::ButtonConfig() @@ -1675,12 +1775,12 @@ ssize_t ButtonConfig::fromMemory(const void *b, ssize_t s) union decode_union ud; ssize_t x = decode_early(a,e,&ud,&fid); if (x < 0) - return -55; + return -59; a += x; switch (fid) { case 0xa: // name id 1, type estring, coding byte[] if ((ssize_t)ud.vi > e-a) { - return -56; + return -60; } m_name.assign((const char*)a,ud.vi); a += ud.vi; @@ -1709,13 +1809,13 @@ ssize_t ButtonConfig::fromMemory(const void *b, ssize_t s) // need only to skip len prefixed data a += ud.vi; if (a > e) - return -57; + return -61; } } } assert((a-(const uint8_t *)b) == s); if (a > e) - return -58; + return -62; return a-(const uint8_t *)b; } @@ -1728,29 +1828,29 @@ ssize_t ButtonConfig::toMemory(uint8_t *b, ssize_t s) const if (!m_name.empty()) { // 'name': id=1, encoding=lenpfx, tag=0xa if (a >= e) - return -59; + return -63; *a++ = 0xa; n = encode_bytes(m_name,a,e); if (n < 0) - return -60; + return -64; a += n; } // has gpio? if (m_gpio != -1) { // 'gpio': id=2, encoding=varint, tag=0x10 if (a >= e) - return -61; + return -65; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_gpio)); if (n <= 0) - return -62; + return -66; a += n; } // has presslvl? if (m_presslvl != 0) { // 'presslvl': id=3, encoding=8bit, tag=0x1b if (2 > (e-a)) - return -63; + return -67; *a++ = 0x1b; *a++ = m_presslvl; } @@ -1758,11 +1858,11 @@ ssize_t ButtonConfig::toMemory(uint8_t *b, ssize_t s) const if (m_pull_mode != pull_none) { // 'pull_mode': id=4, encoding=varint, tag=0x20 if (a >= e) - return -64; + return -68; *a++ = 0x20; n = write_varint(a,e-a,m_pull_mode); if (n <= 0) - return -65; + return -69; a += n; } #ifdef CONFIG_ROTARYENCODER @@ -1770,11 +1870,11 @@ ssize_t ButtonConfig::toMemory(uint8_t *b, ssize_t s) const if (m_clk != -1) { // 'clk': id=5, encoding=varint, tag=0x28 if (a >= e) - return -66; + return -70; *a++ = 0x28; n = write_varint(a,e-a,sint_varint(m_clk)); if (n <= 0) - return -67; + return -71; a += n; } #endif // CONFIG_ROTARYENCODER @@ -1783,11 +1883,11 @@ ssize_t ButtonConfig::toMemory(uint8_t *b, ssize_t s) const if (m_dt != -1) { // 'dt': id=6, encoding=varint, tag=0x30 if (a >= e) - return -68; + return -72; *a++ = 0x30; n = write_varint(a,e-a,sint_varint(m_dt)); if (n <= 0) - return -69; + return -73; a += n; } #endif // CONFIG_ROTARYENCODER @@ -1941,23 +2041,21 @@ int ButtonConfig::setByName(const char *name, const char *value) set_pull_mode_up((bool)ull); return eptr - value; } - #ifndef CONFIG_ESPTOOLPY_FLASHSIZE_1MB if (*name++ != '.') { - return -70; + return -74; } else if (!strcmp(name,"enable")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_pull_mode(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_pull_mode_enable(tmp); return r; } else if (!strcmp(name,"up")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_pull_mode(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_pull_mode_up(tmp); return r; } - #endif // !CONFIG_ESPTOOLPY_FLASHSIZE_1MB } #ifdef CONFIG_ROTARYENCODER if (0 == strcmp(name,"clk")) { @@ -1979,7 +2077,7 @@ int ButtonConfig::setByName(const char *name, const char *value) return r; } #endif // CONFIG_ROTARYENCODER - return -71; + return -75; } RelayConfig::RelayConfig() @@ -2036,12 +2134,12 @@ ssize_t RelayConfig::fromMemory(const void *b, ssize_t s) union decode_union ud; ssize_t x = decode_early(a,e,&ud,&fid); if (x < 0) - return -72; + return -76; a += x; switch (fid) { case 0xa: // name id 1, type estring, coding byte[] if ((ssize_t)ud.vi > e-a) { - return -73; + return -77; } m_name.assign((const char*)a,ud.vi); a += ud.vi; @@ -2063,13 +2161,13 @@ ssize_t RelayConfig::fromMemory(const void *b, ssize_t s) // need only to skip len prefixed data a += ud.vi; if (a > e) - return -74; + return -78; } } } assert((a-(const uint8_t *)b) == s); if (a > e) - return -75; + return -79; return a-(const uint8_t *)b; } @@ -2082,55 +2180,55 @@ ssize_t RelayConfig::toMemory(uint8_t *b, ssize_t s) const if (!m_name.empty()) { // 'name': id=1, encoding=lenpfx, tag=0xa if (a >= e) - return -76; + return -80; *a++ = 0xa; n = encode_bytes(m_name,a,e); if (n < 0) - return -77; + return -81; a += n; } // has gpio? if (m_gpio != -1) { // 'gpio': id=2, encoding=varint, tag=0x10 if (a >= e) - return -78; + return -82; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_gpio)); if (n <= 0) - return -79; + return -83; a += n; } // has config? if (m_config != 0) { // 'config': id=3, encoding=varint, tag=0x18 if (a >= e) - return -80; + return -84; *a++ = 0x18; n = write_varint(a,e-a,m_config); if (n <= 0) - return -81; + return -85; a += n; } // has min_itv? if (0 != (p_validbits & ((uint8_t)1U << 0))) { // 'min_itv': id=4, encoding=varint, tag=0x20 if (a >= e) - return -82; + return -86; *a++ = 0x20; n = write_varint(a,e-a,m_min_itv); if (n <= 0) - return -83; + return -87; a += n; } // has interlock? if (m_interlock != -1) { // 'interlock': id=5, encoding=varint, tag=0x28 if (a >= e) - return -84; + return -88; *a++ = 0x28; n = write_varint(a,e-a,sint_varint(m_interlock)); if (n <= 0) - return -85; + return -89; a += n; } assert(a <= e); @@ -2261,41 +2359,39 @@ int RelayConfig::setByName(const char *name, const char *value) set_config_mqtt((bool)ull); return eptr - value; } - #ifndef CONFIG_ESPTOOLPY_FLASHSIZE_1MB if (*name++ != '.') { - return -86; + return -90; } else if (!strcmp(name,"active_high")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_active_high(tmp); return r; } else if (!strcmp(name,"init_on")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_init_on(tmp); return r; } else if (!strcmp(name,"persistent")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_persistent(tmp); return r; } else if (!strcmp(name,"opendrain")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_opendrain(tmp); return r; } else if (!strcmp(name,"mqtt")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_mqtt(tmp); return r; } - #endif // !CONFIG_ESPTOOLPY_FLASHSIZE_1MB } if (0 == strcmp(name,"min_itv")) { if (value == 0) { @@ -2315,7 +2411,7 @@ int RelayConfig::setByName(const char *name, const char *value) int r = parse_ascii_s8(&m_interlock,value); return r; } - return -87; + return -91; } Max7219Config::Max7219Config() @@ -2354,7 +2450,7 @@ ssize_t Max7219Config::fromMemory(const void *b, ssize_t s) union decode_union ud; ssize_t x = decode_early(a,e,&ud,&fid); if (x < 0) - return -88; + return -92; a += x; switch (fid) { case 0x8: // clk id 1, type int8_t, coding signed varint @@ -2377,13 +2473,13 @@ ssize_t Max7219Config::fromMemory(const void *b, ssize_t s) // need only to skip len prefixed data a += ud.vi; if (a > e) - return -89; + return -93; } } } assert((a-(const uint8_t *)b) == s); if (a > e) - return -90; + return -94; return a-(const uint8_t *)b; } @@ -2396,40 +2492,40 @@ ssize_t Max7219Config::toMemory(uint8_t *b, ssize_t s) const if (m_clk != -1) { // 'clk': id=1, encoding=varint, tag=0x8 if (a >= e) - return -91; + return -95; *a++ = 0x8; n = write_varint(a,e-a,sint_varint(m_clk)); if (n <= 0) - return -92; + return -96; a += n; } // has dout? if (m_dout != -1) { // 'dout': id=2, encoding=varint, tag=0x10 if (a >= e) - return -93; + return -97; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_dout)); if (n <= 0) - return -94; + return -98; a += n; } // has cs? if (m_cs != -1) { // 'cs': id=3, encoding=varint, tag=0x18 if (a >= e) - return -95; + return -99; *a++ = 0x18; n = write_varint(a,e-a,sint_varint(m_cs)); if (n <= 0) - return -96; + return -100; a += n; } // has odrain? if (m_odrain != false) { // 'odrain': id=4, encoding=8bit, tag=0x23 if (2 > (e-a)) - return -97; + return -101; *a++ = 0x23; *a++ = m_odrain; } @@ -2437,11 +2533,11 @@ ssize_t Max7219Config::toMemory(uint8_t *b, ssize_t s) const if (m_digits != 0) { // 'digits': id=5, encoding=varint, tag=0x28 if (a >= e) - return -98; + return -102; *a++ = 0x28; n = write_varint(a,e-a,m_digits); if (n <= 0) - return -99; + return -103; a += n; } assert(a <= e); @@ -2573,7 +2669,7 @@ int Max7219Config::setByName(const char *name, const char *value) int r = parse_ascii_u8(&m_digits,value); return r; } - return -100; + return -104; } Tlc5947Config::Tlc5947Config() @@ -2612,7 +2708,7 @@ ssize_t Tlc5947Config::fromMemory(const void *b, ssize_t s) union decode_union ud; ssize_t x = decode_early(a,e,&ud,&fid); if (x < 0) - return -101; + return -105; a += x; switch (fid) { case 0x8: // sin id 1, type int8_t, coding signed varint @@ -2635,13 +2731,13 @@ ssize_t Tlc5947Config::fromMemory(const void *b, ssize_t s) // need only to skip len prefixed data a += ud.vi; if (a > e) - return -102; + return -106; } } } assert((a-(const uint8_t *)b) == s); if (a > e) - return -103; + return -107; return a-(const uint8_t *)b; } @@ -2654,55 +2750,55 @@ ssize_t Tlc5947Config::toMemory(uint8_t *b, ssize_t s) const if (m_sin != -1) { // 'sin': id=1, encoding=varint, tag=0x8 if (a >= e) - return -104; + return -108; *a++ = 0x8; n = write_varint(a,e-a,sint_varint(m_sin)); if (n <= 0) - return -105; + return -109; a += n; } // has sclk? if (m_sclk != -1) { // 'sclk': id=2, encoding=varint, tag=0x10 if (a >= e) - return -106; + return -110; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_sclk)); if (n <= 0) - return -107; + return -111; a += n; } // has xlat? if (m_xlat != -1) { // 'xlat': id=3, encoding=varint, tag=0x18 if (a >= e) - return -108; + return -112; *a++ = 0x18; n = write_varint(a,e-a,sint_varint(m_xlat)); if (n <= 0) - return -109; + return -113; a += n; } // has blank? if (m_blank != -1) { // 'blank': id=4, encoding=varint, tag=0x20 if (a >= e) - return -110; + return -114; *a++ = 0x20; n = write_varint(a,e-a,sint_varint(m_blank)); if (n <= 0) - return -111; + return -115; a += n; } // has ntlc? if (m_ntlc != 0) { // 'ntlc': id=5, encoding=varint, tag=0x28 if (a >= e) - return -112; + return -116; *a++ = 0x28; n = write_varint(a,e-a,m_ntlc); if (n <= 0) - return -113; + return -117; a += n; } assert(a <= e); @@ -2834,7 +2930,7 @@ int Tlc5947Config::setByName(const char *name, const char *value) int r = parse_ascii_u8(&m_ntlc,value); return r; } - return -114; + return -118; } Ws2812bConfig::Ws2812bConfig() @@ -2869,7 +2965,7 @@ ssize_t Ws2812bConfig::fromMemory(const void *b, ssize_t s) union decode_union ud; ssize_t x = decode_early(a,e,&ud,&fid); if (x < 0) - return -115; + return -119; a += x; switch (fid) { case 0x8: // gpio id 1, type int8_t, coding signed varint @@ -2880,7 +2976,7 @@ ssize_t Ws2812bConfig::fromMemory(const void *b, ssize_t s) break; case 0x22: // name id 4, type estring, coding byte[] if ((ssize_t)ud.vi > e-a) { - return -116; + return -120; } m_name.assign((const char*)a,ud.vi); a += ud.vi; @@ -2890,13 +2986,13 @@ ssize_t Ws2812bConfig::fromMemory(const void *b, ssize_t s) // need only to skip len prefixed data a += ud.vi; if (a > e) - return -117; + return -121; } } } assert((a-(const uint8_t *)b) == s); if (a > e) - return -118; + return -122; return a-(const uint8_t *)b; } @@ -2909,11 +3005,11 @@ ssize_t Ws2812bConfig::toMemory(uint8_t *b, ssize_t s) const if (m_gpio != -1) { // 'gpio': id=1, encoding=varint, tag=0x8 if (a >= e) - return -119; + return -123; *a++ = 0x8; n = write_varint(a,e-a,sint_varint(m_gpio)); if (n <= 0) - return -120; + return -124; a += n; } // 'ch' is unused. Therefore no data will be written. @@ -2921,22 +3017,22 @@ ssize_t Ws2812bConfig::toMemory(uint8_t *b, ssize_t s) const if (m_nleds != 0) { // 'nleds': id=3, encoding=varint, tag=0x18 if (a >= e) - return -121; + return -125; *a++ = 0x18; n = write_varint(a,e-a,m_nleds); if (n <= 0) - return -122; + return -126; a += n; } // has name? if (!m_name.empty()) { // 'name': id=4, encoding=lenpfx, tag=0x22 if (a >= e) - return -123; + return -127; *a++ = 0x22; n = encode_bytes(m_name,a,e); if (n < 0) - return -124; + return -128; a += n; } assert(a <= e); @@ -3035,7 +3131,7 @@ int Ws2812bConfig::setByName(const char *name, const char *value) int r = m_name.size(); return r; } - return -125; + return -129; } DhtConfig::DhtConfig() @@ -3073,7 +3169,7 @@ ssize_t DhtConfig::fromMemory(const void *b, ssize_t s) union decode_union ud; ssize_t x = decode_early(a,e,&ud,&fid); if (x < 0) - return -126; + return -130; a += x; switch (fid) { case 0x8: // model id 1, type dht_model_t, coding varint @@ -3087,13 +3183,13 @@ ssize_t DhtConfig::fromMemory(const void *b, ssize_t s) // need only to skip len prefixed data a += ud.vi; if (a > e) - return -127; + return -131; } } } assert((a-(const uint8_t *)b) == s); if (a > e) - return -128; + return -132; return a-(const uint8_t *)b; } @@ -3106,22 +3202,22 @@ ssize_t DhtConfig::toMemory(uint8_t *b, ssize_t s) const if (m_model != DHT_NONE) { // 'model': id=1, encoding=varint, tag=0x8 if (a >= e) - return -129; + return -133; *a++ = 0x8; n = write_varint(a,e-a,m_model); if (n <= 0) - return -130; + return -134; a += n; } // has gpio? if (m_gpio != -1) { // 'gpio': id=2, encoding=varint, tag=0x10 if (a >= e) - return -131; + return -135; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_gpio)); if (n <= 0) - return -132; + return -136; a += n; } assert(a <= e); @@ -3197,7 +3293,7 @@ int DhtConfig::setByName(const char *name, const char *value) dht_model_t v; size_t r = parse_ascii_dht_model_t(&v,value); if (r == 0) - return -133; + return -137; set_model(v); return r; } @@ -3209,7 +3305,7 @@ int DhtConfig::setByName(const char *name, const char *value) int r = parse_ascii_s8(&m_gpio,value); return r; } - return -134; + return -138; } I2CConfig::I2CConfig() @@ -3278,7 +3374,7 @@ ssize_t I2CConfig::fromMemory(const void *b, ssize_t s) union decode_union ud; ssize_t x = decode_early(a,e,&ud,&fid); if (x < 0) - return -135; + return -139; a += x; switch (fid) { case 0x8: // port id 1, type uint8_t, coding varint @@ -3301,7 +3397,7 @@ ssize_t I2CConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -136; + return -140; a += n; m_devices.push_back((i2cdev_t)v); } while (a < ae); @@ -3313,13 +3409,13 @@ ssize_t I2CConfig::fromMemory(const void *b, ssize_t s) // need only to skip len prefixed data a += ud.vi; if (a > e) - return -137; + return -141; } } } assert((a-(const uint8_t *)b) == s); if (a > e) - return -138; + return -142; return a-(const uint8_t *)b; } @@ -3332,33 +3428,33 @@ ssize_t I2CConfig::toMemory(uint8_t *b, ssize_t s) const if (0 != (p_validbits & ((uint8_t)1U << 0))) { // 'port': id=1, encoding=varint, tag=0x8 if (a >= e) - return -139; + return -143; *a++ = 0x8; n = write_varint(a,e-a,m_port); if (n <= 0) - return -140; + return -144; a += n; } // has sda? if (m_sda != -1) { // 'sda': id=2, encoding=varint, tag=0x10 if (a >= e) - return -141; + return -145; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_sda)); if (n <= 0) - return -142; + return -146; a += n; } // has scl? if (m_scl != -1) { // 'scl': id=3, encoding=varint, tag=0x18 if (a >= e) - return -143; + return -147; *a++ = 0x18; n = write_varint(a,e-a,sint_varint(m_scl)); if (n <= 0) - return -144; + return -148; a += n; } // 'freq' is unused. Therefore no data will be written. @@ -3366,7 +3462,7 @@ ssize_t I2CConfig::toMemory(uint8_t *b, ssize_t s) const if (m_xpullup != false) { // 'xpullup': id=5, encoding=8bit, tag=0x2b if (2 > (e-a)) - return -145; + return -149; *a++ = 0x2b; *a++ = m_xpullup; } @@ -3374,7 +3470,7 @@ ssize_t I2CConfig::toMemory(uint8_t *b, ssize_t s) const if (size_t devices_ne = m_devices.size()) { // 'devices': id=6, encoding=lenpfx, tag=0x32 if (a >= e) - return -146; + return -150; *a++ = 0x32; ssize_t devices_ws = 0; for (size_t x = 0; x != devices_ne; ++x) @@ -3382,7 +3478,7 @@ ssize_t I2CConfig::toMemory(uint8_t *b, ssize_t s) const n = write_varint(a,e-a,devices_ws); a += n; if ((n <= 0) || (devices_ws > (e-a))) - return -147; + return -151; for (size_t x = 0; x != devices_ne; ++x) a += write_varint(a,e-a,m_devices[x]); } @@ -3554,9 +3650,9 @@ int I2CConfig::setByName(const char *name, const char *value) } else { x = strtoul(name+8,&idxe,0); if ((idxe[0] != ']') || (idxe == (name+8))) - return -148; + return -152; if (m_devices.size() <= x) - return -149; + return -153; if ((idxe[1] == 0) && (value == 0)) { m_devices.erase(m_devices.begin()+x); return 0; @@ -3569,7 +3665,7 @@ int I2CConfig::setByName(const char *name, const char *value) return eptr - value; } if (idxe[1] != '.') - return -150; + return -154; idxe += 2; if (!strcmp("addr",idxe)) { if (eptr != value) { @@ -3596,11 +3692,11 @@ int I2CConfig::setByName(const char *name, const char *value) return 0; } } - return -151; + return -155; } } #endif // CONFIG_I2C_XDEV - return -152; + return -156; } HcSr04Config::HcSr04Config() @@ -3635,7 +3731,7 @@ ssize_t HcSr04Config::fromMemory(const void *b, ssize_t s) union decode_union ud; ssize_t x = decode_early(a,e,&ud,&fid); if (x < 0) - return -153; + return -157; a += x; switch (fid) { case 0x8: // trigger id 1, type int8_t, coding signed varint @@ -3646,7 +3742,7 @@ ssize_t HcSr04Config::fromMemory(const void *b, ssize_t s) break; case 0x1a: // name id 3, type estring, coding byte[] if ((ssize_t)ud.vi > e-a) { - return -154; + return -158; } m_name.assign((const char*)a,ud.vi); a += ud.vi; @@ -3656,13 +3752,13 @@ ssize_t HcSr04Config::fromMemory(const void *b, ssize_t s) // need only to skip len prefixed data a += ud.vi; if (a > e) - return -155; + return -159; } } } assert((a-(const uint8_t *)b) == s); if (a > e) - return -156; + return -160; return a-(const uint8_t *)b; } @@ -3675,33 +3771,33 @@ ssize_t HcSr04Config::toMemory(uint8_t *b, ssize_t s) const if (m_trigger != -1) { // 'trigger': id=1, encoding=varint, tag=0x8 if (a >= e) - return -157; + return -161; *a++ = 0x8; n = write_varint(a,e-a,sint_varint(m_trigger)); if (n <= 0) - return -158; + return -162; a += n; } // has echo? if (m_echo != -1) { // 'echo': id=2, encoding=varint, tag=0x10 if (a >= e) - return -159; + return -163; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_echo)); if (n <= 0) - return -160; + return -164; a += n; } // has name? if (!m_name.empty()) { // 'name': id=3, encoding=lenpfx, tag=0x1a if (a >= e) - return -161; + return -165; *a++ = 0x1a; n = encode_bytes(m_name,a,e); if (n < 0) - return -162; + return -166; a += n; } assert(a <= e); @@ -3799,7 +3895,7 @@ int HcSr04Config::setByName(const char *name, const char *value) int r = m_name.size(); return r; } - return -163; + return -167; } LedConfig::LedConfig() @@ -3828,6 +3924,9 @@ void LedConfig::toASCII(stream &o, size_t indent) const ascii_indent(o,indent); o << ".open_drain"; o << (config_open_drain() ? " = true;" : " = false;"); + ascii_indent(o,indent); + o << ".init_high"; + o << (config_init_high() ? " = true;" : " = false;"); --indent; ascii_string(o,indent,m_name.data(),m_name.size(),"name"); ascii_numeric(o, indent, "pwm_ch", (signed) m_pwm_ch); @@ -3845,7 +3944,7 @@ ssize_t LedConfig::fromMemory(const void *b, ssize_t s) union decode_union ud; ssize_t x = decode_early(a,e,&ud,&fid); if (x < 0) - return -164; + return -168; a += x; switch (fid) { case 0x8: // gpio id 1, type int8_t, coding signed varint @@ -3856,7 +3955,7 @@ ssize_t LedConfig::fromMemory(const void *b, ssize_t s) break; case 0x1a: // name id 3, type estring, coding byte[] if ((ssize_t)ud.vi > e-a) { - return -165; + return -169; } m_name.assign((const char*)a,ud.vi); a += ud.vi; @@ -3869,13 +3968,13 @@ ssize_t LedConfig::fromMemory(const void *b, ssize_t s) // need only to skip len prefixed data a += ud.vi; if (a > e) - return -166; + return -170; } } } assert((a-(const uint8_t *)b) == s); if (a > e) - return -167; + return -171; return a-(const uint8_t *)b; } @@ -3888,44 +3987,44 @@ ssize_t LedConfig::toMemory(uint8_t *b, ssize_t s) const if (m_gpio != -1) { // 'gpio': id=1, encoding=varint, tag=0x8 if (a >= e) - return -168; + return -172; *a++ = 0x8; n = write_varint(a,e-a,sint_varint(m_gpio)); if (n <= 0) - return -169; + return -173; a += n; } // has config? if (0 != (p_validbits & ((uint8_t)1U << 0))) { // 'config': id=2, encoding=varint, tag=0x10 if (a >= e) - return -170; + return -174; *a++ = 0x10; n = write_varint(a,e-a,m_config); if (n <= 0) - return -171; + return -175; a += n; } // has name? if (!m_name.empty()) { // 'name': id=3, encoding=lenpfx, tag=0x1a if (a >= e) - return -172; + return -176; *a++ = 0x1a; n = encode_bytes(m_name,a,e); if (n < 0) - return -173; + return -177; a += n; } // has pwm_ch? if (m_pwm_ch != -1) { // 'pwm_ch': id=4, encoding=varint, tag=0x20 if (a >= e) - return -174; + return -178; *a++ = 0x20; n = write_varint(a,e-a,sint_varint(m_pwm_ch)); if (n <= 0) - return -175; + return -179; a += n; } assert(a <= e); @@ -4029,25 +4128,31 @@ int LedConfig::setByName(const char *name, const char *value) set_config_active_high((bool)ull); else if (!strcmp(name,"open_drain")) set_config_open_drain((bool)ull); + else if (!strcmp(name,"init_high")) + set_config_init_high((bool)ull); return eptr - value; } - #ifndef CONFIG_ESPTOOLPY_FLASHSIZE_1MB if (*name++ != '.') { - return -176; + return -180; } else if (!strcmp(name,"active_high")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_active_high(tmp); return r; } else if (!strcmp(name,"open_drain")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_open_drain(tmp); + return r; + } else if (!strcmp(name,"init_high")) { + bool tmp; + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_init_high(tmp); return r; } - #endif // !CONFIG_ESPTOOLPY_FLASHSIZE_1MB } if (0 == strcmp(name,"name")) { if (value == 0) { @@ -4066,7 +4171,7 @@ int LedConfig::setByName(const char *name, const char *value) int r = parse_ascii_s8(&m_pwm_ch,value); return r; } - return -177; + return -181; } OneWireConfig::OneWireConfig() @@ -4101,7 +4206,7 @@ ssize_t OneWireConfig::fromMemory(const void *b, ssize_t s) union decode_union ud; ssize_t x = decode_early(a,e,&ud,&fid); if (x < 0) - return -178; + return -182; a += x; switch (fid) { case 0x8: // gpio id 1, type int8_t, coding signed varint @@ -4118,13 +4223,13 @@ ssize_t OneWireConfig::fromMemory(const void *b, ssize_t s) // need only to skip len prefixed data a += ud.vi; if (a > e) - return -179; + return -183; } } } assert((a-(const uint8_t *)b) == s); if (a > e) - return -180; + return -184; return a-(const uint8_t *)b; } @@ -4137,18 +4242,18 @@ ssize_t OneWireConfig::toMemory(uint8_t *b, ssize_t s) const if (m_gpio != -1) { // 'gpio': id=1, encoding=varint, tag=0x8 if (a >= e) - return -181; + return -185; *a++ = 0x8; n = write_varint(a,e-a,sint_varint(m_gpio)); if (n <= 0) - return -182; + return -186; a += n; } // has pullup? if (m_pullup != false) { // 'pullup': id=2, encoding=8bit, tag=0x13 if (2 > (e-a)) - return -183; + return -187; *a++ = 0x13; *a++ = m_pullup; } @@ -4156,11 +4261,11 @@ ssize_t OneWireConfig::toMemory(uint8_t *b, ssize_t s) const if (m_power != -1) { // 'power': id=3, encoding=varint, tag=0x18 if (a >= e) - return -184; + return -188; *a++ = 0x18; n = write_varint(a,e-a,sint_varint(m_power)); if (n <= 0) - return -185; + return -189; a += n; } assert(a <= e); @@ -4256,7 +4361,7 @@ int OneWireConfig::setByName(const char *name, const char *value) int r = parse_ascii_s8(&m_power,value); return r; } - return -186; + return -190; } UartConfig::UartConfig() @@ -4287,7 +4392,7 @@ ssize_t UartConfig::fromMemory(const void *b, ssize_t s) union decode_union ud; ssize_t x = decode_early(a,e,&ud,&fid); if (x < 0) - return -187; + return -191; a += x; switch (fid) { case 0x8: // port id 1, type int8_t, coding signed varint @@ -4298,13 +4403,13 @@ ssize_t UartConfig::fromMemory(const void *b, ssize_t s) // need only to skip len prefixed data a += ud.vi; if (a > e) - return -188; + return -192; } } } assert((a-(const uint8_t *)b) == s); if (a > e) - return -189; + return -193; return a-(const uint8_t *)b; } @@ -4317,11 +4422,11 @@ ssize_t UartConfig::toMemory(uint8_t *b, ssize_t s) const if (m_port != -1) { // 'port': id=1, encoding=varint, tag=0x8 if (a >= e) - return -190; + return -194; *a++ = 0x8; n = write_varint(a,e-a,sint_varint(m_port)); if (n <= 0) - return -191; + return -195; a += n; } // 'tx_gpio' is unused. Therefore no data will be written. @@ -4389,7 +4494,7 @@ int UartConfig::setByName(const char *name, const char *value) int r = parse_ascii_s8(&m_port,value); return r; } - return -192; + return -196; } AdcChannel::AdcChannel() @@ -4437,12 +4542,12 @@ ssize_t AdcChannel::fromMemory(const void *b, ssize_t s) union decode_union ud; ssize_t x = decode_early(a,e,&ud,&fid); if (x < 0) - return -193; + return -197; a += x; switch (fid) { case 0xa: // name id 1, type estring, coding byte[] if ((ssize_t)ud.vi > e-a) { - return -194; + return -198; } m_name.assign((const char*)a,ud.vi); a += ud.vi; @@ -4470,7 +4575,7 @@ ssize_t AdcChannel::fromMemory(const void *b, ssize_t s) break; case 0x52: // dim id 10, type estring, coding byte[] if ((ssize_t)ud.vi > e-a) { - return -195; + return -199; } m_dim.assign((const char*)a,ud.vi); a += ud.vi; @@ -4480,13 +4585,13 @@ ssize_t AdcChannel::fromMemory(const void *b, ssize_t s) // need only to skip len prefixed data a += ud.vi; if (a > e) - return -196; + return -200; } } } assert((a-(const uint8_t *)b) == s); if (a > e) - return -197; + return -201; return a-(const uint8_t *)b; } @@ -4499,76 +4604,76 @@ ssize_t AdcChannel::toMemory(uint8_t *b, ssize_t s) const if (!m_name.empty()) { // 'name': id=1, encoding=lenpfx, tag=0xa if (a >= e) - return -198; + return -202; *a++ = 0xa; n = encode_bytes(m_name,a,e); if (n < 0) - return -199; + return -203; a += n; } // has unit? if (m_unit != 0) { // 'unit': id=2, encoding=varint, tag=0x10 if (a >= e) - return -200; + return -204; *a++ = 0x10; n = write_varint(a,e-a,m_unit); if (n <= 0) - return -201; + return -205; a += n; } // has ch? if (m_ch != -1) { // 'ch': id=3, encoding=varint, tag=0x18 if (a >= e) - return -202; + return -206; *a++ = 0x18; n = write_varint(a,e-a,sint_varint(m_ch)); if (n <= 0) - return -203; + return -207; a += n; } // has atten? if (0 != (p_validbits & ((uint8_t)1U << 0))) { // 'atten': id=4, encoding=varint, tag=0x20 if (a >= e) - return -204; + return -208; *a++ = 0x20; n = write_varint(a,e-a,m_atten); if (n <= 0) - return -205; + return -209; a += n; } // has interval? if (m_interval != 0) { // 'interval': id=5, encoding=varint, tag=0x28 if (a >= e) - return -206; + return -210; *a++ = 0x28; n = write_varint(a,e-a,m_interval); if (n <= 0) - return -207; + return -211; a += n; } // has window? if (m_window != 0) { // 'window': id=6, encoding=varint, tag=0x30 if (a >= e) - return -208; + return -212; *a++ = 0x30; n = write_varint(a,e-a,m_window); if (n <= 0) - return -209; + return -213; a += n; } // has scale? if (0 != (p_validbits & ((uint8_t)1U << 1))) { // 'scale': id=8, encoding=32bit, tag=0x45 if (5 > (e-a)) - return -210; + return -214; *a++ = 0x45; if ((e-a) < 4) - return -211; + return -215; write_u32(a,mangle_float(m_scale)); a += 4; } @@ -4576,10 +4681,10 @@ ssize_t AdcChannel::toMemory(uint8_t *b, ssize_t s) const if (0 != (p_validbits & ((uint8_t)1U << 2))) { // 'offset': id=9, encoding=32bit, tag=0x4d if (5 > (e-a)) - return -212; + return -216; *a++ = 0x4d; if ((e-a) < 4) - return -213; + return -217; write_u32(a,mangle_float(m_offset)); a += 4; } @@ -4587,11 +4692,11 @@ ssize_t AdcChannel::toMemory(uint8_t *b, ssize_t s) const if (!m_dim.empty()) { // 'dim': id=10, encoding=lenpfx, tag=0x52 if (a >= e) - return -214; + return -218; *a++ = 0x52; n = encode_bytes(m_dim,a,e); if (n < 0) - return -215; + return -219; a += n; } assert(a <= e); @@ -4807,7 +4912,7 @@ int AdcChannel::setByName(const char *name, const char *value) int r = m_dim.size(); return r; } - return -216; + return -220; } AdcConfig::AdcConfig() @@ -4843,12 +4948,12 @@ ssize_t AdcConfig::fromMemory(const void *b, ssize_t s) union decode_union ud; ssize_t x = decode_early(a,e,&ud,&fid); if (x < 0) - return -217; + return -221; a += x; switch (fid) { case 0xa: // adc_name id 1, type estring, coding byte[] if ((ssize_t)ud.vi > e-a) { - return -218; + return -222; } m_adc_name.assign((const char*)a,ud.vi); a += ud.vi; @@ -4864,13 +4969,13 @@ ssize_t AdcConfig::fromMemory(const void *b, ssize_t s) // need only to skip len prefixed data a += ud.vi; if (a > e) - return -219; + return -223; } } } assert((a-(const uint8_t *)b) == s); if (a > e) - return -220; + return -224; return a-(const uint8_t *)b; } @@ -4883,11 +4988,11 @@ ssize_t AdcConfig::toMemory(uint8_t *b, ssize_t s) const if (!m_adc_name.empty()) { // 'adc_name': id=1, encoding=lenpfx, tag=0xa if (a >= e) - return -221; + return -225; *a++ = 0xa; n = encode_bytes(m_adc_name,a,e); if (n < 0) - return -222; + return -226; a += n; } // 'adc1_bits' is unused. Therefore no data will be written. @@ -4896,22 +5001,22 @@ ssize_t AdcConfig::toMemory(uint8_t *b, ssize_t s) const if (0 != (p_validbits & ((uint8_t)1U << 0))) { // 'mode': id=4, encoding=varint, tag=0x20 if (a >= e) - return -223; + return -227; *a++ = 0x20; n = write_varint(a,e-a,m_mode); if (n <= 0) - return -224; + return -228; a += n; } // has clk_div? if (0 != (p_validbits & ((uint8_t)1U << 1))) { // 'clk_div': id=5, encoding=varint, tag=0x28 if (a >= e) - return -225; + return -229; *a++ = 0x28; n = write_varint(a,e-a,m_clk_div); if (n <= 0) - return -226; + return -230; a += n; } // 'hall_name' is unused. Therefore no data will be written. @@ -5021,7 +5126,7 @@ int AdcConfig::setByName(const char *name, const char *value) p_validbits |= ((uint8_t)1U << 1); return r; } - return -227; + return -231; } GpioConfig::GpioConfig() @@ -5064,9 +5169,6 @@ void GpioConfig::toASCII(stream &o, size_t indent) const ascii_indent(o,indent); o << ".pulldown"; o << (config_pulldown() ? " = true;" : " = false;"); - ascii_indent(o,indent); - o << ".cap_freq_r2r"; - o << (config_cap_freq_r2r() ? " = true;" : " = false;"); --indent; --indent; ascii_indent(o,indent); @@ -5082,12 +5184,12 @@ ssize_t GpioConfig::fromMemory(const void *b, ssize_t s) union decode_union ud; ssize_t x = decode_early(a,e,&ud,&fid); if (x < 0) - return -228; + return -232; a += x; switch (fid) { case 0xa: // name id 1, type estring, coding byte[] if ((ssize_t)ud.vi > e-a) { - return -229; + return -233; } m_name.assign((const char*)a,ud.vi); a += ud.vi; @@ -5103,13 +5205,13 @@ ssize_t GpioConfig::fromMemory(const void *b, ssize_t s) // need only to skip len prefixed data a += ud.vi; if (a > e) - return -230; + return -234; } } } assert((a-(const uint8_t *)b) == s); if (a > e) - return -231; + return -235; return a-(const uint8_t *)b; } @@ -5122,33 +5224,33 @@ ssize_t GpioConfig::toMemory(uint8_t *b, ssize_t s) const if (!m_name.empty()) { // 'name': id=1, encoding=lenpfx, tag=0xa if (a >= e) - return -232; + return -236; *a++ = 0xa; n = encode_bytes(m_name,a,e); if (n < 0) - return -233; + return -237; a += n; } // has gpio? if (m_gpio != -1) { // 'gpio': id=2, encoding=varint, tag=0x10 if (a >= e) - return -234; + return -238; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_gpio)); if (n <= 0) - return -235; + return -239; a += n; } // has config? if (0 != (p_validbits & ((uint8_t)1U << 0))) { // 'config': id=3, encoding=varint, tag=0x18 if (a >= e) - return -236; + return -240; *a++ = 0x18; n = write_varint(a,e-a,m_config); if (n <= 0) - return -237; + return -241; a += n; } assert(a <= e); @@ -5259,59 +5361,49 @@ int GpioConfig::setByName(const char *name, const char *value) set_config_pullup((bool)ull); else if (!strcmp(name,"pulldown")) set_config_pulldown((bool)ull); - else if (!strcmp(name,"cap_freq_r2r")) - set_config_cap_freq_r2r((bool)ull); return eptr - value; } - #ifndef CONFIG_ESPTOOLPY_FLASHSIZE_1MB if (*name++ != '.') { - return -238; + return -242; } else if (!strcmp(name,"mode")) { uint8_t tmp; - size_t r = parse_ascii_u8(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_u8(&tmp,value); + if (r > 0) + set_config_mode(tmp); return r; } else if (!strcmp(name,"intrtype")) { uint8_t tmp; - size_t r = parse_ascii_u8(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_u8(&tmp,value); + if (r > 0) + set_config_intrtype(tmp); return r; } else if (!strcmp(name,"setinit")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_setinit(tmp); return r; } else if (!strcmp(name,"initlvl")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_initlvl(tmp); return r; } else if (!strcmp(name,"pullup")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_pullup(tmp); return r; } else if (!strcmp(name,"pulldown")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_config(tmp); - return r; - } else if (!strcmp(name,"cap_freq_r2r")) { - bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_pulldown(tmp); return r; } - #endif // !CONFIG_ESPTOOLPY_FLASHSIZE_1MB } - return -239; + return -243; } DisplayConfig::DisplayConfig() @@ -5354,7 +5446,7 @@ ssize_t DisplayConfig::fromMemory(const void *b, ssize_t s) union decode_union ud; ssize_t x = decode_early(a,e,&ud,&fid); if (x < 0) - return -240; + return -244; a += x; switch (fid) { case 0x8: // type id 1, type disp_t, coding varint @@ -5374,13 +5466,13 @@ ssize_t DisplayConfig::fromMemory(const void *b, ssize_t s) // need only to skip len prefixed data a += ud.vi; if (a > e) - return -241; + return -245; } } } assert((a-(const uint8_t *)b) == s); if (a > e) - return -242; + return -246; return a-(const uint8_t *)b; } @@ -5393,44 +5485,44 @@ ssize_t DisplayConfig::toMemory(uint8_t *b, ssize_t s) const if (m_type != dt_none) { // 'type': id=1, encoding=varint, tag=0x8 if (a >= e) - return -243; + return -247; *a++ = 0x8; n = write_varint(a,e-a,m_type); if (n <= 0) - return -244; + return -248; a += n; } // has options? if (0 != (p_validbits & ((uint8_t)1U << 0))) { // 'options': id=2, encoding=varint, tag=0x10 if (a >= e) - return -245; + return -249; *a++ = 0x10; n = write_varint(a,e-a,m_options); if (n <= 0) - return -246; + return -250; a += n; } // has maxx? if (0 != (p_validbits & ((uint8_t)1U << 1))) { // 'maxx': id=3, encoding=varint, tag=0x18 if (a >= e) - return -247; + return -251; *a++ = 0x18; n = write_varint(a,e-a,m_maxx); if (n <= 0) - return -248; + return -252; a += n; } // has maxy? if (0 != (p_validbits & ((uint8_t)1U << 2))) { // 'maxy': id=4, encoding=varint, tag=0x20 if (a >= e) - return -249; + return -253; *a++ = 0x20; n = write_varint(a,e-a,m_maxy); if (n <= 0) - return -250; + return -254; a += n; } assert(a <= e); @@ -5528,7 +5620,7 @@ int DisplayConfig::setByName(const char *name, const char *value) disp_t v; size_t r = parse_ascii_disp_t(&v,value); if (r == 0) - return -251; + return -255; set_type(v); return r; } @@ -5562,7 +5654,7 @@ int DisplayConfig::setByName(const char *name, const char *value) p_validbits |= ((uint8_t)1U << 2); return r; } - return -252; + return -256; } SpiDeviceConfig::SpiDeviceConfig() @@ -5576,6 +5668,7 @@ void SpiDeviceConfig::clear() m_intr = -1; m_reset = -1; m_cd = -1; + m_freq = 0; } void SpiDeviceConfig::toASCII(stream &o, size_t indent) const @@ -5592,6 +5685,7 @@ void SpiDeviceConfig::toASCII(stream &o, size_t indent) const ascii_numeric(o, indent, "intr", (signed) m_intr); ascii_numeric(o, indent, "reset", (signed) m_reset); ascii_numeric(o, indent, "cd", (signed) m_cd); + ascii_numeric(o, indent, "freq", m_freq); --indent; ascii_indent(o,indent); o << '}'; @@ -5606,7 +5700,7 @@ ssize_t SpiDeviceConfig::fromMemory(const void *b, ssize_t s) union decode_union ud; ssize_t x = decode_early(a,e,&ud,&fid); if (x < 0) - return -253; + return -257; a += x; switch (fid) { case 0x8: // drv id 1, type spidrv_t, coding varint @@ -5624,18 +5718,21 @@ ssize_t SpiDeviceConfig::fromMemory(const void *b, ssize_t s) case 0x28: // cd id 5, type int8_t, coding signed varint set_cd(varint_sint(ud.u8)); break; + case 0x30: // freq id 6, type uint32_t, coding varint + set_freq((uint32_t)ud.u32); + break; default: if ((fid & 7) == 2) { // need only to skip len prefixed data a += ud.vi; if (a > e) - return -254; + return -258; } } } assert((a-(const uint8_t *)b) == s); if (a > e) - return -255; + return -259; return a-(const uint8_t *)b; } @@ -5648,55 +5745,66 @@ ssize_t SpiDeviceConfig::toMemory(uint8_t *b, ssize_t s) const if (m_drv != spidrv_invalid) { // 'drv': id=1, encoding=varint, tag=0x8 if (a >= e) - return -256; + return -260; *a++ = 0x8; n = write_varint(a,e-a,m_drv); if (n <= 0) - return -257; + return -261; a += n; } // has cs? if (m_cs != -1) { // 'cs': id=2, encoding=varint, tag=0x10 if (a >= e) - return -258; + return -262; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_cs)); if (n <= 0) - return -259; + return -263; a += n; } // has intr? if (m_intr != -1) { // 'intr': id=3, encoding=varint, tag=0x18 if (a >= e) - return -260; + return -264; *a++ = 0x18; n = write_varint(a,e-a,sint_varint(m_intr)); if (n <= 0) - return -261; + return -265; a += n; } // has reset? if (m_reset != -1) { // 'reset': id=4, encoding=varint, tag=0x20 if (a >= e) - return -262; + return -266; *a++ = 0x20; n = write_varint(a,e-a,sint_varint(m_reset)); if (n <= 0) - return -263; + return -267; a += n; } // has cd? if (m_cd != -1) { // 'cd': id=5, encoding=varint, tag=0x28 if (a >= e) - return -264; + return -268; *a++ = 0x28; n = write_varint(a,e-a,sint_varint(m_cd)); if (n <= 0) - return -265; + return -269; + a += n; + } + // has freq? + if (m_freq != 0) { + // 'freq': id=6, encoding=varint, tag=0x30 + if (a >= e) + return -270; + *a++ = 0x30; + n = write_varint(a,e-a,m_freq); + if (n <= 0) + return -271; a += n; } assert(a <= e); @@ -5733,6 +5841,10 @@ void SpiDeviceConfig::toJSON(stream &json, unsigned indLvl) const fsep = json_indent(json,indLvl,fsep,"cd"); to_decstr(json,(int) m_cd); } + if (has_freq()) { + fsep = json_indent(json,indLvl,fsep,"freq"); + to_decstr(json,m_freq); + } if (fsep == '{') json.put('{'); json.put('\n'); @@ -5766,6 +5878,10 @@ size_t SpiDeviceConfig::calcSize() const if (has_cd()) { r += wiresize_s((varint_t)m_cd) + 1 /* tag(cd) 0x28 */; } + // optional unsigned freq, id 6 + if (has_freq()) { + r += wiresize((varint_t)m_freq) + 1 /* tag(freq) 0x30 */; + } return r; } @@ -5781,6 +5897,8 @@ bool SpiDeviceConfig::operator == (const SpiDeviceConfig &r) const return false; if (has_cd() && (!(m_cd == r.m_cd))) return false; + if (has_freq() && (!(m_freq == r.m_freq))) + return false; return true; } @@ -5802,7 +5920,7 @@ int SpiDeviceConfig::setByName(const char *name, const char *value) spidrv_t v; size_t r = parse_ascii_spidrv_t(&v,value); if (r == 0) - return -266; + return -272; set_drv(v); return r; } @@ -5838,7 +5956,15 @@ int SpiDeviceConfig::setByName(const char *name, const char *value) int r = parse_ascii_s8(&m_cd,value); return r; } - return -267; + if (0 == strcmp(name,"freq")) { + if (value == 0) { + clear_freq(); + return 0; + } + int r = parse_ascii_u32(&m_freq,value); + return r; + } + return -273; } SpiBusConfig::SpiBusConfig() @@ -5920,7 +6046,7 @@ ssize_t SpiBusConfig::fromMemory(const void *b, ssize_t s) union decode_union ud; ssize_t x = decode_early(a,e,&ud,&fid); if (x < 0) - return -268; + return -274; a += x; switch (fid) { case 0x8: // host id 1, type int8_t, coding signed varint @@ -5953,7 +6079,7 @@ ssize_t SpiBusConfig::fromMemory(const void *b, ssize_t s) int n; n = m_devices.back().fromMemory((const uint8_t*)a,ud.vi); if (n != (ssize_t)ud.vi) - return -269; + return -275; a += ud.vi; } break; @@ -5962,13 +6088,13 @@ ssize_t SpiBusConfig::fromMemory(const void *b, ssize_t s) // need only to skip len prefixed data a += ud.vi; if (a > e) - return -270; + return -276; } } } assert((a-(const uint8_t *)b) == s); if (a > e) - return -271; + return -277; return a-(const uint8_t *)b; } @@ -5981,100 +6107,100 @@ ssize_t SpiBusConfig::toMemory(uint8_t *b, ssize_t s) const if (m_host != -1) { // 'host': id=1, encoding=varint, tag=0x8 if (a >= e) - return -272; + return -278; *a++ = 0x8; n = write_varint(a,e-a,sint_varint(m_host)); if (n <= 0) - return -273; + return -279; a += n; } // has mosi? if (m_mosi != -1) { // 'mosi': id=2, encoding=varint, tag=0x10 if (a >= e) - return -274; + return -280; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_mosi)); if (n <= 0) - return -275; + return -281; a += n; } // has miso? if (m_miso != -1) { // 'miso': id=3, encoding=varint, tag=0x18 if (a >= e) - return -276; + return -282; *a++ = 0x18; n = write_varint(a,e-a,sint_varint(m_miso)); if (n <= 0) - return -277; + return -283; a += n; } // has sclk? if (m_sclk != -1) { // 'sclk': id=4, encoding=varint, tag=0x20 if (a >= e) - return -278; + return -284; *a++ = 0x20; n = write_varint(a,e-a,sint_varint(m_sclk)); if (n <= 0) - return -279; + return -285; a += n; } // has wp? if (m_wp != -1) { // 'wp': id=5, encoding=varint, tag=0x28 if (a >= e) - return -280; + return -286; *a++ = 0x28; n = write_varint(a,e-a,sint_varint(m_wp)); if (n <= 0) - return -281; + return -287; a += n; } // has hold? if (m_hold != -1) { // 'hold': id=6, encoding=varint, tag=0x30 if (a >= e) - return -282; + return -288; *a++ = 0x30; n = write_varint(a,e-a,sint_varint(m_hold)); if (n <= 0) - return -283; + return -289; a += n; } // has options? if (0 != (p_validbits & ((uint8_t)1U << 0))) { // 'options': id=7, encoding=varint, tag=0x38 if (a >= e) - return -284; + return -290; *a++ = 0x38; n = write_varint(a,e-a,m_options); if (n <= 0) - return -285; + return -291; a += n; } // has dma? if (m_dma != -1) { // 'dma': id=8, encoding=varint, tag=0x40 if (a >= e) - return -286; + return -292; *a++ = 0x40; n = write_varint(a,e-a,sint_varint(m_dma)); if (n <= 0) - return -287; + return -293; a += n; } for (const auto &x : m_devices) { // 'devices': id=9, encoding=lenpfx, tag=0x4a if (a >= e) - return -288; + return -294; *a++ = 0x4a; ssize_t devices_ws = x.calcSize(); n = write_varint(a,e-a,devices_ws); a += n; if ((n <= 0) || (devices_ws > (e-a))) - return -289; + return -295; n = x.toMemory(a,e-a); a += n; assert(n == devices_ws); @@ -6298,53 +6424,51 @@ int SpiBusConfig::setByName(const char *name, const char *value) set_options_pha_hi((bool)ull); return eptr - value; } - #ifndef CONFIG_ESPTOOLPY_FLASHSIZE_1MB if (*name++ != '.') { - return -290; + return -296; } else if (!strcmp(name,"txlsbfirst")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_options(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_options_txlsbfirst(tmp); return r; } else if (!strcmp(name,"rxlsbfirst")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_options(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_options_rxlsbfirst(tmp); return r; } else if (!strcmp(name,"mosi_as_miso")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_options(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_options_mosi_as_miso(tmp); return r; } else if (!strcmp(name,"positive_cs")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_options(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_options_positive_cs(tmp); return r; } else if (!strcmp(name,"full_duplex")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_options(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_options_full_duplex(tmp); return r; } else if (!strcmp(name,"pol_hi")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_options(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_options_pol_hi(tmp); return r; } else if (!strcmp(name,"pha_hi")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_options(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_options_pha_hi(tmp); return r; } - #endif // !CONFIG_ESPTOOLPY_FLASHSIZE_1MB } if (0 == strcmp(name,"dma")) { if (value == 0) { @@ -6370,20 +6494,20 @@ int SpiBusConfig::setByName(const char *name, const char *value) } else { x = strtoul(name+8,&idxe,0); if ((idxe[0] != ']') || (idxe == (name+8))) - return -291; + return -297; if (m_devices.size() <= x) - return -292; + return -298; if ((idxe[1] == 0) && (value == 0)) { m_devices.erase(m_devices.begin()+x); return 0; } } if (idxe[1] != '.') - return -293; + return -299; return m_devices[x].setByName(idxe+2,value); } } - return -294; + return -300; } Message *SpiBusConfig::p_getMember(const char *s, unsigned n, unsigned x) @@ -6432,12 +6556,12 @@ ssize_t GpioCluster::fromMemory(const void *b, ssize_t s) union decode_union ud; ssize_t x = decode_early(a,e,&ud,&fid); if (x < 0) - return -295; + return -301; a += x; switch (fid) { case 0xa: // name id 1, type estring, coding byte[] if ((ssize_t)ud.vi > e-a) { - return -296; + return -302; } m_name.assign((const char*)a,ud.vi); a += ud.vi; @@ -6459,13 +6583,13 @@ ssize_t GpioCluster::fromMemory(const void *b, ssize_t s) // need only to skip len prefixed data a += ud.vi; if (a > e) - return -297; + return -303; } } } assert((a-(const uint8_t *)b) == s); if (a > e) - return -298; + return -304; return a-(const uint8_t *)b; } @@ -6478,55 +6602,55 @@ ssize_t GpioCluster::toMemory(uint8_t *b, ssize_t s) const if (!m_name.empty()) { // 'name': id=1, encoding=lenpfx, tag=0xa if (a >= e) - return -299; + return -305; *a++ = 0xa; n = encode_bytes(m_name,a,e); if (n < 0) - return -300; + return -306; a += n; } // has base? if (m_base != 0) { // 'base': id=2, encoding=varint, tag=0x10 if (a >= e) - return -301; + return -307; *a++ = 0x10; n = write_varint(a,e-a,m_base); if (n <= 0) - return -302; + return -308; a += n; } // has numio? if (m_numio != 0) { // 'numio': id=3, encoding=varint, tag=0x18 if (a >= e) - return -303; + return -309; *a++ = 0x18; n = write_varint(a,e-a,m_numio); if (n <= 0) - return -304; + return -310; a += n; } // has int_a? if (m_int_a != -1) { // 'int_a': id=4, encoding=varint, tag=0x20 if (a >= e) - return -305; + return -311; *a++ = 0x20; n = write_varint(a,e-a,sint_varint(m_int_a)); if (n <= 0) - return -306; + return -312; a += n; } // has int_b? if (m_int_b != -1) { // 'int_b': id=5, encoding=varint, tag=0x28 if (a >= e) - return -307; + return -313; *a++ = 0x28; n = write_varint(a,e-a,sint_varint(m_int_b)); if (n <= 0) - return -308; + return -314; a += n; } assert(a <= e); @@ -6660,7 +6784,7 @@ int GpioCluster::setByName(const char *name, const char *value) int r = parse_ascii_s8(&m_int_b,value); return r; } - return -309; + return -315; } Hlw8012Config::Hlw8012Config() @@ -6695,7 +6819,7 @@ ssize_t Hlw8012Config::fromMemory(const void *b, ssize_t s) union decode_union ud; ssize_t x = decode_early(a,e,&ud,&fid); if (x < 0) - return -310; + return -316; a += x; switch (fid) { case 0x10: // sel id 2, type int8_t, coding signed varint @@ -6712,13 +6836,13 @@ ssize_t Hlw8012Config::fromMemory(const void *b, ssize_t s) // need only to skip len prefixed data a += ud.vi; if (a > e) - return -311; + return -317; } } } assert((a-(const uint8_t *)b) == s); if (a > e) - return -312; + return -318; return a-(const uint8_t *)b; } @@ -6731,33 +6855,33 @@ ssize_t Hlw8012Config::toMemory(uint8_t *b, ssize_t s) const if (m_sel != -1) { // 'sel': id=2, encoding=varint, tag=0x10 if (a >= e) - return -313; + return -319; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_sel)); if (n <= 0) - return -314; + return -320; a += n; } // has cf? if (m_cf != -1) { // 'cf': id=3, encoding=varint, tag=0x18 if (a >= e) - return -315; + return -321; *a++ = 0x18; n = write_varint(a,e-a,sint_varint(m_cf)); if (n <= 0) - return -316; + return -322; a += n; } // has cf1? if (m_cf1 != -1) { // 'cf1': id=4, encoding=varint, tag=0x20 if (a >= e) - return -317; + return -323; *a++ = 0x20; n = write_varint(a,e-a,sint_varint(m_cf1)); if (n <= 0) - return -318; + return -324; a += n; } assert(a <= e); @@ -6853,7 +6977,7 @@ int Hlw8012Config::setByName(const char *name, const char *value) int r = parse_ascii_s8(&m_cf1,value); return r; } - return -319; + return -325; } SX1276Config::SX1276Config() @@ -6894,7 +7018,7 @@ ssize_t SX1276Config::fromMemory(const void *b, ssize_t s) union decode_union ud; ssize_t x = decode_early(a,e,&ud,&fid); if (x < 0) - return -320; + return -326; a += x; switch (fid) { case 0x8: // dio0 id 1, type int8_t, coding signed varint @@ -6920,13 +7044,13 @@ ssize_t SX1276Config::fromMemory(const void *b, ssize_t s) // need only to skip len prefixed data a += ud.vi; if (a > e) - return -321; + return -327; } } } assert((a-(const uint8_t *)b) == s); if (a > e) - return -322; + return -328; return a-(const uint8_t *)b; } @@ -6939,99 +7063,726 @@ ssize_t SX1276Config::toMemory(uint8_t *b, ssize_t s) const if (m_dio0 != -1) { // 'dio0': id=1, encoding=varint, tag=0x8 if (a >= e) - return -323; + return -329; *a++ = 0x8; n = write_varint(a,e-a,sint_varint(m_dio0)); if (n <= 0) - return -324; + return -330; a += n; } // has dio1? if (m_dio1 != -1) { // 'dio1': id=2, encoding=varint, tag=0x10 if (a >= e) - return -325; + return -331; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_dio1)); if (n <= 0) - return -326; + return -332; a += n; } // has dio2? if (m_dio2 != -1) { // 'dio2': id=3, encoding=varint, tag=0x18 if (a >= e) - return -327; + return -333; *a++ = 0x18; n = write_varint(a,e-a,sint_varint(m_dio2)); if (n <= 0) - return -328; + return -334; + a += n; + } + // has dio3? + if (m_dio3 != -1) { + // 'dio3': id=4, encoding=varint, tag=0x20 + if (a >= e) + return -335; + *a++ = 0x20; + n = write_varint(a,e-a,sint_varint(m_dio3)); + if (n <= 0) + return -336; + a += n; + } + // has dio4? + if (m_dio4 != -1) { + // 'dio4': id=5, encoding=varint, tag=0x28 + if (a >= e) + return -337; + *a++ = 0x28; + n = write_varint(a,e-a,sint_varint(m_dio4)); + if (n <= 0) + return -338; + a += n; + } + // has dio5? + if (m_dio5 != -1) { + // 'dio5': id=6, encoding=varint, tag=0x30 + if (a >= e) + return -339; + *a++ = 0x30; + n = write_varint(a,e-a,sint_varint(m_dio5)); + if (n <= 0) + return -340; a += n; } - // has dio3? - if (m_dio3 != -1) { - // 'dio3': id=4, encoding=varint, tag=0x20 + assert(a <= e); + return a-b; +} + +void SX1276Config::toJSON(stream &json, unsigned indLvl) const +{ + char fsep = '{'; + ++indLvl; + if (has_dio0()) { + fsep = json_indent(json,indLvl,fsep,"dio0"); + to_decstr(json,(int) m_dio0); + } + if (has_dio1()) { + fsep = json_indent(json,indLvl,fsep,"dio1"); + to_decstr(json,(int) m_dio1); + } + if (has_dio2()) { + fsep = json_indent(json,indLvl,fsep,"dio2"); + to_decstr(json,(int) m_dio2); + } + if (has_dio3()) { + fsep = json_indent(json,indLvl,fsep,"dio3"); + to_decstr(json,(int) m_dio3); + } + if (has_dio4()) { + fsep = json_indent(json,indLvl,fsep,"dio4"); + to_decstr(json,(int) m_dio4); + } + if (has_dio5()) { + fsep = json_indent(json,indLvl,fsep,"dio5"); + to_decstr(json,(int) m_dio5); + } + if (fsep == '{') + json.put('{'); + json.put('\n'); + --indLvl; + json_indent(json,indLvl,0); + json.put('}'); + if (indLvl == 0) + json.put('\n'); +} + +size_t SX1276Config::calcSize() const +{ + size_t r = 0; // required size, default is fixed length + // optional sint8 dio0, id 1 + if (has_dio0()) { + r += wiresize_s((varint_t)m_dio0) + 1 /* tag(dio0) 0x8 */; + } + // optional sint8 dio1, id 2 + if (has_dio1()) { + r += wiresize_s((varint_t)m_dio1) + 1 /* tag(dio1) 0x10 */; + } + // optional sint8 dio2, id 3 + if (has_dio2()) { + r += wiresize_s((varint_t)m_dio2) + 1 /* tag(dio2) 0x18 */; + } + // optional sint8 dio3, id 4 + if (has_dio3()) { + r += wiresize_s((varint_t)m_dio3) + 1 /* tag(dio3) 0x20 */; + } + // optional sint8 dio4, id 5 + if (has_dio4()) { + r += wiresize_s((varint_t)m_dio4) + 1 /* tag(dio4) 0x28 */; + } + // optional sint8 dio5, id 6 + if (has_dio5()) { + r += wiresize_s((varint_t)m_dio5) + 1 /* tag(dio5) 0x30 */; + } + return r; +} + +bool SX1276Config::operator == (const SX1276Config &r) const +{ + if (has_dio0() && (!(m_dio0 == r.m_dio0))) + return false; + if (has_dio1() && (!(m_dio1 == r.m_dio1))) + return false; + if (has_dio2() && (!(m_dio2 == r.m_dio2))) + return false; + if (has_dio3() && (!(m_dio3 == r.m_dio3))) + return false; + if (has_dio4() && (!(m_dio4 == r.m_dio4))) + return false; + if (has_dio5() && (!(m_dio5 == r.m_dio5))) + return false; + return true; +} + + +/* + * Function for setting an element in dot notation with an ASCII value. + * It will call the specified parse_ascii function for parsing the value. + * + * @return number of bytes successfully parsed or negative value indicating + * an error. + */ +int SX1276Config::setByName(const char *name, const char *value) +{ + if (0 == strcmp(name,"dio0")) { + if (value == 0) { + clear_dio0(); + return 0; + } + int r = parse_ascii_s8(&m_dio0,value); + return r; + } + if (0 == strcmp(name,"dio1")) { + if (value == 0) { + clear_dio1(); + return 0; + } + int r = parse_ascii_s8(&m_dio1,value); + return r; + } + if (0 == strcmp(name,"dio2")) { + if (value == 0) { + clear_dio2(); + return 0; + } + int r = parse_ascii_s8(&m_dio2,value); + return r; + } + if (0 == strcmp(name,"dio3")) { + if (value == 0) { + clear_dio3(); + return 0; + } + int r = parse_ascii_s8(&m_dio3,value); + return r; + } + if (0 == strcmp(name,"dio4")) { + if (value == 0) { + clear_dio4(); + return 0; + } + int r = parse_ascii_s8(&m_dio4,value); + return r; + } + if (0 == strcmp(name,"dio5")) { + if (value == 0) { + clear_dio5(); + return 0; + } + int r = parse_ascii_s8(&m_dio5,value); + return r; + } + return -341; +} + +Tone::Tone() +{ +} + +void Tone::clear() +{ + m_freq = 0; + m_duration = 0; + p_validbits = 0; +} + +void Tone::toASCII(stream &o, size_t indent) const +{ + o << "Tone {"; + ++indent; + ascii_numeric(o, indent, "freq", m_freq); + ascii_numeric(o, indent, "duration", m_duration); + --indent; + ascii_indent(o,indent); + o << '}'; +} + +ssize_t Tone::fromMemory(const void *b, ssize_t s) +{ + const uint8_t *a = (const uint8_t *)b; + const uint8_t *e = a + s; + while (a < e) { + varint_t fid; + union decode_union ud; + ssize_t x = decode_early(a,e,&ud,&fid); + if (x < 0) + return -342; + a += x; + switch (fid) { + case 0x8: // freq id 1, type uint32_t, coding varint + set_freq((uint32_t)ud.u32); + break; + case 0x10: // duration id 2, type uint32_t, coding varint + set_duration((uint32_t)ud.u32); + break; + default: + if ((fid & 7) == 2) { + // need only to skip len prefixed data + a += ud.vi; + if (a > e) + return -343; + } + } + } + assert((a-(const uint8_t *)b) == s); + if (a > e) + return -344; + return a-(const uint8_t *)b; +} + +ssize_t Tone::toMemory(uint8_t *b, ssize_t s) const +{ + assert(s >= 0); + uint8_t *a = b, *e = b + s; + signed n; + // has freq? + if (0 != (p_validbits & ((uint8_t)1U << 0))) { + // 'freq': id=1, encoding=varint, tag=0x8 + if (a >= e) + return -345; + *a++ = 0x8; + n = write_varint(a,e-a,m_freq); + if (n <= 0) + return -346; + a += n; + } + // has duration? + if (0 != (p_validbits & ((uint8_t)1U << 1))) { + // 'duration': id=2, encoding=varint, tag=0x10 + if (a >= e) + return -347; + *a++ = 0x10; + n = write_varint(a,e-a,m_duration); + if (n <= 0) + return -348; + a += n; + } + assert(a <= e); + return a-b; +} + +void Tone::toJSON(stream &json, unsigned indLvl) const +{ + char fsep = '{'; + ++indLvl; + if (has_freq()) { + fsep = json_indent(json,indLvl,fsep,"freq"); + to_decstr(json,m_freq); + } + if (has_duration()) { + fsep = json_indent(json,indLvl,fsep,"duration"); + to_decstr(json,m_duration); + } + if (fsep == '{') + json.put('{'); + json.put('\n'); + --indLvl; + json_indent(json,indLvl,0); + json.put('}'); + if (indLvl == 0) + json.put('\n'); +} + +size_t Tone::calcSize() const +{ + size_t r = 0; // required size, default is fixed length + // optional unsigned freq, id 1 + if (has_freq()) { + r += wiresize((varint_t)m_freq) + 1 /* tag(freq) 0x8 */; + } + // optional unsigned duration, id 2 + if (has_duration()) { + r += wiresize((varint_t)m_duration) + 1 /* tag(duration) 0x10 */; + } + return r; +} + +bool Tone::operator == (const Tone &r) const +{ + if (p_validbits != r.p_validbits) + return false; + if (has_freq() && (!(m_freq == r.m_freq))) + return false; + if (has_duration() && (!(m_duration == r.m_duration))) + return false; + return true; +} + + +/* + * Function for setting an element in dot notation with an ASCII value. + * It will call the specified parse_ascii function for parsing the value. + * + * @return number of bytes successfully parsed or negative value indicating + * an error. + */ +int Tone::setByName(const char *name, const char *value) +{ + if (0 == strcmp(name,"freq")) { + if (value == 0) { + clear_freq(); + return 0; + } + int r = parse_ascii_u32(&m_freq,value); + if (r > 0) + p_validbits |= ((uint8_t)1U << 0); + return r; + } + if (0 == strcmp(name,"duration")) { + if (value == 0) { + clear_duration(); + return 0; + } + int r = parse_ascii_u32(&m_duration,value); + if (r > 0) + p_validbits |= ((uint8_t)1U << 1); + return r; + } + return -349; +} + +Melody::Melody() +{ +} + +void Melody::clear() +{ + m_name.clear(); + m_tones.clear(); +} + +void Melody::toASCII(stream &o, size_t indent) const +{ + o << "Melody {"; + ++indent; + ascii_string(o,indent,m_name.data(),m_name.size(),"name"); + ascii_indent(o,indent); + size_t s_tones = m_tones.size(); + o << "tones[" << s_tones << "] = {"; + ++indent; + for (size_t i = 0, e = s_tones; i != e; ++i) { + ascii_indent(o,indent); + o << i << ": "; + ascii_numeric(o, indent, 0, m_tones[i]); + } + --indent; + ascii_indent(o,indent); + o << '}'; + --indent; + ascii_indent(o,indent); + o << '}'; +} + +ssize_t Melody::fromMemory(const void *b, ssize_t s) +{ + const uint8_t *a = (const uint8_t *)b; + const uint8_t *e = a + s; + while (a < e) { + varint_t fid; + union decode_union ud; + ssize_t x = decode_early(a,e,&ud,&fid); + if (x < 0) + return -350; + a += x; + switch (fid) { + case 0xa: // name id 1, type estring, coding byte[] + if ((ssize_t)ud.vi > e-a) { + return -351; + } + m_name.assign((const char*)a,ud.vi); + a += ud.vi; + break; + case 0x14: // tones id 2, type uint16_t, coding 16bit + m_tones.push_back(ud.u16); + break; + default: + if ((fid & 7) == 2) { + // need only to skip len prefixed data + a += ud.vi; + if (a > e) + return -352; + } + } + } + assert((a-(const uint8_t *)b) == s); + if (a > e) + return -353; + return a-(const uint8_t *)b; +} + +ssize_t Melody::toMemory(uint8_t *b, ssize_t s) const +{ + assert(s >= 0); + uint8_t *a = b, *e = b + s; + signed n; + // has name? + if (!m_name.empty()) { + // 'name': id=1, encoding=lenpfx, tag=0xa + if (a >= e) + return -354; + *a++ = 0xa; + n = encode_bytes(m_name,a,e); + if (n < 0) + return -355; + a += n; + } + for (auto x : m_tones) { + // 'tones': id=2, encoding=16bit, tag=0x14 + if (3 > (e-a)) + return -356; + *a++ = 0x14; + if ((e-a) < 2) + return -357; + write_u16(a,x); + a += 2; + } + assert(a <= e); + return a-b; +} + +void Melody::toJSON(stream &json, unsigned indLvl) const +{ + char fsep = '{'; + ++indLvl; + if (has_name()) { + fsep = json_indent(json,indLvl,fsep,"name"); + json_cstr(json,m_name.c_str()); + } + if (size_t s = m_tones.size()) { + fsep = json_indent(json,indLvl,fsep); + indLvl += 2; + json << "\"tones\":[\n"; + size_t i = 0; + for (;;) { + json_indent(json,indLvl,0); + to_decstr(json,m_tones[i]); + ++i; + if (i == s) + break; + json << ",\n"; + } + indLvl -= 2; + json.put('\n'); + json_indent(json,indLvl,0); + json.put(']'); + } + if (fsep == '{') + json.put('{'); + json.put('\n'); + --indLvl; + json_indent(json,indLvl,0); + json.put('}'); + if (indLvl == 0) + json.put('\n'); +} + +size_t Melody::calcSize() const +{ + size_t r = 0; // required size, default is fixed length + // optional string name, id 1 + if (has_name()) { + size_t name_s = m_name.size(); + r += name_s + wiresize(name_s) + 1 /* tag(name) 0x8 */; + } + // repeated fixed16 tones, id 2 + if (!m_tones.empty()) { + // tones: non-packed, fixed size elements + r += m_tones.size() * 3; // including tag + } + return r; +} + +bool Melody::operator == (const Melody &r) const +{ + if (has_name() && (!(m_name == r.m_name))) + return false; + if (!(m_tones == r.m_tones)) + return false; + return true; +} + + +/* + * Function for setting an element in dot notation with an ASCII value. + * It will call the specified parse_ascii function for parsing the value. + * + * @return number of bytes successfully parsed or negative value indicating + * an error. + */ +int Melody::setByName(const char *name, const char *value) +{ + if (0 == strcmp(name,"name")) { + if (value == 0) { + clear_name(); + return 0; + } + m_name = value; + int r = m_name.size(); + return r; + } + if (0 == memcmp(name,"tones",5)) { + if ((name[5] == 0) && (value == 0)) { + clear_tones(); + return 0; + } else if (name[5] == '[') { + char *idxe; + unsigned long x; + if ((name[6] == '+') && (name[7] == ']')) { + x = m_tones.size(); + m_tones.resize(x+1); + idxe = (char*)(name + 7); + if (value == 0) + return 0; + } else { + x = strtoul(name+6,&idxe,0); + if ((idxe[0] != ']') || (idxe == (name+6))) + return -358; + if (m_tones.size() <= x) + return -359; + if ((idxe[1] == 0) && (value == 0)) { + m_tones.erase(m_tones.begin()+x); + return 0; + } + } + if (idxe[1] != 0) + return -360; + return parse_ascii_u16(&m_tones[x],value); + } + } + return -361; +} + +BuzzerConfig::BuzzerConfig() +{ +} + +void BuzzerConfig::clear() +{ + m_gpio = -1; + m_melodies.clear(); +} + +void BuzzerConfig::toASCII(stream &o, size_t indent) const +{ + o << "BuzzerConfig {"; + ++indent; + ascii_numeric(o, indent, "gpio", (signed) m_gpio); + ascii_indent(o,indent); + size_t s_melodies = m_melodies.size(); + o << "melodies[" << s_melodies << "] = {"; + ++indent; + for (size_t i = 0, e = s_melodies; i != e; ++i) { + ascii_indent(o,indent); + o << i << ": "; + m_melodies[i].toASCII(o,indent); + } + --indent; + ascii_indent(o,indent); + o << '}'; + --indent; + ascii_indent(o,indent); + o << '}'; +} + +ssize_t BuzzerConfig::fromMemory(const void *b, ssize_t s) +{ + const uint8_t *a = (const uint8_t *)b; + const uint8_t *e = a + s; + while (a < e) { + varint_t fid; + union decode_union ud; + ssize_t x = decode_early(a,e,&ud,&fid); + if (x < 0) + return -362; + a += x; + switch (fid) { + case 0x8: // gpio id 1, type int8_t, coding signed varint + set_gpio(varint_sint(ud.u8)); + break; + case 0x12: // melodies id 2, type Melody, coding byte[] + m_melodies.emplace_back(); + if (((ssize_t)ud.vi > 0) && ((ssize_t)ud.vi <= (e-a))) { + int n; + n = m_melodies.back().fromMemory((const uint8_t*)a,ud.vi); + if (n != (ssize_t)ud.vi) + return -363; + a += ud.vi; + } + break; + default: + if ((fid & 7) == 2) { + // need only to skip len prefixed data + a += ud.vi; + if (a > e) + return -364; + } + } + } + assert((a-(const uint8_t *)b) == s); + if (a > e) + return -365; + return a-(const uint8_t *)b; +} + +ssize_t BuzzerConfig::toMemory(uint8_t *b, ssize_t s) const +{ + assert(s >= 0); + uint8_t *a = b, *e = b + s; + signed n; + // has gpio? + if (m_gpio != -1) { + // 'gpio': id=1, encoding=varint, tag=0x8 if (a >= e) - return -329; - *a++ = 0x20; - n = write_varint(a,e-a,sint_varint(m_dio3)); + return -366; + *a++ = 0x8; + n = write_varint(a,e-a,sint_varint(m_gpio)); if (n <= 0) - return -330; + return -367; a += n; } - // has dio4? - if (m_dio4 != -1) { - // 'dio4': id=5, encoding=varint, tag=0x28 + for (const auto &x : m_melodies) { + // 'melodies': id=2, encoding=lenpfx, tag=0x12 if (a >= e) - return -331; - *a++ = 0x28; - n = write_varint(a,e-a,sint_varint(m_dio4)); - if (n <= 0) - return -332; + return -368; + *a++ = 0x12; + ssize_t melodies_ws = x.calcSize(); + n = write_varint(a,e-a,melodies_ws); a += n; - } - // has dio5? - if (m_dio5 != -1) { - // 'dio5': id=6, encoding=varint, tag=0x30 - if (a >= e) - return -333; - *a++ = 0x30; - n = write_varint(a,e-a,sint_varint(m_dio5)); - if (n <= 0) - return -334; + if ((n <= 0) || (melodies_ws > (e-a))) + return -369; + n = x.toMemory(a,e-a); a += n; + assert(n == melodies_ws); } assert(a <= e); return a-b; } -void SX1276Config::toJSON(stream &json, unsigned indLvl) const +void BuzzerConfig::toJSON(stream &json, unsigned indLvl) const { char fsep = '{'; ++indLvl; - if (has_dio0()) { - fsep = json_indent(json,indLvl,fsep,"dio0"); - to_decstr(json,(int) m_dio0); - } - if (has_dio1()) { - fsep = json_indent(json,indLvl,fsep,"dio1"); - to_decstr(json,(int) m_dio1); - } - if (has_dio2()) { - fsep = json_indent(json,indLvl,fsep,"dio2"); - to_decstr(json,(int) m_dio2); - } - if (has_dio3()) { - fsep = json_indent(json,indLvl,fsep,"dio3"); - to_decstr(json,(int) m_dio3); - } - if (has_dio4()) { - fsep = json_indent(json,indLvl,fsep,"dio4"); - to_decstr(json,(int) m_dio4); + if (has_gpio()) { + fsep = json_indent(json,indLvl,fsep,"gpio"); + to_decstr(json,(int) m_gpio); } - if (has_dio5()) { - fsep = json_indent(json,indLvl,fsep,"dio5"); - to_decstr(json,(int) m_dio5); + if (size_t s = m_melodies.size()) { + fsep = json_indent(json,indLvl,fsep); + indLvl += 2; + json << "\"melodies\":[\n"; + size_t i = 0; + for (;;) { + json_indent(json,indLvl,0); + m_melodies[i].toJSON(json,indLvl); + ++i; + if (i == s) + break; + json << ",\n"; + } + indLvl -= 2; + json.put('\n'); + json_indent(json,indLvl,0); + json.put(']'); } if (fsep == '{') json.put('{'); @@ -7043,49 +7794,28 @@ void SX1276Config::toJSON(stream &json, unsigned indLvl) const json.put('\n'); } -size_t SX1276Config::calcSize() const +size_t BuzzerConfig::calcSize() const { size_t r = 0; // required size, default is fixed length - // optional sint8 dio0, id 1 - if (has_dio0()) { - r += wiresize_s((varint_t)m_dio0) + 1 /* tag(dio0) 0x8 */; - } - // optional sint8 dio1, id 2 - if (has_dio1()) { - r += wiresize_s((varint_t)m_dio1) + 1 /* tag(dio1) 0x10 */; - } - // optional sint8 dio2, id 3 - if (has_dio2()) { - r += wiresize_s((varint_t)m_dio2) + 1 /* tag(dio2) 0x18 */; - } - // optional sint8 dio3, id 4 - if (has_dio3()) { - r += wiresize_s((varint_t)m_dio3) + 1 /* tag(dio3) 0x20 */; - } - // optional sint8 dio4, id 5 - if (has_dio4()) { - r += wiresize_s((varint_t)m_dio4) + 1 /* tag(dio4) 0x28 */; + // optional sint8 gpio, id 1 + if (has_gpio()) { + r += wiresize_s((varint_t)m_gpio) + 1 /* tag(gpio) 0x8 */; } - // optional sint8 dio5, id 6 - if (has_dio5()) { - r += wiresize_s((varint_t)m_dio5) + 1 /* tag(dio5) 0x30 */; + // repeated Melody melodies, id 2 + // repeated message melodies + for (size_t x = 0, y = m_melodies.size(); x < y; ++x) { + size_t s = m_melodies[x].calcSize(); + r += wiresize(s); + r += s + 1 /* tag(melodies) 0x10 */; } return r; } -bool SX1276Config::operator == (const SX1276Config &r) const +bool BuzzerConfig::operator == (const BuzzerConfig &r) const { - if (has_dio0() && (!(m_dio0 == r.m_dio0))) - return false; - if (has_dio1() && (!(m_dio1 == r.m_dio1))) - return false; - if (has_dio2() && (!(m_dio2 == r.m_dio2))) - return false; - if (has_dio3() && (!(m_dio3 == r.m_dio3))) - return false; - if (has_dio4() && (!(m_dio4 == r.m_dio4))) + if (has_gpio() && (!(m_gpio == r.m_gpio))) return false; - if (has_dio5() && (!(m_dio5 == r.m_dio5))) + if (!(m_melodies == r.m_melodies)) return false; return true; } @@ -7098,57 +7828,56 @@ bool SX1276Config::operator == (const SX1276Config &r) const * @return number of bytes successfully parsed or negative value indicating * an error. */ -int SX1276Config::setByName(const char *name, const char *value) +int BuzzerConfig::setByName(const char *name, const char *value) { - if (0 == strcmp(name,"dio0")) { - if (value == 0) { - clear_dio0(); - return 0; - } - int r = parse_ascii_s8(&m_dio0,value); - return r; - } - if (0 == strcmp(name,"dio1")) { - if (value == 0) { - clear_dio1(); - return 0; - } - int r = parse_ascii_s8(&m_dio1,value); - return r; - } - if (0 == strcmp(name,"dio2")) { - if (value == 0) { - clear_dio2(); - return 0; - } - int r = parse_ascii_s8(&m_dio2,value); - return r; - } - if (0 == strcmp(name,"dio3")) { + if (0 == strcmp(name,"gpio")) { if (value == 0) { - clear_dio3(); + clear_gpio(); return 0; } - int r = parse_ascii_s8(&m_dio3,value); + int r = parse_ascii_s8(&m_gpio,value); return r; } - if (0 == strcmp(name,"dio4")) { - if (value == 0) { - clear_dio4(); + if (0 == memcmp(name,"melodies",8)) { + if ((name[8] == 0) && (value == 0)) { + clear_melodies(); return 0; + } else if (name[8] == '[') { + char *idxe; + unsigned long x; + if ((name[9] == '+') && (name[10] == ']')) { + x = m_melodies.size(); + m_melodies.resize(x+1); + idxe = (char*)(name + 10); + if (value == 0) + return 0; + } else { + x = strtoul(name+9,&idxe,0); + if ((idxe[0] != ']') || (idxe == (name+9))) + return -370; + if (m_melodies.size() <= x) + return -371; + if ((idxe[1] == 0) && (value == 0)) { + m_melodies.erase(m_melodies.begin()+x); + return 0; + } + } + if (idxe[1] != '.') + return -372; + return m_melodies[x].setByName(idxe+2,value); } - int r = parse_ascii_s8(&m_dio4,value); - return r; } - if (0 == strcmp(name,"dio5")) { - if (value == 0) { - clear_dio5(); - return 0; - } - int r = parse_ascii_s8(&m_dio5,value); - return r; + return -373; +} + +Message *BuzzerConfig::p_getMember(const char *s, unsigned n, unsigned x) +{ + // caller guarantee: s[n] == '[' + if ((n == 8) && (0 == memcmp("melodies",s,8))) { + if (x < m_melodies.size()) + return &m_melodies[x]; } - return -335; + return 0; } HardwareConfig::HardwareConfig() @@ -7173,6 +7902,9 @@ void HardwareConfig::clear() #ifdef CONFIG_LEDS m_led.clear(); #endif // CONFIG_LEDS + #ifdef CONFIG_BUZZER + m_buzzer.clear(); + #endif // CONFIG_BUZZER #ifdef CONFIG_HLW8012 m_hlw8012.clear(); #endif // CONFIG_HLW8012 @@ -7286,6 +8018,10 @@ void HardwareConfig::toASCII(stream &o, size_t indent) const ascii_indent(o,indent); o << '}'; #endif // CONFIG_LEDS + #ifdef CONFIG_BUZZER + ascii_indent(o,indent,"buzzer"); + m_buzzer.toASCII(o,indent); + #endif // CONFIG_BUZZER #ifdef CONFIG_HLW8012 ascii_indent(o,indent,"hlw8012"); m_hlw8012.toASCII(o,indent); @@ -7384,7 +8120,7 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) union decode_union ud; ssize_t x = decode_early(a,e,&ud,&fid); if (x < 0) - return -336; + return -374; a += x; switch (fid) { case 0x5: // magic id 0, type uint32_t, coding 32bit @@ -7395,7 +8131,7 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n; n = m_system.fromMemory((const uint8_t*)a,ud.vi); if (n != (ssize_t)ud.vi) - return -337; + return -375; a += ud.vi; } p_validbits |= ((uint16_t)1U << 1); @@ -7405,7 +8141,7 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n; n = m_adc.fromMemory((const uint8_t*)a,ud.vi); if (n != (ssize_t)ud.vi) - return -338; + return -376; a += ud.vi; } p_validbits |= ((uint16_t)1U << 2); @@ -7416,7 +8152,7 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n; n = m_gpios.back().fromMemory((const uint8_t*)a,ud.vi); if (n != (ssize_t)ud.vi) - return -339; + return -377; a += ud.vi; } break; @@ -7427,7 +8163,7 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n; n = m_spibus.back().fromMemory((const uint8_t*)a,ud.vi); if (n != (ssize_t)ud.vi) - return -340; + return -378; a += ud.vi; } break; @@ -7439,7 +8175,7 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n; n = m_button.back().fromMemory((const uint8_t*)a,ud.vi); if (n != (ssize_t)ud.vi) - return -341; + return -379; a += ud.vi; } break; @@ -7451,7 +8187,7 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n; n = m_relay.back().fromMemory((const uint8_t*)a,ud.vi); if (n != (ssize_t)ud.vi) - return -342; + return -380; a += ud.vi; } break; @@ -7463,21 +8199,33 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n; n = m_led.back().fromMemory((const uint8_t*)a,ud.vi); if (n != (ssize_t)ud.vi) - return -343; + return -381; a += ud.vi; } break; #endif // CONFIG_LEDS + #ifdef CONFIG_BUZZER + case 0x9a: // buzzer id 19, type BuzzerConfig, coding byte[] + if (((ssize_t)ud.vi > 0) && ((ssize_t)ud.vi <= (e-a))) { + int n; + n = m_buzzer.fromMemory((const uint8_t*)a,ud.vi); + if (n != (ssize_t)ud.vi) + return -382; + a += ud.vi; + } + p_validbits |= ((uint16_t)1U << 3); + break; + #endif // CONFIG_BUZZER #ifdef CONFIG_HLW8012 case 0xa2: // hlw8012 id 20, type Hlw8012Config, coding byte[] if (((ssize_t)ud.vi > 0) && ((ssize_t)ud.vi <= (e-a))) { int n; n = m_hlw8012.fromMemory((const uint8_t*)a,ud.vi); if (n != (ssize_t)ud.vi) - return -344; + return -383; a += ud.vi; } - p_validbits |= ((uint16_t)1U << 3); + p_validbits |= ((uint16_t)1U << 4); break; #endif // CONFIG_HLW8012 #ifdef CONFIG_MAX7219 @@ -7486,10 +8234,10 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n; n = m_max7219.fromMemory((const uint8_t*)a,ud.vi); if (n != (ssize_t)ud.vi) - return -345; + return -384; a += ud.vi; } - p_validbits |= ((uint16_t)1U << 4); + p_validbits |= ((uint16_t)1U << 5); break; #endif // CONFIG_MAX7219 #ifdef CONFIG_TLC5947 @@ -7498,10 +8246,10 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n; n = m_tlc5947.fromMemory((const uint8_t*)a,ud.vi); if (n != (ssize_t)ud.vi) - return -346; + return -385; a += ud.vi; } - p_validbits |= ((uint16_t)1U << 5); + p_validbits |= ((uint16_t)1U << 6); break; #endif // CONFIG_TLC5947 #ifdef CONFIG_RGBLEDS @@ -7511,7 +8259,7 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n; n = m_ws2812b.back().fromMemory((const uint8_t*)a,ud.vi); if (n != (ssize_t)ud.vi) - return -347; + return -386; a += ud.vi; } break; @@ -7522,10 +8270,10 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n; n = m_dht.fromMemory((const uint8_t*)a,ud.vi); if (n != (ssize_t)ud.vi) - return -348; + return -387; a += ud.vi; } - p_validbits |= ((uint16_t)1U << 6); + p_validbits |= ((uint16_t)1U << 7); break; #endif // CONFIG_DHT #ifdef CONFIG_I2C @@ -7535,7 +8283,7 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n; n = m_i2c.back().fromMemory((const uint8_t*)a,ud.vi); if (n != (ssize_t)ud.vi) - return -349; + return -388; a += ud.vi; } break; @@ -7547,7 +8295,7 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n; n = m_hcsr04.back().fromMemory((const uint8_t*)a,ud.vi); if (n != (ssize_t)ud.vi) - return -350; + return -389; a += ud.vi; } break; @@ -7558,10 +8306,10 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n; n = m_onewire.fromMemory((const uint8_t*)a,ud.vi); if (n != (ssize_t)ud.vi) - return -351; + return -390; a += ud.vi; } - p_validbits |= ((uint16_t)1U << 7); + p_validbits |= ((uint16_t)1U << 8); break; #endif // CONFIG_ONEWIRE #ifdef CONFIG_SX1276 @@ -7570,10 +8318,10 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n; n = m_sx1276.fromMemory((const uint8_t*)a,ud.vi); if (n != (ssize_t)ud.vi) - return -352; + return -391; a += ud.vi; } - p_validbits |= ((uint16_t)1U << 8); + p_validbits |= ((uint16_t)1U << 9); break; #endif // CONFIG_SX1276 #ifdef CONFIG_IOEXTENDERS @@ -7583,7 +8331,7 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n; n = m_iocluster.back().fromMemory((const uint8_t*)a,ud.vi); if (n != (ssize_t)ud.vi) - return -353; + return -392; a += ud.vi; } break; @@ -7594,10 +8342,10 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n; n = m_display.fromMemory((const uint8_t*)a,ud.vi); if (n != (ssize_t)ud.vi) - return -354; + return -393; a += ud.vi; } - p_validbits |= ((uint16_t)1U << 9); + p_validbits |= ((uint16_t)1U << 10); break; #endif // CONFIG_DISPLAY default: @@ -7605,13 +8353,13 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) // need only to skip len prefixed data a += ud.vi; if (a > e) - return -355; + return -394; } } } assert((a-(const uint8_t *)b) == s); if (a > e) - return -356; + return -395; return a-(const uint8_t *)b; } @@ -7624,10 +8372,10 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const if (0 != (p_validbits & ((uint16_t)1U << 0))) { // 'magic': id=0, encoding=32bit, tag=0x5 if (5 > (e-a)) - return -357; + return -396; *a++ = 0x5; if ((e-a) < 4) - return -358; + return -397; write_u32(a,(uint32_t)m_magic); a += 4; } @@ -7635,13 +8383,13 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const if (0 != (p_validbits & ((uint16_t)1U << 1))) { // 'system': id=1, encoding=lenpfx, tag=0xa if (a >= e) - return -359; + return -398; *a++ = 0xa; ssize_t system_ws = m_system.calcSize(); n = write_varint(a,e-a,system_ws); a += n; if ((n <= 0) || (system_ws > (e-a))) - return -360; + return -399; n = m_system.toMemory(a,e-a); a += n; assert(n == system_ws); @@ -7651,13 +8399,13 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const if (0 != (p_validbits & ((uint16_t)1U << 2))) { // 'adc': id=4, encoding=lenpfx, tag=0x22 if (a >= e) - return -361; + return -400; *a++ = 0x22; ssize_t adc_ws = m_adc.calcSize(); n = write_varint(a,e-a,adc_ws); a += n; if ((n <= 0) || (adc_ws > (e-a))) - return -362; + return -401; n = m_adc.toMemory(a,e-a); a += n; assert(n == adc_ws); @@ -7671,13 +8419,13 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const for (const auto &x : m_gpios) { // 'gpios': id=7, encoding=lenpfx, tag=0x3a if (a >= e) - return -363; + return -402; *a++ = 0x3a; ssize_t gpios_ws = x.calcSize(); n = write_varint(a,e-a,gpios_ws); a += n; if ((n <= 0) || (gpios_ws > (e-a))) - return -364; + return -403; n = x.toMemory(a,e-a); a += n; assert(n == gpios_ws); @@ -7686,13 +8434,13 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const for (const auto &x : m_spibus) { // 'spibus': id=8, encoding=lenpfx, tag=0x42 if (a >= e) - return -365; + return -404; *a++ = 0x42; ssize_t spibus_ws = x.calcSize(); n = write_varint(a,e-a,spibus_ws); a += n; if ((n <= 0) || (spibus_ws > (e-a))) - return -366; + return -405; n = x.toMemory(a,e-a); a += n; assert(n == spibus_ws); @@ -7702,14 +8450,14 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const for (const auto &x : m_button) { // 'button': id=16, encoding=lenpfx, tag=0x82 if (2 > (e-a)) - return -367; + return -406; *a++ = 0x82; *a++ = 0x1; ssize_t button_ws = x.calcSize(); n = write_varint(a,e-a,button_ws); a += n; if ((n <= 0) || (button_ws > (e-a))) - return -368; + return -407; n = x.toMemory(a,e-a); a += n; assert(n == button_ws); @@ -7719,14 +8467,14 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const for (const auto &x : m_relay) { // 'relay': id=17, encoding=lenpfx, tag=0x8a if (2 > (e-a)) - return -369; + return -408; *a++ = 0x8a; *a++ = 0x1; ssize_t relay_ws = x.calcSize(); n = write_varint(a,e-a,relay_ws); a += n; if ((n <= 0) || (relay_ws > (e-a))) - return -370; + return -409; n = x.toMemory(a,e-a); a += n; assert(n == relay_ws); @@ -7736,32 +8484,50 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const for (const auto &x : m_led) { // 'led': id=18, encoding=lenpfx, tag=0x92 if (2 > (e-a)) - return -371; + return -410; *a++ = 0x92; *a++ = 0x1; ssize_t led_ws = x.calcSize(); n = write_varint(a,e-a,led_ws); a += n; if ((n <= 0) || (led_ws > (e-a))) - return -372; + return -411; n = x.toMemory(a,e-a); a += n; assert(n == led_ws); } #endif // CONFIG_LEDS + #ifdef CONFIG_BUZZER + // has buzzer? + if (0 != (p_validbits & ((uint16_t)1U << 3))) { + // 'buzzer': id=19, encoding=lenpfx, tag=0x9a + if (2 > (e-a)) + return -412; + *a++ = 0x9a; + *a++ = 0x1; + ssize_t buzzer_ws = m_buzzer.calcSize(); + n = write_varint(a,e-a,buzzer_ws); + a += n; + if ((n <= 0) || (buzzer_ws > (e-a))) + return -413; + n = m_buzzer.toMemory(a,e-a); + a += n; + assert(n == buzzer_ws); + } + #endif // CONFIG_BUZZER #ifdef CONFIG_HLW8012 // has hlw8012? - if (0 != (p_validbits & ((uint16_t)1U << 3))) { + if (0 != (p_validbits & ((uint16_t)1U << 4))) { // 'hlw8012': id=20, encoding=lenpfx, tag=0xa2 if (2 > (e-a)) - return -373; + return -414; *a++ = 0xa2; *a++ = 0x1; ssize_t hlw8012_ws = m_hlw8012.calcSize(); n = write_varint(a,e-a,hlw8012_ws); a += n; if ((n <= 0) || (hlw8012_ws > (e-a))) - return -374; + return -415; n = m_hlw8012.toMemory(a,e-a); a += n; assert(n == hlw8012_ws); @@ -7769,17 +8535,17 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const #endif // CONFIG_HLW8012 #ifdef CONFIG_MAX7219 // has max7219? - if (0 != (p_validbits & ((uint16_t)1U << 4))) { + if (0 != (p_validbits & ((uint16_t)1U << 5))) { // 'max7219': id=32, encoding=lenpfx, tag=0x102 if (2 > (e-a)) - return -375; + return -416; *a++ = 0x82; *a++ = 0x2; ssize_t max7219_ws = m_max7219.calcSize(); n = write_varint(a,e-a,max7219_ws); a += n; if ((n <= 0) || (max7219_ws > (e-a))) - return -376; + return -417; n = m_max7219.toMemory(a,e-a); a += n; assert(n == max7219_ws); @@ -7787,17 +8553,17 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const #endif // CONFIG_MAX7219 #ifdef CONFIG_TLC5947 // has tlc5947? - if (0 != (p_validbits & ((uint16_t)1U << 5))) { + if (0 != (p_validbits & ((uint16_t)1U << 6))) { // 'tlc5947': id=33, encoding=lenpfx, tag=0x10a if (2 > (e-a)) - return -377; + return -418; *a++ = 0x8a; *a++ = 0x2; ssize_t tlc5947_ws = m_tlc5947.calcSize(); n = write_varint(a,e-a,tlc5947_ws); a += n; if ((n <= 0) || (tlc5947_ws > (e-a))) - return -378; + return -419; n = m_tlc5947.toMemory(a,e-a); a += n; assert(n == tlc5947_ws); @@ -7807,14 +8573,14 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const for (const auto &x : m_ws2812b) { // 'ws2812b': id=34, encoding=lenpfx, tag=0x112 if (2 > (e-a)) - return -379; + return -420; *a++ = 0x92; *a++ = 0x2; ssize_t ws2812b_ws = x.calcSize(); n = write_varint(a,e-a,ws2812b_ws); a += n; if ((n <= 0) || (ws2812b_ws > (e-a))) - return -380; + return -421; n = x.toMemory(a,e-a); a += n; assert(n == ws2812b_ws); @@ -7822,17 +8588,17 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const #endif // CONFIG_RGBLEDS #ifdef CONFIG_DHT // has dht? - if (0 != (p_validbits & ((uint16_t)1U << 6))) { + if (0 != (p_validbits & ((uint16_t)1U << 7))) { // 'dht': id=35, encoding=lenpfx, tag=0x11a if (2 > (e-a)) - return -381; + return -422; *a++ = 0x9a; *a++ = 0x2; ssize_t dht_ws = m_dht.calcSize(); n = write_varint(a,e-a,dht_ws); a += n; if ((n <= 0) || (dht_ws > (e-a))) - return -382; + return -423; n = m_dht.toMemory(a,e-a); a += n; assert(n == dht_ws); @@ -7842,14 +8608,14 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const for (const auto &x : m_i2c) { // 'i2c': id=36, encoding=lenpfx, tag=0x122 if (2 > (e-a)) - return -383; + return -424; *a++ = 0xa2; *a++ = 0x2; ssize_t i2c_ws = x.calcSize(); n = write_varint(a,e-a,i2c_ws); a += n; if ((n <= 0) || (i2c_ws > (e-a))) - return -384; + return -425; n = x.toMemory(a,e-a); a += n; assert(n == i2c_ws); @@ -7859,14 +8625,14 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const for (const auto &x : m_hcsr04) { // 'hcsr04': id=37, encoding=lenpfx, tag=0x12a if (2 > (e-a)) - return -385; + return -426; *a++ = 0xaa; *a++ = 0x2; ssize_t hcsr04_ws = x.calcSize(); n = write_varint(a,e-a,hcsr04_ws); a += n; if ((n <= 0) || (hcsr04_ws > (e-a))) - return -386; + return -427; n = x.toMemory(a,e-a); a += n; assert(n == hcsr04_ws); @@ -7874,17 +8640,17 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const #endif // CONFIG_HCSR04 #ifdef CONFIG_ONEWIRE // has onewire? - if (0 != (p_validbits & ((uint16_t)1U << 7))) { + if (0 != (p_validbits & ((uint16_t)1U << 8))) { // 'onewire': id=38, encoding=lenpfx, tag=0x132 if (2 > (e-a)) - return -387; + return -428; *a++ = 0xb2; *a++ = 0x2; ssize_t onewire_ws = m_onewire.calcSize(); n = write_varint(a,e-a,onewire_ws); a += n; if ((n <= 0) || (onewire_ws > (e-a))) - return -388; + return -429; n = m_onewire.toMemory(a,e-a); a += n; assert(n == onewire_ws); @@ -7892,17 +8658,17 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const #endif // CONFIG_ONEWIRE #ifdef CONFIG_SX1276 // has sx1276? - if (0 != (p_validbits & ((uint16_t)1U << 8))) { + if (0 != (p_validbits & ((uint16_t)1U << 9))) { // 'sx1276': id=39, encoding=lenpfx, tag=0x13a if (2 > (e-a)) - return -389; + return -430; *a++ = 0xba; *a++ = 0x2; ssize_t sx1276_ws = m_sx1276.calcSize(); n = write_varint(a,e-a,sx1276_ws); a += n; if ((n <= 0) || (sx1276_ws > (e-a))) - return -390; + return -431; n = m_sx1276.toMemory(a,e-a); a += n; assert(n == sx1276_ws); @@ -7912,14 +8678,14 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const for (const auto &x : m_iocluster) { // 'iocluster': id=40, encoding=lenpfx, tag=0x142 if (2 > (e-a)) - return -391; + return -432; *a++ = 0xc2; *a++ = 0x2; ssize_t iocluster_ws = x.calcSize(); n = write_varint(a,e-a,iocluster_ws); a += n; if ((n <= 0) || (iocluster_ws > (e-a))) - return -392; + return -433; n = x.toMemory(a,e-a); a += n; assert(n == iocluster_ws); @@ -7927,17 +8693,17 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const #endif // CONFIG_IOEXTENDERS #ifdef CONFIG_DISPLAY // has display? - if (0 != (p_validbits & ((uint16_t)1U << 9))) { + if (0 != (p_validbits & ((uint16_t)1U << 10))) { // 'display': id=50, encoding=lenpfx, tag=0x192 if (2 > (e-a)) - return -393; + return -434; *a++ = 0x92; *a++ = 0x3; ssize_t display_ws = m_display.calcSize(); n = write_varint(a,e-a,display_ws); a += n; if ((n <= 0) || (display_ws > (e-a))) - return -394; + return -435; n = m_display.toMemory(a,e-a); a += n; assert(n == display_ws); @@ -8061,6 +8827,12 @@ void HardwareConfig::toJSON(stream &json, unsigned indLvl) const json.put(']'); } #endif // CONFIG_LEDS + #ifdef CONFIG_BUZZER + if (has_buzzer()) { + fsep = json_indent(json,indLvl,fsep,"buzzer"); + m_buzzer.toJSON(json,indLvl); + } + #endif // CONFIG_BUZZER #ifdef CONFIG_HLW8012 if (has_hlw8012()) { fsep = json_indent(json,indLvl,fsep,"hlw8012"); @@ -8260,6 +9032,13 @@ size_t HardwareConfig::calcSize() const r += s + 2 /* tag(led) 0x90 */; } #endif // CONFIG_LEDS + #ifdef CONFIG_BUZZER + // optional BuzzerConfig buzzer, id 19 + if (has_buzzer()) { + size_t buzzer_s = m_buzzer.calcSize(); + r += buzzer_s + wiresize(buzzer_s) + 2 /* tag(buzzer) 0x98 */; + } + #endif // CONFIG_BUZZER #ifdef CONFIG_HLW8012 // optional Hlw8012Config hlw8012, id 20 if (has_hlw8012()) { @@ -8376,6 +9155,10 @@ bool HardwareConfig::operator == (const HardwareConfig &r) const if (!(m_led == r.m_led)) return false; #endif // CONFIG_LEDS + #ifdef CONFIG_BUZZER + if (has_buzzer() && (!(m_buzzer == r.m_buzzer))) + return false; + #endif // CONFIG_BUZZER #ifdef CONFIG_HLW8012 if (has_hlw8012() && (!(m_hlw8012 == r.m_hlw8012))) return false; @@ -8477,16 +9260,16 @@ int HardwareConfig::setByName(const char *name, const char *value) } else { x = strtoul(name+6,&idxe,0); if ((idxe[0] != ']') || (idxe == (name+6))) - return -395; + return -436; if (m_gpios.size() <= x) - return -396; + return -437; if ((idxe[1] == 0) && (value == 0)) { m_gpios.erase(m_gpios.begin()+x); return 0; } } if (idxe[1] != '.') - return -397; + return -438; return m_gpios[x].setByName(idxe+2,value); } } @@ -8507,16 +9290,16 @@ int HardwareConfig::setByName(const char *name, const char *value) } else { x = strtoul(name+7,&idxe,0); if ((idxe[0] != ']') || (idxe == (name+7))) - return -398; + return -439; if (m_spibus.size() <= x) - return -399; + return -440; if ((idxe[1] == 0) && (value == 0)) { m_spibus.erase(m_spibus.begin()+x); return 0; } } if (idxe[1] != '.') - return -400; + return -441; return m_spibus[x].setByName(idxe+2,value); } } @@ -8538,16 +9321,16 @@ int HardwareConfig::setByName(const char *name, const char *value) } else { x = strtoul(name+7,&idxe,0); if ((idxe[0] != ']') || (idxe == (name+7))) - return -401; + return -442; if (m_button.size() <= x) - return -402; + return -443; if ((idxe[1] == 0) && (value == 0)) { m_button.erase(m_button.begin()+x); return 0; } } if (idxe[1] != '.') - return -403; + return -444; return m_button[x].setByName(idxe+2,value); } } @@ -8569,16 +9352,16 @@ int HardwareConfig::setByName(const char *name, const char *value) } else { x = strtoul(name+6,&idxe,0); if ((idxe[0] != ']') || (idxe == (name+6))) - return -404; + return -445; if (m_relay.size() <= x) - return -405; + return -446; if ((idxe[1] == 0) && (value == 0)) { m_relay.erase(m_relay.begin()+x); return 0; } } if (idxe[1] != '.') - return -406; + return -447; return m_relay[x].setByName(idxe+2,value); } } @@ -8600,27 +9383,38 @@ int HardwareConfig::setByName(const char *name, const char *value) } else { x = strtoul(name+4,&idxe,0); if ((idxe[0] != ']') || (idxe == (name+4))) - return -407; + return -448; if (m_led.size() <= x) - return -408; + return -449; if ((idxe[1] == 0) && (value == 0)) { m_led.erase(m_led.begin()+x); return 0; } } if (idxe[1] != '.') - return -409; + return -450; return m_led[x].setByName(idxe+2,value); } } #endif // CONFIG_LEDS + #ifdef CONFIG_BUZZER + if (0 == memcmp(name,"buzzer",6)) { + if ((name[6] == 0) && (value == 0)) { + clear_buzzer(); + return 0; + } else if (name[6] == '.') { + p_validbits |= ((uint16_t)1U << 3); + return m_buzzer.setByName(name+7,value); + } + } + #endif // CONFIG_BUZZER #ifdef CONFIG_HLW8012 if (0 == memcmp(name,"hlw8012",7)) { if ((name[7] == 0) && (value == 0)) { clear_hlw8012(); return 0; } else if (name[7] == '.') { - p_validbits |= ((uint16_t)1U << 3); + p_validbits |= ((uint16_t)1U << 4); return m_hlw8012.setByName(name+8,value); } } @@ -8631,7 +9425,7 @@ int HardwareConfig::setByName(const char *name, const char *value) clear_max7219(); return 0; } else if (name[7] == '.') { - p_validbits |= ((uint16_t)1U << 4); + p_validbits |= ((uint16_t)1U << 5); return m_max7219.setByName(name+8,value); } } @@ -8642,7 +9436,7 @@ int HardwareConfig::setByName(const char *name, const char *value) clear_tlc5947(); return 0; } else if (name[7] == '.') { - p_validbits |= ((uint16_t)1U << 5); + p_validbits |= ((uint16_t)1U << 6); return m_tlc5947.setByName(name+8,value); } } @@ -8664,16 +9458,16 @@ int HardwareConfig::setByName(const char *name, const char *value) } else { x = strtoul(name+8,&idxe,0); if ((idxe[0] != ']') || (idxe == (name+8))) - return -410; + return -451; if (m_ws2812b.size() <= x) - return -411; + return -452; if ((idxe[1] == 0) && (value == 0)) { m_ws2812b.erase(m_ws2812b.begin()+x); return 0; } } if (idxe[1] != '.') - return -412; + return -453; return m_ws2812b[x].setByName(idxe+2,value); } } @@ -8684,7 +9478,7 @@ int HardwareConfig::setByName(const char *name, const char *value) clear_dht(); return 0; } else if (name[3] == '.') { - p_validbits |= ((uint16_t)1U << 6); + p_validbits |= ((uint16_t)1U << 7); return m_dht.setByName(name+4,value); } } @@ -8706,16 +9500,16 @@ int HardwareConfig::setByName(const char *name, const char *value) } else { x = strtoul(name+4,&idxe,0); if ((idxe[0] != ']') || (idxe == (name+4))) - return -413; + return -454; if (m_i2c.size() <= x) - return -414; + return -455; if ((idxe[1] == 0) && (value == 0)) { m_i2c.erase(m_i2c.begin()+x); return 0; } } if (idxe[1] != '.') - return -415; + return -456; return m_i2c[x].setByName(idxe+2,value); } } @@ -8737,16 +9531,16 @@ int HardwareConfig::setByName(const char *name, const char *value) } else { x = strtoul(name+7,&idxe,0); if ((idxe[0] != ']') || (idxe == (name+7))) - return -416; + return -457; if (m_hcsr04.size() <= x) - return -417; + return -458; if ((idxe[1] == 0) && (value == 0)) { m_hcsr04.erase(m_hcsr04.begin()+x); return 0; } } if (idxe[1] != '.') - return -418; + return -459; return m_hcsr04[x].setByName(idxe+2,value); } } @@ -8757,7 +9551,7 @@ int HardwareConfig::setByName(const char *name, const char *value) clear_onewire(); return 0; } else if (name[7] == '.') { - p_validbits |= ((uint16_t)1U << 7); + p_validbits |= ((uint16_t)1U << 8); return m_onewire.setByName(name+8,value); } } @@ -8768,7 +9562,7 @@ int HardwareConfig::setByName(const char *name, const char *value) clear_sx1276(); return 0; } else if (name[6] == '.') { - p_validbits |= ((uint16_t)1U << 8); + p_validbits |= ((uint16_t)1U << 9); return m_sx1276.setByName(name+7,value); } } @@ -8790,16 +9584,16 @@ int HardwareConfig::setByName(const char *name, const char *value) } else { x = strtoul(name+10,&idxe,0); if ((idxe[0] != ']') || (idxe == (name+10))) - return -419; + return -460; if (m_iocluster.size() <= x) - return -420; + return -461; if ((idxe[1] == 0) && (value == 0)) { m_iocluster.erase(m_iocluster.begin()+x); return 0; } } if (idxe[1] != '.') - return -421; + return -462; return m_iocluster[x].setByName(idxe+2,value); } } @@ -8810,12 +9604,12 @@ int HardwareConfig::setByName(const char *name, const char *value) clear_display(); return 0; } else if (name[7] == '.') { - p_validbits |= ((uint16_t)1U << 9); + p_validbits |= ((uint16_t)1U << 10); return m_display.setByName(name+8,value); } } #endif // CONFIG_DISPLAY - return -422; + return -463; } Message *HardwareConfig::p_getMember(const char *s, unsigned n) @@ -8825,6 +9619,10 @@ Message *HardwareConfig::p_getMember(const char *s, unsigned n) return &m_system; if ((n == 3) && (0 == memcmp("adc",s,3))) return &m_adc; + #ifdef CONFIG_BUZZER + if ((n == 6) && (0 == memcmp("buzzer",s,6))) + return &m_buzzer; + #endif // CONFIG_BUZZER #ifdef CONFIG_HLW8012 if ((n == 7) && (0 == memcmp("hlw8012",s,7))) return &m_hlw8012; diff --git a/components/wfc/hwcfg_esp8266.h b/components/wfc/hwcfg_esp8266.h index 4ab11f9..f7c0615 100644 --- a/components/wfc/hwcfg_esp8266.h +++ b/components/wfc/hwcfg_esp8266.h @@ -1,8 +1,8 @@ /**************************************************************************** * * Code generated by Wire-Format-Compiler (WFC) - * WFC Version: P2304 (hg:456/095c4982cbea) - * WFC is Copyright 2015-2022, Thomas Maier-Komor + * WFC Version: P2304.3 (hg:459/5fefa02bc543) + * WFC is Copyright 2015-2023, Thomas Maier-Komor * * Source Information: * =================== @@ -10,7 +10,7 @@ * Copyright: 2018-2023 * Author : Thomas Maier-Komor * - * Code generated on 2023-10-24, 21:26:41 (CET). + * Code generated on 2023-11-26, 14:29:43 (CET). * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -505,6 +505,46 @@ class SystemConfig : public Message bool *mutable_usb_con(); #endif // CONFIG_USB_CONSOLE + #ifdef CONFIG_ESP_PHY_ENABLE_USB + // optional sint8 cc1_gpio, id 11 + /*! + * Function for querying if cc1_gpio has been set. + * @return true if cc1_gpio is set. + */ + bool has_cc1_gpio() const; + //! Function to reset cc1_gpio to its default/unset value. + void clear_cc1_gpio(); + //! Get value of cc1_gpio. + int8_t cc1_gpio() const; + //! Set cc1_gpio using a constant reference + void set_cc1_gpio(int8_t v); + /*! + * Provide mutable access to cc1_gpio. + * @return pointer to member variable of cc1_gpio. + */ + int8_t *mutable_cc1_gpio(); + #endif // CONFIG_ESP_PHY_ENABLE_USB + + #ifdef CONFIG_ESP_PHY_ENABLE_USB + // optional sint8 cc2_gpio, id 12 + /*! + * Function for querying if cc2_gpio has been set. + * @return true if cc2_gpio is set. + */ + bool has_cc2_gpio() const; + //! Function to reset cc2_gpio to its default/unset value. + void clear_cc2_gpio(); + //! Get value of cc2_gpio. + int8_t cc2_gpio() const; + //! Set cc2_gpio using a constant reference + void set_cc2_gpio(int8_t v); + /*! + * Provide mutable access to cc2_gpio. + * @return pointer to member variable of cc2_gpio. + */ + int8_t *mutable_cc2_gpio(); + #endif // CONFIG_ESP_PHY_ENABLE_USB + protected: //! string manufacturer, id 1 @@ -531,6 +571,14 @@ class SystemConfig : public Message //! bool usb_con, id 10 bool m_usb_con = true; #endif // CONFIG_USB_CONSOLE + #ifdef CONFIG_ESP_PHY_ENABLE_USB + //! sint8 cc1_gpio, id 11 + int8_t m_cc1_gpio = -1; + #endif // CONFIG_ESP_PHY_ENABLE_USB + #ifdef CONFIG_ESP_PHY_ENABLE_USB + //! sint8 cc2_gpio, id 12 + int8_t m_cc2_gpio = -1; + #endif // CONFIG_ESP_PHY_ENABLE_USB private: uint8_t p_validbits = 0; @@ -2319,6 +2367,10 @@ class LedConfig : public Message bool config_open_drain() const; //! Function to set the open_drain part of bitset config. void set_config_open_drain(bool); + //! Function to get the init_high part of bitset config. + bool config_init_high() const; + //! Function to set the init_high part of bitset config. + void set_config_init_high(bool); //! Set config using a constant reference void set_config(ledcfg_t v); /*! @@ -3163,10 +3215,6 @@ class GpioConfig : public Message bool config_pulldown() const; //! Function to set the pulldown part of bitset config. void set_config_pulldown(bool); - //! Function to get the cap_freq_r2r part of bitset config. - bool config_cap_freq_r2r() const; - //! Function to set the cap_freq_r2r part of bitset config. - void set_config_cap_freq_r2r(bool); //! Set config using a constant reference void set_config(gpiocfg_t v); /*! @@ -3495,10 +3543,30 @@ class SpiDeviceConfig : public Message */ int8_t *mutable_cd(); + // optional unsigned freq, id 6 + /*! + * Function for querying if freq has been set. + * @return true if freq is set. + */ + bool has_freq() const; + //! Function to reset freq to its default/unset value. + void clear_freq(); + //! Get value of freq. + uint32_t freq() const; + //! Set freq using a constant reference + void set_freq(uint32_t v); + /*! + * Provide mutable access to freq. + * @return pointer to member variable of freq. + */ + uint32_t *mutable_freq(); + protected: //! spidrv_t drv, id 1 spidrv_t m_drv = spidrv_invalid; + //! unsigned freq, id 6 + uint32_t m_freq = 0; //! sint8 cs, id 2 int8_t m_cs = -1; //! sint8 intr, id 3 @@ -4294,11 +4362,11 @@ class SX1276Config : public Message -class HardwareConfig : public Message +class Tone : public Message { public: - HardwareConfig(); - bool operator == (const HardwareConfig &r) const; + Tone(); + bool operator == (const Tone &r) const; //! Function for resetting all members to their default values. void clear(); @@ -4356,180 +4424,531 @@ class HardwareConfig : public Message //! @return number of bytes parsed from value or negative value if an error occurs int setByName(const char *param, const char *value); - // optional fixed32 magic, id 0 + // optional unsigned freq, id 1 /*! - * Function for querying if magic has been set. - * @return true if magic is set. + * Function for querying if freq has been set. + * @return true if freq is set. */ - bool has_magic() const; - //! Function to reset magic to its default/unset value. - void clear_magic(); - //! Get value of magic. - uint32_t magic() const; - //! Set magic using a constant reference - void set_magic(uint32_t v); + bool has_freq() const; + //! Function to reset freq to its default/unset value. + void clear_freq(); + //! Get value of freq. + uint32_t freq() const; + //! Set freq using a constant reference + void set_freq(uint32_t v); /*! - * Provide mutable access to magic. - * @return pointer to member variable of magic. + * Provide mutable access to freq. + * @return pointer to member variable of freq. */ - uint32_t *mutable_magic(); + uint32_t *mutable_freq(); - // optional SystemConfig system, id 1 + // optional unsigned duration, id 2 /*! - * Function for querying if system has been set. - * @return true if system is set. + * Function for querying if duration has been set. + * @return true if duration is set. */ - bool has_system() const; - //! Function to reset system to its default/unset value. - void clear_system(); - //! Get value of system. - const SystemConfig &system() const; + bool has_duration() const; + //! Function to reset duration to its default/unset value. + void clear_duration(); + //! Get value of duration. + uint32_t duration() const; + //! Set duration using a constant reference + void set_duration(uint32_t v); /*! - * Function for setting members of system using data from a serialized object. - * @param data pointer to binary data - * @param s number of bytes at data pointer + * Provide mutable access to duration. + * @return pointer to member variable of duration. */ - void set_system(const void *data, size_t s); - //! Set system using a constant reference - void set_system(const SystemConfig &v); + uint32_t *mutable_duration(); + + + protected: + //! unsigned freq, id 1 + uint32_t m_freq = 0; + //! unsigned duration, id 2 + uint32_t m_duration = 0; + + private: + uint8_t p_validbits = 0; +}; + + + + +class Melody : public Message +{ + public: + Melody(); + bool operator == (const Melody &r) const; + + //! Function for resetting all members to their default values. + void clear(); + /*! - * Provide mutable access to system. - * @return pointer to member variable of system. + * Calculates the required number of bytes for serializing this object. + * If member variables of the object are modified, the number of bytes + * needed for serialization may change, too. + * @return bytes needed for a serialized object representation */ - SystemConfig *mutable_system(); + size_t calcSize() const; - // unused repeated UartConfig uart, id 3 - // optional AdcConfig adc, id 4 /*! - * Function for querying if adc has been set. - * @return true if adc is set. + * Function for parsing serialized data and update this object accordingly. + * Member variables that are not in the serialized data are not reset. + * @param b buffer of serialized data + * @param s number of bytes available in the buffer + * @return number of bytes successfully parsed (can be < s) + * or a negative value indicating the error encountered */ - bool has_adc() const; - //! Function to reset adc to its default/unset value. - void clear_adc(); - //! Get value of adc. - const AdcConfig &adc() const; + ssize_t fromMemory(const void *b, ssize_t s); + /*! - * Function for setting adc using binary data. - * @param data pointer to binary data - * @param s number of bytes at data pointer + * Function for serializing the object to memory. + * @param b buffer to serialize the object to + * @param s number of bytes available in the buffer + * @return number of bytes successfully serialized */ - void set_adc(const void *data, size_t s); - //! Set adc using a constant reference - void set_adc(const AdcConfig &v); + ssize_t toMemory(uint8_t *, ssize_t) const; + /*! - * Provide mutable access to adc. - * @return pointer to member variable of adc. + * Function for writing a JSON representation of this object to a stream. + * @param json stream object the JSON output shall be written to + * @indLvl current indention level */ - AdcConfig *mutable_adc(); + void toJSON(stream &json, unsigned indLvl = 0) const; - #ifdef CONFIG_TOUCHPAD - // unused optional TouchpadConfig touchpad, id 5 - #endif // CONFIG_TOUCHPAD - #ifdef CONFIG_TOUCHPAD - // unused repeated TouchChannelConfig tp_channel, id 6 - #endif // CONFIG_TOUCHPAD - // repeated GpioConfig gpios, id 7 - //! Function get const-access to the elements of gpios. - const std::vector &gpios() const; - //! Function to get the number of elements in gpios. - size_t gpios_size() const; /*! - * Function to append a element to gpios. - * @return point to newly added element. + * Function for writing an ASCII representation of this object to a stream. + * @param o output stream + * @param indent initial indention level */ - GpioConfig* add_gpios(); - //! Function to reset gpios to its default/unset value. - void clear_gpios(); - //! Get value of element x of gpios. - const GpioConfig &gpios(unsigned x) const; - //! Set gpios using a constant reference - void set_gpios(unsigned x, const GpioConfig &v); + void toASCII(stream &o, size_t indent = 0) const; + /*! - * Provide mutable access to gpios. - * @return pointer to member variable of gpios. + * Function for determining the maximum size that the object may need for + * its serialized representation + * @return maximum number of bytes or SIZE_MAX if no limit can be determined */ - GpioConfig *mutable_gpios(unsigned x); - //! Function to get mutable access to all elements of gpios. - std::vector *mutable_gpios(); + static size_t getMaxSize(); - #ifdef CONFIG_SPI - // repeated SpiBusConfig spibus, id 8 - //! Function get const-access to the elements of spibus. - const std::vector &spibus() const; - //! Function to get the number of elements in spibus. - size_t spibus_size() const; + //! Function for setting a parameter by its ASCII name using an ASCII representation of value. + //! @param param parameter name + //! @param value ASCII representation of the value + //! @return number of bytes parsed from value or negative value if an error occurs + int setByName(const char *param, const char *value); + + // optional string name, id 1 /*! - * Function to append a element to spibus. - * @return point to newly added element. + * Function for querying if name has been set. + * @return true if name is set. */ - SpiBusConfig* add_spibus(); - //! Function to reset spibus to its default/unset value. - void clear_spibus(); - //! Get value of element x of spibus. - const SpiBusConfig &spibus(unsigned x) const; - //! Set spibus using a constant reference - void set_spibus(unsigned x, const SpiBusConfig &v); + bool has_name() const; + //! Function to reset name to its default/unset value. + void clear_name(); + //! Get value of name. + const estring &name() const; /*! - * Provide mutable access to spibus. - * @return pointer to member variable of spibus. + * Function for setting name using binary data. + * @param data pointer to binary data + * @param s number of bytes at data pointer */ - SpiBusConfig *mutable_spibus(unsigned x); - //! Function to get mutable access to all elements of spibus. - std::vector *mutable_spibus(); - #endif // CONFIG_SPI + void set_name(const void *data, size_t s); + //! Set name using a constant reference + void set_name(const estring &v); + //! Set name using a pointer to a null-terminated C-string. + void set_name(const char *); + /*! + * Provide mutable access to name. + * @return pointer to member variable of name. + */ + estring *mutable_name(); - #ifdef CONFIG_BUTTON - // repeated ButtonConfig button, id 16 - //! Function get const-access to the elements of button. - const std::vector &button() const; - //! Function to get the number of elements in button. - size_t button_size() const; + // repeated fixed16 tones, id 2 + //! Function get const-access to the elements of tones. + const std::vector &tones() const; + //! Function to get the number of elements in tones. + size_t tones_size() const; /*! - * Function to append a element to button. + * Function to append a element to tones. * @return point to newly added element. */ - ButtonConfig* add_button(); - //! Function to reset button to its default/unset value. - void clear_button(); - //! Get value of element x of button. - const ButtonConfig &button(unsigned x) const; - //! Set button using a constant reference - void set_button(unsigned x, const ButtonConfig &v); + void add_tones(uint16_t v); + //! Function to reset tones to its default/unset value. + void clear_tones(); + //! Get value of element x of tones. + uint16_t tones(unsigned x) const; + //! Set tones using a constant reference + void set_tones(unsigned x, uint16_t v); /*! - * Provide mutable access to button. - * @return pointer to member variable of button. + * Provide mutable access to tones. + * @return pointer to member variable of tones. */ - ButtonConfig *mutable_button(unsigned x); - //! Function to get mutable access to all elements of button. - std::vector *mutable_button(); - #endif // CONFIG_BUTTON + uint16_t *mutable_tones(unsigned x); + //! Function to get mutable access to all elements of tones. + std::vector *mutable_tones(); + + + protected: + //! string name, id 1 + estring m_name; + //! fixed16 tones, id 2 + std::vector m_tones; +}; + + + + +class BuzzerConfig : public Message +{ + public: + BuzzerConfig(); + bool operator == (const BuzzerConfig &r) const; + + //! Function for resetting all members to their default values. + void clear(); - #ifdef CONFIG_RELAY - // repeated RelayConfig relay, id 17 - //! Function get const-access to the elements of relay. - const std::vector &relay() const; - //! Function to get the number of elements in relay. - size_t relay_size() const; /*! - * Function to append a element to relay. - * @return point to newly added element. + * Calculates the required number of bytes for serializing this object. + * If member variables of the object are modified, the number of bytes + * needed for serialization may change, too. + * @return bytes needed for a serialized object representation */ - RelayConfig* add_relay(); - //! Function to reset relay to its default/unset value. - void clear_relay(); - //! Get value of element x of relay. - const RelayConfig &relay(unsigned x) const; - //! Set relay using a constant reference - void set_relay(unsigned x, const RelayConfig &v); + size_t calcSize() const; + /*! - * Provide mutable access to relay. - * @return pointer to member variable of relay. + * Function for parsing serialized data and update this object accordingly. + * Member variables that are not in the serialized data are not reset. + * @param b buffer of serialized data + * @param s number of bytes available in the buffer + * @return number of bytes successfully parsed (can be < s) + * or a negative value indicating the error encountered */ - RelayConfig *mutable_relay(unsigned x); - //! Function to get mutable access to all elements of relay. - std::vector *mutable_relay(); - #endif // CONFIG_RELAY + ssize_t fromMemory(const void *b, ssize_t s); + + /*! + * Function for serializing the object to memory. + * @param b buffer to serialize the object to + * @param s number of bytes available in the buffer + * @return number of bytes successfully serialized + */ + ssize_t toMemory(uint8_t *, ssize_t) const; + + /*! + * Function for writing a JSON representation of this object to a stream. + * @param json stream object the JSON output shall be written to + * @indLvl current indention level + */ + void toJSON(stream &json, unsigned indLvl = 0) const; + + /*! + * Function for writing an ASCII representation of this object to a stream. + * @param o output stream + * @param indent initial indention level + */ + void toASCII(stream &o, size_t indent = 0) const; + + /*! + * Function for determining the maximum size that the object may need for + * its serialized representation + * @return maximum number of bytes or SIZE_MAX if no limit can be determined + */ + static size_t getMaxSize(); + + //! Function for setting a parameter by its ASCII name using an ASCII representation of value. + //! @param param parameter name + //! @param value ASCII representation of the value + //! @return number of bytes parsed from value or negative value if an error occurs + int setByName(const char *param, const char *value); + + // optional sint8 gpio, id 1 + /*! + * Function for querying if gpio has been set. + * @return true if gpio is set. + */ + bool has_gpio() const; + //! Function to reset gpio to its default/unset value. + void clear_gpio(); + //! Get value of gpio. + int8_t gpio() const; + //! Set gpio using a constant reference + void set_gpio(int8_t v); + /*! + * Provide mutable access to gpio. + * @return pointer to member variable of gpio. + */ + int8_t *mutable_gpio(); + + // repeated Melody melodies, id 2 + //! Function get const-access to the elements of melodies. + const std::vector &melodies() const; + //! Function to get the number of elements in melodies. + size_t melodies_size() const; + /*! + * Function to append a element to melodies. + * @return point to newly added element. + */ + Melody* add_melodies(); + //! Function to reset melodies to its default/unset value. + void clear_melodies(); + //! Get value of element x of melodies. + const Melody &melodies(unsigned x) const; + //! Set melodies using a constant reference + void set_melodies(unsigned x, const Melody &v); + /*! + * Provide mutable access to melodies. + * @return pointer to member variable of melodies. + */ + Melody *mutable_melodies(unsigned x); + //! Function to get mutable access to all elements of melodies. + std::vector *mutable_melodies(); + + + protected: + Message *p_getMember(const char *s, unsigned n, unsigned i); + //! sint8 gpio, id 1 + int8_t m_gpio = -1; + //! Melody melodies, id 2 + std::vector m_melodies; +}; + + + + +class HardwareConfig : public Message +{ + public: + HardwareConfig(); + bool operator == (const HardwareConfig &r) const; + + //! Function for resetting all members to their default values. + void clear(); + + /*! + * Calculates the required number of bytes for serializing this object. + * If member variables of the object are modified, the number of bytes + * needed for serialization may change, too. + * @return bytes needed for a serialized object representation + */ + size_t calcSize() const; + + /*! + * Function for parsing serialized data and update this object accordingly. + * Member variables that are not in the serialized data are not reset. + * @param b buffer of serialized data + * @param s number of bytes available in the buffer + * @return number of bytes successfully parsed (can be < s) + * or a negative value indicating the error encountered + */ + ssize_t fromMemory(const void *b, ssize_t s); + + /*! + * Function for serializing the object to memory. + * @param b buffer to serialize the object to + * @param s number of bytes available in the buffer + * @return number of bytes successfully serialized + */ + ssize_t toMemory(uint8_t *, ssize_t) const; + + /*! + * Function for writing a JSON representation of this object to a stream. + * @param json stream object the JSON output shall be written to + * @indLvl current indention level + */ + void toJSON(stream &json, unsigned indLvl = 0) const; + + /*! + * Function for writing an ASCII representation of this object to a stream. + * @param o output stream + * @param indent initial indention level + */ + void toASCII(stream &o, size_t indent = 0) const; + + /*! + * Function for determining the maximum size that the object may need for + * its serialized representation + * @return maximum number of bytes or SIZE_MAX if no limit can be determined + */ + static size_t getMaxSize(); + + //! Function for setting a parameter by its ASCII name using an ASCII representation of value. + //! @param param parameter name + //! @param value ASCII representation of the value + //! @return number of bytes parsed from value or negative value if an error occurs + int setByName(const char *param, const char *value); + + // optional fixed32 magic, id 0 + /*! + * Function for querying if magic has been set. + * @return true if magic is set. + */ + bool has_magic() const; + //! Function to reset magic to its default/unset value. + void clear_magic(); + //! Get value of magic. + uint32_t magic() const; + //! Set magic using a constant reference + void set_magic(uint32_t v); + /*! + * Provide mutable access to magic. + * @return pointer to member variable of magic. + */ + uint32_t *mutable_magic(); + + // optional SystemConfig system, id 1 + /*! + * Function for querying if system has been set. + * @return true if system is set. + */ + bool has_system() const; + //! Function to reset system to its default/unset value. + void clear_system(); + //! Get value of system. + const SystemConfig &system() const; + /*! + * Function for setting members of system using data from a serialized object. + * @param data pointer to binary data + * @param s number of bytes at data pointer + */ + void set_system(const void *data, size_t s); + //! Set system using a constant reference + void set_system(const SystemConfig &v); + /*! + * Provide mutable access to system. + * @return pointer to member variable of system. + */ + SystemConfig *mutable_system(); + + // unused repeated UartConfig uart, id 3 + // optional AdcConfig adc, id 4 + /*! + * Function for querying if adc has been set. + * @return true if adc is set. + */ + bool has_adc() const; + //! Function to reset adc to its default/unset value. + void clear_adc(); + //! Get value of adc. + const AdcConfig &adc() const; + /*! + * Function for setting adc using binary data. + * @param data pointer to binary data + * @param s number of bytes at data pointer + */ + void set_adc(const void *data, size_t s); + //! Set adc using a constant reference + void set_adc(const AdcConfig &v); + /*! + * Provide mutable access to adc. + * @return pointer to member variable of adc. + */ + AdcConfig *mutable_adc(); + + #ifdef CONFIG_TOUCHPAD + // unused optional TouchpadConfig touchpad, id 5 + #endif // CONFIG_TOUCHPAD + #ifdef CONFIG_TOUCHPAD + // unused repeated TouchChannelConfig tp_channel, id 6 + #endif // CONFIG_TOUCHPAD + // repeated GpioConfig gpios, id 7 + //! Function get const-access to the elements of gpios. + const std::vector &gpios() const; + //! Function to get the number of elements in gpios. + size_t gpios_size() const; + /*! + * Function to append a element to gpios. + * @return point to newly added element. + */ + GpioConfig* add_gpios(); + //! Function to reset gpios to its default/unset value. + void clear_gpios(); + //! Get value of element x of gpios. + const GpioConfig &gpios(unsigned x) const; + //! Set gpios using a constant reference + void set_gpios(unsigned x, const GpioConfig &v); + /*! + * Provide mutable access to gpios. + * @return pointer to member variable of gpios. + */ + GpioConfig *mutable_gpios(unsigned x); + //! Function to get mutable access to all elements of gpios. + std::vector *mutable_gpios(); + + #ifdef CONFIG_SPI + // repeated SpiBusConfig spibus, id 8 + //! Function get const-access to the elements of spibus. + const std::vector &spibus() const; + //! Function to get the number of elements in spibus. + size_t spibus_size() const; + /*! + * Function to append a element to spibus. + * @return point to newly added element. + */ + SpiBusConfig* add_spibus(); + //! Function to reset spibus to its default/unset value. + void clear_spibus(); + //! Get value of element x of spibus. + const SpiBusConfig &spibus(unsigned x) const; + //! Set spibus using a constant reference + void set_spibus(unsigned x, const SpiBusConfig &v); + /*! + * Provide mutable access to spibus. + * @return pointer to member variable of spibus. + */ + SpiBusConfig *mutable_spibus(unsigned x); + //! Function to get mutable access to all elements of spibus. + std::vector *mutable_spibus(); + #endif // CONFIG_SPI + + #ifdef CONFIG_BUTTON + // repeated ButtonConfig button, id 16 + //! Function get const-access to the elements of button. + const std::vector &button() const; + //! Function to get the number of elements in button. + size_t button_size() const; + /*! + * Function to append a element to button. + * @return point to newly added element. + */ + ButtonConfig* add_button(); + //! Function to reset button to its default/unset value. + void clear_button(); + //! Get value of element x of button. + const ButtonConfig &button(unsigned x) const; + //! Set button using a constant reference + void set_button(unsigned x, const ButtonConfig &v); + /*! + * Provide mutable access to button. + * @return pointer to member variable of button. + */ + ButtonConfig *mutable_button(unsigned x); + //! Function to get mutable access to all elements of button. + std::vector *mutable_button(); + #endif // CONFIG_BUTTON + + #ifdef CONFIG_RELAY + // repeated RelayConfig relay, id 17 + //! Function get const-access to the elements of relay. + const std::vector &relay() const; + //! Function to get the number of elements in relay. + size_t relay_size() const; + /*! + * Function to append a element to relay. + * @return point to newly added element. + */ + RelayConfig* add_relay(); + //! Function to reset relay to its default/unset value. + void clear_relay(); + //! Get value of element x of relay. + const RelayConfig &relay(unsigned x) const; + //! Set relay using a constant reference + void set_relay(unsigned x, const RelayConfig &v); + /*! + * Provide mutable access to relay. + * @return pointer to member variable of relay. + */ + RelayConfig *mutable_relay(unsigned x); + //! Function to get mutable access to all elements of relay. + std::vector *mutable_relay(); + #endif // CONFIG_RELAY #ifdef CONFIG_LEDS // repeated LedConfig led, id 18 @@ -4557,6 +4976,32 @@ class HardwareConfig : public Message std::vector *mutable_led(); #endif // CONFIG_LEDS + #ifdef CONFIG_BUZZER + // optional BuzzerConfig buzzer, id 19 + /*! + * Function for querying if buzzer has been set. + * @return true if buzzer is set. + */ + bool has_buzzer() const; + //! Function to reset buzzer to its default/unset value. + void clear_buzzer(); + //! Get value of buzzer. + const BuzzerConfig &buzzer() const; + /*! + * Function for setting buzzer using binary data. + * @param data pointer to binary data + * @param s number of bytes at data pointer + */ + void set_buzzer(const void *data, size_t s); + //! Set buzzer using a constant reference + void set_buzzer(const BuzzerConfig &v); + /*! + * Provide mutable access to buzzer. + * @return pointer to member variable of buzzer. + */ + BuzzerConfig *mutable_buzzer(); + #endif // CONFIG_BUZZER + #ifdef CONFIG_HLW8012 // optional Hlw8012Config hlw8012, id 20 /*! @@ -4849,10 +5294,10 @@ class HardwareConfig : public Message Message *p_getMember(const char *s, unsigned n, unsigned i); //! fixed32 magic, id 0 uint32_t m_magic = 0; - #ifdef CONFIG_HLW8012 - //! Hlw8012Config hlw8012, id 20 - Hlw8012Config m_hlw8012; - #endif // CONFIG_HLW8012 + #ifdef CONFIG_BUZZER + //! BuzzerConfig buzzer, id 19 + BuzzerConfig m_buzzer; + #endif // CONFIG_BUZZER #ifdef CONFIG_DISPLAY //! DisplayConfig display, id 50 DisplayConfig m_display; @@ -4893,6 +5338,10 @@ class HardwareConfig : public Message //! Max7219Config max7219, id 32 Max7219Config m_max7219; #endif // CONFIG_MAX7219 + #ifdef CONFIG_HLW8012 + //! Hlw8012Config hlw8012, id 20 + Hlw8012Config m_hlw8012; + #endif // CONFIG_HLW8012 #ifdef CONFIG_LEDS //! LedConfig led, id 18 std::vector m_led; @@ -4933,6 +5382,8 @@ inline size_t SystemConfig::getMaxSize() // optional string model_number, id 8 has unlimited size // optional bool usb_diag, id 9 has maximum size 2 // optional bool usb_con, id 10 has maximum size 2 + // optional sint8 cc1_gpio, id 11 has maximum size 3 + // optional sint8 cc2_gpio, id 12 has maximum size 3 return SIZE_MAX; } @@ -5254,62 +5705,128 @@ inline bool SystemConfig::usb_diag() const inline bool SystemConfig::has_usb_diag() const { - return m_usb_diag != true; + return m_usb_diag != true; +} + +/*! + * Function for clearing the associated member variable. + * It will reset the value to the default value. + */ +inline void SystemConfig::clear_usb_diag() +{ + m_usb_diag = true; +} + +inline bool *SystemConfig::mutable_usb_diag() +{ + return &m_usb_diag; +} + +inline void SystemConfig::set_usb_diag(bool v) +{ + m_usb_diag = v; +} + +#endif // CONFIG_USB_DIAGLOG + + +#ifdef CONFIG_USB_CONSOLE +inline bool SystemConfig::usb_con() const +{ + return m_usb_con; +} + +inline bool SystemConfig::has_usb_con() const +{ + return m_usb_con != true; +} + +/*! + * Function for clearing the associated member variable. + * It will reset the value to the default value. + */ +inline void SystemConfig::clear_usb_con() +{ + m_usb_con = true; +} + +inline bool *SystemConfig::mutable_usb_con() +{ + return &m_usb_con; +} + +inline void SystemConfig::set_usb_con(bool v) +{ + m_usb_con = v; +} + +#endif // CONFIG_USB_CONSOLE + + +#ifdef CONFIG_ESP_PHY_ENABLE_USB +inline int8_t SystemConfig::cc1_gpio() const +{ + return m_cc1_gpio; +} + +inline bool SystemConfig::has_cc1_gpio() const +{ + return m_cc1_gpio != -1; } /*! * Function for clearing the associated member variable. * It will reset the value to the default value. */ -inline void SystemConfig::clear_usb_diag() +inline void SystemConfig::clear_cc1_gpio() { - m_usb_diag = true; + m_cc1_gpio = -1; } -inline bool *SystemConfig::mutable_usb_diag() +inline int8_t *SystemConfig::mutable_cc1_gpio() { - return &m_usb_diag; + return &m_cc1_gpio; } -inline void SystemConfig::set_usb_diag(bool v) +inline void SystemConfig::set_cc1_gpio(int8_t v) { - m_usb_diag = v; + m_cc1_gpio = v; } -#endif // CONFIG_USB_DIAGLOG +#endif // CONFIG_ESP_PHY_ENABLE_USB -#ifdef CONFIG_USB_CONSOLE -inline bool SystemConfig::usb_con() const +#ifdef CONFIG_ESP_PHY_ENABLE_USB +inline int8_t SystemConfig::cc2_gpio() const { - return m_usb_con; + return m_cc2_gpio; } -inline bool SystemConfig::has_usb_con() const +inline bool SystemConfig::has_cc2_gpio() const { - return m_usb_con != true; + return m_cc2_gpio != -1; } /*! * Function for clearing the associated member variable. * It will reset the value to the default value. */ -inline void SystemConfig::clear_usb_con() +inline void SystemConfig::clear_cc2_gpio() { - m_usb_con = true; + m_cc2_gpio = -1; } -inline bool *SystemConfig::mutable_usb_con() +inline int8_t *SystemConfig::mutable_cc2_gpio() { - return &m_usb_con; + return &m_cc2_gpio; } -inline void SystemConfig::set_usb_con(bool v) +inline void SystemConfig::set_cc2_gpio(int8_t v) { - m_usb_con = v; + m_cc2_gpio = v; } -#endif // CONFIG_USB_CONSOLE +#endif // CONFIG_ESP_PHY_ENABLE_USB inline size_t TouchpadConfig::getMaxSize() @@ -7047,6 +7564,11 @@ inline bool LedConfig::config_open_drain() const return (bool)((m_config >> 1) & 0x1); } +inline bool LedConfig::config_init_high() const +{ + return (bool)((m_config >> 2) & 0x1); +} + inline bool LedConfig::has_config() const { return 0 != (p_validbits & ((uint8_t)1U << 0)); @@ -7085,6 +7607,13 @@ inline void LedConfig::set_config_open_drain(bool v) p_validbits |= ((uint8_t)1U << 0); } +inline void LedConfig::set_config_init_high(bool v) +{ + m_config &= ~(0x1ULL << 2); + m_config |= ((uint8_t) v << 2); + p_validbits |= ((uint8_t)1U << 0); +} + inline void LedConfig::set_config(ledcfg_t v) { m_config = v; @@ -7880,11 +8409,6 @@ inline bool GpioConfig::config_pulldown() const return (bool)((m_config >> 8) & 0x1); } -inline bool GpioConfig::config_cap_freq_r2r() const -{ - return (bool)((m_config >> 9) & 0x1); -} - inline bool GpioConfig::has_config() const { return 0 != (p_validbits & ((uint8_t)1U << 0)); @@ -7951,13 +8475,6 @@ inline void GpioConfig::set_config_pulldown(bool v) p_validbits |= ((uint8_t)1U << 0); } -inline void GpioConfig::set_config_cap_freq_r2r(bool v) -{ - m_config &= ~(0x1ULL << 9); - m_config |= ((uint16_t) v << 9); - p_validbits |= ((uint8_t)1U << 0); -} - inline void GpioConfig::set_config(gpiocfg_t v) { m_config = v; @@ -8124,7 +8641,8 @@ inline size_t SpiDeviceConfig::getMaxSize() // optional sint8 intr, id 3 has maximum size 3 // optional sint8 reset, id 4 has maximum size 3 // optional sint8 cd, id 5 has maximum size 3 - return 14; + // optional unsigned freq, id 6 has maximum size 6 + return 20; } inline spidrv_t SpiDeviceConfig::drv() const @@ -8282,6 +8800,37 @@ inline void SpiDeviceConfig::set_cd(int8_t v) +inline uint32_t SpiDeviceConfig::freq() const +{ + return m_freq; +} + +inline bool SpiDeviceConfig::has_freq() const +{ + return m_freq != 0; +} + +/*! + * Function for clearing the associated member variable. + * It will reset the value to the default value. + */ +inline void SpiDeviceConfig::clear_freq() +{ + m_freq = 0; +} + +inline uint32_t *SpiDeviceConfig::mutable_freq() +{ + return &m_freq; +} + +inline void SpiDeviceConfig::set_freq(uint32_t v) +{ + m_freq = v; +} + + + inline size_t SpiBusConfig::getMaxSize() { // optional sint8 host, id 1 has maximum size 3 @@ -8929,230 +9478,496 @@ inline void Hlw8012Config::set_cf(int8_t v) -inline int8_t Hlw8012Config::cf1() const +inline int8_t Hlw8012Config::cf1() const +{ + return m_cf1; +} + +inline bool Hlw8012Config::has_cf1() const +{ + return m_cf1 != -1; +} + +/*! + * Function for clearing the associated member variable. + * It will reset the value to the default value. + */ +inline void Hlw8012Config::clear_cf1() +{ + m_cf1 = -1; +} + +inline int8_t *Hlw8012Config::mutable_cf1() +{ + return &m_cf1; +} + +inline void Hlw8012Config::set_cf1(int8_t v) +{ + m_cf1 = v; +} + + + +inline size_t SX1276Config::getMaxSize() +{ + // optional sint8 dio0, id 1 has maximum size 3 + // optional sint8 dio1, id 2 has maximum size 3 + // optional sint8 dio2, id 3 has maximum size 3 + // optional sint8 dio3, id 4 has maximum size 3 + // optional sint8 dio4, id 5 has maximum size 3 + // optional sint8 dio5, id 6 has maximum size 3 + return 18; +} + +inline int8_t SX1276Config::dio0() const +{ + return m_dio0; +} + +inline bool SX1276Config::has_dio0() const +{ + return m_dio0 != -1; +} + +/*! + * Function for clearing the associated member variable. + * It will reset the value to the default value. + */ +inline void SX1276Config::clear_dio0() +{ + m_dio0 = -1; +} + +inline int8_t *SX1276Config::mutable_dio0() +{ + return &m_dio0; +} + +inline void SX1276Config::set_dio0(int8_t v) +{ + m_dio0 = v; +} + + + +inline int8_t SX1276Config::dio1() const +{ + return m_dio1; +} + +inline bool SX1276Config::has_dio1() const +{ + return m_dio1 != -1; +} + +/*! + * Function for clearing the associated member variable. + * It will reset the value to the default value. + */ +inline void SX1276Config::clear_dio1() +{ + m_dio1 = -1; +} + +inline int8_t *SX1276Config::mutable_dio1() +{ + return &m_dio1; +} + +inline void SX1276Config::set_dio1(int8_t v) +{ + m_dio1 = v; +} + + + +inline int8_t SX1276Config::dio2() const +{ + return m_dio2; +} + +inline bool SX1276Config::has_dio2() const +{ + return m_dio2 != -1; +} + +/*! + * Function for clearing the associated member variable. + * It will reset the value to the default value. + */ +inline void SX1276Config::clear_dio2() +{ + m_dio2 = -1; +} + +inline int8_t *SX1276Config::mutable_dio2() +{ + return &m_dio2; +} + +inline void SX1276Config::set_dio2(int8_t v) +{ + m_dio2 = v; +} + + + +inline int8_t SX1276Config::dio3() const +{ + return m_dio3; +} + +inline bool SX1276Config::has_dio3() const +{ + return m_dio3 != -1; +} + +/*! + * Function for clearing the associated member variable. + * It will reset the value to the default value. + */ +inline void SX1276Config::clear_dio3() +{ + m_dio3 = -1; +} + +inline int8_t *SX1276Config::mutable_dio3() +{ + return &m_dio3; +} + +inline void SX1276Config::set_dio3(int8_t v) +{ + m_dio3 = v; +} + + + +inline int8_t SX1276Config::dio4() const +{ + return m_dio4; +} + +inline bool SX1276Config::has_dio4() const +{ + return m_dio4 != -1; +} + +/*! + * Function for clearing the associated member variable. + * It will reset the value to the default value. + */ +inline void SX1276Config::clear_dio4() +{ + m_dio4 = -1; +} + +inline int8_t *SX1276Config::mutable_dio4() +{ + return &m_dio4; +} + +inline void SX1276Config::set_dio4(int8_t v) +{ + m_dio4 = v; +} + + + +inline int8_t SX1276Config::dio5() const { - return m_cf1; + return m_dio5; } -inline bool Hlw8012Config::has_cf1() const +inline bool SX1276Config::has_dio5() const { - return m_cf1 != -1; + return m_dio5 != -1; } /*! * Function for clearing the associated member variable. * It will reset the value to the default value. */ -inline void Hlw8012Config::clear_cf1() +inline void SX1276Config::clear_dio5() { - m_cf1 = -1; + m_dio5 = -1; } -inline int8_t *Hlw8012Config::mutable_cf1() +inline int8_t *SX1276Config::mutable_dio5() { - return &m_cf1; + return &m_dio5; } -inline void Hlw8012Config::set_cf1(int8_t v) +inline void SX1276Config::set_dio5(int8_t v) { - m_cf1 = v; + m_dio5 = v; } -inline size_t SX1276Config::getMaxSize() +inline size_t Tone::getMaxSize() { - // optional sint8 dio0, id 1 has maximum size 3 - // optional sint8 dio1, id 2 has maximum size 3 - // optional sint8 dio2, id 3 has maximum size 3 - // optional sint8 dio3, id 4 has maximum size 3 - // optional sint8 dio4, id 5 has maximum size 3 - // optional sint8 dio5, id 6 has maximum size 3 - return 18; + // optional unsigned freq, id 1 has maximum size 6 + // optional unsigned duration, id 2 has maximum size 6 + return 12; } -inline int8_t SX1276Config::dio0() const +inline uint32_t Tone::freq() const { - return m_dio0; + return m_freq; } -inline bool SX1276Config::has_dio0() const +inline bool Tone::has_freq() const { - return m_dio0 != -1; + return 0 != (p_validbits & ((uint8_t)1U << 0)); } /*! * Function for clearing the associated member variable. * It will reset the value to the default value. */ -inline void SX1276Config::clear_dio0() +inline void Tone::clear_freq() { - m_dio0 = -1; + p_validbits &= ~((uint8_t)1U << 0); + m_freq = 0; } -inline int8_t *SX1276Config::mutable_dio0() +inline uint32_t *Tone::mutable_freq() { - return &m_dio0; + if (0 == (p_validbits & ((uint8_t)1U << 0))) { + p_validbits |= ((uint8_t)1U << 0); + m_freq = 0; + } + return &m_freq; } -inline void SX1276Config::set_dio0(int8_t v) +inline void Tone::set_freq(uint32_t v) { - m_dio0 = v; + m_freq = v; + p_validbits |= ((uint8_t)1U << 0); } -inline int8_t SX1276Config::dio1() const +inline uint32_t Tone::duration() const { - return m_dio1; + return m_duration; } -inline bool SX1276Config::has_dio1() const +inline bool Tone::has_duration() const { - return m_dio1 != -1; + return 0 != (p_validbits & ((uint8_t)1U << 1)); } /*! * Function for clearing the associated member variable. * It will reset the value to the default value. */ -inline void SX1276Config::clear_dio1() +inline void Tone::clear_duration() { - m_dio1 = -1; + p_validbits &= ~((uint8_t)1U << 1); + m_duration = 0; } -inline int8_t *SX1276Config::mutable_dio1() +inline uint32_t *Tone::mutable_duration() { - return &m_dio1; + if (0 == (p_validbits & ((uint8_t)1U << 1))) { + p_validbits |= ((uint8_t)1U << 1); + m_duration = 0; + } + return &m_duration; } -inline void SX1276Config::set_dio1(int8_t v) +inline void Tone::set_duration(uint32_t v) { - m_dio1 = v; + m_duration = v; + p_validbits |= ((uint8_t)1U << 1); } -inline int8_t SX1276Config::dio2() const +inline size_t Melody::getMaxSize() { - return m_dio2; + // optional string name, id 1 has unlimited size + // repeated fixed16 tones, id 2 has unlimited size + return SIZE_MAX; } -inline bool SX1276Config::has_dio2() const +inline const estring &Melody::name() const { - return m_dio2 != -1; + return m_name; +} + +inline bool Melody::has_name() const +{ + return !m_name.empty(); } /*! * Function for clearing the associated member variable. * It will reset the value to the default value. */ -inline void SX1276Config::clear_dio2() +inline void Melody::clear_name() { - m_dio2 = -1; + m_name.clear(); } -inline int8_t *SX1276Config::mutable_dio2() +inline estring *Melody::mutable_name() { - return &m_dio2; + return &m_name; } -inline void SX1276Config::set_dio2(int8_t v) +inline void Melody::set_name(const void *data, size_t s) { - m_dio2 = v; + m_name.assign((const char *)data,s); } +inline void Melody::set_name(const char *data) +{ + m_name = data; +} +inline void Melody::set_name(const estring &v) +{ + m_name = v; +} -inline int8_t SX1276Config::dio3() const + + +inline uint16_t Melody::tones(unsigned x) const { - return m_dio3; + return m_tones[x]; } -inline bool SX1276Config::has_dio3() const +inline const std::vector &Melody::tones() const { - return m_dio3 != -1; + return m_tones; } /*! * Function for clearing the associated member variable. * It will reset the value to the default value. */ -inline void SX1276Config::clear_dio3() +inline void Melody::clear_tones() { - m_dio3 = -1; + m_tones.clear(); } -inline int8_t *SX1276Config::mutable_dio3() +inline uint16_t *Melody::mutable_tones(unsigned x) { - return &m_dio3; + if (x >= m_tones.size()) + m_tones.resize(x+1); + return &m_tones[x]; } -inline void SX1276Config::set_dio3(int8_t v) +inline std::vector *Melody::mutable_tones() { - m_dio3 = v; + return &m_tones; } +inline void Melody::add_tones(uint16_t v) +{ + m_tones.push_back(v); +} +inline void Melody::set_tones(unsigned x, uint16_t v) +{ + assert(x < m_tones.size()); + m_tones[x] = v; +} -inline int8_t SX1276Config::dio4() const +inline size_t Melody::tones_size() const { - return m_dio4; + return m_tones.size(); } -inline bool SX1276Config::has_dio4() const + + +inline size_t BuzzerConfig::getMaxSize() { - return m_dio4 != -1; + // optional sint8 gpio, id 1 has maximum size 3 + // repeated Melody melodies, id 2 has unlimited size + return SIZE_MAX; +} + +inline int8_t BuzzerConfig::gpio() const +{ + return m_gpio; +} + +inline bool BuzzerConfig::has_gpio() const +{ + return m_gpio != -1; } /*! * Function for clearing the associated member variable. * It will reset the value to the default value. */ -inline void SX1276Config::clear_dio4() +inline void BuzzerConfig::clear_gpio() { - m_dio4 = -1; + m_gpio = -1; } -inline int8_t *SX1276Config::mutable_dio4() +inline int8_t *BuzzerConfig::mutable_gpio() { - return &m_dio4; + return &m_gpio; } -inline void SX1276Config::set_dio4(int8_t v) +inline void BuzzerConfig::set_gpio(int8_t v) { - m_dio4 = v; + m_gpio = v; } -inline int8_t SX1276Config::dio5() const +inline const Melody &BuzzerConfig::melodies(unsigned x) const { - return m_dio5; + return m_melodies[x]; } -inline bool SX1276Config::has_dio5() const +inline const std::vector &BuzzerConfig::melodies() const { - return m_dio5 != -1; + return m_melodies; } /*! * Function for clearing the associated member variable. * It will reset the value to the default value. */ -inline void SX1276Config::clear_dio5() +inline void BuzzerConfig::clear_melodies() { - m_dio5 = -1; + m_melodies.clear(); } -inline int8_t *SX1276Config::mutable_dio5() +inline Melody *BuzzerConfig::mutable_melodies(unsigned x) { - return &m_dio5; + if (x >= m_melodies.size()) + m_melodies.resize(x+1); + return &m_melodies[x]; } -inline void SX1276Config::set_dio5(int8_t v) +inline std::vector *BuzzerConfig::mutable_melodies() { - m_dio5 = v; + return &m_melodies; +} + +inline Melody *BuzzerConfig::add_melodies() +{ + m_melodies.resize(m_melodies.size()+1); + return &m_melodies.back(); +} + +inline void BuzzerConfig::set_melodies(unsigned x, const Melody &v) +{ + assert(x < m_melodies.size()); + m_melodies[x] = v; +} + +inline size_t BuzzerConfig::melodies_size() const +{ + return m_melodies.size(); } @@ -9160,7 +9975,7 @@ inline void SX1276Config::set_dio5(int8_t v) inline size_t HardwareConfig::getMaxSize() { // optional fixed32 magic, id 0 has maximum size 5 - // optional SystemConfig system, id 1 has maximum size 9 + // optional SystemConfig system, id 1 has maximum size 15 // unused repeated UartConfig uart, id 3 // optional AdcConfig adc, id 4 has maximum size 10 // unused optional TouchpadConfig touchpad, id 5 @@ -9170,6 +9985,7 @@ inline size_t HardwareConfig::getMaxSize() // repeated ButtonConfig button, id 16 has unlimited size // repeated RelayConfig relay, id 17 has unlimited size // repeated LedConfig led, id 18 has unlimited size + // optional BuzzerConfig buzzer, id 19 has maximum size 4 // optional Hlw8012Config hlw8012, id 20 has maximum size 11 // optional Max7219Config max7219, id 32 has maximum size 16 // optional Tlc5947Config tlc5947, id 33 has maximum size 17 @@ -9565,6 +10381,51 @@ inline size_t HardwareConfig::led_size() const #endif // CONFIG_LEDS +#ifdef CONFIG_BUZZER +inline const BuzzerConfig &HardwareConfig::buzzer() const +{ + return m_buzzer; +} + +inline bool HardwareConfig::has_buzzer() const +{ + return 0 != (p_validbits & ((uint16_t)1U << 3)); +} + +/*! + * Function for clearing the associated member variable. + * It will reset the value to the default value. + */ +inline void HardwareConfig::clear_buzzer() +{ + p_validbits &= ~((uint16_t)1U << 3); + m_buzzer.clear(); +} + +inline BuzzerConfig *HardwareConfig::mutable_buzzer() +{ + if (0 == (p_validbits & ((uint16_t)1U << 3))) { + p_validbits |= ((uint16_t)1U << 3); + m_buzzer.clear(); + } + return &m_buzzer; +} + +inline void HardwareConfig::set_buzzer(const void *data, size_t s) +{ + m_buzzer.fromMemory((const char *)data,s); + p_validbits |= ((uint16_t)1U << 3); +} + +inline void HardwareConfig::set_buzzer(const BuzzerConfig &v) +{ + m_buzzer = v; + p_validbits |= ((uint16_t)1U << 3); +} + +#endif // CONFIG_BUZZER + + #ifdef CONFIG_HLW8012 inline const Hlw8012Config &HardwareConfig::hlw8012() const { @@ -9573,7 +10434,7 @@ inline const Hlw8012Config &HardwareConfig::hlw8012() const inline bool HardwareConfig::has_hlw8012() const { - return 0 != (p_validbits & ((uint16_t)1U << 3)); + return 0 != (p_validbits & ((uint16_t)1U << 4)); } /*! @@ -9582,14 +10443,14 @@ inline bool HardwareConfig::has_hlw8012() const */ inline void HardwareConfig::clear_hlw8012() { - p_validbits &= ~((uint16_t)1U << 3); + p_validbits &= ~((uint16_t)1U << 4); m_hlw8012.clear(); } inline Hlw8012Config *HardwareConfig::mutable_hlw8012() { - if (0 == (p_validbits & ((uint16_t)1U << 3))) { - p_validbits |= ((uint16_t)1U << 3); + if (0 == (p_validbits & ((uint16_t)1U << 4))) { + p_validbits |= ((uint16_t)1U << 4); m_hlw8012.clear(); } return &m_hlw8012; @@ -9598,13 +10459,13 @@ inline Hlw8012Config *HardwareConfig::mutable_hlw8012() inline void HardwareConfig::set_hlw8012(const void *data, size_t s) { m_hlw8012.fromMemory((const char *)data,s); - p_validbits |= ((uint16_t)1U << 3); + p_validbits |= ((uint16_t)1U << 4); } inline void HardwareConfig::set_hlw8012(const Hlw8012Config &v) { m_hlw8012 = v; - p_validbits |= ((uint16_t)1U << 3); + p_validbits |= ((uint16_t)1U << 4); } #endif // CONFIG_HLW8012 @@ -9618,7 +10479,7 @@ inline const Max7219Config &HardwareConfig::max7219() const inline bool HardwareConfig::has_max7219() const { - return 0 != (p_validbits & ((uint16_t)1U << 4)); + return 0 != (p_validbits & ((uint16_t)1U << 5)); } /*! @@ -9627,14 +10488,14 @@ inline bool HardwareConfig::has_max7219() const */ inline void HardwareConfig::clear_max7219() { - p_validbits &= ~((uint16_t)1U << 4); + p_validbits &= ~((uint16_t)1U << 5); m_max7219.clear(); } inline Max7219Config *HardwareConfig::mutable_max7219() { - if (0 == (p_validbits & ((uint16_t)1U << 4))) { - p_validbits |= ((uint16_t)1U << 4); + if (0 == (p_validbits & ((uint16_t)1U << 5))) { + p_validbits |= ((uint16_t)1U << 5); m_max7219.clear(); } return &m_max7219; @@ -9643,13 +10504,13 @@ inline Max7219Config *HardwareConfig::mutable_max7219() inline void HardwareConfig::set_max7219(const void *data, size_t s) { m_max7219.fromMemory((const char *)data,s); - p_validbits |= ((uint16_t)1U << 4); + p_validbits |= ((uint16_t)1U << 5); } inline void HardwareConfig::set_max7219(const Max7219Config &v) { m_max7219 = v; - p_validbits |= ((uint16_t)1U << 4); + p_validbits |= ((uint16_t)1U << 5); } #endif // CONFIG_MAX7219 @@ -9663,7 +10524,7 @@ inline const Tlc5947Config &HardwareConfig::tlc5947() const inline bool HardwareConfig::has_tlc5947() const { - return 0 != (p_validbits & ((uint16_t)1U << 5)); + return 0 != (p_validbits & ((uint16_t)1U << 6)); } /*! @@ -9672,14 +10533,14 @@ inline bool HardwareConfig::has_tlc5947() const */ inline void HardwareConfig::clear_tlc5947() { - p_validbits &= ~((uint16_t)1U << 5); + p_validbits &= ~((uint16_t)1U << 6); m_tlc5947.clear(); } inline Tlc5947Config *HardwareConfig::mutable_tlc5947() { - if (0 == (p_validbits & ((uint16_t)1U << 5))) { - p_validbits |= ((uint16_t)1U << 5); + if (0 == (p_validbits & ((uint16_t)1U << 6))) { + p_validbits |= ((uint16_t)1U << 6); m_tlc5947.clear(); } return &m_tlc5947; @@ -9688,13 +10549,13 @@ inline Tlc5947Config *HardwareConfig::mutable_tlc5947() inline void HardwareConfig::set_tlc5947(const void *data, size_t s) { m_tlc5947.fromMemory((const char *)data,s); - p_validbits |= ((uint16_t)1U << 5); + p_validbits |= ((uint16_t)1U << 6); } inline void HardwareConfig::set_tlc5947(const Tlc5947Config &v) { m_tlc5947 = v; - p_validbits |= ((uint16_t)1U << 5); + p_validbits |= ((uint16_t)1U << 6); } #endif // CONFIG_TLC5947 @@ -9760,7 +10621,7 @@ inline const DhtConfig &HardwareConfig::dht() const inline bool HardwareConfig::has_dht() const { - return 0 != (p_validbits & ((uint16_t)1U << 6)); + return 0 != (p_validbits & ((uint16_t)1U << 7)); } /*! @@ -9769,14 +10630,14 @@ inline bool HardwareConfig::has_dht() const */ inline void HardwareConfig::clear_dht() { - p_validbits &= ~((uint16_t)1U << 6); + p_validbits &= ~((uint16_t)1U << 7); m_dht.clear(); } inline DhtConfig *HardwareConfig::mutable_dht() { - if (0 == (p_validbits & ((uint16_t)1U << 6))) { - p_validbits |= ((uint16_t)1U << 6); + if (0 == (p_validbits & ((uint16_t)1U << 7))) { + p_validbits |= ((uint16_t)1U << 7); m_dht.clear(); } return &m_dht; @@ -9785,13 +10646,13 @@ inline DhtConfig *HardwareConfig::mutable_dht() inline void HardwareConfig::set_dht(const void *data, size_t s) { m_dht.fromMemory((const char *)data,s); - p_validbits |= ((uint16_t)1U << 6); + p_validbits |= ((uint16_t)1U << 7); } inline void HardwareConfig::set_dht(const DhtConfig &v) { m_dht = v; - p_validbits |= ((uint16_t)1U << 6); + p_validbits |= ((uint16_t)1U << 7); } #endif // CONFIG_DHT @@ -9909,7 +10770,7 @@ inline const OneWireConfig &HardwareConfig::onewire() const inline bool HardwareConfig::has_onewire() const { - return 0 != (p_validbits & ((uint16_t)1U << 7)); + return 0 != (p_validbits & ((uint16_t)1U << 8)); } /*! @@ -9918,14 +10779,14 @@ inline bool HardwareConfig::has_onewire() const */ inline void HardwareConfig::clear_onewire() { - p_validbits &= ~((uint16_t)1U << 7); + p_validbits &= ~((uint16_t)1U << 8); m_onewire.clear(); } inline OneWireConfig *HardwareConfig::mutable_onewire() { - if (0 == (p_validbits & ((uint16_t)1U << 7))) { - p_validbits |= ((uint16_t)1U << 7); + if (0 == (p_validbits & ((uint16_t)1U << 8))) { + p_validbits |= ((uint16_t)1U << 8); m_onewire.clear(); } return &m_onewire; @@ -9934,13 +10795,13 @@ inline OneWireConfig *HardwareConfig::mutable_onewire() inline void HardwareConfig::set_onewire(const void *data, size_t s) { m_onewire.fromMemory((const char *)data,s); - p_validbits |= ((uint16_t)1U << 7); + p_validbits |= ((uint16_t)1U << 8); } inline void HardwareConfig::set_onewire(const OneWireConfig &v) { m_onewire = v; - p_validbits |= ((uint16_t)1U << 7); + p_validbits |= ((uint16_t)1U << 8); } #endif // CONFIG_ONEWIRE @@ -9954,7 +10815,7 @@ inline const SX1276Config &HardwareConfig::sx1276() const inline bool HardwareConfig::has_sx1276() const { - return 0 != (p_validbits & ((uint16_t)1U << 8)); + return 0 != (p_validbits & ((uint16_t)1U << 9)); } /*! @@ -9963,14 +10824,14 @@ inline bool HardwareConfig::has_sx1276() const */ inline void HardwareConfig::clear_sx1276() { - p_validbits &= ~((uint16_t)1U << 8); + p_validbits &= ~((uint16_t)1U << 9); m_sx1276.clear(); } inline SX1276Config *HardwareConfig::mutable_sx1276() { - if (0 == (p_validbits & ((uint16_t)1U << 8))) { - p_validbits |= ((uint16_t)1U << 8); + if (0 == (p_validbits & ((uint16_t)1U << 9))) { + p_validbits |= ((uint16_t)1U << 9); m_sx1276.clear(); } return &m_sx1276; @@ -9979,13 +10840,13 @@ inline SX1276Config *HardwareConfig::mutable_sx1276() inline void HardwareConfig::set_sx1276(const void *data, size_t s) { m_sx1276.fromMemory((const char *)data,s); - p_validbits |= ((uint16_t)1U << 8); + p_validbits |= ((uint16_t)1U << 9); } inline void HardwareConfig::set_sx1276(const SX1276Config &v) { m_sx1276 = v; - p_validbits |= ((uint16_t)1U << 8); + p_validbits |= ((uint16_t)1U << 9); } #endif // CONFIG_SX1276 @@ -10051,7 +10912,7 @@ inline const DisplayConfig &HardwareConfig::display() const inline bool HardwareConfig::has_display() const { - return 0 != (p_validbits & ((uint16_t)1U << 9)); + return 0 != (p_validbits & ((uint16_t)1U << 10)); } /*! @@ -10060,14 +10921,14 @@ inline bool HardwareConfig::has_display() const */ inline void HardwareConfig::clear_display() { - p_validbits &= ~((uint16_t)1U << 9); + p_validbits &= ~((uint16_t)1U << 10); m_display.clear(); } inline DisplayConfig *HardwareConfig::mutable_display() { - if (0 == (p_validbits & ((uint16_t)1U << 9))) { - p_validbits |= ((uint16_t)1U << 9); + if (0 == (p_validbits & ((uint16_t)1U << 10))) { + p_validbits |= ((uint16_t)1U << 10); m_display.clear(); } return &m_display; @@ -10076,13 +10937,13 @@ inline DisplayConfig *HardwareConfig::mutable_display() inline void HardwareConfig::set_display(const void *data, size_t s) { m_display.fromMemory((const char *)data,s); - p_validbits |= ((uint16_t)1U << 9); + p_validbits |= ((uint16_t)1U << 10); } inline void HardwareConfig::set_display(const DisplayConfig &v) { m_display = v; - p_validbits |= ((uint16_t)1U << 9); + p_validbits |= ((uint16_t)1U << 10); } #endif // CONFIG_DISPLAY diff --git a/components/wfc/hwcfg_esp8285.cpp b/components/wfc/hwcfg_esp8285.cpp index 5556fa4..ec9a987 100644 --- a/components/wfc/hwcfg_esp8285.cpp +++ b/components/wfc/hwcfg_esp8285.cpp @@ -1,8 +1,8 @@ /**************************************************************************** * * Code generated by Wire-Format-Compiler (WFC) - * WFC Version: P2304 (hg:456/095c4982cbea) - * WFC is Copyright 2015-2022, Thomas Maier-Komor + * WFC Version: P2304.3 (hg:459/5fefa02bc543) + * WFC is Copyright 2015-2023, Thomas Maier-Komor * * Source Information: * =================== @@ -10,7 +10,7 @@ * Copyright: 2018-2023 * Author : Thomas Maier-Komor * - * Code generated on 2023-10-24, 21:26:42 (CET). + * Code generated on 2023-11-26, 14:29:43 (CET). * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -612,6 +612,12 @@ void SystemConfig::clear() #ifdef CONFIG_USB_CONSOLE m_usb_con = true; #endif // CONFIG_USB_CONSOLE + #ifdef CONFIG_ESP_PHY_ENABLE_USB + m_cc1_gpio = -1; + #endif // CONFIG_ESP_PHY_ENABLE_USB + #ifdef CONFIG_ESP_PHY_ENABLE_USB + m_cc2_gpio = -1; + #endif // CONFIG_ESP_PHY_ENABLE_USB p_validbits = 0; } @@ -633,6 +639,12 @@ void SystemConfig::toASCII(stream &o, size_t indent) const #ifdef CONFIG_USB_CONSOLE ascii_bool(o, indent, "usb_con", m_usb_con); #endif // CONFIG_USB_CONSOLE + #ifdef CONFIG_ESP_PHY_ENABLE_USB + ascii_numeric(o, indent, "cc1_gpio", (signed) m_cc1_gpio); + #endif // CONFIG_ESP_PHY_ENABLE_USB + #ifdef CONFIG_ESP_PHY_ENABLE_USB + ascii_numeric(o, indent, "cc2_gpio", (signed) m_cc2_gpio); + #endif // CONFIG_ESP_PHY_ENABLE_USB --indent; ascii_indent(o,indent); o << '}'; @@ -704,6 +716,16 @@ ssize_t SystemConfig::fromMemory(const void *b, ssize_t s) set_usb_con(ud.u8); break; #endif // CONFIG_USB_CONSOLE + #ifdef CONFIG_ESP_PHY_ENABLE_USB + case 0x58: // cc1_gpio id 11, type int8_t, coding signed varint + set_cc1_gpio(varint_sint(ud.u8)); + break; + #endif // CONFIG_ESP_PHY_ENABLE_USB + #ifdef CONFIG_ESP_PHY_ENABLE_USB + case 0x60: // cc2_gpio id 12, type int8_t, coding signed varint + set_cc2_gpio(varint_sint(ud.u8)); + break; + #endif // CONFIG_ESP_PHY_ENABLE_USB default: if ((fid & 7) == 2) { // need only to skip len prefixed data @@ -832,6 +854,32 @@ ssize_t SystemConfig::toMemory(uint8_t *b, ssize_t s) const *a++ = m_usb_con; } #endif // CONFIG_USB_CONSOLE + #ifdef CONFIG_ESP_PHY_ENABLE_USB + // has cc1_gpio? + if (m_cc1_gpio != -1) { + // 'cc1_gpio': id=11, encoding=varint, tag=0x58 + if (a >= e) + return -27; + *a++ = 0x58; + n = write_varint(a,e-a,sint_varint(m_cc1_gpio)); + if (n <= 0) + return -28; + a += n; + } + #endif // CONFIG_ESP_PHY_ENABLE_USB + #ifdef CONFIG_ESP_PHY_ENABLE_USB + // has cc2_gpio? + if (m_cc2_gpio != -1) { + // 'cc2_gpio': id=12, encoding=varint, tag=0x60 + if (a >= e) + return -29; + *a++ = 0x60; + n = write_varint(a,e-a,sint_varint(m_cc2_gpio)); + if (n <= 0) + return -30; + a += n; + } + #endif // CONFIG_ESP_PHY_ENABLE_USB assert(a <= e); return a-b; } @@ -884,6 +932,18 @@ void SystemConfig::toJSON(stream &json, unsigned indLvl) const json << (m_usb_con ? "true" : "false"); } #endif // CONFIG_USB_CONSOLE + #ifdef CONFIG_ESP_PHY_ENABLE_USB + if (has_cc1_gpio()) { + fsep = json_indent(json,indLvl,fsep,"cc1_gpio"); + to_decstr(json,(int) m_cc1_gpio); + } + #endif // CONFIG_ESP_PHY_ENABLE_USB + #ifdef CONFIG_ESP_PHY_ENABLE_USB + if (has_cc2_gpio()) { + fsep = json_indent(json,indLvl,fsep,"cc2_gpio"); + to_decstr(json,(int) m_cc2_gpio); + } + #endif // CONFIG_ESP_PHY_ENABLE_USB if (fsep == '{') json.put('{'); json.put('\n'); @@ -946,6 +1006,18 @@ size_t SystemConfig::calcSize() const r += 2; } #endif // CONFIG_USB_CONSOLE + #ifdef CONFIG_ESP_PHY_ENABLE_USB + // optional sint8 cc1_gpio, id 11 + if (has_cc1_gpio()) { + r += wiresize_s((varint_t)m_cc1_gpio) + 1 /* tag(cc1_gpio) 0x58 */; + } + #endif // CONFIG_ESP_PHY_ENABLE_USB + #ifdef CONFIG_ESP_PHY_ENABLE_USB + // optional sint8 cc2_gpio, id 12 + if (has_cc2_gpio()) { + r += wiresize_s((varint_t)m_cc2_gpio) + 1 /* tag(cc2_gpio) 0x60 */; + } + #endif // CONFIG_ESP_PHY_ENABLE_USB return r; } @@ -977,6 +1049,14 @@ bool SystemConfig::operator == (const SystemConfig &r) const if (has_usb_con() && (!(m_usb_con == r.m_usb_con))) return false; #endif // CONFIG_USB_CONSOLE + #ifdef CONFIG_ESP_PHY_ENABLE_USB + if (has_cc1_gpio() && (!(m_cc1_gpio == r.m_cc1_gpio))) + return false; + #endif // CONFIG_ESP_PHY_ENABLE_USB + #ifdef CONFIG_ESP_PHY_ENABLE_USB + if (has_cc2_gpio() && (!(m_cc2_gpio == r.m_cc2_gpio))) + return false; + #endif // CONFIG_ESP_PHY_ENABLE_USB return true; } @@ -1083,7 +1163,27 @@ int SystemConfig::setByName(const char *name, const char *value) return r; } #endif // CONFIG_USB_CONSOLE - return -27; + #ifdef CONFIG_ESP_PHY_ENABLE_USB + if (0 == strcmp(name,"cc1_gpio")) { + if (value == 0) { + clear_cc1_gpio(); + return 0; + } + int r = parse_ascii_s8(&m_cc1_gpio,value); + return r; + } + #endif // CONFIG_ESP_PHY_ENABLE_USB + #ifdef CONFIG_ESP_PHY_ENABLE_USB + if (0 == strcmp(name,"cc2_gpio")) { + if (value == 0) { + clear_cc2_gpio(); + return 0; + } + int r = parse_ascii_s8(&m_cc2_gpio,value); + return r; + } + #endif // CONFIG_ESP_PHY_ENABLE_USB + return -31; } TouchpadConfig::TouchpadConfig() @@ -1123,7 +1223,7 @@ ssize_t TouchpadConfig::fromMemory(const void *b, ssize_t s) union decode_union ud; ssize_t x = decode_early(a,e,&ud,&fid); if (x < 0) - return -28; + return -32; a += x; switch (fid) { case 0xb: // fsm_mode id 1, type bool, coding 8bit @@ -1146,13 +1246,13 @@ ssize_t TouchpadConfig::fromMemory(const void *b, ssize_t s) // need only to skip len prefixed data a += ud.vi; if (a > e) - return -29; + return -33; } } } assert((a-(const uint8_t *)b) == s); if (a > e) - return -30; + return -34; return a-(const uint8_t *)b; } @@ -1165,7 +1265,7 @@ ssize_t TouchpadConfig::toMemory(uint8_t *b, ssize_t s) const if (m_fsm_mode != false) { // 'fsm_mode': id=1, encoding=8bit, tag=0xb if (2 > (e-a)) - return -31; + return -35; *a++ = 0xb; *a++ = m_fsm_mode; } @@ -1173,44 +1273,44 @@ ssize_t TouchpadConfig::toMemory(uint8_t *b, ssize_t s) const if (m_lvolt != -1) { // 'lvolt': id=2, encoding=varint, tag=0x10 if (a >= e) - return -32; + return -36; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_lvolt)); if (n <= 0) - return -33; + return -37; a += n; } // has hvolt? if (m_hvolt != -1) { // 'hvolt': id=3, encoding=varint, tag=0x18 if (a >= e) - return -34; + return -38; *a++ = 0x18; n = write_varint(a,e-a,sint_varint(m_hvolt)); if (n <= 0) - return -35; + return -39; a += n; } // has atten? if (m_atten != -1) { // 'atten': id=4, encoding=varint, tag=0x20 if (a >= e) - return -36; + return -40; *a++ = 0x20; n = write_varint(a,e-a,sint_varint(m_atten)); if (n <= 0) - return -37; + return -41; a += n; } // has interval? if (0 != (p_validbits & ((uint8_t)1U << 0))) { // 'interval': id=7, encoding=varint, tag=0x38 if (a >= e) - return -38; + return -42; *a++ = 0x38; n = write_varint(a,e-a,m_interval); if (n <= 0) - return -39; + return -43; a += n; } assert(a <= e); @@ -1346,7 +1446,7 @@ int TouchpadConfig::setByName(const char *name, const char *value) p_validbits |= ((uint8_t)1U << 0); return r; } - return -40; + return -44; } TouchChannelConfig::TouchChannelConfig() @@ -1386,12 +1486,12 @@ ssize_t TouchChannelConfig::fromMemory(const void *b, ssize_t s) union decode_union ud; ssize_t x = decode_early(a,e,&ud,&fid); if (x < 0) - return -41; + return -45; a += x; switch (fid) { case 0xa: // name id 1, type estring, coding byte[] if ((ssize_t)ud.vi > e-a) { - return -42; + return -46; } m_name.assign((const char*)a,ud.vi); a += ud.vi; @@ -1413,13 +1513,13 @@ ssize_t TouchChannelConfig::fromMemory(const void *b, ssize_t s) // need only to skip len prefixed data a += ud.vi; if (a > e) - return -43; + return -47; } } } assert((a-(const uint8_t *)b) == s); if (a > e) - return -44; + return -48; return a-(const uint8_t *)b; } @@ -1432,29 +1532,29 @@ ssize_t TouchChannelConfig::toMemory(uint8_t *b, ssize_t s) const if (!m_name.empty()) { // 'name': id=1, encoding=lenpfx, tag=0xa if (a >= e) - return -45; + return -49; *a++ = 0xa; n = encode_bytes(m_name,a,e); if (n < 0) - return -46; + return -50; a += n; } // has channel? if (m_channel != -1) { // 'channel': id=2, encoding=varint, tag=0x10 if (a >= e) - return -47; + return -51; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_channel)); if (n <= 0) - return -48; + return -52; a += n; } // has threshold? if (0 != (p_validbits & ((uint8_t)1U << 0))) { // 'threshold': id=3, encoding=16bit, tag=0x1c if (3 > (e-a)) - return -49; + return -53; *a++ = 0x1c; write_u16(a,m_threshold); a += 2; @@ -1463,22 +1563,22 @@ ssize_t TouchChannelConfig::toMemory(uint8_t *b, ssize_t s) const if (0 != (p_validbits & ((uint8_t)1U << 1))) { // 'slope': id=4, encoding=varint, tag=0x20 if (a >= e) - return -50; + return -54; *a++ = 0x20; n = write_varint(a,e-a,m_slope); if (n <= 0) - return -51; + return -55; a += n; } // has tieopt? if (0 != (p_validbits & ((uint8_t)1U << 2))) { // 'tieopt': id=5, encoding=varint, tag=0x28 if (a >= e) - return -52; + return -56; *a++ = 0x28; n = write_varint(a,e-a,m_tieopt); if (n <= 0) - return -53; + return -57; a += n; } assert(a <= e); @@ -1620,7 +1720,7 @@ int TouchChannelConfig::setByName(const char *name, const char *value) p_validbits |= ((uint8_t)1U << 2); return r; } - return -54; + return -58; } ButtonConfig::ButtonConfig() @@ -1677,12 +1777,12 @@ ssize_t ButtonConfig::fromMemory(const void *b, ssize_t s) union decode_union ud; ssize_t x = decode_early(a,e,&ud,&fid); if (x < 0) - return -55; + return -59; a += x; switch (fid) { case 0xa: // name id 1, type estring, coding byte[] if ((ssize_t)ud.vi > e-a) { - return -56; + return -60; } m_name.assign((const char*)a,ud.vi); a += ud.vi; @@ -1711,13 +1811,13 @@ ssize_t ButtonConfig::fromMemory(const void *b, ssize_t s) // need only to skip len prefixed data a += ud.vi; if (a > e) - return -57; + return -61; } } } assert((a-(const uint8_t *)b) == s); if (a > e) - return -58; + return -62; return a-(const uint8_t *)b; } @@ -1730,29 +1830,29 @@ ssize_t ButtonConfig::toMemory(uint8_t *b, ssize_t s) const if (!m_name.empty()) { // 'name': id=1, encoding=lenpfx, tag=0xa if (a >= e) - return -59; + return -63; *a++ = 0xa; n = encode_bytes(m_name,a,e); if (n < 0) - return -60; + return -64; a += n; } // has gpio? if (m_gpio != -1) { // 'gpio': id=2, encoding=varint, tag=0x10 if (a >= e) - return -61; + return -65; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_gpio)); if (n <= 0) - return -62; + return -66; a += n; } // has presslvl? if (m_presslvl != 0) { // 'presslvl': id=3, encoding=8bit, tag=0x1b if (2 > (e-a)) - return -63; + return -67; *a++ = 0x1b; *a++ = m_presslvl; } @@ -1760,11 +1860,11 @@ ssize_t ButtonConfig::toMemory(uint8_t *b, ssize_t s) const if (m_pull_mode != pull_none) { // 'pull_mode': id=4, encoding=varint, tag=0x20 if (a >= e) - return -64; + return -68; *a++ = 0x20; n = write_varint(a,e-a,m_pull_mode); if (n <= 0) - return -65; + return -69; a += n; } #ifdef CONFIG_ROTARYENCODER @@ -1772,11 +1872,11 @@ ssize_t ButtonConfig::toMemory(uint8_t *b, ssize_t s) const if (m_clk != -1) { // 'clk': id=5, encoding=varint, tag=0x28 if (a >= e) - return -66; + return -70; *a++ = 0x28; n = write_varint(a,e-a,sint_varint(m_clk)); if (n <= 0) - return -67; + return -71; a += n; } #endif // CONFIG_ROTARYENCODER @@ -1785,11 +1885,11 @@ ssize_t ButtonConfig::toMemory(uint8_t *b, ssize_t s) const if (m_dt != -1) { // 'dt': id=6, encoding=varint, tag=0x30 if (a >= e) - return -68; + return -72; *a++ = 0x30; n = write_varint(a,e-a,sint_varint(m_dt)); if (n <= 0) - return -69; + return -73; a += n; } #endif // CONFIG_ROTARYENCODER @@ -1943,23 +2043,21 @@ int ButtonConfig::setByName(const char *name, const char *value) set_pull_mode_up((bool)ull); return eptr - value; } - #ifndef CONFIG_ESPTOOLPY_FLASHSIZE_1MB if (*name++ != '.') { - return -70; + return -74; } else if (!strcmp(name,"enable")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_pull_mode(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_pull_mode_enable(tmp); return r; } else if (!strcmp(name,"up")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_pull_mode(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_pull_mode_up(tmp); return r; } - #endif // !CONFIG_ESPTOOLPY_FLASHSIZE_1MB } #ifdef CONFIG_ROTARYENCODER if (0 == strcmp(name,"clk")) { @@ -1981,7 +2079,7 @@ int ButtonConfig::setByName(const char *name, const char *value) return r; } #endif // CONFIG_ROTARYENCODER - return -71; + return -75; } RelayConfig::RelayConfig() @@ -2038,12 +2136,12 @@ ssize_t RelayConfig::fromMemory(const void *b, ssize_t s) union decode_union ud; ssize_t x = decode_early(a,e,&ud,&fid); if (x < 0) - return -72; + return -76; a += x; switch (fid) { case 0xa: // name id 1, type estring, coding byte[] if ((ssize_t)ud.vi > e-a) { - return -73; + return -77; } m_name.assign((const char*)a,ud.vi); a += ud.vi; @@ -2065,13 +2163,13 @@ ssize_t RelayConfig::fromMemory(const void *b, ssize_t s) // need only to skip len prefixed data a += ud.vi; if (a > e) - return -74; + return -78; } } } assert((a-(const uint8_t *)b) == s); if (a > e) - return -75; + return -79; return a-(const uint8_t *)b; } @@ -2084,55 +2182,55 @@ ssize_t RelayConfig::toMemory(uint8_t *b, ssize_t s) const if (!m_name.empty()) { // 'name': id=1, encoding=lenpfx, tag=0xa if (a >= e) - return -76; + return -80; *a++ = 0xa; n = encode_bytes(m_name,a,e); if (n < 0) - return -77; + return -81; a += n; } // has gpio? if (m_gpio != -1) { // 'gpio': id=2, encoding=varint, tag=0x10 if (a >= e) - return -78; + return -82; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_gpio)); if (n <= 0) - return -79; + return -83; a += n; } // has config? if (m_config != 0) { // 'config': id=3, encoding=varint, tag=0x18 if (a >= e) - return -80; + return -84; *a++ = 0x18; n = write_varint(a,e-a,m_config); if (n <= 0) - return -81; + return -85; a += n; } // has min_itv? if (0 != (p_validbits & ((uint8_t)1U << 0))) { // 'min_itv': id=4, encoding=varint, tag=0x20 if (a >= e) - return -82; + return -86; *a++ = 0x20; n = write_varint(a,e-a,m_min_itv); if (n <= 0) - return -83; + return -87; a += n; } // has interlock? if (m_interlock != -1) { // 'interlock': id=5, encoding=varint, tag=0x28 if (a >= e) - return -84; + return -88; *a++ = 0x28; n = write_varint(a,e-a,sint_varint(m_interlock)); if (n <= 0) - return -85; + return -89; a += n; } assert(a <= e); @@ -2263,41 +2361,39 @@ int RelayConfig::setByName(const char *name, const char *value) set_config_mqtt((bool)ull); return eptr - value; } - #ifndef CONFIG_ESPTOOLPY_FLASHSIZE_1MB if (*name++ != '.') { - return -86; + return -90; } else if (!strcmp(name,"active_high")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_active_high(tmp); return r; } else if (!strcmp(name,"init_on")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_init_on(tmp); return r; } else if (!strcmp(name,"persistent")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_persistent(tmp); return r; } else if (!strcmp(name,"opendrain")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_opendrain(tmp); return r; } else if (!strcmp(name,"mqtt")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_mqtt(tmp); return r; } - #endif // !CONFIG_ESPTOOLPY_FLASHSIZE_1MB } if (0 == strcmp(name,"min_itv")) { if (value == 0) { @@ -2317,7 +2413,7 @@ int RelayConfig::setByName(const char *name, const char *value) int r = parse_ascii_s8(&m_interlock,value); return r; } - return -87; + return -91; } Max7219Config::Max7219Config() @@ -2356,7 +2452,7 @@ ssize_t Max7219Config::fromMemory(const void *b, ssize_t s) union decode_union ud; ssize_t x = decode_early(a,e,&ud,&fid); if (x < 0) - return -88; + return -92; a += x; switch (fid) { case 0x8: // clk id 1, type int8_t, coding signed varint @@ -2379,13 +2475,13 @@ ssize_t Max7219Config::fromMemory(const void *b, ssize_t s) // need only to skip len prefixed data a += ud.vi; if (a > e) - return -89; + return -93; } } } assert((a-(const uint8_t *)b) == s); if (a > e) - return -90; + return -94; return a-(const uint8_t *)b; } @@ -2398,40 +2494,40 @@ ssize_t Max7219Config::toMemory(uint8_t *b, ssize_t s) const if (m_clk != -1) { // 'clk': id=1, encoding=varint, tag=0x8 if (a >= e) - return -91; + return -95; *a++ = 0x8; n = write_varint(a,e-a,sint_varint(m_clk)); if (n <= 0) - return -92; + return -96; a += n; } // has dout? if (m_dout != -1) { // 'dout': id=2, encoding=varint, tag=0x10 if (a >= e) - return -93; + return -97; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_dout)); if (n <= 0) - return -94; + return -98; a += n; } // has cs? if (m_cs != -1) { // 'cs': id=3, encoding=varint, tag=0x18 if (a >= e) - return -95; + return -99; *a++ = 0x18; n = write_varint(a,e-a,sint_varint(m_cs)); if (n <= 0) - return -96; + return -100; a += n; } // has odrain? if (m_odrain != false) { // 'odrain': id=4, encoding=8bit, tag=0x23 if (2 > (e-a)) - return -97; + return -101; *a++ = 0x23; *a++ = m_odrain; } @@ -2439,11 +2535,11 @@ ssize_t Max7219Config::toMemory(uint8_t *b, ssize_t s) const if (m_digits != 0) { // 'digits': id=5, encoding=varint, tag=0x28 if (a >= e) - return -98; + return -102; *a++ = 0x28; n = write_varint(a,e-a,m_digits); if (n <= 0) - return -99; + return -103; a += n; } assert(a <= e); @@ -2575,7 +2671,7 @@ int Max7219Config::setByName(const char *name, const char *value) int r = parse_ascii_u8(&m_digits,value); return r; } - return -100; + return -104; } Tlc5947Config::Tlc5947Config() @@ -2614,7 +2710,7 @@ ssize_t Tlc5947Config::fromMemory(const void *b, ssize_t s) union decode_union ud; ssize_t x = decode_early(a,e,&ud,&fid); if (x < 0) - return -101; + return -105; a += x; switch (fid) { case 0x8: // sin id 1, type int8_t, coding signed varint @@ -2637,13 +2733,13 @@ ssize_t Tlc5947Config::fromMemory(const void *b, ssize_t s) // need only to skip len prefixed data a += ud.vi; if (a > e) - return -102; + return -106; } } } assert((a-(const uint8_t *)b) == s); if (a > e) - return -103; + return -107; return a-(const uint8_t *)b; } @@ -2656,55 +2752,55 @@ ssize_t Tlc5947Config::toMemory(uint8_t *b, ssize_t s) const if (m_sin != -1) { // 'sin': id=1, encoding=varint, tag=0x8 if (a >= e) - return -104; + return -108; *a++ = 0x8; n = write_varint(a,e-a,sint_varint(m_sin)); if (n <= 0) - return -105; + return -109; a += n; } // has sclk? if (m_sclk != -1) { // 'sclk': id=2, encoding=varint, tag=0x10 if (a >= e) - return -106; + return -110; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_sclk)); if (n <= 0) - return -107; + return -111; a += n; } // has xlat? if (m_xlat != -1) { // 'xlat': id=3, encoding=varint, tag=0x18 if (a >= e) - return -108; + return -112; *a++ = 0x18; n = write_varint(a,e-a,sint_varint(m_xlat)); if (n <= 0) - return -109; + return -113; a += n; } // has blank? if (m_blank != -1) { // 'blank': id=4, encoding=varint, tag=0x20 if (a >= e) - return -110; + return -114; *a++ = 0x20; n = write_varint(a,e-a,sint_varint(m_blank)); if (n <= 0) - return -111; + return -115; a += n; } // has ntlc? if (m_ntlc != 0) { // 'ntlc': id=5, encoding=varint, tag=0x28 if (a >= e) - return -112; + return -116; *a++ = 0x28; n = write_varint(a,e-a,m_ntlc); if (n <= 0) - return -113; + return -117; a += n; } assert(a <= e); @@ -2836,7 +2932,7 @@ int Tlc5947Config::setByName(const char *name, const char *value) int r = parse_ascii_u8(&m_ntlc,value); return r; } - return -114; + return -118; } Ws2812bConfig::Ws2812bConfig() @@ -2871,7 +2967,7 @@ ssize_t Ws2812bConfig::fromMemory(const void *b, ssize_t s) union decode_union ud; ssize_t x = decode_early(a,e,&ud,&fid); if (x < 0) - return -115; + return -119; a += x; switch (fid) { case 0x8: // gpio id 1, type int8_t, coding signed varint @@ -2882,7 +2978,7 @@ ssize_t Ws2812bConfig::fromMemory(const void *b, ssize_t s) break; case 0x22: // name id 4, type estring, coding byte[] if ((ssize_t)ud.vi > e-a) { - return -116; + return -120; } m_name.assign((const char*)a,ud.vi); a += ud.vi; @@ -2892,13 +2988,13 @@ ssize_t Ws2812bConfig::fromMemory(const void *b, ssize_t s) // need only to skip len prefixed data a += ud.vi; if (a > e) - return -117; + return -121; } } } assert((a-(const uint8_t *)b) == s); if (a > e) - return -118; + return -122; return a-(const uint8_t *)b; } @@ -2911,11 +3007,11 @@ ssize_t Ws2812bConfig::toMemory(uint8_t *b, ssize_t s) const if (m_gpio != -1) { // 'gpio': id=1, encoding=varint, tag=0x8 if (a >= e) - return -119; + return -123; *a++ = 0x8; n = write_varint(a,e-a,sint_varint(m_gpio)); if (n <= 0) - return -120; + return -124; a += n; } // 'ch' is unused. Therefore no data will be written. @@ -2923,22 +3019,22 @@ ssize_t Ws2812bConfig::toMemory(uint8_t *b, ssize_t s) const if (m_nleds != 0) { // 'nleds': id=3, encoding=varint, tag=0x18 if (a >= e) - return -121; + return -125; *a++ = 0x18; n = write_varint(a,e-a,m_nleds); if (n <= 0) - return -122; + return -126; a += n; } // has name? if (!m_name.empty()) { // 'name': id=4, encoding=lenpfx, tag=0x22 if (a >= e) - return -123; + return -127; *a++ = 0x22; n = encode_bytes(m_name,a,e); if (n < 0) - return -124; + return -128; a += n; } assert(a <= e); @@ -3037,7 +3133,7 @@ int Ws2812bConfig::setByName(const char *name, const char *value) int r = m_name.size(); return r; } - return -125; + return -129; } DhtConfig::DhtConfig() @@ -3075,7 +3171,7 @@ ssize_t DhtConfig::fromMemory(const void *b, ssize_t s) union decode_union ud; ssize_t x = decode_early(a,e,&ud,&fid); if (x < 0) - return -126; + return -130; a += x; switch (fid) { case 0x8: // model id 1, type dht_model_t, coding varint @@ -3089,13 +3185,13 @@ ssize_t DhtConfig::fromMemory(const void *b, ssize_t s) // need only to skip len prefixed data a += ud.vi; if (a > e) - return -127; + return -131; } } } assert((a-(const uint8_t *)b) == s); if (a > e) - return -128; + return -132; return a-(const uint8_t *)b; } @@ -3108,22 +3204,22 @@ ssize_t DhtConfig::toMemory(uint8_t *b, ssize_t s) const if (m_model != DHT_NONE) { // 'model': id=1, encoding=varint, tag=0x8 if (a >= e) - return -129; + return -133; *a++ = 0x8; n = write_varint(a,e-a,m_model); if (n <= 0) - return -130; + return -134; a += n; } // has gpio? if (m_gpio != -1) { // 'gpio': id=2, encoding=varint, tag=0x10 if (a >= e) - return -131; + return -135; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_gpio)); if (n <= 0) - return -132; + return -136; a += n; } assert(a <= e); @@ -3199,7 +3295,7 @@ int DhtConfig::setByName(const char *name, const char *value) dht_model_t v; size_t r = parse_ascii_dht_model_t(&v,value); if (r == 0) - return -133; + return -137; set_model(v); return r; } @@ -3211,7 +3307,7 @@ int DhtConfig::setByName(const char *name, const char *value) int r = parse_ascii_s8(&m_gpio,value); return r; } - return -134; + return -138; } I2CConfig::I2CConfig() @@ -3280,7 +3376,7 @@ ssize_t I2CConfig::fromMemory(const void *b, ssize_t s) union decode_union ud; ssize_t x = decode_early(a,e,&ud,&fid); if (x < 0) - return -135; + return -139; a += x; switch (fid) { case 0x8: // port id 1, type uint8_t, coding varint @@ -3303,7 +3399,7 @@ ssize_t I2CConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -136; + return -140; a += n; m_devices.push_back((i2cdev_t)v); } while (a < ae); @@ -3315,13 +3411,13 @@ ssize_t I2CConfig::fromMemory(const void *b, ssize_t s) // need only to skip len prefixed data a += ud.vi; if (a > e) - return -137; + return -141; } } } assert((a-(const uint8_t *)b) == s); if (a > e) - return -138; + return -142; return a-(const uint8_t *)b; } @@ -3334,33 +3430,33 @@ ssize_t I2CConfig::toMemory(uint8_t *b, ssize_t s) const if (0 != (p_validbits & ((uint8_t)1U << 0))) { // 'port': id=1, encoding=varint, tag=0x8 if (a >= e) - return -139; + return -143; *a++ = 0x8; n = write_varint(a,e-a,m_port); if (n <= 0) - return -140; + return -144; a += n; } // has sda? if (m_sda != -1) { // 'sda': id=2, encoding=varint, tag=0x10 if (a >= e) - return -141; + return -145; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_sda)); if (n <= 0) - return -142; + return -146; a += n; } // has scl? if (m_scl != -1) { // 'scl': id=3, encoding=varint, tag=0x18 if (a >= e) - return -143; + return -147; *a++ = 0x18; n = write_varint(a,e-a,sint_varint(m_scl)); if (n <= 0) - return -144; + return -148; a += n; } // 'freq' is unused. Therefore no data will be written. @@ -3368,7 +3464,7 @@ ssize_t I2CConfig::toMemory(uint8_t *b, ssize_t s) const if (m_xpullup != false) { // 'xpullup': id=5, encoding=8bit, tag=0x2b if (2 > (e-a)) - return -145; + return -149; *a++ = 0x2b; *a++ = m_xpullup; } @@ -3376,7 +3472,7 @@ ssize_t I2CConfig::toMemory(uint8_t *b, ssize_t s) const if (size_t devices_ne = m_devices.size()) { // 'devices': id=6, encoding=lenpfx, tag=0x32 if (a >= e) - return -146; + return -150; *a++ = 0x32; ssize_t devices_ws = 0; for (size_t x = 0; x != devices_ne; ++x) @@ -3384,7 +3480,7 @@ ssize_t I2CConfig::toMemory(uint8_t *b, ssize_t s) const n = write_varint(a,e-a,devices_ws); a += n; if ((n <= 0) || (devices_ws > (e-a))) - return -147; + return -151; for (size_t x = 0; x != devices_ne; ++x) a += write_varint(a,e-a,m_devices[x]); } @@ -3556,9 +3652,9 @@ int I2CConfig::setByName(const char *name, const char *value) } else { x = strtoul(name+8,&idxe,0); if ((idxe[0] != ']') || (idxe == (name+8))) - return -148; + return -152; if (m_devices.size() <= x) - return -149; + return -153; if ((idxe[1] == 0) && (value == 0)) { m_devices.erase(m_devices.begin()+x); return 0; @@ -3571,7 +3667,7 @@ int I2CConfig::setByName(const char *name, const char *value) return eptr - value; } if (idxe[1] != '.') - return -150; + return -154; idxe += 2; if (!strcmp("addr",idxe)) { if (eptr != value) { @@ -3598,11 +3694,11 @@ int I2CConfig::setByName(const char *name, const char *value) return 0; } } - return -151; + return -155; } } #endif // CONFIG_I2C_XDEV - return -152; + return -156; } HcSr04Config::HcSr04Config() @@ -3637,7 +3733,7 @@ ssize_t HcSr04Config::fromMemory(const void *b, ssize_t s) union decode_union ud; ssize_t x = decode_early(a,e,&ud,&fid); if (x < 0) - return -153; + return -157; a += x; switch (fid) { case 0x8: // trigger id 1, type int8_t, coding signed varint @@ -3648,7 +3744,7 @@ ssize_t HcSr04Config::fromMemory(const void *b, ssize_t s) break; case 0x1a: // name id 3, type estring, coding byte[] if ((ssize_t)ud.vi > e-a) { - return -154; + return -158; } m_name.assign((const char*)a,ud.vi); a += ud.vi; @@ -3658,13 +3754,13 @@ ssize_t HcSr04Config::fromMemory(const void *b, ssize_t s) // need only to skip len prefixed data a += ud.vi; if (a > e) - return -155; + return -159; } } } assert((a-(const uint8_t *)b) == s); if (a > e) - return -156; + return -160; return a-(const uint8_t *)b; } @@ -3677,33 +3773,33 @@ ssize_t HcSr04Config::toMemory(uint8_t *b, ssize_t s) const if (m_trigger != -1) { // 'trigger': id=1, encoding=varint, tag=0x8 if (a >= e) - return -157; + return -161; *a++ = 0x8; n = write_varint(a,e-a,sint_varint(m_trigger)); if (n <= 0) - return -158; + return -162; a += n; } // has echo? if (m_echo != -1) { // 'echo': id=2, encoding=varint, tag=0x10 if (a >= e) - return -159; + return -163; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_echo)); if (n <= 0) - return -160; + return -164; a += n; } // has name? if (!m_name.empty()) { // 'name': id=3, encoding=lenpfx, tag=0x1a if (a >= e) - return -161; + return -165; *a++ = 0x1a; n = encode_bytes(m_name,a,e); if (n < 0) - return -162; + return -166; a += n; } assert(a <= e); @@ -3801,7 +3897,7 @@ int HcSr04Config::setByName(const char *name, const char *value) int r = m_name.size(); return r; } - return -163; + return -167; } LedConfig::LedConfig() @@ -3830,6 +3926,9 @@ void LedConfig::toASCII(stream &o, size_t indent) const ascii_indent(o,indent); o << ".open_drain"; o << (config_open_drain() ? " = true;" : " = false;"); + ascii_indent(o,indent); + o << ".init_high"; + o << (config_init_high() ? " = true;" : " = false;"); --indent; ascii_string(o,indent,m_name.data(),m_name.size(),"name"); ascii_numeric(o, indent, "pwm_ch", (signed) m_pwm_ch); @@ -3847,7 +3946,7 @@ ssize_t LedConfig::fromMemory(const void *b, ssize_t s) union decode_union ud; ssize_t x = decode_early(a,e,&ud,&fid); if (x < 0) - return -164; + return -168; a += x; switch (fid) { case 0x8: // gpio id 1, type int8_t, coding signed varint @@ -3858,7 +3957,7 @@ ssize_t LedConfig::fromMemory(const void *b, ssize_t s) break; case 0x1a: // name id 3, type estring, coding byte[] if ((ssize_t)ud.vi > e-a) { - return -165; + return -169; } m_name.assign((const char*)a,ud.vi); a += ud.vi; @@ -3871,13 +3970,13 @@ ssize_t LedConfig::fromMemory(const void *b, ssize_t s) // need only to skip len prefixed data a += ud.vi; if (a > e) - return -166; + return -170; } } } assert((a-(const uint8_t *)b) == s); if (a > e) - return -167; + return -171; return a-(const uint8_t *)b; } @@ -3890,44 +3989,44 @@ ssize_t LedConfig::toMemory(uint8_t *b, ssize_t s) const if (m_gpio != -1) { // 'gpio': id=1, encoding=varint, tag=0x8 if (a >= e) - return -168; + return -172; *a++ = 0x8; n = write_varint(a,e-a,sint_varint(m_gpio)); if (n <= 0) - return -169; + return -173; a += n; } // has config? if (0 != (p_validbits & ((uint8_t)1U << 0))) { // 'config': id=2, encoding=varint, tag=0x10 if (a >= e) - return -170; + return -174; *a++ = 0x10; n = write_varint(a,e-a,m_config); if (n <= 0) - return -171; + return -175; a += n; } // has name? if (!m_name.empty()) { // 'name': id=3, encoding=lenpfx, tag=0x1a if (a >= e) - return -172; + return -176; *a++ = 0x1a; n = encode_bytes(m_name,a,e); if (n < 0) - return -173; + return -177; a += n; } // has pwm_ch? if (m_pwm_ch != -1) { // 'pwm_ch': id=4, encoding=varint, tag=0x20 if (a >= e) - return -174; + return -178; *a++ = 0x20; n = write_varint(a,e-a,sint_varint(m_pwm_ch)); if (n <= 0) - return -175; + return -179; a += n; } assert(a <= e); @@ -4031,25 +4130,31 @@ int LedConfig::setByName(const char *name, const char *value) set_config_active_high((bool)ull); else if (!strcmp(name,"open_drain")) set_config_open_drain((bool)ull); + else if (!strcmp(name,"init_high")) + set_config_init_high((bool)ull); return eptr - value; } - #ifndef CONFIG_ESPTOOLPY_FLASHSIZE_1MB if (*name++ != '.') { - return -176; + return -180; } else if (!strcmp(name,"active_high")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_active_high(tmp); return r; } else if (!strcmp(name,"open_drain")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_open_drain(tmp); + return r; + } else if (!strcmp(name,"init_high")) { + bool tmp; + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_init_high(tmp); return r; } - #endif // !CONFIG_ESPTOOLPY_FLASHSIZE_1MB } if (0 == strcmp(name,"name")) { if (value == 0) { @@ -4068,7 +4173,7 @@ int LedConfig::setByName(const char *name, const char *value) int r = parse_ascii_s8(&m_pwm_ch,value); return r; } - return -177; + return -181; } OneWireConfig::OneWireConfig() @@ -4103,7 +4208,7 @@ ssize_t OneWireConfig::fromMemory(const void *b, ssize_t s) union decode_union ud; ssize_t x = decode_early(a,e,&ud,&fid); if (x < 0) - return -178; + return -182; a += x; switch (fid) { case 0x8: // gpio id 1, type int8_t, coding signed varint @@ -4120,13 +4225,13 @@ ssize_t OneWireConfig::fromMemory(const void *b, ssize_t s) // need only to skip len prefixed data a += ud.vi; if (a > e) - return -179; + return -183; } } } assert((a-(const uint8_t *)b) == s); if (a > e) - return -180; + return -184; return a-(const uint8_t *)b; } @@ -4139,18 +4244,18 @@ ssize_t OneWireConfig::toMemory(uint8_t *b, ssize_t s) const if (m_gpio != -1) { // 'gpio': id=1, encoding=varint, tag=0x8 if (a >= e) - return -181; + return -185; *a++ = 0x8; n = write_varint(a,e-a,sint_varint(m_gpio)); if (n <= 0) - return -182; + return -186; a += n; } // has pullup? if (m_pullup != false) { // 'pullup': id=2, encoding=8bit, tag=0x13 if (2 > (e-a)) - return -183; + return -187; *a++ = 0x13; *a++ = m_pullup; } @@ -4158,11 +4263,11 @@ ssize_t OneWireConfig::toMemory(uint8_t *b, ssize_t s) const if (m_power != -1) { // 'power': id=3, encoding=varint, tag=0x18 if (a >= e) - return -184; + return -188; *a++ = 0x18; n = write_varint(a,e-a,sint_varint(m_power)); if (n <= 0) - return -185; + return -189; a += n; } assert(a <= e); @@ -4258,7 +4363,7 @@ int OneWireConfig::setByName(const char *name, const char *value) int r = parse_ascii_s8(&m_power,value); return r; } - return -186; + return -190; } UartConfig::UartConfig() @@ -4289,7 +4394,7 @@ ssize_t UartConfig::fromMemory(const void *b, ssize_t s) union decode_union ud; ssize_t x = decode_early(a,e,&ud,&fid); if (x < 0) - return -187; + return -191; a += x; switch (fid) { case 0x8: // port id 1, type int8_t, coding signed varint @@ -4300,13 +4405,13 @@ ssize_t UartConfig::fromMemory(const void *b, ssize_t s) // need only to skip len prefixed data a += ud.vi; if (a > e) - return -188; + return -192; } } } assert((a-(const uint8_t *)b) == s); if (a > e) - return -189; + return -193; return a-(const uint8_t *)b; } @@ -4319,11 +4424,11 @@ ssize_t UartConfig::toMemory(uint8_t *b, ssize_t s) const if (m_port != -1) { // 'port': id=1, encoding=varint, tag=0x8 if (a >= e) - return -190; + return -194; *a++ = 0x8; n = write_varint(a,e-a,sint_varint(m_port)); if (n <= 0) - return -191; + return -195; a += n; } // 'tx_gpio' is unused. Therefore no data will be written. @@ -4391,7 +4496,7 @@ int UartConfig::setByName(const char *name, const char *value) int r = parse_ascii_s8(&m_port,value); return r; } - return -192; + return -196; } AdcChannel::AdcChannel() @@ -4439,12 +4544,12 @@ ssize_t AdcChannel::fromMemory(const void *b, ssize_t s) union decode_union ud; ssize_t x = decode_early(a,e,&ud,&fid); if (x < 0) - return -193; + return -197; a += x; switch (fid) { case 0xa: // name id 1, type estring, coding byte[] if ((ssize_t)ud.vi > e-a) { - return -194; + return -198; } m_name.assign((const char*)a,ud.vi); a += ud.vi; @@ -4472,7 +4577,7 @@ ssize_t AdcChannel::fromMemory(const void *b, ssize_t s) break; case 0x52: // dim id 10, type estring, coding byte[] if ((ssize_t)ud.vi > e-a) { - return -195; + return -199; } m_dim.assign((const char*)a,ud.vi); a += ud.vi; @@ -4482,13 +4587,13 @@ ssize_t AdcChannel::fromMemory(const void *b, ssize_t s) // need only to skip len prefixed data a += ud.vi; if (a > e) - return -196; + return -200; } } } assert((a-(const uint8_t *)b) == s); if (a > e) - return -197; + return -201; return a-(const uint8_t *)b; } @@ -4501,76 +4606,76 @@ ssize_t AdcChannel::toMemory(uint8_t *b, ssize_t s) const if (!m_name.empty()) { // 'name': id=1, encoding=lenpfx, tag=0xa if (a >= e) - return -198; + return -202; *a++ = 0xa; n = encode_bytes(m_name,a,e); if (n < 0) - return -199; + return -203; a += n; } // has unit? if (m_unit != 0) { // 'unit': id=2, encoding=varint, tag=0x10 if (a >= e) - return -200; + return -204; *a++ = 0x10; n = write_varint(a,e-a,m_unit); if (n <= 0) - return -201; + return -205; a += n; } // has ch? if (m_ch != -1) { // 'ch': id=3, encoding=varint, tag=0x18 if (a >= e) - return -202; + return -206; *a++ = 0x18; n = write_varint(a,e-a,sint_varint(m_ch)); if (n <= 0) - return -203; + return -207; a += n; } // has atten? if (0 != (p_validbits & ((uint8_t)1U << 0))) { // 'atten': id=4, encoding=varint, tag=0x20 if (a >= e) - return -204; + return -208; *a++ = 0x20; n = write_varint(a,e-a,m_atten); if (n <= 0) - return -205; + return -209; a += n; } // has interval? if (m_interval != 0) { // 'interval': id=5, encoding=varint, tag=0x28 if (a >= e) - return -206; + return -210; *a++ = 0x28; n = write_varint(a,e-a,m_interval); if (n <= 0) - return -207; + return -211; a += n; } // has window? if (m_window != 0) { // 'window': id=6, encoding=varint, tag=0x30 if (a >= e) - return -208; + return -212; *a++ = 0x30; n = write_varint(a,e-a,m_window); if (n <= 0) - return -209; + return -213; a += n; } // has scale? if (0 != (p_validbits & ((uint8_t)1U << 1))) { // 'scale': id=8, encoding=32bit, tag=0x45 if (5 > (e-a)) - return -210; + return -214; *a++ = 0x45; if ((e-a) < 4) - return -211; + return -215; write_u32(a,mangle_float(m_scale)); a += 4; } @@ -4578,10 +4683,10 @@ ssize_t AdcChannel::toMemory(uint8_t *b, ssize_t s) const if (0 != (p_validbits & ((uint8_t)1U << 2))) { // 'offset': id=9, encoding=32bit, tag=0x4d if (5 > (e-a)) - return -212; + return -216; *a++ = 0x4d; if ((e-a) < 4) - return -213; + return -217; write_u32(a,mangle_float(m_offset)); a += 4; } @@ -4589,11 +4694,11 @@ ssize_t AdcChannel::toMemory(uint8_t *b, ssize_t s) const if (!m_dim.empty()) { // 'dim': id=10, encoding=lenpfx, tag=0x52 if (a >= e) - return -214; + return -218; *a++ = 0x52; n = encode_bytes(m_dim,a,e); if (n < 0) - return -215; + return -219; a += n; } assert(a <= e); @@ -4809,7 +4914,7 @@ int AdcChannel::setByName(const char *name, const char *value) int r = m_dim.size(); return r; } - return -216; + return -220; } AdcConfig::AdcConfig() @@ -4845,12 +4950,12 @@ ssize_t AdcConfig::fromMemory(const void *b, ssize_t s) union decode_union ud; ssize_t x = decode_early(a,e,&ud,&fid); if (x < 0) - return -217; + return -221; a += x; switch (fid) { case 0xa: // adc_name id 1, type estring, coding byte[] if ((ssize_t)ud.vi > e-a) { - return -218; + return -222; } m_adc_name.assign((const char*)a,ud.vi); a += ud.vi; @@ -4866,13 +4971,13 @@ ssize_t AdcConfig::fromMemory(const void *b, ssize_t s) // need only to skip len prefixed data a += ud.vi; if (a > e) - return -219; + return -223; } } } assert((a-(const uint8_t *)b) == s); if (a > e) - return -220; + return -224; return a-(const uint8_t *)b; } @@ -4885,11 +4990,11 @@ ssize_t AdcConfig::toMemory(uint8_t *b, ssize_t s) const if (!m_adc_name.empty()) { // 'adc_name': id=1, encoding=lenpfx, tag=0xa if (a >= e) - return -221; + return -225; *a++ = 0xa; n = encode_bytes(m_adc_name,a,e); if (n < 0) - return -222; + return -226; a += n; } // 'adc1_bits' is unused. Therefore no data will be written. @@ -4898,22 +5003,22 @@ ssize_t AdcConfig::toMemory(uint8_t *b, ssize_t s) const if (0 != (p_validbits & ((uint8_t)1U << 0))) { // 'mode': id=4, encoding=varint, tag=0x20 if (a >= e) - return -223; + return -227; *a++ = 0x20; n = write_varint(a,e-a,m_mode); if (n <= 0) - return -224; + return -228; a += n; } // has clk_div? if (0 != (p_validbits & ((uint8_t)1U << 1))) { // 'clk_div': id=5, encoding=varint, tag=0x28 if (a >= e) - return -225; + return -229; *a++ = 0x28; n = write_varint(a,e-a,m_clk_div); if (n <= 0) - return -226; + return -230; a += n; } // 'hall_name' is unused. Therefore no data will be written. @@ -5023,7 +5128,7 @@ int AdcConfig::setByName(const char *name, const char *value) p_validbits |= ((uint8_t)1U << 1); return r; } - return -227; + return -231; } GpioConfig::GpioConfig() @@ -5066,9 +5171,6 @@ void GpioConfig::toASCII(stream &o, size_t indent) const ascii_indent(o,indent); o << ".pulldown"; o << (config_pulldown() ? " = true;" : " = false;"); - ascii_indent(o,indent); - o << ".cap_freq_r2r"; - o << (config_cap_freq_r2r() ? " = true;" : " = false;"); --indent; --indent; ascii_indent(o,indent); @@ -5084,12 +5186,12 @@ ssize_t GpioConfig::fromMemory(const void *b, ssize_t s) union decode_union ud; ssize_t x = decode_early(a,e,&ud,&fid); if (x < 0) - return -228; + return -232; a += x; switch (fid) { case 0xa: // name id 1, type estring, coding byte[] if ((ssize_t)ud.vi > e-a) { - return -229; + return -233; } m_name.assign((const char*)a,ud.vi); a += ud.vi; @@ -5105,13 +5207,13 @@ ssize_t GpioConfig::fromMemory(const void *b, ssize_t s) // need only to skip len prefixed data a += ud.vi; if (a > e) - return -230; + return -234; } } } assert((a-(const uint8_t *)b) == s); if (a > e) - return -231; + return -235; return a-(const uint8_t *)b; } @@ -5124,33 +5226,33 @@ ssize_t GpioConfig::toMemory(uint8_t *b, ssize_t s) const if (!m_name.empty()) { // 'name': id=1, encoding=lenpfx, tag=0xa if (a >= e) - return -232; + return -236; *a++ = 0xa; n = encode_bytes(m_name,a,e); if (n < 0) - return -233; + return -237; a += n; } // has gpio? if (m_gpio != -1) { // 'gpio': id=2, encoding=varint, tag=0x10 if (a >= e) - return -234; + return -238; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_gpio)); if (n <= 0) - return -235; + return -239; a += n; } // has config? if (0 != (p_validbits & ((uint8_t)1U << 0))) { // 'config': id=3, encoding=varint, tag=0x18 if (a >= e) - return -236; + return -240; *a++ = 0x18; n = write_varint(a,e-a,m_config); if (n <= 0) - return -237; + return -241; a += n; } assert(a <= e); @@ -5261,59 +5363,49 @@ int GpioConfig::setByName(const char *name, const char *value) set_config_pullup((bool)ull); else if (!strcmp(name,"pulldown")) set_config_pulldown((bool)ull); - else if (!strcmp(name,"cap_freq_r2r")) - set_config_cap_freq_r2r((bool)ull); return eptr - value; } - #ifndef CONFIG_ESPTOOLPY_FLASHSIZE_1MB if (*name++ != '.') { - return -238; + return -242; } else if (!strcmp(name,"mode")) { uint8_t tmp; - size_t r = parse_ascii_u8(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_u8(&tmp,value); + if (r > 0) + set_config_mode(tmp); return r; } else if (!strcmp(name,"intrtype")) { uint8_t tmp; - size_t r = parse_ascii_u8(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_u8(&tmp,value); + if (r > 0) + set_config_intrtype(tmp); return r; } else if (!strcmp(name,"setinit")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_setinit(tmp); return r; } else if (!strcmp(name,"initlvl")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_initlvl(tmp); return r; } else if (!strcmp(name,"pullup")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_pullup(tmp); return r; } else if (!strcmp(name,"pulldown")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_config(tmp); - return r; - } else if (!strcmp(name,"cap_freq_r2r")) { - bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_pulldown(tmp); return r; } - #endif // !CONFIG_ESPTOOLPY_FLASHSIZE_1MB } - return -239; + return -243; } DisplayConfig::DisplayConfig() @@ -5356,7 +5448,7 @@ ssize_t DisplayConfig::fromMemory(const void *b, ssize_t s) union decode_union ud; ssize_t x = decode_early(a,e,&ud,&fid); if (x < 0) - return -240; + return -244; a += x; switch (fid) { case 0x8: // type id 1, type disp_t, coding varint @@ -5376,13 +5468,13 @@ ssize_t DisplayConfig::fromMemory(const void *b, ssize_t s) // need only to skip len prefixed data a += ud.vi; if (a > e) - return -241; + return -245; } } } assert((a-(const uint8_t *)b) == s); if (a > e) - return -242; + return -246; return a-(const uint8_t *)b; } @@ -5395,44 +5487,44 @@ ssize_t DisplayConfig::toMemory(uint8_t *b, ssize_t s) const if (m_type != dt_none) { // 'type': id=1, encoding=varint, tag=0x8 if (a >= e) - return -243; + return -247; *a++ = 0x8; n = write_varint(a,e-a,m_type); if (n <= 0) - return -244; + return -248; a += n; } // has options? if (0 != (p_validbits & ((uint8_t)1U << 0))) { // 'options': id=2, encoding=varint, tag=0x10 if (a >= e) - return -245; + return -249; *a++ = 0x10; n = write_varint(a,e-a,m_options); if (n <= 0) - return -246; + return -250; a += n; } // has maxx? if (0 != (p_validbits & ((uint8_t)1U << 1))) { // 'maxx': id=3, encoding=varint, tag=0x18 if (a >= e) - return -247; + return -251; *a++ = 0x18; n = write_varint(a,e-a,m_maxx); if (n <= 0) - return -248; + return -252; a += n; } // has maxy? if (0 != (p_validbits & ((uint8_t)1U << 2))) { // 'maxy': id=4, encoding=varint, tag=0x20 if (a >= e) - return -249; + return -253; *a++ = 0x20; n = write_varint(a,e-a,m_maxy); if (n <= 0) - return -250; + return -254; a += n; } assert(a <= e); @@ -5530,7 +5622,7 @@ int DisplayConfig::setByName(const char *name, const char *value) disp_t v; size_t r = parse_ascii_disp_t(&v,value); if (r == 0) - return -251; + return -255; set_type(v); return r; } @@ -5564,7 +5656,7 @@ int DisplayConfig::setByName(const char *name, const char *value) p_validbits |= ((uint8_t)1U << 2); return r; } - return -252; + return -256; } SpiDeviceConfig::SpiDeviceConfig() @@ -5578,6 +5670,7 @@ void SpiDeviceConfig::clear() m_intr = -1; m_reset = -1; m_cd = -1; + m_freq = 0; } void SpiDeviceConfig::toASCII(stream &o, size_t indent) const @@ -5594,6 +5687,7 @@ void SpiDeviceConfig::toASCII(stream &o, size_t indent) const ascii_numeric(o, indent, "intr", (signed) m_intr); ascii_numeric(o, indent, "reset", (signed) m_reset); ascii_numeric(o, indent, "cd", (signed) m_cd); + ascii_numeric(o, indent, "freq", m_freq); --indent; ascii_indent(o,indent); o << '}'; @@ -5608,7 +5702,7 @@ ssize_t SpiDeviceConfig::fromMemory(const void *b, ssize_t s) union decode_union ud; ssize_t x = decode_early(a,e,&ud,&fid); if (x < 0) - return -253; + return -257; a += x; switch (fid) { case 0x8: // drv id 1, type spidrv_t, coding varint @@ -5626,18 +5720,21 @@ ssize_t SpiDeviceConfig::fromMemory(const void *b, ssize_t s) case 0x28: // cd id 5, type int8_t, coding signed varint set_cd(varint_sint(ud.u8)); break; + case 0x30: // freq id 6, type uint32_t, coding varint + set_freq((uint32_t)ud.u32); + break; default: if ((fid & 7) == 2) { // need only to skip len prefixed data a += ud.vi; if (a > e) - return -254; + return -258; } } } assert((a-(const uint8_t *)b) == s); if (a > e) - return -255; + return -259; return a-(const uint8_t *)b; } @@ -5650,55 +5747,66 @@ ssize_t SpiDeviceConfig::toMemory(uint8_t *b, ssize_t s) const if (m_drv != spidrv_invalid) { // 'drv': id=1, encoding=varint, tag=0x8 if (a >= e) - return -256; + return -260; *a++ = 0x8; n = write_varint(a,e-a,m_drv); if (n <= 0) - return -257; + return -261; a += n; } // has cs? if (m_cs != -1) { // 'cs': id=2, encoding=varint, tag=0x10 if (a >= e) - return -258; + return -262; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_cs)); if (n <= 0) - return -259; + return -263; a += n; } // has intr? if (m_intr != -1) { // 'intr': id=3, encoding=varint, tag=0x18 if (a >= e) - return -260; + return -264; *a++ = 0x18; n = write_varint(a,e-a,sint_varint(m_intr)); if (n <= 0) - return -261; + return -265; a += n; } // has reset? if (m_reset != -1) { // 'reset': id=4, encoding=varint, tag=0x20 if (a >= e) - return -262; + return -266; *a++ = 0x20; n = write_varint(a,e-a,sint_varint(m_reset)); if (n <= 0) - return -263; + return -267; a += n; } // has cd? if (m_cd != -1) { // 'cd': id=5, encoding=varint, tag=0x28 if (a >= e) - return -264; + return -268; *a++ = 0x28; n = write_varint(a,e-a,sint_varint(m_cd)); if (n <= 0) - return -265; + return -269; + a += n; + } + // has freq? + if (m_freq != 0) { + // 'freq': id=6, encoding=varint, tag=0x30 + if (a >= e) + return -270; + *a++ = 0x30; + n = write_varint(a,e-a,m_freq); + if (n <= 0) + return -271; a += n; } assert(a <= e); @@ -5735,6 +5843,10 @@ void SpiDeviceConfig::toJSON(stream &json, unsigned indLvl) const fsep = json_indent(json,indLvl,fsep,"cd"); to_decstr(json,(int) m_cd); } + if (has_freq()) { + fsep = json_indent(json,indLvl,fsep,"freq"); + to_decstr(json,m_freq); + } if (fsep == '{') json.put('{'); json.put('\n'); @@ -5768,6 +5880,10 @@ size_t SpiDeviceConfig::calcSize() const if (has_cd()) { r += wiresize_s((varint_t)m_cd) + 1 /* tag(cd) 0x28 */; } + // optional unsigned freq, id 6 + if (has_freq()) { + r += wiresize((varint_t)m_freq) + 1 /* tag(freq) 0x30 */; + } return r; } @@ -5783,6 +5899,8 @@ bool SpiDeviceConfig::operator == (const SpiDeviceConfig &r) const return false; if (has_cd() && (!(m_cd == r.m_cd))) return false; + if (has_freq() && (!(m_freq == r.m_freq))) + return false; return true; } @@ -5804,7 +5922,7 @@ int SpiDeviceConfig::setByName(const char *name, const char *value) spidrv_t v; size_t r = parse_ascii_spidrv_t(&v,value); if (r == 0) - return -266; + return -272; set_drv(v); return r; } @@ -5840,7 +5958,15 @@ int SpiDeviceConfig::setByName(const char *name, const char *value) int r = parse_ascii_s8(&m_cd,value); return r; } - return -267; + if (0 == strcmp(name,"freq")) { + if (value == 0) { + clear_freq(); + return 0; + } + int r = parse_ascii_u32(&m_freq,value); + return r; + } + return -273; } SpiBusConfig::SpiBusConfig() @@ -5922,7 +6048,7 @@ ssize_t SpiBusConfig::fromMemory(const void *b, ssize_t s) union decode_union ud; ssize_t x = decode_early(a,e,&ud,&fid); if (x < 0) - return -268; + return -274; a += x; switch (fid) { case 0x8: // host id 1, type int8_t, coding signed varint @@ -5955,7 +6081,7 @@ ssize_t SpiBusConfig::fromMemory(const void *b, ssize_t s) int n; n = m_devices.back().fromMemory((const uint8_t*)a,ud.vi); if (n != (ssize_t)ud.vi) - return -269; + return -275; a += ud.vi; } break; @@ -5964,13 +6090,13 @@ ssize_t SpiBusConfig::fromMemory(const void *b, ssize_t s) // need only to skip len prefixed data a += ud.vi; if (a > e) - return -270; + return -276; } } } assert((a-(const uint8_t *)b) == s); if (a > e) - return -271; + return -277; return a-(const uint8_t *)b; } @@ -5983,100 +6109,100 @@ ssize_t SpiBusConfig::toMemory(uint8_t *b, ssize_t s) const if (m_host != -1) { // 'host': id=1, encoding=varint, tag=0x8 if (a >= e) - return -272; + return -278; *a++ = 0x8; n = write_varint(a,e-a,sint_varint(m_host)); if (n <= 0) - return -273; + return -279; a += n; } // has mosi? if (m_mosi != -1) { // 'mosi': id=2, encoding=varint, tag=0x10 if (a >= e) - return -274; + return -280; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_mosi)); if (n <= 0) - return -275; + return -281; a += n; } // has miso? if (m_miso != -1) { // 'miso': id=3, encoding=varint, tag=0x18 if (a >= e) - return -276; + return -282; *a++ = 0x18; n = write_varint(a,e-a,sint_varint(m_miso)); if (n <= 0) - return -277; + return -283; a += n; } // has sclk? if (m_sclk != -1) { // 'sclk': id=4, encoding=varint, tag=0x20 if (a >= e) - return -278; + return -284; *a++ = 0x20; n = write_varint(a,e-a,sint_varint(m_sclk)); if (n <= 0) - return -279; + return -285; a += n; } // has wp? if (m_wp != -1) { // 'wp': id=5, encoding=varint, tag=0x28 if (a >= e) - return -280; + return -286; *a++ = 0x28; n = write_varint(a,e-a,sint_varint(m_wp)); if (n <= 0) - return -281; + return -287; a += n; } // has hold? if (m_hold != -1) { // 'hold': id=6, encoding=varint, tag=0x30 if (a >= e) - return -282; + return -288; *a++ = 0x30; n = write_varint(a,e-a,sint_varint(m_hold)); if (n <= 0) - return -283; + return -289; a += n; } // has options? if (0 != (p_validbits & ((uint8_t)1U << 0))) { // 'options': id=7, encoding=varint, tag=0x38 if (a >= e) - return -284; + return -290; *a++ = 0x38; n = write_varint(a,e-a,m_options); if (n <= 0) - return -285; + return -291; a += n; } // has dma? if (m_dma != -1) { // 'dma': id=8, encoding=varint, tag=0x40 if (a >= e) - return -286; + return -292; *a++ = 0x40; n = write_varint(a,e-a,sint_varint(m_dma)); if (n <= 0) - return -287; + return -293; a += n; } for (const auto &x : m_devices) { // 'devices': id=9, encoding=lenpfx, tag=0x4a if (a >= e) - return -288; + return -294; *a++ = 0x4a; ssize_t devices_ws = x.calcSize(); n = write_varint(a,e-a,devices_ws); a += n; if ((n <= 0) || (devices_ws > (e-a))) - return -289; + return -295; n = x.toMemory(a,e-a); a += n; assert(n == devices_ws); @@ -6300,53 +6426,51 @@ int SpiBusConfig::setByName(const char *name, const char *value) set_options_pha_hi((bool)ull); return eptr - value; } - #ifndef CONFIG_ESPTOOLPY_FLASHSIZE_1MB if (*name++ != '.') { - return -290; + return -296; } else if (!strcmp(name,"txlsbfirst")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_options(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_options_txlsbfirst(tmp); return r; } else if (!strcmp(name,"rxlsbfirst")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_options(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_options_rxlsbfirst(tmp); return r; } else if (!strcmp(name,"mosi_as_miso")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_options(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_options_mosi_as_miso(tmp); return r; } else if (!strcmp(name,"positive_cs")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_options(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_options_positive_cs(tmp); return r; } else if (!strcmp(name,"full_duplex")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_options(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_options_full_duplex(tmp); return r; } else if (!strcmp(name,"pol_hi")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_options(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_options_pol_hi(tmp); return r; } else if (!strcmp(name,"pha_hi")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_options(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_options_pha_hi(tmp); return r; } - #endif // !CONFIG_ESPTOOLPY_FLASHSIZE_1MB } if (0 == strcmp(name,"dma")) { if (value == 0) { @@ -6372,20 +6496,20 @@ int SpiBusConfig::setByName(const char *name, const char *value) } else { x = strtoul(name+8,&idxe,0); if ((idxe[0] != ']') || (idxe == (name+8))) - return -291; + return -297; if (m_devices.size() <= x) - return -292; + return -298; if ((idxe[1] == 0) && (value == 0)) { m_devices.erase(m_devices.begin()+x); return 0; } } if (idxe[1] != '.') - return -293; + return -299; return m_devices[x].setByName(idxe+2,value); } } - return -294; + return -300; } GpioCluster::GpioCluster() @@ -6424,12 +6548,12 @@ ssize_t GpioCluster::fromMemory(const void *b, ssize_t s) union decode_union ud; ssize_t x = decode_early(a,e,&ud,&fid); if (x < 0) - return -295; + return -301; a += x; switch (fid) { case 0xa: // name id 1, type estring, coding byte[] if ((ssize_t)ud.vi > e-a) { - return -296; + return -302; } m_name.assign((const char*)a,ud.vi); a += ud.vi; @@ -6451,13 +6575,13 @@ ssize_t GpioCluster::fromMemory(const void *b, ssize_t s) // need only to skip len prefixed data a += ud.vi; if (a > e) - return -297; + return -303; } } } assert((a-(const uint8_t *)b) == s); if (a > e) - return -298; + return -304; return a-(const uint8_t *)b; } @@ -6470,55 +6594,55 @@ ssize_t GpioCluster::toMemory(uint8_t *b, ssize_t s) const if (!m_name.empty()) { // 'name': id=1, encoding=lenpfx, tag=0xa if (a >= e) - return -299; + return -305; *a++ = 0xa; n = encode_bytes(m_name,a,e); if (n < 0) - return -300; + return -306; a += n; } // has base? if (m_base != 0) { // 'base': id=2, encoding=varint, tag=0x10 if (a >= e) - return -301; + return -307; *a++ = 0x10; n = write_varint(a,e-a,m_base); if (n <= 0) - return -302; + return -308; a += n; } // has numio? if (m_numio != 0) { // 'numio': id=3, encoding=varint, tag=0x18 if (a >= e) - return -303; + return -309; *a++ = 0x18; n = write_varint(a,e-a,m_numio); if (n <= 0) - return -304; + return -310; a += n; } // has int_a? if (m_int_a != -1) { // 'int_a': id=4, encoding=varint, tag=0x20 if (a >= e) - return -305; + return -311; *a++ = 0x20; n = write_varint(a,e-a,sint_varint(m_int_a)); if (n <= 0) - return -306; + return -312; a += n; } // has int_b? if (m_int_b != -1) { // 'int_b': id=5, encoding=varint, tag=0x28 if (a >= e) - return -307; + return -313; *a++ = 0x28; n = write_varint(a,e-a,sint_varint(m_int_b)); if (n <= 0) - return -308; + return -314; a += n; } assert(a <= e); @@ -6652,7 +6776,7 @@ int GpioCluster::setByName(const char *name, const char *value) int r = parse_ascii_s8(&m_int_b,value); return r; } - return -309; + return -315; } Hlw8012Config::Hlw8012Config() @@ -6687,7 +6811,7 @@ ssize_t Hlw8012Config::fromMemory(const void *b, ssize_t s) union decode_union ud; ssize_t x = decode_early(a,e,&ud,&fid); if (x < 0) - return -310; + return -316; a += x; switch (fid) { case 0x10: // sel id 2, type int8_t, coding signed varint @@ -6704,13 +6828,13 @@ ssize_t Hlw8012Config::fromMemory(const void *b, ssize_t s) // need only to skip len prefixed data a += ud.vi; if (a > e) - return -311; + return -317; } } } assert((a-(const uint8_t *)b) == s); if (a > e) - return -312; + return -318; return a-(const uint8_t *)b; } @@ -6723,33 +6847,33 @@ ssize_t Hlw8012Config::toMemory(uint8_t *b, ssize_t s) const if (m_sel != -1) { // 'sel': id=2, encoding=varint, tag=0x10 if (a >= e) - return -313; + return -319; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_sel)); if (n <= 0) - return -314; + return -320; a += n; } // has cf? if (m_cf != -1) { // 'cf': id=3, encoding=varint, tag=0x18 if (a >= e) - return -315; + return -321; *a++ = 0x18; n = write_varint(a,e-a,sint_varint(m_cf)); if (n <= 0) - return -316; + return -322; a += n; } // has cf1? if (m_cf1 != -1) { // 'cf1': id=4, encoding=varint, tag=0x20 if (a >= e) - return -317; + return -323; *a++ = 0x20; n = write_varint(a,e-a,sint_varint(m_cf1)); if (n <= 0) - return -318; + return -324; a += n; } assert(a <= e); @@ -6845,7 +6969,7 @@ int Hlw8012Config::setByName(const char *name, const char *value) int r = parse_ascii_s8(&m_cf1,value); return r; } - return -319; + return -325; } SX1276Config::SX1276Config() @@ -6886,7 +7010,7 @@ ssize_t SX1276Config::fromMemory(const void *b, ssize_t s) union decode_union ud; ssize_t x = decode_early(a,e,&ud,&fid); if (x < 0) - return -320; + return -326; a += x; switch (fid) { case 0x8: // dio0 id 1, type int8_t, coding signed varint @@ -6912,13 +7036,13 @@ ssize_t SX1276Config::fromMemory(const void *b, ssize_t s) // need only to skip len prefixed data a += ud.vi; if (a > e) - return -321; + return -327; } } } assert((a-(const uint8_t *)b) == s); if (a > e) - return -322; + return -328; return a-(const uint8_t *)b; } @@ -6931,99 +7055,726 @@ ssize_t SX1276Config::toMemory(uint8_t *b, ssize_t s) const if (m_dio0 != -1) { // 'dio0': id=1, encoding=varint, tag=0x8 if (a >= e) - return -323; + return -329; *a++ = 0x8; n = write_varint(a,e-a,sint_varint(m_dio0)); if (n <= 0) - return -324; + return -330; a += n; } // has dio1? if (m_dio1 != -1) { // 'dio1': id=2, encoding=varint, tag=0x10 if (a >= e) - return -325; + return -331; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_dio1)); if (n <= 0) - return -326; + return -332; a += n; } // has dio2? if (m_dio2 != -1) { // 'dio2': id=3, encoding=varint, tag=0x18 if (a >= e) - return -327; + return -333; *a++ = 0x18; n = write_varint(a,e-a,sint_varint(m_dio2)); if (n <= 0) - return -328; + return -334; + a += n; + } + // has dio3? + if (m_dio3 != -1) { + // 'dio3': id=4, encoding=varint, tag=0x20 + if (a >= e) + return -335; + *a++ = 0x20; + n = write_varint(a,e-a,sint_varint(m_dio3)); + if (n <= 0) + return -336; + a += n; + } + // has dio4? + if (m_dio4 != -1) { + // 'dio4': id=5, encoding=varint, tag=0x28 + if (a >= e) + return -337; + *a++ = 0x28; + n = write_varint(a,e-a,sint_varint(m_dio4)); + if (n <= 0) + return -338; + a += n; + } + // has dio5? + if (m_dio5 != -1) { + // 'dio5': id=6, encoding=varint, tag=0x30 + if (a >= e) + return -339; + *a++ = 0x30; + n = write_varint(a,e-a,sint_varint(m_dio5)); + if (n <= 0) + return -340; a += n; } - // has dio3? - if (m_dio3 != -1) { - // 'dio3': id=4, encoding=varint, tag=0x20 + assert(a <= e); + return a-b; +} + +void SX1276Config::toJSON(stream &json, unsigned indLvl) const +{ + char fsep = '{'; + ++indLvl; + if (has_dio0()) { + fsep = json_indent(json,indLvl,fsep,"dio0"); + to_decstr(json,(int) m_dio0); + } + if (has_dio1()) { + fsep = json_indent(json,indLvl,fsep,"dio1"); + to_decstr(json,(int) m_dio1); + } + if (has_dio2()) { + fsep = json_indent(json,indLvl,fsep,"dio2"); + to_decstr(json,(int) m_dio2); + } + if (has_dio3()) { + fsep = json_indent(json,indLvl,fsep,"dio3"); + to_decstr(json,(int) m_dio3); + } + if (has_dio4()) { + fsep = json_indent(json,indLvl,fsep,"dio4"); + to_decstr(json,(int) m_dio4); + } + if (has_dio5()) { + fsep = json_indent(json,indLvl,fsep,"dio5"); + to_decstr(json,(int) m_dio5); + } + if (fsep == '{') + json.put('{'); + json.put('\n'); + --indLvl; + json_indent(json,indLvl,0); + json.put('}'); + if (indLvl == 0) + json.put('\n'); +} + +size_t SX1276Config::calcSize() const +{ + size_t r = 0; // required size, default is fixed length + // optional sint8 dio0, id 1 + if (has_dio0()) { + r += wiresize_s((varint_t)m_dio0) + 1 /* tag(dio0) 0x8 */; + } + // optional sint8 dio1, id 2 + if (has_dio1()) { + r += wiresize_s((varint_t)m_dio1) + 1 /* tag(dio1) 0x10 */; + } + // optional sint8 dio2, id 3 + if (has_dio2()) { + r += wiresize_s((varint_t)m_dio2) + 1 /* tag(dio2) 0x18 */; + } + // optional sint8 dio3, id 4 + if (has_dio3()) { + r += wiresize_s((varint_t)m_dio3) + 1 /* tag(dio3) 0x20 */; + } + // optional sint8 dio4, id 5 + if (has_dio4()) { + r += wiresize_s((varint_t)m_dio4) + 1 /* tag(dio4) 0x28 */; + } + // optional sint8 dio5, id 6 + if (has_dio5()) { + r += wiresize_s((varint_t)m_dio5) + 1 /* tag(dio5) 0x30 */; + } + return r; +} + +bool SX1276Config::operator == (const SX1276Config &r) const +{ + if (has_dio0() && (!(m_dio0 == r.m_dio0))) + return false; + if (has_dio1() && (!(m_dio1 == r.m_dio1))) + return false; + if (has_dio2() && (!(m_dio2 == r.m_dio2))) + return false; + if (has_dio3() && (!(m_dio3 == r.m_dio3))) + return false; + if (has_dio4() && (!(m_dio4 == r.m_dio4))) + return false; + if (has_dio5() && (!(m_dio5 == r.m_dio5))) + return false; + return true; +} + + +/* + * Function for setting an element in dot notation with an ASCII value. + * It will call the specified parse_ascii function for parsing the value. + * + * @return number of bytes successfully parsed or negative value indicating + * an error. + */ +int SX1276Config::setByName(const char *name, const char *value) +{ + if (0 == strcmp(name,"dio0")) { + if (value == 0) { + clear_dio0(); + return 0; + } + int r = parse_ascii_s8(&m_dio0,value); + return r; + } + if (0 == strcmp(name,"dio1")) { + if (value == 0) { + clear_dio1(); + return 0; + } + int r = parse_ascii_s8(&m_dio1,value); + return r; + } + if (0 == strcmp(name,"dio2")) { + if (value == 0) { + clear_dio2(); + return 0; + } + int r = parse_ascii_s8(&m_dio2,value); + return r; + } + if (0 == strcmp(name,"dio3")) { + if (value == 0) { + clear_dio3(); + return 0; + } + int r = parse_ascii_s8(&m_dio3,value); + return r; + } + if (0 == strcmp(name,"dio4")) { + if (value == 0) { + clear_dio4(); + return 0; + } + int r = parse_ascii_s8(&m_dio4,value); + return r; + } + if (0 == strcmp(name,"dio5")) { + if (value == 0) { + clear_dio5(); + return 0; + } + int r = parse_ascii_s8(&m_dio5,value); + return r; + } + return -341; +} + +Tone::Tone() +{ +} + +void Tone::clear() +{ + m_freq = 0; + m_duration = 0; + p_validbits = 0; +} + +void Tone::toASCII(stream &o, size_t indent) const +{ + o << "Tone {"; + ++indent; + ascii_numeric(o, indent, "freq", m_freq); + ascii_numeric(o, indent, "duration", m_duration); + --indent; + ascii_indent(o,indent); + o << '}'; +} + +ssize_t Tone::fromMemory(const void *b, ssize_t s) +{ + const uint8_t *a = (const uint8_t *)b; + const uint8_t *e = a + s; + while (a < e) { + varint_t fid; + union decode_union ud; + ssize_t x = decode_early(a,e,&ud,&fid); + if (x < 0) + return -342; + a += x; + switch (fid) { + case 0x8: // freq id 1, type uint32_t, coding varint + set_freq((uint32_t)ud.u32); + break; + case 0x10: // duration id 2, type uint32_t, coding varint + set_duration((uint32_t)ud.u32); + break; + default: + if ((fid & 7) == 2) { + // need only to skip len prefixed data + a += ud.vi; + if (a > e) + return -343; + } + } + } + assert((a-(const uint8_t *)b) == s); + if (a > e) + return -344; + return a-(const uint8_t *)b; +} + +ssize_t Tone::toMemory(uint8_t *b, ssize_t s) const +{ + assert(s >= 0); + uint8_t *a = b, *e = b + s; + signed n; + // has freq? + if (0 != (p_validbits & ((uint8_t)1U << 0))) { + // 'freq': id=1, encoding=varint, tag=0x8 + if (a >= e) + return -345; + *a++ = 0x8; + n = write_varint(a,e-a,m_freq); + if (n <= 0) + return -346; + a += n; + } + // has duration? + if (0 != (p_validbits & ((uint8_t)1U << 1))) { + // 'duration': id=2, encoding=varint, tag=0x10 + if (a >= e) + return -347; + *a++ = 0x10; + n = write_varint(a,e-a,m_duration); + if (n <= 0) + return -348; + a += n; + } + assert(a <= e); + return a-b; +} + +void Tone::toJSON(stream &json, unsigned indLvl) const +{ + char fsep = '{'; + ++indLvl; + if (has_freq()) { + fsep = json_indent(json,indLvl,fsep,"freq"); + to_decstr(json,m_freq); + } + if (has_duration()) { + fsep = json_indent(json,indLvl,fsep,"duration"); + to_decstr(json,m_duration); + } + if (fsep == '{') + json.put('{'); + json.put('\n'); + --indLvl; + json_indent(json,indLvl,0); + json.put('}'); + if (indLvl == 0) + json.put('\n'); +} + +size_t Tone::calcSize() const +{ + size_t r = 0; // required size, default is fixed length + // optional unsigned freq, id 1 + if (has_freq()) { + r += wiresize((varint_t)m_freq) + 1 /* tag(freq) 0x8 */; + } + // optional unsigned duration, id 2 + if (has_duration()) { + r += wiresize((varint_t)m_duration) + 1 /* tag(duration) 0x10 */; + } + return r; +} + +bool Tone::operator == (const Tone &r) const +{ + if (p_validbits != r.p_validbits) + return false; + if (has_freq() && (!(m_freq == r.m_freq))) + return false; + if (has_duration() && (!(m_duration == r.m_duration))) + return false; + return true; +} + + +/* + * Function for setting an element in dot notation with an ASCII value. + * It will call the specified parse_ascii function for parsing the value. + * + * @return number of bytes successfully parsed or negative value indicating + * an error. + */ +int Tone::setByName(const char *name, const char *value) +{ + if (0 == strcmp(name,"freq")) { + if (value == 0) { + clear_freq(); + return 0; + } + int r = parse_ascii_u32(&m_freq,value); + if (r > 0) + p_validbits |= ((uint8_t)1U << 0); + return r; + } + if (0 == strcmp(name,"duration")) { + if (value == 0) { + clear_duration(); + return 0; + } + int r = parse_ascii_u32(&m_duration,value); + if (r > 0) + p_validbits |= ((uint8_t)1U << 1); + return r; + } + return -349; +} + +Melody::Melody() +{ +} + +void Melody::clear() +{ + m_name.clear(); + m_tones.clear(); +} + +void Melody::toASCII(stream &o, size_t indent) const +{ + o << "Melody {"; + ++indent; + ascii_string(o,indent,m_name.data(),m_name.size(),"name"); + ascii_indent(o,indent); + size_t s_tones = m_tones.size(); + o << "tones[" << s_tones << "] = {"; + ++indent; + for (size_t i = 0, e = s_tones; i != e; ++i) { + ascii_indent(o,indent); + o << i << ": "; + ascii_numeric(o, indent, 0, m_tones[i]); + } + --indent; + ascii_indent(o,indent); + o << '}'; + --indent; + ascii_indent(o,indent); + o << '}'; +} + +ssize_t Melody::fromMemory(const void *b, ssize_t s) +{ + const uint8_t *a = (const uint8_t *)b; + const uint8_t *e = a + s; + while (a < e) { + varint_t fid; + union decode_union ud; + ssize_t x = decode_early(a,e,&ud,&fid); + if (x < 0) + return -350; + a += x; + switch (fid) { + case 0xa: // name id 1, type estring, coding byte[] + if ((ssize_t)ud.vi > e-a) { + return -351; + } + m_name.assign((const char*)a,ud.vi); + a += ud.vi; + break; + case 0x14: // tones id 2, type uint16_t, coding 16bit + m_tones.push_back(ud.u16); + break; + default: + if ((fid & 7) == 2) { + // need only to skip len prefixed data + a += ud.vi; + if (a > e) + return -352; + } + } + } + assert((a-(const uint8_t *)b) == s); + if (a > e) + return -353; + return a-(const uint8_t *)b; +} + +ssize_t Melody::toMemory(uint8_t *b, ssize_t s) const +{ + assert(s >= 0); + uint8_t *a = b, *e = b + s; + signed n; + // has name? + if (!m_name.empty()) { + // 'name': id=1, encoding=lenpfx, tag=0xa + if (a >= e) + return -354; + *a++ = 0xa; + n = encode_bytes(m_name,a,e); + if (n < 0) + return -355; + a += n; + } + for (auto x : m_tones) { + // 'tones': id=2, encoding=16bit, tag=0x14 + if (3 > (e-a)) + return -356; + *a++ = 0x14; + if ((e-a) < 2) + return -357; + write_u16(a,x); + a += 2; + } + assert(a <= e); + return a-b; +} + +void Melody::toJSON(stream &json, unsigned indLvl) const +{ + char fsep = '{'; + ++indLvl; + if (has_name()) { + fsep = json_indent(json,indLvl,fsep,"name"); + json_cstr(json,m_name.c_str()); + } + if (size_t s = m_tones.size()) { + fsep = json_indent(json,indLvl,fsep); + indLvl += 2; + json << "\"tones\":[\n"; + size_t i = 0; + for (;;) { + json_indent(json,indLvl,0); + to_decstr(json,m_tones[i]); + ++i; + if (i == s) + break; + json << ",\n"; + } + indLvl -= 2; + json.put('\n'); + json_indent(json,indLvl,0); + json.put(']'); + } + if (fsep == '{') + json.put('{'); + json.put('\n'); + --indLvl; + json_indent(json,indLvl,0); + json.put('}'); + if (indLvl == 0) + json.put('\n'); +} + +size_t Melody::calcSize() const +{ + size_t r = 0; // required size, default is fixed length + // optional string name, id 1 + if (has_name()) { + size_t name_s = m_name.size(); + r += name_s + wiresize(name_s) + 1 /* tag(name) 0x8 */; + } + // repeated fixed16 tones, id 2 + if (!m_tones.empty()) { + // tones: non-packed, fixed size elements + r += m_tones.size() * 3; // including tag + } + return r; +} + +bool Melody::operator == (const Melody &r) const +{ + if (has_name() && (!(m_name == r.m_name))) + return false; + if (!(m_tones == r.m_tones)) + return false; + return true; +} + + +/* + * Function for setting an element in dot notation with an ASCII value. + * It will call the specified parse_ascii function for parsing the value. + * + * @return number of bytes successfully parsed or negative value indicating + * an error. + */ +int Melody::setByName(const char *name, const char *value) +{ + if (0 == strcmp(name,"name")) { + if (value == 0) { + clear_name(); + return 0; + } + m_name = value; + int r = m_name.size(); + return r; + } + if (0 == memcmp(name,"tones",5)) { + if ((name[5] == 0) && (value == 0)) { + clear_tones(); + return 0; + } else if (name[5] == '[') { + char *idxe; + unsigned long x; + if ((name[6] == '+') && (name[7] == ']')) { + x = m_tones.size(); + m_tones.resize(x+1); + idxe = (char*)(name + 7); + if (value == 0) + return 0; + } else { + x = strtoul(name+6,&idxe,0); + if ((idxe[0] != ']') || (idxe == (name+6))) + return -358; + if (m_tones.size() <= x) + return -359; + if ((idxe[1] == 0) && (value == 0)) { + m_tones.erase(m_tones.begin()+x); + return 0; + } + } + if (idxe[1] != 0) + return -360; + return parse_ascii_u16(&m_tones[x],value); + } + } + return -361; +} + +BuzzerConfig::BuzzerConfig() +{ +} + +void BuzzerConfig::clear() +{ + m_gpio = -1; + m_melodies.clear(); +} + +void BuzzerConfig::toASCII(stream &o, size_t indent) const +{ + o << "BuzzerConfig {"; + ++indent; + ascii_numeric(o, indent, "gpio", (signed) m_gpio); + ascii_indent(o,indent); + size_t s_melodies = m_melodies.size(); + o << "melodies[" << s_melodies << "] = {"; + ++indent; + for (size_t i = 0, e = s_melodies; i != e; ++i) { + ascii_indent(o,indent); + o << i << ": "; + m_melodies[i].toASCII(o,indent); + } + --indent; + ascii_indent(o,indent); + o << '}'; + --indent; + ascii_indent(o,indent); + o << '}'; +} + +ssize_t BuzzerConfig::fromMemory(const void *b, ssize_t s) +{ + const uint8_t *a = (const uint8_t *)b; + const uint8_t *e = a + s; + while (a < e) { + varint_t fid; + union decode_union ud; + ssize_t x = decode_early(a,e,&ud,&fid); + if (x < 0) + return -362; + a += x; + switch (fid) { + case 0x8: // gpio id 1, type int8_t, coding signed varint + set_gpio(varint_sint(ud.u8)); + break; + case 0x12: // melodies id 2, type Melody, coding byte[] + m_melodies.emplace_back(); + if (((ssize_t)ud.vi > 0) && ((ssize_t)ud.vi <= (e-a))) { + int n; + n = m_melodies.back().fromMemory((const uint8_t*)a,ud.vi); + if (n != (ssize_t)ud.vi) + return -363; + a += ud.vi; + } + break; + default: + if ((fid & 7) == 2) { + // need only to skip len prefixed data + a += ud.vi; + if (a > e) + return -364; + } + } + } + assert((a-(const uint8_t *)b) == s); + if (a > e) + return -365; + return a-(const uint8_t *)b; +} + +ssize_t BuzzerConfig::toMemory(uint8_t *b, ssize_t s) const +{ + assert(s >= 0); + uint8_t *a = b, *e = b + s; + signed n; + // has gpio? + if (m_gpio != -1) { + // 'gpio': id=1, encoding=varint, tag=0x8 if (a >= e) - return -329; - *a++ = 0x20; - n = write_varint(a,e-a,sint_varint(m_dio3)); + return -366; + *a++ = 0x8; + n = write_varint(a,e-a,sint_varint(m_gpio)); if (n <= 0) - return -330; + return -367; a += n; } - // has dio4? - if (m_dio4 != -1) { - // 'dio4': id=5, encoding=varint, tag=0x28 + for (const auto &x : m_melodies) { + // 'melodies': id=2, encoding=lenpfx, tag=0x12 if (a >= e) - return -331; - *a++ = 0x28; - n = write_varint(a,e-a,sint_varint(m_dio4)); - if (n <= 0) - return -332; + return -368; + *a++ = 0x12; + ssize_t melodies_ws = x.calcSize(); + n = write_varint(a,e-a,melodies_ws); a += n; - } - // has dio5? - if (m_dio5 != -1) { - // 'dio5': id=6, encoding=varint, tag=0x30 - if (a >= e) - return -333; - *a++ = 0x30; - n = write_varint(a,e-a,sint_varint(m_dio5)); - if (n <= 0) - return -334; + if ((n <= 0) || (melodies_ws > (e-a))) + return -369; + n = x.toMemory(a,e-a); a += n; + assert(n == melodies_ws); } assert(a <= e); return a-b; } -void SX1276Config::toJSON(stream &json, unsigned indLvl) const +void BuzzerConfig::toJSON(stream &json, unsigned indLvl) const { char fsep = '{'; ++indLvl; - if (has_dio0()) { - fsep = json_indent(json,indLvl,fsep,"dio0"); - to_decstr(json,(int) m_dio0); - } - if (has_dio1()) { - fsep = json_indent(json,indLvl,fsep,"dio1"); - to_decstr(json,(int) m_dio1); - } - if (has_dio2()) { - fsep = json_indent(json,indLvl,fsep,"dio2"); - to_decstr(json,(int) m_dio2); - } - if (has_dio3()) { - fsep = json_indent(json,indLvl,fsep,"dio3"); - to_decstr(json,(int) m_dio3); - } - if (has_dio4()) { - fsep = json_indent(json,indLvl,fsep,"dio4"); - to_decstr(json,(int) m_dio4); + if (has_gpio()) { + fsep = json_indent(json,indLvl,fsep,"gpio"); + to_decstr(json,(int) m_gpio); } - if (has_dio5()) { - fsep = json_indent(json,indLvl,fsep,"dio5"); - to_decstr(json,(int) m_dio5); + if (size_t s = m_melodies.size()) { + fsep = json_indent(json,indLvl,fsep); + indLvl += 2; + json << "\"melodies\":[\n"; + size_t i = 0; + for (;;) { + json_indent(json,indLvl,0); + m_melodies[i].toJSON(json,indLvl); + ++i; + if (i == s) + break; + json << ",\n"; + } + indLvl -= 2; + json.put('\n'); + json_indent(json,indLvl,0); + json.put(']'); } if (fsep == '{') json.put('{'); @@ -7035,49 +7786,28 @@ void SX1276Config::toJSON(stream &json, unsigned indLvl) const json.put('\n'); } -size_t SX1276Config::calcSize() const +size_t BuzzerConfig::calcSize() const { size_t r = 0; // required size, default is fixed length - // optional sint8 dio0, id 1 - if (has_dio0()) { - r += wiresize_s((varint_t)m_dio0) + 1 /* tag(dio0) 0x8 */; - } - // optional sint8 dio1, id 2 - if (has_dio1()) { - r += wiresize_s((varint_t)m_dio1) + 1 /* tag(dio1) 0x10 */; - } - // optional sint8 dio2, id 3 - if (has_dio2()) { - r += wiresize_s((varint_t)m_dio2) + 1 /* tag(dio2) 0x18 */; - } - // optional sint8 dio3, id 4 - if (has_dio3()) { - r += wiresize_s((varint_t)m_dio3) + 1 /* tag(dio3) 0x20 */; - } - // optional sint8 dio4, id 5 - if (has_dio4()) { - r += wiresize_s((varint_t)m_dio4) + 1 /* tag(dio4) 0x28 */; + // optional sint8 gpio, id 1 + if (has_gpio()) { + r += wiresize_s((varint_t)m_gpio) + 1 /* tag(gpio) 0x8 */; } - // optional sint8 dio5, id 6 - if (has_dio5()) { - r += wiresize_s((varint_t)m_dio5) + 1 /* tag(dio5) 0x30 */; + // repeated Melody melodies, id 2 + // repeated message melodies + for (size_t x = 0, y = m_melodies.size(); x < y; ++x) { + size_t s = m_melodies[x].calcSize(); + r += wiresize(s); + r += s + 1 /* tag(melodies) 0x10 */; } return r; } -bool SX1276Config::operator == (const SX1276Config &r) const +bool BuzzerConfig::operator == (const BuzzerConfig &r) const { - if (has_dio0() && (!(m_dio0 == r.m_dio0))) - return false; - if (has_dio1() && (!(m_dio1 == r.m_dio1))) - return false; - if (has_dio2() && (!(m_dio2 == r.m_dio2))) - return false; - if (has_dio3() && (!(m_dio3 == r.m_dio3))) - return false; - if (has_dio4() && (!(m_dio4 == r.m_dio4))) + if (has_gpio() && (!(m_gpio == r.m_gpio))) return false; - if (has_dio5() && (!(m_dio5 == r.m_dio5))) + if (!(m_melodies == r.m_melodies)) return false; return true; } @@ -7090,57 +7820,46 @@ bool SX1276Config::operator == (const SX1276Config &r) const * @return number of bytes successfully parsed or negative value indicating * an error. */ -int SX1276Config::setByName(const char *name, const char *value) +int BuzzerConfig::setByName(const char *name, const char *value) { - if (0 == strcmp(name,"dio0")) { - if (value == 0) { - clear_dio0(); - return 0; - } - int r = parse_ascii_s8(&m_dio0,value); - return r; - } - if (0 == strcmp(name,"dio1")) { - if (value == 0) { - clear_dio1(); - return 0; - } - int r = parse_ascii_s8(&m_dio1,value); - return r; - } - if (0 == strcmp(name,"dio2")) { - if (value == 0) { - clear_dio2(); - return 0; - } - int r = parse_ascii_s8(&m_dio2,value); - return r; - } - if (0 == strcmp(name,"dio3")) { - if (value == 0) { - clear_dio3(); - return 0; - } - int r = parse_ascii_s8(&m_dio3,value); - return r; - } - if (0 == strcmp(name,"dio4")) { + if (0 == strcmp(name,"gpio")) { if (value == 0) { - clear_dio4(); + clear_gpio(); return 0; } - int r = parse_ascii_s8(&m_dio4,value); + int r = parse_ascii_s8(&m_gpio,value); return r; } - if (0 == strcmp(name,"dio5")) { - if (value == 0) { - clear_dio5(); + if (0 == memcmp(name,"melodies",8)) { + if ((name[8] == 0) && (value == 0)) { + clear_melodies(); return 0; + } else if (name[8] == '[') { + char *idxe; + unsigned long x; + if ((name[9] == '+') && (name[10] == ']')) { + x = m_melodies.size(); + m_melodies.resize(x+1); + idxe = (char*)(name + 10); + if (value == 0) + return 0; + } else { + x = strtoul(name+9,&idxe,0); + if ((idxe[0] != ']') || (idxe == (name+9))) + return -370; + if (m_melodies.size() <= x) + return -371; + if ((idxe[1] == 0) && (value == 0)) { + m_melodies.erase(m_melodies.begin()+x); + return 0; + } + } + if (idxe[1] != '.') + return -372; + return m_melodies[x].setByName(idxe+2,value); } - int r = parse_ascii_s8(&m_dio5,value); - return r; } - return -335; + return -373; } HardwareConfig::HardwareConfig() @@ -7165,6 +7884,9 @@ void HardwareConfig::clear() #ifdef CONFIG_LEDS m_led.clear(); #endif // CONFIG_LEDS + #ifdef CONFIG_BUZZER + m_buzzer.clear(); + #endif // CONFIG_BUZZER #ifdef CONFIG_HLW8012 m_hlw8012.clear(); #endif // CONFIG_HLW8012 @@ -7278,6 +8000,10 @@ void HardwareConfig::toASCII(stream &o, size_t indent) const ascii_indent(o,indent); o << '}'; #endif // CONFIG_LEDS + #ifdef CONFIG_BUZZER + ascii_indent(o,indent,"buzzer"); + m_buzzer.toASCII(o,indent); + #endif // CONFIG_BUZZER #ifdef CONFIG_HLW8012 ascii_indent(o,indent,"hlw8012"); m_hlw8012.toASCII(o,indent); @@ -7376,7 +8102,7 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) union decode_union ud; ssize_t x = decode_early(a,e,&ud,&fid); if (x < 0) - return -336; + return -374; a += x; switch (fid) { case 0x5: // magic id 0, type uint32_t, coding 32bit @@ -7387,7 +8113,7 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n; n = m_system.fromMemory((const uint8_t*)a,ud.vi); if (n != (ssize_t)ud.vi) - return -337; + return -375; a += ud.vi; } p_validbits |= ((uint16_t)1U << 1); @@ -7397,7 +8123,7 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n; n = m_adc.fromMemory((const uint8_t*)a,ud.vi); if (n != (ssize_t)ud.vi) - return -338; + return -376; a += ud.vi; } p_validbits |= ((uint16_t)1U << 2); @@ -7408,7 +8134,7 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n; n = m_gpios.back().fromMemory((const uint8_t*)a,ud.vi); if (n != (ssize_t)ud.vi) - return -339; + return -377; a += ud.vi; } break; @@ -7419,7 +8145,7 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n; n = m_spibus.back().fromMemory((const uint8_t*)a,ud.vi); if (n != (ssize_t)ud.vi) - return -340; + return -378; a += ud.vi; } break; @@ -7431,7 +8157,7 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n; n = m_button.back().fromMemory((const uint8_t*)a,ud.vi); if (n != (ssize_t)ud.vi) - return -341; + return -379; a += ud.vi; } break; @@ -7443,7 +8169,7 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n; n = m_relay.back().fromMemory((const uint8_t*)a,ud.vi); if (n != (ssize_t)ud.vi) - return -342; + return -380; a += ud.vi; } break; @@ -7455,21 +8181,33 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n; n = m_led.back().fromMemory((const uint8_t*)a,ud.vi); if (n != (ssize_t)ud.vi) - return -343; + return -381; a += ud.vi; } break; #endif // CONFIG_LEDS + #ifdef CONFIG_BUZZER + case 0x9a: // buzzer id 19, type BuzzerConfig, coding byte[] + if (((ssize_t)ud.vi > 0) && ((ssize_t)ud.vi <= (e-a))) { + int n; + n = m_buzzer.fromMemory((const uint8_t*)a,ud.vi); + if (n != (ssize_t)ud.vi) + return -382; + a += ud.vi; + } + p_validbits |= ((uint16_t)1U << 3); + break; + #endif // CONFIG_BUZZER #ifdef CONFIG_HLW8012 case 0xa2: // hlw8012 id 20, type Hlw8012Config, coding byte[] if (((ssize_t)ud.vi > 0) && ((ssize_t)ud.vi <= (e-a))) { int n; n = m_hlw8012.fromMemory((const uint8_t*)a,ud.vi); if (n != (ssize_t)ud.vi) - return -344; + return -383; a += ud.vi; } - p_validbits |= ((uint16_t)1U << 3); + p_validbits |= ((uint16_t)1U << 4); break; #endif // CONFIG_HLW8012 #ifdef CONFIG_MAX7219 @@ -7478,10 +8216,10 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n; n = m_max7219.fromMemory((const uint8_t*)a,ud.vi); if (n != (ssize_t)ud.vi) - return -345; + return -384; a += ud.vi; } - p_validbits |= ((uint16_t)1U << 4); + p_validbits |= ((uint16_t)1U << 5); break; #endif // CONFIG_MAX7219 #ifdef CONFIG_TLC5947 @@ -7490,10 +8228,10 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n; n = m_tlc5947.fromMemory((const uint8_t*)a,ud.vi); if (n != (ssize_t)ud.vi) - return -346; + return -385; a += ud.vi; } - p_validbits |= ((uint16_t)1U << 5); + p_validbits |= ((uint16_t)1U << 6); break; #endif // CONFIG_TLC5947 #ifdef CONFIG_RGBLEDS @@ -7503,7 +8241,7 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n; n = m_ws2812b.back().fromMemory((const uint8_t*)a,ud.vi); if (n != (ssize_t)ud.vi) - return -347; + return -386; a += ud.vi; } break; @@ -7514,10 +8252,10 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n; n = m_dht.fromMemory((const uint8_t*)a,ud.vi); if (n != (ssize_t)ud.vi) - return -348; + return -387; a += ud.vi; } - p_validbits |= ((uint16_t)1U << 6); + p_validbits |= ((uint16_t)1U << 7); break; #endif // CONFIG_DHT #ifdef CONFIG_I2C @@ -7527,7 +8265,7 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n; n = m_i2c.back().fromMemory((const uint8_t*)a,ud.vi); if (n != (ssize_t)ud.vi) - return -349; + return -388; a += ud.vi; } break; @@ -7539,7 +8277,7 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n; n = m_hcsr04.back().fromMemory((const uint8_t*)a,ud.vi); if (n != (ssize_t)ud.vi) - return -350; + return -389; a += ud.vi; } break; @@ -7550,10 +8288,10 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n; n = m_onewire.fromMemory((const uint8_t*)a,ud.vi); if (n != (ssize_t)ud.vi) - return -351; + return -390; a += ud.vi; } - p_validbits |= ((uint16_t)1U << 7); + p_validbits |= ((uint16_t)1U << 8); break; #endif // CONFIG_ONEWIRE #ifdef CONFIG_SX1276 @@ -7562,10 +8300,10 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n; n = m_sx1276.fromMemory((const uint8_t*)a,ud.vi); if (n != (ssize_t)ud.vi) - return -352; + return -391; a += ud.vi; } - p_validbits |= ((uint16_t)1U << 8); + p_validbits |= ((uint16_t)1U << 9); break; #endif // CONFIG_SX1276 #ifdef CONFIG_IOEXTENDERS @@ -7575,7 +8313,7 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n; n = m_iocluster.back().fromMemory((const uint8_t*)a,ud.vi); if (n != (ssize_t)ud.vi) - return -353; + return -392; a += ud.vi; } break; @@ -7586,10 +8324,10 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n; n = m_display.fromMemory((const uint8_t*)a,ud.vi); if (n != (ssize_t)ud.vi) - return -354; + return -393; a += ud.vi; } - p_validbits |= ((uint16_t)1U << 9); + p_validbits |= ((uint16_t)1U << 10); break; #endif // CONFIG_DISPLAY default: @@ -7597,13 +8335,13 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) // need only to skip len prefixed data a += ud.vi; if (a > e) - return -355; + return -394; } } } assert((a-(const uint8_t *)b) == s); if (a > e) - return -356; + return -395; return a-(const uint8_t *)b; } @@ -7616,10 +8354,10 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const if (0 != (p_validbits & ((uint16_t)1U << 0))) { // 'magic': id=0, encoding=32bit, tag=0x5 if (5 > (e-a)) - return -357; + return -396; *a++ = 0x5; if ((e-a) < 4) - return -358; + return -397; write_u32(a,(uint32_t)m_magic); a += 4; } @@ -7627,13 +8365,13 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const if (0 != (p_validbits & ((uint16_t)1U << 1))) { // 'system': id=1, encoding=lenpfx, tag=0xa if (a >= e) - return -359; + return -398; *a++ = 0xa; ssize_t system_ws = m_system.calcSize(); n = write_varint(a,e-a,system_ws); a += n; if ((n <= 0) || (system_ws > (e-a))) - return -360; + return -399; n = m_system.toMemory(a,e-a); a += n; assert(n == system_ws); @@ -7643,13 +8381,13 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const if (0 != (p_validbits & ((uint16_t)1U << 2))) { // 'adc': id=4, encoding=lenpfx, tag=0x22 if (a >= e) - return -361; + return -400; *a++ = 0x22; ssize_t adc_ws = m_adc.calcSize(); n = write_varint(a,e-a,adc_ws); a += n; if ((n <= 0) || (adc_ws > (e-a))) - return -362; + return -401; n = m_adc.toMemory(a,e-a); a += n; assert(n == adc_ws); @@ -7663,13 +8401,13 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const for (const auto &x : m_gpios) { // 'gpios': id=7, encoding=lenpfx, tag=0x3a if (a >= e) - return -363; + return -402; *a++ = 0x3a; ssize_t gpios_ws = x.calcSize(); n = write_varint(a,e-a,gpios_ws); a += n; if ((n <= 0) || (gpios_ws > (e-a))) - return -364; + return -403; n = x.toMemory(a,e-a); a += n; assert(n == gpios_ws); @@ -7678,13 +8416,13 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const for (const auto &x : m_spibus) { // 'spibus': id=8, encoding=lenpfx, tag=0x42 if (a >= e) - return -365; + return -404; *a++ = 0x42; ssize_t spibus_ws = x.calcSize(); n = write_varint(a,e-a,spibus_ws); a += n; if ((n <= 0) || (spibus_ws > (e-a))) - return -366; + return -405; n = x.toMemory(a,e-a); a += n; assert(n == spibus_ws); @@ -7694,14 +8432,14 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const for (const auto &x : m_button) { // 'button': id=16, encoding=lenpfx, tag=0x82 if (2 > (e-a)) - return -367; + return -406; *a++ = 0x82; *a++ = 0x1; ssize_t button_ws = x.calcSize(); n = write_varint(a,e-a,button_ws); a += n; if ((n <= 0) || (button_ws > (e-a))) - return -368; + return -407; n = x.toMemory(a,e-a); a += n; assert(n == button_ws); @@ -7711,14 +8449,14 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const for (const auto &x : m_relay) { // 'relay': id=17, encoding=lenpfx, tag=0x8a if (2 > (e-a)) - return -369; + return -408; *a++ = 0x8a; *a++ = 0x1; ssize_t relay_ws = x.calcSize(); n = write_varint(a,e-a,relay_ws); a += n; if ((n <= 0) || (relay_ws > (e-a))) - return -370; + return -409; n = x.toMemory(a,e-a); a += n; assert(n == relay_ws); @@ -7728,32 +8466,50 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const for (const auto &x : m_led) { // 'led': id=18, encoding=lenpfx, tag=0x92 if (2 > (e-a)) - return -371; + return -410; *a++ = 0x92; *a++ = 0x1; ssize_t led_ws = x.calcSize(); n = write_varint(a,e-a,led_ws); a += n; if ((n <= 0) || (led_ws > (e-a))) - return -372; + return -411; n = x.toMemory(a,e-a); a += n; assert(n == led_ws); } #endif // CONFIG_LEDS + #ifdef CONFIG_BUZZER + // has buzzer? + if (0 != (p_validbits & ((uint16_t)1U << 3))) { + // 'buzzer': id=19, encoding=lenpfx, tag=0x9a + if (2 > (e-a)) + return -412; + *a++ = 0x9a; + *a++ = 0x1; + ssize_t buzzer_ws = m_buzzer.calcSize(); + n = write_varint(a,e-a,buzzer_ws); + a += n; + if ((n <= 0) || (buzzer_ws > (e-a))) + return -413; + n = m_buzzer.toMemory(a,e-a); + a += n; + assert(n == buzzer_ws); + } + #endif // CONFIG_BUZZER #ifdef CONFIG_HLW8012 // has hlw8012? - if (0 != (p_validbits & ((uint16_t)1U << 3))) { + if (0 != (p_validbits & ((uint16_t)1U << 4))) { // 'hlw8012': id=20, encoding=lenpfx, tag=0xa2 if (2 > (e-a)) - return -373; + return -414; *a++ = 0xa2; *a++ = 0x1; ssize_t hlw8012_ws = m_hlw8012.calcSize(); n = write_varint(a,e-a,hlw8012_ws); a += n; if ((n <= 0) || (hlw8012_ws > (e-a))) - return -374; + return -415; n = m_hlw8012.toMemory(a,e-a); a += n; assert(n == hlw8012_ws); @@ -7761,17 +8517,17 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const #endif // CONFIG_HLW8012 #ifdef CONFIG_MAX7219 // has max7219? - if (0 != (p_validbits & ((uint16_t)1U << 4))) { + if (0 != (p_validbits & ((uint16_t)1U << 5))) { // 'max7219': id=32, encoding=lenpfx, tag=0x102 if (2 > (e-a)) - return -375; + return -416; *a++ = 0x82; *a++ = 0x2; ssize_t max7219_ws = m_max7219.calcSize(); n = write_varint(a,e-a,max7219_ws); a += n; if ((n <= 0) || (max7219_ws > (e-a))) - return -376; + return -417; n = m_max7219.toMemory(a,e-a); a += n; assert(n == max7219_ws); @@ -7779,17 +8535,17 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const #endif // CONFIG_MAX7219 #ifdef CONFIG_TLC5947 // has tlc5947? - if (0 != (p_validbits & ((uint16_t)1U << 5))) { + if (0 != (p_validbits & ((uint16_t)1U << 6))) { // 'tlc5947': id=33, encoding=lenpfx, tag=0x10a if (2 > (e-a)) - return -377; + return -418; *a++ = 0x8a; *a++ = 0x2; ssize_t tlc5947_ws = m_tlc5947.calcSize(); n = write_varint(a,e-a,tlc5947_ws); a += n; if ((n <= 0) || (tlc5947_ws > (e-a))) - return -378; + return -419; n = m_tlc5947.toMemory(a,e-a); a += n; assert(n == tlc5947_ws); @@ -7799,14 +8555,14 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const for (const auto &x : m_ws2812b) { // 'ws2812b': id=34, encoding=lenpfx, tag=0x112 if (2 > (e-a)) - return -379; + return -420; *a++ = 0x92; *a++ = 0x2; ssize_t ws2812b_ws = x.calcSize(); n = write_varint(a,e-a,ws2812b_ws); a += n; if ((n <= 0) || (ws2812b_ws > (e-a))) - return -380; + return -421; n = x.toMemory(a,e-a); a += n; assert(n == ws2812b_ws); @@ -7814,17 +8570,17 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const #endif // CONFIG_RGBLEDS #ifdef CONFIG_DHT // has dht? - if (0 != (p_validbits & ((uint16_t)1U << 6))) { + if (0 != (p_validbits & ((uint16_t)1U << 7))) { // 'dht': id=35, encoding=lenpfx, tag=0x11a if (2 > (e-a)) - return -381; + return -422; *a++ = 0x9a; *a++ = 0x2; ssize_t dht_ws = m_dht.calcSize(); n = write_varint(a,e-a,dht_ws); a += n; if ((n <= 0) || (dht_ws > (e-a))) - return -382; + return -423; n = m_dht.toMemory(a,e-a); a += n; assert(n == dht_ws); @@ -7834,14 +8590,14 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const for (const auto &x : m_i2c) { // 'i2c': id=36, encoding=lenpfx, tag=0x122 if (2 > (e-a)) - return -383; + return -424; *a++ = 0xa2; *a++ = 0x2; ssize_t i2c_ws = x.calcSize(); n = write_varint(a,e-a,i2c_ws); a += n; if ((n <= 0) || (i2c_ws > (e-a))) - return -384; + return -425; n = x.toMemory(a,e-a); a += n; assert(n == i2c_ws); @@ -7851,14 +8607,14 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const for (const auto &x : m_hcsr04) { // 'hcsr04': id=37, encoding=lenpfx, tag=0x12a if (2 > (e-a)) - return -385; + return -426; *a++ = 0xaa; *a++ = 0x2; ssize_t hcsr04_ws = x.calcSize(); n = write_varint(a,e-a,hcsr04_ws); a += n; if ((n <= 0) || (hcsr04_ws > (e-a))) - return -386; + return -427; n = x.toMemory(a,e-a); a += n; assert(n == hcsr04_ws); @@ -7866,17 +8622,17 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const #endif // CONFIG_HCSR04 #ifdef CONFIG_ONEWIRE // has onewire? - if (0 != (p_validbits & ((uint16_t)1U << 7))) { + if (0 != (p_validbits & ((uint16_t)1U << 8))) { // 'onewire': id=38, encoding=lenpfx, tag=0x132 if (2 > (e-a)) - return -387; + return -428; *a++ = 0xb2; *a++ = 0x2; ssize_t onewire_ws = m_onewire.calcSize(); n = write_varint(a,e-a,onewire_ws); a += n; if ((n <= 0) || (onewire_ws > (e-a))) - return -388; + return -429; n = m_onewire.toMemory(a,e-a); a += n; assert(n == onewire_ws); @@ -7884,17 +8640,17 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const #endif // CONFIG_ONEWIRE #ifdef CONFIG_SX1276 // has sx1276? - if (0 != (p_validbits & ((uint16_t)1U << 8))) { + if (0 != (p_validbits & ((uint16_t)1U << 9))) { // 'sx1276': id=39, encoding=lenpfx, tag=0x13a if (2 > (e-a)) - return -389; + return -430; *a++ = 0xba; *a++ = 0x2; ssize_t sx1276_ws = m_sx1276.calcSize(); n = write_varint(a,e-a,sx1276_ws); a += n; if ((n <= 0) || (sx1276_ws > (e-a))) - return -390; + return -431; n = m_sx1276.toMemory(a,e-a); a += n; assert(n == sx1276_ws); @@ -7904,14 +8660,14 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const for (const auto &x : m_iocluster) { // 'iocluster': id=40, encoding=lenpfx, tag=0x142 if (2 > (e-a)) - return -391; + return -432; *a++ = 0xc2; *a++ = 0x2; ssize_t iocluster_ws = x.calcSize(); n = write_varint(a,e-a,iocluster_ws); a += n; if ((n <= 0) || (iocluster_ws > (e-a))) - return -392; + return -433; n = x.toMemory(a,e-a); a += n; assert(n == iocluster_ws); @@ -7919,17 +8675,17 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const #endif // CONFIG_IOEXTENDERS #ifdef CONFIG_DISPLAY // has display? - if (0 != (p_validbits & ((uint16_t)1U << 9))) { + if (0 != (p_validbits & ((uint16_t)1U << 10))) { // 'display': id=50, encoding=lenpfx, tag=0x192 if (2 > (e-a)) - return -393; + return -434; *a++ = 0x92; *a++ = 0x3; ssize_t display_ws = m_display.calcSize(); n = write_varint(a,e-a,display_ws); a += n; if ((n <= 0) || (display_ws > (e-a))) - return -394; + return -435; n = m_display.toMemory(a,e-a); a += n; assert(n == display_ws); @@ -8053,6 +8809,12 @@ void HardwareConfig::toJSON(stream &json, unsigned indLvl) const json.put(']'); } #endif // CONFIG_LEDS + #ifdef CONFIG_BUZZER + if (has_buzzer()) { + fsep = json_indent(json,indLvl,fsep,"buzzer"); + m_buzzer.toJSON(json,indLvl); + } + #endif // CONFIG_BUZZER #ifdef CONFIG_HLW8012 if (has_hlw8012()) { fsep = json_indent(json,indLvl,fsep,"hlw8012"); @@ -8252,6 +9014,13 @@ size_t HardwareConfig::calcSize() const r += s + 2 /* tag(led) 0x90 */; } #endif // CONFIG_LEDS + #ifdef CONFIG_BUZZER + // optional BuzzerConfig buzzer, id 19 + if (has_buzzer()) { + size_t buzzer_s = m_buzzer.calcSize(); + r += buzzer_s + wiresize(buzzer_s) + 2 /* tag(buzzer) 0x98 */; + } + #endif // CONFIG_BUZZER #ifdef CONFIG_HLW8012 // optional Hlw8012Config hlw8012, id 20 if (has_hlw8012()) { @@ -8368,6 +9137,10 @@ bool HardwareConfig::operator == (const HardwareConfig &r) const if (!(m_led == r.m_led)) return false; #endif // CONFIG_LEDS + #ifdef CONFIG_BUZZER + if (has_buzzer() && (!(m_buzzer == r.m_buzzer))) + return false; + #endif // CONFIG_BUZZER #ifdef CONFIG_HLW8012 if (has_hlw8012() && (!(m_hlw8012 == r.m_hlw8012))) return false; @@ -8469,16 +9242,16 @@ int HardwareConfig::setByName(const char *name, const char *value) } else { x = strtoul(name+6,&idxe,0); if ((idxe[0] != ']') || (idxe == (name+6))) - return -395; + return -436; if (m_gpios.size() <= x) - return -396; + return -437; if ((idxe[1] == 0) && (value == 0)) { m_gpios.erase(m_gpios.begin()+x); return 0; } } if (idxe[1] != '.') - return -397; + return -438; return m_gpios[x].setByName(idxe+2,value); } } @@ -8499,16 +9272,16 @@ int HardwareConfig::setByName(const char *name, const char *value) } else { x = strtoul(name+7,&idxe,0); if ((idxe[0] != ']') || (idxe == (name+7))) - return -398; + return -439; if (m_spibus.size() <= x) - return -399; + return -440; if ((idxe[1] == 0) && (value == 0)) { m_spibus.erase(m_spibus.begin()+x); return 0; } } if (idxe[1] != '.') - return -400; + return -441; return m_spibus[x].setByName(idxe+2,value); } } @@ -8530,16 +9303,16 @@ int HardwareConfig::setByName(const char *name, const char *value) } else { x = strtoul(name+7,&idxe,0); if ((idxe[0] != ']') || (idxe == (name+7))) - return -401; + return -442; if (m_button.size() <= x) - return -402; + return -443; if ((idxe[1] == 0) && (value == 0)) { m_button.erase(m_button.begin()+x); return 0; } } if (idxe[1] != '.') - return -403; + return -444; return m_button[x].setByName(idxe+2,value); } } @@ -8561,16 +9334,16 @@ int HardwareConfig::setByName(const char *name, const char *value) } else { x = strtoul(name+6,&idxe,0); if ((idxe[0] != ']') || (idxe == (name+6))) - return -404; + return -445; if (m_relay.size() <= x) - return -405; + return -446; if ((idxe[1] == 0) && (value == 0)) { m_relay.erase(m_relay.begin()+x); return 0; } } if (idxe[1] != '.') - return -406; + return -447; return m_relay[x].setByName(idxe+2,value); } } @@ -8592,27 +9365,38 @@ int HardwareConfig::setByName(const char *name, const char *value) } else { x = strtoul(name+4,&idxe,0); if ((idxe[0] != ']') || (idxe == (name+4))) - return -407; + return -448; if (m_led.size() <= x) - return -408; + return -449; if ((idxe[1] == 0) && (value == 0)) { m_led.erase(m_led.begin()+x); return 0; } } if (idxe[1] != '.') - return -409; + return -450; return m_led[x].setByName(idxe+2,value); } } #endif // CONFIG_LEDS + #ifdef CONFIG_BUZZER + if (0 == memcmp(name,"buzzer",6)) { + if ((name[6] == 0) && (value == 0)) { + clear_buzzer(); + return 0; + } else if (name[6] == '.') { + p_validbits |= ((uint16_t)1U << 3); + return m_buzzer.setByName(name+7,value); + } + } + #endif // CONFIG_BUZZER #ifdef CONFIG_HLW8012 if (0 == memcmp(name,"hlw8012",7)) { if ((name[7] == 0) && (value == 0)) { clear_hlw8012(); return 0; } else if (name[7] == '.') { - p_validbits |= ((uint16_t)1U << 3); + p_validbits |= ((uint16_t)1U << 4); return m_hlw8012.setByName(name+8,value); } } @@ -8623,7 +9407,7 @@ int HardwareConfig::setByName(const char *name, const char *value) clear_max7219(); return 0; } else if (name[7] == '.') { - p_validbits |= ((uint16_t)1U << 4); + p_validbits |= ((uint16_t)1U << 5); return m_max7219.setByName(name+8,value); } } @@ -8634,7 +9418,7 @@ int HardwareConfig::setByName(const char *name, const char *value) clear_tlc5947(); return 0; } else if (name[7] == '.') { - p_validbits |= ((uint16_t)1U << 5); + p_validbits |= ((uint16_t)1U << 6); return m_tlc5947.setByName(name+8,value); } } @@ -8656,16 +9440,16 @@ int HardwareConfig::setByName(const char *name, const char *value) } else { x = strtoul(name+8,&idxe,0); if ((idxe[0] != ']') || (idxe == (name+8))) - return -410; + return -451; if (m_ws2812b.size() <= x) - return -411; + return -452; if ((idxe[1] == 0) && (value == 0)) { m_ws2812b.erase(m_ws2812b.begin()+x); return 0; } } if (idxe[1] != '.') - return -412; + return -453; return m_ws2812b[x].setByName(idxe+2,value); } } @@ -8676,7 +9460,7 @@ int HardwareConfig::setByName(const char *name, const char *value) clear_dht(); return 0; } else if (name[3] == '.') { - p_validbits |= ((uint16_t)1U << 6); + p_validbits |= ((uint16_t)1U << 7); return m_dht.setByName(name+4,value); } } @@ -8698,16 +9482,16 @@ int HardwareConfig::setByName(const char *name, const char *value) } else { x = strtoul(name+4,&idxe,0); if ((idxe[0] != ']') || (idxe == (name+4))) - return -413; + return -454; if (m_i2c.size() <= x) - return -414; + return -455; if ((idxe[1] == 0) && (value == 0)) { m_i2c.erase(m_i2c.begin()+x); return 0; } } if (idxe[1] != '.') - return -415; + return -456; return m_i2c[x].setByName(idxe+2,value); } } @@ -8729,16 +9513,16 @@ int HardwareConfig::setByName(const char *name, const char *value) } else { x = strtoul(name+7,&idxe,0); if ((idxe[0] != ']') || (idxe == (name+7))) - return -416; + return -457; if (m_hcsr04.size() <= x) - return -417; + return -458; if ((idxe[1] == 0) && (value == 0)) { m_hcsr04.erase(m_hcsr04.begin()+x); return 0; } } if (idxe[1] != '.') - return -418; + return -459; return m_hcsr04[x].setByName(idxe+2,value); } } @@ -8749,7 +9533,7 @@ int HardwareConfig::setByName(const char *name, const char *value) clear_onewire(); return 0; } else if (name[7] == '.') { - p_validbits |= ((uint16_t)1U << 7); + p_validbits |= ((uint16_t)1U << 8); return m_onewire.setByName(name+8,value); } } @@ -8760,7 +9544,7 @@ int HardwareConfig::setByName(const char *name, const char *value) clear_sx1276(); return 0; } else if (name[6] == '.') { - p_validbits |= ((uint16_t)1U << 8); + p_validbits |= ((uint16_t)1U << 9); return m_sx1276.setByName(name+7,value); } } @@ -8782,16 +9566,16 @@ int HardwareConfig::setByName(const char *name, const char *value) } else { x = strtoul(name+10,&idxe,0); if ((idxe[0] != ']') || (idxe == (name+10))) - return -419; + return -460; if (m_iocluster.size() <= x) - return -420; + return -461; if ((idxe[1] == 0) && (value == 0)) { m_iocluster.erase(m_iocluster.begin()+x); return 0; } } if (idxe[1] != '.') - return -421; + return -462; return m_iocluster[x].setByName(idxe+2,value); } } @@ -8802,11 +9586,11 @@ int HardwareConfig::setByName(const char *name, const char *value) clear_display(); return 0; } else if (name[7] == '.') { - p_validbits |= ((uint16_t)1U << 9); + p_validbits |= ((uint16_t)1U << 10); return m_display.setByName(name+8,value); } } #endif // CONFIG_DISPLAY - return -422; + return -463; } diff --git a/components/wfc/hwcfg_esp8285.h b/components/wfc/hwcfg_esp8285.h index c92c2a0..d366de6 100644 --- a/components/wfc/hwcfg_esp8285.h +++ b/components/wfc/hwcfg_esp8285.h @@ -1,8 +1,8 @@ /**************************************************************************** * * Code generated by Wire-Format-Compiler (WFC) - * WFC Version: P2304 (hg:456/095c4982cbea) - * WFC is Copyright 2015-2022, Thomas Maier-Komor + * WFC Version: P2304.3 (hg:459/5fefa02bc543) + * WFC is Copyright 2015-2023, Thomas Maier-Komor * * Source Information: * =================== @@ -10,7 +10,7 @@ * Copyright: 2018-2023 * Author : Thomas Maier-Komor * - * Code generated on 2023-10-24, 21:26:42 (CET). + * Code generated on 2023-11-26, 14:29:43 (CET). * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -506,6 +506,46 @@ class SystemConfig bool *mutable_usb_con(); #endif // CONFIG_USB_CONSOLE + #ifdef CONFIG_ESP_PHY_ENABLE_USB + // optional sint8 cc1_gpio, id 11 + /*! + * Function for querying if cc1_gpio has been set. + * @return true if cc1_gpio is set. + */ + bool has_cc1_gpio() const; + //! Function to reset cc1_gpio to its default/unset value. + void clear_cc1_gpio(); + //! Get value of cc1_gpio. + int8_t cc1_gpio() const; + //! Set cc1_gpio using a constant reference + void set_cc1_gpio(int8_t v); + /*! + * Provide mutable access to cc1_gpio. + * @return pointer to member variable of cc1_gpio. + */ + int8_t *mutable_cc1_gpio(); + #endif // CONFIG_ESP_PHY_ENABLE_USB + + #ifdef CONFIG_ESP_PHY_ENABLE_USB + // optional sint8 cc2_gpio, id 12 + /*! + * Function for querying if cc2_gpio has been set. + * @return true if cc2_gpio is set. + */ + bool has_cc2_gpio() const; + //! Function to reset cc2_gpio to its default/unset value. + void clear_cc2_gpio(); + //! Get value of cc2_gpio. + int8_t cc2_gpio() const; + //! Set cc2_gpio using a constant reference + void set_cc2_gpio(int8_t v); + /*! + * Provide mutable access to cc2_gpio. + * @return pointer to member variable of cc2_gpio. + */ + int8_t *mutable_cc2_gpio(); + #endif // CONFIG_ESP_PHY_ENABLE_USB + protected: //! string manufacturer, id 1 @@ -532,6 +572,14 @@ class SystemConfig //! bool usb_con, id 10 bool m_usb_con = true; #endif // CONFIG_USB_CONSOLE + #ifdef CONFIG_ESP_PHY_ENABLE_USB + //! sint8 cc1_gpio, id 11 + int8_t m_cc1_gpio = -1; + #endif // CONFIG_ESP_PHY_ENABLE_USB + #ifdef CONFIG_ESP_PHY_ENABLE_USB + //! sint8 cc2_gpio, id 12 + int8_t m_cc2_gpio = -1; + #endif // CONFIG_ESP_PHY_ENABLE_USB private: uint8_t p_validbits = 0; @@ -2320,6 +2368,10 @@ class LedConfig bool config_open_drain() const; //! Function to set the open_drain part of bitset config. void set_config_open_drain(bool); + //! Function to get the init_high part of bitset config. + bool config_init_high() const; + //! Function to set the init_high part of bitset config. + void set_config_init_high(bool); //! Set config using a constant reference void set_config(ledcfg_t v); /*! @@ -3164,10 +3216,6 @@ class GpioConfig bool config_pulldown() const; //! Function to set the pulldown part of bitset config. void set_config_pulldown(bool); - //! Function to get the cap_freq_r2r part of bitset config. - bool config_cap_freq_r2r() const; - //! Function to set the cap_freq_r2r part of bitset config. - void set_config_cap_freq_r2r(bool); //! Set config using a constant reference void set_config(gpiocfg_t v); /*! @@ -3496,10 +3544,30 @@ class SpiDeviceConfig */ int8_t *mutable_cd(); + // optional unsigned freq, id 6 + /*! + * Function for querying if freq has been set. + * @return true if freq is set. + */ + bool has_freq() const; + //! Function to reset freq to its default/unset value. + void clear_freq(); + //! Get value of freq. + uint32_t freq() const; + //! Set freq using a constant reference + void set_freq(uint32_t v); + /*! + * Provide mutable access to freq. + * @return pointer to member variable of freq. + */ + uint32_t *mutable_freq(); + protected: //! spidrv_t drv, id 1 spidrv_t m_drv = spidrv_invalid; + //! unsigned freq, id 6 + uint32_t m_freq = 0; //! sint8 cs, id 2 int8_t m_cs = -1; //! sint8 intr, id 3 @@ -4294,11 +4362,11 @@ class SX1276Config -class HardwareConfig +class Tone { public: - HardwareConfig(); - bool operator == (const HardwareConfig &r) const; + Tone(); + bool operator == (const Tone &r) const; //! Function for resetting all members to their default values. void clear(); @@ -4356,180 +4424,530 @@ class HardwareConfig //! @return number of bytes parsed from value or negative value if an error occurs int setByName(const char *param, const char *value); - // optional fixed32 magic, id 0 + // optional unsigned freq, id 1 /*! - * Function for querying if magic has been set. - * @return true if magic is set. + * Function for querying if freq has been set. + * @return true if freq is set. */ - bool has_magic() const; - //! Function to reset magic to its default/unset value. - void clear_magic(); - //! Get value of magic. - uint32_t magic() const; - //! Set magic using a constant reference - void set_magic(uint32_t v); + bool has_freq() const; + //! Function to reset freq to its default/unset value. + void clear_freq(); + //! Get value of freq. + uint32_t freq() const; + //! Set freq using a constant reference + void set_freq(uint32_t v); /*! - * Provide mutable access to magic. - * @return pointer to member variable of magic. + * Provide mutable access to freq. + * @return pointer to member variable of freq. */ - uint32_t *mutable_magic(); + uint32_t *mutable_freq(); - // optional SystemConfig system, id 1 + // optional unsigned duration, id 2 /*! - * Function for querying if system has been set. - * @return true if system is set. + * Function for querying if duration has been set. + * @return true if duration is set. */ - bool has_system() const; - //! Function to reset system to its default/unset value. - void clear_system(); - //! Get value of system. - const SystemConfig &system() const; + bool has_duration() const; + //! Function to reset duration to its default/unset value. + void clear_duration(); + //! Get value of duration. + uint32_t duration() const; + //! Set duration using a constant reference + void set_duration(uint32_t v); /*! - * Function for setting members of system using data from a serialized object. - * @param data pointer to binary data - * @param s number of bytes at data pointer + * Provide mutable access to duration. + * @return pointer to member variable of duration. */ - void set_system(const void *data, size_t s); - //! Set system using a constant reference - void set_system(const SystemConfig &v); + uint32_t *mutable_duration(); + + + protected: + //! unsigned freq, id 1 + uint32_t m_freq = 0; + //! unsigned duration, id 2 + uint32_t m_duration = 0; + + private: + uint8_t p_validbits = 0; +}; + + + + +class Melody +{ + public: + Melody(); + bool operator == (const Melody &r) const; + + //! Function for resetting all members to their default values. + void clear(); + /*! - * Provide mutable access to system. - * @return pointer to member variable of system. + * Calculates the required number of bytes for serializing this object. + * If member variables of the object are modified, the number of bytes + * needed for serialization may change, too. + * @return bytes needed for a serialized object representation */ - SystemConfig *mutable_system(); + size_t calcSize() const; - // unused repeated UartConfig uart, id 3 - // optional AdcConfig adc, id 4 /*! - * Function for querying if adc has been set. - * @return true if adc is set. + * Function for parsing serialized data and update this object accordingly. + * Member variables that are not in the serialized data are not reset. + * @param b buffer of serialized data + * @param s number of bytes available in the buffer + * @return number of bytes successfully parsed (can be < s) + * or a negative value indicating the error encountered */ - bool has_adc() const; - //! Function to reset adc to its default/unset value. - void clear_adc(); - //! Get value of adc. - const AdcConfig &adc() const; + ssize_t fromMemory(const void *b, ssize_t s); + /*! - * Function for setting adc using binary data. - * @param data pointer to binary data - * @param s number of bytes at data pointer + * Function for serializing the object to memory. + * @param b buffer to serialize the object to + * @param s number of bytes available in the buffer + * @return number of bytes successfully serialized */ - void set_adc(const void *data, size_t s); - //! Set adc using a constant reference - void set_adc(const AdcConfig &v); + ssize_t toMemory(uint8_t *, ssize_t) const; + /*! - * Provide mutable access to adc. - * @return pointer to member variable of adc. + * Function for writing a JSON representation of this object to a stream. + * @param json stream object the JSON output shall be written to + * @indLvl current indention level */ - AdcConfig *mutable_adc(); + void toJSON(stream &json, unsigned indLvl = 0) const; - #ifdef CONFIG_TOUCHPAD - // unused optional TouchpadConfig touchpad, id 5 - #endif // CONFIG_TOUCHPAD - #ifdef CONFIG_TOUCHPAD - // unused repeated TouchChannelConfig tp_channel, id 6 - #endif // CONFIG_TOUCHPAD - // repeated GpioConfig gpios, id 7 - //! Function get const-access to the elements of gpios. - const std::vector &gpios() const; - //! Function to get the number of elements in gpios. - size_t gpios_size() const; /*! - * Function to append a element to gpios. - * @return point to newly added element. + * Function for writing an ASCII representation of this object to a stream. + * @param o output stream + * @param indent initial indention level */ - GpioConfig* add_gpios(); - //! Function to reset gpios to its default/unset value. - void clear_gpios(); - //! Get value of element x of gpios. - const GpioConfig &gpios(unsigned x) const; - //! Set gpios using a constant reference - void set_gpios(unsigned x, const GpioConfig &v); + void toASCII(stream &o, size_t indent = 0) const; + /*! - * Provide mutable access to gpios. - * @return pointer to member variable of gpios. + * Function for determining the maximum size that the object may need for + * its serialized representation + * @return maximum number of bytes or SIZE_MAX if no limit can be determined */ - GpioConfig *mutable_gpios(unsigned x); - //! Function to get mutable access to all elements of gpios. - std::vector *mutable_gpios(); + static size_t getMaxSize(); - #ifdef CONFIG_SPI - // repeated SpiBusConfig spibus, id 8 - //! Function get const-access to the elements of spibus. - const std::vector &spibus() const; - //! Function to get the number of elements in spibus. - size_t spibus_size() const; + //! Function for setting a parameter by its ASCII name using an ASCII representation of value. + //! @param param parameter name + //! @param value ASCII representation of the value + //! @return number of bytes parsed from value or negative value if an error occurs + int setByName(const char *param, const char *value); + + // optional string name, id 1 /*! - * Function to append a element to spibus. - * @return point to newly added element. + * Function for querying if name has been set. + * @return true if name is set. */ - SpiBusConfig* add_spibus(); - //! Function to reset spibus to its default/unset value. - void clear_spibus(); - //! Get value of element x of spibus. - const SpiBusConfig &spibus(unsigned x) const; - //! Set spibus using a constant reference - void set_spibus(unsigned x, const SpiBusConfig &v); + bool has_name() const; + //! Function to reset name to its default/unset value. + void clear_name(); + //! Get value of name. + const estring &name() const; /*! - * Provide mutable access to spibus. - * @return pointer to member variable of spibus. + * Function for setting name using binary data. + * @param data pointer to binary data + * @param s number of bytes at data pointer */ - SpiBusConfig *mutable_spibus(unsigned x); - //! Function to get mutable access to all elements of spibus. - std::vector *mutable_spibus(); - #endif // CONFIG_SPI + void set_name(const void *data, size_t s); + //! Set name using a constant reference + void set_name(const estring &v); + //! Set name using a pointer to a null-terminated C-string. + void set_name(const char *); + /*! + * Provide mutable access to name. + * @return pointer to member variable of name. + */ + estring *mutable_name(); - #ifdef CONFIG_BUTTON - // repeated ButtonConfig button, id 16 - //! Function get const-access to the elements of button. - const std::vector &button() const; - //! Function to get the number of elements in button. - size_t button_size() const; + // repeated fixed16 tones, id 2 + //! Function get const-access to the elements of tones. + const std::vector &tones() const; + //! Function to get the number of elements in tones. + size_t tones_size() const; /*! - * Function to append a element to button. + * Function to append a element to tones. * @return point to newly added element. */ - ButtonConfig* add_button(); - //! Function to reset button to its default/unset value. - void clear_button(); - //! Get value of element x of button. - const ButtonConfig &button(unsigned x) const; - //! Set button using a constant reference - void set_button(unsigned x, const ButtonConfig &v); + void add_tones(uint16_t v); + //! Function to reset tones to its default/unset value. + void clear_tones(); + //! Get value of element x of tones. + uint16_t tones(unsigned x) const; + //! Set tones using a constant reference + void set_tones(unsigned x, uint16_t v); /*! - * Provide mutable access to button. - * @return pointer to member variable of button. + * Provide mutable access to tones. + * @return pointer to member variable of tones. */ - ButtonConfig *mutable_button(unsigned x); - //! Function to get mutable access to all elements of button. - std::vector *mutable_button(); - #endif // CONFIG_BUTTON + uint16_t *mutable_tones(unsigned x); + //! Function to get mutable access to all elements of tones. + std::vector *mutable_tones(); + + + protected: + //! string name, id 1 + estring m_name; + //! fixed16 tones, id 2 + std::vector m_tones; +}; + + + + +class BuzzerConfig +{ + public: + BuzzerConfig(); + bool operator == (const BuzzerConfig &r) const; + + //! Function for resetting all members to their default values. + void clear(); - #ifdef CONFIG_RELAY - // repeated RelayConfig relay, id 17 - //! Function get const-access to the elements of relay. - const std::vector &relay() const; - //! Function to get the number of elements in relay. - size_t relay_size() const; /*! - * Function to append a element to relay. - * @return point to newly added element. + * Calculates the required number of bytes for serializing this object. + * If member variables of the object are modified, the number of bytes + * needed for serialization may change, too. + * @return bytes needed for a serialized object representation */ - RelayConfig* add_relay(); - //! Function to reset relay to its default/unset value. - void clear_relay(); - //! Get value of element x of relay. - const RelayConfig &relay(unsigned x) const; - //! Set relay using a constant reference - void set_relay(unsigned x, const RelayConfig &v); + size_t calcSize() const; + /*! - * Provide mutable access to relay. - * @return pointer to member variable of relay. + * Function for parsing serialized data and update this object accordingly. + * Member variables that are not in the serialized data are not reset. + * @param b buffer of serialized data + * @param s number of bytes available in the buffer + * @return number of bytes successfully parsed (can be < s) + * or a negative value indicating the error encountered */ - RelayConfig *mutable_relay(unsigned x); - //! Function to get mutable access to all elements of relay. - std::vector *mutable_relay(); - #endif // CONFIG_RELAY + ssize_t fromMemory(const void *b, ssize_t s); + + /*! + * Function for serializing the object to memory. + * @param b buffer to serialize the object to + * @param s number of bytes available in the buffer + * @return number of bytes successfully serialized + */ + ssize_t toMemory(uint8_t *, ssize_t) const; + + /*! + * Function for writing a JSON representation of this object to a stream. + * @param json stream object the JSON output shall be written to + * @indLvl current indention level + */ + void toJSON(stream &json, unsigned indLvl = 0) const; + + /*! + * Function for writing an ASCII representation of this object to a stream. + * @param o output stream + * @param indent initial indention level + */ + void toASCII(stream &o, size_t indent = 0) const; + + /*! + * Function for determining the maximum size that the object may need for + * its serialized representation + * @return maximum number of bytes or SIZE_MAX if no limit can be determined + */ + static size_t getMaxSize(); + + //! Function for setting a parameter by its ASCII name using an ASCII representation of value. + //! @param param parameter name + //! @param value ASCII representation of the value + //! @return number of bytes parsed from value or negative value if an error occurs + int setByName(const char *param, const char *value); + + // optional sint8 gpio, id 1 + /*! + * Function for querying if gpio has been set. + * @return true if gpio is set. + */ + bool has_gpio() const; + //! Function to reset gpio to its default/unset value. + void clear_gpio(); + //! Get value of gpio. + int8_t gpio() const; + //! Set gpio using a constant reference + void set_gpio(int8_t v); + /*! + * Provide mutable access to gpio. + * @return pointer to member variable of gpio. + */ + int8_t *mutable_gpio(); + + // repeated Melody melodies, id 2 + //! Function get const-access to the elements of melodies. + const std::vector &melodies() const; + //! Function to get the number of elements in melodies. + size_t melodies_size() const; + /*! + * Function to append a element to melodies. + * @return point to newly added element. + */ + Melody* add_melodies(); + //! Function to reset melodies to its default/unset value. + void clear_melodies(); + //! Get value of element x of melodies. + const Melody &melodies(unsigned x) const; + //! Set melodies using a constant reference + void set_melodies(unsigned x, const Melody &v); + /*! + * Provide mutable access to melodies. + * @return pointer to member variable of melodies. + */ + Melody *mutable_melodies(unsigned x); + //! Function to get mutable access to all elements of melodies. + std::vector *mutable_melodies(); + + + protected: + //! sint8 gpio, id 1 + int8_t m_gpio = -1; + //! Melody melodies, id 2 + std::vector m_melodies; +}; + + + + +class HardwareConfig +{ + public: + HardwareConfig(); + bool operator == (const HardwareConfig &r) const; + + //! Function for resetting all members to their default values. + void clear(); + + /*! + * Calculates the required number of bytes for serializing this object. + * If member variables of the object are modified, the number of bytes + * needed for serialization may change, too. + * @return bytes needed for a serialized object representation + */ + size_t calcSize() const; + + /*! + * Function for parsing serialized data and update this object accordingly. + * Member variables that are not in the serialized data are not reset. + * @param b buffer of serialized data + * @param s number of bytes available in the buffer + * @return number of bytes successfully parsed (can be < s) + * or a negative value indicating the error encountered + */ + ssize_t fromMemory(const void *b, ssize_t s); + + /*! + * Function for serializing the object to memory. + * @param b buffer to serialize the object to + * @param s number of bytes available in the buffer + * @return number of bytes successfully serialized + */ + ssize_t toMemory(uint8_t *, ssize_t) const; + + /*! + * Function for writing a JSON representation of this object to a stream. + * @param json stream object the JSON output shall be written to + * @indLvl current indention level + */ + void toJSON(stream &json, unsigned indLvl = 0) const; + + /*! + * Function for writing an ASCII representation of this object to a stream. + * @param o output stream + * @param indent initial indention level + */ + void toASCII(stream &o, size_t indent = 0) const; + + /*! + * Function for determining the maximum size that the object may need for + * its serialized representation + * @return maximum number of bytes or SIZE_MAX if no limit can be determined + */ + static size_t getMaxSize(); + + //! Function for setting a parameter by its ASCII name using an ASCII representation of value. + //! @param param parameter name + //! @param value ASCII representation of the value + //! @return number of bytes parsed from value or negative value if an error occurs + int setByName(const char *param, const char *value); + + // optional fixed32 magic, id 0 + /*! + * Function for querying if magic has been set. + * @return true if magic is set. + */ + bool has_magic() const; + //! Function to reset magic to its default/unset value. + void clear_magic(); + //! Get value of magic. + uint32_t magic() const; + //! Set magic using a constant reference + void set_magic(uint32_t v); + /*! + * Provide mutable access to magic. + * @return pointer to member variable of magic. + */ + uint32_t *mutable_magic(); + + // optional SystemConfig system, id 1 + /*! + * Function for querying if system has been set. + * @return true if system is set. + */ + bool has_system() const; + //! Function to reset system to its default/unset value. + void clear_system(); + //! Get value of system. + const SystemConfig &system() const; + /*! + * Function for setting members of system using data from a serialized object. + * @param data pointer to binary data + * @param s number of bytes at data pointer + */ + void set_system(const void *data, size_t s); + //! Set system using a constant reference + void set_system(const SystemConfig &v); + /*! + * Provide mutable access to system. + * @return pointer to member variable of system. + */ + SystemConfig *mutable_system(); + + // unused repeated UartConfig uart, id 3 + // optional AdcConfig adc, id 4 + /*! + * Function for querying if adc has been set. + * @return true if adc is set. + */ + bool has_adc() const; + //! Function to reset adc to its default/unset value. + void clear_adc(); + //! Get value of adc. + const AdcConfig &adc() const; + /*! + * Function for setting adc using binary data. + * @param data pointer to binary data + * @param s number of bytes at data pointer + */ + void set_adc(const void *data, size_t s); + //! Set adc using a constant reference + void set_adc(const AdcConfig &v); + /*! + * Provide mutable access to adc. + * @return pointer to member variable of adc. + */ + AdcConfig *mutable_adc(); + + #ifdef CONFIG_TOUCHPAD + // unused optional TouchpadConfig touchpad, id 5 + #endif // CONFIG_TOUCHPAD + #ifdef CONFIG_TOUCHPAD + // unused repeated TouchChannelConfig tp_channel, id 6 + #endif // CONFIG_TOUCHPAD + // repeated GpioConfig gpios, id 7 + //! Function get const-access to the elements of gpios. + const std::vector &gpios() const; + //! Function to get the number of elements in gpios. + size_t gpios_size() const; + /*! + * Function to append a element to gpios. + * @return point to newly added element. + */ + GpioConfig* add_gpios(); + //! Function to reset gpios to its default/unset value. + void clear_gpios(); + //! Get value of element x of gpios. + const GpioConfig &gpios(unsigned x) const; + //! Set gpios using a constant reference + void set_gpios(unsigned x, const GpioConfig &v); + /*! + * Provide mutable access to gpios. + * @return pointer to member variable of gpios. + */ + GpioConfig *mutable_gpios(unsigned x); + //! Function to get mutable access to all elements of gpios. + std::vector *mutable_gpios(); + + #ifdef CONFIG_SPI + // repeated SpiBusConfig spibus, id 8 + //! Function get const-access to the elements of spibus. + const std::vector &spibus() const; + //! Function to get the number of elements in spibus. + size_t spibus_size() const; + /*! + * Function to append a element to spibus. + * @return point to newly added element. + */ + SpiBusConfig* add_spibus(); + //! Function to reset spibus to its default/unset value. + void clear_spibus(); + //! Get value of element x of spibus. + const SpiBusConfig &spibus(unsigned x) const; + //! Set spibus using a constant reference + void set_spibus(unsigned x, const SpiBusConfig &v); + /*! + * Provide mutable access to spibus. + * @return pointer to member variable of spibus. + */ + SpiBusConfig *mutable_spibus(unsigned x); + //! Function to get mutable access to all elements of spibus. + std::vector *mutable_spibus(); + #endif // CONFIG_SPI + + #ifdef CONFIG_BUTTON + // repeated ButtonConfig button, id 16 + //! Function get const-access to the elements of button. + const std::vector &button() const; + //! Function to get the number of elements in button. + size_t button_size() const; + /*! + * Function to append a element to button. + * @return point to newly added element. + */ + ButtonConfig* add_button(); + //! Function to reset button to its default/unset value. + void clear_button(); + //! Get value of element x of button. + const ButtonConfig &button(unsigned x) const; + //! Set button using a constant reference + void set_button(unsigned x, const ButtonConfig &v); + /*! + * Provide mutable access to button. + * @return pointer to member variable of button. + */ + ButtonConfig *mutable_button(unsigned x); + //! Function to get mutable access to all elements of button. + std::vector *mutable_button(); + #endif // CONFIG_BUTTON + + #ifdef CONFIG_RELAY + // repeated RelayConfig relay, id 17 + //! Function get const-access to the elements of relay. + const std::vector &relay() const; + //! Function to get the number of elements in relay. + size_t relay_size() const; + /*! + * Function to append a element to relay. + * @return point to newly added element. + */ + RelayConfig* add_relay(); + //! Function to reset relay to its default/unset value. + void clear_relay(); + //! Get value of element x of relay. + const RelayConfig &relay(unsigned x) const; + //! Set relay using a constant reference + void set_relay(unsigned x, const RelayConfig &v); + /*! + * Provide mutable access to relay. + * @return pointer to member variable of relay. + */ + RelayConfig *mutable_relay(unsigned x); + //! Function to get mutable access to all elements of relay. + std::vector *mutable_relay(); + #endif // CONFIG_RELAY #ifdef CONFIG_LEDS // repeated LedConfig led, id 18 @@ -4557,6 +4975,32 @@ class HardwareConfig std::vector *mutable_led(); #endif // CONFIG_LEDS + #ifdef CONFIG_BUZZER + // optional BuzzerConfig buzzer, id 19 + /*! + * Function for querying if buzzer has been set. + * @return true if buzzer is set. + */ + bool has_buzzer() const; + //! Function to reset buzzer to its default/unset value. + void clear_buzzer(); + //! Get value of buzzer. + const BuzzerConfig &buzzer() const; + /*! + * Function for setting buzzer using binary data. + * @param data pointer to binary data + * @param s number of bytes at data pointer + */ + void set_buzzer(const void *data, size_t s); + //! Set buzzer using a constant reference + void set_buzzer(const BuzzerConfig &v); + /*! + * Provide mutable access to buzzer. + * @return pointer to member variable of buzzer. + */ + BuzzerConfig *mutable_buzzer(); + #endif // CONFIG_BUZZER + #ifdef CONFIG_HLW8012 // optional Hlw8012Config hlw8012, id 20 /*! @@ -4847,10 +5291,10 @@ class HardwareConfig protected: //! fixed32 magic, id 0 uint32_t m_magic = 0; - #ifdef CONFIG_HLW8012 - //! Hlw8012Config hlw8012, id 20 - Hlw8012Config m_hlw8012; - #endif // CONFIG_HLW8012 + #ifdef CONFIG_BUZZER + //! BuzzerConfig buzzer, id 19 + BuzzerConfig m_buzzer; + #endif // CONFIG_BUZZER #ifdef CONFIG_DISPLAY //! DisplayConfig display, id 50 DisplayConfig m_display; @@ -4891,6 +5335,10 @@ class HardwareConfig //! Max7219Config max7219, id 32 Max7219Config m_max7219; #endif // CONFIG_MAX7219 + #ifdef CONFIG_HLW8012 + //! Hlw8012Config hlw8012, id 20 + Hlw8012Config m_hlw8012; + #endif // CONFIG_HLW8012 #ifdef CONFIG_LEDS //! LedConfig led, id 18 std::vector m_led; @@ -4931,6 +5379,8 @@ inline size_t SystemConfig::getMaxSize() // optional string model_number, id 8 has unlimited size // optional bool usb_diag, id 9 has maximum size 2 // optional bool usb_con, id 10 has maximum size 2 + // optional sint8 cc1_gpio, id 11 has maximum size 3 + // optional sint8 cc2_gpio, id 12 has maximum size 3 return SIZE_MAX; } @@ -5252,62 +5702,128 @@ inline bool SystemConfig::usb_diag() const inline bool SystemConfig::has_usb_diag() const { - return m_usb_diag != true; + return m_usb_diag != true; +} + +/*! + * Function for clearing the associated member variable. + * It will reset the value to the default value. + */ +inline void SystemConfig::clear_usb_diag() +{ + m_usb_diag = true; +} + +inline bool *SystemConfig::mutable_usb_diag() +{ + return &m_usb_diag; +} + +inline void SystemConfig::set_usb_diag(bool v) +{ + m_usb_diag = v; +} + +#endif // CONFIG_USB_DIAGLOG + + +#ifdef CONFIG_USB_CONSOLE +inline bool SystemConfig::usb_con() const +{ + return m_usb_con; +} + +inline bool SystemConfig::has_usb_con() const +{ + return m_usb_con != true; +} + +/*! + * Function for clearing the associated member variable. + * It will reset the value to the default value. + */ +inline void SystemConfig::clear_usb_con() +{ + m_usb_con = true; +} + +inline bool *SystemConfig::mutable_usb_con() +{ + return &m_usb_con; +} + +inline void SystemConfig::set_usb_con(bool v) +{ + m_usb_con = v; +} + +#endif // CONFIG_USB_CONSOLE + + +#ifdef CONFIG_ESP_PHY_ENABLE_USB +inline int8_t SystemConfig::cc1_gpio() const +{ + return m_cc1_gpio; +} + +inline bool SystemConfig::has_cc1_gpio() const +{ + return m_cc1_gpio != -1; } /*! * Function for clearing the associated member variable. * It will reset the value to the default value. */ -inline void SystemConfig::clear_usb_diag() +inline void SystemConfig::clear_cc1_gpio() { - m_usb_diag = true; + m_cc1_gpio = -1; } -inline bool *SystemConfig::mutable_usb_diag() +inline int8_t *SystemConfig::mutable_cc1_gpio() { - return &m_usb_diag; + return &m_cc1_gpio; } -inline void SystemConfig::set_usb_diag(bool v) +inline void SystemConfig::set_cc1_gpio(int8_t v) { - m_usb_diag = v; + m_cc1_gpio = v; } -#endif // CONFIG_USB_DIAGLOG +#endif // CONFIG_ESP_PHY_ENABLE_USB -#ifdef CONFIG_USB_CONSOLE -inline bool SystemConfig::usb_con() const +#ifdef CONFIG_ESP_PHY_ENABLE_USB +inline int8_t SystemConfig::cc2_gpio() const { - return m_usb_con; + return m_cc2_gpio; } -inline bool SystemConfig::has_usb_con() const +inline bool SystemConfig::has_cc2_gpio() const { - return m_usb_con != true; + return m_cc2_gpio != -1; } /*! * Function for clearing the associated member variable. * It will reset the value to the default value. */ -inline void SystemConfig::clear_usb_con() +inline void SystemConfig::clear_cc2_gpio() { - m_usb_con = true; + m_cc2_gpio = -1; } -inline bool *SystemConfig::mutable_usb_con() +inline int8_t *SystemConfig::mutable_cc2_gpio() { - return &m_usb_con; + return &m_cc2_gpio; } -inline void SystemConfig::set_usb_con(bool v) +inline void SystemConfig::set_cc2_gpio(int8_t v) { - m_usb_con = v; + m_cc2_gpio = v; } -#endif // CONFIG_USB_CONSOLE +#endif // CONFIG_ESP_PHY_ENABLE_USB inline size_t TouchpadConfig::getMaxSize() @@ -7045,6 +7561,11 @@ inline bool LedConfig::config_open_drain() const return (bool)((m_config >> 1) & 0x1); } +inline bool LedConfig::config_init_high() const +{ + return (bool)((m_config >> 2) & 0x1); +} + inline bool LedConfig::has_config() const { return 0 != (p_validbits & ((uint8_t)1U << 0)); @@ -7083,6 +7604,13 @@ inline void LedConfig::set_config_open_drain(bool v) p_validbits |= ((uint8_t)1U << 0); } +inline void LedConfig::set_config_init_high(bool v) +{ + m_config &= ~(0x1ULL << 2); + m_config |= ((uint8_t) v << 2); + p_validbits |= ((uint8_t)1U << 0); +} + inline void LedConfig::set_config(ledcfg_t v) { m_config = v; @@ -7878,11 +8406,6 @@ inline bool GpioConfig::config_pulldown() const return (bool)((m_config >> 8) & 0x1); } -inline bool GpioConfig::config_cap_freq_r2r() const -{ - return (bool)((m_config >> 9) & 0x1); -} - inline bool GpioConfig::has_config() const { return 0 != (p_validbits & ((uint8_t)1U << 0)); @@ -7949,13 +8472,6 @@ inline void GpioConfig::set_config_pulldown(bool v) p_validbits |= ((uint8_t)1U << 0); } -inline void GpioConfig::set_config_cap_freq_r2r(bool v) -{ - m_config &= ~(0x1ULL << 9); - m_config |= ((uint16_t) v << 9); - p_validbits |= ((uint8_t)1U << 0); -} - inline void GpioConfig::set_config(gpiocfg_t v) { m_config = v; @@ -8122,7 +8638,8 @@ inline size_t SpiDeviceConfig::getMaxSize() // optional sint8 intr, id 3 has maximum size 3 // optional sint8 reset, id 4 has maximum size 3 // optional sint8 cd, id 5 has maximum size 3 - return 14; + // optional unsigned freq, id 6 has maximum size 6 + return 20; } inline spidrv_t SpiDeviceConfig::drv() const @@ -8280,6 +8797,37 @@ inline void SpiDeviceConfig::set_cd(int8_t v) +inline uint32_t SpiDeviceConfig::freq() const +{ + return m_freq; +} + +inline bool SpiDeviceConfig::has_freq() const +{ + return m_freq != 0; +} + +/*! + * Function for clearing the associated member variable. + * It will reset the value to the default value. + */ +inline void SpiDeviceConfig::clear_freq() +{ + m_freq = 0; +} + +inline uint32_t *SpiDeviceConfig::mutable_freq() +{ + return &m_freq; +} + +inline void SpiDeviceConfig::set_freq(uint32_t v) +{ + m_freq = v; +} + + + inline size_t SpiBusConfig::getMaxSize() { // optional sint8 host, id 1 has maximum size 3 @@ -8927,230 +9475,496 @@ inline void Hlw8012Config::set_cf(int8_t v) -inline int8_t Hlw8012Config::cf1() const +inline int8_t Hlw8012Config::cf1() const +{ + return m_cf1; +} + +inline bool Hlw8012Config::has_cf1() const +{ + return m_cf1 != -1; +} + +/*! + * Function for clearing the associated member variable. + * It will reset the value to the default value. + */ +inline void Hlw8012Config::clear_cf1() +{ + m_cf1 = -1; +} + +inline int8_t *Hlw8012Config::mutable_cf1() +{ + return &m_cf1; +} + +inline void Hlw8012Config::set_cf1(int8_t v) +{ + m_cf1 = v; +} + + + +inline size_t SX1276Config::getMaxSize() +{ + // optional sint8 dio0, id 1 has maximum size 3 + // optional sint8 dio1, id 2 has maximum size 3 + // optional sint8 dio2, id 3 has maximum size 3 + // optional sint8 dio3, id 4 has maximum size 3 + // optional sint8 dio4, id 5 has maximum size 3 + // optional sint8 dio5, id 6 has maximum size 3 + return 18; +} + +inline int8_t SX1276Config::dio0() const +{ + return m_dio0; +} + +inline bool SX1276Config::has_dio0() const +{ + return m_dio0 != -1; +} + +/*! + * Function for clearing the associated member variable. + * It will reset the value to the default value. + */ +inline void SX1276Config::clear_dio0() +{ + m_dio0 = -1; +} + +inline int8_t *SX1276Config::mutable_dio0() +{ + return &m_dio0; +} + +inline void SX1276Config::set_dio0(int8_t v) +{ + m_dio0 = v; +} + + + +inline int8_t SX1276Config::dio1() const +{ + return m_dio1; +} + +inline bool SX1276Config::has_dio1() const +{ + return m_dio1 != -1; +} + +/*! + * Function for clearing the associated member variable. + * It will reset the value to the default value. + */ +inline void SX1276Config::clear_dio1() +{ + m_dio1 = -1; +} + +inline int8_t *SX1276Config::mutable_dio1() +{ + return &m_dio1; +} + +inline void SX1276Config::set_dio1(int8_t v) +{ + m_dio1 = v; +} + + + +inline int8_t SX1276Config::dio2() const +{ + return m_dio2; +} + +inline bool SX1276Config::has_dio2() const +{ + return m_dio2 != -1; +} + +/*! + * Function for clearing the associated member variable. + * It will reset the value to the default value. + */ +inline void SX1276Config::clear_dio2() +{ + m_dio2 = -1; +} + +inline int8_t *SX1276Config::mutable_dio2() +{ + return &m_dio2; +} + +inline void SX1276Config::set_dio2(int8_t v) +{ + m_dio2 = v; +} + + + +inline int8_t SX1276Config::dio3() const +{ + return m_dio3; +} + +inline bool SX1276Config::has_dio3() const +{ + return m_dio3 != -1; +} + +/*! + * Function for clearing the associated member variable. + * It will reset the value to the default value. + */ +inline void SX1276Config::clear_dio3() +{ + m_dio3 = -1; +} + +inline int8_t *SX1276Config::mutable_dio3() +{ + return &m_dio3; +} + +inline void SX1276Config::set_dio3(int8_t v) +{ + m_dio3 = v; +} + + + +inline int8_t SX1276Config::dio4() const +{ + return m_dio4; +} + +inline bool SX1276Config::has_dio4() const +{ + return m_dio4 != -1; +} + +/*! + * Function for clearing the associated member variable. + * It will reset the value to the default value. + */ +inline void SX1276Config::clear_dio4() +{ + m_dio4 = -1; +} + +inline int8_t *SX1276Config::mutable_dio4() +{ + return &m_dio4; +} + +inline void SX1276Config::set_dio4(int8_t v) +{ + m_dio4 = v; +} + + + +inline int8_t SX1276Config::dio5() const { - return m_cf1; + return m_dio5; } -inline bool Hlw8012Config::has_cf1() const +inline bool SX1276Config::has_dio5() const { - return m_cf1 != -1; + return m_dio5 != -1; } /*! * Function for clearing the associated member variable. * It will reset the value to the default value. */ -inline void Hlw8012Config::clear_cf1() +inline void SX1276Config::clear_dio5() { - m_cf1 = -1; + m_dio5 = -1; } -inline int8_t *Hlw8012Config::mutable_cf1() +inline int8_t *SX1276Config::mutable_dio5() { - return &m_cf1; + return &m_dio5; } -inline void Hlw8012Config::set_cf1(int8_t v) +inline void SX1276Config::set_dio5(int8_t v) { - m_cf1 = v; + m_dio5 = v; } -inline size_t SX1276Config::getMaxSize() +inline size_t Tone::getMaxSize() { - // optional sint8 dio0, id 1 has maximum size 3 - // optional sint8 dio1, id 2 has maximum size 3 - // optional sint8 dio2, id 3 has maximum size 3 - // optional sint8 dio3, id 4 has maximum size 3 - // optional sint8 dio4, id 5 has maximum size 3 - // optional sint8 dio5, id 6 has maximum size 3 - return 18; + // optional unsigned freq, id 1 has maximum size 6 + // optional unsigned duration, id 2 has maximum size 6 + return 12; } -inline int8_t SX1276Config::dio0() const +inline uint32_t Tone::freq() const { - return m_dio0; + return m_freq; } -inline bool SX1276Config::has_dio0() const +inline bool Tone::has_freq() const { - return m_dio0 != -1; + return 0 != (p_validbits & ((uint8_t)1U << 0)); } /*! * Function for clearing the associated member variable. * It will reset the value to the default value. */ -inline void SX1276Config::clear_dio0() +inline void Tone::clear_freq() { - m_dio0 = -1; + p_validbits &= ~((uint8_t)1U << 0); + m_freq = 0; } -inline int8_t *SX1276Config::mutable_dio0() +inline uint32_t *Tone::mutable_freq() { - return &m_dio0; + if (0 == (p_validbits & ((uint8_t)1U << 0))) { + p_validbits |= ((uint8_t)1U << 0); + m_freq = 0; + } + return &m_freq; } -inline void SX1276Config::set_dio0(int8_t v) +inline void Tone::set_freq(uint32_t v) { - m_dio0 = v; + m_freq = v; + p_validbits |= ((uint8_t)1U << 0); } -inline int8_t SX1276Config::dio1() const +inline uint32_t Tone::duration() const { - return m_dio1; + return m_duration; } -inline bool SX1276Config::has_dio1() const +inline bool Tone::has_duration() const { - return m_dio1 != -1; + return 0 != (p_validbits & ((uint8_t)1U << 1)); } /*! * Function for clearing the associated member variable. * It will reset the value to the default value. */ -inline void SX1276Config::clear_dio1() +inline void Tone::clear_duration() { - m_dio1 = -1; + p_validbits &= ~((uint8_t)1U << 1); + m_duration = 0; } -inline int8_t *SX1276Config::mutable_dio1() +inline uint32_t *Tone::mutable_duration() { - return &m_dio1; + if (0 == (p_validbits & ((uint8_t)1U << 1))) { + p_validbits |= ((uint8_t)1U << 1); + m_duration = 0; + } + return &m_duration; } -inline void SX1276Config::set_dio1(int8_t v) +inline void Tone::set_duration(uint32_t v) { - m_dio1 = v; + m_duration = v; + p_validbits |= ((uint8_t)1U << 1); } -inline int8_t SX1276Config::dio2() const +inline size_t Melody::getMaxSize() { - return m_dio2; + // optional string name, id 1 has unlimited size + // repeated fixed16 tones, id 2 has unlimited size + return SIZE_MAX; } -inline bool SX1276Config::has_dio2() const +inline const estring &Melody::name() const { - return m_dio2 != -1; + return m_name; +} + +inline bool Melody::has_name() const +{ + return !m_name.empty(); } /*! * Function for clearing the associated member variable. * It will reset the value to the default value. */ -inline void SX1276Config::clear_dio2() +inline void Melody::clear_name() { - m_dio2 = -1; + m_name.clear(); } -inline int8_t *SX1276Config::mutable_dio2() +inline estring *Melody::mutable_name() { - return &m_dio2; + return &m_name; } -inline void SX1276Config::set_dio2(int8_t v) +inline void Melody::set_name(const void *data, size_t s) { - m_dio2 = v; + m_name.assign((const char *)data,s); } +inline void Melody::set_name(const char *data) +{ + m_name = data; +} +inline void Melody::set_name(const estring &v) +{ + m_name = v; +} -inline int8_t SX1276Config::dio3() const + + +inline uint16_t Melody::tones(unsigned x) const { - return m_dio3; + return m_tones[x]; } -inline bool SX1276Config::has_dio3() const +inline const std::vector &Melody::tones() const { - return m_dio3 != -1; + return m_tones; } /*! * Function for clearing the associated member variable. * It will reset the value to the default value. */ -inline void SX1276Config::clear_dio3() +inline void Melody::clear_tones() { - m_dio3 = -1; + m_tones.clear(); } -inline int8_t *SX1276Config::mutable_dio3() +inline uint16_t *Melody::mutable_tones(unsigned x) { - return &m_dio3; + if (x >= m_tones.size()) + m_tones.resize(x+1); + return &m_tones[x]; } -inline void SX1276Config::set_dio3(int8_t v) +inline std::vector *Melody::mutable_tones() { - m_dio3 = v; + return &m_tones; } +inline void Melody::add_tones(uint16_t v) +{ + m_tones.push_back(v); +} +inline void Melody::set_tones(unsigned x, uint16_t v) +{ + assert(x < m_tones.size()); + m_tones[x] = v; +} -inline int8_t SX1276Config::dio4() const +inline size_t Melody::tones_size() const { - return m_dio4; + return m_tones.size(); } -inline bool SX1276Config::has_dio4() const + + +inline size_t BuzzerConfig::getMaxSize() { - return m_dio4 != -1; + // optional sint8 gpio, id 1 has maximum size 3 + // repeated Melody melodies, id 2 has unlimited size + return SIZE_MAX; +} + +inline int8_t BuzzerConfig::gpio() const +{ + return m_gpio; +} + +inline bool BuzzerConfig::has_gpio() const +{ + return m_gpio != -1; } /*! * Function for clearing the associated member variable. * It will reset the value to the default value. */ -inline void SX1276Config::clear_dio4() +inline void BuzzerConfig::clear_gpio() { - m_dio4 = -1; + m_gpio = -1; } -inline int8_t *SX1276Config::mutable_dio4() +inline int8_t *BuzzerConfig::mutable_gpio() { - return &m_dio4; + return &m_gpio; } -inline void SX1276Config::set_dio4(int8_t v) +inline void BuzzerConfig::set_gpio(int8_t v) { - m_dio4 = v; + m_gpio = v; } -inline int8_t SX1276Config::dio5() const +inline const Melody &BuzzerConfig::melodies(unsigned x) const { - return m_dio5; + return m_melodies[x]; } -inline bool SX1276Config::has_dio5() const +inline const std::vector &BuzzerConfig::melodies() const { - return m_dio5 != -1; + return m_melodies; } /*! * Function for clearing the associated member variable. * It will reset the value to the default value. */ -inline void SX1276Config::clear_dio5() +inline void BuzzerConfig::clear_melodies() { - m_dio5 = -1; + m_melodies.clear(); } -inline int8_t *SX1276Config::mutable_dio5() +inline Melody *BuzzerConfig::mutable_melodies(unsigned x) { - return &m_dio5; + if (x >= m_melodies.size()) + m_melodies.resize(x+1); + return &m_melodies[x]; } -inline void SX1276Config::set_dio5(int8_t v) +inline std::vector *BuzzerConfig::mutable_melodies() { - m_dio5 = v; + return &m_melodies; +} + +inline Melody *BuzzerConfig::add_melodies() +{ + m_melodies.resize(m_melodies.size()+1); + return &m_melodies.back(); +} + +inline void BuzzerConfig::set_melodies(unsigned x, const Melody &v) +{ + assert(x < m_melodies.size()); + m_melodies[x] = v; +} + +inline size_t BuzzerConfig::melodies_size() const +{ + return m_melodies.size(); } @@ -9158,7 +9972,7 @@ inline void SX1276Config::set_dio5(int8_t v) inline size_t HardwareConfig::getMaxSize() { // optional fixed32 magic, id 0 has maximum size 5 - // optional SystemConfig system, id 1 has maximum size 9 + // optional SystemConfig system, id 1 has maximum size 15 // unused repeated UartConfig uart, id 3 // optional AdcConfig adc, id 4 has maximum size 10 // unused optional TouchpadConfig touchpad, id 5 @@ -9168,6 +9982,7 @@ inline size_t HardwareConfig::getMaxSize() // repeated ButtonConfig button, id 16 has unlimited size // repeated RelayConfig relay, id 17 has unlimited size // repeated LedConfig led, id 18 has unlimited size + // optional BuzzerConfig buzzer, id 19 has maximum size 4 // optional Hlw8012Config hlw8012, id 20 has maximum size 11 // optional Max7219Config max7219, id 32 has maximum size 16 // optional Tlc5947Config tlc5947, id 33 has maximum size 17 @@ -9563,6 +10378,51 @@ inline size_t HardwareConfig::led_size() const #endif // CONFIG_LEDS +#ifdef CONFIG_BUZZER +inline const BuzzerConfig &HardwareConfig::buzzer() const +{ + return m_buzzer; +} + +inline bool HardwareConfig::has_buzzer() const +{ + return 0 != (p_validbits & ((uint16_t)1U << 3)); +} + +/*! + * Function for clearing the associated member variable. + * It will reset the value to the default value. + */ +inline void HardwareConfig::clear_buzzer() +{ + p_validbits &= ~((uint16_t)1U << 3); + m_buzzer.clear(); +} + +inline BuzzerConfig *HardwareConfig::mutable_buzzer() +{ + if (0 == (p_validbits & ((uint16_t)1U << 3))) { + p_validbits |= ((uint16_t)1U << 3); + m_buzzer.clear(); + } + return &m_buzzer; +} + +inline void HardwareConfig::set_buzzer(const void *data, size_t s) +{ + m_buzzer.fromMemory((const char *)data,s); + p_validbits |= ((uint16_t)1U << 3); +} + +inline void HardwareConfig::set_buzzer(const BuzzerConfig &v) +{ + m_buzzer = v; + p_validbits |= ((uint16_t)1U << 3); +} + +#endif // CONFIG_BUZZER + + #ifdef CONFIG_HLW8012 inline const Hlw8012Config &HardwareConfig::hlw8012() const { @@ -9571,7 +10431,7 @@ inline const Hlw8012Config &HardwareConfig::hlw8012() const inline bool HardwareConfig::has_hlw8012() const { - return 0 != (p_validbits & ((uint16_t)1U << 3)); + return 0 != (p_validbits & ((uint16_t)1U << 4)); } /*! @@ -9580,14 +10440,14 @@ inline bool HardwareConfig::has_hlw8012() const */ inline void HardwareConfig::clear_hlw8012() { - p_validbits &= ~((uint16_t)1U << 3); + p_validbits &= ~((uint16_t)1U << 4); m_hlw8012.clear(); } inline Hlw8012Config *HardwareConfig::mutable_hlw8012() { - if (0 == (p_validbits & ((uint16_t)1U << 3))) { - p_validbits |= ((uint16_t)1U << 3); + if (0 == (p_validbits & ((uint16_t)1U << 4))) { + p_validbits |= ((uint16_t)1U << 4); m_hlw8012.clear(); } return &m_hlw8012; @@ -9596,13 +10456,13 @@ inline Hlw8012Config *HardwareConfig::mutable_hlw8012() inline void HardwareConfig::set_hlw8012(const void *data, size_t s) { m_hlw8012.fromMemory((const char *)data,s); - p_validbits |= ((uint16_t)1U << 3); + p_validbits |= ((uint16_t)1U << 4); } inline void HardwareConfig::set_hlw8012(const Hlw8012Config &v) { m_hlw8012 = v; - p_validbits |= ((uint16_t)1U << 3); + p_validbits |= ((uint16_t)1U << 4); } #endif // CONFIG_HLW8012 @@ -9616,7 +10476,7 @@ inline const Max7219Config &HardwareConfig::max7219() const inline bool HardwareConfig::has_max7219() const { - return 0 != (p_validbits & ((uint16_t)1U << 4)); + return 0 != (p_validbits & ((uint16_t)1U << 5)); } /*! @@ -9625,14 +10485,14 @@ inline bool HardwareConfig::has_max7219() const */ inline void HardwareConfig::clear_max7219() { - p_validbits &= ~((uint16_t)1U << 4); + p_validbits &= ~((uint16_t)1U << 5); m_max7219.clear(); } inline Max7219Config *HardwareConfig::mutable_max7219() { - if (0 == (p_validbits & ((uint16_t)1U << 4))) { - p_validbits |= ((uint16_t)1U << 4); + if (0 == (p_validbits & ((uint16_t)1U << 5))) { + p_validbits |= ((uint16_t)1U << 5); m_max7219.clear(); } return &m_max7219; @@ -9641,13 +10501,13 @@ inline Max7219Config *HardwareConfig::mutable_max7219() inline void HardwareConfig::set_max7219(const void *data, size_t s) { m_max7219.fromMemory((const char *)data,s); - p_validbits |= ((uint16_t)1U << 4); + p_validbits |= ((uint16_t)1U << 5); } inline void HardwareConfig::set_max7219(const Max7219Config &v) { m_max7219 = v; - p_validbits |= ((uint16_t)1U << 4); + p_validbits |= ((uint16_t)1U << 5); } #endif // CONFIG_MAX7219 @@ -9661,7 +10521,7 @@ inline const Tlc5947Config &HardwareConfig::tlc5947() const inline bool HardwareConfig::has_tlc5947() const { - return 0 != (p_validbits & ((uint16_t)1U << 5)); + return 0 != (p_validbits & ((uint16_t)1U << 6)); } /*! @@ -9670,14 +10530,14 @@ inline bool HardwareConfig::has_tlc5947() const */ inline void HardwareConfig::clear_tlc5947() { - p_validbits &= ~((uint16_t)1U << 5); + p_validbits &= ~((uint16_t)1U << 6); m_tlc5947.clear(); } inline Tlc5947Config *HardwareConfig::mutable_tlc5947() { - if (0 == (p_validbits & ((uint16_t)1U << 5))) { - p_validbits |= ((uint16_t)1U << 5); + if (0 == (p_validbits & ((uint16_t)1U << 6))) { + p_validbits |= ((uint16_t)1U << 6); m_tlc5947.clear(); } return &m_tlc5947; @@ -9686,13 +10546,13 @@ inline Tlc5947Config *HardwareConfig::mutable_tlc5947() inline void HardwareConfig::set_tlc5947(const void *data, size_t s) { m_tlc5947.fromMemory((const char *)data,s); - p_validbits |= ((uint16_t)1U << 5); + p_validbits |= ((uint16_t)1U << 6); } inline void HardwareConfig::set_tlc5947(const Tlc5947Config &v) { m_tlc5947 = v; - p_validbits |= ((uint16_t)1U << 5); + p_validbits |= ((uint16_t)1U << 6); } #endif // CONFIG_TLC5947 @@ -9758,7 +10618,7 @@ inline const DhtConfig &HardwareConfig::dht() const inline bool HardwareConfig::has_dht() const { - return 0 != (p_validbits & ((uint16_t)1U << 6)); + return 0 != (p_validbits & ((uint16_t)1U << 7)); } /*! @@ -9767,14 +10627,14 @@ inline bool HardwareConfig::has_dht() const */ inline void HardwareConfig::clear_dht() { - p_validbits &= ~((uint16_t)1U << 6); + p_validbits &= ~((uint16_t)1U << 7); m_dht.clear(); } inline DhtConfig *HardwareConfig::mutable_dht() { - if (0 == (p_validbits & ((uint16_t)1U << 6))) { - p_validbits |= ((uint16_t)1U << 6); + if (0 == (p_validbits & ((uint16_t)1U << 7))) { + p_validbits |= ((uint16_t)1U << 7); m_dht.clear(); } return &m_dht; @@ -9783,13 +10643,13 @@ inline DhtConfig *HardwareConfig::mutable_dht() inline void HardwareConfig::set_dht(const void *data, size_t s) { m_dht.fromMemory((const char *)data,s); - p_validbits |= ((uint16_t)1U << 6); + p_validbits |= ((uint16_t)1U << 7); } inline void HardwareConfig::set_dht(const DhtConfig &v) { m_dht = v; - p_validbits |= ((uint16_t)1U << 6); + p_validbits |= ((uint16_t)1U << 7); } #endif // CONFIG_DHT @@ -9907,7 +10767,7 @@ inline const OneWireConfig &HardwareConfig::onewire() const inline bool HardwareConfig::has_onewire() const { - return 0 != (p_validbits & ((uint16_t)1U << 7)); + return 0 != (p_validbits & ((uint16_t)1U << 8)); } /*! @@ -9916,14 +10776,14 @@ inline bool HardwareConfig::has_onewire() const */ inline void HardwareConfig::clear_onewire() { - p_validbits &= ~((uint16_t)1U << 7); + p_validbits &= ~((uint16_t)1U << 8); m_onewire.clear(); } inline OneWireConfig *HardwareConfig::mutable_onewire() { - if (0 == (p_validbits & ((uint16_t)1U << 7))) { - p_validbits |= ((uint16_t)1U << 7); + if (0 == (p_validbits & ((uint16_t)1U << 8))) { + p_validbits |= ((uint16_t)1U << 8); m_onewire.clear(); } return &m_onewire; @@ -9932,13 +10792,13 @@ inline OneWireConfig *HardwareConfig::mutable_onewire() inline void HardwareConfig::set_onewire(const void *data, size_t s) { m_onewire.fromMemory((const char *)data,s); - p_validbits |= ((uint16_t)1U << 7); + p_validbits |= ((uint16_t)1U << 8); } inline void HardwareConfig::set_onewire(const OneWireConfig &v) { m_onewire = v; - p_validbits |= ((uint16_t)1U << 7); + p_validbits |= ((uint16_t)1U << 8); } #endif // CONFIG_ONEWIRE @@ -9952,7 +10812,7 @@ inline const SX1276Config &HardwareConfig::sx1276() const inline bool HardwareConfig::has_sx1276() const { - return 0 != (p_validbits & ((uint16_t)1U << 8)); + return 0 != (p_validbits & ((uint16_t)1U << 9)); } /*! @@ -9961,14 +10821,14 @@ inline bool HardwareConfig::has_sx1276() const */ inline void HardwareConfig::clear_sx1276() { - p_validbits &= ~((uint16_t)1U << 8); + p_validbits &= ~((uint16_t)1U << 9); m_sx1276.clear(); } inline SX1276Config *HardwareConfig::mutable_sx1276() { - if (0 == (p_validbits & ((uint16_t)1U << 8))) { - p_validbits |= ((uint16_t)1U << 8); + if (0 == (p_validbits & ((uint16_t)1U << 9))) { + p_validbits |= ((uint16_t)1U << 9); m_sx1276.clear(); } return &m_sx1276; @@ -9977,13 +10837,13 @@ inline SX1276Config *HardwareConfig::mutable_sx1276() inline void HardwareConfig::set_sx1276(const void *data, size_t s) { m_sx1276.fromMemory((const char *)data,s); - p_validbits |= ((uint16_t)1U << 8); + p_validbits |= ((uint16_t)1U << 9); } inline void HardwareConfig::set_sx1276(const SX1276Config &v) { m_sx1276 = v; - p_validbits |= ((uint16_t)1U << 8); + p_validbits |= ((uint16_t)1U << 9); } #endif // CONFIG_SX1276 @@ -10049,7 +10909,7 @@ inline const DisplayConfig &HardwareConfig::display() const inline bool HardwareConfig::has_display() const { - return 0 != (p_validbits & ((uint16_t)1U << 9)); + return 0 != (p_validbits & ((uint16_t)1U << 10)); } /*! @@ -10058,14 +10918,14 @@ inline bool HardwareConfig::has_display() const */ inline void HardwareConfig::clear_display() { - p_validbits &= ~((uint16_t)1U << 9); + p_validbits &= ~((uint16_t)1U << 10); m_display.clear(); } inline DisplayConfig *HardwareConfig::mutable_display() { - if (0 == (p_validbits & ((uint16_t)1U << 9))) { - p_validbits |= ((uint16_t)1U << 9); + if (0 == (p_validbits & ((uint16_t)1U << 10))) { + p_validbits |= ((uint16_t)1U << 10); m_display.clear(); } return &m_display; @@ -10074,13 +10934,13 @@ inline DisplayConfig *HardwareConfig::mutable_display() inline void HardwareConfig::set_display(const void *data, size_t s) { m_display.fromMemory((const char *)data,s); - p_validbits |= ((uint16_t)1U << 9); + p_validbits |= ((uint16_t)1U << 10); } inline void HardwareConfig::set_display(const DisplayConfig &v) { m_display = v; - p_validbits |= ((uint16_t)1U << 9); + p_validbits |= ((uint16_t)1U << 10); } #endif // CONFIG_DISPLAY diff --git a/components/wfc/hwcfg_pc.cpp b/components/wfc/hwcfg_pc.cpp index 9b5ceda..3b0ed3c 100644 --- a/components/wfc/hwcfg_pc.cpp +++ b/components/wfc/hwcfg_pc.cpp @@ -1,8 +1,8 @@ /**************************************************************************** * * Code generated by Wire-Format-Compiler (WFC) - * WFC Version: P2304 (hg:456/095c4982cbea) - * WFC is Copyright 2015-2022, Thomas Maier-Komor + * WFC Version: P2304.3 (hg:459/5fefa02bc543) + * WFC is Copyright 2015-2023, Thomas Maier-Komor * * Source Information: * =================== @@ -10,7 +10,7 @@ * Copyright: 2018-2023 * Author : Thomas Maier-Komor * - * Code generated on 2023-10-24, 21:26:42 (CET). + * Code generated on 2023-11-26, 14:29:43 (CET). * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -363,6 +363,12 @@ void SystemConfig::clear() #ifdef CONFIG_USB_CONSOLE m_usb_con = true; #endif // CONFIG_USB_CONSOLE + #ifdef CONFIG_ESP_PHY_ENABLE_USB + m_cc1_gpio = -1; + #endif // CONFIG_ESP_PHY_ENABLE_USB + #ifdef CONFIG_ESP_PHY_ENABLE_USB + m_cc2_gpio = -1; + #endif // CONFIG_ESP_PHY_ENABLE_USB p_validbits = 0; } @@ -384,6 +390,12 @@ void SystemConfig::toASCII(std::ostream &o, size_t indent) const #ifdef CONFIG_USB_CONSOLE ascii_bool(o, indent, "usb_con", m_usb_con); #endif // CONFIG_USB_CONSOLE + #ifdef CONFIG_ESP_PHY_ENABLE_USB + ascii_numeric(o, indent, "cc1_gpio", (signed) m_cc1_gpio); + #endif // CONFIG_ESP_PHY_ENABLE_USB + #ifdef CONFIG_ESP_PHY_ENABLE_USB + ascii_numeric(o, indent, "cc2_gpio", (signed) m_cc2_gpio); + #endif // CONFIG_ESP_PHY_ENABLE_USB --indent; ascii_indent(o,indent); o << '}'; @@ -499,12 +511,36 @@ ssize_t SystemConfig::fromMemory(const void *b, ssize_t s) set_usb_con(*a++); break; #endif // CONFIG_USB_CONSOLE + #ifdef CONFIG_ESP_PHY_ENABLE_USB + case 0x58: // cc1_gpio id 11, type int8_t, coding signed varint + { + varint_t v; + int n = read_varint(a,e-a,&v); + if (n <= 0) + return -12; + a += n; + set_cc1_gpio(varint_sint(v)); + } + break; + #endif // CONFIG_ESP_PHY_ENABLE_USB + #ifdef CONFIG_ESP_PHY_ENABLE_USB + case 0x60: // cc2_gpio id 12, type int8_t, coding signed varint + { + varint_t v; + int n = read_varint(a,e-a,&v); + if (n <= 0) + return -13; + a += n; + set_cc2_gpio(varint_sint(v)); + } + break; + #endif // CONFIG_ESP_PHY_ENABLE_USB default: // unknown field (option unknown=skip) { ssize_t s = skip_content(a,e-a,fid&7); if (s <= 0) - return -12; + return -14; a += s; break; } @@ -512,7 +548,7 @@ ssize_t SystemConfig::fromMemory(const void *b, ssize_t s) } assert((a-(const uint8_t *)b) == s); if (a > e) - return -13; + return -15; return a-(const uint8_t *)b; } @@ -525,13 +561,13 @@ ssize_t SystemConfig::toMemory(uint8_t *b, ssize_t s) const if (!m_manufacturer.empty()) { // 'manufacturer': id=1, encoding=lenpfx, tag=0xa if (a >= e) - return -14; + return -16; *a++ = 0xa; ssize_t manufacturer_s = m_manufacturer.size(); n = write_varint(a,e-a,manufacturer_s); a += n; if ((n <= 0) || ((e-a) < manufacturer_s)) - return -15; + return -17; memcpy(a,m_manufacturer.data(),manufacturer_s); a += manufacturer_s; } @@ -539,13 +575,13 @@ ssize_t SystemConfig::toMemory(uint8_t *b, ssize_t s) const if (!m_board_name.empty()) { // 'board_name': id=2, encoding=lenpfx, tag=0x12 if (a >= e) - return -16; + return -18; *a++ = 0x12; ssize_t board_name_s = m_board_name.size(); n = write_varint(a,e-a,board_name_s); a += n; if ((n <= 0) || ((e-a) < board_name_s)) - return -17; + return -19; memcpy(a,m_board_name.data(),board_name_s); a += board_name_s; } @@ -553,13 +589,13 @@ ssize_t SystemConfig::toMemory(uint8_t *b, ssize_t s) const if (!m_board_rev.empty()) { // 'board_rev': id=3, encoding=lenpfx, tag=0x1a if (a >= e) - return -18; + return -20; *a++ = 0x1a; ssize_t board_rev_s = m_board_rev.size(); n = write_varint(a,e-a,board_rev_s); a += n; if ((n <= 0) || ((e-a) < board_rev_s)) - return -19; + return -21; memcpy(a,m_board_rev.data(),board_rev_s); a += board_rev_s; } @@ -567,46 +603,46 @@ ssize_t SystemConfig::toMemory(uint8_t *b, ssize_t s) const if (m_diag_uart != 0) { // 'diag_uart': id=4, encoding=varint, tag=0x20 if (a >= e) - return -20; + return -22; *a++ = 0x20; n = write_varint(a,e-a,sint_varint(m_diag_uart)); if (n <= 0) - return -21; + return -23; a += n; } // has console_rx? if (0 != (p_validbits & ((uint8_t)1U << 0))) { // 'console_rx': id=5, encoding=varint, tag=0x28 if (a >= e) - return -22; + return -24; *a++ = 0x28; n = write_varint(a,e-a,sint_varint(m_console_rx)); if (n <= 0) - return -23; + return -25; a += n; } // has console_tx? if (0 != (p_validbits & ((uint8_t)1U << 1))) { // 'console_tx': id=6, encoding=varint, tag=0x30 if (a >= e) - return -24; + return -26; *a++ = 0x30; n = write_varint(a,e-a,sint_varint(m_console_tx)); if (n <= 0) - return -25; + return -27; a += n; } // has model_name? if (!m_model_name.empty()) { // 'model_name': id=7, encoding=lenpfx, tag=0x3a if (a >= e) - return -26; + return -28; *a++ = 0x3a; ssize_t model_name_s = m_model_name.size(); n = write_varint(a,e-a,model_name_s); a += n; if ((n <= 0) || ((e-a) < model_name_s)) - return -27; + return -29; memcpy(a,m_model_name.data(),model_name_s); a += model_name_s; } @@ -614,13 +650,13 @@ ssize_t SystemConfig::toMemory(uint8_t *b, ssize_t s) const if (!m_model_number.empty()) { // 'model_number': id=8, encoding=lenpfx, tag=0x42 if (a >= e) - return -28; + return -30; *a++ = 0x42; ssize_t model_number_s = m_model_number.size(); n = write_varint(a,e-a,model_number_s); a += n; if ((n <= 0) || ((e-a) < model_number_s)) - return -29; + return -31; memcpy(a,m_model_number.data(),model_number_s); a += model_number_s; } @@ -629,7 +665,7 @@ ssize_t SystemConfig::toMemory(uint8_t *b, ssize_t s) const if (m_usb_diag != true) { // 'usb_diag': id=9, encoding=8bit, tag=0x4b if (2 > (e-a)) - return -30; + return -32; *a++ = 0x4b; *a++ = m_usb_diag; } @@ -639,11 +675,37 @@ ssize_t SystemConfig::toMemory(uint8_t *b, ssize_t s) const if (m_usb_con != true) { // 'usb_con': id=10, encoding=8bit, tag=0x53 if (2 > (e-a)) - return -31; + return -33; *a++ = 0x53; *a++ = m_usb_con; } #endif // CONFIG_USB_CONSOLE + #ifdef CONFIG_ESP_PHY_ENABLE_USB + // has cc1_gpio? + if (m_cc1_gpio != -1) { + // 'cc1_gpio': id=11, encoding=varint, tag=0x58 + if (a >= e) + return -34; + *a++ = 0x58; + n = write_varint(a,e-a,sint_varint(m_cc1_gpio)); + if (n <= 0) + return -35; + a += n; + } + #endif // CONFIG_ESP_PHY_ENABLE_USB + #ifdef CONFIG_ESP_PHY_ENABLE_USB + // has cc2_gpio? + if (m_cc2_gpio != -1) { + // 'cc2_gpio': id=12, encoding=varint, tag=0x60 + if (a >= e) + return -36; + *a++ = 0x60; + n = write_varint(a,e-a,sint_varint(m_cc2_gpio)); + if (n <= 0) + return -37; + a += n; + } + #endif // CONFIG_ESP_PHY_ENABLE_USB assert(a <= e); return a-b; } @@ -714,6 +776,20 @@ void SystemConfig::toWire(void (*put)(uint8_t)) const put(m_usb_con); } #endif // CONFIG_USB_CONSOLE + #ifdef CONFIG_ESP_PHY_ENABLE_USB + if (m_cc1_gpio != -1) { + // 'cc1_gpio': id=11, encoding=varint, tag=0x58 + put(0x58); // 'cc1_gpio': id=11 + send_varint(put,sint_varint(m_cc1_gpio)); + } + #endif // CONFIG_ESP_PHY_ENABLE_USB + #ifdef CONFIG_ESP_PHY_ENABLE_USB + if (m_cc2_gpio != -1) { + // 'cc2_gpio': id=12, encoding=varint, tag=0x60 + put(0x60); // 'cc2_gpio': id=12 + send_varint(put,sint_varint(m_cc2_gpio)); + } + #endif // CONFIG_ESP_PHY_ENABLE_USB } void SystemConfig::toString(std::string &put) const @@ -782,6 +858,20 @@ void SystemConfig::toString(std::string &put) const put.push_back(m_usb_con); } #endif // CONFIG_USB_CONSOLE + #ifdef CONFIG_ESP_PHY_ENABLE_USB + if (m_cc1_gpio != -1) { + // 'cc1_gpio': id=11, encoding=varint, tag=0x58 + put.push_back(0x58); // 'cc1_gpio': id=11 + send_varint(put,sint_varint(m_cc1_gpio)); + } + #endif // CONFIG_ESP_PHY_ENABLE_USB + #ifdef CONFIG_ESP_PHY_ENABLE_USB + if (m_cc2_gpio != -1) { + // 'cc2_gpio': id=12, encoding=varint, tag=0x60 + put.push_back(0x60); // 'cc2_gpio': id=12 + send_varint(put,sint_varint(m_cc2_gpio)); + } + #endif // CONFIG_ESP_PHY_ENABLE_USB } void SystemConfig::toJSON(std::ostream &json, unsigned indLvl) const @@ -832,6 +922,18 @@ void SystemConfig::toJSON(std::ostream &json, unsigned indLvl) const json << (m_usb_con ? "true" : "false"); } #endif // CONFIG_USB_CONSOLE + #ifdef CONFIG_ESP_PHY_ENABLE_USB + if (has_cc1_gpio()) { + fsep = json_indent(json,indLvl,fsep,"cc1_gpio"); + json << (int) m_cc1_gpio; + } + #endif // CONFIG_ESP_PHY_ENABLE_USB + #ifdef CONFIG_ESP_PHY_ENABLE_USB + if (has_cc2_gpio()) { + fsep = json_indent(json,indLvl,fsep,"cc2_gpio"); + json << (int) m_cc2_gpio; + } + #endif // CONFIG_ESP_PHY_ENABLE_USB if (fsep == '{') json.put('{'); json.put('\n'); @@ -894,6 +996,18 @@ size_t SystemConfig::calcSize() const r += 2; } #endif // CONFIG_USB_CONSOLE + #ifdef CONFIG_ESP_PHY_ENABLE_USB + // optional sint8 cc1_gpio, id 11 + if (m_cc1_gpio != -1) { + r += wiresize_s((varint_t)m_cc1_gpio) + 1 /* tag(cc1_gpio) 0x58 */; + } + #endif // CONFIG_ESP_PHY_ENABLE_USB + #ifdef CONFIG_ESP_PHY_ENABLE_USB + // optional sint8 cc2_gpio, id 12 + if (m_cc2_gpio != -1) { + r += wiresize_s((varint_t)m_cc2_gpio) + 1 /* tag(cc2_gpio) 0x60 */; + } + #endif // CONFIG_ESP_PHY_ENABLE_USB return r; } @@ -925,6 +1039,14 @@ bool SystemConfig::operator != (const SystemConfig &r) const if (has_usb_con() && (m_usb_con != r.m_usb_con)) return true; #endif // CONFIG_USB_CONSOLE + #ifdef CONFIG_ESP_PHY_ENABLE_USB + if (has_cc1_gpio() && (m_cc1_gpio != r.m_cc1_gpio)) + return true; + #endif // CONFIG_ESP_PHY_ENABLE_USB + #ifdef CONFIG_ESP_PHY_ENABLE_USB + if (has_cc2_gpio() && (m_cc2_gpio != r.m_cc2_gpio)) + return true; + #endif // CONFIG_ESP_PHY_ENABLE_USB return false; } @@ -1037,7 +1159,27 @@ int SystemConfig::setByName(const char *name, const char *value) return r; } #endif // CONFIG_USB_CONSOLE - return -32; + #ifdef CONFIG_ESP_PHY_ENABLE_USB + if (0 == strcmp(name,"cc1_gpio")) { + if (value == 0) { + clear_cc1_gpio(); + return 0; + } + int r = parse_ascii_s8(&m_cc1_gpio,value); + return r; + } + #endif // CONFIG_ESP_PHY_ENABLE_USB + #ifdef CONFIG_ESP_PHY_ENABLE_USB + if (0 == strcmp(name,"cc2_gpio")) { + if (value == 0) { + clear_cc2_gpio(); + return 0; + } + int r = parse_ascii_s8(&m_cc2_gpio,value); + return r; + } + #endif // CONFIG_ESP_PHY_ENABLE_USB + return -38; } Message *SystemConfig::p_getMember(const char *s, unsigned n) @@ -1084,12 +1226,12 @@ ssize_t TouchpadConfig::fromMemory(const void *b, ssize_t s) varint_t fid; int fn = read_varint(a,e-a,&fid); if (fn <= 0) - return -33; + return -39; a += fn; switch (fid) { case 0xb: // fsm_mode id 1, type bool, coding 8bit if (a >= e) - return -34; + return -40; set_fsm_mode(*a++); break; case 0x10: // lvolt id 2, type int8_t, coding signed varint @@ -1097,7 +1239,7 @@ ssize_t TouchpadConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -35; + return -41; a += n; set_lvolt(varint_sint(v)); } @@ -1107,7 +1249,7 @@ ssize_t TouchpadConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -36; + return -42; a += n; set_hvolt(varint_sint(v)); } @@ -1117,7 +1259,7 @@ ssize_t TouchpadConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -37; + return -43; a += n; set_atten(varint_sint(v)); } @@ -1127,7 +1269,7 @@ ssize_t TouchpadConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -38; + return -44; a += n; set_interval(v); } @@ -1137,7 +1279,7 @@ ssize_t TouchpadConfig::fromMemory(const void *b, ssize_t s) { ssize_t s = skip_content(a,e-a,fid&7); if (s <= 0) - return -39; + return -45; a += s; break; } @@ -1145,7 +1287,7 @@ ssize_t TouchpadConfig::fromMemory(const void *b, ssize_t s) } assert((a-(const uint8_t *)b) == s); if (a > e) - return -40; + return -46; return a-(const uint8_t *)b; } @@ -1158,7 +1300,7 @@ ssize_t TouchpadConfig::toMemory(uint8_t *b, ssize_t s) const if (m_fsm_mode != false) { // 'fsm_mode': id=1, encoding=8bit, tag=0xb if (2 > (e-a)) - return -41; + return -47; *a++ = 0xb; *a++ = m_fsm_mode; } @@ -1166,44 +1308,44 @@ ssize_t TouchpadConfig::toMemory(uint8_t *b, ssize_t s) const if (m_lvolt != -1) { // 'lvolt': id=2, encoding=varint, tag=0x10 if (a >= e) - return -42; + return -48; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_lvolt)); if (n <= 0) - return -43; + return -49; a += n; } // has hvolt? if (m_hvolt != -1) { // 'hvolt': id=3, encoding=varint, tag=0x18 if (a >= e) - return -44; + return -50; *a++ = 0x18; n = write_varint(a,e-a,sint_varint(m_hvolt)); if (n <= 0) - return -45; + return -51; a += n; } // has atten? if (m_atten != -1) { // 'atten': id=4, encoding=varint, tag=0x20 if (a >= e) - return -46; + return -52; *a++ = 0x20; n = write_varint(a,e-a,sint_varint(m_atten)); if (n <= 0) - return -47; + return -53; a += n; } // has interval? if (0 != (p_validbits & ((uint8_t)1U << 0))) { // 'interval': id=7, encoding=varint, tag=0x38 if (a >= e) - return -48; + return -54; *a++ = 0x38; n = write_varint(a,e-a,m_interval); if (n <= 0) - return -49; + return -55; a += n; } assert(a <= e); @@ -1403,7 +1545,7 @@ int TouchpadConfig::setByName(const char *name, const char *value) p_validbits |= ((uint8_t)1U << 0); return r; } - return -50; + return -56; } Message *TouchpadConfig::p_getMember(const char *s, unsigned n) @@ -1450,7 +1592,7 @@ ssize_t TouchChannelConfig::fromMemory(const void *b, ssize_t s) varint_t fid; int fn = read_varint(a,e-a,&fid); if (fn <= 0) - return -51; + return -57; a += fn; switch (fid) { case 0xa: // name id 1, type std::string, coding byte[] @@ -1459,7 +1601,7 @@ ssize_t TouchChannelConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -52; + return -58; m_name.assign((const char*)a,v); a += v; } @@ -1469,14 +1611,14 @@ ssize_t TouchChannelConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -53; + return -59; a += n; set_channel(varint_sint(v)); } break; case 0x1c: // threshold id 3, type uint16_t, coding 16bit if ((a+1) >= e) - return -54; + return -60; set_threshold((uint16_t) read_u16(a)); a += 2; break; @@ -1485,7 +1627,7 @@ ssize_t TouchChannelConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -55; + return -61; a += n; set_slope(v); } @@ -1495,7 +1637,7 @@ ssize_t TouchChannelConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -56; + return -62; a += n; set_tieopt(v); } @@ -1505,7 +1647,7 @@ ssize_t TouchChannelConfig::fromMemory(const void *b, ssize_t s) { ssize_t s = skip_content(a,e-a,fid&7); if (s <= 0) - return -57; + return -63; a += s; break; } @@ -1513,7 +1655,7 @@ ssize_t TouchChannelConfig::fromMemory(const void *b, ssize_t s) } assert((a-(const uint8_t *)b) == s); if (a > e) - return -58; + return -64; return a-(const uint8_t *)b; } @@ -1526,13 +1668,13 @@ ssize_t TouchChannelConfig::toMemory(uint8_t *b, ssize_t s) const if (!m_name.empty()) { // 'name': id=1, encoding=lenpfx, tag=0xa if (a >= e) - return -59; + return -65; *a++ = 0xa; ssize_t name_s = m_name.size(); n = write_varint(a,e-a,name_s); a += n; if ((n <= 0) || ((e-a) < name_s)) - return -60; + return -66; memcpy(a,m_name.data(),name_s); a += name_s; } @@ -1540,18 +1682,18 @@ ssize_t TouchChannelConfig::toMemory(uint8_t *b, ssize_t s) const if (m_channel != -1) { // 'channel': id=2, encoding=varint, tag=0x10 if (a >= e) - return -61; + return -67; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_channel)); if (n <= 0) - return -62; + return -68; a += n; } // has threshold? if (0 != (p_validbits & ((uint8_t)1U << 0))) { // 'threshold': id=3, encoding=16bit, tag=0x1c if (3 > (e-a)) - return -63; + return -69; *a++ = 0x1c; write_u16(a,m_threshold); a += 2; @@ -1560,22 +1702,22 @@ ssize_t TouchChannelConfig::toMemory(uint8_t *b, ssize_t s) const if (0 != (p_validbits & ((uint8_t)1U << 1))) { // 'slope': id=4, encoding=varint, tag=0x20 if (a >= e) - return -64; + return -70; *a++ = 0x20; n = write_varint(a,e-a,m_slope); if (n <= 0) - return -65; + return -71; a += n; } // has tieopt? if (0 != (p_validbits & ((uint8_t)1U << 2))) { // 'tieopt': id=5, encoding=varint, tag=0x28 if (a >= e) - return -66; + return -72; *a++ = 0x28; n = write_varint(a,e-a,m_tieopt); if (n <= 0) - return -67; + return -73; a += n; } assert(a <= e); @@ -1785,7 +1927,7 @@ int TouchChannelConfig::setByName(const char *name, const char *value) p_validbits |= ((uint8_t)1U << 2); return r; } - return -68; + return -74; } Message *TouchChannelConfig::p_getMember(const char *s, unsigned n) @@ -1849,7 +1991,7 @@ ssize_t ButtonConfig::fromMemory(const void *b, ssize_t s) varint_t fid; int fn = read_varint(a,e-a,&fid); if (fn <= 0) - return -69; + return -75; a += fn; switch (fid) { case 0xa: // name id 1, type std::string, coding byte[] @@ -1858,7 +2000,7 @@ ssize_t ButtonConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -70; + return -76; m_name.assign((const char*)a,v); a += v; } @@ -1868,14 +2010,14 @@ ssize_t ButtonConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -71; + return -77; a += n; set_gpio(varint_sint(v)); } break; case 0x1b: // presslvl id 3, type bool, coding 8bit if (a >= e) - return -72; + return -78; set_presslvl(*a++); break; case 0x20: // pull_mode id 4, type pull_mode_t, coding varint @@ -1883,7 +2025,7 @@ ssize_t ButtonConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -73; + return -79; a += n; set_pull_mode((pull_mode_t) v); } @@ -1894,7 +2036,7 @@ ssize_t ButtonConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -74; + return -80; a += n; set_clk(varint_sint(v)); } @@ -1906,7 +2048,7 @@ ssize_t ButtonConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -75; + return -81; a += n; set_dt(varint_sint(v)); } @@ -1917,7 +2059,7 @@ ssize_t ButtonConfig::fromMemory(const void *b, ssize_t s) { ssize_t s = skip_content(a,e-a,fid&7); if (s <= 0) - return -76; + return -82; a += s; break; } @@ -1925,7 +2067,7 @@ ssize_t ButtonConfig::fromMemory(const void *b, ssize_t s) } assert((a-(const uint8_t *)b) == s); if (a > e) - return -77; + return -83; return a-(const uint8_t *)b; } @@ -1938,13 +2080,13 @@ ssize_t ButtonConfig::toMemory(uint8_t *b, ssize_t s) const if (!m_name.empty()) { // 'name': id=1, encoding=lenpfx, tag=0xa if (a >= e) - return -78; + return -84; *a++ = 0xa; ssize_t name_s = m_name.size(); n = write_varint(a,e-a,name_s); a += n; if ((n <= 0) || ((e-a) < name_s)) - return -79; + return -85; memcpy(a,m_name.data(),name_s); a += name_s; } @@ -1952,18 +2094,18 @@ ssize_t ButtonConfig::toMemory(uint8_t *b, ssize_t s) const if (m_gpio != -1) { // 'gpio': id=2, encoding=varint, tag=0x10 if (a >= e) - return -80; + return -86; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_gpio)); if (n <= 0) - return -81; + return -87; a += n; } // has presslvl? if (m_presslvl != 0) { // 'presslvl': id=3, encoding=8bit, tag=0x1b if (2 > (e-a)) - return -82; + return -88; *a++ = 0x1b; *a++ = m_presslvl; } @@ -1971,11 +2113,11 @@ ssize_t ButtonConfig::toMemory(uint8_t *b, ssize_t s) const if (m_pull_mode != pull_none) { // 'pull_mode': id=4, encoding=varint, tag=0x20 if (a >= e) - return -83; + return -89; *a++ = 0x20; n = write_varint(a,e-a,m_pull_mode); if (n <= 0) - return -84; + return -90; a += n; } #ifdef CONFIG_ROTARYENCODER @@ -1983,11 +2125,11 @@ ssize_t ButtonConfig::toMemory(uint8_t *b, ssize_t s) const if (m_clk != -1) { // 'clk': id=5, encoding=varint, tag=0x28 if (a >= e) - return -85; + return -91; *a++ = 0x28; n = write_varint(a,e-a,sint_varint(m_clk)); if (n <= 0) - return -86; + return -92; a += n; } #endif // CONFIG_ROTARYENCODER @@ -1996,11 +2138,11 @@ ssize_t ButtonConfig::toMemory(uint8_t *b, ssize_t s) const if (m_dt != -1) { // 'dt': id=6, encoding=varint, tag=0x30 if (a >= e) - return -87; + return -93; *a++ = 0x30; n = write_varint(a,e-a,sint_varint(m_dt)); if (n <= 0) - return -88; + return -94; a += n; } #endif // CONFIG_ROTARYENCODER @@ -2239,8 +2381,21 @@ int ButtonConfig::setByName(const char *name, const char *value) else if (!strcmp(name,"up")) set_pull_mode_up((bool)ull); return eptr - value; - } else { - return -89; + } + if (*name++ != '.') { + return -95; + } else if (!strcmp(name,"enable")) { + bool tmp; + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_pull_mode_enable(tmp); + return r; + } else if (!strcmp(name,"up")) { + bool tmp; + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_pull_mode_up(tmp); + return r; } } #ifdef CONFIG_ROTARYENCODER @@ -2263,7 +2418,7 @@ int ButtonConfig::setByName(const char *name, const char *value) return r; } #endif // CONFIG_ROTARYENCODER - return -90; + return -96; } Message *ButtonConfig::p_getMember(const char *s, unsigned n) @@ -2327,7 +2482,7 @@ ssize_t RelayConfig::fromMemory(const void *b, ssize_t s) varint_t fid; int fn = read_varint(a,e-a,&fid); if (fn <= 0) - return -91; + return -97; a += fn; switch (fid) { case 0xa: // name id 1, type std::string, coding byte[] @@ -2336,7 +2491,7 @@ ssize_t RelayConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -92; + return -98; m_name.assign((const char*)a,v); a += v; } @@ -2346,7 +2501,7 @@ ssize_t RelayConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -93; + return -99; a += n; set_gpio(varint_sint(v)); } @@ -2356,7 +2511,7 @@ ssize_t RelayConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -94; + return -100; a += n; set_config((relay_cfg_t) v); } @@ -2366,7 +2521,7 @@ ssize_t RelayConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -95; + return -101; a += n; set_min_itv(v); } @@ -2376,7 +2531,7 @@ ssize_t RelayConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -96; + return -102; a += n; set_interlock(varint_sint(v)); } @@ -2386,7 +2541,7 @@ ssize_t RelayConfig::fromMemory(const void *b, ssize_t s) { ssize_t s = skip_content(a,e-a,fid&7); if (s <= 0) - return -97; + return -103; a += s; break; } @@ -2394,7 +2549,7 @@ ssize_t RelayConfig::fromMemory(const void *b, ssize_t s) } assert((a-(const uint8_t *)b) == s); if (a > e) - return -98; + return -104; return a-(const uint8_t *)b; } @@ -2407,13 +2562,13 @@ ssize_t RelayConfig::toMemory(uint8_t *b, ssize_t s) const if (!m_name.empty()) { // 'name': id=1, encoding=lenpfx, tag=0xa if (a >= e) - return -99; + return -105; *a++ = 0xa; ssize_t name_s = m_name.size(); n = write_varint(a,e-a,name_s); a += n; if ((n <= 0) || ((e-a) < name_s)) - return -100; + return -106; memcpy(a,m_name.data(),name_s); a += name_s; } @@ -2421,44 +2576,44 @@ ssize_t RelayConfig::toMemory(uint8_t *b, ssize_t s) const if (m_gpio != -1) { // 'gpio': id=2, encoding=varint, tag=0x10 if (a >= e) - return -101; + return -107; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_gpio)); if (n <= 0) - return -102; + return -108; a += n; } // has config? if (m_config != 0) { // 'config': id=3, encoding=varint, tag=0x18 if (a >= e) - return -103; + return -109; *a++ = 0x18; n = write_varint(a,e-a,m_config); if (n <= 0) - return -104; + return -110; a += n; } // has min_itv? if (0 != (p_validbits & ((uint8_t)1U << 0))) { // 'min_itv': id=4, encoding=varint, tag=0x20 if (a >= e) - return -105; + return -111; *a++ = 0x20; n = write_varint(a,e-a,m_min_itv); if (n <= 0) - return -106; + return -112; a += n; } // has interlock? if (m_interlock != -1) { // 'interlock': id=5, encoding=varint, tag=0x28 if (a >= e) - return -107; + return -113; *a++ = 0x28; n = write_varint(a,e-a,sint_varint(m_interlock)); if (n <= 0) - return -108; + return -114; a += n; } assert(a <= e); @@ -2656,8 +2811,39 @@ int RelayConfig::setByName(const char *name, const char *value) else if (!strcmp(name,"mqtt")) set_config_mqtt((bool)ull); return eptr - value; - } else { - return -109; + } + if (*name++ != '.') { + return -115; + } else if (!strcmp(name,"active_high")) { + bool tmp; + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_active_high(tmp); + return r; + } else if (!strcmp(name,"init_on")) { + bool tmp; + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_init_on(tmp); + return r; + } else if (!strcmp(name,"persistent")) { + bool tmp; + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_persistent(tmp); + return r; + } else if (!strcmp(name,"opendrain")) { + bool tmp; + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_opendrain(tmp); + return r; + } else if (!strcmp(name,"mqtt")) { + bool tmp; + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_mqtt(tmp); + return r; } } if (0 == strcmp(name,"min_itv")) { @@ -2678,7 +2864,7 @@ int RelayConfig::setByName(const char *name, const char *value) int r = parse_ascii_s8(&m_interlock,value); return r; } - return -110; + return -116; } Message *RelayConfig::p_getMember(const char *s, unsigned n) @@ -2724,7 +2910,7 @@ ssize_t Max7219Config::fromMemory(const void *b, ssize_t s) varint_t fid; int fn = read_varint(a,e-a,&fid); if (fn <= 0) - return -111; + return -117; a += fn; switch (fid) { case 0x8: // clk id 1, type int8_t, coding signed varint @@ -2732,7 +2918,7 @@ ssize_t Max7219Config::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -112; + return -118; a += n; set_clk(varint_sint(v)); } @@ -2742,7 +2928,7 @@ ssize_t Max7219Config::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -113; + return -119; a += n; set_dout(varint_sint(v)); } @@ -2752,14 +2938,14 @@ ssize_t Max7219Config::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -114; + return -120; a += n; set_cs(varint_sint(v)); } break; case 0x23: // odrain id 4, type bool, coding 8bit if (a >= e) - return -115; + return -121; set_odrain(*a++); break; case 0x28: // digits id 5, type uint8_t, coding varint @@ -2767,7 +2953,7 @@ ssize_t Max7219Config::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -116; + return -122; a += n; set_digits(v); } @@ -2777,7 +2963,7 @@ ssize_t Max7219Config::fromMemory(const void *b, ssize_t s) { ssize_t s = skip_content(a,e-a,fid&7); if (s <= 0) - return -117; + return -123; a += s; break; } @@ -2785,7 +2971,7 @@ ssize_t Max7219Config::fromMemory(const void *b, ssize_t s) } assert((a-(const uint8_t *)b) == s); if (a > e) - return -118; + return -124; return a-(const uint8_t *)b; } @@ -2798,40 +2984,40 @@ ssize_t Max7219Config::toMemory(uint8_t *b, ssize_t s) const if (m_clk != -1) { // 'clk': id=1, encoding=varint, tag=0x8 if (a >= e) - return -119; + return -125; *a++ = 0x8; n = write_varint(a,e-a,sint_varint(m_clk)); if (n <= 0) - return -120; + return -126; a += n; } // has dout? if (m_dout != -1) { // 'dout': id=2, encoding=varint, tag=0x10 if (a >= e) - return -121; + return -127; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_dout)); if (n <= 0) - return -122; + return -128; a += n; } // has cs? if (m_cs != -1) { // 'cs': id=3, encoding=varint, tag=0x18 if (a >= e) - return -123; + return -129; *a++ = 0x18; n = write_varint(a,e-a,sint_varint(m_cs)); if (n <= 0) - return -124; + return -130; a += n; } // has odrain? if (m_odrain != false) { // 'odrain': id=4, encoding=8bit, tag=0x23 if (2 > (e-a)) - return -125; + return -131; *a++ = 0x23; *a++ = m_odrain; } @@ -2839,11 +3025,11 @@ ssize_t Max7219Config::toMemory(uint8_t *b, ssize_t s) const if (m_digits != 0) { // 'digits': id=5, encoding=varint, tag=0x28 if (a >= e) - return -126; + return -132; *a++ = 0x28; n = write_varint(a,e-a,m_digits); if (n <= 0) - return -127; + return -133; a += n; } assert(a <= e); @@ -3039,7 +3225,7 @@ int Max7219Config::setByName(const char *name, const char *value) int r = parse_ascii_u8(&m_digits,value); return r; } - return -128; + return -134; } Message *Max7219Config::p_getMember(const char *s, unsigned n) @@ -3085,7 +3271,7 @@ ssize_t Tlc5947Config::fromMemory(const void *b, ssize_t s) varint_t fid; int fn = read_varint(a,e-a,&fid); if (fn <= 0) - return -129; + return -135; a += fn; switch (fid) { case 0x8: // sin id 1, type int8_t, coding signed varint @@ -3093,7 +3279,7 @@ ssize_t Tlc5947Config::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -130; + return -136; a += n; set_sin(varint_sint(v)); } @@ -3103,7 +3289,7 @@ ssize_t Tlc5947Config::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -131; + return -137; a += n; set_sclk(varint_sint(v)); } @@ -3113,7 +3299,7 @@ ssize_t Tlc5947Config::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -132; + return -138; a += n; set_xlat(varint_sint(v)); } @@ -3123,7 +3309,7 @@ ssize_t Tlc5947Config::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -133; + return -139; a += n; set_blank(varint_sint(v)); } @@ -3133,7 +3319,7 @@ ssize_t Tlc5947Config::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -134; + return -140; a += n; set_ntlc(v); } @@ -3143,7 +3329,7 @@ ssize_t Tlc5947Config::fromMemory(const void *b, ssize_t s) { ssize_t s = skip_content(a,e-a,fid&7); if (s <= 0) - return -135; + return -141; a += s; break; } @@ -3151,7 +3337,7 @@ ssize_t Tlc5947Config::fromMemory(const void *b, ssize_t s) } assert((a-(const uint8_t *)b) == s); if (a > e) - return -136; + return -142; return a-(const uint8_t *)b; } @@ -3164,55 +3350,55 @@ ssize_t Tlc5947Config::toMemory(uint8_t *b, ssize_t s) const if (m_sin != -1) { // 'sin': id=1, encoding=varint, tag=0x8 if (a >= e) - return -137; + return -143; *a++ = 0x8; n = write_varint(a,e-a,sint_varint(m_sin)); if (n <= 0) - return -138; + return -144; a += n; } // has sclk? if (m_sclk != -1) { // 'sclk': id=2, encoding=varint, tag=0x10 if (a >= e) - return -139; + return -145; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_sclk)); if (n <= 0) - return -140; + return -146; a += n; } // has xlat? if (m_xlat != -1) { // 'xlat': id=3, encoding=varint, tag=0x18 if (a >= e) - return -141; + return -147; *a++ = 0x18; n = write_varint(a,e-a,sint_varint(m_xlat)); if (n <= 0) - return -142; + return -148; a += n; } // has blank? if (m_blank != -1) { // 'blank': id=4, encoding=varint, tag=0x20 if (a >= e) - return -143; + return -149; *a++ = 0x20; n = write_varint(a,e-a,sint_varint(m_blank)); if (n <= 0) - return -144; + return -150; a += n; } // has ntlc? if (m_ntlc != 0) { // 'ntlc': id=5, encoding=varint, tag=0x28 if (a >= e) - return -145; + return -151; *a++ = 0x28; n = write_varint(a,e-a,m_ntlc); if (n <= 0) - return -146; + return -152; a += n; } assert(a <= e); @@ -3408,7 +3594,7 @@ int Tlc5947Config::setByName(const char *name, const char *value) int r = parse_ascii_u8(&m_ntlc,value); return r; } - return -147; + return -153; } Message *Tlc5947Config::p_getMember(const char *s, unsigned n) @@ -3452,7 +3638,7 @@ ssize_t Ws2812bConfig::fromMemory(const void *b, ssize_t s) varint_t fid; int fn = read_varint(a,e-a,&fid); if (fn <= 0) - return -148; + return -154; a += fn; switch (fid) { case 0x8: // gpio id 1, type int8_t, coding signed varint @@ -3460,7 +3646,7 @@ ssize_t Ws2812bConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -149; + return -155; a += n; set_gpio(varint_sint(v)); } @@ -3470,7 +3656,7 @@ ssize_t Ws2812bConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -150; + return -156; a += n; set_ch(varint_sint(v)); } @@ -3480,7 +3666,7 @@ ssize_t Ws2812bConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -151; + return -157; a += n; set_nleds(v); } @@ -3491,7 +3677,7 @@ ssize_t Ws2812bConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -152; + return -158; m_name.assign((const char*)a,v); a += v; } @@ -3501,7 +3687,7 @@ ssize_t Ws2812bConfig::fromMemory(const void *b, ssize_t s) { ssize_t s = skip_content(a,e-a,fid&7); if (s <= 0) - return -153; + return -159; a += s; break; } @@ -3509,7 +3695,7 @@ ssize_t Ws2812bConfig::fromMemory(const void *b, ssize_t s) } assert((a-(const uint8_t *)b) == s); if (a > e) - return -154; + return -160; return a-(const uint8_t *)b; } @@ -3522,46 +3708,46 @@ ssize_t Ws2812bConfig::toMemory(uint8_t *b, ssize_t s) const if (m_gpio != -1) { // 'gpio': id=1, encoding=varint, tag=0x8 if (a >= e) - return -155; + return -161; *a++ = 0x8; n = write_varint(a,e-a,sint_varint(m_gpio)); if (n <= 0) - return -156; + return -162; a += n; } // has ch? if (m_ch != -1) { // 'ch': id=2, encoding=varint, tag=0x10 if (a >= e) - return -157; + return -163; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_ch)); if (n <= 0) - return -158; + return -164; a += n; } // has nleds? if (m_nleds != 0) { // 'nleds': id=3, encoding=varint, tag=0x18 if (a >= e) - return -159; + return -165; *a++ = 0x18; n = write_varint(a,e-a,m_nleds); if (n <= 0) - return -160; + return -166; a += n; } // has name? if (!m_name.empty()) { // 'name': id=4, encoding=lenpfx, tag=0x22 if (a >= e) - return -161; + return -167; *a++ = 0x22; ssize_t name_s = m_name.size(); n = write_varint(a,e-a,name_s); a += n; if ((n <= 0) || ((e-a) < name_s)) - return -162; + return -168; memcpy(a,m_name.data(),name_s); a += name_s; } @@ -3736,7 +3922,7 @@ int Ws2812bConfig::setByName(const char *name, const char *value) int r = m_name.size(); return r; } - return -163; + return -169; } Message *Ws2812bConfig::p_getMember(const char *s, unsigned n) @@ -3781,7 +3967,7 @@ ssize_t DhtConfig::fromMemory(const void *b, ssize_t s) varint_t fid; int fn = read_varint(a,e-a,&fid); if (fn <= 0) - return -164; + return -170; a += fn; switch (fid) { case 0x8: // model id 1, type dht_model_t, coding varint @@ -3789,7 +3975,7 @@ ssize_t DhtConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -165; + return -171; a += n; set_model((dht_model_t) v); } @@ -3799,7 +3985,7 @@ ssize_t DhtConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -166; + return -172; a += n; set_gpio(varint_sint(v)); } @@ -3809,7 +3995,7 @@ ssize_t DhtConfig::fromMemory(const void *b, ssize_t s) { ssize_t s = skip_content(a,e-a,fid&7); if (s <= 0) - return -167; + return -173; a += s; break; } @@ -3817,7 +4003,7 @@ ssize_t DhtConfig::fromMemory(const void *b, ssize_t s) } assert((a-(const uint8_t *)b) == s); if (a > e) - return -168; + return -174; return a-(const uint8_t *)b; } @@ -3830,22 +4016,22 @@ ssize_t DhtConfig::toMemory(uint8_t *b, ssize_t s) const if (m_model != DHT_NONE) { // 'model': id=1, encoding=varint, tag=0x8 if (a >= e) - return -169; + return -175; *a++ = 0x8; n = write_varint(a,e-a,m_model); if (n <= 0) - return -170; + return -176; a += n; } // has gpio? if (m_gpio != -1) { // 'gpio': id=2, encoding=varint, tag=0x10 if (a >= e) - return -171; + return -177; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_gpio)); if (n <= 0) - return -172; + return -178; a += n; } assert(a <= e); @@ -3955,7 +4141,7 @@ int DhtConfig::setByName(const char *name, const char *value) dht_model_t v; size_t r = parse_ascii_dht_model_t(&v,value); if (r == 0) - return -173; + return -179; set_model(v); return r; } @@ -3967,7 +4153,7 @@ int DhtConfig::setByName(const char *name, const char *value) int r = parse_ascii_s8(&m_gpio,value); return r; } - return -174; + return -180; } Message *DhtConfig::p_getMember(const char *s, unsigned n) @@ -4045,7 +4231,7 @@ ssize_t I2CConfig::fromMemory(const void *b, ssize_t s) varint_t fid; int fn = read_varint(a,e-a,&fid); if (fn <= 0) - return -175; + return -181; a += fn; switch (fid) { case 0x8: // port id 1, type uint8_t, coding varint @@ -4053,7 +4239,7 @@ ssize_t I2CConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -176; + return -182; a += n; set_port(v); } @@ -4063,7 +4249,7 @@ ssize_t I2CConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -177; + return -183; a += n; set_sda(varint_sint(v)); } @@ -4073,7 +4259,7 @@ ssize_t I2CConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -178; + return -184; a += n; set_scl(varint_sint(v)); } @@ -4083,14 +4269,14 @@ ssize_t I2CConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -179; + return -185; a += n; set_freq(v); } break; case 0x2b: // xpullup id 5, type bool, coding 8bit if (a >= e) - return -180; + return -186; set_xpullup(*a++); break; #ifdef CONFIG_I2C_XDEV @@ -4098,14 +4284,14 @@ ssize_t I2CConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); // length of packed if (n <= 0) - return -181; + return -187; a += n; const uint8_t *ae = a + v; do { varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -182; + return -188; a += n; m_devices.push_back((i2cdev_t)v); } while (a < ae); @@ -4116,7 +4302,7 @@ ssize_t I2CConfig::fromMemory(const void *b, ssize_t s) { ssize_t s = skip_content(a,e-a,fid&7); if (s <= 0) - return -183; + return -189; a += s; break; } @@ -4124,7 +4310,7 @@ ssize_t I2CConfig::fromMemory(const void *b, ssize_t s) } assert((a-(const uint8_t *)b) == s); if (a > e) - return -184; + return -190; return a-(const uint8_t *)b; } @@ -4137,51 +4323,51 @@ ssize_t I2CConfig::toMemory(uint8_t *b, ssize_t s) const if (0 != (p_validbits & ((uint8_t)1U << 0))) { // 'port': id=1, encoding=varint, tag=0x8 if (a >= e) - return -185; + return -191; *a++ = 0x8; n = write_varint(a,e-a,m_port); if (n <= 0) - return -186; + return -192; a += n; } // has sda? if (m_sda != -1) { // 'sda': id=2, encoding=varint, tag=0x10 if (a >= e) - return -187; + return -193; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_sda)); if (n <= 0) - return -188; + return -194; a += n; } // has scl? if (m_scl != -1) { // 'scl': id=3, encoding=varint, tag=0x18 if (a >= e) - return -189; + return -195; *a++ = 0x18; n = write_varint(a,e-a,sint_varint(m_scl)); if (n <= 0) - return -190; + return -196; a += n; } // has freq? if (0 != (p_validbits & ((uint8_t)1U << 1))) { // 'freq': id=4, encoding=varint, tag=0x20 if (a >= e) - return -191; + return -197; *a++ = 0x20; n = write_varint(a,e-a,m_freq); if (n <= 0) - return -192; + return -198; a += n; } // has xpullup? if (m_xpullup != false) { // 'xpullup': id=5, encoding=8bit, tag=0x2b if (2 > (e-a)) - return -193; + return -199; *a++ = 0x2b; *a++ = m_xpullup; } @@ -4189,7 +4375,7 @@ ssize_t I2CConfig::toMemory(uint8_t *b, ssize_t s) const if (size_t devices_ne = m_devices.size()) { // 'devices': id=6, encoding=lenpfx, tag=0x32 if (a >= e) - return -194; + return -200; *a++ = 0x32; ssize_t devices_ws = 0; for (size_t x = 0; x != devices_ne; ++x) @@ -4197,7 +4383,7 @@ ssize_t I2CConfig::toMemory(uint8_t *b, ssize_t s) const n = write_varint(a,e-a,devices_ws); a += n; if ((n <= 0) || (devices_ws > (e-a))) - return -195; + return -201; for (size_t x = 0; x != devices_ne; ++x) a += write_varint(a,e-a,m_devices[x]); } @@ -4476,9 +4662,9 @@ int I2CConfig::setByName(const char *name, const char *value) } else { x = strtoul(name+8,&idxe,0); if ((idxe[0] != ']') || (idxe == (name+8))) - return -196; + return -202; if (m_devices.size() <= x) - return -197; + return -203; if ((idxe[1] == 0) && (value == 0)) { m_devices.erase(m_devices.begin()+x); return 0; @@ -4491,7 +4677,7 @@ int I2CConfig::setByName(const char *name, const char *value) return eptr - value; } if (idxe[1] != '.') - return -198; + return -204; idxe += 2; if (!strcmp("addr",idxe)) { if (eptr != value) { @@ -4511,11 +4697,11 @@ int I2CConfig::setByName(const char *name, const char *value) return 0; } } - return -199; + return -205; } } #endif // CONFIG_I2C_XDEV - return -200; + return -206; } Message *I2CConfig::p_getMember(const char *s, unsigned n) @@ -4557,7 +4743,7 @@ ssize_t HcSr04Config::fromMemory(const void *b, ssize_t s) varint_t fid; int fn = read_varint(a,e-a,&fid); if (fn <= 0) - return -201; + return -207; a += fn; switch (fid) { case 0x8: // trigger id 1, type int8_t, coding signed varint @@ -4565,7 +4751,7 @@ ssize_t HcSr04Config::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -202; + return -208; a += n; set_trigger(varint_sint(v)); } @@ -4575,7 +4761,7 @@ ssize_t HcSr04Config::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -203; + return -209; a += n; set_echo(varint_sint(v)); } @@ -4586,7 +4772,7 @@ ssize_t HcSr04Config::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -204; + return -210; m_name.assign((const char*)a,v); a += v; } @@ -4596,7 +4782,7 @@ ssize_t HcSr04Config::fromMemory(const void *b, ssize_t s) { ssize_t s = skip_content(a,e-a,fid&7); if (s <= 0) - return -205; + return -211; a += s; break; } @@ -4604,7 +4790,7 @@ ssize_t HcSr04Config::fromMemory(const void *b, ssize_t s) } assert((a-(const uint8_t *)b) == s); if (a > e) - return -206; + return -212; return a-(const uint8_t *)b; } @@ -4617,35 +4803,35 @@ ssize_t HcSr04Config::toMemory(uint8_t *b, ssize_t s) const if (m_trigger != -1) { // 'trigger': id=1, encoding=varint, tag=0x8 if (a >= e) - return -207; + return -213; *a++ = 0x8; n = write_varint(a,e-a,sint_varint(m_trigger)); if (n <= 0) - return -208; + return -214; a += n; } // has echo? if (m_echo != -1) { // 'echo': id=2, encoding=varint, tag=0x10 if (a >= e) - return -209; + return -215; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_echo)); if (n <= 0) - return -210; + return -216; a += n; } // has name? if (!m_name.empty()) { // 'name': id=3, encoding=lenpfx, tag=0x1a if (a >= e) - return -211; + return -217; *a++ = 0x1a; ssize_t name_s = m_name.size(); n = write_varint(a,e-a,name_s); a += n; if ((n <= 0) || ((e-a) < name_s)) - return -212; + return -218; memcpy(a,m_name.data(),name_s); a += name_s; } @@ -4792,7 +4978,7 @@ int HcSr04Config::setByName(const char *name, const char *value) int r = m_name.size(); return r; } - return -213; + return -219; } Message *HcSr04Config::p_getMember(const char *s, unsigned n) @@ -4829,6 +5015,9 @@ void LedConfig::toASCII(std::ostream &o, size_t indent) const ascii_indent(o,indent); o << ".open_drain"; o << (config_open_drain() ? " = true;" : " = false;"); + ascii_indent(o,indent); + o << ".init_high"; + o << (config_init_high() ? " = true;" : " = false;"); --indent; ascii_string(o,indent,m_name.data(),m_name.size(),"name"); ascii_numeric(o, indent, "pwm_ch", (signed) m_pwm_ch); @@ -4845,7 +5034,7 @@ ssize_t LedConfig::fromMemory(const void *b, ssize_t s) varint_t fid; int fn = read_varint(a,e-a,&fid); if (fn <= 0) - return -214; + return -220; a += fn; switch (fid) { case 0x8: // gpio id 1, type int8_t, coding signed varint @@ -4853,7 +5042,7 @@ ssize_t LedConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -215; + return -221; a += n; set_gpio(varint_sint(v)); } @@ -4863,7 +5052,7 @@ ssize_t LedConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -216; + return -222; a += n; set_config((ledcfg_t) v); } @@ -4874,7 +5063,7 @@ ssize_t LedConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -217; + return -223; m_name.assign((const char*)a,v); a += v; } @@ -4884,7 +5073,7 @@ ssize_t LedConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -218; + return -224; a += n; set_pwm_ch(varint_sint(v)); } @@ -4894,7 +5083,7 @@ ssize_t LedConfig::fromMemory(const void *b, ssize_t s) { ssize_t s = skip_content(a,e-a,fid&7); if (s <= 0) - return -219; + return -225; a += s; break; } @@ -4902,7 +5091,7 @@ ssize_t LedConfig::fromMemory(const void *b, ssize_t s) } assert((a-(const uint8_t *)b) == s); if (a > e) - return -220; + return -226; return a-(const uint8_t *)b; } @@ -4915,35 +5104,35 @@ ssize_t LedConfig::toMemory(uint8_t *b, ssize_t s) const if (m_gpio != -1) { // 'gpio': id=1, encoding=varint, tag=0x8 if (a >= e) - return -221; + return -227; *a++ = 0x8; n = write_varint(a,e-a,sint_varint(m_gpio)); if (n <= 0) - return -222; + return -228; a += n; } // has config? if (0 != (p_validbits & ((uint8_t)1U << 0))) { // 'config': id=2, encoding=varint, tag=0x10 if (a >= e) - return -223; + return -229; *a++ = 0x10; n = write_varint(a,e-a,m_config); if (n <= 0) - return -224; + return -230; a += n; } // has name? if (!m_name.empty()) { // 'name': id=3, encoding=lenpfx, tag=0x1a if (a >= e) - return -225; + return -231; *a++ = 0x1a; ssize_t name_s = m_name.size(); n = write_varint(a,e-a,name_s); a += n; if ((n <= 0) || ((e-a) < name_s)) - return -226; + return -232; memcpy(a,m_name.data(),name_s); a += name_s; } @@ -4951,11 +5140,11 @@ ssize_t LedConfig::toMemory(uint8_t *b, ssize_t s) const if (m_pwm_ch != -1) { // 'pwm_ch': id=4, encoding=varint, tag=0x20 if (a >= e) - return -227; + return -233; *a++ = 0x20; n = write_varint(a,e-a,sint_varint(m_pwm_ch)); if (n <= 0) - return -228; + return -234; a += n; } assert(a <= e); @@ -5117,9 +5306,30 @@ int LedConfig::setByName(const char *name, const char *value) set_config_active_high((bool)ull); else if (!strcmp(name,"open_drain")) set_config_open_drain((bool)ull); + else if (!strcmp(name,"init_high")) + set_config_init_high((bool)ull); return eptr - value; - } else { - return -229; + } + if (*name++ != '.') { + return -235; + } else if (!strcmp(name,"active_high")) { + bool tmp; + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_active_high(tmp); + return r; + } else if (!strcmp(name,"open_drain")) { + bool tmp; + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_open_drain(tmp); + return r; + } else if (!strcmp(name,"init_high")) { + bool tmp; + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_init_high(tmp); + return r; } } if (0 == strcmp(name,"name")) { @@ -5139,7 +5349,7 @@ int LedConfig::setByName(const char *name, const char *value) int r = parse_ascii_s8(&m_pwm_ch,value); return r; } - return -230; + return -236; } Message *LedConfig::p_getMember(const char *s, unsigned n) @@ -5181,7 +5391,7 @@ ssize_t OneWireConfig::fromMemory(const void *b, ssize_t s) varint_t fid; int fn = read_varint(a,e-a,&fid); if (fn <= 0) - return -231; + return -237; a += fn; switch (fid) { case 0x8: // gpio id 1, type int8_t, coding signed varint @@ -5189,14 +5399,14 @@ ssize_t OneWireConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -232; + return -238; a += n; set_gpio(varint_sint(v)); } break; case 0x13: // pullup id 2, type bool, coding 8bit if (a >= e) - return -233; + return -239; set_pullup(*a++); break; case 0x18: // power id 3, type int8_t, coding signed varint @@ -5204,7 +5414,7 @@ ssize_t OneWireConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -234; + return -240; a += n; set_power(varint_sint(v)); } @@ -5214,7 +5424,7 @@ ssize_t OneWireConfig::fromMemory(const void *b, ssize_t s) { ssize_t s = skip_content(a,e-a,fid&7); if (s <= 0) - return -235; + return -241; a += s; break; } @@ -5222,7 +5432,7 @@ ssize_t OneWireConfig::fromMemory(const void *b, ssize_t s) } assert((a-(const uint8_t *)b) == s); if (a > e) - return -236; + return -242; return a-(const uint8_t *)b; } @@ -5235,18 +5445,18 @@ ssize_t OneWireConfig::toMemory(uint8_t *b, ssize_t s) const if (m_gpio != -1) { // 'gpio': id=1, encoding=varint, tag=0x8 if (a >= e) - return -237; + return -243; *a++ = 0x8; n = write_varint(a,e-a,sint_varint(m_gpio)); if (n <= 0) - return -238; + return -244; a += n; } // has pullup? if (m_pullup != false) { // 'pullup': id=2, encoding=8bit, tag=0x13 if (2 > (e-a)) - return -239; + return -245; *a++ = 0x13; *a++ = m_pullup; } @@ -5254,11 +5464,11 @@ ssize_t OneWireConfig::toMemory(uint8_t *b, ssize_t s) const if (m_power != -1) { // 'power': id=3, encoding=varint, tag=0x18 if (a >= e) - return -240; + return -246; *a++ = 0x18; n = write_varint(a,e-a,sint_varint(m_power)); if (n <= 0) - return -241; + return -247; a += n; } assert(a <= e); @@ -5398,7 +5608,7 @@ int OneWireConfig::setByName(const char *name, const char *value) int r = parse_ascii_s8(&m_power,value); return r; } - return -242; + return -248; } Message *OneWireConfig::p_getMember(const char *s, unsigned n) @@ -5444,7 +5654,7 @@ ssize_t UartConfig::fromMemory(const void *b, ssize_t s) varint_t fid; int fn = read_varint(a,e-a,&fid); if (fn <= 0) - return -243; + return -249; a += fn; switch (fid) { case 0x8: // port id 1, type int8_t, coding signed varint @@ -5452,7 +5662,7 @@ ssize_t UartConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -244; + return -250; a += n; set_port(varint_sint(v)); } @@ -5462,7 +5672,7 @@ ssize_t UartConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -245; + return -251; a += n; set_tx_gpio(varint_sint(v)); } @@ -5472,7 +5682,7 @@ ssize_t UartConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -246; + return -252; a += n; set_rx_gpio(varint_sint(v)); } @@ -5482,7 +5692,7 @@ ssize_t UartConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -247; + return -253; a += n; set_cts_gpio(varint_sint(v)); } @@ -5492,7 +5702,7 @@ ssize_t UartConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -248; + return -254; a += n; set_rts_gpio(varint_sint(v)); } @@ -5502,7 +5712,7 @@ ssize_t UartConfig::fromMemory(const void *b, ssize_t s) { ssize_t s = skip_content(a,e-a,fid&7); if (s <= 0) - return -249; + return -255; a += s; break; } @@ -5510,7 +5720,7 @@ ssize_t UartConfig::fromMemory(const void *b, ssize_t s) } assert((a-(const uint8_t *)b) == s); if (a > e) - return -250; + return -256; return a-(const uint8_t *)b; } @@ -5523,55 +5733,55 @@ ssize_t UartConfig::toMemory(uint8_t *b, ssize_t s) const if (m_port != -1) { // 'port': id=1, encoding=varint, tag=0x8 if (a >= e) - return -251; + return -257; *a++ = 0x8; n = write_varint(a,e-a,sint_varint(m_port)); if (n <= 0) - return -252; + return -258; a += n; } // has tx_gpio? if (m_tx_gpio != -1) { // 'tx_gpio': id=2, encoding=varint, tag=0x10 if (a >= e) - return -253; + return -259; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_tx_gpio)); if (n <= 0) - return -254; + return -260; a += n; } // has rx_gpio? if (m_rx_gpio != -1) { // 'rx_gpio': id=3, encoding=varint, tag=0x18 if (a >= e) - return -255; + return -261; *a++ = 0x18; n = write_varint(a,e-a,sint_varint(m_rx_gpio)); if (n <= 0) - return -256; + return -262; a += n; } // has cts_gpio? if (m_cts_gpio != -1) { // 'cts_gpio': id=4, encoding=varint, tag=0x20 if (a >= e) - return -257; + return -263; *a++ = 0x20; n = write_varint(a,e-a,sint_varint(m_cts_gpio)); if (n <= 0) - return -258; + return -264; a += n; } // has rts_gpio? if (m_rts_gpio != -1) { // 'rts_gpio': id=5, encoding=varint, tag=0x28 if (a >= e) - return -259; + return -265; *a++ = 0x28; n = write_varint(a,e-a,sint_varint(m_rts_gpio)); if (n <= 0) - return -260; + return -266; a += n; } assert(a <= e); @@ -5767,7 +5977,7 @@ int UartConfig::setByName(const char *name, const char *value) int r = parse_ascii_s8(&m_rts_gpio,value); return r; } - return -261; + return -267; } Message *UartConfig::p_getMember(const char *s, unsigned n) @@ -5822,7 +6032,7 @@ ssize_t AdcChannel::fromMemory(const void *b, ssize_t s) varint_t fid; int fn = read_varint(a,e-a,&fid); if (fn <= 0) - return -262; + return -268; a += fn; switch (fid) { case 0xa: // name id 1, type std::string, coding byte[] @@ -5831,7 +6041,7 @@ ssize_t AdcChannel::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -263; + return -269; m_name.assign((const char*)a,v); a += v; } @@ -5841,7 +6051,7 @@ ssize_t AdcChannel::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -264; + return -270; a += n; set_unit(v); } @@ -5851,7 +6061,7 @@ ssize_t AdcChannel::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -265; + return -271; a += n; set_ch(varint_sint(v)); } @@ -5861,7 +6071,7 @@ ssize_t AdcChannel::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -266; + return -272; a += n; set_atten(v); } @@ -5871,7 +6081,7 @@ ssize_t AdcChannel::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -267; + return -273; a += n; set_interval(v); } @@ -5881,20 +6091,20 @@ ssize_t AdcChannel::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -268; + return -274; a += n; set_window(v); } break; case 0x45: // scale id 8, type float, coding 32bit if ((a+3) >= e) - return -269; + return -275; set_scale(read_float(a)); a += 4; break; case 0x4d: // offset id 9, type float, coding 32bit if ((a+3) >= e) - return -270; + return -276; set_offset(read_float(a)); a += 4; break; @@ -5904,7 +6114,7 @@ ssize_t AdcChannel::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -271; + return -277; m_dim.assign((const char*)a,v); a += v; } @@ -5914,7 +6124,7 @@ ssize_t AdcChannel::fromMemory(const void *b, ssize_t s) { ssize_t s = skip_content(a,e-a,fid&7); if (s <= 0) - return -272; + return -278; a += s; break; } @@ -5922,7 +6132,7 @@ ssize_t AdcChannel::fromMemory(const void *b, ssize_t s) } assert((a-(const uint8_t *)b) == s); if (a > e) - return -273; + return -279; return a-(const uint8_t *)b; } @@ -5935,13 +6145,13 @@ ssize_t AdcChannel::toMemory(uint8_t *b, ssize_t s) const if (!m_name.empty()) { // 'name': id=1, encoding=lenpfx, tag=0xa if (a >= e) - return -274; + return -280; *a++ = 0xa; ssize_t name_s = m_name.size(); n = write_varint(a,e-a,name_s); a += n; if ((n <= 0) || ((e-a) < name_s)) - return -275; + return -281; memcpy(a,m_name.data(),name_s); a += name_s; } @@ -5949,65 +6159,65 @@ ssize_t AdcChannel::toMemory(uint8_t *b, ssize_t s) const if (m_unit != 0) { // 'unit': id=2, encoding=varint, tag=0x10 if (a >= e) - return -276; + return -282; *a++ = 0x10; n = write_varint(a,e-a,m_unit); if (n <= 0) - return -277; + return -283; a += n; } // has ch? if (m_ch != -1) { // 'ch': id=3, encoding=varint, tag=0x18 if (a >= e) - return -278; + return -284; *a++ = 0x18; n = write_varint(a,e-a,sint_varint(m_ch)); if (n <= 0) - return -279; + return -285; a += n; } // has atten? if (0 != (p_validbits & ((uint8_t)1U << 0))) { // 'atten': id=4, encoding=varint, tag=0x20 if (a >= e) - return -280; + return -286; *a++ = 0x20; n = write_varint(a,e-a,m_atten); if (n <= 0) - return -281; + return -287; a += n; } // has interval? if (m_interval != 0) { // 'interval': id=5, encoding=varint, tag=0x28 if (a >= e) - return -282; + return -288; *a++ = 0x28; n = write_varint(a,e-a,m_interval); if (n <= 0) - return -283; + return -289; a += n; } // has window? if (m_window != 0) { // 'window': id=6, encoding=varint, tag=0x30 if (a >= e) - return -284; + return -290; *a++ = 0x30; n = write_varint(a,e-a,m_window); if (n <= 0) - return -285; + return -291; a += n; } // has scale? if (0 != (p_validbits & ((uint8_t)1U << 1))) { // 'scale': id=8, encoding=32bit, tag=0x45 if (5 > (e-a)) - return -286; + return -292; *a++ = 0x45; if ((e-a) < 4) - return -287; + return -293; write_u32(a,mangle_float(m_scale)); a += 4; } @@ -6015,10 +6225,10 @@ ssize_t AdcChannel::toMemory(uint8_t *b, ssize_t s) const if (0 != (p_validbits & ((uint8_t)1U << 2))) { // 'offset': id=9, encoding=32bit, tag=0x4d if (5 > (e-a)) - return -288; + return -294; *a++ = 0x4d; if ((e-a) < 4) - return -289; + return -295; write_u32(a,mangle_float(m_offset)); a += 4; } @@ -6026,13 +6236,13 @@ ssize_t AdcChannel::toMemory(uint8_t *b, ssize_t s) const if (!m_dim.empty()) { // 'dim': id=10, encoding=lenpfx, tag=0x52 if (a >= e) - return -290; + return -296; *a++ = 0x52; ssize_t dim_s = m_dim.size(); n = write_varint(a,e-a,dim_s); a += n; if ((n <= 0) || ((e-a) < dim_s)) - return -291; + return -297; memcpy(a,m_dim.data(),dim_s); a += dim_s; } @@ -6361,7 +6571,7 @@ int AdcChannel::setByName(const char *name, const char *value) int r = m_dim.size(); return r; } - return -292; + return -298; } Message *AdcChannel::p_getMember(const char *s, unsigned n) @@ -6423,7 +6633,7 @@ ssize_t AdcConfig::fromMemory(const void *b, ssize_t s) varint_t fid; int fn = read_varint(a,e-a,&fid); if (fn <= 0) - return -293; + return -299; a += fn; switch (fid) { case 0xa: // adc_name id 1, type std::string, coding byte[] @@ -6432,7 +6642,7 @@ ssize_t AdcConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -294; + return -300; m_adc_name.assign((const char*)a,v); a += v; } @@ -6442,7 +6652,7 @@ ssize_t AdcConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -295; + return -301; a += n; set_adc1_bits(v); } @@ -6452,7 +6662,7 @@ ssize_t AdcConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -296; + return -302; a += n; set_adc2_bits(v); } @@ -6462,7 +6672,7 @@ ssize_t AdcConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -297; + return -303; a += n; set_mode(v); } @@ -6472,7 +6682,7 @@ ssize_t AdcConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -298; + return -304; a += n; set_clk_div(v); } @@ -6483,7 +6693,7 @@ ssize_t AdcConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -299; + return -305; m_hall_name.assign((const char*)a,v); a += v; } @@ -6494,14 +6704,14 @@ ssize_t AdcConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -300; + return -306; m_channels.emplace_back(); if (v != 0) { n = m_channels.back().fromMemory((const uint8_t*)a,v); if (n < 0) return n; if (n != (ssize_t)v) - return -301; + return -307; a += v; } } @@ -6511,7 +6721,7 @@ ssize_t AdcConfig::fromMemory(const void *b, ssize_t s) { ssize_t s = skip_content(a,e-a,fid&7); if (s <= 0) - return -302; + return -308; a += s; break; } @@ -6519,7 +6729,7 @@ ssize_t AdcConfig::fromMemory(const void *b, ssize_t s) } assert((a-(const uint8_t *)b) == s); if (a > e) - return -303; + return -309; return a-(const uint8_t *)b; } @@ -6532,13 +6742,13 @@ ssize_t AdcConfig::toMemory(uint8_t *b, ssize_t s) const if (!m_adc_name.empty()) { // 'adc_name': id=1, encoding=lenpfx, tag=0xa if (a >= e) - return -304; + return -310; *a++ = 0xa; ssize_t adc_name_s = m_adc_name.size(); n = write_varint(a,e-a,adc_name_s); a += n; if ((n <= 0) || ((e-a) < adc_name_s)) - return -305; + return -311; memcpy(a,m_adc_name.data(),adc_name_s); a += adc_name_s; } @@ -6546,70 +6756,70 @@ ssize_t AdcConfig::toMemory(uint8_t *b, ssize_t s) const if (0 != (p_validbits & ((uint8_t)1U << 0))) { // 'adc1_bits': id=2, encoding=varint, tag=0x10 if (a >= e) - return -306; + return -312; *a++ = 0x10; n = write_varint(a,e-a,m_adc1_bits); if (n <= 0) - return -307; + return -313; a += n; } // has adc2_bits? if (0 != (p_validbits & ((uint8_t)1U << 1))) { // 'adc2_bits': id=3, encoding=varint, tag=0x18 if (a >= e) - return -308; + return -314; *a++ = 0x18; n = write_varint(a,e-a,m_adc2_bits); if (n <= 0) - return -309; + return -315; a += n; } // has mode? if (0 != (p_validbits & ((uint8_t)1U << 2))) { // 'mode': id=4, encoding=varint, tag=0x20 if (a >= e) - return -310; + return -316; *a++ = 0x20; n = write_varint(a,e-a,m_mode); if (n <= 0) - return -311; + return -317; a += n; } // has clk_div? if (0 != (p_validbits & ((uint8_t)1U << 3))) { // 'clk_div': id=5, encoding=varint, tag=0x28 if (a >= e) - return -312; + return -318; *a++ = 0x28; n = write_varint(a,e-a,m_clk_div); if (n <= 0) - return -313; + return -319; a += n; } // has hall_name? if (!m_hall_name.empty()) { // 'hall_name': id=6, encoding=lenpfx, tag=0x32 if (a >= e) - return -314; + return -320; *a++ = 0x32; ssize_t hall_name_s = m_hall_name.size(); n = write_varint(a,e-a,hall_name_s); a += n; if ((n <= 0) || ((e-a) < hall_name_s)) - return -315; + return -321; memcpy(a,m_hall_name.data(),hall_name_s); a += hall_name_s; } for (const auto &x : m_channels) { // 'channels': id=7, encoding=lenpfx, tag=0x3a if (a >= e) - return -316; + return -322; *a++ = 0x3a; ssize_t channels_ws = x.calcSize(); n = write_varint(a,e-a,channels_ws); a += n; if ((n <= 0) || (channels_ws > (e-a))) - return -317; + return -323; n = x.toMemory(a,e-a); a += n; assert(n == channels_ws); @@ -6912,20 +7122,20 @@ int AdcConfig::setByName(const char *name, const char *value) } else { x = strtoul(name+9,&idxe,0); if ((idxe[0] != ']') || (idxe == (name+9))) - return -318; + return -324; if (m_channels.size() <= x) - return -319; + return -325; if ((idxe[1] == 0) && (value == 0)) { m_channels.erase(m_channels.begin()+x); return 0; } } if (idxe[1] != '.') - return -320; + return -326; return m_channels[x].setByName(idxe+2,value); } } - return -321; + return -327; } Message *AdcConfig::p_getMember(const char *s, unsigned n) @@ -6980,9 +7190,6 @@ void GpioConfig::toASCII(std::ostream &o, size_t indent) const ascii_indent(o,indent); o << ".pulldown"; o << (config_pulldown() ? " = true;" : " = false;"); - ascii_indent(o,indent); - o << ".cap_freq_r2r"; - o << (config_cap_freq_r2r() ? " = true;" : " = false;"); --indent; --indent; ascii_indent(o,indent); @@ -6997,7 +7204,7 @@ ssize_t GpioConfig::fromMemory(const void *b, ssize_t s) varint_t fid; int fn = read_varint(a,e-a,&fid); if (fn <= 0) - return -322; + return -328; a += fn; switch (fid) { case 0xa: // name id 1, type std::string, coding byte[] @@ -7006,7 +7213,7 @@ ssize_t GpioConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -323; + return -329; m_name.assign((const char*)a,v); a += v; } @@ -7016,7 +7223,7 @@ ssize_t GpioConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -324; + return -330; a += n; set_gpio(varint_sint(v)); } @@ -7026,7 +7233,7 @@ ssize_t GpioConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -325; + return -331; a += n; set_config((gpiocfg_t) v); } @@ -7036,7 +7243,7 @@ ssize_t GpioConfig::fromMemory(const void *b, ssize_t s) { ssize_t s = skip_content(a,e-a,fid&7); if (s <= 0) - return -326; + return -332; a += s; break; } @@ -7044,7 +7251,7 @@ ssize_t GpioConfig::fromMemory(const void *b, ssize_t s) } assert((a-(const uint8_t *)b) == s); if (a > e) - return -327; + return -333; return a-(const uint8_t *)b; } @@ -7057,13 +7264,13 @@ ssize_t GpioConfig::toMemory(uint8_t *b, ssize_t s) const if (!m_name.empty()) { // 'name': id=1, encoding=lenpfx, tag=0xa if (a >= e) - return -328; + return -334; *a++ = 0xa; ssize_t name_s = m_name.size(); n = write_varint(a,e-a,name_s); a += n; if ((n <= 0) || ((e-a) < name_s)) - return -329; + return -335; memcpy(a,m_name.data(),name_s); a += name_s; } @@ -7071,22 +7278,22 @@ ssize_t GpioConfig::toMemory(uint8_t *b, ssize_t s) const if (m_gpio != -1) { // 'gpio': id=2, encoding=varint, tag=0x10 if (a >= e) - return -330; + return -336; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_gpio)); if (n <= 0) - return -331; + return -337; a += n; } // has config? if (0 != (p_validbits & ((uint8_t)1U << 0))) { // 'config': id=3, encoding=varint, tag=0x18 if (a >= e) - return -332; + return -338; *a++ = 0x18; n = write_varint(a,e-a,m_config); if (n <= 0) - return -333; + return -339; a += n; } assert(a <= e); @@ -7245,14 +7452,49 @@ int GpioConfig::setByName(const char *name, const char *value) set_config_pullup((bool)ull); else if (!strcmp(name,"pulldown")) set_config_pulldown((bool)ull); - else if (!strcmp(name,"cap_freq_r2r")) - set_config_cap_freq_r2r((bool)ull); return eptr - value; - } else { - return -334; } - } - return -335; + if (*name++ != '.') { + return -340; + } else if (!strcmp(name,"mode")) { + uint8_t tmp; + int r = parse_ascii_u8(&tmp,value); + if (r > 0) + set_config_mode(tmp); + return r; + } else if (!strcmp(name,"intrtype")) { + uint8_t tmp; + int r = parse_ascii_u8(&tmp,value); + if (r > 0) + set_config_intrtype(tmp); + return r; + } else if (!strcmp(name,"setinit")) { + bool tmp; + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_setinit(tmp); + return r; + } else if (!strcmp(name,"initlvl")) { + bool tmp; + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_initlvl(tmp); + return r; + } else if (!strcmp(name,"pullup")) { + bool tmp; + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_pullup(tmp); + return r; + } else if (!strcmp(name,"pulldown")) { + bool tmp; + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_pulldown(tmp); + return r; + } + } + return -341; } Message *GpioConfig::p_getMember(const char *s, unsigned n) @@ -7302,7 +7544,7 @@ ssize_t DisplayConfig::fromMemory(const void *b, ssize_t s) varint_t fid; int fn = read_varint(a,e-a,&fid); if (fn <= 0) - return -336; + return -342; a += fn; switch (fid) { case 0x8: // type id 1, type disp_t, coding varint @@ -7310,7 +7552,7 @@ ssize_t DisplayConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -337; + return -343; a += n; set_type((disp_t) v); } @@ -7320,7 +7562,7 @@ ssize_t DisplayConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -338; + return -344; a += n; set_options(v); } @@ -7330,7 +7572,7 @@ ssize_t DisplayConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -339; + return -345; a += n; set_maxx(v); } @@ -7340,7 +7582,7 @@ ssize_t DisplayConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -340; + return -346; a += n; set_maxy(v); } @@ -7350,7 +7592,7 @@ ssize_t DisplayConfig::fromMemory(const void *b, ssize_t s) { ssize_t s = skip_content(a,e-a,fid&7); if (s <= 0) - return -341; + return -347; a += s; break; } @@ -7358,7 +7600,7 @@ ssize_t DisplayConfig::fromMemory(const void *b, ssize_t s) } assert((a-(const uint8_t *)b) == s); if (a > e) - return -342; + return -348; return a-(const uint8_t *)b; } @@ -7371,44 +7613,44 @@ ssize_t DisplayConfig::toMemory(uint8_t *b, ssize_t s) const if (m_type != dt_none) { // 'type': id=1, encoding=varint, tag=0x8 if (a >= e) - return -343; + return -349; *a++ = 0x8; n = write_varint(a,e-a,m_type); if (n <= 0) - return -344; + return -350; a += n; } // has options? if (0 != (p_validbits & ((uint8_t)1U << 0))) { // 'options': id=2, encoding=varint, tag=0x10 if (a >= e) - return -345; + return -351; *a++ = 0x10; n = write_varint(a,e-a,m_options); if (n <= 0) - return -346; + return -352; a += n; } // has maxx? if (0 != (p_validbits & ((uint8_t)1U << 1))) { // 'maxx': id=3, encoding=varint, tag=0x18 if (a >= e) - return -347; + return -353; *a++ = 0x18; n = write_varint(a,e-a,m_maxx); if (n <= 0) - return -348; + return -354; a += n; } // has maxy? if (0 != (p_validbits & ((uint8_t)1U << 2))) { // 'maxy': id=4, encoding=varint, tag=0x20 if (a >= e) - return -349; + return -355; *a++ = 0x20; n = write_varint(a,e-a,m_maxy); if (n <= 0) - return -350; + return -356; a += n; } assert(a <= e); @@ -7560,7 +7802,7 @@ int DisplayConfig::setByName(const char *name, const char *value) disp_t v; size_t r = parse_ascii_disp_t(&v,value); if (r == 0) - return -351; + return -357; set_type(v); return r; } @@ -7594,7 +7836,7 @@ int DisplayConfig::setByName(const char *name, const char *value) p_validbits |= ((uint8_t)1U << 2); return r; } - return -352; + return -358; } Message *DisplayConfig::p_getMember(const char *s, unsigned n) @@ -7616,6 +7858,7 @@ void SpiDeviceConfig::clear() m_intr = -1; m_reset = -1; m_cd = -1; + m_freq = 0; } void SpiDeviceConfig::toASCII(std::ostream &o, size_t indent) const @@ -7632,6 +7875,7 @@ void SpiDeviceConfig::toASCII(std::ostream &o, size_t indent) const ascii_numeric(o, indent, "intr", (signed) m_intr); ascii_numeric(o, indent, "reset", (signed) m_reset); ascii_numeric(o, indent, "cd", (signed) m_cd); + ascii_numeric(o, indent, "freq", m_freq); --indent; ascii_indent(o,indent); o << '}'; @@ -7645,7 +7889,7 @@ ssize_t SpiDeviceConfig::fromMemory(const void *b, ssize_t s) varint_t fid; int fn = read_varint(a,e-a,&fid); if (fn <= 0) - return -353; + return -359; a += fn; switch (fid) { case 0x8: // drv id 1, type spidrv_t, coding varint @@ -7653,7 +7897,7 @@ ssize_t SpiDeviceConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -354; + return -360; a += n; set_drv((spidrv_t) v); } @@ -7663,7 +7907,7 @@ ssize_t SpiDeviceConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -355; + return -361; a += n; set_cs(varint_sint(v)); } @@ -7673,7 +7917,7 @@ ssize_t SpiDeviceConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -356; + return -362; a += n; set_intr(varint_sint(v)); } @@ -7683,7 +7927,7 @@ ssize_t SpiDeviceConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -357; + return -363; a += n; set_reset(varint_sint(v)); } @@ -7693,17 +7937,27 @@ ssize_t SpiDeviceConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -358; + return -364; a += n; set_cd(varint_sint(v)); } break; + case 0x30: // freq id 6, type uint64_t, coding varint + { + varint_t v; + int n = read_varint(a,e-a,&v); + if (n <= 0) + return -365; + a += n; + set_freq(v); + } + break; default: // unknown field (option unknown=skip) { ssize_t s = skip_content(a,e-a,fid&7); if (s <= 0) - return -359; + return -366; a += s; break; } @@ -7711,7 +7965,7 @@ ssize_t SpiDeviceConfig::fromMemory(const void *b, ssize_t s) } assert((a-(const uint8_t *)b) == s); if (a > e) - return -360; + return -367; return a-(const uint8_t *)b; } @@ -7724,55 +7978,66 @@ ssize_t SpiDeviceConfig::toMemory(uint8_t *b, ssize_t s) const if (m_drv != spidrv_invalid) { // 'drv': id=1, encoding=varint, tag=0x8 if (a >= e) - return -361; + return -368; *a++ = 0x8; n = write_varint(a,e-a,m_drv); if (n <= 0) - return -362; + return -369; a += n; } // has cs? if (m_cs != -1) { // 'cs': id=2, encoding=varint, tag=0x10 if (a >= e) - return -363; + return -370; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_cs)); if (n <= 0) - return -364; + return -371; a += n; } // has intr? if (m_intr != -1) { // 'intr': id=3, encoding=varint, tag=0x18 if (a >= e) - return -365; + return -372; *a++ = 0x18; n = write_varint(a,e-a,sint_varint(m_intr)); if (n <= 0) - return -366; + return -373; a += n; } // has reset? if (m_reset != -1) { // 'reset': id=4, encoding=varint, tag=0x20 if (a >= e) - return -367; + return -374; *a++ = 0x20; n = write_varint(a,e-a,sint_varint(m_reset)); if (n <= 0) - return -368; + return -375; a += n; } // has cd? if (m_cd != -1) { // 'cd': id=5, encoding=varint, tag=0x28 if (a >= e) - return -369; + return -376; *a++ = 0x28; n = write_varint(a,e-a,sint_varint(m_cd)); if (n <= 0) - return -370; + return -377; + a += n; + } + // has freq? + if (m_freq != 0) { + // 'freq': id=6, encoding=varint, tag=0x30 + if (a >= e) + return -378; + *a++ = 0x30; + n = write_varint(a,e-a,m_freq); + if (n <= 0) + return -379; a += n; } assert(a <= e); @@ -7806,6 +8071,11 @@ void SpiDeviceConfig::toWire(void (*put)(uint8_t)) const put(0x28); // 'cd': id=5 send_varint(put,sint_varint(m_cd)); } + if (m_freq != 0) { + // 'freq': id=6, encoding=varint, tag=0x30 + put(0x30); // 'freq': id=6 + send_varint(put,m_freq); + } } void SpiDeviceConfig::toString(std::string &put) const @@ -7835,6 +8105,11 @@ void SpiDeviceConfig::toString(std::string &put) const put.push_back(0x28); // 'cd': id=5 send_varint(put,sint_varint(m_cd)); } + if (m_freq != 0) { + // 'freq': id=6, encoding=varint, tag=0x30 + put.push_back(0x30); // 'freq': id=6 + send_varint(put,m_freq); + } } void SpiDeviceConfig::toJSON(std::ostream &json, unsigned indLvl) const @@ -7867,6 +8142,10 @@ void SpiDeviceConfig::toJSON(std::ostream &json, unsigned indLvl) const fsep = json_indent(json,indLvl,fsep,"cd"); json << (int) m_cd; } + if (has_freq()) { + fsep = json_indent(json,indLvl,fsep,"freq"); + json << m_freq; + } if (fsep == '{') json.put('{'); json.put('\n'); @@ -7900,6 +8179,10 @@ size_t SpiDeviceConfig::calcSize() const if (m_cd != -1) { r += wiresize_s((varint_t)m_cd) + 1 /* tag(cd) 0x28 */; } + // optional unsigned freq, id 6 + if (m_freq != 0) { + r += wiresize((varint_t)m_freq) + 1 /* tag(freq) 0x30 */; + } return r; } @@ -7915,6 +8198,8 @@ bool SpiDeviceConfig::operator != (const SpiDeviceConfig &r) const return true; if (has_cd() && (m_cd != r.m_cd)) return true; + if (has_freq() && (m_freq != r.m_freq)) + return true; return false; } @@ -7942,7 +8227,7 @@ int SpiDeviceConfig::setByName(const char *name, const char *value) spidrv_t v; size_t r = parse_ascii_spidrv_t(&v,value); if (r == 0) - return -371; + return -380; set_drv(v); return r; } @@ -7978,7 +8263,15 @@ int SpiDeviceConfig::setByName(const char *name, const char *value) int r = parse_ascii_s8(&m_cd,value); return r; } - return -372; + if (0 == strcmp(name,"freq")) { + if (value == 0) { + clear_freq(); + return 0; + } + int r = parse_ascii_u64(&m_freq,value); + return r; + } + return -381; } Message *SpiDeviceConfig::p_getMember(const char *s, unsigned n) @@ -8067,7 +8360,7 @@ ssize_t SpiBusConfig::fromMemory(const void *b, ssize_t s) varint_t fid; int fn = read_varint(a,e-a,&fid); if (fn <= 0) - return -373; + return -382; a += fn; switch (fid) { case 0x8: // host id 1, type int8_t, coding signed varint @@ -8075,7 +8368,7 @@ ssize_t SpiBusConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -374; + return -383; a += n; set_host(varint_sint(v)); } @@ -8085,7 +8378,7 @@ ssize_t SpiBusConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -375; + return -384; a += n; set_mosi(varint_sint(v)); } @@ -8095,7 +8388,7 @@ ssize_t SpiBusConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -376; + return -385; a += n; set_miso(varint_sint(v)); } @@ -8105,7 +8398,7 @@ ssize_t SpiBusConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -377; + return -386; a += n; set_sclk(varint_sint(v)); } @@ -8115,7 +8408,7 @@ ssize_t SpiBusConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -378; + return -387; a += n; set_wp(varint_sint(v)); } @@ -8125,7 +8418,7 @@ ssize_t SpiBusConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -379; + return -388; a += n; set_hold(varint_sint(v)); } @@ -8135,7 +8428,7 @@ ssize_t SpiBusConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -380; + return -389; a += n; set_options((spiopt_t) v); } @@ -8145,7 +8438,7 @@ ssize_t SpiBusConfig::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -381; + return -390; a += n; set_dma(varint_sint(v)); } @@ -8156,14 +8449,14 @@ ssize_t SpiBusConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -382; + return -391; m_devices.emplace_back(); if (v != 0) { n = m_devices.back().fromMemory((const uint8_t*)a,v); if (n < 0) return n; if (n != (ssize_t)v) - return -383; + return -392; a += v; } } @@ -8173,7 +8466,7 @@ ssize_t SpiBusConfig::fromMemory(const void *b, ssize_t s) { ssize_t s = skip_content(a,e-a,fid&7); if (s <= 0) - return -384; + return -393; a += s; break; } @@ -8181,7 +8474,7 @@ ssize_t SpiBusConfig::fromMemory(const void *b, ssize_t s) } assert((a-(const uint8_t *)b) == s); if (a > e) - return -385; + return -394; return a-(const uint8_t *)b; } @@ -8194,100 +8487,100 @@ ssize_t SpiBusConfig::toMemory(uint8_t *b, ssize_t s) const if (m_host != -1) { // 'host': id=1, encoding=varint, tag=0x8 if (a >= e) - return -386; + return -395; *a++ = 0x8; n = write_varint(a,e-a,sint_varint(m_host)); if (n <= 0) - return -387; + return -396; a += n; } // has mosi? if (m_mosi != -1) { // 'mosi': id=2, encoding=varint, tag=0x10 if (a >= e) - return -388; + return -397; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_mosi)); if (n <= 0) - return -389; + return -398; a += n; } // has miso? if (m_miso != -1) { // 'miso': id=3, encoding=varint, tag=0x18 if (a >= e) - return -390; + return -399; *a++ = 0x18; n = write_varint(a,e-a,sint_varint(m_miso)); if (n <= 0) - return -391; + return -400; a += n; } // has sclk? if (m_sclk != -1) { // 'sclk': id=4, encoding=varint, tag=0x20 if (a >= e) - return -392; + return -401; *a++ = 0x20; n = write_varint(a,e-a,sint_varint(m_sclk)); if (n <= 0) - return -393; + return -402; a += n; } // has wp? if (m_wp != -1) { // 'wp': id=5, encoding=varint, tag=0x28 if (a >= e) - return -394; + return -403; *a++ = 0x28; n = write_varint(a,e-a,sint_varint(m_wp)); if (n <= 0) - return -395; + return -404; a += n; } // has hold? if (m_hold != -1) { // 'hold': id=6, encoding=varint, tag=0x30 if (a >= e) - return -396; + return -405; *a++ = 0x30; n = write_varint(a,e-a,sint_varint(m_hold)); if (n <= 0) - return -397; + return -406; a += n; } // has options? if (0 != (p_validbits & ((uint8_t)1U << 0))) { // 'options': id=7, encoding=varint, tag=0x38 if (a >= e) - return -398; + return -407; *a++ = 0x38; n = write_varint(a,e-a,m_options); if (n <= 0) - return -399; + return -408; a += n; } // has dma? if (m_dma != -1) { // 'dma': id=8, encoding=varint, tag=0x40 if (a >= e) - return -400; + return -409; *a++ = 0x40; n = write_varint(a,e-a,sint_varint(m_dma)); if (n <= 0) - return -401; + return -410; a += n; } for (const auto &x : m_devices) { // 'devices': id=9, encoding=lenpfx, tag=0x4a if (a >= e) - return -402; + return -411; *a++ = 0x4a; ssize_t devices_ws = x.calcSize(); n = write_varint(a,e-a,devices_ws); a += n; if ((n <= 0) || (devices_ws > (e-a))) - return -403; + return -412; n = x.toMemory(a,e-a); a += n; assert(n == devices_ws); @@ -8616,8 +8909,51 @@ int SpiBusConfig::setByName(const char *name, const char *value) else if (!strcmp(name,"pha_hi")) set_options_pha_hi((bool)ull); return eptr - value; - } else { - return -404; + } + if (*name++ != '.') { + return -413; + } else if (!strcmp(name,"txlsbfirst")) { + bool tmp; + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_options_txlsbfirst(tmp); + return r; + } else if (!strcmp(name,"rxlsbfirst")) { + bool tmp; + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_options_rxlsbfirst(tmp); + return r; + } else if (!strcmp(name,"mosi_as_miso")) { + bool tmp; + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_options_mosi_as_miso(tmp); + return r; + } else if (!strcmp(name,"positive_cs")) { + bool tmp; + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_options_positive_cs(tmp); + return r; + } else if (!strcmp(name,"full_duplex")) { + bool tmp; + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_options_full_duplex(tmp); + return r; + } else if (!strcmp(name,"pol_hi")) { + bool tmp; + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_options_pol_hi(tmp); + return r; + } else if (!strcmp(name,"pha_hi")) { + bool tmp; + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_options_pha_hi(tmp); + return r; } } if (0 == strcmp(name,"dma")) { @@ -8644,20 +8980,20 @@ int SpiBusConfig::setByName(const char *name, const char *value) } else { x = strtoul(name+8,&idxe,0); if ((idxe[0] != ']') || (idxe == (name+8))) - return -405; + return -414; if (m_devices.size() <= x) - return -406; + return -415; if ((idxe[1] == 0) && (value == 0)) { m_devices.erase(m_devices.begin()+x); return 0; } } if (idxe[1] != '.') - return -407; + return -416; return m_devices[x].setByName(idxe+2,value); } } - return -408; + return -417; } Message *SpiBusConfig::p_getMember(const char *s, unsigned n) @@ -8707,7 +9043,7 @@ ssize_t GpioCluster::fromMemory(const void *b, ssize_t s) varint_t fid; int fn = read_varint(a,e-a,&fid); if (fn <= 0) - return -409; + return -418; a += fn; switch (fid) { case 0xa: // name id 1, type std::string, coding byte[] @@ -8716,7 +9052,7 @@ ssize_t GpioCluster::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -410; + return -419; m_name.assign((const char*)a,v); a += v; } @@ -8726,7 +9062,7 @@ ssize_t GpioCluster::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -411; + return -420; a += n; set_base(v); } @@ -8736,7 +9072,7 @@ ssize_t GpioCluster::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -412; + return -421; a += n; set_numio(v); } @@ -8746,7 +9082,7 @@ ssize_t GpioCluster::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -413; + return -422; a += n; set_int_a(varint_sint(v)); } @@ -8756,7 +9092,7 @@ ssize_t GpioCluster::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -414; + return -423; a += n; set_int_b(varint_sint(v)); } @@ -8766,7 +9102,7 @@ ssize_t GpioCluster::fromMemory(const void *b, ssize_t s) { ssize_t s = skip_content(a,e-a,fid&7); if (s <= 0) - return -415; + return -424; a += s; break; } @@ -8774,7 +9110,7 @@ ssize_t GpioCluster::fromMemory(const void *b, ssize_t s) } assert((a-(const uint8_t *)b) == s); if (a > e) - return -416; + return -425; return a-(const uint8_t *)b; } @@ -8787,13 +9123,13 @@ ssize_t GpioCluster::toMemory(uint8_t *b, ssize_t s) const if (!m_name.empty()) { // 'name': id=1, encoding=lenpfx, tag=0xa if (a >= e) - return -417; + return -426; *a++ = 0xa; ssize_t name_s = m_name.size(); n = write_varint(a,e-a,name_s); a += n; if ((n <= 0) || ((e-a) < name_s)) - return -418; + return -427; memcpy(a,m_name.data(),name_s); a += name_s; } @@ -8801,44 +9137,44 @@ ssize_t GpioCluster::toMemory(uint8_t *b, ssize_t s) const if (m_base != 0) { // 'base': id=2, encoding=varint, tag=0x10 if (a >= e) - return -419; + return -428; *a++ = 0x10; n = write_varint(a,e-a,m_base); if (n <= 0) - return -420; + return -429; a += n; } // has numio? if (m_numio != 0) { // 'numio': id=3, encoding=varint, tag=0x18 if (a >= e) - return -421; + return -430; *a++ = 0x18; n = write_varint(a,e-a,m_numio); if (n <= 0) - return -422; + return -431; a += n; } // has int_a? if (m_int_a != -1) { // 'int_a': id=4, encoding=varint, tag=0x20 if (a >= e) - return -423; + return -432; *a++ = 0x20; n = write_varint(a,e-a,sint_varint(m_int_a)); if (n <= 0) - return -424; + return -433; a += n; } // has int_b? if (m_int_b != -1) { // 'int_b': id=5, encoding=varint, tag=0x28 if (a >= e) - return -425; + return -434; *a++ = 0x28; n = write_varint(a,e-a,sint_varint(m_int_b)); if (n <= 0) - return -426; + return -435; a += n; } assert(a <= e); @@ -9040,7 +9376,7 @@ int GpioCluster::setByName(const char *name, const char *value) int r = parse_ascii_s8(&m_int_b,value); return r; } - return -427; + return -436; } Message *GpioCluster::p_getMember(const char *s, unsigned n) @@ -9082,7 +9418,7 @@ ssize_t Hlw8012Config::fromMemory(const void *b, ssize_t s) varint_t fid; int fn = read_varint(a,e-a,&fid); if (fn <= 0) - return -428; + return -437; a += fn; switch (fid) { case 0x10: // sel id 2, type int8_t, coding signed varint @@ -9090,7 +9426,7 @@ ssize_t Hlw8012Config::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -429; + return -438; a += n; set_sel(varint_sint(v)); } @@ -9100,7 +9436,7 @@ ssize_t Hlw8012Config::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -430; + return -439; a += n; set_cf(varint_sint(v)); } @@ -9110,7 +9446,7 @@ ssize_t Hlw8012Config::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -431; + return -440; a += n; set_cf1(varint_sint(v)); } @@ -9120,7 +9456,7 @@ ssize_t Hlw8012Config::fromMemory(const void *b, ssize_t s) { ssize_t s = skip_content(a,e-a,fid&7); if (s <= 0) - return -432; + return -441; a += s; break; } @@ -9128,7 +9464,7 @@ ssize_t Hlw8012Config::fromMemory(const void *b, ssize_t s) } assert((a-(const uint8_t *)b) == s); if (a > e) - return -433; + return -442; return a-(const uint8_t *)b; } @@ -9141,33 +9477,33 @@ ssize_t Hlw8012Config::toMemory(uint8_t *b, ssize_t s) const if (m_sel != -1) { // 'sel': id=2, encoding=varint, tag=0x10 if (a >= e) - return -434; + return -443; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_sel)); if (n <= 0) - return -435; + return -444; a += n; } // has cf? if (m_cf != -1) { // 'cf': id=3, encoding=varint, tag=0x18 if (a >= e) - return -436; + return -445; *a++ = 0x18; n = write_varint(a,e-a,sint_varint(m_cf)); if (n <= 0) - return -437; + return -446; a += n; } // has cf1? if (m_cf1 != -1) { // 'cf1': id=4, encoding=varint, tag=0x20 if (a >= e) - return -438; + return -447; *a++ = 0x20; n = write_varint(a,e-a,sint_varint(m_cf1)); if (n <= 0) - return -439; + return -448; a += n; } assert(a <= e); @@ -9307,7 +9643,7 @@ int Hlw8012Config::setByName(const char *name, const char *value) int r = parse_ascii_s8(&m_cf1,value); return r; } - return -440; + return -449; } Message *Hlw8012Config::p_getMember(const char *s, unsigned n) @@ -9355,7 +9691,7 @@ ssize_t SX1276Config::fromMemory(const void *b, ssize_t s) varint_t fid; int fn = read_varint(a,e-a,&fid); if (fn <= 0) - return -441; + return -450; a += fn; switch (fid) { case 0x8: // dio0 id 1, type int8_t, coding signed varint @@ -9363,7 +9699,7 @@ ssize_t SX1276Config::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -442; + return -451; a += n; set_dio0(varint_sint(v)); } @@ -9373,7 +9709,7 @@ ssize_t SX1276Config::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -443; + return -452; a += n; set_dio1(varint_sint(v)); } @@ -9383,7 +9719,7 @@ ssize_t SX1276Config::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -444; + return -453; a += n; set_dio2(varint_sint(v)); } @@ -9393,7 +9729,7 @@ ssize_t SX1276Config::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -445; + return -454; a += n; set_dio3(varint_sint(v)); } @@ -9403,7 +9739,7 @@ ssize_t SX1276Config::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -446; + return -455; a += n; set_dio4(varint_sint(v)); } @@ -9413,7 +9749,7 @@ ssize_t SX1276Config::fromMemory(const void *b, ssize_t s) varint_t v; int n = read_varint(a,e-a,&v); if (n <= 0) - return -447; + return -456; a += n; set_dio5(varint_sint(v)); } @@ -9423,7 +9759,7 @@ ssize_t SX1276Config::fromMemory(const void *b, ssize_t s) { ssize_t s = skip_content(a,e-a,fid&7); if (s <= 0) - return -448; + return -457; a += s; break; } @@ -9431,7 +9767,7 @@ ssize_t SX1276Config::fromMemory(const void *b, ssize_t s) } assert((a-(const uint8_t *)b) == s); if (a > e) - return -449; + return -458; return a-(const uint8_t *)b; } @@ -9444,66 +9780,66 @@ ssize_t SX1276Config::toMemory(uint8_t *b, ssize_t s) const if (m_dio0 != -1) { // 'dio0': id=1, encoding=varint, tag=0x8 if (a >= e) - return -450; + return -459; *a++ = 0x8; n = write_varint(a,e-a,sint_varint(m_dio0)); if (n <= 0) - return -451; + return -460; a += n; } // has dio1? if (m_dio1 != -1) { // 'dio1': id=2, encoding=varint, tag=0x10 if (a >= e) - return -452; + return -461; *a++ = 0x10; n = write_varint(a,e-a,sint_varint(m_dio1)); if (n <= 0) - return -453; + return -462; a += n; } // has dio2? if (m_dio2 != -1) { // 'dio2': id=3, encoding=varint, tag=0x18 if (a >= e) - return -454; + return -463; *a++ = 0x18; n = write_varint(a,e-a,sint_varint(m_dio2)); if (n <= 0) - return -455; + return -464; a += n; } // has dio3? if (m_dio3 != -1) { // 'dio3': id=4, encoding=varint, tag=0x20 if (a >= e) - return -456; + return -465; *a++ = 0x20; n = write_varint(a,e-a,sint_varint(m_dio3)); if (n <= 0) - return -457; + return -466; a += n; } // has dio4? if (m_dio4 != -1) { // 'dio4': id=5, encoding=varint, tag=0x28 if (a >= e) - return -458; + return -467; *a++ = 0x28; n = write_varint(a,e-a,sint_varint(m_dio4)); if (n <= 0) - return -459; + return -468; a += n; } // has dio5? if (m_dio5 != -1) { // 'dio5': id=6, encoding=varint, tag=0x30 if (a >= e) - return -460; + return -469; *a++ = 0x30; n = write_varint(a,e-a,sint_varint(m_dio5)); if (n <= 0) - return -461; + return -470; a += n; } assert(a <= e); @@ -9727,7 +10063,7 @@ int SX1276Config::setByName(const char *name, const char *value) int r = parse_ascii_s8(&m_dio5,value); return r; } - return -462; + return -471; } Message *SX1276Config::p_getMember(const char *s, unsigned n) @@ -9742,122 +10078,898 @@ Message *SX1276Config::p_getMember(const char *s, unsigned n, unsigned x) return 0; } -void HardwareConfig::clear() +void Tone::clear() { - m_magic = 0; - m_system.clear(); - m_uart.clear(); - m_adc.clear(); - #ifdef CONFIG_TOUCHPAD - m_touchpad.clear(); - #endif // CONFIG_TOUCHPAD - #ifdef CONFIG_TOUCHPAD - m_tp_channel.clear(); - #endif // CONFIG_TOUCHPAD - m_gpios.clear(); - #ifdef CONFIG_SPI - m_spibus.clear(); - #endif // CONFIG_SPI - #ifdef CONFIG_BUTTON - m_button.clear(); - #endif // CONFIG_BUTTON - #ifdef CONFIG_RELAY - m_relay.clear(); - #endif // CONFIG_RELAY - #ifdef CONFIG_LEDS - m_led.clear(); - #endif // CONFIG_LEDS - #ifdef CONFIG_HLW8012 - m_hlw8012.clear(); - #endif // CONFIG_HLW8012 - #ifdef CONFIG_MAX7219 - m_max7219.clear(); - #endif // CONFIG_MAX7219 - #ifdef CONFIG_TLC5947 - m_tlc5947.clear(); - #endif // CONFIG_TLC5947 - #ifdef CONFIG_RGBLEDS - m_ws2812b.clear(); - #endif // CONFIG_RGBLEDS - #ifdef CONFIG_DHT - m_dht.clear(); - #endif // CONFIG_DHT - #ifdef CONFIG_I2C - m_i2c.clear(); - #endif // CONFIG_I2C - #ifdef CONFIG_HCSR04 - m_hcsr04.clear(); - #endif // CONFIG_HCSR04 - #ifdef CONFIG_ONEWIRE - m_onewire.clear(); - #endif // CONFIG_ONEWIRE - #ifdef CONFIG_SX1276 - m_sx1276.clear(); - #endif // CONFIG_SX1276 - #ifdef CONFIG_IOEXTENDERS - m_iocluster.clear(); - #endif // CONFIG_IOEXTENDERS - #ifdef CONFIG_DISPLAY - m_display.clear(); - #endif // CONFIG_DISPLAY + m_freq = 0; + m_duration = 0; p_validbits = 0; } -void HardwareConfig::toASCII(std::ostream &o, size_t indent) const +void Tone::toASCII(std::ostream &o, size_t indent) const { - o << "HardwareConfig {"; - ++indent; - ascii_numeric(o, indent, "magic", m_magic); - ascii_indent(o,indent,"system"); - m_system.toASCII(o,indent); - ascii_indent(o,indent); - size_t s_uart = m_uart.size(); - o << "uart[" << s_uart << "] = {"; - ++indent; - for (size_t i = 0, e = s_uart; i != e; ++i) { - ascii_indent(o,indent); - o << i << ": "; - m_uart[i].toASCII(o,indent); - } - --indent; - ascii_indent(o,indent); - o << '}'; - ascii_indent(o,indent,"adc"); - m_adc.toASCII(o,indent); - #ifdef CONFIG_TOUCHPAD - ascii_indent(o,indent,"touchpad"); - m_touchpad.toASCII(o,indent); - #endif // CONFIG_TOUCHPAD - #ifdef CONFIG_TOUCHPAD - ascii_indent(o,indent); - size_t s_tp_channel = m_tp_channel.size(); - o << "tp_channel[" << s_tp_channel << "] = {"; + o << "Tone {"; ++indent; - for (size_t i = 0, e = s_tp_channel; i != e; ++i) { - ascii_indent(o,indent); - o << i << ": "; - m_tp_channel[i].toASCII(o,indent); - } + ascii_numeric(o, indent, "freq", m_freq); + ascii_numeric(o, indent, "duration", m_duration); --indent; ascii_indent(o,indent); o << '}'; - #endif // CONFIG_TOUCHPAD - ascii_indent(o,indent); - size_t s_gpios = m_gpios.size(); - o << "gpios[" << s_gpios << "] = {"; - ++indent; - for (size_t i = 0, e = s_gpios; i != e; ++i) { - ascii_indent(o,indent); - o << i << ": "; - m_gpios[i].toASCII(o,indent); +} + +ssize_t Tone::fromMemory(const void *b, ssize_t s) +{ + const uint8_t *a = (const uint8_t *)b; + const uint8_t *e = a + s; + while (a < e) { + varint_t fid; + int fn = read_varint(a,e-a,&fid); + if (fn <= 0) + return -472; + a += fn; + switch (fid) { + case 0x8: // freq id 1, type uint64_t, coding varint + { + varint_t v; + int n = read_varint(a,e-a,&v); + if (n <= 0) + return -473; + a += n; + set_freq(v); + } + break; + case 0x10: // duration id 2, type uint64_t, coding varint + { + varint_t v; + int n = read_varint(a,e-a,&v); + if (n <= 0) + return -474; + a += n; + set_duration(v); + } + break; + default: + // unknown field (option unknown=skip) + { + ssize_t s = skip_content(a,e-a,fid&7); + if (s <= 0) + return -475; + a += s; + break; + } + } } - --indent; - ascii_indent(o,indent); - o << '}'; - #ifdef CONFIG_SPI - ascii_indent(o,indent); - size_t s_spibus = m_spibus.size(); - o << "spibus[" << s_spibus << "] = {"; + assert((a-(const uint8_t *)b) == s); + if (a > e) + return -476; + return a-(const uint8_t *)b; +} + +ssize_t Tone::toMemory(uint8_t *b, ssize_t s) const +{ + assert(s >= 0); + uint8_t *a = b, *e = b + s; + signed n; + // has freq? + if (0 != (p_validbits & ((uint8_t)1U << 0))) { + // 'freq': id=1, encoding=varint, tag=0x8 + if (a >= e) + return -477; + *a++ = 0x8; + n = write_varint(a,e-a,m_freq); + if (n <= 0) + return -478; + a += n; + } + // has duration? + if (0 != (p_validbits & ((uint8_t)1U << 1))) { + // 'duration': id=2, encoding=varint, tag=0x10 + if (a >= e) + return -479; + *a++ = 0x10; + n = write_varint(a,e-a,m_duration); + if (n <= 0) + return -480; + a += n; + } + assert(a <= e); + return a-b; +} + +void Tone::toWire(void (*put)(uint8_t)) const +{ + if (0 != (p_validbits & ((uint8_t)1U << 0))) { + // 'freq': id=1, encoding=varint, tag=0x8 + put(0x8); // 'freq': id=1 + send_varint(put,m_freq); + } + if (0 != (p_validbits & ((uint8_t)1U << 1))) { + // 'duration': id=2, encoding=varint, tag=0x10 + put(0x10); // 'duration': id=2 + send_varint(put,m_duration); + } +} + +void Tone::toString(std::string &put) const +{ + if (0 != (p_validbits & ((uint8_t)1U << 0))) { + // 'freq': id=1, encoding=varint, tag=0x8 + put.push_back(0x8); // 'freq': id=1 + send_varint(put,m_freq); + } + if (0 != (p_validbits & ((uint8_t)1U << 1))) { + // 'duration': id=2, encoding=varint, tag=0x10 + put.push_back(0x10); // 'duration': id=2 + send_varint(put,m_duration); + } +} + +void Tone::toJSON(std::ostream &json, unsigned indLvl) const +{ + char fsep = '{'; + ++indLvl; + if (has_freq()) { + fsep = json_indent(json,indLvl,fsep,"freq"); + json << m_freq; + } + if (has_duration()) { + fsep = json_indent(json,indLvl,fsep,"duration"); + json << m_duration; + } + if (fsep == '{') + json.put('{'); + json.put('\n'); + --indLvl; + json_indent(json,indLvl,0); + json.put('}'); + if (indLvl == 0) + json.put('\n'); +} + +size_t Tone::calcSize() const +{ + size_t r = 0; // required size, default is fixed length + // optional unsigned freq, id 1 + if (0 != (p_validbits & ((uint8_t)1U << 0))) { + r += wiresize((varint_t)m_freq) + 1 /* tag(freq) 0x8 */; + } + // optional unsigned duration, id 2 + if (0 != (p_validbits & ((uint8_t)1U << 1))) { + r += wiresize((varint_t)m_duration) + 1 /* tag(duration) 0x10 */; + } + return r; +} + +bool Tone::operator != (const Tone &r) const +{ + if (p_validbits != r.p_validbits) + return true; + if (has_freq() && (m_freq != r.m_freq)) + return true; + if (has_duration() && (m_duration != r.m_duration)) + return true; + return false; +} + + +bool Tone::operator == (const Tone &r) const +{ + return !((*this) != r); +} + + +/* + * Function for setting an element in dot notation with an ASCII value. + * It will call the specified parse_ascii function for parsing the value. + * + * @return number of bytes successfully parsed or negative value indicating + * an error. + */ +int Tone::setByName(const char *name, const char *value) +{ + if (0 == strcmp(name,"freq")) { + if (value == 0) { + clear_freq(); + return 0; + } + int r = parse_ascii_u64(&m_freq,value); + if (r > 0) + p_validbits |= ((uint8_t)1U << 0); + return r; + } + if (0 == strcmp(name,"duration")) { + if (value == 0) { + clear_duration(); + return 0; + } + int r = parse_ascii_u64(&m_duration,value); + if (r > 0) + p_validbits |= ((uint8_t)1U << 1); + return r; + } + return -481; +} + +Message *Tone::p_getMember(const char *s, unsigned n) +{ + // caller guarantee: s[n] == '.' + return 0; +} + +Message *Tone::p_getMember(const char *s, unsigned n, unsigned x) +{ + // caller guarantee: s[n] == '[' + return 0; +} + +void Melody::clear() +{ + m_name.clear(); + m_tones.clear(); +} + +void Melody::toASCII(std::ostream &o, size_t indent) const +{ + o << "Melody {"; + ++indent; + ascii_string(o,indent,m_name.data(),m_name.size(),"name"); + ascii_indent(o,indent); + size_t s_tones = m_tones.size(); + o << "tones[" << s_tones << "] = {"; + ++indent; + for (size_t i = 0, e = s_tones; i != e; ++i) { + ascii_indent(o,indent); + o << i << ": "; + ascii_numeric(o, indent, 0, m_tones[i]); + } + --indent; + ascii_indent(o,indent); + o << '}'; + --indent; + ascii_indent(o,indent); + o << '}'; +} + +ssize_t Melody::fromMemory(const void *b, ssize_t s) +{ + const uint8_t *a = (const uint8_t *)b; + const uint8_t *e = a + s; + while (a < e) { + varint_t fid; + int fn = read_varint(a,e-a,&fid); + if (fn <= 0) + return -482; + a += fn; + switch (fid) { + case 0xa: // name id 1, type std::string, coding byte[] + { + varint_t v; + int n = read_varint(a,e-a,&v); + a += n; + if ((n <= 0) || ((a+v) > e)) + return -483; + m_name.assign((const char*)a,v); + a += v; + } + break; + case 0x14: // tones id 2, type uint16_t, coding 16bit + if ((a+1) >= e) + return -484; + m_tones.push_back((uint16_t) read_u16(a)); + a += 2; + break; + default: + // unknown field (option unknown=skip) + { + ssize_t s = skip_content(a,e-a,fid&7); + if (s <= 0) + return -485; + a += s; + break; + } + } + } + assert((a-(const uint8_t *)b) == s); + if (a > e) + return -486; + return a-(const uint8_t *)b; +} + +ssize_t Melody::toMemory(uint8_t *b, ssize_t s) const +{ + assert(s >= 0); + uint8_t *a = b, *e = b + s; + signed n; + // has name? + if (!m_name.empty()) { + // 'name': id=1, encoding=lenpfx, tag=0xa + if (a >= e) + return -487; + *a++ = 0xa; + ssize_t name_s = m_name.size(); + n = write_varint(a,e-a,name_s); + a += n; + if ((n <= 0) || ((e-a) < name_s)) + return -488; + memcpy(a,m_name.data(),name_s); + a += name_s; + } + for (auto x : m_tones) { + // 'tones': id=2, encoding=16bit, tag=0x14 + if (3 > (e-a)) + return -489; + *a++ = 0x14; + if ((e-a) < 2) + return -490; + write_u16(a,x); + a += 2; + } + assert(a <= e); + return a-b; +} + +void Melody::toWire(void (*put)(uint8_t)) const +{ + if (!m_name.empty()) { + // 'name': id=1, encoding=lenpfx, tag=0xa + put(0xa); // 'name': id=1 + size_t name_s = m_name.size(); + send_varint(put,name_s); + send_bytes(put,(const uint8_t*) m_name.data(),name_s); + } + for (size_t x = 0, y = m_tones.size(); x != y; ++x) { + // 'tones': id=2, encoding=16bit, tag=0x14 + put(0x14); // 'tones': id=2 + send_u16(put,m_tones[x]); + } +} + +void Melody::toString(std::string &put) const +{ + if (!m_name.empty()) { + // 'name': id=1, encoding=lenpfx, tag=0xa + put.push_back(0xa); // 'name': id=1 + size_t name_s = m_name.size(); + send_varint(put,name_s); + put.append((const char *)(const uint8_t*) m_name.data(),name_s); + } + for (size_t x = 0, y = m_tones.size(); x != y; ++x) { + // 'tones': id=2, encoding=16bit, tag=0x14 + put.push_back(0x14); // 'tones': id=2 + send_u16(put,m_tones[x]); + } +} + +void Melody::toJSON(std::ostream &json, unsigned indLvl) const +{ + char fsep = '{'; + ++indLvl; + if (has_name()) { + fsep = json_indent(json,indLvl,fsep,"name"); + json_cstr(json,m_name.c_str()); + } + if (size_t s = m_tones.size()) { + fsep = json_indent(json,indLvl,fsep); + indLvl += 2; + json << "\"tones\":[\n"; + size_t i = 0; + for (;;) { + json_indent(json,indLvl,0); + json << m_tones[i]; + ++i; + if (i == s) + break; + json << ",\n"; + } + indLvl -= 2; + json.put('\n'); + json_indent(json,indLvl,0); + json.put(']'); + } + if (fsep == '{') + json.put('{'); + json.put('\n'); + --indLvl; + json_indent(json,indLvl,0); + json.put('}'); + if (indLvl == 0) + json.put('\n'); +} + +size_t Melody::calcSize() const +{ + size_t r = 0; // required size, default is fixed length + // optional string name, id 1 + if (!m_name.empty()) { + size_t name_s = m_name.size(); + r += name_s + wiresize(name_s) + 1 /* tag(name) 0x8 */; + } + // repeated fixed16 tones, id 2 + if (!m_tones.empty()) { + // tones: non-packed, fixed size elements + r += m_tones.size() * 3; // including tag + } + return r; +} + +bool Melody::operator != (const Melody &r) const +{ + if (has_name() && (m_name != r.m_name)) + return true; + if (m_tones != r.m_tones) + return true; + return false; +} + + +bool Melody::operator == (const Melody &r) const +{ + return !((*this) != r); +} + + +/* + * Function for setting an element in dot notation with an ASCII value. + * It will call the specified parse_ascii function for parsing the value. + * + * @return number of bytes successfully parsed or negative value indicating + * an error. + */ +int Melody::setByName(const char *name, const char *value) +{ + if (0 == strcmp(name,"name")) { + if (value == 0) { + clear_name(); + return 0; + } + m_name = value; + int r = m_name.size(); + return r; + } + if (0 == memcmp(name,"tones",5)) { + if ((name[5] == 0) && (value == 0)) { + clear_tones(); + return 0; + } else if (name[5] == '[') { + char *idxe; + unsigned long x; + if ((name[6] == '+') && (name[7] == ']')) { + x = m_tones.size(); + m_tones.resize(x+1); + idxe = (char*)(name + 7); + if (value == 0) + return 0; + } else { + x = strtoul(name+6,&idxe,0); + if ((idxe[0] != ']') || (idxe == (name+6))) + return -491; + if (m_tones.size() <= x) + return -492; + if ((idxe[1] == 0) && (value == 0)) { + m_tones.erase(m_tones.begin()+x); + return 0; + } + } + if (idxe[1] != 0) + return -493; + return parse_ascii_u16(&m_tones[x],value); + } + } + return -494; +} + +Message *Melody::p_getMember(const char *s, unsigned n) +{ + // caller guarantee: s[n] == '.' + return 0; +} + +Message *Melody::p_getMember(const char *s, unsigned n, unsigned x) +{ + // caller guarantee: s[n] == '[' + return 0; +} + +void BuzzerConfig::clear() +{ + m_gpio = -1; + m_melodies.clear(); +} + +void BuzzerConfig::toASCII(std::ostream &o, size_t indent) const +{ + o << "BuzzerConfig {"; + ++indent; + ascii_numeric(o, indent, "gpio", (signed) m_gpio); + ascii_indent(o,indent); + size_t s_melodies = m_melodies.size(); + o << "melodies[" << s_melodies << "] = {"; + ++indent; + for (size_t i = 0, e = s_melodies; i != e; ++i) { + ascii_indent(o,indent); + o << i << ": "; + m_melodies[i].toASCII(o,indent); + } + --indent; + ascii_indent(o,indent); + o << '}'; + --indent; + ascii_indent(o,indent); + o << '}'; +} + +ssize_t BuzzerConfig::fromMemory(const void *b, ssize_t s) +{ + const uint8_t *a = (const uint8_t *)b; + const uint8_t *e = a + s; + while (a < e) { + varint_t fid; + int fn = read_varint(a,e-a,&fid); + if (fn <= 0) + return -495; + a += fn; + switch (fid) { + case 0x8: // gpio id 1, type int8_t, coding signed varint + { + varint_t v; + int n = read_varint(a,e-a,&v); + if (n <= 0) + return -496; + a += n; + set_gpio(varint_sint(v)); + } + break; + case 0x12: // melodies id 2, type Melody, coding byte[] + { + varint_t v; + int n = read_varint(a,e-a,&v); + a += n; + if ((n <= 0) || ((a+v) > e)) + return -497; + m_melodies.emplace_back(); + if (v != 0) { + n = m_melodies.back().fromMemory((const uint8_t*)a,v); + if (n < 0) + return n; + if (n != (ssize_t)v) + return -498; + a += v; + } + } + break; + default: + // unknown field (option unknown=skip) + { + ssize_t s = skip_content(a,e-a,fid&7); + if (s <= 0) + return -499; + a += s; + break; + } + } + } + assert((a-(const uint8_t *)b) == s); + if (a > e) + return -500; + return a-(const uint8_t *)b; +} + +ssize_t BuzzerConfig::toMemory(uint8_t *b, ssize_t s) const +{ + assert(s >= 0); + uint8_t *a = b, *e = b + s; + signed n; + // has gpio? + if (m_gpio != -1) { + // 'gpio': id=1, encoding=varint, tag=0x8 + if (a >= e) + return -501; + *a++ = 0x8; + n = write_varint(a,e-a,sint_varint(m_gpio)); + if (n <= 0) + return -502; + a += n; + } + for (const auto &x : m_melodies) { + // 'melodies': id=2, encoding=lenpfx, tag=0x12 + if (a >= e) + return -503; + *a++ = 0x12; + ssize_t melodies_ws = x.calcSize(); + n = write_varint(a,e-a,melodies_ws); + a += n; + if ((n <= 0) || (melodies_ws > (e-a))) + return -504; + n = x.toMemory(a,e-a); + a += n; + assert(n == melodies_ws); + } + assert(a <= e); + return a-b; +} + +void BuzzerConfig::toWire(void (*put)(uint8_t)) const +{ + if (m_gpio != -1) { + // 'gpio': id=1, encoding=varint, tag=0x8 + put(0x8); // 'gpio': id=1 + send_varint(put,sint_varint(m_gpio)); + } + for (size_t x = 0, y = m_melodies.size(); x != y; ++x) { + // 'melodies': id=2, encoding=lenpfx, tag=0x12 + put(0x12); // 'melodies': id=2 + send_varint(put,m_melodies[x].calcSize()); + m_melodies[x].toWire(put); + } +} + +void BuzzerConfig::toString(std::string &put) const +{ + if (m_gpio != -1) { + // 'gpio': id=1, encoding=varint, tag=0x8 + put.push_back(0x8); // 'gpio': id=1 + send_varint(put,sint_varint(m_gpio)); + } + for (size_t x = 0, y = m_melodies.size(); x != y; ++x) { + // 'melodies': id=2, encoding=lenpfx, tag=0x12 + put.push_back(0x12); // 'melodies': id=2 + send_varint(put,m_melodies[x].calcSize()); + m_melodies[x].toString(put); + } +} + +void BuzzerConfig::toJSON(std::ostream &json, unsigned indLvl) const +{ + char fsep = '{'; + ++indLvl; + if (has_gpio()) { + fsep = json_indent(json,indLvl,fsep,"gpio"); + json << (int) m_gpio; + } + if (size_t s = m_melodies.size()) { + fsep = json_indent(json,indLvl,fsep); + indLvl += 2; + json << "\"melodies\":[\n"; + size_t i = 0; + for (;;) { + json_indent(json,indLvl,0); + m_melodies[i].toJSON(json,indLvl); + ++i; + if (i == s) + break; + json << ",\n"; + } + indLvl -= 2; + json.put('\n'); + json_indent(json,indLvl,0); + json.put(']'); + } + if (fsep == '{') + json.put('{'); + json.put('\n'); + --indLvl; + json_indent(json,indLvl,0); + json.put('}'); + if (indLvl == 0) + json.put('\n'); +} + +size_t BuzzerConfig::calcSize() const +{ + size_t r = 0; // required size, default is fixed length + // optional sint8 gpio, id 1 + if (m_gpio != -1) { + r += wiresize_s((varint_t)m_gpio) + 1 /* tag(gpio) 0x8 */; + } + // repeated Melody melodies, id 2 + // repeated message melodies + for (size_t x = 0, y = m_melodies.size(); x < y; ++x) { + size_t s = m_melodies[x].calcSize(); + r += wiresize(s); + r += s + 1 /* tag(melodies) 0x10 */; + } + return r; +} + +bool BuzzerConfig::operator != (const BuzzerConfig &r) const +{ + if (has_gpio() && (m_gpio != r.m_gpio)) + return true; + if (m_melodies != r.m_melodies) + return true; + return false; +} + + +bool BuzzerConfig::operator == (const BuzzerConfig &r) const +{ + return !((*this) != r); +} + + +/* + * Function for setting an element in dot notation with an ASCII value. + * It will call the specified parse_ascii function for parsing the value. + * + * @return number of bytes successfully parsed or negative value indicating + * an error. + */ +int BuzzerConfig::setByName(const char *name, const char *value) +{ + if (0 == strcmp(name,"gpio")) { + if (value == 0) { + clear_gpio(); + return 0; + } + int r = parse_ascii_s8(&m_gpio,value); + return r; + } + if (0 == memcmp(name,"melodies",8)) { + if ((name[8] == 0) && (value == 0)) { + clear_melodies(); + return 0; + } else if (name[8] == '[') { + char *idxe; + unsigned long x; + if ((name[9] == '+') && (name[10] == ']')) { + x = m_melodies.size(); + m_melodies.resize(x+1); + idxe = (char*)(name + 10); + if (value == 0) + return 0; + } else { + x = strtoul(name+9,&idxe,0); + if ((idxe[0] != ']') || (idxe == (name+9))) + return -505; + if (m_melodies.size() <= x) + return -506; + if ((idxe[1] == 0) && (value == 0)) { + m_melodies.erase(m_melodies.begin()+x); + return 0; + } + } + if (idxe[1] != '.') + return -507; + return m_melodies[x].setByName(idxe+2,value); + } + } + return -508; +} + +Message *BuzzerConfig::p_getMember(const char *s, unsigned n) +{ + // caller guarantee: s[n] == '.' + return 0; +} + +Message *BuzzerConfig::p_getMember(const char *s, unsigned n, unsigned x) +{ + // caller guarantee: s[n] == '[' + if ((n == 8) && (0 == memcmp("melodies",s,8))) { + if (x < m_melodies.size()) + return &m_melodies[x]; + } + return 0; +} + +void HardwareConfig::clear() +{ + m_magic = 0; + m_system.clear(); + m_uart.clear(); + m_adc.clear(); + #ifdef CONFIG_TOUCHPAD + m_touchpad.clear(); + #endif // CONFIG_TOUCHPAD + #ifdef CONFIG_TOUCHPAD + m_tp_channel.clear(); + #endif // CONFIG_TOUCHPAD + m_gpios.clear(); + #ifdef CONFIG_SPI + m_spibus.clear(); + #endif // CONFIG_SPI + #ifdef CONFIG_BUTTON + m_button.clear(); + #endif // CONFIG_BUTTON + #ifdef CONFIG_RELAY + m_relay.clear(); + #endif // CONFIG_RELAY + #ifdef CONFIG_LEDS + m_led.clear(); + #endif // CONFIG_LEDS + #ifdef CONFIG_BUZZER + m_buzzer.clear(); + #endif // CONFIG_BUZZER + #ifdef CONFIG_HLW8012 + m_hlw8012.clear(); + #endif // CONFIG_HLW8012 + #ifdef CONFIG_MAX7219 + m_max7219.clear(); + #endif // CONFIG_MAX7219 + #ifdef CONFIG_TLC5947 + m_tlc5947.clear(); + #endif // CONFIG_TLC5947 + #ifdef CONFIG_RGBLEDS + m_ws2812b.clear(); + #endif // CONFIG_RGBLEDS + #ifdef CONFIG_DHT + m_dht.clear(); + #endif // CONFIG_DHT + #ifdef CONFIG_I2C + m_i2c.clear(); + #endif // CONFIG_I2C + #ifdef CONFIG_HCSR04 + m_hcsr04.clear(); + #endif // CONFIG_HCSR04 + #ifdef CONFIG_ONEWIRE + m_onewire.clear(); + #endif // CONFIG_ONEWIRE + #ifdef CONFIG_SX1276 + m_sx1276.clear(); + #endif // CONFIG_SX1276 + #ifdef CONFIG_IOEXTENDERS + m_iocluster.clear(); + #endif // CONFIG_IOEXTENDERS + #ifdef CONFIG_DISPLAY + m_display.clear(); + #endif // CONFIG_DISPLAY + p_validbits = 0; +} + +void HardwareConfig::toASCII(std::ostream &o, size_t indent) const +{ + o << "HardwareConfig {"; + ++indent; + ascii_numeric(o, indent, "magic", m_magic); + ascii_indent(o,indent,"system"); + m_system.toASCII(o,indent); + ascii_indent(o,indent); + size_t s_uart = m_uart.size(); + o << "uart[" << s_uart << "] = {"; + ++indent; + for (size_t i = 0, e = s_uart; i != e; ++i) { + ascii_indent(o,indent); + o << i << ": "; + m_uart[i].toASCII(o,indent); + } + --indent; + ascii_indent(o,indent); + o << '}'; + ascii_indent(o,indent,"adc"); + m_adc.toASCII(o,indent); + #ifdef CONFIG_TOUCHPAD + ascii_indent(o,indent,"touchpad"); + m_touchpad.toASCII(o,indent); + #endif // CONFIG_TOUCHPAD + #ifdef CONFIG_TOUCHPAD + ascii_indent(o,indent); + size_t s_tp_channel = m_tp_channel.size(); + o << "tp_channel[" << s_tp_channel << "] = {"; + ++indent; + for (size_t i = 0, e = s_tp_channel; i != e; ++i) { + ascii_indent(o,indent); + o << i << ": "; + m_tp_channel[i].toASCII(o,indent); + } + --indent; + ascii_indent(o,indent); + o << '}'; + #endif // CONFIG_TOUCHPAD + ascii_indent(o,indent); + size_t s_gpios = m_gpios.size(); + o << "gpios[" << s_gpios << "] = {"; + ++indent; + for (size_t i = 0, e = s_gpios; i != e; ++i) { + ascii_indent(o,indent); + o << i << ": "; + m_gpios[i].toASCII(o,indent); + } + --indent; + ascii_indent(o,indent); + o << '}'; + #ifdef CONFIG_SPI + ascii_indent(o,indent); + size_t s_spibus = m_spibus.size(); + o << "spibus[" << s_spibus << "] = {"; ++indent; for (size_t i = 0, e = s_spibus; i != e; ++i) { ascii_indent(o,indent); @@ -9910,6 +11022,10 @@ void HardwareConfig::toASCII(std::ostream &o, size_t indent) const ascii_indent(o,indent); o << '}'; #endif // CONFIG_LEDS + #ifdef CONFIG_BUZZER + ascii_indent(o,indent,"buzzer"); + m_buzzer.toASCII(o,indent); + #endif // CONFIG_BUZZER #ifdef CONFIG_HLW8012 ascii_indent(o,indent,"hlw8012"); m_hlw8012.toASCII(o,indent); @@ -10007,12 +11123,12 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) varint_t fid; int fn = read_varint(a,e-a,&fid); if (fn <= 0) - return -463; + return -509; a += fn; switch (fid) { case 0x5: // magic id 0, type uint32_t, coding 32bit if ((a+3) >= e) - return -464; + return -510; set_magic((uint32_t) read_u32(a)); a += 4; break; @@ -10022,13 +11138,13 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -465; + return -511; if (v != 0) { n = m_system.fromMemory((const uint8_t*)a,v); if (n < 0) return n; if (n != (ssize_t)v) - return -466; + return -512; a += v; } } @@ -10040,14 +11156,14 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -467; + return -513; m_uart.emplace_back(); if (v != 0) { n = m_uart.back().fromMemory((const uint8_t*)a,v); if (n < 0) return n; if (n != (ssize_t)v) - return -468; + return -514; a += v; } } @@ -10058,13 +11174,13 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -469; + return -515; if (v != 0) { n = m_adc.fromMemory((const uint8_t*)a,v); if (n < 0) return n; if (n != (ssize_t)v) - return -470; + return -516; a += v; } } @@ -10077,13 +11193,13 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -471; + return -517; if (v != 0) { n = m_touchpad.fromMemory((const uint8_t*)a,v); if (n < 0) return n; if (n != (ssize_t)v) - return -472; + return -518; a += v; } } @@ -10097,14 +11213,14 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -473; + return -519; m_tp_channel.emplace_back(); if (v != 0) { n = m_tp_channel.back().fromMemory((const uint8_t*)a,v); if (n < 0) return n; if (n != (ssize_t)v) - return -474; + return -520; a += v; } } @@ -10116,14 +11232,14 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -475; + return -521; m_gpios.emplace_back(); if (v != 0) { n = m_gpios.back().fromMemory((const uint8_t*)a,v); if (n < 0) return n; if (n != (ssize_t)v) - return -476; + return -522; a += v; } } @@ -10135,14 +11251,14 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -477; + return -523; m_spibus.emplace_back(); if (v != 0) { n = m_spibus.back().fromMemory((const uint8_t*)a,v); if (n < 0) return n; if (n != (ssize_t)v) - return -478; + return -524; a += v; } } @@ -10155,14 +11271,14 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -479; + return -525; m_button.emplace_back(); if (v != 0) { n = m_button.back().fromMemory((const uint8_t*)a,v); if (n < 0) return n; if (n != (ssize_t)v) - return -480; + return -526; a += v; } } @@ -10175,14 +11291,14 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -481; + return -527; m_relay.emplace_back(); if (v != 0) { n = m_relay.back().fromMemory((const uint8_t*)a,v); if (n < 0) return n; if (n != (ssize_t)v) - return -482; + return -528; a += v; } } @@ -10195,19 +11311,39 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -483; + return -529; m_led.emplace_back(); if (v != 0) { n = m_led.back().fromMemory((const uint8_t*)a,v); if (n < 0) return n; if (n != (ssize_t)v) - return -484; + return -530; a += v; } } break; #endif // CONFIG_LEDS + #ifdef CONFIG_BUZZER + case 0x9a: // buzzer id 19, type BuzzerConfig, coding byte[] + { + varint_t v; + int n = read_varint(a,e-a,&v); + a += n; + if ((n <= 0) || ((a+v) > e)) + return -531; + if (v != 0) { + n = m_buzzer.fromMemory((const uint8_t*)a,v); + if (n < 0) + return n; + if (n != (ssize_t)v) + return -532; + a += v; + } + } + p_validbits |= ((uint16_t)1U << 4); + break; + #endif // CONFIG_BUZZER #ifdef CONFIG_HLW8012 case 0xa2: // hlw8012 id 20, type Hlw8012Config, coding byte[] { @@ -10215,17 +11351,17 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -485; + return -533; if (v != 0) { n = m_hlw8012.fromMemory((const uint8_t*)a,v); if (n < 0) return n; if (n != (ssize_t)v) - return -486; + return -534; a += v; } } - p_validbits |= ((uint16_t)1U << 4); + p_validbits |= ((uint16_t)1U << 5); break; #endif // CONFIG_HLW8012 #ifdef CONFIG_MAX7219 @@ -10235,17 +11371,17 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -487; + return -535; if (v != 0) { n = m_max7219.fromMemory((const uint8_t*)a,v); if (n < 0) return n; if (n != (ssize_t)v) - return -488; + return -536; a += v; } } - p_validbits |= ((uint16_t)1U << 5); + p_validbits |= ((uint16_t)1U << 6); break; #endif // CONFIG_MAX7219 #ifdef CONFIG_TLC5947 @@ -10255,17 +11391,17 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -489; + return -537; if (v != 0) { n = m_tlc5947.fromMemory((const uint8_t*)a,v); if (n < 0) return n; if (n != (ssize_t)v) - return -490; + return -538; a += v; } } - p_validbits |= ((uint16_t)1U << 6); + p_validbits |= ((uint16_t)1U << 7); break; #endif // CONFIG_TLC5947 #ifdef CONFIG_RGBLEDS @@ -10275,14 +11411,14 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -491; + return -539; m_ws2812b.emplace_back(); if (v != 0) { n = m_ws2812b.back().fromMemory((const uint8_t*)a,v); if (n < 0) return n; if (n != (ssize_t)v) - return -492; + return -540; a += v; } } @@ -10295,17 +11431,17 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -493; + return -541; if (v != 0) { n = m_dht.fromMemory((const uint8_t*)a,v); if (n < 0) return n; if (n != (ssize_t)v) - return -494; + return -542; a += v; } } - p_validbits |= ((uint16_t)1U << 7); + p_validbits |= ((uint16_t)1U << 8); break; #endif // CONFIG_DHT #ifdef CONFIG_I2C @@ -10315,14 +11451,14 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -495; + return -543; m_i2c.emplace_back(); if (v != 0) { n = m_i2c.back().fromMemory((const uint8_t*)a,v); if (n < 0) return n; if (n != (ssize_t)v) - return -496; + return -544; a += v; } } @@ -10335,14 +11471,14 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -497; + return -545; m_hcsr04.emplace_back(); if (v != 0) { n = m_hcsr04.back().fromMemory((const uint8_t*)a,v); if (n < 0) return n; if (n != (ssize_t)v) - return -498; + return -546; a += v; } } @@ -10355,17 +11491,17 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -499; + return -547; if (v != 0) { n = m_onewire.fromMemory((const uint8_t*)a,v); if (n < 0) return n; if (n != (ssize_t)v) - return -500; + return -548; a += v; } } - p_validbits |= ((uint16_t)1U << 8); + p_validbits |= ((uint16_t)1U << 9); break; #endif // CONFIG_ONEWIRE #ifdef CONFIG_SX1276 @@ -10375,17 +11511,17 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -501; + return -549; if (v != 0) { n = m_sx1276.fromMemory((const uint8_t*)a,v); if (n < 0) return n; if (n != (ssize_t)v) - return -502; + return -550; a += v; } } - p_validbits |= ((uint16_t)1U << 9); + p_validbits |= ((uint16_t)1U << 10); break; #endif // CONFIG_SX1276 #ifdef CONFIG_IOEXTENDERS @@ -10395,14 +11531,14 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -503; + return -551; m_iocluster.emplace_back(); if (v != 0) { n = m_iocluster.back().fromMemory((const uint8_t*)a,v); if (n < 0) return n; if (n != (ssize_t)v) - return -504; + return -552; a += v; } } @@ -10415,17 +11551,17 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) int n = read_varint(a,e-a,&v); a += n; if ((n <= 0) || ((a+v) > e)) - return -505; + return -553; if (v != 0) { n = m_display.fromMemory((const uint8_t*)a,v); if (n < 0) return n; if (n != (ssize_t)v) - return -506; + return -554; a += v; } } - p_validbits |= ((uint16_t)1U << 10); + p_validbits |= ((uint16_t)1U << 11); break; #endif // CONFIG_DISPLAY default: @@ -10433,7 +11569,7 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) { ssize_t s = skip_content(a,e-a,fid&7); if (s <= 0) - return -507; + return -555; a += s; break; } @@ -10441,7 +11577,7 @@ ssize_t HardwareConfig::fromMemory(const void *b, ssize_t s) } assert((a-(const uint8_t *)b) == s); if (a > e) - return -508; + return -556; return a-(const uint8_t *)b; } @@ -10454,10 +11590,10 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const if (0 != (p_validbits & ((uint16_t)1U << 0))) { // 'magic': id=0, encoding=32bit, tag=0x5 if (5 > (e-a)) - return -509; + return -557; *a++ = 0x5; if ((e-a) < 4) - return -510; + return -558; write_u32(a,(uint32_t)m_magic); a += 4; } @@ -10465,13 +11601,13 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const if (0 != (p_validbits & ((uint16_t)1U << 1))) { // 'system': id=1, encoding=lenpfx, tag=0xa if (a >= e) - return -511; + return -559; *a++ = 0xa; ssize_t system_ws = m_system.calcSize(); n = write_varint(a,e-a,system_ws); a += n; if ((n <= 0) || (system_ws > (e-a))) - return -512; + return -560; n = m_system.toMemory(a,e-a); a += n; assert(n == system_ws); @@ -10479,13 +11615,13 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const for (const auto &x : m_uart) { // 'uart': id=3, encoding=lenpfx, tag=0x1a if (a >= e) - return -513; + return -561; *a++ = 0x1a; ssize_t uart_ws = x.calcSize(); n = write_varint(a,e-a,uart_ws); a += n; if ((n <= 0) || (uart_ws > (e-a))) - return -514; + return -562; n = x.toMemory(a,e-a); a += n; assert(n == uart_ws); @@ -10494,13 +11630,13 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const if (0 != (p_validbits & ((uint16_t)1U << 2))) { // 'adc': id=4, encoding=lenpfx, tag=0x22 if (a >= e) - return -515; + return -563; *a++ = 0x22; ssize_t adc_ws = m_adc.calcSize(); n = write_varint(a,e-a,adc_ws); a += n; if ((n <= 0) || (adc_ws > (e-a))) - return -516; + return -564; n = m_adc.toMemory(a,e-a); a += n; assert(n == adc_ws); @@ -10510,13 +11646,13 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const if (0 != (p_validbits & ((uint16_t)1U << 3))) { // 'touchpad': id=5, encoding=lenpfx, tag=0x2a if (a >= e) - return -517; + return -565; *a++ = 0x2a; ssize_t touchpad_ws = m_touchpad.calcSize(); n = write_varint(a,e-a,touchpad_ws); a += n; if ((n <= 0) || (touchpad_ws > (e-a))) - return -518; + return -566; n = m_touchpad.toMemory(a,e-a); a += n; assert(n == touchpad_ws); @@ -10526,13 +11662,13 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const for (const auto &x : m_tp_channel) { // 'tp_channel': id=6, encoding=lenpfx, tag=0x32 if (a >= e) - return -519; + return -567; *a++ = 0x32; ssize_t tp_channel_ws = x.calcSize(); n = write_varint(a,e-a,tp_channel_ws); a += n; if ((n <= 0) || (tp_channel_ws > (e-a))) - return -520; + return -568; n = x.toMemory(a,e-a); a += n; assert(n == tp_channel_ws); @@ -10541,13 +11677,13 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const for (const auto &x : m_gpios) { // 'gpios': id=7, encoding=lenpfx, tag=0x3a if (a >= e) - return -521; + return -569; *a++ = 0x3a; ssize_t gpios_ws = x.calcSize(); n = write_varint(a,e-a,gpios_ws); a += n; if ((n <= 0) || (gpios_ws > (e-a))) - return -522; + return -570; n = x.toMemory(a,e-a); a += n; assert(n == gpios_ws); @@ -10556,13 +11692,13 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const for (const auto &x : m_spibus) { // 'spibus': id=8, encoding=lenpfx, tag=0x42 if (a >= e) - return -523; + return -571; *a++ = 0x42; ssize_t spibus_ws = x.calcSize(); n = write_varint(a,e-a,spibus_ws); a += n; if ((n <= 0) || (spibus_ws > (e-a))) - return -524; + return -572; n = x.toMemory(a,e-a); a += n; assert(n == spibus_ws); @@ -10572,14 +11708,14 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const for (const auto &x : m_button) { // 'button': id=16, encoding=lenpfx, tag=0x82 if (2 > (e-a)) - return -525; + return -573; *a++ = 0x82; *a++ = 0x1; ssize_t button_ws = x.calcSize(); n = write_varint(a,e-a,button_ws); a += n; if ((n <= 0) || (button_ws > (e-a))) - return -526; + return -574; n = x.toMemory(a,e-a); a += n; assert(n == button_ws); @@ -10589,14 +11725,14 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const for (const auto &x : m_relay) { // 'relay': id=17, encoding=lenpfx, tag=0x8a if (2 > (e-a)) - return -527; + return -575; *a++ = 0x8a; *a++ = 0x1; ssize_t relay_ws = x.calcSize(); n = write_varint(a,e-a,relay_ws); a += n; if ((n <= 0) || (relay_ws > (e-a))) - return -528; + return -576; n = x.toMemory(a,e-a); a += n; assert(n == relay_ws); @@ -10606,32 +11742,50 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const for (const auto &x : m_led) { // 'led': id=18, encoding=lenpfx, tag=0x92 if (2 > (e-a)) - return -529; + return -577; *a++ = 0x92; *a++ = 0x1; ssize_t led_ws = x.calcSize(); n = write_varint(a,e-a,led_ws); a += n; if ((n <= 0) || (led_ws > (e-a))) - return -530; + return -578; n = x.toMemory(a,e-a); a += n; assert(n == led_ws); } #endif // CONFIG_LEDS + #ifdef CONFIG_BUZZER + // has buzzer? + if (0 != (p_validbits & ((uint16_t)1U << 4))) { + // 'buzzer': id=19, encoding=lenpfx, tag=0x9a + if (2 > (e-a)) + return -579; + *a++ = 0x9a; + *a++ = 0x1; + ssize_t buzzer_ws = m_buzzer.calcSize(); + n = write_varint(a,e-a,buzzer_ws); + a += n; + if ((n <= 0) || (buzzer_ws > (e-a))) + return -580; + n = m_buzzer.toMemory(a,e-a); + a += n; + assert(n == buzzer_ws); + } + #endif // CONFIG_BUZZER #ifdef CONFIG_HLW8012 // has hlw8012? - if (0 != (p_validbits & ((uint16_t)1U << 4))) { + if (0 != (p_validbits & ((uint16_t)1U << 5))) { // 'hlw8012': id=20, encoding=lenpfx, tag=0xa2 if (2 > (e-a)) - return -531; + return -581; *a++ = 0xa2; *a++ = 0x1; ssize_t hlw8012_ws = m_hlw8012.calcSize(); n = write_varint(a,e-a,hlw8012_ws); a += n; if ((n <= 0) || (hlw8012_ws > (e-a))) - return -532; + return -582; n = m_hlw8012.toMemory(a,e-a); a += n; assert(n == hlw8012_ws); @@ -10639,17 +11793,17 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const #endif // CONFIG_HLW8012 #ifdef CONFIG_MAX7219 // has max7219? - if (0 != (p_validbits & ((uint16_t)1U << 5))) { + if (0 != (p_validbits & ((uint16_t)1U << 6))) { // 'max7219': id=32, encoding=lenpfx, tag=0x102 if (2 > (e-a)) - return -533; + return -583; *a++ = 0x82; *a++ = 0x2; ssize_t max7219_ws = m_max7219.calcSize(); n = write_varint(a,e-a,max7219_ws); a += n; if ((n <= 0) || (max7219_ws > (e-a))) - return -534; + return -584; n = m_max7219.toMemory(a,e-a); a += n; assert(n == max7219_ws); @@ -10657,17 +11811,17 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const #endif // CONFIG_MAX7219 #ifdef CONFIG_TLC5947 // has tlc5947? - if (0 != (p_validbits & ((uint16_t)1U << 6))) { + if (0 != (p_validbits & ((uint16_t)1U << 7))) { // 'tlc5947': id=33, encoding=lenpfx, tag=0x10a if (2 > (e-a)) - return -535; + return -585; *a++ = 0x8a; *a++ = 0x2; ssize_t tlc5947_ws = m_tlc5947.calcSize(); n = write_varint(a,e-a,tlc5947_ws); a += n; if ((n <= 0) || (tlc5947_ws > (e-a))) - return -536; + return -586; n = m_tlc5947.toMemory(a,e-a); a += n; assert(n == tlc5947_ws); @@ -10677,14 +11831,14 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const for (const auto &x : m_ws2812b) { // 'ws2812b': id=34, encoding=lenpfx, tag=0x112 if (2 > (e-a)) - return -537; + return -587; *a++ = 0x92; *a++ = 0x2; ssize_t ws2812b_ws = x.calcSize(); n = write_varint(a,e-a,ws2812b_ws); a += n; if ((n <= 0) || (ws2812b_ws > (e-a))) - return -538; + return -588; n = x.toMemory(a,e-a); a += n; assert(n == ws2812b_ws); @@ -10692,17 +11846,17 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const #endif // CONFIG_RGBLEDS #ifdef CONFIG_DHT // has dht? - if (0 != (p_validbits & ((uint16_t)1U << 7))) { + if (0 != (p_validbits & ((uint16_t)1U << 8))) { // 'dht': id=35, encoding=lenpfx, tag=0x11a if (2 > (e-a)) - return -539; + return -589; *a++ = 0x9a; *a++ = 0x2; ssize_t dht_ws = m_dht.calcSize(); n = write_varint(a,e-a,dht_ws); a += n; if ((n <= 0) || (dht_ws > (e-a))) - return -540; + return -590; n = m_dht.toMemory(a,e-a); a += n; assert(n == dht_ws); @@ -10712,14 +11866,14 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const for (const auto &x : m_i2c) { // 'i2c': id=36, encoding=lenpfx, tag=0x122 if (2 > (e-a)) - return -541; + return -591; *a++ = 0xa2; *a++ = 0x2; ssize_t i2c_ws = x.calcSize(); n = write_varint(a,e-a,i2c_ws); a += n; if ((n <= 0) || (i2c_ws > (e-a))) - return -542; + return -592; n = x.toMemory(a,e-a); a += n; assert(n == i2c_ws); @@ -10729,14 +11883,14 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const for (const auto &x : m_hcsr04) { // 'hcsr04': id=37, encoding=lenpfx, tag=0x12a if (2 > (e-a)) - return -543; + return -593; *a++ = 0xaa; *a++ = 0x2; ssize_t hcsr04_ws = x.calcSize(); n = write_varint(a,e-a,hcsr04_ws); a += n; if ((n <= 0) || (hcsr04_ws > (e-a))) - return -544; + return -594; n = x.toMemory(a,e-a); a += n; assert(n == hcsr04_ws); @@ -10744,17 +11898,17 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const #endif // CONFIG_HCSR04 #ifdef CONFIG_ONEWIRE // has onewire? - if (0 != (p_validbits & ((uint16_t)1U << 8))) { + if (0 != (p_validbits & ((uint16_t)1U << 9))) { // 'onewire': id=38, encoding=lenpfx, tag=0x132 if (2 > (e-a)) - return -545; + return -595; *a++ = 0xb2; *a++ = 0x2; ssize_t onewire_ws = m_onewire.calcSize(); n = write_varint(a,e-a,onewire_ws); a += n; if ((n <= 0) || (onewire_ws > (e-a))) - return -546; + return -596; n = m_onewire.toMemory(a,e-a); a += n; assert(n == onewire_ws); @@ -10762,17 +11916,17 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const #endif // CONFIG_ONEWIRE #ifdef CONFIG_SX1276 // has sx1276? - if (0 != (p_validbits & ((uint16_t)1U << 9))) { + if (0 != (p_validbits & ((uint16_t)1U << 10))) { // 'sx1276': id=39, encoding=lenpfx, tag=0x13a if (2 > (e-a)) - return -547; + return -597; *a++ = 0xba; *a++ = 0x2; ssize_t sx1276_ws = m_sx1276.calcSize(); n = write_varint(a,e-a,sx1276_ws); a += n; if ((n <= 0) || (sx1276_ws > (e-a))) - return -548; + return -598; n = m_sx1276.toMemory(a,e-a); a += n; assert(n == sx1276_ws); @@ -10782,14 +11936,14 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const for (const auto &x : m_iocluster) { // 'iocluster': id=40, encoding=lenpfx, tag=0x142 if (2 > (e-a)) - return -549; + return -599; *a++ = 0xc2; *a++ = 0x2; ssize_t iocluster_ws = x.calcSize(); n = write_varint(a,e-a,iocluster_ws); a += n; if ((n <= 0) || (iocluster_ws > (e-a))) - return -550; + return -600; n = x.toMemory(a,e-a); a += n; assert(n == iocluster_ws); @@ -10797,17 +11951,17 @@ ssize_t HardwareConfig::toMemory(uint8_t *b, ssize_t s) const #endif // CONFIG_IOEXTENDERS #ifdef CONFIG_DISPLAY // has display? - if (0 != (p_validbits & ((uint16_t)1U << 10))) { + if (0 != (p_validbits & ((uint16_t)1U << 11))) { // 'display': id=50, encoding=lenpfx, tag=0x192 if (2 > (e-a)) - return -551; + return -601; *a++ = 0x92; *a++ = 0x3; ssize_t display_ws = m_display.calcSize(); n = write_varint(a,e-a,display_ws); a += n; if ((n <= 0) || (display_ws > (e-a))) - return -552; + return -602; n = m_display.toMemory(a,e-a); a += n; assert(n == display_ws); @@ -10899,8 +12053,17 @@ void HardwareConfig::toWire(void (*put)(uint8_t)) const m_led[x].toWire(put); } #endif // CONFIG_LEDS - #ifdef CONFIG_HLW8012 + #ifdef CONFIG_BUZZER if (0 != (p_validbits & ((uint16_t)1U << 4))) { + // 'buzzer': id=19, encoding=lenpfx, tag=0x9a + put(0x9a); + put(0x1); + send_varint(put,m_buzzer.calcSize()); + m_buzzer.toWire(put); + } + #endif // CONFIG_BUZZER + #ifdef CONFIG_HLW8012 + if (0 != (p_validbits & ((uint16_t)1U << 5))) { // 'hlw8012': id=20, encoding=lenpfx, tag=0xa2 put(0xa2); put(0x1); @@ -10909,7 +12072,7 @@ void HardwareConfig::toWire(void (*put)(uint8_t)) const } #endif // CONFIG_HLW8012 #ifdef CONFIG_MAX7219 - if (0 != (p_validbits & ((uint16_t)1U << 5))) { + if (0 != (p_validbits & ((uint16_t)1U << 6))) { // 'max7219': id=32, encoding=lenpfx, tag=0x102 put(0x82); put(0x2); @@ -10918,7 +12081,7 @@ void HardwareConfig::toWire(void (*put)(uint8_t)) const } #endif // CONFIG_MAX7219 #ifdef CONFIG_TLC5947 - if (0 != (p_validbits & ((uint16_t)1U << 6))) { + if (0 != (p_validbits & ((uint16_t)1U << 7))) { // 'tlc5947': id=33, encoding=lenpfx, tag=0x10a put(0x8a); put(0x2); @@ -10936,7 +12099,7 @@ void HardwareConfig::toWire(void (*put)(uint8_t)) const } #endif // CONFIG_RGBLEDS #ifdef CONFIG_DHT - if (0 != (p_validbits & ((uint16_t)1U << 7))) { + if (0 != (p_validbits & ((uint16_t)1U << 8))) { // 'dht': id=35, encoding=lenpfx, tag=0x11a put(0x9a); put(0x2); @@ -10963,7 +12126,7 @@ void HardwareConfig::toWire(void (*put)(uint8_t)) const } #endif // CONFIG_HCSR04 #ifdef CONFIG_ONEWIRE - if (0 != (p_validbits & ((uint16_t)1U << 8))) { + if (0 != (p_validbits & ((uint16_t)1U << 9))) { // 'onewire': id=38, encoding=lenpfx, tag=0x132 put(0xb2); put(0x2); @@ -10972,7 +12135,7 @@ void HardwareConfig::toWire(void (*put)(uint8_t)) const } #endif // CONFIG_ONEWIRE #ifdef CONFIG_SX1276 - if (0 != (p_validbits & ((uint16_t)1U << 9))) { + if (0 != (p_validbits & ((uint16_t)1U << 10))) { // 'sx1276': id=39, encoding=lenpfx, tag=0x13a put(0xba); put(0x2); @@ -10990,7 +12153,7 @@ void HardwareConfig::toWire(void (*put)(uint8_t)) const } #endif // CONFIG_IOEXTENDERS #ifdef CONFIG_DISPLAY - if (0 != (p_validbits & ((uint16_t)1U << 10))) { + if (0 != (p_validbits & ((uint16_t)1U << 11))) { // 'display': id=50, encoding=lenpfx, tag=0x192 put(0x92); put(0x3); @@ -11082,8 +12245,17 @@ void HardwareConfig::toString(std::string &put) const m_led[x].toString(put); } #endif // CONFIG_LEDS - #ifdef CONFIG_HLW8012 + #ifdef CONFIG_BUZZER if (0 != (p_validbits & ((uint16_t)1U << 4))) { + // 'buzzer': id=19, encoding=lenpfx, tag=0x9a + put.push_back(0x9a); + put.push_back(0x1); + send_varint(put,m_buzzer.calcSize()); + m_buzzer.toString(put); + } + #endif // CONFIG_BUZZER + #ifdef CONFIG_HLW8012 + if (0 != (p_validbits & ((uint16_t)1U << 5))) { // 'hlw8012': id=20, encoding=lenpfx, tag=0xa2 put.push_back(0xa2); put.push_back(0x1); @@ -11092,7 +12264,7 @@ void HardwareConfig::toString(std::string &put) const } #endif // CONFIG_HLW8012 #ifdef CONFIG_MAX7219 - if (0 != (p_validbits & ((uint16_t)1U << 5))) { + if (0 != (p_validbits & ((uint16_t)1U << 6))) { // 'max7219': id=32, encoding=lenpfx, tag=0x102 put.push_back(0x82); put.push_back(0x2); @@ -11101,7 +12273,7 @@ void HardwareConfig::toString(std::string &put) const } #endif // CONFIG_MAX7219 #ifdef CONFIG_TLC5947 - if (0 != (p_validbits & ((uint16_t)1U << 6))) { + if (0 != (p_validbits & ((uint16_t)1U << 7))) { // 'tlc5947': id=33, encoding=lenpfx, tag=0x10a put.push_back(0x8a); put.push_back(0x2); @@ -11119,7 +12291,7 @@ void HardwareConfig::toString(std::string &put) const } #endif // CONFIG_RGBLEDS #ifdef CONFIG_DHT - if (0 != (p_validbits & ((uint16_t)1U << 7))) { + if (0 != (p_validbits & ((uint16_t)1U << 8))) { // 'dht': id=35, encoding=lenpfx, tag=0x11a put.push_back(0x9a); put.push_back(0x2); @@ -11146,7 +12318,7 @@ void HardwareConfig::toString(std::string &put) const } #endif // CONFIG_HCSR04 #ifdef CONFIG_ONEWIRE - if (0 != (p_validbits & ((uint16_t)1U << 8))) { + if (0 != (p_validbits & ((uint16_t)1U << 9))) { // 'onewire': id=38, encoding=lenpfx, tag=0x132 put.push_back(0xb2); put.push_back(0x2); @@ -11155,7 +12327,7 @@ void HardwareConfig::toString(std::string &put) const } #endif // CONFIG_ONEWIRE #ifdef CONFIG_SX1276 - if (0 != (p_validbits & ((uint16_t)1U << 9))) { + if (0 != (p_validbits & ((uint16_t)1U << 10))) { // 'sx1276': id=39, encoding=lenpfx, tag=0x13a put.push_back(0xba); put.push_back(0x2); @@ -11173,7 +12345,7 @@ void HardwareConfig::toString(std::string &put) const } #endif // CONFIG_IOEXTENDERS #ifdef CONFIG_DISPLAY - if (0 != (p_validbits & ((uint16_t)1U << 10))) { + if (0 != (p_validbits & ((uint16_t)1U << 11))) { // 'display': id=50, encoding=lenpfx, tag=0x192 put.push_back(0x92); put.push_back(0x3); @@ -11341,6 +12513,12 @@ void HardwareConfig::toJSON(std::ostream &json, unsigned indLvl) const json.put(']'); } #endif // CONFIG_LEDS + #ifdef CONFIG_BUZZER + if (has_buzzer()) { + fsep = json_indent(json,indLvl,fsep,"buzzer"); + m_buzzer.toJSON(json,indLvl); + } + #endif // CONFIG_BUZZER #ifdef CONFIG_HLW8012 if (has_hlw8012()) { fsep = json_indent(json,indLvl,fsep,"hlw8012"); @@ -11556,23 +12734,30 @@ size_t HardwareConfig::calcSize() const r += s + 2 /* tag(led) 0x90 */; } #endif // CONFIG_LEDS + #ifdef CONFIG_BUZZER + // optional BuzzerConfig buzzer, id 19 + if (0 != (p_validbits & ((uint16_t)1U << 4))) { + size_t buzzer_s = m_buzzer.calcSize(); + r += buzzer_s + wiresize(buzzer_s) + 2 /* tag(buzzer) 0x98 */; + } + #endif // CONFIG_BUZZER #ifdef CONFIG_HLW8012 // optional Hlw8012Config hlw8012, id 20 - if (0 != (p_validbits & ((uint16_t)1U << 4))) { + if (0 != (p_validbits & ((uint16_t)1U << 5))) { size_t hlw8012_s = m_hlw8012.calcSize(); r += hlw8012_s + wiresize(hlw8012_s) + 2 /* tag(hlw8012) 0xa0 */; } #endif // CONFIG_HLW8012 #ifdef CONFIG_MAX7219 // optional Max7219Config max7219, id 32 - if (0 != (p_validbits & ((uint16_t)1U << 5))) { + if (0 != (p_validbits & ((uint16_t)1U << 6))) { size_t max7219_s = m_max7219.calcSize(); r += max7219_s + wiresize(max7219_s) + 2 /* tag(max7219) 0x100 */; } #endif // CONFIG_MAX7219 #ifdef CONFIG_TLC5947 // optional Tlc5947Config tlc5947, id 33 - if (0 != (p_validbits & ((uint16_t)1U << 6))) { + if (0 != (p_validbits & ((uint16_t)1U << 7))) { size_t tlc5947_s = m_tlc5947.calcSize(); r += tlc5947_s + wiresize(tlc5947_s) + 2 /* tag(tlc5947) 0x108 */; } @@ -11588,7 +12773,7 @@ size_t HardwareConfig::calcSize() const #endif // CONFIG_RGBLEDS #ifdef CONFIG_DHT // optional DhtConfig dht, id 35 - if (0 != (p_validbits & ((uint16_t)1U << 7))) { + if (0 != (p_validbits & ((uint16_t)1U << 8))) { size_t dht_s = m_dht.calcSize(); r += dht_s + wiresize(dht_s) + 2 /* tag(dht) 0x118 */; } @@ -11613,14 +12798,14 @@ size_t HardwareConfig::calcSize() const #endif // CONFIG_HCSR04 #ifdef CONFIG_ONEWIRE // optional OneWireConfig onewire, id 38 - if (0 != (p_validbits & ((uint16_t)1U << 8))) { + if (0 != (p_validbits & ((uint16_t)1U << 9))) { size_t onewire_s = m_onewire.calcSize(); r += onewire_s + wiresize(onewire_s) + 2 /* tag(onewire) 0x130 */; } #endif // CONFIG_ONEWIRE #ifdef CONFIG_SX1276 // optional SX1276Config sx1276, id 39 - if (0 != (p_validbits & ((uint16_t)1U << 9))) { + if (0 != (p_validbits & ((uint16_t)1U << 10))) { size_t sx1276_s = m_sx1276.calcSize(); r += sx1276_s + wiresize(sx1276_s) + 2 /* tag(sx1276) 0x138 */; } @@ -11636,7 +12821,7 @@ size_t HardwareConfig::calcSize() const #endif // CONFIG_IOEXTENDERS #ifdef CONFIG_DISPLAY // optional DisplayConfig display, id 50 - if (0 != (p_validbits & ((uint16_t)1U << 10))) { + if (0 != (p_validbits & ((uint16_t)1U << 11))) { size_t display_s = m_display.calcSize(); r += display_s + wiresize(display_s) + 2 /* tag(display) 0x190 */; } @@ -11682,6 +12867,10 @@ bool HardwareConfig::operator != (const HardwareConfig &r) const if (m_led != r.m_led) return true; #endif // CONFIG_LEDS + #ifdef CONFIG_BUZZER + if (has_buzzer() && (m_buzzer != r.m_buzzer)) + return true; + #endif // CONFIG_BUZZER #ifdef CONFIG_HLW8012 if (has_hlw8012() && (m_hlw8012 != r.m_hlw8012)) return true; @@ -11780,16 +12969,16 @@ int HardwareConfig::setByName(const char *name, const char *value) } else { x = strtoul(name+5,&idxe,0); if ((idxe[0] != ']') || (idxe == (name+5))) - return -553; + return -603; if (m_uart.size() <= x) - return -554; + return -604; if ((idxe[1] == 0) && (value == 0)) { m_uart.erase(m_uart.begin()+x); return 0; } } if (idxe[1] != '.') - return -555; + return -605; return m_uart[x].setByName(idxe+2,value); } } @@ -11830,16 +13019,16 @@ int HardwareConfig::setByName(const char *name, const char *value) } else { x = strtoul(name+11,&idxe,0); if ((idxe[0] != ']') || (idxe == (name+11))) - return -556; + return -606; if (m_tp_channel.size() <= x) - return -557; + return -607; if ((idxe[1] == 0) && (value == 0)) { m_tp_channel.erase(m_tp_channel.begin()+x); return 0; } } if (idxe[1] != '.') - return -558; + return -608; return m_tp_channel[x].setByName(idxe+2,value); } } @@ -11860,16 +13049,16 @@ int HardwareConfig::setByName(const char *name, const char *value) } else { x = strtoul(name+6,&idxe,0); if ((idxe[0] != ']') || (idxe == (name+6))) - return -559; + return -609; if (m_gpios.size() <= x) - return -560; + return -610; if ((idxe[1] == 0) && (value == 0)) { m_gpios.erase(m_gpios.begin()+x); return 0; } } if (idxe[1] != '.') - return -561; + return -611; return m_gpios[x].setByName(idxe+2,value); } } @@ -11890,16 +13079,16 @@ int HardwareConfig::setByName(const char *name, const char *value) } else { x = strtoul(name+7,&idxe,0); if ((idxe[0] != ']') || (idxe == (name+7))) - return -562; + return -612; if (m_spibus.size() <= x) - return -563; + return -613; if ((idxe[1] == 0) && (value == 0)) { m_spibus.erase(m_spibus.begin()+x); return 0; } } if (idxe[1] != '.') - return -564; + return -614; return m_spibus[x].setByName(idxe+2,value); } } @@ -11921,16 +13110,16 @@ int HardwareConfig::setByName(const char *name, const char *value) } else { x = strtoul(name+7,&idxe,0); if ((idxe[0] != ']') || (idxe == (name+7))) - return -565; + return -615; if (m_button.size() <= x) - return -566; + return -616; if ((idxe[1] == 0) && (value == 0)) { m_button.erase(m_button.begin()+x); return 0; } } if (idxe[1] != '.') - return -567; + return -617; return m_button[x].setByName(idxe+2,value); } } @@ -11952,16 +13141,16 @@ int HardwareConfig::setByName(const char *name, const char *value) } else { x = strtoul(name+6,&idxe,0); if ((idxe[0] != ']') || (idxe == (name+6))) - return -568; + return -618; if (m_relay.size() <= x) - return -569; + return -619; if ((idxe[1] == 0) && (value == 0)) { m_relay.erase(m_relay.begin()+x); return 0; } } if (idxe[1] != '.') - return -570; + return -620; return m_relay[x].setByName(idxe+2,value); } } @@ -11983,27 +13172,38 @@ int HardwareConfig::setByName(const char *name, const char *value) } else { x = strtoul(name+4,&idxe,0); if ((idxe[0] != ']') || (idxe == (name+4))) - return -571; + return -621; if (m_led.size() <= x) - return -572; + return -622; if ((idxe[1] == 0) && (value == 0)) { m_led.erase(m_led.begin()+x); return 0; } } if (idxe[1] != '.') - return -573; + return -623; return m_led[x].setByName(idxe+2,value); } } #endif // CONFIG_LEDS + #ifdef CONFIG_BUZZER + if (0 == memcmp(name,"buzzer",6)) { + if ((name[6] == 0) && (value == 0)) { + clear_buzzer(); + return 0; + } else if (name[6] == '.') { + p_validbits |= ((uint16_t)1U << 4); + return m_buzzer.setByName(name+7,value); + } + } + #endif // CONFIG_BUZZER #ifdef CONFIG_HLW8012 if (0 == memcmp(name,"hlw8012",7)) { if ((name[7] == 0) && (value == 0)) { clear_hlw8012(); return 0; } else if (name[7] == '.') { - p_validbits |= ((uint16_t)1U << 4); + p_validbits |= ((uint16_t)1U << 5); return m_hlw8012.setByName(name+8,value); } } @@ -12014,7 +13214,7 @@ int HardwareConfig::setByName(const char *name, const char *value) clear_max7219(); return 0; } else if (name[7] == '.') { - p_validbits |= ((uint16_t)1U << 5); + p_validbits |= ((uint16_t)1U << 6); return m_max7219.setByName(name+8,value); } } @@ -12025,7 +13225,7 @@ int HardwareConfig::setByName(const char *name, const char *value) clear_tlc5947(); return 0; } else if (name[7] == '.') { - p_validbits |= ((uint16_t)1U << 6); + p_validbits |= ((uint16_t)1U << 7); return m_tlc5947.setByName(name+8,value); } } @@ -12047,16 +13247,16 @@ int HardwareConfig::setByName(const char *name, const char *value) } else { x = strtoul(name+8,&idxe,0); if ((idxe[0] != ']') || (idxe == (name+8))) - return -574; + return -624; if (m_ws2812b.size() <= x) - return -575; + return -625; if ((idxe[1] == 0) && (value == 0)) { m_ws2812b.erase(m_ws2812b.begin()+x); return 0; } } if (idxe[1] != '.') - return -576; + return -626; return m_ws2812b[x].setByName(idxe+2,value); } } @@ -12067,7 +13267,7 @@ int HardwareConfig::setByName(const char *name, const char *value) clear_dht(); return 0; } else if (name[3] == '.') { - p_validbits |= ((uint16_t)1U << 7); + p_validbits |= ((uint16_t)1U << 8); return m_dht.setByName(name+4,value); } } @@ -12089,16 +13289,16 @@ int HardwareConfig::setByName(const char *name, const char *value) } else { x = strtoul(name+4,&idxe,0); if ((idxe[0] != ']') || (idxe == (name+4))) - return -577; + return -627; if (m_i2c.size() <= x) - return -578; + return -628; if ((idxe[1] == 0) && (value == 0)) { m_i2c.erase(m_i2c.begin()+x); return 0; } } if (idxe[1] != '.') - return -579; + return -629; return m_i2c[x].setByName(idxe+2,value); } } @@ -12120,16 +13320,16 @@ int HardwareConfig::setByName(const char *name, const char *value) } else { x = strtoul(name+7,&idxe,0); if ((idxe[0] != ']') || (idxe == (name+7))) - return -580; + return -630; if (m_hcsr04.size() <= x) - return -581; + return -631; if ((idxe[1] == 0) && (value == 0)) { m_hcsr04.erase(m_hcsr04.begin()+x); return 0; } } if (idxe[1] != '.') - return -582; + return -632; return m_hcsr04[x].setByName(idxe+2,value); } } @@ -12140,7 +13340,7 @@ int HardwareConfig::setByName(const char *name, const char *value) clear_onewire(); return 0; } else if (name[7] == '.') { - p_validbits |= ((uint16_t)1U << 8); + p_validbits |= ((uint16_t)1U << 9); return m_onewire.setByName(name+8,value); } } @@ -12151,7 +13351,7 @@ int HardwareConfig::setByName(const char *name, const char *value) clear_sx1276(); return 0; } else if (name[6] == '.') { - p_validbits |= ((uint16_t)1U << 9); + p_validbits |= ((uint16_t)1U << 10); return m_sx1276.setByName(name+7,value); } } @@ -12173,16 +13373,16 @@ int HardwareConfig::setByName(const char *name, const char *value) } else { x = strtoul(name+10,&idxe,0); if ((idxe[0] != ']') || (idxe == (name+10))) - return -583; + return -633; if (m_iocluster.size() <= x) - return -584; + return -634; if ((idxe[1] == 0) && (value == 0)) { m_iocluster.erase(m_iocluster.begin()+x); return 0; } } if (idxe[1] != '.') - return -585; + return -635; return m_iocluster[x].setByName(idxe+2,value); } } @@ -12193,12 +13393,12 @@ int HardwareConfig::setByName(const char *name, const char *value) clear_display(); return 0; } else if (name[7] == '.') { - p_validbits |= ((uint16_t)1U << 10); + p_validbits |= ((uint16_t)1U << 11); return m_display.setByName(name+8,value); } } #endif // CONFIG_DISPLAY - return -586; + return -636; } Message *HardwareConfig::p_getMember(const char *s, unsigned n) @@ -12212,6 +13412,10 @@ Message *HardwareConfig::p_getMember(const char *s, unsigned n) if ((n == 8) && (0 == memcmp("touchpad",s,8))) return &m_touchpad; #endif // CONFIG_TOUCHPAD + #ifdef CONFIG_BUZZER + if ((n == 6) && (0 == memcmp("buzzer",s,6))) + return &m_buzzer; + #endif // CONFIG_BUZZER #ifdef CONFIG_HLW8012 if ((n == 7) && (0 == memcmp("hlw8012",s,7))) return &m_hlw8012; diff --git a/components/wfc/hwcfg_pc.h b/components/wfc/hwcfg_pc.h index df61448..4469836 100644 --- a/components/wfc/hwcfg_pc.h +++ b/components/wfc/hwcfg_pc.h @@ -1,8 +1,8 @@ /**************************************************************************** * * Code generated by Wire-Format-Compiler (WFC) - * WFC Version: P2304 (hg:456/095c4982cbea) - * WFC is Copyright 2015-2022, Thomas Maier-Komor + * WFC Version: P2304.3 (hg:459/5fefa02bc543) + * WFC is Copyright 2015-2023, Thomas Maier-Komor * * Source Information: * =================== @@ -10,7 +10,7 @@ * Copyright: 2018-2023 * Author : Thomas Maier-Komor * - * Code generated on 2023-10-24, 21:26:42 (CET). + * Code generated on 2023-11-26, 14:29:43 (CET). * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -519,6 +519,46 @@ class SystemConfig : public Message bool *mutable_usb_con(); #endif // CONFIG_USB_CONSOLE + #ifdef CONFIG_ESP_PHY_ENABLE_USB + // optional sint8 cc1_gpio, id 11 + /*! + * Function for querying if cc1_gpio has been set. + * @return true if cc1_gpio is set. + */ + bool has_cc1_gpio() const; + //! Function to reset cc1_gpio to its default/unset value. + void clear_cc1_gpio(); + //! Get value of cc1_gpio. + int8_t cc1_gpio() const; + //! Set cc1_gpio using a constant reference + void set_cc1_gpio(int8_t v); + /*! + * Provide mutable access to cc1_gpio. + * @return pointer to member variable of cc1_gpio. + */ + int8_t *mutable_cc1_gpio(); + #endif // CONFIG_ESP_PHY_ENABLE_USB + + #ifdef CONFIG_ESP_PHY_ENABLE_USB + // optional sint8 cc2_gpio, id 12 + /*! + * Function for querying if cc2_gpio has been set. + * @return true if cc2_gpio is set. + */ + bool has_cc2_gpio() const; + //! Function to reset cc2_gpio to its default/unset value. + void clear_cc2_gpio(); + //! Get value of cc2_gpio. + int8_t cc2_gpio() const; + //! Set cc2_gpio using a constant reference + void set_cc2_gpio(int8_t v); + /*! + * Provide mutable access to cc2_gpio. + * @return pointer to member variable of cc2_gpio. + */ + int8_t *mutable_cc2_gpio(); + #endif // CONFIG_ESP_PHY_ENABLE_USB + protected: Message *p_getMember(const char *s, unsigned n); @@ -547,6 +587,14 @@ class SystemConfig : public Message //! bool usb_con, id 10 bool m_usb_con = true; #endif // CONFIG_USB_CONSOLE + #ifdef CONFIG_ESP_PHY_ENABLE_USB + //! sint8 cc1_gpio, id 11 + int8_t m_cc1_gpio = -1; + #endif // CONFIG_ESP_PHY_ENABLE_USB + #ifdef CONFIG_ESP_PHY_ENABLE_USB + //! sint8 cc2_gpio, id 12 + int8_t m_cc2_gpio = -1; + #endif // CONFIG_ESP_PHY_ENABLE_USB private: uint8_t p_validbits = 0; @@ -2536,6 +2584,10 @@ class LedConfig : public Message bool config_open_drain() const; //! Function to set the open_drain part of bitset config. void set_config_open_drain(bool); + //! Function to get the init_high part of bitset config. + bool config_init_high() const; + //! Function to set the init_high part of bitset config. + void set_config_init_high(bool); //! Set config using a constant reference void set_config(ledcfg_t v); /*! @@ -3621,10 +3673,6 @@ class GpioConfig : public Message bool config_pulldown() const; //! Function to set the pulldown part of bitset config. void set_config_pulldown(bool); - //! Function to get the cap_freq_r2r part of bitset config. - bool config_cap_freq_r2r() const; - //! Function to set the cap_freq_r2r part of bitset config. - void set_config_cap_freq_r2r(bool); //! Set config using a constant reference void set_config(gpiocfg_t v); /*! @@ -3983,6 +4031,24 @@ class SpiDeviceConfig : public Message */ int8_t *mutable_cd(); + // optional unsigned freq, id 6 + /*! + * Function for querying if freq has been set. + * @return true if freq is set. + */ + bool has_freq() const; + //! Function to reset freq to its default/unset value. + void clear_freq(); + //! Get value of freq. + uint64_t freq() const; + //! Set freq using a constant reference + void set_freq(uint64_t v); + /*! + * Provide mutable access to freq. + * @return pointer to member variable of freq. + */ + uint64_t *mutable_freq(); + protected: Message *p_getMember(const char *s, unsigned n); @@ -3997,6 +4063,8 @@ class SpiDeviceConfig : public Message int8_t m_reset = -1; //! sint8 cd, id 5 int8_t m_cd = -1; + //! unsigned freq, id 6 + uint64_t m_freq = 0; }; @@ -4843,15 +4911,15 @@ class SX1276Config : public Message -class HardwareConfig : public Message +class Tone : public Message { public: - HardwareConfig() + Tone() { } - bool operator != (const HardwareConfig &r) const; - bool operator == (const HardwareConfig &r) const; + bool operator != (const Tone &r) const; + bool operator == (const Tone &r) const; //! Function for resetting all members to their default values. void clear(); @@ -4918,173 +4986,568 @@ class HardwareConfig : public Message //! @return number of bytes parsed from value or negative value if an error occurs int setByName(const char *param, const char *value); - // optional fixed32 magic, id 0 + // optional unsigned freq, id 1 /*! - * Function for querying if magic has been set. - * @return true if magic is set. + * Function for querying if freq has been set. + * @return true if freq is set. */ - bool has_magic() const; - //! Function to reset magic to its default/unset value. - void clear_magic(); - //! Get value of magic. - uint32_t magic() const; - //! Set magic using a constant reference - void set_magic(uint32_t v); + bool has_freq() const; + //! Function to reset freq to its default/unset value. + void clear_freq(); + //! Get value of freq. + uint64_t freq() const; + //! Set freq using a constant reference + void set_freq(uint64_t v); /*! - * Provide mutable access to magic. - * @return pointer to member variable of magic. + * Provide mutable access to freq. + * @return pointer to member variable of freq. */ - uint32_t *mutable_magic(); + uint64_t *mutable_freq(); - // optional SystemConfig system, id 1 + // optional unsigned duration, id 2 /*! - * Function for querying if system has been set. - * @return true if system is set. + * Function for querying if duration has been set. + * @return true if duration is set. */ - bool has_system() const; - //! Function to reset system to its default/unset value. - void clear_system(); - //! Get value of system. - const SystemConfig &system() const; + bool has_duration() const; + //! Function to reset duration to its default/unset value. + void clear_duration(); + //! Get value of duration. + uint64_t duration() const; + //! Set duration using a constant reference + void set_duration(uint64_t v); /*! - * Function for setting members of system using data from a serialized object. - * @param data pointer to binary data - * @param s number of bytes at data pointer + * Provide mutable access to duration. + * @return pointer to member variable of duration. */ - void set_system(const void *data, size_t s); - //! Set system using a constant reference - void set_system(const SystemConfig &v); + uint64_t *mutable_duration(); + + + protected: + Message *p_getMember(const char *s, unsigned n); + Message *p_getMember(const char *s, unsigned n, unsigned i); + //! unsigned freq, id 1 + uint64_t m_freq = 0; + //! unsigned duration, id 2 + uint64_t m_duration = 0; + + private: + uint8_t p_validbits = 0; +}; + + + + +class Melody : public Message +{ + public: + Melody() + { + } + + bool operator != (const Melody &r) const; + bool operator == (const Melody &r) const; + + //! Function for resetting all members to their default values. + void clear(); + /*! - * Provide mutable access to system. - * @return pointer to member variable of system. + * Calculates the required number of bytes for serializing this object. + * If member variables of the object are modified, the number of bytes + * needed for serialization may change, too. + * @return bytes needed for a serialized object representation */ - SystemConfig *mutable_system(); + size_t calcSize() const; - // repeated UartConfig uart, id 3 - //! Function get const-access to the elements of uart. - const std::vector &uart() const; - //! Function to get the number of elements in uart. - size_t uart_size() const; /*! - * Function to append a element to uart. - * @return point to newly added element. + * Function for parsing serialized data and update this object accordingly. + * Member variables that are not in the serialized data are not reset. + * @param b buffer of serialized data + * @param s number of bytes available in the buffer + * @return number of bytes successfully parsed (can be < s) + * or a negative value indicating the error encountered */ - UartConfig* add_uart(); - //! Function to reset uart to its default/unset value. - void clear_uart(); - //! Get value of element x of uart. - const UartConfig &uart(unsigned x) const; - //! Set uart using a constant reference - void set_uart(unsigned x, const UartConfig &v); + ssize_t fromMemory(const void *b, ssize_t s); + /*! - * Provide mutable access to uart. - * @return pointer to member variable of uart. + * Function for serializing the object to memory. + * @param b buffer to serialize the object to + * @param s number of bytes available in the buffer + * @return number of bytes successfully serialized */ - UartConfig *mutable_uart(unsigned x); - //! Function to get mutable access to all elements of uart. - std::vector *mutable_uart(); + ssize_t toMemory(uint8_t *, ssize_t) const; - // optional AdcConfig adc, id 4 /*! - * Function for querying if adc has been set. - * @return true if adc is set. + * Serialize the object using a function for transmitting individual bytes. + * @param put function to put individual bytes for transmission on the wire */ - bool has_adc() const; - //! Function to reset adc to its default/unset value. - void clear_adc(); - //! Get value of adc. - const AdcConfig &adc() const; + void toWire(void (*put)(uint8_t)) const; + + //! Function for serializing the object to a string. + void toString(std::string &put) const; + /*! - * Function for setting adc using binary data. - * @param data pointer to binary data - * @param s number of bytes at data pointer + * Function for writing a JSON representation of this object to a stream. + * @param json stream object the JSON output shall be written to + * @indLvl current indention level */ - void set_adc(const void *data, size_t s); - //! Set adc using a constant reference - void set_adc(const AdcConfig &v); + void toJSON(std::ostream &json, unsigned indLvl = 0) const; + /*! - * Provide mutable access to adc. - * @return pointer to member variable of adc. + * Function for writing an ASCII representation of this object to a stream. + * @param o output stream + * @param indent initial indention level */ - AdcConfig *mutable_adc(); + void toASCII(std::ostream &o, size_t indent = 0) const; - #ifdef CONFIG_TOUCHPAD - // optional TouchpadConfig touchpad, id 5 /*! - * Function for querying if touchpad has been set. - * @return true if touchpad is set. + * Function for determining the maximum size that the object may need for + * its serialized representation + * @return maximum number of bytes or SIZE_MAX if no limit can be determined */ - bool has_touchpad() const; - //! Function to reset touchpad to its default/unset value. - void clear_touchpad(); - //! Get value of touchpad. - const TouchpadConfig &touchpad() const; + static size_t getMaxSize(); + + //! Function for setting a parameter by its ASCII name using an ASCII representation of value. + //! @param param parameter name + //! @param value ASCII representation of the value + //! @return number of bytes parsed from value or negative value if an error occurs + int setByName(const char *param, const char *value); + + // optional string name, id 1 /*! - * Function for setting touchpad using binary data. + * Function for querying if name has been set. + * @return true if name is set. + */ + bool has_name() const; + //! Function to reset name to its default/unset value. + void clear_name(); + //! Get value of name. + const std::string &name() const; + /*! + * Function for setting name using binary data. * @param data pointer to binary data * @param s number of bytes at data pointer */ - void set_touchpad(const void *data, size_t s); - //! Set touchpad using a constant reference - void set_touchpad(const TouchpadConfig &v); + void set_name(const void *data, size_t s); + //! Set name using a constant reference + void set_name(const std::string &v); + //! Set name using a pointer to a null-terminated C-string. + void set_name(const char *); /*! - * Provide mutable access to touchpad. - * @return pointer to member variable of touchpad. + * Provide mutable access to name. + * @return pointer to member variable of name. */ - TouchpadConfig *mutable_touchpad(); - #endif // CONFIG_TOUCHPAD + std::string *mutable_name(); - #ifdef CONFIG_TOUCHPAD - // repeated TouchChannelConfig tp_channel, id 6 - //! Function get const-access to the elements of tp_channel. - const std::vector &tp_channel() const; - //! Function to get the number of elements in tp_channel. - size_t tp_channel_size() const; + // repeated fixed16 tones, id 2 + //! Function get const-access to the elements of tones. + const std::vector &tones() const; + //! Function to get the number of elements in tones. + size_t tones_size() const; /*! - * Function to append a element to tp_channel. + * Function to append a element to tones. * @return point to newly added element. */ - TouchChannelConfig* add_tp_channel(); - //! Function to reset tp_channel to its default/unset value. - void clear_tp_channel(); - //! Get value of element x of tp_channel. - const TouchChannelConfig &tp_channel(unsigned x) const; - //! Set tp_channel using a constant reference - void set_tp_channel(unsigned x, const TouchChannelConfig &v); + void add_tones(uint16_t v); + //! Function to reset tones to its default/unset value. + void clear_tones(); + //! Get value of element x of tones. + uint16_t tones(unsigned x) const; + //! Set tones using a constant reference + void set_tones(unsigned x, uint16_t v); /*! - * Provide mutable access to tp_channel. - * @return pointer to member variable of tp_channel. + * Provide mutable access to tones. + * @return pointer to member variable of tones. */ - TouchChannelConfig *mutable_tp_channel(unsigned x); - //! Function to get mutable access to all elements of tp_channel. - std::vector *mutable_tp_channel(); - #endif // CONFIG_TOUCHPAD + uint16_t *mutable_tones(unsigned x); + //! Function to get mutable access to all elements of tones. + std::vector *mutable_tones(); - // repeated GpioConfig gpios, id 7 - //! Function get const-access to the elements of gpios. - const std::vector &gpios() const; - //! Function to get the number of elements in gpios. - size_t gpios_size() const; - /*! - * Function to append a element to gpios. - * @return point to newly added element. - */ - GpioConfig* add_gpios(); - //! Function to reset gpios to its default/unset value. - void clear_gpios(); - //! Get value of element x of gpios. - const GpioConfig &gpios(unsigned x) const; - //! Set gpios using a constant reference - void set_gpios(unsigned x, const GpioConfig &v); - /*! - * Provide mutable access to gpios. - * @return pointer to member variable of gpios. - */ - GpioConfig *mutable_gpios(unsigned x); - //! Function to get mutable access to all elements of gpios. - std::vector *mutable_gpios(); - #ifdef CONFIG_SPI + protected: + Message *p_getMember(const char *s, unsigned n); + Message *p_getMember(const char *s, unsigned n, unsigned i); + //! string name, id 1 + std::string m_name; + //! fixed16 tones, id 2 + std::vector m_tones; +}; + + + + +class BuzzerConfig : public Message +{ + public: + BuzzerConfig() + { + } + + bool operator != (const BuzzerConfig &r) const; + bool operator == (const BuzzerConfig &r) const; + + //! Function for resetting all members to their default values. + void clear(); + + /*! + * Calculates the required number of bytes for serializing this object. + * If member variables of the object are modified, the number of bytes + * needed for serialization may change, too. + * @return bytes needed for a serialized object representation + */ + size_t calcSize() const; + + /*! + * Function for parsing serialized data and update this object accordingly. + * Member variables that are not in the serialized data are not reset. + * @param b buffer of serialized data + * @param s number of bytes available in the buffer + * @return number of bytes successfully parsed (can be < s) + * or a negative value indicating the error encountered + */ + ssize_t fromMemory(const void *b, ssize_t s); + + /*! + * Function for serializing the object to memory. + * @param b buffer to serialize the object to + * @param s number of bytes available in the buffer + * @return number of bytes successfully serialized + */ + ssize_t toMemory(uint8_t *, ssize_t) const; + + /*! + * Serialize the object using a function for transmitting individual bytes. + * @param put function to put individual bytes for transmission on the wire + */ + void toWire(void (*put)(uint8_t)) const; + + //! Function for serializing the object to a string. + void toString(std::string &put) const; + + /*! + * Function for writing a JSON representation of this object to a stream. + * @param json stream object the JSON output shall be written to + * @indLvl current indention level + */ + void toJSON(std::ostream &json, unsigned indLvl = 0) const; + + /*! + * Function for writing an ASCII representation of this object to a stream. + * @param o output stream + * @param indent initial indention level + */ + void toASCII(std::ostream &o, size_t indent = 0) const; + + /*! + * Function for determining the maximum size that the object may need for + * its serialized representation + * @return maximum number of bytes or SIZE_MAX if no limit can be determined + */ + static size_t getMaxSize(); + + //! Function for setting a parameter by its ASCII name using an ASCII representation of value. + //! @param param parameter name + //! @param value ASCII representation of the value + //! @return number of bytes parsed from value or negative value if an error occurs + int setByName(const char *param, const char *value); + + // optional sint8 gpio, id 1 + /*! + * Function for querying if gpio has been set. + * @return true if gpio is set. + */ + bool has_gpio() const; + //! Function to reset gpio to its default/unset value. + void clear_gpio(); + //! Get value of gpio. + int8_t gpio() const; + //! Set gpio using a constant reference + void set_gpio(int8_t v); + /*! + * Provide mutable access to gpio. + * @return pointer to member variable of gpio. + */ + int8_t *mutable_gpio(); + + // repeated Melody melodies, id 2 + //! Function get const-access to the elements of melodies. + const std::vector &melodies() const; + //! Function to get the number of elements in melodies. + size_t melodies_size() const; + /*! + * Function to append a element to melodies. + * @return point to newly added element. + */ + Melody* add_melodies(); + //! Function to reset melodies to its default/unset value. + void clear_melodies(); + //! Get value of element x of melodies. + const Melody &melodies(unsigned x) const; + //! Set melodies using a constant reference + void set_melodies(unsigned x, const Melody &v); + /*! + * Provide mutable access to melodies. + * @return pointer to member variable of melodies. + */ + Melody *mutable_melodies(unsigned x); + //! Function to get mutable access to all elements of melodies. + std::vector *mutable_melodies(); + + + protected: + Message *p_getMember(const char *s, unsigned n); + Message *p_getMember(const char *s, unsigned n, unsigned i); + //! sint8 gpio, id 1 + int8_t m_gpio = -1; + //! Melody melodies, id 2 + std::vector m_melodies; +}; + + + + +class HardwareConfig : public Message +{ + public: + HardwareConfig() + { + } + + bool operator != (const HardwareConfig &r) const; + bool operator == (const HardwareConfig &r) const; + + //! Function for resetting all members to their default values. + void clear(); + + /*! + * Calculates the required number of bytes for serializing this object. + * If member variables of the object are modified, the number of bytes + * needed for serialization may change, too. + * @return bytes needed for a serialized object representation + */ + size_t calcSize() const; + + /*! + * Function for parsing serialized data and update this object accordingly. + * Member variables that are not in the serialized data are not reset. + * @param b buffer of serialized data + * @param s number of bytes available in the buffer + * @return number of bytes successfully parsed (can be < s) + * or a negative value indicating the error encountered + */ + ssize_t fromMemory(const void *b, ssize_t s); + + /*! + * Function for serializing the object to memory. + * @param b buffer to serialize the object to + * @param s number of bytes available in the buffer + * @return number of bytes successfully serialized + */ + ssize_t toMemory(uint8_t *, ssize_t) const; + + /*! + * Serialize the object using a function for transmitting individual bytes. + * @param put function to put individual bytes for transmission on the wire + */ + void toWire(void (*put)(uint8_t)) const; + + //! Function for serializing the object to a string. + void toString(std::string &put) const; + + /*! + * Function for writing a JSON representation of this object to a stream. + * @param json stream object the JSON output shall be written to + * @indLvl current indention level + */ + void toJSON(std::ostream &json, unsigned indLvl = 0) const; + + /*! + * Function for writing an ASCII representation of this object to a stream. + * @param o output stream + * @param indent initial indention level + */ + void toASCII(std::ostream &o, size_t indent = 0) const; + + /*! + * Function for determining the maximum size that the object may need for + * its serialized representation + * @return maximum number of bytes or SIZE_MAX if no limit can be determined + */ + static size_t getMaxSize(); + + //! Function for setting a parameter by its ASCII name using an ASCII representation of value. + //! @param param parameter name + //! @param value ASCII representation of the value + //! @return number of bytes parsed from value or negative value if an error occurs + int setByName(const char *param, const char *value); + + // optional fixed32 magic, id 0 + /*! + * Function for querying if magic has been set. + * @return true if magic is set. + */ + bool has_magic() const; + //! Function to reset magic to its default/unset value. + void clear_magic(); + //! Get value of magic. + uint32_t magic() const; + //! Set magic using a constant reference + void set_magic(uint32_t v); + /*! + * Provide mutable access to magic. + * @return pointer to member variable of magic. + */ + uint32_t *mutable_magic(); + + // optional SystemConfig system, id 1 + /*! + * Function for querying if system has been set. + * @return true if system is set. + */ + bool has_system() const; + //! Function to reset system to its default/unset value. + void clear_system(); + //! Get value of system. + const SystemConfig &system() const; + /*! + * Function for setting members of system using data from a serialized object. + * @param data pointer to binary data + * @param s number of bytes at data pointer + */ + void set_system(const void *data, size_t s); + //! Set system using a constant reference + void set_system(const SystemConfig &v); + /*! + * Provide mutable access to system. + * @return pointer to member variable of system. + */ + SystemConfig *mutable_system(); + + // repeated UartConfig uart, id 3 + //! Function get const-access to the elements of uart. + const std::vector &uart() const; + //! Function to get the number of elements in uart. + size_t uart_size() const; + /*! + * Function to append a element to uart. + * @return point to newly added element. + */ + UartConfig* add_uart(); + //! Function to reset uart to its default/unset value. + void clear_uart(); + //! Get value of element x of uart. + const UartConfig &uart(unsigned x) const; + //! Set uart using a constant reference + void set_uart(unsigned x, const UartConfig &v); + /*! + * Provide mutable access to uart. + * @return pointer to member variable of uart. + */ + UartConfig *mutable_uart(unsigned x); + //! Function to get mutable access to all elements of uart. + std::vector *mutable_uart(); + + // optional AdcConfig adc, id 4 + /*! + * Function for querying if adc has been set. + * @return true if adc is set. + */ + bool has_adc() const; + //! Function to reset adc to its default/unset value. + void clear_adc(); + //! Get value of adc. + const AdcConfig &adc() const; + /*! + * Function for setting adc using binary data. + * @param data pointer to binary data + * @param s number of bytes at data pointer + */ + void set_adc(const void *data, size_t s); + //! Set adc using a constant reference + void set_adc(const AdcConfig &v); + /*! + * Provide mutable access to adc. + * @return pointer to member variable of adc. + */ + AdcConfig *mutable_adc(); + + #ifdef CONFIG_TOUCHPAD + // optional TouchpadConfig touchpad, id 5 + /*! + * Function for querying if touchpad has been set. + * @return true if touchpad is set. + */ + bool has_touchpad() const; + //! Function to reset touchpad to its default/unset value. + void clear_touchpad(); + //! Get value of touchpad. + const TouchpadConfig &touchpad() const; + /*! + * Function for setting touchpad using binary data. + * @param data pointer to binary data + * @param s number of bytes at data pointer + */ + void set_touchpad(const void *data, size_t s); + //! Set touchpad using a constant reference + void set_touchpad(const TouchpadConfig &v); + /*! + * Provide mutable access to touchpad. + * @return pointer to member variable of touchpad. + */ + TouchpadConfig *mutable_touchpad(); + #endif // CONFIG_TOUCHPAD + + #ifdef CONFIG_TOUCHPAD + // repeated TouchChannelConfig tp_channel, id 6 + //! Function get const-access to the elements of tp_channel. + const std::vector &tp_channel() const; + //! Function to get the number of elements in tp_channel. + size_t tp_channel_size() const; + /*! + * Function to append a element to tp_channel. + * @return point to newly added element. + */ + TouchChannelConfig* add_tp_channel(); + //! Function to reset tp_channel to its default/unset value. + void clear_tp_channel(); + //! Get value of element x of tp_channel. + const TouchChannelConfig &tp_channel(unsigned x) const; + //! Set tp_channel using a constant reference + void set_tp_channel(unsigned x, const TouchChannelConfig &v); + /*! + * Provide mutable access to tp_channel. + * @return pointer to member variable of tp_channel. + */ + TouchChannelConfig *mutable_tp_channel(unsigned x); + //! Function to get mutable access to all elements of tp_channel. + std::vector *mutable_tp_channel(); + #endif // CONFIG_TOUCHPAD + + // repeated GpioConfig gpios, id 7 + //! Function get const-access to the elements of gpios. + const std::vector &gpios() const; + //! Function to get the number of elements in gpios. + size_t gpios_size() const; + /*! + * Function to append a element to gpios. + * @return point to newly added element. + */ + GpioConfig* add_gpios(); + //! Function to reset gpios to its default/unset value. + void clear_gpios(); + //! Get value of element x of gpios. + const GpioConfig &gpios(unsigned x) const; + //! Set gpios using a constant reference + void set_gpios(unsigned x, const GpioConfig &v); + /*! + * Provide mutable access to gpios. + * @return pointer to member variable of gpios. + */ + GpioConfig *mutable_gpios(unsigned x); + //! Function to get mutable access to all elements of gpios. + std::vector *mutable_gpios(); + + #ifdef CONFIG_SPI // repeated SpiBusConfig spibus, id 8 //! Function get const-access to the elements of spibus. const std::vector &spibus() const; @@ -5188,6 +5651,32 @@ class HardwareConfig : public Message std::vector *mutable_led(); #endif // CONFIG_LEDS + #ifdef CONFIG_BUZZER + // optional BuzzerConfig buzzer, id 19 + /*! + * Function for querying if buzzer has been set. + * @return true if buzzer is set. + */ + bool has_buzzer() const; + //! Function to reset buzzer to its default/unset value. + void clear_buzzer(); + //! Get value of buzzer. + const BuzzerConfig &buzzer() const; + /*! + * Function for setting buzzer using binary data. + * @param data pointer to binary data + * @param s number of bytes at data pointer + */ + void set_buzzer(const void *data, size_t s); + //! Set buzzer using a constant reference + void set_buzzer(const BuzzerConfig &v); + /*! + * Provide mutable access to buzzer. + * @return pointer to member variable of buzzer. + */ + BuzzerConfig *mutable_buzzer(); + #endif // CONFIG_BUZZER + #ifdef CONFIG_HLW8012 // optional Hlw8012Config hlw8012, id 20 /*! @@ -5512,6 +6001,10 @@ class HardwareConfig : public Message //! LedConfig led, id 18 std::vector m_led; #endif // CONFIG_LEDS + #ifdef CONFIG_BUZZER + //! BuzzerConfig buzzer, id 19 + BuzzerConfig m_buzzer; + #endif // CONFIG_BUZZER #ifdef CONFIG_HLW8012 //! Hlw8012Config hlw8012, id 20 Hlw8012Config m_hlw8012; @@ -5574,6 +6067,8 @@ inline size_t SystemConfig::getMaxSize() // optional string model_number, id 8 has unlimited size // optional bool usb_diag, id 9 has maximum size 2 // optional bool usb_con, id 10 has maximum size 2 + // optional sint8 cc1_gpio, id 11 has maximum size 3 + // optional sint8 cc2_gpio, id 12 has maximum size 3 return SIZE_MAX; } @@ -5904,53 +6399,119 @@ inline bool SystemConfig::has_usb_diag() const */ inline void SystemConfig::clear_usb_diag() { - m_usb_diag = true; + m_usb_diag = true; +} + +inline bool *SystemConfig::mutable_usb_diag() +{ + return &m_usb_diag; +} + +inline void SystemConfig::set_usb_diag(bool v) +{ + m_usb_diag = v; +} + +#endif // CONFIG_USB_DIAGLOG + + +#ifdef CONFIG_USB_CONSOLE +inline bool SystemConfig::usb_con() const +{ + return m_usb_con; +} + +inline bool SystemConfig::has_usb_con() const +{ + return m_usb_con != true; +} + +/*! + * Function for clearing the associated member variable. + * It will reset the value to the default value. + */ +inline void SystemConfig::clear_usb_con() +{ + m_usb_con = true; +} + +inline bool *SystemConfig::mutable_usb_con() +{ + return &m_usb_con; +} + +inline void SystemConfig::set_usb_con(bool v) +{ + m_usb_con = v; +} + +#endif // CONFIG_USB_CONSOLE + + +#ifdef CONFIG_ESP_PHY_ENABLE_USB +inline int8_t SystemConfig::cc1_gpio() const +{ + return m_cc1_gpio; +} + +inline bool SystemConfig::has_cc1_gpio() const +{ + return m_cc1_gpio != -1; +} + +/*! + * Function for clearing the associated member variable. + * It will reset the value to the default value. + */ +inline void SystemConfig::clear_cc1_gpio() +{ + m_cc1_gpio = -1; } -inline bool *SystemConfig::mutable_usb_diag() +inline int8_t *SystemConfig::mutable_cc1_gpio() { - return &m_usb_diag; + return &m_cc1_gpio; } -inline void SystemConfig::set_usb_diag(bool v) +inline void SystemConfig::set_cc1_gpio(int8_t v) { - m_usb_diag = v; + m_cc1_gpio = v; } -#endif // CONFIG_USB_DIAGLOG +#endif // CONFIG_ESP_PHY_ENABLE_USB -#ifdef CONFIG_USB_CONSOLE -inline bool SystemConfig::usb_con() const +#ifdef CONFIG_ESP_PHY_ENABLE_USB +inline int8_t SystemConfig::cc2_gpio() const { - return m_usb_con; + return m_cc2_gpio; } -inline bool SystemConfig::has_usb_con() const +inline bool SystemConfig::has_cc2_gpio() const { - return m_usb_con != true; + return m_cc2_gpio != -1; } /*! * Function for clearing the associated member variable. * It will reset the value to the default value. */ -inline void SystemConfig::clear_usb_con() +inline void SystemConfig::clear_cc2_gpio() { - m_usb_con = true; + m_cc2_gpio = -1; } -inline bool *SystemConfig::mutable_usb_con() +inline int8_t *SystemConfig::mutable_cc2_gpio() { - return &m_usb_con; + return &m_cc2_gpio; } -inline void SystemConfig::set_usb_con(bool v) +inline void SystemConfig::set_cc2_gpio(int8_t v) { - m_usb_con = v; + m_cc2_gpio = v; } -#endif // CONFIG_USB_CONSOLE +#endif // CONFIG_ESP_PHY_ENABLE_USB inline size_t TouchpadConfig::getMaxSize() @@ -7756,6 +8317,11 @@ inline bool LedConfig::config_open_drain() const return (bool)((m_config >> 1) & 0x1); } +inline bool LedConfig::config_init_high() const +{ + return (bool)((m_config >> 2) & 0x1); +} + inline bool LedConfig::has_config() const { return 0 != (p_validbits & ((uint8_t)1U << 0)); @@ -7794,6 +8360,13 @@ inline void LedConfig::set_config_open_drain(bool v) p_validbits |= ((uint8_t)1U << 0); } +inline void LedConfig::set_config_init_high(bool v) +{ + m_config &= ~(0x1ULL << 2); + m_config |= ((uint8_t) v << 2); + p_validbits |= ((uint8_t)1U << 0); +} + inline void LedConfig::set_config(ledcfg_t v) { m_config = v; @@ -8878,11 +9451,6 @@ inline bool GpioConfig::config_pulldown() const return (bool)((m_config >> 8) & 0x1); } -inline bool GpioConfig::config_cap_freq_r2r() const -{ - return (bool)((m_config >> 9) & 0x1); -} - inline bool GpioConfig::has_config() const { return 0 != (p_validbits & ((uint8_t)1U << 0)); @@ -8949,13 +9517,6 @@ inline void GpioConfig::set_config_pulldown(bool v) p_validbits |= ((uint8_t)1U << 0); } -inline void GpioConfig::set_config_cap_freq_r2r(bool v) -{ - m_config &= ~(0x1ULL << 9); - m_config |= ((uint16_t) v << 9); - p_validbits |= ((uint8_t)1U << 0); -} - inline void GpioConfig::set_config(gpiocfg_t v) { m_config = v; @@ -9122,7 +9683,8 @@ inline size_t SpiDeviceConfig::getMaxSize() // optional sint8 intr, id 3 has maximum size 3 // optional sint8 reset, id 4 has maximum size 3 // optional sint8 cd, id 5 has maximum size 3 - return 14; + // optional unsigned freq, id 6 has maximum size 11 + return 25; } inline spidrv_t SpiDeviceConfig::drv() const @@ -9280,6 +9842,37 @@ inline void SpiDeviceConfig::set_cd(int8_t v) +inline uint64_t SpiDeviceConfig::freq() const +{ + return m_freq; +} + +inline bool SpiDeviceConfig::has_freq() const +{ + return m_freq != 0; +} + +/*! + * Function for clearing the associated member variable. + * It will reset the value to the default value. + */ +inline void SpiDeviceConfig::clear_freq() +{ + m_freq = 0; +} + +inline uint64_t *SpiDeviceConfig::mutable_freq() +{ + return &m_freq; +} + +inline void SpiDeviceConfig::set_freq(uint64_t v) +{ + m_freq = v; +} + + + inline size_t SpiBusConfig::getMaxSize() { // optional sint8 host, id 1 has maximum size 3 @@ -9932,225 +10525,491 @@ inline int8_t Hlw8012Config::cf1() const return m_cf1; } -inline bool Hlw8012Config::has_cf1() const +inline bool Hlw8012Config::has_cf1() const +{ + return m_cf1 != -1; +} + +/*! + * Function for clearing the associated member variable. + * It will reset the value to the default value. + */ +inline void Hlw8012Config::clear_cf1() +{ + m_cf1 = -1; +} + +inline int8_t *Hlw8012Config::mutable_cf1() +{ + return &m_cf1; +} + +inline void Hlw8012Config::set_cf1(int8_t v) +{ + m_cf1 = v; +} + + + +inline size_t SX1276Config::getMaxSize() +{ + // optional sint8 dio0, id 1 has maximum size 3 + // optional sint8 dio1, id 2 has maximum size 3 + // optional sint8 dio2, id 3 has maximum size 3 + // optional sint8 dio3, id 4 has maximum size 3 + // optional sint8 dio4, id 5 has maximum size 3 + // optional sint8 dio5, id 6 has maximum size 3 + return 18; +} + +inline int8_t SX1276Config::dio0() const +{ + return m_dio0; +} + +inline bool SX1276Config::has_dio0() const +{ + return m_dio0 != -1; +} + +/*! + * Function for clearing the associated member variable. + * It will reset the value to the default value. + */ +inline void SX1276Config::clear_dio0() +{ + m_dio0 = -1; +} + +inline int8_t *SX1276Config::mutable_dio0() +{ + return &m_dio0; +} + +inline void SX1276Config::set_dio0(int8_t v) +{ + m_dio0 = v; +} + + + +inline int8_t SX1276Config::dio1() const +{ + return m_dio1; +} + +inline bool SX1276Config::has_dio1() const +{ + return m_dio1 != -1; +} + +/*! + * Function for clearing the associated member variable. + * It will reset the value to the default value. + */ +inline void SX1276Config::clear_dio1() +{ + m_dio1 = -1; +} + +inline int8_t *SX1276Config::mutable_dio1() +{ + return &m_dio1; +} + +inline void SX1276Config::set_dio1(int8_t v) +{ + m_dio1 = v; +} + + + +inline int8_t SX1276Config::dio2() const +{ + return m_dio2; +} + +inline bool SX1276Config::has_dio2() const +{ + return m_dio2 != -1; +} + +/*! + * Function for clearing the associated member variable. + * It will reset the value to the default value. + */ +inline void SX1276Config::clear_dio2() +{ + m_dio2 = -1; +} + +inline int8_t *SX1276Config::mutable_dio2() +{ + return &m_dio2; +} + +inline void SX1276Config::set_dio2(int8_t v) +{ + m_dio2 = v; +} + + + +inline int8_t SX1276Config::dio3() const +{ + return m_dio3; +} + +inline bool SX1276Config::has_dio3() const +{ + return m_dio3 != -1; +} + +/*! + * Function for clearing the associated member variable. + * It will reset the value to the default value. + */ +inline void SX1276Config::clear_dio3() +{ + m_dio3 = -1; +} + +inline int8_t *SX1276Config::mutable_dio3() +{ + return &m_dio3; +} + +inline void SX1276Config::set_dio3(int8_t v) +{ + m_dio3 = v; +} + + + +inline int8_t SX1276Config::dio4() const +{ + return m_dio4; +} + +inline bool SX1276Config::has_dio4() const +{ + return m_dio4 != -1; +} + +/*! + * Function for clearing the associated member variable. + * It will reset the value to the default value. + */ +inline void SX1276Config::clear_dio4() +{ + m_dio4 = -1; +} + +inline int8_t *SX1276Config::mutable_dio4() +{ + return &m_dio4; +} + +inline void SX1276Config::set_dio4(int8_t v) +{ + m_dio4 = v; +} + + + +inline int8_t SX1276Config::dio5() const +{ + return m_dio5; +} + +inline bool SX1276Config::has_dio5() const { - return m_cf1 != -1; + return m_dio5 != -1; } /*! * Function for clearing the associated member variable. * It will reset the value to the default value. */ -inline void Hlw8012Config::clear_cf1() +inline void SX1276Config::clear_dio5() { - m_cf1 = -1; + m_dio5 = -1; } -inline int8_t *Hlw8012Config::mutable_cf1() +inline int8_t *SX1276Config::mutable_dio5() { - return &m_cf1; + return &m_dio5; } -inline void Hlw8012Config::set_cf1(int8_t v) +inline void SX1276Config::set_dio5(int8_t v) { - m_cf1 = v; + m_dio5 = v; } -inline size_t SX1276Config::getMaxSize() +inline size_t Tone::getMaxSize() { - // optional sint8 dio0, id 1 has maximum size 3 - // optional sint8 dio1, id 2 has maximum size 3 - // optional sint8 dio2, id 3 has maximum size 3 - // optional sint8 dio3, id 4 has maximum size 3 - // optional sint8 dio4, id 5 has maximum size 3 - // optional sint8 dio5, id 6 has maximum size 3 - return 18; + // optional unsigned freq, id 1 has maximum size 11 + // optional unsigned duration, id 2 has maximum size 11 + return 22; } -inline int8_t SX1276Config::dio0() const +inline uint64_t Tone::freq() const { - return m_dio0; + return m_freq; } -inline bool SX1276Config::has_dio0() const +inline bool Tone::has_freq() const { - return m_dio0 != -1; + return 0 != (p_validbits & ((uint8_t)1U << 0)); } /*! * Function for clearing the associated member variable. * It will reset the value to the default value. */ -inline void SX1276Config::clear_dio0() +inline void Tone::clear_freq() { - m_dio0 = -1; + p_validbits &= ~((uint8_t)1U << 0); + m_freq = 0; } -inline int8_t *SX1276Config::mutable_dio0() +inline uint64_t *Tone::mutable_freq() { - return &m_dio0; + if (0 == (p_validbits & ((uint8_t)1U << 0))) { + p_validbits |= ((uint8_t)1U << 0); + m_freq = 0; + } + return &m_freq; } -inline void SX1276Config::set_dio0(int8_t v) +inline void Tone::set_freq(uint64_t v) { - m_dio0 = v; + m_freq = v; + p_validbits |= ((uint8_t)1U << 0); } -inline int8_t SX1276Config::dio1() const +inline uint64_t Tone::duration() const { - return m_dio1; + return m_duration; } -inline bool SX1276Config::has_dio1() const +inline bool Tone::has_duration() const { - return m_dio1 != -1; + return 0 != (p_validbits & ((uint8_t)1U << 1)); } /*! * Function for clearing the associated member variable. * It will reset the value to the default value. */ -inline void SX1276Config::clear_dio1() +inline void Tone::clear_duration() { - m_dio1 = -1; + p_validbits &= ~((uint8_t)1U << 1); + m_duration = 0; } -inline int8_t *SX1276Config::mutable_dio1() +inline uint64_t *Tone::mutable_duration() { - return &m_dio1; + if (0 == (p_validbits & ((uint8_t)1U << 1))) { + p_validbits |= ((uint8_t)1U << 1); + m_duration = 0; + } + return &m_duration; } -inline void SX1276Config::set_dio1(int8_t v) +inline void Tone::set_duration(uint64_t v) { - m_dio1 = v; + m_duration = v; + p_validbits |= ((uint8_t)1U << 1); } -inline int8_t SX1276Config::dio2() const +inline size_t Melody::getMaxSize() { - return m_dio2; + // optional string name, id 1 has unlimited size + // repeated fixed16 tones, id 2 has unlimited size + return SIZE_MAX; } -inline bool SX1276Config::has_dio2() const +inline const std::string &Melody::name() const { - return m_dio2 != -1; + return m_name; +} + +inline bool Melody::has_name() const +{ + return !m_name.empty(); } /*! * Function for clearing the associated member variable. * It will reset the value to the default value. */ -inline void SX1276Config::clear_dio2() +inline void Melody::clear_name() { - m_dio2 = -1; + m_name.clear(); } -inline int8_t *SX1276Config::mutable_dio2() +inline std::string *Melody::mutable_name() { - return &m_dio2; + return &m_name; } -inline void SX1276Config::set_dio2(int8_t v) +inline void Melody::set_name(const void *data, size_t s) { - m_dio2 = v; + m_name.assign((const char *)data,s); } +inline void Melody::set_name(const char *data) +{ + m_name = data; +} +inline void Melody::set_name(const std::string &v) +{ + m_name = v; +} -inline int8_t SX1276Config::dio3() const + + +inline uint16_t Melody::tones(unsigned x) const { - return m_dio3; + return m_tones[x]; } -inline bool SX1276Config::has_dio3() const +inline const std::vector &Melody::tones() const { - return m_dio3 != -1; + return m_tones; } /*! * Function for clearing the associated member variable. * It will reset the value to the default value. */ -inline void SX1276Config::clear_dio3() +inline void Melody::clear_tones() { - m_dio3 = -1; + m_tones.clear(); } -inline int8_t *SX1276Config::mutable_dio3() +inline uint16_t *Melody::mutable_tones(unsigned x) { - return &m_dio3; + if (x >= m_tones.size()) + m_tones.resize(x+1); + return &m_tones[x]; } -inline void SX1276Config::set_dio3(int8_t v) +inline std::vector *Melody::mutable_tones() { - m_dio3 = v; + return &m_tones; } +inline void Melody::add_tones(uint16_t v) +{ + m_tones.push_back(v); +} +inline void Melody::set_tones(unsigned x, uint16_t v) +{ + assert(x < m_tones.size()); + m_tones[x] = v; +} -inline int8_t SX1276Config::dio4() const +inline size_t Melody::tones_size() const { - return m_dio4; + return m_tones.size(); } -inline bool SX1276Config::has_dio4() const + + +inline size_t BuzzerConfig::getMaxSize() { - return m_dio4 != -1; + // optional sint8 gpio, id 1 has maximum size 3 + // repeated Melody melodies, id 2 has unlimited size + return SIZE_MAX; +} + +inline int8_t BuzzerConfig::gpio() const +{ + return m_gpio; +} + +inline bool BuzzerConfig::has_gpio() const +{ + return m_gpio != -1; } /*! * Function for clearing the associated member variable. * It will reset the value to the default value. */ -inline void SX1276Config::clear_dio4() +inline void BuzzerConfig::clear_gpio() { - m_dio4 = -1; + m_gpio = -1; } -inline int8_t *SX1276Config::mutable_dio4() +inline int8_t *BuzzerConfig::mutable_gpio() { - return &m_dio4; + return &m_gpio; } -inline void SX1276Config::set_dio4(int8_t v) +inline void BuzzerConfig::set_gpio(int8_t v) { - m_dio4 = v; + m_gpio = v; } -inline int8_t SX1276Config::dio5() const +inline const Melody &BuzzerConfig::melodies(unsigned x) const { - return m_dio5; + return m_melodies[x]; } -inline bool SX1276Config::has_dio5() const +inline const std::vector &BuzzerConfig::melodies() const { - return m_dio5 != -1; + return m_melodies; } /*! * Function for clearing the associated member variable. * It will reset the value to the default value. */ -inline void SX1276Config::clear_dio5() +inline void BuzzerConfig::clear_melodies() { - m_dio5 = -1; + m_melodies.clear(); } -inline int8_t *SX1276Config::mutable_dio5() +inline Melody *BuzzerConfig::mutable_melodies(unsigned x) { - return &m_dio5; + if (x >= m_melodies.size()) + m_melodies.resize(x+1); + return &m_melodies[x]; } -inline void SX1276Config::set_dio5(int8_t v) +inline std::vector *BuzzerConfig::mutable_melodies() { - m_dio5 = v; + return &m_melodies; +} + +inline Melody *BuzzerConfig::add_melodies() +{ + m_melodies.resize(m_melodies.size()+1); + return &m_melodies.back(); +} + +inline void BuzzerConfig::set_melodies(unsigned x, const Melody &v) +{ + assert(x < m_melodies.size()); + m_melodies[x] = v; +} + +inline size_t BuzzerConfig::melodies_size() const +{ + return m_melodies.size(); } @@ -10158,7 +11017,7 @@ inline void SX1276Config::set_dio5(int8_t v) inline size_t HardwareConfig::getMaxSize() { // optional fixed32 magic, id 0 has maximum size 5 - // optional SystemConfig system, id 1 has maximum size 9 + // optional SystemConfig system, id 1 has maximum size 15 // repeated UartConfig uart, id 3 has unlimited size // optional AdcConfig adc, id 4 has maximum size 10 // optional TouchpadConfig touchpad, id 5 has maximum size 23 @@ -10168,6 +11027,7 @@ inline size_t HardwareConfig::getMaxSize() // repeated ButtonConfig button, id 16 has unlimited size // repeated RelayConfig relay, id 17 has unlimited size // repeated LedConfig led, id 18 has unlimited size + // optional BuzzerConfig buzzer, id 19 has maximum size 4 // optional Hlw8012Config hlw8012, id 20 has maximum size 11 // optional Max7219Config max7219, id 32 has maximum size 16 // optional Tlc5947Config tlc5947, id 33 has maximum size 17 @@ -10710,6 +11570,51 @@ inline size_t HardwareConfig::led_size() const #endif // CONFIG_LEDS +#ifdef CONFIG_BUZZER +inline const BuzzerConfig &HardwareConfig::buzzer() const +{ + return m_buzzer; +} + +inline bool HardwareConfig::has_buzzer() const +{ + return 0 != (p_validbits & ((uint16_t)1U << 4)); +} + +/*! + * Function for clearing the associated member variable. + * It will reset the value to the default value. + */ +inline void HardwareConfig::clear_buzzer() +{ + p_validbits &= ~((uint16_t)1U << 4); + m_buzzer.clear(); +} + +inline BuzzerConfig *HardwareConfig::mutable_buzzer() +{ + if (0 == (p_validbits & ((uint16_t)1U << 4))) { + p_validbits |= ((uint16_t)1U << 4); + m_buzzer.clear(); + } + return &m_buzzer; +} + +inline void HardwareConfig::set_buzzer(const void *data, size_t s) +{ + m_buzzer.fromMemory((const char *)data,s); + p_validbits |= ((uint16_t)1U << 4); +} + +inline void HardwareConfig::set_buzzer(const BuzzerConfig &v) +{ + m_buzzer = v; + p_validbits |= ((uint16_t)1U << 4); +} + +#endif // CONFIG_BUZZER + + #ifdef CONFIG_HLW8012 inline const Hlw8012Config &HardwareConfig::hlw8012() const { @@ -10718,7 +11623,7 @@ inline const Hlw8012Config &HardwareConfig::hlw8012() const inline bool HardwareConfig::has_hlw8012() const { - return 0 != (p_validbits & ((uint16_t)1U << 4)); + return 0 != (p_validbits & ((uint16_t)1U << 5)); } /*! @@ -10727,14 +11632,14 @@ inline bool HardwareConfig::has_hlw8012() const */ inline void HardwareConfig::clear_hlw8012() { - p_validbits &= ~((uint16_t)1U << 4); + p_validbits &= ~((uint16_t)1U << 5); m_hlw8012.clear(); } inline Hlw8012Config *HardwareConfig::mutable_hlw8012() { - if (0 == (p_validbits & ((uint16_t)1U << 4))) { - p_validbits |= ((uint16_t)1U << 4); + if (0 == (p_validbits & ((uint16_t)1U << 5))) { + p_validbits |= ((uint16_t)1U << 5); m_hlw8012.clear(); } return &m_hlw8012; @@ -10743,13 +11648,13 @@ inline Hlw8012Config *HardwareConfig::mutable_hlw8012() inline void HardwareConfig::set_hlw8012(const void *data, size_t s) { m_hlw8012.fromMemory((const char *)data,s); - p_validbits |= ((uint16_t)1U << 4); + p_validbits |= ((uint16_t)1U << 5); } inline void HardwareConfig::set_hlw8012(const Hlw8012Config &v) { m_hlw8012 = v; - p_validbits |= ((uint16_t)1U << 4); + p_validbits |= ((uint16_t)1U << 5); } #endif // CONFIG_HLW8012 @@ -10763,7 +11668,7 @@ inline const Max7219Config &HardwareConfig::max7219() const inline bool HardwareConfig::has_max7219() const { - return 0 != (p_validbits & ((uint16_t)1U << 5)); + return 0 != (p_validbits & ((uint16_t)1U << 6)); } /*! @@ -10772,14 +11677,14 @@ inline bool HardwareConfig::has_max7219() const */ inline void HardwareConfig::clear_max7219() { - p_validbits &= ~((uint16_t)1U << 5); + p_validbits &= ~((uint16_t)1U << 6); m_max7219.clear(); } inline Max7219Config *HardwareConfig::mutable_max7219() { - if (0 == (p_validbits & ((uint16_t)1U << 5))) { - p_validbits |= ((uint16_t)1U << 5); + if (0 == (p_validbits & ((uint16_t)1U << 6))) { + p_validbits |= ((uint16_t)1U << 6); m_max7219.clear(); } return &m_max7219; @@ -10788,13 +11693,13 @@ inline Max7219Config *HardwareConfig::mutable_max7219() inline void HardwareConfig::set_max7219(const void *data, size_t s) { m_max7219.fromMemory((const char *)data,s); - p_validbits |= ((uint16_t)1U << 5); + p_validbits |= ((uint16_t)1U << 6); } inline void HardwareConfig::set_max7219(const Max7219Config &v) { m_max7219 = v; - p_validbits |= ((uint16_t)1U << 5); + p_validbits |= ((uint16_t)1U << 6); } #endif // CONFIG_MAX7219 @@ -10808,7 +11713,7 @@ inline const Tlc5947Config &HardwareConfig::tlc5947() const inline bool HardwareConfig::has_tlc5947() const { - return 0 != (p_validbits & ((uint16_t)1U << 6)); + return 0 != (p_validbits & ((uint16_t)1U << 7)); } /*! @@ -10817,14 +11722,14 @@ inline bool HardwareConfig::has_tlc5947() const */ inline void HardwareConfig::clear_tlc5947() { - p_validbits &= ~((uint16_t)1U << 6); + p_validbits &= ~((uint16_t)1U << 7); m_tlc5947.clear(); } inline Tlc5947Config *HardwareConfig::mutable_tlc5947() { - if (0 == (p_validbits & ((uint16_t)1U << 6))) { - p_validbits |= ((uint16_t)1U << 6); + if (0 == (p_validbits & ((uint16_t)1U << 7))) { + p_validbits |= ((uint16_t)1U << 7); m_tlc5947.clear(); } return &m_tlc5947; @@ -10833,13 +11738,13 @@ inline Tlc5947Config *HardwareConfig::mutable_tlc5947() inline void HardwareConfig::set_tlc5947(const void *data, size_t s) { m_tlc5947.fromMemory((const char *)data,s); - p_validbits |= ((uint16_t)1U << 6); + p_validbits |= ((uint16_t)1U << 7); } inline void HardwareConfig::set_tlc5947(const Tlc5947Config &v) { m_tlc5947 = v; - p_validbits |= ((uint16_t)1U << 6); + p_validbits |= ((uint16_t)1U << 7); } #endif // CONFIG_TLC5947 @@ -10905,7 +11810,7 @@ inline const DhtConfig &HardwareConfig::dht() const inline bool HardwareConfig::has_dht() const { - return 0 != (p_validbits & ((uint16_t)1U << 7)); + return 0 != (p_validbits & ((uint16_t)1U << 8)); } /*! @@ -10914,14 +11819,14 @@ inline bool HardwareConfig::has_dht() const */ inline void HardwareConfig::clear_dht() { - p_validbits &= ~((uint16_t)1U << 7); + p_validbits &= ~((uint16_t)1U << 8); m_dht.clear(); } inline DhtConfig *HardwareConfig::mutable_dht() { - if (0 == (p_validbits & ((uint16_t)1U << 7))) { - p_validbits |= ((uint16_t)1U << 7); + if (0 == (p_validbits & ((uint16_t)1U << 8))) { + p_validbits |= ((uint16_t)1U << 8); m_dht.clear(); } return &m_dht; @@ -10930,13 +11835,13 @@ inline DhtConfig *HardwareConfig::mutable_dht() inline void HardwareConfig::set_dht(const void *data, size_t s) { m_dht.fromMemory((const char *)data,s); - p_validbits |= ((uint16_t)1U << 7); + p_validbits |= ((uint16_t)1U << 8); } inline void HardwareConfig::set_dht(const DhtConfig &v) { m_dht = v; - p_validbits |= ((uint16_t)1U << 7); + p_validbits |= ((uint16_t)1U << 8); } #endif // CONFIG_DHT @@ -11054,7 +11959,7 @@ inline const OneWireConfig &HardwareConfig::onewire() const inline bool HardwareConfig::has_onewire() const { - return 0 != (p_validbits & ((uint16_t)1U << 8)); + return 0 != (p_validbits & ((uint16_t)1U << 9)); } /*! @@ -11063,14 +11968,14 @@ inline bool HardwareConfig::has_onewire() const */ inline void HardwareConfig::clear_onewire() { - p_validbits &= ~((uint16_t)1U << 8); + p_validbits &= ~((uint16_t)1U << 9); m_onewire.clear(); } inline OneWireConfig *HardwareConfig::mutable_onewire() { - if (0 == (p_validbits & ((uint16_t)1U << 8))) { - p_validbits |= ((uint16_t)1U << 8); + if (0 == (p_validbits & ((uint16_t)1U << 9))) { + p_validbits |= ((uint16_t)1U << 9); m_onewire.clear(); } return &m_onewire; @@ -11079,13 +11984,13 @@ inline OneWireConfig *HardwareConfig::mutable_onewire() inline void HardwareConfig::set_onewire(const void *data, size_t s) { m_onewire.fromMemory((const char *)data,s); - p_validbits |= ((uint16_t)1U << 8); + p_validbits |= ((uint16_t)1U << 9); } inline void HardwareConfig::set_onewire(const OneWireConfig &v) { m_onewire = v; - p_validbits |= ((uint16_t)1U << 8); + p_validbits |= ((uint16_t)1U << 9); } #endif // CONFIG_ONEWIRE @@ -11099,7 +12004,7 @@ inline const SX1276Config &HardwareConfig::sx1276() const inline bool HardwareConfig::has_sx1276() const { - return 0 != (p_validbits & ((uint16_t)1U << 9)); + return 0 != (p_validbits & ((uint16_t)1U << 10)); } /*! @@ -11108,14 +12013,14 @@ inline bool HardwareConfig::has_sx1276() const */ inline void HardwareConfig::clear_sx1276() { - p_validbits &= ~((uint16_t)1U << 9); + p_validbits &= ~((uint16_t)1U << 10); m_sx1276.clear(); } inline SX1276Config *HardwareConfig::mutable_sx1276() { - if (0 == (p_validbits & ((uint16_t)1U << 9))) { - p_validbits |= ((uint16_t)1U << 9); + if (0 == (p_validbits & ((uint16_t)1U << 10))) { + p_validbits |= ((uint16_t)1U << 10); m_sx1276.clear(); } return &m_sx1276; @@ -11124,13 +12029,13 @@ inline SX1276Config *HardwareConfig::mutable_sx1276() inline void HardwareConfig::set_sx1276(const void *data, size_t s) { m_sx1276.fromMemory((const char *)data,s); - p_validbits |= ((uint16_t)1U << 9); + p_validbits |= ((uint16_t)1U << 10); } inline void HardwareConfig::set_sx1276(const SX1276Config &v) { m_sx1276 = v; - p_validbits |= ((uint16_t)1U << 9); + p_validbits |= ((uint16_t)1U << 10); } #endif // CONFIG_SX1276 @@ -11196,7 +12101,7 @@ inline const DisplayConfig &HardwareConfig::display() const inline bool HardwareConfig::has_display() const { - return 0 != (p_validbits & ((uint16_t)1U << 10)); + return 0 != (p_validbits & ((uint16_t)1U << 11)); } /*! @@ -11205,14 +12110,14 @@ inline bool HardwareConfig::has_display() const */ inline void HardwareConfig::clear_display() { - p_validbits &= ~((uint16_t)1U << 10); + p_validbits &= ~((uint16_t)1U << 11); m_display.clear(); } inline DisplayConfig *HardwareConfig::mutable_display() { - if (0 == (p_validbits & ((uint16_t)1U << 10))) { - p_validbits |= ((uint16_t)1U << 10); + if (0 == (p_validbits & ((uint16_t)1U << 11))) { + p_validbits |= ((uint16_t)1U << 11); m_display.clear(); } return &m_display; @@ -11221,13 +12126,13 @@ inline DisplayConfig *HardwareConfig::mutable_display() inline void HardwareConfig::set_display(const void *data, size_t s) { m_display.fromMemory((const char *)data,s); - p_validbits |= ((uint16_t)1U << 10); + p_validbits |= ((uint16_t)1U << 11); } inline void HardwareConfig::set_display(const DisplayConfig &v) { m_display = v; - p_validbits |= ((uint16_t)1U << 10); + p_validbits |= ((uint16_t)1U << 11); } #endif // CONFIG_DISPLAY diff --git a/components/wfc/swcfg_esp32.cpp b/components/wfc/swcfg_esp32.cpp index b0ab263..a1be974 100644 --- a/components/wfc/swcfg_esp32.cpp +++ b/components/wfc/swcfg_esp32.cpp @@ -1,8 +1,8 @@ /**************************************************************************** * * Code generated by Wire-Format-Compiler (WFC) - * WFC Version: P2304 (hg:456/095c4982cbea) - * WFC is Copyright 2015-2022, Thomas Maier-Komor + * WFC Version: P2304.3 (hg:459/5fefa02bc543) + * WFC is Copyright 2015-2023, Thomas Maier-Komor * * Source Information: * =================== @@ -10,7 +10,7 @@ * Copyright: 2018-2023 * Author : Thomas Maier-Komor * - * Code generated on 2023-10-24, 21:26:41 (CET). + * Code generated on 2023-11-26, 14:29:43 (CET). * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -2630,47 +2630,45 @@ int UartSettings::setByName(const char *name, const char *value) set_config_ref_tick((bool)ull); return eptr - value; } - #ifndef CONFIG_ESPTOOLPY_FLASHSIZE_1MB if (*name++ != '.') { return -114; } else if (!strcmp(name,"wl")) { uart_wl_t tmp; - size_t r = parse_ascii_uart_wl_t(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_uart_wl_t(&tmp,value); + if (r > 0) + set_config_wl(tmp); return r; } else if (!strcmp(name,"sb")) { uart_sb_t tmp; - size_t r = parse_ascii_uart_sb_t(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_uart_sb_t(&tmp,value); + if (r > 0) + set_config_sb(tmp); return r; } else if (!strcmp(name,"rts")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_rts(tmp); return r; } else if (!strcmp(name,"cts")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_cts(tmp); return r; } else if (!strcmp(name,"p")) { uart_p_t tmp; - size_t r = parse_ascii_uart_p_t(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_uart_p_t(&tmp,value); + if (r > 0) + set_config_p(tmp); return r; } else if (!strcmp(name,"ref_tick")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_ref_tick(tmp); return r; } - #endif // !CONFIG_ESPTOOLPY_FLASHSIZE_1MB } if (0 == strcmp(name,"rx_thresh")) { if (value == 0) { @@ -4036,23 +4034,21 @@ int EventTimer::setByName(const char *name, const char *value) set_config_autostart((bool)ull); return eptr - value; } - #ifndef CONFIG_ESPTOOLPY_FLASHSIZE_1MB if (*name++ != '.') { return -186; } else if (!strcmp(name,"restart")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_restart(tmp); return r; } else if (!strcmp(name,"autostart")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_autostart(tmp); return r; } - #endif // !CONFIG_ESPTOOLPY_FLASHSIZE_1MB } return -187; } diff --git a/components/wfc/swcfg_esp32.h b/components/wfc/swcfg_esp32.h index aebfe88..af25939 100644 --- a/components/wfc/swcfg_esp32.h +++ b/components/wfc/swcfg_esp32.h @@ -1,8 +1,8 @@ /**************************************************************************** * * Code generated by Wire-Format-Compiler (WFC) - * WFC Version: P2304 (hg:456/095c4982cbea) - * WFC is Copyright 2015-2022, Thomas Maier-Komor + * WFC Version: P2304.3 (hg:459/5fefa02bc543) + * WFC is Copyright 2015-2023, Thomas Maier-Komor * * Source Information: * =================== @@ -10,7 +10,7 @@ * Copyright: 2018-2023 * Author : Thomas Maier-Komor * - * Code generated on 2023-10-24, 21:26:41 (CET). + * Code generated on 2023-11-26, 14:29:43 (CET). * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/components/wfc/swcfg_esp8266.cpp b/components/wfc/swcfg_esp8266.cpp index 0501df1..192976f 100644 --- a/components/wfc/swcfg_esp8266.cpp +++ b/components/wfc/swcfg_esp8266.cpp @@ -1,8 +1,8 @@ /**************************************************************************** * * Code generated by Wire-Format-Compiler (WFC) - * WFC Version: P2304 (hg:456/095c4982cbea) - * WFC is Copyright 2015-2022, Thomas Maier-Komor + * WFC Version: P2304.3 (hg:459/5fefa02bc543) + * WFC is Copyright 2015-2023, Thomas Maier-Komor * * Source Information: * =================== @@ -10,7 +10,7 @@ * Copyright: 2018-2023 * Author : Thomas Maier-Komor * - * Code generated on 2023-10-24, 21:26:41 (CET). + * Code generated on 2023-11-26, 14:29:43 (CET). * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -2392,47 +2392,45 @@ int UartSettings::setByName(const char *name, const char *value) set_config_ref_tick((bool)ull); return eptr - value; } - #ifndef CONFIG_ESPTOOLPY_FLASHSIZE_1MB if (*name++ != '.') { return -92; } else if (!strcmp(name,"wl")) { uart_wl_t tmp; - size_t r = parse_ascii_uart_wl_t(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_uart_wl_t(&tmp,value); + if (r > 0) + set_config_wl(tmp); return r; } else if (!strcmp(name,"sb")) { uart_sb_t tmp; - size_t r = parse_ascii_uart_sb_t(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_uart_sb_t(&tmp,value); + if (r > 0) + set_config_sb(tmp); return r; } else if (!strcmp(name,"rts")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_rts(tmp); return r; } else if (!strcmp(name,"cts")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_cts(tmp); return r; } else if (!strcmp(name,"p")) { uart_p_t tmp; - size_t r = parse_ascii_uart_p_t(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_uart_p_t(&tmp,value); + if (r > 0) + set_config_p(tmp); return r; } else if (!strcmp(name,"ref_tick")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_ref_tick(tmp); return r; } - #endif // !CONFIG_ESPTOOLPY_FLASHSIZE_1MB } if (0 == strcmp(name,"rx_thresh")) { if (value == 0) { @@ -3617,23 +3615,21 @@ int EventTimer::setByName(const char *name, const char *value) set_config_autostart((bool)ull); return eptr - value; } - #ifndef CONFIG_ESPTOOLPY_FLASHSIZE_1MB if (*name++ != '.') { return -155; } else if (!strcmp(name,"restart")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_restart(tmp); return r; } else if (!strcmp(name,"autostart")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_autostart(tmp); return r; } - #endif // !CONFIG_ESPTOOLPY_FLASHSIZE_1MB } return -156; } diff --git a/components/wfc/swcfg_esp8266.h b/components/wfc/swcfg_esp8266.h index 3b77d9e..080ace1 100644 --- a/components/wfc/swcfg_esp8266.h +++ b/components/wfc/swcfg_esp8266.h @@ -1,8 +1,8 @@ /**************************************************************************** * * Code generated by Wire-Format-Compiler (WFC) - * WFC Version: P2304 (hg:456/095c4982cbea) - * WFC is Copyright 2015-2022, Thomas Maier-Komor + * WFC Version: P2304.3 (hg:459/5fefa02bc543) + * WFC is Copyright 2015-2023, Thomas Maier-Komor * * Source Information: * =================== @@ -10,7 +10,7 @@ * Copyright: 2018-2023 * Author : Thomas Maier-Komor * - * Code generated on 2023-10-24, 21:26:41 (CET). + * Code generated on 2023-11-26, 14:29:43 (CET). * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/components/wfc/swcfg_esp8285.cpp b/components/wfc/swcfg_esp8285.cpp index 6ab6ba2..71e5c35 100644 --- a/components/wfc/swcfg_esp8285.cpp +++ b/components/wfc/swcfg_esp8285.cpp @@ -1,8 +1,8 @@ /**************************************************************************** * * Code generated by Wire-Format-Compiler (WFC) - * WFC Version: P2304 (hg:456/095c4982cbea) - * WFC is Copyright 2015-2022, Thomas Maier-Komor + * WFC Version: P2304.3 (hg:459/5fefa02bc543) + * WFC is Copyright 2015-2023, Thomas Maier-Komor * * Source Information: * =================== @@ -10,7 +10,7 @@ * Copyright: 2018-2023 * Author : Thomas Maier-Komor * - * Code generated on 2023-10-24, 21:26:41 (CET). + * Code generated on 2023-11-26, 14:29:43 (CET). * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -2357,47 +2357,45 @@ int UartSettings::setByName(const char *name, const char *value) set_config_ref_tick((bool)ull); return eptr - value; } - #ifndef CONFIG_ESPTOOLPY_FLASHSIZE_1MB if (*name++ != '.') { return -90; } else if (!strcmp(name,"wl")) { uart_wl_t tmp; - size_t r = parse_ascii_uart_wl_t(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_uart_wl_t(&tmp,value); + if (r > 0) + set_config_wl(tmp); return r; } else if (!strcmp(name,"sb")) { uart_sb_t tmp; - size_t r = parse_ascii_uart_sb_t(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_uart_sb_t(&tmp,value); + if (r > 0) + set_config_sb(tmp); return r; } else if (!strcmp(name,"rts")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_rts(tmp); return r; } else if (!strcmp(name,"cts")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_cts(tmp); return r; } else if (!strcmp(name,"p")) { uart_p_t tmp; - size_t r = parse_ascii_uart_p_t(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_uart_p_t(&tmp,value); + if (r > 0) + set_config_p(tmp); return r; } else if (!strcmp(name,"ref_tick")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_ref_tick(tmp); return r; } - #endif // !CONFIG_ESPTOOLPY_FLASHSIZE_1MB } if (0 == strcmp(name,"rx_thresh")) { if (value == 0) { @@ -3582,23 +3580,21 @@ int EventTimer::setByName(const char *name, const char *value) set_config_autostart((bool)ull); return eptr - value; } - #ifndef CONFIG_ESPTOOLPY_FLASHSIZE_1MB if (*name++ != '.') { return -153; } else if (!strcmp(name,"restart")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_restart(tmp); return r; } else if (!strcmp(name,"autostart")) { bool tmp; - size_t r = parse_ascii_bool(&tmp,value); - if (r) - set_config(tmp); + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_autostart(tmp); return r; } - #endif // !CONFIG_ESPTOOLPY_FLASHSIZE_1MB } return -154; } diff --git a/components/wfc/swcfg_esp8285.h b/components/wfc/swcfg_esp8285.h index 89f20f2..f991221 100644 --- a/components/wfc/swcfg_esp8285.h +++ b/components/wfc/swcfg_esp8285.h @@ -1,8 +1,8 @@ /**************************************************************************** * * Code generated by Wire-Format-Compiler (WFC) - * WFC Version: P2304 (hg:456/095c4982cbea) - * WFC is Copyright 2015-2022, Thomas Maier-Komor + * WFC Version: P2304.3 (hg:459/5fefa02bc543) + * WFC is Copyright 2015-2023, Thomas Maier-Komor * * Source Information: * =================== @@ -10,7 +10,7 @@ * Copyright: 2018-2023 * Author : Thomas Maier-Komor * - * Code generated on 2023-10-24, 21:26:41 (CET). + * Code generated on 2023-11-26, 14:29:43 (CET). * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/components/wfc/swcfg_pc.cpp b/components/wfc/swcfg_pc.cpp index f4cebf9..d1f6514 100644 --- a/components/wfc/swcfg_pc.cpp +++ b/components/wfc/swcfg_pc.cpp @@ -1,8 +1,8 @@ /**************************************************************************** * * Code generated by Wire-Format-Compiler (WFC) - * WFC Version: P2304 (hg:456/095c4982cbea) - * WFC is Copyright 2015-2022, Thomas Maier-Komor + * WFC Version: P2304.3 (hg:459/5fefa02bc543) + * WFC is Copyright 2015-2023, Thomas Maier-Komor * * Source Information: * =================== @@ -10,7 +10,7 @@ * Copyright: 2018-2023 * Author : Thomas Maier-Komor * - * Code generated on 2023-10-24, 21:26:42 (CET). + * Code generated on 2023-11-26, 14:29:43 (CET). * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -2794,8 +2794,45 @@ int UartSettings::setByName(const char *name, const char *value) else if (!strcmp(name,"ref_tick")) set_config_ref_tick((bool)ull); return eptr - value; - } else { + } + if (*name++ != '.') { return -114; + } else if (!strcmp(name,"wl")) { + uart_wl_t tmp; + int r = parse_ascii_uart_wl_t(&tmp,value); + if (r > 0) + set_config_wl(tmp); + return r; + } else if (!strcmp(name,"sb")) { + uart_sb_t tmp; + int r = parse_ascii_uart_sb_t(&tmp,value); + if (r > 0) + set_config_sb(tmp); + return r; + } else if (!strcmp(name,"rts")) { + bool tmp; + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_rts(tmp); + return r; + } else if (!strcmp(name,"cts")) { + bool tmp; + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_cts(tmp); + return r; + } else if (!strcmp(name,"p")) { + uart_p_t tmp; + int r = parse_ascii_uart_p_t(&tmp,value); + if (r > 0) + set_config_p(tmp); + return r; + } else if (!strcmp(name,"ref_tick")) { + bool tmp; + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_ref_tick(tmp); + return r; } } if (0 == strcmp(name,"rx_thresh")) { @@ -4403,8 +4440,21 @@ int EventTimer::setByName(const char *name, const char *value) else if (!strcmp(name,"autostart")) set_config_autostart((bool)ull); return eptr - value; - } else { + } + if (*name++ != '.') { return -186; + } else if (!strcmp(name,"restart")) { + bool tmp; + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_restart(tmp); + return r; + } else if (!strcmp(name,"autostart")) { + bool tmp; + int r = parse_ascii_bool(&tmp,value); + if (r > 0) + set_config_autostart(tmp); + return r; } } return -187; diff --git a/components/wfc/swcfg_pc.h b/components/wfc/swcfg_pc.h index 6415558..3fe5261 100644 --- a/components/wfc/swcfg_pc.h +++ b/components/wfc/swcfg_pc.h @@ -1,8 +1,8 @@ /**************************************************************************** * * Code generated by Wire-Format-Compiler (WFC) - * WFC Version: P2304 (hg:456/095c4982cbea) - * WFC is Copyright 2015-2022, Thomas Maier-Komor + * WFC Version: P2304.3 (hg:459/5fefa02bc543) + * WFC is Copyright 2015-2023, Thomas Maier-Komor * * Source Information: * =================== @@ -10,7 +10,7 @@ * Copyright: 2018-2023 * Author : Thomas Maier-Komor * - * Code generated on 2023-10-24, 21:26:42 (CET). + * Code generated on 2023-11-26, 14:29:43 (CET). * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/components/wfc/wfccore_esp32.cpp b/components/wfc/wfccore_esp32.cpp index 252769b..0a20aa1 100644 --- a/components/wfc/wfccore_esp32.cpp +++ b/components/wfc/wfccore_esp32.cpp @@ -1,8 +1,8 @@ /**************************************************************************** * * Code generated by Wire-Format-Compiler (WFC) - * WFC Version: P2304 (hg:456/095c4982cbea) - * WFC is Copyright 2015-2022, Thomas Maier-Komor + * WFC Version: P2304.3 (hg:459/5fefa02bc543) + * WFC is Copyright 2015-2023, Thomas Maier-Komor * * Source Information: * =================== @@ -10,7 +10,7 @@ * Copyright: 2018-2023 * Author : Thomas Maier-Komor * - * Code generated on 2023-10-24, 21:26:41 (CET). + * Code generated on 2023-11-26, 14:29:43 (CET). * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/components/wfc/wfccore_esp32.h b/components/wfc/wfccore_esp32.h index 12c7775..3bb2fba 100644 --- a/components/wfc/wfccore_esp32.h +++ b/components/wfc/wfccore_esp32.h @@ -1,8 +1,8 @@ /**************************************************************************** * * Code generated by Wire-Format-Compiler (WFC) - * WFC Version: P2304 (hg:456/095c4982cbea) - * WFC is Copyright 2015-2022, Thomas Maier-Komor + * WFC Version: P2304.3 (hg:459/5fefa02bc543) + * WFC is Copyright 2015-2023, Thomas Maier-Komor * * Source Information: * =================== @@ -10,7 +10,7 @@ * Copyright: 2018-2023 * Author : Thomas Maier-Komor * - * Code generated on 2023-10-24, 21:26:41 (CET). + * Code generated on 2023-11-26, 14:29:43 (CET). * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/components/wfc/wfccore_esp8266.cpp b/components/wfc/wfccore_esp8266.cpp index 51fa0ea..bab7969 100644 --- a/components/wfc/wfccore_esp8266.cpp +++ b/components/wfc/wfccore_esp8266.cpp @@ -1,8 +1,8 @@ /**************************************************************************** * * Code generated by Wire-Format-Compiler (WFC) - * WFC Version: P2304 (hg:456/095c4982cbea) - * WFC is Copyright 2015-2022, Thomas Maier-Komor + * WFC Version: P2304.3 (hg:459/5fefa02bc543) + * WFC is Copyright 2015-2023, Thomas Maier-Komor * * Source Information: * =================== @@ -10,7 +10,7 @@ * Copyright: 2018-2023 * Author : Thomas Maier-Komor * - * Code generated on 2023-10-24, 21:26:41 (CET). + * Code generated on 2023-11-26, 14:29:43 (CET). * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/components/wfc/wfccore_esp8266.h b/components/wfc/wfccore_esp8266.h index 1b71ecf..b4c218c 100644 --- a/components/wfc/wfccore_esp8266.h +++ b/components/wfc/wfccore_esp8266.h @@ -1,8 +1,8 @@ /**************************************************************************** * * Code generated by Wire-Format-Compiler (WFC) - * WFC Version: P2304 (hg:456/095c4982cbea) - * WFC is Copyright 2015-2022, Thomas Maier-Komor + * WFC Version: P2304.3 (hg:459/5fefa02bc543) + * WFC is Copyright 2015-2023, Thomas Maier-Komor * * Source Information: * =================== @@ -10,7 +10,7 @@ * Copyright: 2018-2023 * Author : Thomas Maier-Komor * - * Code generated on 2023-10-24, 21:26:41 (CET). + * Code generated on 2023-11-26, 14:29:43 (CET). * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/components/wfc/wfccore_esp8285.cpp b/components/wfc/wfccore_esp8285.cpp index 73c0f68..d4af54b 100644 --- a/components/wfc/wfccore_esp8285.cpp +++ b/components/wfc/wfccore_esp8285.cpp @@ -1,8 +1,8 @@ /**************************************************************************** * * Code generated by Wire-Format-Compiler (WFC) - * WFC Version: P2304 (hg:456/095c4982cbea) - * WFC is Copyright 2015-2022, Thomas Maier-Komor + * WFC Version: P2304.3 (hg:459/5fefa02bc543) + * WFC is Copyright 2015-2023, Thomas Maier-Komor * * Source Information: * =================== @@ -10,7 +10,7 @@ * Copyright: 2018-2023 * Author : Thomas Maier-Komor * - * Code generated on 2023-10-24, 21:26:42 (CET). + * Code generated on 2023-11-26, 14:29:43 (CET). * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/components/wfc/wfccore_esp8285.h b/components/wfc/wfccore_esp8285.h index dca26d9..846c3e3 100644 --- a/components/wfc/wfccore_esp8285.h +++ b/components/wfc/wfccore_esp8285.h @@ -1,8 +1,8 @@ /**************************************************************************** * * Code generated by Wire-Format-Compiler (WFC) - * WFC Version: P2304 (hg:456/095c4982cbea) - * WFC is Copyright 2015-2022, Thomas Maier-Komor + * WFC Version: P2304.3 (hg:459/5fefa02bc543) + * WFC is Copyright 2015-2023, Thomas Maier-Komor * * Source Information: * =================== @@ -10,7 +10,7 @@ * Copyright: 2018-2023 * Author : Thomas Maier-Komor * - * Code generated on 2023-10-24, 21:26:42 (CET). + * Code generated on 2023-11-26, 14:29:43 (CET). * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/components/wfc/wfccore_pc.cpp b/components/wfc/wfccore_pc.cpp index 6b0dd26..5d016ce 100644 --- a/components/wfc/wfccore_pc.cpp +++ b/components/wfc/wfccore_pc.cpp @@ -1,8 +1,8 @@ /**************************************************************************** * * Code generated by Wire-Format-Compiler (WFC) - * WFC Version: P2304 (hg:456/095c4982cbea) - * WFC is Copyright 2015-2022, Thomas Maier-Komor + * WFC Version: P2304.3 (hg:459/5fefa02bc543) + * WFC is Copyright 2015-2023, Thomas Maier-Komor * * Source Information: * =================== @@ -10,7 +10,7 @@ * Copyright: 2018-2023 * Author : Thomas Maier-Komor * - * Code generated on 2023-10-24, 21:26:42 (CET). + * Code generated on 2023-11-26, 14:29:43 (CET). * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/components/wfc/wfccore_pc.h b/components/wfc/wfccore_pc.h index 8198fcd..0ebea6d 100644 --- a/components/wfc/wfccore_pc.h +++ b/components/wfc/wfccore_pc.h @@ -1,8 +1,8 @@ /**************************************************************************** * * Code generated by Wire-Format-Compiler (WFC) - * WFC Version: P2304 (hg:456/095c4982cbea) - * WFC is Copyright 2015-2022, Thomas Maier-Komor + * WFC Version: P2304.3 (hg:459/5fefa02bc543) + * WFC is Copyright 2015-2023, Thomas Maier-Komor * * Source Information: * =================== @@ -10,7 +10,7 @@ * Copyright: 2018-2023 * Author : Thomas Maier-Komor * - * Code generated on 2023-10-24, 21:26:42 (CET). + * Code generated on 2023-11-26, 14:29:43 (CET). * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/drv/display/CMakeLists.txt b/drv/display/CMakeLists.txt index 8ae3170..d6a605c 100644 --- a/drv/display/CMakeLists.txt +++ b/drv/display/CMakeLists.txt @@ -1,5 +1,6 @@ idf_component_register( - SRCS display.cpp hd44780u.cpp ledcluster.cpp ssd130x.cpp fonts_row_major.c fonts_byte_column_major.c font6x8_ssd130x.c glyphs.c + SRCS display.cpp hd44780u.cpp ledcluster.cpp ssd130x.cpp + fonts.c font6x8_ssd130x.c INCLUDE_DIRS . REQUIRES i2c logging ) diff --git a/drv/display/FreeMono12pt7b.h b/drv/display/FreeMono12pt7b.h index 7fcc507..2503857 100644 --- a/drv/display/FreeMono12pt7b.h +++ b/drv/display/FreeMono12pt7b.h @@ -1,4 +1,4 @@ -const uint8_t FreeMono12pt7bBitmaps[] = { +const uint8_t FreeMono12Bitmaps[] = { 0x49, 0x24, 0x92, 0x48, 0x01, 0xF8, 0xE7, 0xE7, 0x67, 0x42, 0x42, 0x42, 0x42, 0x09, 0x02, 0x41, 0x10, 0x44, 0x11, 0x1F, 0xF1, 0x10, 0x4C, 0x12, 0x3F, 0xE1, 0x20, 0x48, 0x12, 0x04, 0x81, 0x20, 0x48, 0x04, 0x07, 0xA2, @@ -122,7 +122,7 @@ const uint8_t FreeMono12pt7bBitmaps[] = { 0xC0, 0xFF, 0xFF, 0xC0, 0xC1, 0x08, 0x42, 0x10, 0x84, 0x10, 0x4C, 0x42, 0x10, 0x84, 0x26, 0x00, 0x38, 0x13, 0x38, 0x38}; -const GFXglyph FreeMono12pt7bGlyphs[] = { +const GFXglyph FreeMono12Glyphs[] = { {0, 0, 0, 14, 0, 1}, // 0x20 ' ' {0, 3, 15, 14, 6, -14}, // 0x21 '!' {6, 8, 7, 14, 3, -14}, // 0x22 '"' @@ -219,8 +219,8 @@ const GFXglyph FreeMono12pt7bGlyphs[] = { {1444, 5, 18, 14, 5, -14}, // 0x7D '}' {1456, 10, 3, 14, 2, -7}}; // 0x7E '~' -//const Font FreeMono12pt7b = {(uint8_t *)FreeMono12pt7bBitmaps, -// (GFXglyph *)FreeMono12pt7bGlyphs, 0x20, -// 0x7E, 24}; +GFXfont FreeMono12pt7b = {"FreeMono12",(uint8_t *)FreeMono12Bitmaps, + (GFXglyph *)FreeMono12Glyphs, 0x20, + 0x7E, 24}; // Approx. 2132 bytes diff --git a/drv/display/FreeMono18pt7b.h b/drv/display/FreeMono18pt7b.h index b02f12d..9a6422a 100644 --- a/drv/display/FreeMono18pt7b.h +++ b/drv/display/FreeMono18pt7b.h @@ -1,4 +1,4 @@ -const uint8_t FreeMono18pt7bBitmaps[] = { +const uint8_t FreeMono18Bitmaps[] = { 0x27, 0x77, 0x77, 0x77, 0x77, 0x22, 0x22, 0x20, 0x00, 0x6F, 0xF6, 0xF1, 0xFE, 0x3F, 0xC7, 0xF8, 0xFF, 0x1E, 0xC3, 0x98, 0x33, 0x06, 0x60, 0xCC, 0x18, 0x04, 0x20, 0x10, 0x80, 0x42, 0x01, 0x08, 0x04, 0x20, 0x10, 0x80, @@ -258,7 +258,7 @@ const uint8_t FreeMono18pt7bBitmaps[] = { 0x10, 0x10, 0x10, 0x10, 0x10, 0x30, 0xE0, 0x1C, 0x00, 0x44, 0x0D, 0x84, 0x36, 0x04, 0x40, 0x07, 0x00}; -const GFXglyph FreeMono18pt7bGlyphs[] = { +const GFXglyph FreeMono18Glyphs[] = { {0, 0, 0, 21, 0, 1}, // 0x20 ' ' {0, 4, 22, 21, 8, -21}, // 0x21 '!' {11, 11, 10, 21, 5, -20}, // 0x22 '"' @@ -355,8 +355,8 @@ const GFXglyph FreeMono18pt7bGlyphs[] = { {3054, 8, 25, 21, 7, -20}, // 0x7D '}' {3079, 15, 5, 21, 3, -11}}; // 0x7E '~' -//const Font FreeMono18pt7b = {(uint8_t *)FreeMono18pt7bBitmaps, -// (GFXglyph *)FreeMono18pt7bGlyphs, 0x20, -// 0x7E, 35}; +GFXfont FreeMono18pt7b = {"FreeMono18",(uint8_t *)FreeMono18Bitmaps, + (GFXglyph *)FreeMono18Glyphs, 0x20, + 0x7E, 35}; // Approx. 3761 bytes diff --git a/drv/display/FreeMono24pt7b.h b/drv/display/FreeMono24pt7b.h index 7c69bd8..d1e4ec0 100644 --- a/drv/display/FreeMono24pt7b.h +++ b/drv/display/FreeMono24pt7b.h @@ -1,4 +1,4 @@ -const uint8_t FreeMono24pt7bBitmaps[] = { +const uint8_t FreeMono24Bitmaps[] = { 0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0x10, 0x84, 0x21, 0x08, 0x00, 0x00, 0x00, 0x03, 0xBF, 0xFF, 0xB8, 0xFE, 0x7F, 0x7C, 0x3E, 0x7C, 0x3E, 0x7C, 0x3E, 0x7C, 0x3E, 0x7C, 0x3E, 0x7C, 0x3E, 0x7C, 0x3E, 0x3C, @@ -472,7 +472,7 @@ const uint8_t FreeMono24pt7bBitmaps[] = { 0xF8, 0x1C, 0x00, 0x0F, 0x00, 0x03, 0xFC, 0x03, 0x70, 0xE0, 0x76, 0x07, 0x8E, 0xC0, 0x1F, 0xC0, 0x00, 0xF0}; -const GFXglyph FreeMono24pt7bGlyphs[] = { +const GFXglyph FreeMono24Glyphs[] = { {0, 0, 0, 28, 0, 1}, // 0x20 ' ' {0, 5, 30, 28, 11, -28}, // 0x21 '!' {19, 16, 14, 28, 6, -28}, // 0x22 '"' @@ -569,8 +569,8 @@ const GFXglyph FreeMono24pt7bGlyphs[] = { {5596, 11, 34, 28, 9, -27}, // 0x7D '}' {5643, 20, 6, 28, 4, -15}}; // 0x7E '~' -//const Font FreeMono24pt7b = {(uint8_t *)FreeMono24pt7bBitmaps, -// (GFXglyph *)FreeMono24pt7bGlyphs, 0x20, -// 0x7E, 47}; +GFXfont FreeMono24pt7b = {"FreeMono24",(uint8_t *)FreeMono24Bitmaps, + (GFXglyph *)FreeMono24Glyphs, 0x20, + 0x7E, 47}; // Approx. 6330 bytes diff --git a/drv/display/FreeMono9pt7b.h b/drv/display/FreeMono9pt7b.h index 26ca423..a3754de 100644 --- a/drv/display/FreeMono9pt7b.h +++ b/drv/display/FreeMono9pt7b.h @@ -1,4 +1,4 @@ -const uint8_t FreeMono9pt7bBitmaps[] = { +const uint8_t FreeMono9Bitmaps[] = { 0xAA, 0xA8, 0x0C, 0xED, 0x24, 0x92, 0x48, 0x24, 0x48, 0x91, 0x2F, 0xE4, 0x89, 0x7F, 0x28, 0x51, 0x22, 0x40, 0x08, 0x3E, 0x62, 0x40, 0x30, 0x0E, 0x01, 0x81, 0xC3, 0xBE, 0x08, 0x08, 0x71, 0x12, 0x23, 0x80, 0x23, 0xB8, @@ -71,7 +71,7 @@ const uint8_t FreeMono9pt7bBitmaps[] = { 0xBF, 0x29, 0x24, 0xA2, 0x49, 0x26, 0xFF, 0xF8, 0x89, 0x24, 0x8A, 0x49, 0x2C, 0x61, 0x24, 0x30}; -const GFXglyph FreeMono9pt7bGlyphs[] = { +const GFXglyph FreeMono9Glyphs[] = { {0, 0, 0, 11, 0, 1}, // 0x20 ' ' {0, 2, 11, 11, 4, -10}, // 0x21 '!' {3, 6, 5, 11, 2, -10}, // 0x22 '"' @@ -168,8 +168,8 @@ const GFXglyph FreeMono9pt7bGlyphs[] = { {836, 3, 13, 11, 4, -10}, // 0x7D '}' {841, 7, 3, 11, 2, -6}}; // 0x7E '~' -//const Font FreeMono9pt7b = {(uint8_t *)FreeMono9pt7bBitmaps, -// (GFXglyph *)FreeMono9pt7bGlyphs, 0x20, -// 0x7E, 18}; +GFXfont FreeMono9pt7b = {"FreeMono9",(uint8_t *)FreeMono9Bitmaps, + (GFXglyph *)FreeMono9Glyphs, 0x20, + 0x7E, 18}; // Approx. 1516 bytes diff --git a/drv/display/FreeSans12pt7b.h b/drv/display/FreeSans12pt7b.h index e0c87ec..662c341 100644 --- a/drv/display/FreeSans12pt7b.h +++ b/drv/display/FreeSans12pt7b.h @@ -167,7 +167,7 @@ const uint8_t FreeSans12pt7bBitmaps[] = { 0x8C, 0x63, 0x18, 0xC6, 0x73, 0x00, 0x70, 0x3E, 0x09, 0xE4, 0x1F, 0x03, 0x80}; -const GFXglyph FreeSans12pt7bGlyphs[] = { +const GFXglyph FreeSans12Glyphs[] = { {0, 0, 0, 6, 0, 1}, // 0x20 ' ' {0, 2, 18, 8, 3, -17}, // 0x21 '!' {5, 6, 6, 8, 1, -16}, // 0x22 '"' @@ -264,12 +264,12 @@ const GFXglyph FreeSans12pt7bGlyphs[] = { {1947, 5, 23, 8, 2, -17}, // 0x7D '}' {1962, 10, 5, 12, 1, -10}}; // 0x7E '~' -//const Font FreeSans12pt7b = {(uint8_t *)FreeSans12pt7bBitmaps, -// (GFXglyph *)FreeSans12pt7bGlyphs, 0x20, -// 0x7E, 20}; +GFXfont FreeSans12pt7b = {"FreeSans12",(uint8_t *)FreeSans12pt7bBitmaps, + (GFXglyph *)FreeSans12Glyphs, 0x20, + 0x7E, 20}; /* extern uint8_t FreeSans12pt7b_SSD1306[]; -const Font FreeSans12pt7b_ssd1306 = {(uint8_t *)FreeSans12pt7b_SSD1306 +GFXfont FreeSans12pt7b_ssd1306 = {(uint8_t *)FreeSans12pt7b_SSD1306 (GFXglyph *)FreeSans12pt7bGlyphs, 0x20, 0x7E, 29}; */ diff --git a/drv/display/FreeSans9pt7b.h b/drv/display/FreeSans9pt7b.h index 467d798..9c24ccb 100644 --- a/drv/display/FreeSans9pt7b.h +++ b/drv/display/FreeSans9pt7b.h @@ -96,7 +96,7 @@ const uint8_t FreeSans9pt7bBitmaps[] = { 0xCE, 0x66, 0x66, 0x66, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xC6, 0x66, 0x66, 0x67, 0x37, 0x66, 0x66, 0x66, 0xC0, 0x61, 0x24, 0x38}; -const GFXglyph FreeSans9pt7bGlyphs[] = { +const GFXglyph FreeSans9Glyphs[] = { {0, 0, 0, 5, 0, 1}, // 0x20 ' ' {0, 2, 13, 6, 2, -12}, // 0x21 '!' {4, 5, 4, 6, 1, -12}, // 0x22 '"' @@ -193,8 +193,8 @@ const GFXglyph FreeSans9pt7bGlyphs[] = { {1138, 4, 17, 6, 1, -12}, // 0x7D '}' {1147, 7, 3, 9, 1, -7}}; // 0x7E '~' -//const Font FreeSans9pt7b = {(uint8_t *)FreeSans9pt7bBitmaps, -// (GFXglyph *)FreeSans9pt7bGlyphs, 0x20, -// 0x7E, 22}; +GFXfont FreeSans9pt7b = {"FreeSans9",(uint8_t *)FreeSans9pt7bBitmaps, + (GFXglyph *)FreeSans9Glyphs, 0x20, + 0x7E, 22}; // Approx. 1822 bytes diff --git a/drv/display/Org_01.h b/drv/display/Org_01.h index 5472182..0fd11b4 100644 --- a/drv/display/Org_01.h +++ b/drv/display/Org_01.h @@ -26,7 +26,7 @@ const uint8_t Org_01Bitmaps[] = { 0x99, 0x97, 0x8C, 0x6B, 0xF0, 0x96, 0x69, 0x99, 0x9F, 0x10, 0x2E, 0x8F, 0x2B, 0x22, 0xF8, 0x89, 0xA8, 0x0F, 0xE0}; -const GFXglyph Org_01Glyphs[] = {{0, 0, 0, 6, 0, 1}, // 0x20 ' ' +const GFXglyph Org01Glyphs[] = {{0, 0, 0, 6, 0, 1}, // 0x20 ' ' {0, 1, 5, 2, 0, -4}, // 0x21 '!' {1, 3, 1, 4, 0, -4}, // 0x22 '"' {2, 5, 5, 6, 0, -4}, // 0x23 '#' @@ -122,7 +122,7 @@ const GFXglyph Org_01Glyphs[] = {{0, 0, 0, 6, 0, 1}, // 0x20 ' ' {267, 3, 5, 4, 0, -4}, // 0x7D '}' {269, 5, 3, 6, 0, -3}}; // 0x7E '~' -//const Font Org_01 = {(uint8_t *)Org_01Bitmaps, -// (GFXglyph *)Org_01Glyphs, 0x20, 0x7E, 7}; +GFXfont Org_01 = {"Org01",(uint8_t *)Org_01Bitmaps, + (GFXglyph *)Org01Glyphs, 0x20, 0x7E, 7}; // Approx. 943 bytes diff --git a/drv/display/TomThumb.h b/drv/display/TomThumb.h index 0b8bb31..d10f773 100644 --- a/drv/display/TomThumb.h +++ b/drv/display/TomThumb.h @@ -467,5 +467,5 @@ const GFXglyph TomThumbGlyphs[] = { #endif /* (TOMTHUMB_USE_EXTENDED) */ }; -//const Font TomThumb = {(uint8_t *)TomThumbBitmaps, -// (GFXglyph *)TomThumbGlyphs, 0x20, 0x7E, 6}; +GFXfont TomThumb = {"TomThumb",(uint8_t *)TomThumbBitmaps, + (GFXglyph *)TomThumbGlyphs, 0x20, 0x7E, 6}; diff --git a/drv/display/display.cpp b/drv/display/display.cpp index 2b719c5..624f28f 100644 --- a/drv/display/display.cpp +++ b/drv/display/display.cpp @@ -492,7 +492,7 @@ void MatrixDisplay::drawBitmap(uint16_t x, uint16_t y, uint16_t w, uint16_t h, c } -static uint8_t charToGlyph(char c) +uint8_t charToGlyph(char c) { switch ((unsigned char) c) { case '\r': @@ -500,21 +500,21 @@ static uint8_t charToGlyph(char c) case '\n': return 0; case 176: // '°' - return 133; + return 127; case 196: // 'Ä' - return 130; + return 129; case 220: // 'Ü' - return 128; + return 133; case 214: // 'Ö' - return 132; + return 131; case 223: // 'ß' return 134; case 228: // 'ä' - return 129; + return 128; case 246: // 'ö' - return 131; + return 130; case 252: // 'ü' - return 127; + return 132; default: return c; } @@ -524,17 +524,12 @@ static uint8_t charToGlyph(char c) uint16_t MatrixDisplay::charWidth(char c) const { c = charToGlyph(c); - if (c == 0) - return 0; - /* - const Font *font = Fonts+(int)m_font; - if ((c < font->first) || (c > font->last)) - return 0; - */ - uint8_t ch = c - m_font->first; - if (m_font->glyph == 0) - return 6; - return m_font->glyph[ch].xAdvance; + if (c >= m_font->first) { + uint8_t ch = c - m_font->first; + if (m_font->glyph != 0) + return m_font->glyph[ch].xAdvance; + } + return 0; } @@ -558,7 +553,7 @@ unsigned MatrixDisplay::drawChar(uint16_t x, uint16_t y, char c, int32_t fg, int if (bg == -1) bg = m_colbg; uint8_t ch = c - m_font->first; - const uint8_t *data = m_font->bitmap + m_font->glyph[ch].bitmapOffset; + const uint8_t *data = m_font->RMbitmap + m_font->glyph[ch].bitmapOffset; uint8_t w = m_font->glyph[ch].width; uint8_t h = m_font->glyph[ch].height; int8_t dx = m_font->glyph[ch].xOffset; @@ -566,18 +561,18 @@ unsigned MatrixDisplay::drawChar(uint16_t x, uint16_t y, char c, int32_t fg, int uint8_t a = m_font->glyph[ch].xAdvance; log_dbug(TAG,"drawChar(%d,%d,'%c') = %u",x,y,c,a); // log_info(TAG,"%d/%d %+d/%+d, adv %u len %u",(int)w,(int)h,(int)dx,(int)dy,a,l); - if (bg != -1) + if (bg != -2) fillRect(x,y,a,m_font->yAdvance,bg); - drawBitmap(x+dx,y+dy+m_font->yAdvance-1,w,h,data,fg,bg); + drawBitmap(x+dx,y+dy,w,h,data,fg,bg); return a; } unsigned MatrixDisplay::drawText(uint16_t x, uint16_t y, const char *txt, int n, int32_t fg, int32_t bg) { - log_dbug(TAG,"drawText(%d,%d,'%s')",x,y,txt); if (n < 0) n = strlen(txt); + log_dbug(TAG,"drawText(%d,%d,'%.*s',%d,%d)",x,y,n,txt,fg,bg); uint16_t a = 0, amax = 0; const char *e = txt + n; while (txt != e) { @@ -597,9 +592,14 @@ unsigned MatrixDisplay::drawText(uint16_t x, uint16_t y, const char *txt, int n, amax = a; a = 0; x = 0; + } else if (c == 0xc2) { + // first byte of a 2-byte utf-8 + // used for degree symbol \u00b0 i.e. + // 0xc2 0xb0 + continue; } else { uint16_t cw = charWidth(c); - if (m_posx + cw > m_width) + if (x + cw > m_width) break; drawChar(x,y,c,fg,bg); a += cw; @@ -837,8 +837,8 @@ int32_t MatrixDisplay::setBgColor(color_t c) int MatrixDisplay::setFont(unsigned f) { - if (f < NumFontsRM) { - m_font = FontsRM+f; + if (f < NumFonts) { + m_font = Fonts+f; return 0; } return -1; @@ -857,9 +857,9 @@ int MatrixDisplay::setFont(const char *fn) return 0; } */ - for (int i = 0; i < NumFontsRM; ++i) { - if (0 == strcasecmp(FontsRM[i].name,fn)) { - m_font = FontsRM+i; + for (int i = 0; i < NumFonts; ++i) { + if (0 == strcasecmp(Fonts[i].name,fn)) { + m_font = Fonts+i; return 0; } } @@ -867,6 +867,39 @@ int MatrixDisplay::setFont(const char *fn) } +int MatrixDisplay::setupOffScreen(uint16_t x, uint16_t y, uint16_t w, uint16_t h, int32_t bg) +{ + return -1; +} + + +void MatrixDisplay::commitOffScreen() +{ +} + + +unsigned MatrixDisplay::textWidth(const char *t, int f) +{ + // uses row-major font + if (f >= NumFonts) + return 0; + const Font *font; + if (f == -1) + font = m_font; + else + font = &Fonts[f]; + unsigned w = 0; + unsigned s = font->first; + unsigned e = font->last; + while (char c = *t) { + if ((c >= s) && (c <= e)) + w += font->glyph[c-s].xAdvance; + ++c; + } + return w; +} + + void MatrixDisplay::write(const char *txt, int n) { log_dbug(TAG,"write '%s' at %u/%u",txt,m_posx,m_posy); @@ -882,7 +915,7 @@ void MatrixDisplay::write(const char *txt, int n) --n; } if (at != txt) { - m_posx += drawText(m_posx,m_posy,txt,at-txt,-1,-1); + m_posx += drawText(m_posx,m_posy,txt,at-txt,-1,-2); txt = at; if (m_posx >= m_width) { m_posx = m_width - 1; diff --git a/drv/display/display.h b/drv/display/display.h index a3a9f4d..ad190c9 100644 --- a/drv/display/display.h +++ b/drv/display/display.h @@ -39,6 +39,7 @@ typedef enum colorspace_e #define COLOR_NONE -2 +uint8_t charToGlyph(char c); color_t color_get(const char *); struct TextDisplay @@ -149,6 +150,13 @@ struct MatrixDisplay : public TextDisplay { } + explicit MatrixDisplay(colorspace_t cs, uint32_t fg, uint32_t bg) + : m_colorspace(cs) + , m_colfg(fg) + , m_colbg(bg) + { + } + MatrixDisplay *toMatrixDisplay() override { return this; } @@ -167,18 +175,23 @@ struct MatrixDisplay : public TextDisplay virtual int setFont(unsigned); virtual int setFont(const char *); + Font *getFont() const + { return m_font; } uint16_t charWidth(char c) const override; uint16_t fontHeight() const; void clrEol() override; uint16_t charsPerLine() const override - { return m_width/8; } + { return m_width>>3; } uint16_t numLines() const override { return m_height/fontHeight(); } virtual void setPixel(uint16_t x, uint16_t y, int32_t color) { } + virtual int setupOffScreen(uint16_t x, uint16_t y, uint16_t w, uint16_t h, int32_t bg = -1); + virtual void commitOffScreen(); + // col = -1: use default color (m_colfg/m_colbg) // col = -2 for bg: do not fill virtual void fillRect(uint16_t x, uint16_t y, uint16_t w, uint16_t h, int32_t col = -1); @@ -194,6 +207,8 @@ struct MatrixDisplay : public TextDisplay virtual unsigned drawText(uint16_t x, uint16_t y, const char *txt, int n = -1, int32_t fg = -1, int32_t bg = -1); virtual unsigned drawChar(uint16_t x, uint16_t y, char c, int32_t fg, int32_t bg); + unsigned textWidth(const char *, int font = -1); + virtual int setInvert(bool) { return -1; } @@ -234,7 +249,7 @@ struct MatrixDisplay : public TextDisplay // clip x/y-low/high uint16_t m_clxl = 0, m_clxh = 0xffff, m_clyl = 0, m_clyh = 0xffff; #endif - const Font *m_font = 0; + Font *m_font = 0; colorspace_t m_colorspace; int32_t m_colfg, m_colbg; }; diff --git a/drv/display/font.h b/drv/display/font.h index e002f93..62309d2 100644 --- a/drv/display/font.h +++ b/drv/display/font.h @@ -22,11 +22,21 @@ typedef struct { /// Data stored for FONT AS A WHOLE typedef struct { const char *name; - const uint8_t *bitmap; ///< Glyph bitmaps, concatenated - GFXglyph *glyph; ///< Glyph array + const uint8_t *bitmap; ///< Glyph bitmaps, concatenated, in row-major format + const GFXglyph *glyph; ///< Glyph array uint16_t first; ///< ASCII extents (first char) uint16_t last; ///< ASCII extents (last char) uint8_t yAdvance; ///< Newline distance (y axis) +} GFXfont; + +typedef struct { + const uint8_t *RMbitmap; ///< Glyph bitmaps, concatenated, in row-major format + const uint8_t *BCMbitmap; ///< Glyph bitmaps, concatenated, in byte-column major format + const GFXglyph *glyph; ///< Glyph array + uint8_t first; ///< ASCII extents (first char) + uint8_t last; ///< ASCII extents (last char) + uint8_t yAdvance; ///< Newline distance (y axis) + const char name[17]; } Font; typedef enum { @@ -35,10 +45,10 @@ typedef enum { font_mono9 = 0, font_mono12, font_mono18, - font_mono24, +// font_mono24, font_tomthumb, - font_sans9, - font_sans12, +// font_sans9, +// font_sans12, font_sanslight10, font_sanslight12, font_sanslight14, diff --git a/drv/display/font6x8_ssd130x.c b/drv/display/font6x8_ssd130x.c index 5449f78..30aa77e 100644 --- a/drv/display/font6x8_ssd130x.c +++ b/drv/display/font6x8_ssd130x.c @@ -96,13 +96,13 @@ const unsigned char Font6x8[] = { 0x00, 0x00, 0x00, 0x63, 0x00, 0x00, // '¦' 0x00, 0x00, 0x41, 0x77, 0x08, 0x00, // '}' 0x00, 0x08, 0x04, 0x08, 0x08, 0x04, // '~' - 0x00, 0x3D, 0x40, 0x40, 0x20, 0x7D, // 'ü' - 0x00, 0x3D, 0x40, 0x40, 0x40, 0x3D, // 'Ü' + 0x00, 0x02, 0x05, 0x02, 0x00, 0x00, // '°' 0x00, 0x21, 0x54, 0x54, 0x54, 0x79, // 'ä' 0x00, 0x7D, 0x12, 0x11, 0x12, 0x7D, // 'Ä' 0x00, 0x39, 0x44, 0x44, 0x44, 0x39, // 'ö' 0x00, 0x3D, 0x42, 0x42, 0x42, 0x3D, // 'Ö' - 0x00, 0x02, 0x05, 0x02, 0x00, 0x00, // '°' + 0x00, 0x3D, 0x40, 0x40, 0x20, 0x7D, // 'ü' + 0x00, 0x3D, 0x40, 0x40, 0x40, 0x3D, // 'Ü' 0x00, 0x7E, 0x01, 0x49, 0x55, 0x73, // 'ß' }; diff --git a/drv/display/fonts.c b/drv/display/fonts.c new file mode 100644 index 0000000..215ea79 --- /dev/null +++ b/drv/display/fonts.c @@ -0,0 +1,7465 @@ +#include +#include "font.h" + + +//#define PROGMEM + + + + +const GFXglyph FreeMono9Glyphs[] = { + // off, w, h, xa, xo, yo + { 0, 0, 0, 11, 0, 12 }, // ' ' + { 0, 2, 11, 11, 4, 1 }, // '!' + { 3, 6, 5, 11, 2, 1 }, // '"' + { 7, 7, 12, 11, 2, 1 }, // '#' + { 18, 8, 12, 11, 1, 1 }, // '$' + { 30, 7, 11, 11, 2, 1 }, // '%' + { 40, 7, 10, 11, 2, 2 }, // '&' + { 49, 3, 5, 11, 4, 1 }, // ''' + { 51, 2, 13, 11, 5, 1 }, // '(' + { 55, 2, 13, 11, 4, 1 }, // ')' + { 59, 7, 7, 11, 2, 1 }, // '*' + { 66, 7, 7, 11, 2, 3 }, // '+' + { 73, 3, 5, 11, 2, 10 }, // ',' + { 75, 9, 1, 11, 1, 6 }, // '-' + { 77, 2, 2, 11, 4, 10 }, // '.' + { 78, 7, 13, 11, 2, 0 }, // '/' + { 90, 7, 11, 11, 2, 1 }, // '0' + { 100, 5, 11, 11, 3, 1 }, // '1' + { 107, 7, 11, 11, 2, 1 }, // '2' + { 117, 8, 11, 11, 1, 1 }, // '3' + { 128, 6, 11, 11, 3, 1 }, // '4' + { 137, 7, 11, 11, 2, 1 }, // '5' + { 147, 7, 11, 11, 2, 1 }, // '6' + { 157, 7, 11, 11, 2, 1 }, // '7' + { 167, 7, 11, 11, 2, 1 }, // '8' + { 177, 7, 11, 11, 2, 1 }, // '9' + { 187, 2, 8, 11, 4, 4 }, // ':' + { 189, 3, 11, 11, 3, 4 }, // ';' + { 194, 8, 8, 11, 1, 3 }, // '<' + { 202, 9, 4, 11, 1, 5 }, // '=' + { 207, 9, 8, 11, 1, 3 }, // '>' + { 216, 7, 10, 11, 2, 2 }, // '?' + { 225, 8, 12, 11, 2, 1 }, // '@' + { 237, 11, 10, 11, 0, 2 }, // 'A' + { 251, 9, 10, 11, 1, 2 }, // 'B' + { 263, 9, 10, 11, 1, 2 }, // 'C' + { 275, 9, 10, 11, 1, 2 }, // 'D' + { 287, 9, 10, 11, 1, 2 }, // 'E' + { 299, 9, 10, 11, 1, 2 }, // 'F' + { 311, 10, 10, 11, 1, 2 }, // 'G' + { 324, 9, 10, 11, 1, 2 }, // 'H' + { 336, 5, 10, 11, 3, 2 }, // 'I' + { 343, 8, 10, 11, 2, 2 }, // 'J' + { 353, 9, 10, 11, 1, 2 }, // 'K' + { 365, 8, 10, 11, 2, 2 }, // 'L' + { 375, 11, 10, 11, 0, 2 }, // 'M' + { 389, 9, 10, 11, 1, 2 }, // 'N' + { 401, 9, 10, 11, 1, 2 }, // 'O' + { 413, 8, 10, 11, 1, 2 }, // 'P' + { 423, 9, 13, 11, 1, 2 }, // 'Q' + { 438, 9, 10, 11, 1, 2 }, // 'R' + { 450, 7, 10, 11, 2, 2 }, // 'S' + { 459, 9, 10, 11, 1, 2 }, // 'T' + { 471, 9, 10, 11, 1, 2 }, // 'U' + { 483, 11, 10, 11, 0, 2 }, // 'V' + { 497, 11, 10, 11, 0, 2 }, // 'W' + { 511, 9, 10, 11, 1, 2 }, // 'X' + { 523, 9, 10, 11, 1, 2 }, // 'Y' + { 535, 7, 10, 11, 2, 2 }, // 'Z' + { 544, 2, 13, 11, 5, 1 }, // '[' + { 548, 7, 13, 11, 2, 0 }, // '\' + { 560, 2, 13, 11, 4, 1 }, // ']' + { 564, 7, 5, 11, 2, 1 }, // '^' + { 569, 11, 1, 11, 0, 13 }, // '_' + { 571, 3, 3, 11, 3, 0 }, // '`' + { 573, 9, 8, 11, 1, 4 }, // 'a' + { 582, 9, 11, 11, 1, 1 }, // 'b' + { 595, 7, 8, 11, 2, 4 }, // 'c' + { 602, 9, 11, 11, 1, 1 }, // 'd' + { 615, 8, 8, 11, 1, 4 }, // 'e' + { 623, 6, 11, 11, 3, 1 }, // 'f' + { 632, 9, 11, 11, 1, 4 }, // 'g' + { 645, 9, 11, 11, 1, 1 }, // 'h' + { 658, 7, 10, 11, 2, 2 }, // 'i' + { 667, 5, 13, 11, 3, 2 }, // 'j' + { 676, 8, 11, 11, 2, 1 }, // 'k' + { 687, 7, 11, 11, 2, 1 }, // 'l' + { 697, 9, 8, 11, 1, 4 }, // 'm' + { 706, 9, 8, 11, 1, 4 }, // 'n' + { 715, 9, 8, 11, 1, 4 }, // 'o' + { 724, 9, 11, 11, 1, 4 }, // 'p' + { 737, 9, 11, 11, 1, 4 }, // 'q' + { 750, 7, 8, 11, 3, 4 }, // 'r' + { 757, 7, 8, 11, 2, 4 }, // 's' + { 764, 8, 10, 11, 2, 2 }, // 't' + { 774, 8, 8, 11, 1, 4 }, // 'u' + { 782, 9, 8, 11, 1, 4 }, // 'v' + { 791, 9, 8, 11, 1, 4 }, // 'w' + { 800, 9, 8, 11, 1, 4 }, // 'x' + { 809, 9, 11, 11, 1, 4 }, // 'y' + { 822, 7, 8, 11, 2, 4 }, // 'z' + { 829, 3, 13, 11, 4, 1 }, // '{' + { 834, 1, 13, 11, 5, 1 }, // '|' + { 836, 3, 13, 11, 4, 1 }, // '}' + { 841, 7, 3, 11, 2, 5 }, // '~' +}; + +const uint8_t FreeMono9_BCM[] = { + + // ' ' (0x20) 0x0, offset 0-0, at +0/+1 + + // '!' (0x21) 2x11, offset 0-3, at +4/-10 + 0x7f, 0x04, 0x20, + + // '"' (0x22) 6x5, offset 3-7, at +2/-10 + 0xe1, 0x07, 0xf0, 0x03, + + // '#' (0x23) 7x12, offset 7-18, at +2/-10 + 0x90, 0x00, 0xc9, 0xff, 0x03, 0x09, 0x90, 0xff, + 0x0f, 0x90, 0x00, + + // '$' (0x24) 8x12, offset 18-30, at +1/-10 + 0x80, 0xc3, 0x10, 0x16, 0x22, 0x21, 0x23, 0x2e, + 0x22, 0x26, 0x03, 0x1c, + + // '%' (0x25) 7x11, offset 30-40, at +2/-10 + 0x46, 0x48, 0x42, 0xd2, 0x52, 0x69, 0x4a, 0x50, + 0x42, 0x0c, + + // '&' (0x26) 7x10, offset 40-49, at +2/-9 + 0xe0, 0xf9, 0x1c, 0x61, 0x98, 0x81, 0x01, 0x0b, + 0x22, + + // ''' (0x27) 3x5, offset 49-51, at +4/-10 + 0xe1, 0x07, + + // '(' (0x28) 2x13, offset 51-55, at +5/-10 + 0xfc, 0x67, 0x00, 0x03, + + // ')' (0x29) 2x13, offset 55-59, at +4/-10 + 0x07, 0x1c, 0x7f, 0x00, + + // '*' (0x2a) 7x7, offset 59-66, at +2/-10 + 0x04, 0x24, 0xee, 0x83, 0x42, 0x12, 0x00, + + // '+' (0x2b) 7x7, offset 66-73, at +2/-8 + 0x08, 0x04, 0xe2, 0x8f, 0x40, 0x20, 0x00, + + // ',' (0x2c) 3x5, offset 73-75, at +2/-1 + 0xfc, 0x04, + + // '-' (0x2d) 9x1, offset 75-77, at +1/-5 + 0xff, 0x00, + + // '.' (0x2e) 2x2, offset 77-78, at +4/-1 + 0x0f, + + // '/' (0x2f) 7x13, offset 78-90, at +2/-11 + 0x00, 0x10, 0x80, 0x01, 0x0c, 0x60, 0x80, 0x03, + 0x1c, 0x40, 0x00, 0x00, + + // '0' (0x30) 7x11, offset 90-100, at +2/-10 + 0xfc, 0x11, 0x50, 0x00, 0x03, 0x18, 0x40, 0x01, + 0xf1, 0x07, + + // '1' (0x31) 5x11, offset 100-107, at +3/-10 + 0x06, 0x14, 0xe0, 0xff, 0x01, 0x08, 0x40, + + // '2' (0x32) 7x11, offset 107-117, at +2/-10 + 0x04, 0x16, 0x68, 0x40, 0x03, 0x19, 0x44, 0x11, + 0x72, 0x10, + + // '3' (0x33) 8x11, offset 117-128, at +1/-10 + 0x00, 0x08, 0x50, 0x00, 0x23, 0x18, 0xc1, 0x19, + 0xba, 0x08, 0x38, + + // '4' (0x34) 6x11, offset 128-137, at +3/-10 + 0xf0, 0x40, 0x84, 0x21, 0x02, 0xf9, 0x7f, 0x40, + 0x02, + + // '5' (0x35) 7x11, offset 137-147, at +2/-10 + 0x00, 0xfa, 0x50, 0x02, 0x13, 0x98, 0xc0, 0x0c, + 0x81, 0x07, + + // '6' (0x36) 7x11, offset 147-157, at +2/-10 + 0xf8, 0x21, 0x9b, 0x04, 0x23, 0x18, 0xc1, 0x10, + 0x05, 0x07, + + // '7' (0x37) 7x11, offset 157-167, at +2/-10 + 0x01, 0x08, 0x40, 0x00, 0x02, 0x1c, 0x9c, 0x1c, + 0x1c, 0x00, + + // '8' (0x38) 7x11, offset 167-177, at +2/-10 + 0x8c, 0x93, 0x52, 0x08, 0x43, 0x18, 0x42, 0x29, + 0x31, 0x0e, + + // '9' (0x39) 7x11, offset 177-187, at +2/-10 + 0x1c, 0x14, 0x61, 0x10, 0x83, 0x18, 0x24, 0x9b, + 0xf0, 0x03, + + // ':' (0x3a) 2x8, offset 187-189, at +4/-7 + 0xc3, 0xc3, + + // ';' (0x3b) 3x11, offset 189-194, at +3/-7 + 0x00, 0x1f, 0xcf, 0x08, 0x00, + + // '<' (0x3c) 8x8, offset 194-202, at +1/-8 + 0x00, 0x18, 0x18, 0x24, 0x24, 0x42, 0x81, 0x81, + + // '=' (0x3d) 9x4, offset 202-207, at +1/-6 + 0x99, 0x99, 0x99, 0x99, 0x09, + + // '>' (0x3e) 9x8, offset 207-216, at +1/-8 + 0x00, 0x81, 0x42, 0x42, 0x24, 0x24, 0x18, 0x08, + 0x00, + + // '?' (0x3f) 7x10, offset 216-225, at +2/-9 + 0x02, 0x08, 0x10, 0x40, 0x88, 0x11, 0x66, 0xe0, + 0x00, + + // '@' (0x40) 8x12, offset 225-237, at +2/-10 + 0xfc, 0x23, 0x40, 0x71, 0x18, 0x89, 0x89, 0xb8, + 0x88, 0xfe, 0x00, 0x08, + + // 'A' (0x41) 11x10, offset 237-251, at +0/-9 + 0x00, 0x02, 0x1c, 0x6e, 0x96, 0x47, 0x04, 0xe1, + 0x04, 0x9c, 0x80, 0x03, 0x08, 0x20, + + // 'B' (0x42) 9x10, offset 251-263, at +1/-9 + 0x01, 0xfe, 0x1f, 0x61, 0x84, 0x11, 0x46, 0xb8, + 0xa1, 0xcb, 0xc0, 0x01, + + // 'C' (0x43) 9x10, offset 263-275, at +1/-9 + 0x7c, 0x18, 0x36, 0x50, 0x80, 0x01, 0x06, 0x18, + 0xa0, 0x80, 0x07, 0x01, + + // 'D' (0x44) 9x10, offset 275-287, at +1/-9 + 0x01, 0xfe, 0x1f, 0x60, 0x80, 0x01, 0x06, 0x38, + 0xb0, 0x61, 0xfc, 0x00, + + // 'E' (0x45) 9x10, offset 287-299, at +1/-9 + 0x01, 0xfe, 0x1f, 0x61, 0x84, 0x11, 0xe6, 0x18, + 0xe0, 0x80, 0x80, 0x03, + + // 'F' (0x46) 9x10, offset 299-311, at +1/-9 + 0x01, 0xfe, 0x1f, 0x61, 0x84, 0x11, 0xe4, 0x10, + 0x40, 0x00, 0x03, 0x00, + + // 'G' (0x47) 10x10, offset 311-324, at +1/-9 + 0xfc, 0x18, 0x26, 0x50, 0x80, 0x01, 0x06, 0x18, + 0xa2, 0x88, 0xe7, 0x81, 0x00, + + // 'H' (0x48) 9x10, offset 324-336, at +1/-9 + 0x01, 0xfe, 0x1f, 0x21, 0x04, 0x10, 0x40, 0x10, + 0xe1, 0xff, 0x01, 0x02, + + // 'I' (0x49) 5x10, offset 336-343, at +3/-9 + 0x01, 0x06, 0xf8, 0x7f, 0x80, 0x01, 0x02, + + // 'J' (0x4a) 8x10, offset 343-353, at +2/-9 + 0xc0, 0x01, 0x0c, 0x60, 0x80, 0x01, 0x06, 0xf4, + 0x5f, 0x00, + + // 'K' (0x4b) 9x10, offset 353-365, at +1/-9 + 0x01, 0xfe, 0x1f, 0x22, 0x04, 0x18, 0x90, 0x30, + 0x4c, 0xc0, 0x01, 0x02, + + // 'L' (0x4c) 8x10, offset 365-375, at +2/-9 + 0x01, 0xfe, 0x1f, 0x20, 0x80, 0x00, 0x02, 0x08, + 0x20, 0xf0, + + // 'M' (0x4d) 11x10, offset 375-389, at +0/-9 + 0x01, 0xfe, 0x3f, 0x20, 0x03, 0x30, 0x00, 0x01, + 0x03, 0x03, 0x03, 0xfe, 0x1f, 0x20, + + // 'N' (0x4e) 9x10, offset 389-401, at +1/-9 + 0x01, 0xfe, 0x2f, 0x20, 0x03, 0x30, 0x00, 0x13, + 0xd0, 0xff, 0x01, 0x00, + + // 'O' (0x4f) 9x10, offset 401-413, at +1/-9 + 0x78, 0x18, 0x26, 0x50, 0x80, 0x01, 0x06, 0x38, + 0xb0, 0x61, 0x78, 0x00, + + // 'P' (0x50) 8x10, offset 413-423, at +1/-9 + 0x01, 0xfe, 0x1f, 0x62, 0x88, 0x21, 0x84, 0x30, + 0x81, 0x03, + + // 'Q' (0x51) 9x13, offset 423-438, at +1/-9 + 0x78, 0xc0, 0x30, 0x08, 0xec, 0x00, 0x17, 0xa0, + 0x02, 0x94, 0xc0, 0x34, 0x8c, 0x78, 0x08, + + // 'R' (0x52) 9x10, offset 438-450, at +1/-9 + 0x01, 0xfe, 0x1f, 0x62, 0x08, 0x21, 0x84, 0x31, + 0x89, 0xc3, 0x00, 0x02, + + // 'S' (0x53) 7x10, offset 450-459, at +2/-9 + 0x80, 0x3b, 0x34, 0x61, 0x84, 0x21, 0x8a, 0x7c, + 0x1c, + + // 'T' (0x54) 9x10, offset 459-471, at +1/-9 + 0x07, 0x04, 0x10, 0x60, 0x80, 0xff, 0x07, 0x18, + 0x60, 0x00, 0x07, 0x00, + + // 'U' (0x55) 9x10, offset 471-483, at +1/-9 + 0x01, 0xfc, 0x13, 0x10, 0x80, 0x00, 0x02, 0x18, + 0xd0, 0x3f, 0x01, 0x00, + + // 'V' (0x56) 11x10, offset 483-497, at +0/-9 + 0x01, 0x0c, 0xd0, 0x41, 0x18, 0x80, 0x01, 0x0c, + 0x4c, 0x0c, 0x0f, 0x04, 0x10, 0x00, + + // 'W' (0x57) 11x10, offset 497-511, at +0/-9 + 0x01, 0x7c, 0x10, 0x7e, 0x70, 0x38, 0x10, 0x80, + 0x47, 0xe0, 0xf9, 0x1f, 0x10, 0x00, + + // 'X' (0x58) 9x10, offset 511-523, at +1/-9 + 0x01, 0x0e, 0x5c, 0x2c, 0x0a, 0x30, 0x20, 0x51, + 0xe8, 0xc0, 0x01, 0x02, + + // 'Y' (0x59) 9x10, offset 523-535, at +1/-9 + 0x01, 0x0c, 0x50, 0x20, 0x86, 0xe0, 0x63, 0x58, + 0xe0, 0x00, 0x01, 0x00, + + // 'Z' (0x5a) 7x10, offset 535-544, at +2/-9 + 0x07, 0x07, 0x1b, 0x62, 0x86, 0x05, 0x0e, 0x08, + 0x38, + + // '[' (0x5b) 2x13, offset 544-548, at +5/-10 + 0xff, 0x3f, 0x00, 0x02, + + // '\' (0x5c) 7x13, offset 548-560, at +2/-11 + 0x01, 0xc0, 0x01, 0xe0, 0x00, 0x60, 0x00, 0x30, + 0x00, 0x18, 0x00, 0x04, + + // ']' (0x5d) 2x13, offset 560-564, at +4/-10 + 0x01, 0xf0, 0xff, 0x03, + + // '^' (0x5e) 7x5, offset 564-569, at +2/-10 + 0x90, 0x89, 0x60, 0x10, 0x04, + + // '_' (0x5f) 11x1, offset 569-571, at +0/+2 + 0xff, 0x07, + + // '`' (0x60) 3x3, offset 571-573, at +3/-11 + 0x11, 0x01, + + // 'a' (0x61) 9x8, offset 573-582, at +1/-7 + 0x70, 0x91, 0x89, 0x89, 0x89, 0x89, 0x49, 0xfe, + 0x80, + + // 'b' (0x62) 9x11, offset 582-595, at +1/-10 + 0x01, 0xfc, 0x3f, 0x84, 0x10, 0x88, 0x40, 0x04, + 0x22, 0x10, 0x42, 0xe0, 0x01, + + // 'c' (0x63) 7x8, offset 595-602, at +2/-7 + 0x3c, 0x42, 0x81, 0x81, 0x81, 0x82, 0x47, + + // 'd' (0x64) 9x11, offset 602-615, at +1/-10 + 0xe0, 0x81, 0x10, 0x02, 0x11, 0x88, 0x40, 0x04, + 0x46, 0xe8, 0xff, 0x00, 0x04, + + // 'e' (0x65) 8x8, offset 615-623, at +1/-7 + 0x3c, 0x4a, 0xc9, 0x89, 0x89, 0x89, 0x8a, 0x4e, + + // 'f' (0x66) 6x11, offset 623-632, at +3/-10 + 0x08, 0xf4, 0x7f, 0x02, 0x13, 0x98, 0xc0, 0x00, + 0x00, + + // 'g' (0x67) 9x11, offset 632-645, at +1/-7 + 0x3c, 0x10, 0x42, 0x20, 0x02, 0x19, 0xc8, 0x40, + 0x0a, 0xf9, 0x7f, 0x01, 0x00, + + // 'h' (0x68) 9x11, offset 645-658, at +1/-10 + 0x01, 0xfc, 0x3f, 0x04, 0x11, 0x80, 0x00, 0x04, + 0x60, 0x10, 0xfe, 0x00, 0x04, + + // 'i' (0x69) 7x10, offset 658-667, at +2/-9 + 0x00, 0x12, 0x48, 0x60, 0xff, 0x00, 0x02, 0x08, + 0x20, + + // 'j' (0x6a) 5x13, offset 667-676, at +3/-9 + 0x04, 0x90, 0x00, 0x12, 0xc0, 0x02, 0xcc, 0xff, + 0x00, + + // 'k' (0x6b) 8x11, offset 676-687, at +2/-10 + 0x01, 0xfc, 0x3f, 0x10, 0xc0, 0x80, 0x0a, 0x8c, + 0x22, 0x18, 0x81, + + // 'l' (0x6c) 7x11, offset 687-697, at +2/-10 + 0x00, 0x0c, 0x60, 0x00, 0xff, 0x0f, 0x40, 0x00, + 0x02, 0x10, + + // 'm' (0x6d) 9x8, offset 697-706, at +1/-7 + 0xff, 0x82, 0x01, 0x01, 0xfe, 0x01, 0x01, 0x01, + 0xfe, + + // 'n' (0x6e) 9x8, offset 706-715, at +1/-7 + 0x80, 0xff, 0x82, 0x01, 0x01, 0x01, 0x83, 0xfe, + 0x80, + + // 'o' (0x6f) 9x8, offset 715-724, at +1/-7 + 0x3c, 0x42, 0xc3, 0x81, 0x81, 0x81, 0xc3, 0x42, + 0x3c, + + // 'p' (0x70) 9x11, offset 724-737, at +1/-7 + 0x01, 0xfc, 0xbf, 0x10, 0x03, 0x11, 0x88, 0x40, + 0x04, 0x42, 0x08, 0x3c, 0x00, + + // 'q' (0x71) 9x11, offset 737-750, at +1/-7 + 0x3c, 0x10, 0x42, 0x20, 0x02, 0x11, 0x88, 0x40, + 0x08, 0xf1, 0xff, 0x01, 0x04, + + // 'r' (0x72) 7x8, offset 750-757, at +3/-7 + 0x81, 0xff, 0x84, 0x82, 0x81, 0x01, 0x01, + + // 's' (0x73) 7x8, offset 757-764, at +2/-7 + 0xe0, 0x4e, 0x89, 0x89, 0x91, 0x92, 0x77, + + // 't' (0x74) 8x10, offset 764-774, at +2/-9 + 0x04, 0xfc, 0x47, 0x20, 0x81, 0x04, 0x12, 0x08, + 0x20, 0x40, + + // 'u' (0x75) 8x8, offset 774-782, at +1/-7 + 0x01, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x41, 0xff, + + // 'v' (0x76) 9x8, offset 782-791, at +1/-7 + 0x01, 0x07, 0x19, 0x60, 0x80, 0x60, 0x1d, 0x03, + 0x01, + + // 'w' (0x77) 9x8, offset 791-800, at +1/-7 + 0x03, 0x7d, 0xc1, 0x38, 0x1c, 0x60, 0xc1, 0x3f, + 0x01, + + // 'x' (0x78) 9x8, offset 800-809, at +1/-7 + 0x81, 0xc3, 0xa3, 0x14, 0x08, 0x14, 0xa3, 0xc1, + 0x80, + + // 'y' (0x79) 9x11, offset 809-822, at +1/-7 + 0x01, 0x3c, 0x60, 0x06, 0xc1, 0x0e, 0x4c, 0x18, + 0x34, 0x60, 0x00, 0x01, 0x00, + + // 'z' (0x7a) 7x8, offset 822-829, at +2/-7 + 0x03, 0xe1, 0x91, 0x89, 0x85, 0x83, 0xc0, + + // '{' (0x7b) 3x13, offset 829-834, at +4/-10 + 0x40, 0xc0, 0xf7, 0x07, 0x40, + + // '|' (0x7c) 1x13, offset 834-836, at +5/-10 + 0xff, 0x1f, + + // '}' (0x7d) 3x13, offset 836-841, at +4/-10 + 0x01, 0xd0, 0xf7, 0x03, 0x01, + + // '~' (0x7e) 7x3, offset 841-844, at +2/-6 + 0x4a, 0x44, 0x0a, +}; + +const uint8_t FreeMono9_RM[] = { + + // ' ' (0x20) 0x0, offset 0-0, at +0/+1 + + // '!' (0x21) 2x11, offset 0-3, at +4/-10 + 0xaa, 0xa8, 0x0c, + + // '"' (0x22) 6x5, offset 3-7, at +2/-10 + 0xed, 0x24, 0x92, 0x48, + + // '#' (0x23) 7x12, offset 7-18, at +2/-10 + 0x24, 0x48, 0x91, 0x2f, 0xe4, 0x89, 0x7f, 0x28, + 0x51, 0x22, 0x40, + + // '$' (0x24) 8x12, offset 18-30, at +1/-10 + 0x08, 0x3e, 0x62, 0x40, 0x30, 0x0e, 0x01, 0x81, + 0xc3, 0xbe, 0x08, 0x08, + + // '%' (0x25) 7x11, offset 30-40, at +2/-10 + 0x71, 0x12, 0x23, 0x80, 0x23, 0xb8, 0x0e, 0x22, + 0x44, 0x70, + + // '&' (0x26) 7x10, offset 40-49, at +2/-9 + 0x38, 0x81, 0x02, 0x06, 0x1a, 0x65, 0x46, 0xc8, + 0xec, + + // ''' (0x27) 3x5, offset 49-51, at +4/-10 + 0xe9, 0x24, + + // '(' (0x28) 2x13, offset 51-55, at +5/-10 + 0x5a, 0xaa, 0xa9, 0x40, + + // ')' (0x29) 2x13, offset 55-59, at +4/-10 + 0xa9, 0x55, 0x5a, 0x80, + + // '*' (0x2a) 7x7, offset 59-66, at +2/-10 + 0x10, 0x22, 0x4b, 0xe3, 0x05, 0x11, 0x00, + + // '+' (0x2b) 7x7, offset 66-73, at +2/-8 + 0x10, 0x20, 0x47, 0xf1, 0x02, 0x04, 0x00, + + // ',' (0x2c) 3x5, offset 73-75, at +2/-1 + 0x6b, 0x48, + + // '-' (0x2d) 9x1, offset 75-77, at +1/-5 + 0xff, 0x00, + + // '.' (0x2e) 2x2, offset 77-78, at +4/-1 + 0xf0, + + // '/' (0x2f) 7x13, offset 78-90, at +2/-11 + 0x02, 0x08, 0x10, 0x60, 0x81, 0x04, 0x08, 0x20, + 0x41, 0x02, 0x08, 0x00, + + // '0' (0x30) 7x11, offset 90-100, at +2/-10 + 0x38, 0x8a, 0x0c, 0x18, 0x30, 0x60, 0xc1, 0x82, + 0x88, 0xe0, + + // '1' (0x31) 5x11, offset 100-107, at +3/-10 + 0x27, 0x28, 0x42, 0x10, 0x84, 0x21, 0x3e, + + // '2' (0x32) 7x11, offset 107-117, at +2/-10 + 0x38, 0x8a, 0x08, 0x10, 0x20, 0x82, 0x08, 0x61, + 0x03, 0xf8, + + // '3' (0x33) 8x11, offset 117-128, at +1/-10 + 0x7c, 0x06, 0x02, 0x02, 0x1c, 0x06, 0x01, 0x01, + 0x01, 0x42, 0x3c, + + // '4' (0x34) 6x11, offset 128-137, at +3/-10 + 0x18, 0xa2, 0x92, 0x8a, 0x28, 0xbf, 0x08, 0x21, + 0xc0, + + // '5' (0x35) 7x11, offset 137-147, at +2/-10 + 0x7c, 0x81, 0x03, 0xe4, 0x40, 0x40, 0x81, 0x03, + 0x88, 0xe0, + + // '6' (0x36) 7x11, offset 147-157, at +2/-10 + 0x1e, 0x41, 0x04, 0x0b, 0x98, 0xb0, 0xc1, 0xc2, + 0x88, 0xe0, + + // '7' (0x37) 7x11, offset 157-167, at +2/-10 + 0xfe, 0x04, 0x08, 0x20, 0x40, 0x82, 0x04, 0x08, + 0x20, 0x40, + + // '8' (0x38) 7x11, offset 167-177, at +2/-10 + 0x38, 0x8a, 0x0c, 0x14, 0x47, 0x11, 0x41, 0x83, + 0x8c, 0xe0, + + // '9' (0x39) 7x11, offset 177-187, at +2/-10 + 0x38, 0x8a, 0x1c, 0x18, 0x68, 0xce, 0x81, 0x04, + 0x13, 0xc0, + + // ':' (0x3a) 2x8, offset 187-189, at +4/-7 + 0xf0, 0x0f, + + // ';' (0x3b) 3x11, offset 189-194, at +3/-7 + 0x6c, 0x00, 0xd2, 0xd2, 0x00, + + // '<' (0x3c) 8x8, offset 194-202, at +1/-8 + 0x03, 0x04, 0x18, 0x60, 0x60, 0x18, 0x04, 0x03, + + // '=' (0x3d) 9x4, offset 202-207, at +1/-6 + 0xff, 0x80, 0x00, 0x1f, 0xf0, + + // '>' (0x3e) 9x8, offset 207-216, at +1/-8 + 0x40, 0x18, 0x03, 0x00, 0x60, 0x20, 0x60, 0xc0, + 0x80, + + // '?' (0x3f) 7x10, offset 216-225, at +2/-9 + 0x3d, 0x84, 0x08, 0x30, 0xc2, 0x00, 0x00, 0x00, + 0x30, + + // '@' (0x40) 8x12, offset 225-237, at +2/-10 + 0x3c, 0x46, 0x82, 0x8e, 0xb2, 0xa2, 0xa2, 0x9f, + 0x80, 0x80, 0x40, 0x3c, + + // 'A' (0x41) 11x10, offset 237-251, at +0/-9 + 0x3c, 0x01, 0x40, 0x28, 0x09, 0x01, 0x10, 0x42, + 0x0f, 0xc1, 0x04, 0x40, 0x9e, 0x3c, + + // 'B' (0x42) 9x10, offset 251-263, at +1/-9 + 0xfe, 0x21, 0x90, 0x48, 0x67, 0xe2, 0x09, 0x02, + 0x81, 0x41, 0xff, 0x80, + + // 'C' (0x43) 9x10, offset 263-275, at +1/-9 + 0x3e, 0xb0, 0xf0, 0x30, 0x08, 0x04, 0x02, 0x00, + 0x80, 0x60, 0x8f, 0x80, + + // 'D' (0x44) 9x10, offset 275-287, at +1/-9 + 0xfe, 0x21, 0x90, 0x68, 0x14, 0x0a, 0x05, 0x02, + 0x83, 0x43, 0x7f, 0x00, + + // 'E' (0x45) 9x10, offset 287-299, at +1/-9 + 0xff, 0x20, 0x90, 0x08, 0x87, 0xc2, 0x21, 0x00, + 0x81, 0x40, 0xff, 0xc0, + + // 'F' (0x46) 9x10, offset 299-311, at +1/-9 + 0xff, 0xa0, 0x50, 0x08, 0x87, 0xc2, 0x21, 0x00, + 0x80, 0x40, 0x78, 0x00, + + // 'G' (0x47) 10x10, offset 311-324, at +1/-9 + 0x1e, 0x98, 0x6c, 0x0a, 0x00, 0x80, 0x20, 0xf8, + 0x0b, 0x02, 0x60, 0x87, 0xc0, + + // 'H' (0x48) 9x10, offset 324-336, at +1/-9 + 0xe3, 0xa0, 0x90, 0x48, 0x27, 0xf2, 0x09, 0x04, + 0x82, 0x41, 0x71, 0xc0, + + // 'I' (0x49) 5x10, offset 336-343, at +3/-9 + 0xf9, 0x08, 0x42, 0x10, 0x84, 0x27, 0xc0, + + // 'J' (0x4a) 8x10, offset 343-353, at +2/-9 + 0x1f, 0x02, 0x02, 0x02, 0x02, 0x02, 0x82, 0x82, + 0xc6, 0x78, + + // 'K' (0x4b) 9x10, offset 353-365, at +1/-9 + 0xe3, 0xa1, 0x11, 0x09, 0x05, 0x83, 0x21, 0x08, + 0x84, 0x41, 0x70, 0xc0, + + // 'L' (0x4c) 8x10, offset 365-375, at +2/-9 + 0xe0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x41, 0x41, + 0x41, 0xff, + + // 'M' (0x4d) 11x10, offset 375-389, at +0/-9 + 0xe0, 0xec, 0x19, 0x45, 0x28, 0xa4, 0xa4, 0x94, + 0x91, 0x12, 0x02, 0x40, 0x5c, 0x1c, + + // 'N' (0x4e) 9x10, offset 389-401, at +1/-9 + 0xc3, 0xb0, 0x94, 0x4a, 0x24, 0x92, 0x49, 0x14, + 0x8a, 0x43, 0x70, 0x80, + + // 'O' (0x4f) 9x10, offset 401-413, at +1/-9 + 0x1e, 0x31, 0x90, 0x50, 0x18, 0x0c, 0x06, 0x02, + 0x82, 0x63, 0x0f, 0x00, + + // 'P' (0x50) 8x10, offset 413-423, at +1/-9 + 0xfe, 0x43, 0x41, 0x41, 0x42, 0x7c, 0x40, 0x40, + 0x40, 0xf0, + + // 'Q' (0x51) 9x13, offset 423-438, at +1/-9 + 0x1c, 0x31, 0x90, 0x50, 0x18, 0x0c, 0x06, 0x02, + 0x82, 0x63, 0x1f, 0x04, 0x07, 0x92, 0x30, + + // 'R' (0x52) 9x10, offset 438-450, at +1/-9 + 0xfe, 0x21, 0x90, 0x48, 0x24, 0x23, 0xe1, 0x10, + 0x84, 0x41, 0x70, 0xc0, + + // 'S' (0x53) 7x10, offset 450-459, at +2/-9 + 0x3a, 0xcd, 0x0a, 0x03, 0x01, 0x80, 0xc1, 0xc7, + 0x78, + + // 'T' (0x54) 9x10, offset 459-471, at +1/-9 + 0xff, 0xc4, 0x62, 0x21, 0x00, 0x80, 0x40, 0x20, + 0x10, 0x08, 0x1f, 0x00, + + // 'U' (0x55) 9x10, offset 471-483, at +1/-9 + 0xe3, 0xa0, 0x90, 0x48, 0x24, 0x12, 0x09, 0x04, + 0x82, 0x22, 0x0e, 0x00, + + // 'V' (0x56) 11x10, offset 483-497, at +0/-9 + 0xf1, 0xe8, 0x10, 0x82, 0x10, 0x42, 0x10, 0x22, + 0x04, 0x80, 0x50, 0x0c, 0x00, 0x80, + + // 'W' (0x57) 11x10, offset 497-511, at +0/-9 + 0xf1, 0xe8, 0x09, 0x11, 0x25, 0x44, 0xa8, 0x55, + 0x0c, 0xa1, 0x8c, 0x31, 0x84, 0x30, + + // 'X' (0x58) 9x10, offset 511-523, at +1/-9 + 0xe3, 0xa0, 0x88, 0x82, 0x80, 0x80, 0xc0, 0x90, + 0x44, 0x41, 0x71, 0xc0, + + // 'Y' (0x59) 9x10, offset 523-535, at +1/-9 + 0xe3, 0xa0, 0x88, 0x82, 0x81, 0x40, 0x40, 0x20, + 0x10, 0x08, 0x1f, 0x00, + + // 'Z' (0x5a) 7x10, offset 535-544, at +2/-9 + 0xfd, 0x0a, 0x20, 0x81, 0x04, 0x10, 0x21, 0x83, + 0xfc, + + // '[' (0x5b) 2x13, offset 544-548, at +5/-10 + 0xea, 0xaa, 0xaa, 0xc0, + + // '\' (0x5c) 7x13, offset 548-560, at +2/-11 + 0x80, 0x81, 0x03, 0x02, 0x04, 0x04, 0x08, 0x08, + 0x10, 0x10, 0x20, 0x20, + + // ']' (0x5d) 2x13, offset 560-564, at +4/-10 + 0xd5, 0x55, 0x55, 0xc0, + + // '^' (0x5e) 7x5, offset 564-569, at +2/-10 + 0x10, 0x51, 0x22, 0x28, 0x20, + + // '_' (0x5f) 11x1, offset 569-571, at +0/+2 + 0xff, 0xe0, + + // '`' (0x60) 3x3, offset 571-573, at +3/-11 + 0x88, 0x80, + + // 'a' (0x61) 9x8, offset 573-582, at +1/-7 + 0x7e, 0x00, 0x80, 0x47, 0xec, 0x14, 0x0a, 0x0c, + 0xfb, + + // 'b' (0x62) 9x11, offset 582-595, at +1/-10 + 0xc0, 0x20, 0x10, 0x0b, 0xc6, 0x12, 0x05, 0x02, + 0x81, 0x40, 0xb0, 0xb7, 0x80, + + // 'c' (0x63) 7x8, offset 595-602, at +2/-7 + 0x3a, 0x8e, 0x0c, 0x08, 0x10, 0x10, 0x9e, + + // 'd' (0x64) 9x11, offset 602-615, at +1/-10 + 0x03, 0x00, 0x80, 0x47, 0xa4, 0x34, 0x0a, 0x05, + 0x02, 0x81, 0x21, 0x8f, 0x60, + + // 'e' (0x65) 8x8, offset 615-623, at +1/-7 + 0x3c, 0x43, 0x81, 0xff, 0x80, 0x80, 0x61, 0x3e, + + // 'f' (0x66) 6x11, offset 623-632, at +3/-10 + 0x3d, 0x04, 0x3e, 0x41, 0x04, 0x10, 0x41, 0x0f, + 0x80, + + // 'g' (0x67) 9x11, offset 632-645, at +1/-7 + 0x3d, 0xa1, 0xa0, 0x50, 0x28, 0x14, 0x09, 0x0c, + 0x7a, 0x01, 0x01, 0x87, 0x80, + + // 'h' (0x68) 9x11, offset 645-658, at +1/-10 + 0xc0, 0x20, 0x10, 0x0b, 0xc6, 0x32, 0x09, 0x04, + 0x82, 0x41, 0x20, 0xb8, 0xe0, + + // 'i' (0x69) 7x10, offset 658-667, at +2/-9 + 0x10, 0x01, 0xc0, 0x81, 0x02, 0x04, 0x08, 0x11, + 0xfc, + + // 'j' (0x6a) 5x13, offset 667-676, at +3/-9 + 0x10, 0x3e, 0x10, 0x84, 0x21, 0x08, 0x42, 0x3f, + 0x00, + + // 'k' (0x6b) 8x11, offset 676-687, at +2/-10 + 0xc0, 0x40, 0x40, 0x4f, 0x44, 0x58, 0x70, 0x48, + 0x44, 0x42, 0xc7, + + // 'l' (0x6c) 7x11, offset 687-697, at +2/-10 + 0x70, 0x20, 0x40, 0x81, 0x02, 0x04, 0x08, 0x10, + 0x23, 0xf8, + + // 'm' (0x6d) 9x8, offset 697-706, at +1/-7 + 0xb7, 0x64, 0x62, 0x31, 0x18, 0x8c, 0x46, 0x23, + 0x91, + + // 'n' (0x6e) 9x8, offset 706-715, at +1/-7 + 0x5e, 0x31, 0x90, 0x48, 0x24, 0x12, 0x09, 0x05, + 0xc7, + + // 'o' (0x6f) 9x8, offset 715-724, at +1/-7 + 0x3e, 0x31, 0xa0, 0x30, 0x18, 0x0c, 0x05, 0x8c, + 0x7c, + + // 'p' (0x70) 9x11, offset 724-737, at +1/-7 + 0xde, 0x30, 0x90, 0x28, 0x14, 0x0a, 0x05, 0x84, + 0xbc, 0x40, 0x20, 0x38, 0x00, + + // 'q' (0x71) 9x11, offset 737-750, at +1/-7 + 0x3d, 0xa1, 0xa0, 0x50, 0x28, 0x14, 0x09, 0x0c, + 0x7a, 0x01, 0x00, 0x80, 0xe0, + + // 'r' (0x72) 7x8, offset 750-757, at +3/-7 + 0xce, 0xa1, 0x82, 0x04, 0x08, 0x10, 0x7c, + + // 's' (0x73) 7x8, offset 757-764, at +2/-7 + 0x3a, 0x8d, 0x0b, 0x80, 0xf0, 0x70, 0xde, + + // 't' (0x74) 8x10, offset 764-774, at +2/-9 + 0x40, 0x40, 0xfc, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x41, 0x3e, + + // 'u' (0x75) 8x8, offset 774-782, at +1/-7 + 0xc3, 0x41, 0x41, 0x41, 0x41, 0x41, 0x43, 0x3d, + + // 'v' (0x76) 9x8, offset 782-791, at +1/-7 + 0xe3, 0xa0, 0x90, 0x84, 0x42, 0x20, 0xa0, 0x50, + 0x10, + + // 'w' (0x77) 9x8, offset 791-800, at +1/-7 + 0xe3, 0xc0, 0x92, 0x4b, 0x25, 0x92, 0xa9, 0x98, + 0x44, + + // 'x' (0x78) 9x8, offset 800-809, at +1/-7 + 0xe3, 0x31, 0x05, 0x01, 0x01, 0x41, 0x11, 0x05, + 0xc7, + + // 'y' (0x79) 9x11, offset 809-822, at +1/-7 + 0xe3, 0xa0, 0x90, 0x84, 0x42, 0x40, 0xa0, 0x60, + 0x10, 0x10, 0x08, 0x3e, 0x00, + + // 'z' (0x7a) 7x8, offset 822-829, at +2/-7 + 0xfd, 0x08, 0x20, 0x82, 0x08, 0x10, 0xbf, + + // '{' (0x7b) 3x13, offset 829-834, at +4/-10 + 0x29, 0x24, 0xa2, 0x49, 0x26, + + // '|' (0x7c) 1x13, offset 834-836, at +5/-10 + 0xff, 0xf8, + + // '}' (0x7d) 3x13, offset 836-841, at +4/-10 + 0x89, 0x24, 0x8a, 0x49, 0x2c, + + // '~' (0x7e) 7x3, offset 841-844, at +2/-6 + 0x61, 0x24, 0x30, +}; + +const GFXglyph FreeMono12Glyphs[] = { + // off, w, h, xa, xo, yo + { 0, 0, 0, 14, 0, 16 }, // ' ' + { 0, 3, 15, 14, 6, 1 }, // '!' + { 6, 8, 7, 14, 3, 1 }, // '"' + { 13, 10, 16, 14, 2, 1 }, // '#' + { 33, 10, 17, 14, 2, 1 }, // '$' + { 55, 10, 15, 14, 2, 1 }, // '%' + { 74, 9, 12, 14, 3, 4 }, // '&' + { 88, 3, 7, 14, 5, 1 }, // ''' + { 91, 3, 18, 14, 7, 1 }, // '(' + { 98, 3, 18, 14, 4, 1 }, // ')' + { 105, 9, 9, 14, 3, 1 }, // '*' + { 116, 9, 11, 14, 3, 4 }, // '+' + { 129, 5, 7, 14, 3, 12 }, // ',' + { 134, 11, 1, 14, 2, 9 }, // '-' + { 136, 3, 3, 14, 5, 13 }, // '.' + { 138, 9, 18, 14, 3, 0 }, // '/' + { 159, 9, 15, 14, 3, 1 }, // '0' + { 176, 7, 14, 14, 4, 2 }, // '1' + { 189, 9, 15, 14, 2, 1 }, // '2' + { 206, 10, 15, 14, 2, 1 }, // '3' + { 225, 8, 15, 14, 3, 1 }, // '4' + { 240, 9, 15, 14, 3, 1 }, // '5' + { 257, 9, 15, 14, 3, 1 }, // '6' + { 274, 8, 15, 14, 3, 1 }, // '7' + { 289, 9, 15, 14, 3, 1 }, // '8' + { 306, 9, 15, 14, 3, 1 }, // '9' + { 323, 3, 10, 14, 5, 6 }, // ':' + { 327, 5, 13, 14, 3, 6 }, // ';' + { 336, 11, 11, 14, 2, 4 }, // '<' + { 352, 12, 4, 14, 1, 7 }, // '=' + { 358, 11, 11, 14, 2, 4 }, // '>' + { 374, 9, 14, 14, 3, 2 }, // '?' + { 390, 9, 16, 14, 3, 1 }, // '@' + { 408, 14, 14, 14, 0, 2 }, // 'A' + { 433, 11, 14, 14, 2, 2 }, // 'B' + { 453, 10, 14, 14, 2, 2 }, // 'C' + { 471, 10, 14, 14, 2, 2 }, // 'D' + { 489, 11, 14, 14, 2, 2 }, // 'E' + { 509, 11, 14, 14, 2, 2 }, // 'F' + { 529, 11, 14, 14, 2, 2 }, // 'G' + { 549, 10, 14, 14, 2, 2 }, // 'H' + { 567, 7, 14, 14, 4, 2 }, // 'I' + { 580, 11, 14, 14, 2, 2 }, // 'J' + { 600, 12, 14, 14, 2, 2 }, // 'K' + { 621, 11, 14, 14, 2, 2 }, // 'L' + { 641, 13, 14, 14, 1, 2 }, // 'M' + { 664, 12, 14, 14, 1, 2 }, // 'N' + { 685, 12, 14, 14, 1, 2 }, // 'O' + { 706, 10, 14, 14, 2, 2 }, // 'P' + { 724, 12, 17, 14, 1, 2 }, // 'Q' + { 750, 12, 14, 14, 2, 2 }, // 'R' + { 771, 10, 14, 14, 2, 2 }, // 'S' + { 789, 11, 14, 14, 2, 2 }, // 'T' + { 809, 12, 14, 14, 1, 2 }, // 'U' + { 830, 14, 14, 14, 0, 2 }, // 'V' + { 855, 14, 14, 14, 0, 2 }, // 'W' + { 880, 12, 14, 14, 1, 2 }, // 'X' + { 901, 12, 14, 14, 1, 2 }, // 'Y' + { 922, 9, 14, 14, 3, 2 }, // 'Z' + { 938, 3, 18, 14, 7, 1 }, // '[' + { 945, 9, 18, 14, 3, 0 }, // '\' + { 966, 3, 18, 14, 5, 1 }, // ']' + { 973, 9, 6, 14, 3, 1 }, // '^' + { 980, 14, 1, 14, 0, 18 }, // '_' + { 982, 4, 4, 14, 4, 0 }, // '`' + { 984, 10, 10, 14, 2, 6 }, // 'a' + { 997, 13, 15, 14, 0, 1 }, // 'b' + { 1022, 11, 10, 14, 2, 6 }, // 'c' + { 1036, 11, 15, 14, 2, 1 }, // 'd' + { 1057, 10, 10, 14, 2, 6 }, // 'e' + { 1070, 9, 15, 14, 4, 1 }, // 'f' + { 1087, 11, 14, 14, 2, 6 }, // 'g' + { 1107, 10, 15, 14, 2, 1 }, // 'h' + { 1126, 9, 15, 14, 3, 1 }, // 'i' + { 1143, 7, 19, 14, 3, 1 }, // 'j' + { 1160, 12, 15, 14, 1, 1 }, // 'k' + { 1183, 9, 15, 14, 3, 1 }, // 'l' + { 1200, 13, 10, 14, 1, 6 }, // 'm' + { 1217, 12, 10, 14, 1, 6 }, // 'n' + { 1232, 11, 10, 14, 2, 6 }, // 'o' + { 1246, 12, 14, 14, 1, 6 }, // 'p' + { 1267, 11, 14, 14, 2, 6 }, // 'q' + { 1287, 10, 10, 14, 3, 6 }, // 'r' + { 1300, 10, 10, 14, 2, 6 }, // 's' + { 1313, 11, 14, 14, 1, 2 }, // 't' + { 1333, 11, 10, 14, 2, 6 }, // 'u' + { 1347, 13, 10, 14, 1, 6 }, // 'v' + { 1364, 13, 10, 14, 1, 6 }, // 'w' + { 1381, 12, 10, 14, 1, 6 }, // 'x' + { 1396, 12, 14, 14, 1, 6 }, // 'y' + { 1417, 9, 10, 14, 3, 6 }, // 'z' + { 1429, 5, 18, 14, 5, 1 }, // '{' + { 1441, 1, 18, 14, 7, 1 }, // '|' + { 1444, 5, 18, 14, 5, 1 }, // '}' + { 1456, 10, 3, 14, 2, 8 }, // '~' +}; + +const uint8_t FreeMono12_BCM[] = { + + // ' ' (0x20) 0x0, offset 0-0, at +0/+1 + + // '!' (0x21) 3x15, offset 0-6, at +6/-14 + 0x00, 0xe0, 0xff, 0x31, 0x00, 0x18, + + // '"' (0x22) 8x7, offset 6-13, at +3/-14 + 0x83, 0xff, 0x01, 0x00, 0x38, 0xfc, 0x0f, + + // '#' (0x23) 10x16, offset 13-33, at +2/-14 + 0x00, 0x02, 0x20, 0x02, 0x20, 0x02, 0xfc, 0xff, + 0x23, 0x02, 0x20, 0x02, 0xa0, 0xff, 0xff, 0x02, + 0x20, 0x02, 0x20, 0x00, + + // '$' (0x24) 10x17, offset 33-55, at +2/-14 + 0x00, 0x38, 0x70, 0x20, 0x10, 0x41, 0x10, 0x02, + 0x21, 0x08, 0x62, 0x10, 0xbc, 0x20, 0x08, 0x42, + 0x10, 0x0e, 0x11, 0x00, 0x1c, 0x00, + + // '%' (0x25) 10x15, offset 55-74, at +2/-14 + 0x00, 0x00, 0x8f, 0xc0, 0x4c, 0x20, 0x24, 0x10, + 0xd2, 0x9b, 0x35, 0x7b, 0x0a, 0x01, 0x85, 0x40, + 0x66, 0x20, 0x1e, + + // '&' (0x26) 9x12, offset 74-88, at +3/-11 + 0xc0, 0xe3, 0xc6, 0x33, 0x18, 0x84, 0x81, 0x19, + 0x60, 0x81, 0x0f, 0x84, 0x40, 0x00, + + // ''' (0x27) 3x7, offset 88-91, at +5/-14 + 0x83, 0xff, 0x01, + + // '(' (0x28) 3x18, offset 91-98, at +7/-14 + 0xe0, 0x1f, 0x70, 0x80, 0x23, 0x00, 0x30, + + // ')' (0x29) 3x18, offset 98-105, at +4/-14 + 0x02, 0x00, 0xf3, 0x80, 0x03, 0xfc, 0x01, + + // '*' (0x2a) 9x9, offset 105-116, at +3/-14 + 0x08, 0x20, 0x42, 0x82, 0xe3, 0x03, 0x1a, 0x44, + 0x08, 0x00, 0x00, + + // '+' (0x2b) 9x11, offset 116-129, at +3/-11 + 0x20, 0x00, 0x01, 0x08, 0x40, 0xf0, 0x7f, 0x10, + 0x80, 0x00, 0x04, 0x20, 0x00, + + // ',' (0x2c) 5x7, offset 129-134, at +3/-3 + 0x70, 0xdf, 0xe7, 0x10, 0x00, + + // '-' (0x2d) 11x1, offset 134-136, at +2/-6 + 0xff, 0x07, + + // '.' (0x2e) 3x3, offset 136-138, at +5/-2 + 0xff, 0x01, + + // '/' (0x2f) 9x18, offset 138-159, at +3/-15 + 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, + 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x80, + 0x03, 0x00, 0x03, 0x00, 0x00, + + // '0' (0x30) 9x15, offset 159-176, at +3/-14 + 0xf8, 0x0f, 0x07, 0x98, 0x00, 0x28, 0x00, 0x18, + 0x00, 0x0c, 0x00, 0x0a, 0x80, 0x1c, 0x70, 0xf8, + 0x0f, + + // '1' (0x31) 7x14, offset 176-189, at +4/-13 + 0x08, 0xa0, 0x01, 0x38, 0x00, 0xfe, 0xff, 0x00, + 0x20, 0x00, 0x08, 0x00, 0x02, + + // '2' (0x32) 9x15, offset 189-206, at +2/-14 + 0x00, 0x60, 0x06, 0xb8, 0x00, 0x36, 0x80, 0x19, + 0x60, 0x0c, 0x18, 0x06, 0x02, 0xcd, 0x80, 0x3c, + 0x70, + + // '3' (0x33) 10x15, offset 206-225, at +2/-14 + 0x00, 0x00, 0x01, 0x50, 0x00, 0x38, 0x00, 0x18, + 0x04, 0x0c, 0x02, 0x06, 0x01, 0x45, 0x41, 0x1c, + 0x31, 0x00, 0x0f, + + // '4' (0x34) 8x15, offset 225-240, at +3/-14 + 0x00, 0x07, 0x60, 0x02, 0x0c, 0x01, 0x81, 0x60, + 0x40, 0x0c, 0x20, 0xfe, 0xff, 0x01, 0x88, + + // '5' (0x35) 9x15, offset 240-257, at +3/-14 + 0x00, 0xb0, 0x3f, 0x50, 0x10, 0x30, 0x04, 0x18, + 0x02, 0x0c, 0x01, 0x86, 0x81, 0x82, 0x61, 0x80, + 0x0f, + + // '6' (0x36) 9x15, offset 257-274, at +3/-14 + 0xe0, 0x07, 0x8c, 0x0d, 0x21, 0x48, 0x08, 0x38, + 0x04, 0x0c, 0x02, 0x06, 0x03, 0x03, 0x63, 0x01, + 0x1f, + + // '7' (0x37) 8x15, offset 274-289, at +3/-14 + 0x07, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, + 0x80, 0x0f, 0x3c, 0xe4, 0x01, 0x0e, 0x00, + + // '8' (0x38) 9x15, offset 289-306, at +3/-14 + 0x3c, 0x1e, 0xa3, 0xd0, 0x50, 0x38, 0x10, 0x18, + 0x08, 0x0c, 0x04, 0x0e, 0x85, 0x8d, 0x62, 0x3c, + 0x1e, + + // '9' (0x39) 9x15, offset 306-323, at +3/-14 + 0x7c, 0x40, 0x63, 0xe0, 0x40, 0x30, 0x20, 0x18, + 0x10, 0x0e, 0x08, 0x09, 0x42, 0xd8, 0x18, 0xf0, + 0x03, + + // ':' (0x3a) 3x10, offset 323-327, at +5/-9 + 0x87, 0x1f, 0x7e, 0x38, + + // ';' (0x3b) 5x13, offset 327-336, at +3/-9 + 0x00, 0x00, 0xc0, 0x1f, 0xbe, 0xc3, 0x71, 0x00, + 0x00, + + // '<' (0x3c) 11x11, offset 336-352, at +2/-11 + 0x20, 0x80, 0x01, 0x14, 0x90, 0x80, 0x08, 0x42, + 0x18, 0x44, 0x60, 0x01, 0x0a, 0x20, 0x00, 0x00, + + // '=' (0x3d) 12x4, offset 352-358, at +1/-8 + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + + // '>' (0x3e) 11x11, offset 358-374, at +2/-11 + 0x01, 0x0c, 0x90, 0x80, 0x04, 0x42, 0x10, 0x42, + 0x20, 0x03, 0x0b, 0x30, 0x00, 0x01, 0x00, 0x00, + + // '?' (0x3f) 9x14, offset 374-390, at +3/-13 + 0x06, 0x80, 0x00, 0x10, 0x00, 0x04, 0xc0, 0x81, + 0x71, 0x10, 0x1c, 0x04, 0x88, 0x00, 0x1c, 0x00, + + // '@' (0x40) 9x16, offset 390-408, at +3/-14 + 0xf8, 0x1f, 0x06, 0x60, 0x02, 0xc0, 0x81, 0x83, + 0x41, 0x86, 0x21, 0x84, 0x22, 0x84, 0xfc, 0x07, + 0x00, 0x04, + + // 'A' (0x41) 14x14, offset 408-433, at +0/-13 + 0x00, 0x20, 0x00, 0x18, 0xc0, 0x07, 0x8e, 0x61, + 0x61, 0x47, 0x30, 0x10, 0x0c, 0x04, 0x0c, 0x01, + 0x5c, 0x08, 0x38, 0x02, 0xf0, 0x00, 0x20, 0x00, + 0x08, + + // 'B' (0x42) 11x14, offset 433-453, at +2/-13 + 0x01, 0xe0, 0xff, 0x1f, 0x04, 0x06, 0x81, 0x41, + 0x60, 0x10, 0x18, 0x04, 0x06, 0x81, 0xa2, 0x20, + 0x67, 0x04, 0xf0, 0x00, + + // 'C' (0x43) 10x14, offset 453-471, at +2/-13 + 0xf0, 0x03, 0x03, 0x23, 0x00, 0x05, 0xc0, 0x01, + 0x60, 0x00, 0x18, 0x00, 0x0a, 0x80, 0x02, 0xd0, + 0x03, 0x02, + + // 'D' (0x44) 10x14, offset 471-489, at +2/-13 + 0x01, 0xe0, 0xff, 0x1f, 0x00, 0x06, 0x80, 0x01, + 0x60, 0x00, 0x18, 0x00, 0x0a, 0x40, 0x0c, 0x0c, + 0xfc, 0x01, + + // 'E' (0x45) 11x14, offset 489-509, at +2/-13 + 0x01, 0xe0, 0xff, 0x1f, 0x04, 0x06, 0x81, 0x41, + 0x60, 0x38, 0x18, 0x00, 0x06, 0x80, 0x01, 0xe0, + 0x01, 0x08, 0xc0, 0x03, + + // 'F' (0x46) 11x14, offset 509-529, at +2/-13 + 0x01, 0xe0, 0xff, 0x1f, 0x04, 0x06, 0x81, 0x41, + 0x60, 0x38, 0x10, 0x00, 0x04, 0x00, 0x01, 0x40, + 0x00, 0x70, 0x00, 0x00, + + // 'G' (0x47) 11x14, offset 529-549, at +2/-13 + 0xf8, 0x07, 0x03, 0x23, 0x00, 0x0d, 0xc0, 0x01, + 0x60, 0x00, 0x18, 0x10, 0x06, 0x84, 0x02, 0xd1, + 0xc3, 0x07, 0x10, 0x00, + + // 'H' (0x48) 10x14, offset 549-567, at +2/-13 + 0x01, 0xe0, 0xff, 0x1f, 0x04, 0x02, 0x01, 0x40, + 0x00, 0x10, 0x00, 0x04, 0x04, 0x81, 0xff, 0x7f, + 0x00, 0x08, + + // 'I' (0x49) 7x14, offset 567-580, at +4/-13 + 0x01, 0x60, 0x00, 0x18, 0x00, 0xfe, 0xff, 0x01, + 0x60, 0x00, 0x18, 0x00, 0x02, + + // 'J' (0x4a) 11x14, offset 580-600, at +2/-13 + 0x00, 0x0f, 0x00, 0x04, 0x00, 0x03, 0x80, 0x01, + 0x60, 0x00, 0x18, 0x00, 0x07, 0x60, 0xff, 0x4f, + 0x00, 0x10, 0x00, 0x00, + + // 'K' (0x4b) 12x14, offset 600-621, at +2/-13 + 0x01, 0xe0, 0xff, 0x1f, 0x08, 0x06, 0x81, 0x60, + 0x00, 0x34, 0x80, 0x18, 0x14, 0x0c, 0x03, 0xdc, + 0x00, 0x1c, 0x00, 0x02, 0x80, + + // 'L' (0x4c) 11x14, offset 621-641, at +2/-13 + 0x01, 0x60, 0x00, 0xf8, 0xff, 0x07, 0x80, 0x01, + 0x20, 0x00, 0x08, 0x00, 0x02, 0x80, 0x00, 0x20, + 0x00, 0x08, 0xe0, 0x03, + + // 'M' (0x4d) 13x14, offset 641-664, at +1/-13 + 0x01, 0xe0, 0xff, 0x3f, 0x00, 0x32, 0x80, 0x30, + 0x00, 0x70, 0x00, 0x20, 0x00, 0x07, 0x30, 0x00, + 0x03, 0x38, 0x00, 0xfe, 0xff, 0x01, 0x20, + + // 'N' (0x4e) 12x14, offset 664-685, at +1/-13 + 0x01, 0xe0, 0xff, 0x3f, 0x00, 0x32, 0x80, 0x30, + 0x00, 0x18, 0x00, 0x18, 0x00, 0x0c, 0x01, 0x4c, + 0x00, 0xfc, 0xff, 0x07, 0x00, + + // 'O' (0x4f) 12x14, offset 685-706, at +1/-13 + 0xf0, 0x03, 0x03, 0x63, 0x80, 0x09, 0x40, 0x01, + 0x60, 0x00, 0x18, 0x00, 0x06, 0x80, 0x02, 0x90, + 0x01, 0xc6, 0xc0, 0xc0, 0x0f, + + // 'P' (0x50) 10x14, offset 706-724, at +2/-13 + 0x01, 0xe0, 0xff, 0x1f, 0x08, 0x06, 0x82, 0x81, + 0x60, 0x20, 0x10, 0x08, 0x0c, 0x03, 0x62, 0x00, + 0x0f, 0x00, + + // 'Q' (0x51) 12x17, offset 724-750, at +1/-13 + 0xf0, 0x03, 0x18, 0x18, 0x18, 0x60, 0x14, 0x80, + 0x1d, 0x00, 0x2e, 0x00, 0x5c, 0x00, 0xa8, 0x00, + 0x50, 0x02, 0x10, 0x0d, 0x30, 0x32, 0x30, 0x84, + 0x1f, 0x04, + + // 'R' (0x52) 12x14, offset 750-771, at +2/-13 + 0x01, 0xe0, 0xff, 0x1f, 0x08, 0x06, 0x82, 0x81, + 0x40, 0x20, 0x10, 0x18, 0x0c, 0x0d, 0x66, 0x04, + 0x0f, 0x06, 0x00, 0x02, 0x80, + + // 'S' (0x53) 10x14, offset 771-789, at +2/-13 + 0x00, 0x3c, 0x07, 0x24, 0x02, 0x05, 0x81, 0x41, + 0x60, 0x10, 0x18, 0x08, 0x06, 0xc2, 0x82, 0xd0, + 0xc3, 0x03, + + // 'T' (0x54) 11x14, offset 789-809, at +2/-13 + 0x07, 0x40, 0x00, 0x10, 0x00, 0x06, 0x80, 0x01, + 0xe0, 0xff, 0x1f, 0x00, 0x06, 0x80, 0x01, 0x60, + 0x00, 0x70, 0x00, 0x00, + + // 'U' (0x55) 12x14, offset 809-830, at +1/-13 + 0x01, 0xc0, 0xff, 0x11, 0x80, 0x05, 0x40, 0x00, + 0x20, 0x00, 0x08, 0x00, 0x02, 0x80, 0x01, 0x50, + 0x00, 0xf6, 0x7f, 0x04, 0x00, + + // 'V' (0x56) 14x14, offset 830-855, at +0/-13 + 0x01, 0x40, 0x00, 0x70, 0x00, 0xe4, 0x00, 0xc1, + 0x01, 0x80, 0x03, 0x80, 0x03, 0xc0, 0x00, 0x4c, + 0xe0, 0x10, 0x07, 0x34, 0x00, 0x03, 0x40, 0x00, + 0x00, + + // 'W' (0x57) 14x14, offset 855-880, at +0/-13 + 0x01, 0x40, 0x00, 0xf0, 0x3f, 0x04, 0xf0, 0x01, + 0x3c, 0xe0, 0x80, 0x07, 0xe0, 0x00, 0xe0, 0x41, + 0x80, 0x17, 0x00, 0xc7, 0x7f, 0x0f, 0x40, 0x00, + 0x00, + + // 'X' (0x58) 12x14, offset 880-901, at +1/-13 + 0x01, 0x60, 0x00, 0x7c, 0x80, 0x37, 0x90, 0x10, + 0x03, 0x78, 0x00, 0x0c, 0xc0, 0x04, 0x19, 0xe6, + 0x01, 0x3b, 0x00, 0x07, 0x80, + + // 'Y' (0x59) 12x14, offset 901-922, at +1/-13 + 0x01, 0x40, 0x00, 0x30, 0x00, 0x34, 0x80, 0x10, + 0x20, 0x18, 0x08, 0xf8, 0x83, 0x81, 0x11, 0x60, + 0x03, 0x38, 0x00, 0x04, 0x00, + + // 'Z' (0x5a) 9x14, offset 922-938, at +3/-13 + 0x0f, 0x78, 0x00, 0x19, 0x30, 0x06, 0x82, 0x61, + 0x60, 0x04, 0xd8, 0x00, 0x0e, 0x80, 0x00, 0x3e, + + // '[' (0x5b) 3x18, offset 938-945, at +7/-14 + 0xff, 0xff, 0x07, 0x00, 0x18, 0x00, 0x20, + + // '\' (0x5c) 9x18, offset 945-966, at +3/-15 + 0x03, 0x00, 0x38, 0x00, 0x00, 0x03, 0x00, 0x30, + 0x00, 0x00, 0x03, 0x00, 0x30, 0x00, 0x00, 0x03, + 0x00, 0x30, 0x00, 0x00, 0x03, + + // ']' (0x5d) 3x18, offset 966-973, at +5/-14 + 0x01, 0x00, 0x06, 0x00, 0xf8, 0xff, 0x3f, + + // '^' (0x5e) 9x6, offset 973-980, at +3/-14 + 0x30, 0xc6, 0x08, 0x03, 0x81, 0x40, 0x20, + + // '_' (0x5f) 14x1, offset 980-982, at +0/+3 + 0xff, 0x3f, + + // '`' (0x60) 4x4, offset 982-984, at +4/-15 + 0x21, 0x84, + + // 'a' (0x61) 10x10, offset 984-997, at +2/-9 + 0xc0, 0x81, 0x1c, 0x63, 0x84, 0x11, 0x46, 0x18, + 0x91, 0x44, 0xfe, 0x03, 0x08, + + // 'b' (0x62) 13x15, offset 997-1022, at +0/-14 + 0x01, 0xc0, 0x00, 0xe0, 0xff, 0x1f, 0x10, 0x02, + 0x04, 0x02, 0x01, 0x82, 0x00, 0x41, 0x80, 0x20, + 0x40, 0x10, 0x20, 0x10, 0x08, 0x10, 0x06, 0xf0, + 0x00, + + // 'c' (0x63) 11x10, offset 1022-1036, at +2/-9 + 0x78, 0x18, 0x26, 0x50, 0x80, 0x01, 0x06, 0x18, + 0x60, 0x80, 0x02, 0x3e, 0x04, 0x00, + + // 'd' (0x64) 11x15, offset 1036-1057, at +2/-14 + 0x00, 0x0f, 0x60, 0x18, 0x10, 0x08, 0x04, 0x08, + 0x02, 0x04, 0x01, 0x82, 0x00, 0x81, 0x40, 0x81, + 0x90, 0xff, 0x3f, 0x00, 0x10, + + // 'e' (0x65) 10x10, offset 1057-1070, at +2/-9 + 0xfc, 0x48, 0x36, 0x51, 0x84, 0x11, 0x46, 0x18, + 0xe1, 0x84, 0x12, 0x71, 0x04, + + // 'f' (0x66) 9x15, offset 1070-1087, at +4/-14 + 0x20, 0x40, 0x10, 0xa0, 0xff, 0x5f, 0x04, 0x18, + 0x02, 0x0c, 0x01, 0x86, 0x00, 0x43, 0x00, 0x01, + 0x00, + + // 'g' (0x67) 11x14, offset 1087-1107, at +2/-9 + 0x78, 0x80, 0x61, 0x20, 0x10, 0x04, 0x88, 0x01, + 0x62, 0x80, 0x18, 0x20, 0x0a, 0x84, 0x86, 0xd0, + 0xff, 0x13, 0x00, 0x00, + + // 'h' (0x68) 10x15, offset 1107-1126, at +2/-14 + 0x01, 0xc0, 0xff, 0x3f, 0x30, 0x10, 0x08, 0x00, + 0x02, 0x00, 0x01, 0x80, 0x00, 0x80, 0x80, 0x80, + 0x7f, 0x00, 0x20, + + // 'i' (0x69) 9x15, offset 1126-1143, at +3/-14 + 0x00, 0x40, 0x10, 0x20, 0x08, 0x10, 0x04, 0x78, + 0xfe, 0x07, 0x00, 0x02, 0x00, 0x01, 0x80, 0x00, + 0x40, + + // 'j' (0x6a) 7x19, offset 1143-1160, at +3/-14 + 0x20, 0x00, 0x04, 0x01, 0x20, 0x08, 0x00, 0x41, + 0x00, 0x08, 0x02, 0xc0, 0x13, 0x00, 0x81, 0xff, + 0x07, + + // 'k' (0x6b) 12x15, offset 1160-1183, at +1/-14 + 0x01, 0xc0, 0x00, 0xe0, 0xff, 0x1f, 0x40, 0x00, + 0x30, 0x00, 0x2c, 0x80, 0x22, 0xc0, 0xa0, 0x20, + 0x60, 0x10, 0x20, 0x00, 0x10, 0x00, 0x08, + + // 'l' (0x6c) 9x15, offset 1183-1200, at +3/-14 + 0x00, 0xc0, 0x00, 0x60, 0x00, 0x30, 0x00, 0xf8, + 0xff, 0x07, 0x00, 0x02, 0x00, 0x01, 0x80, 0x00, + 0x40, + + // 'm' (0x6d) 13x10, offset 1200-1217, at +1/-9 + 0x01, 0xfe, 0x2f, 0x60, 0x00, 0x01, 0x04, 0xe0, + 0xbf, 0x80, 0x01, 0x04, 0x30, 0x80, 0xff, 0x00, + 0x02, + + // 'n' (0x6e) 12x10, offset 1217-1232, at +1/-9 + 0x00, 0x06, 0xf8, 0xbf, 0x80, 0x02, 0x04, 0x10, + 0x40, 0x00, 0x01, 0x08, 0xc8, 0x3f, 0x80, + + // 'o' (0x6f) 11x10, offset 1232-1246, at +2/-9 + 0x78, 0x10, 0x22, 0x50, 0x80, 0x01, 0x06, 0x18, + 0x60, 0x80, 0x02, 0x11, 0x82, 0x07, + + // 'p' (0x70) 12x14, offset 1246-1267, at +1/-9 + 0x01, 0xe0, 0xff, 0x4f, 0x08, 0x0a, 0x84, 0x01, + 0x42, 0x80, 0x10, 0x20, 0x04, 0x08, 0x01, 0x82, + 0x40, 0x60, 0x08, 0xe0, 0x01, + + // 'q' (0x71) 11x14, offset 1267-1287, at +2/-9 + 0x7c, 0x80, 0x61, 0x20, 0x10, 0x04, 0x08, 0x01, + 0x42, 0x80, 0x10, 0x20, 0x08, 0x84, 0x86, 0xe0, + 0xff, 0x1f, 0x00, 0x02, + + // 'r' (0x72) 10x10, offset 1287-1300, at +3/-9 + 0x01, 0x06, 0xf8, 0x3f, 0x81, 0x06, 0x0a, 0x18, + 0x60, 0x00, 0x01, 0x08, 0x00, + + // 's' (0x73) 10x10, offset 1300-1313, at +2/-9 + 0x80, 0x3b, 0xa4, 0x60, 0x84, 0x11, 0x46, 0x18, + 0x61, 0x88, 0x22, 0x1d, 0x03, + + // 't' (0x74) 11x14, offset 1313-1333, at +1/-13 + 0x10, 0x00, 0x04, 0xf0, 0xff, 0x41, 0xc0, 0x10, + 0x20, 0x04, 0x08, 0x01, 0x42, 0x80, 0x00, 0x20, + 0x00, 0x04, 0x00, 0x00, + + // 'u' (0x75) 11x10, offset 1333-1347, at +2/-9 + 0x01, 0xfc, 0x07, 0x30, 0x80, 0x00, 0x02, 0x08, + 0x60, 0x40, 0x01, 0xfd, 0x0f, 0x20, + + // 'v' (0x76) 13x10, offset 1347-1364, at +1/-9 + 0x01, 0x04, 0xf0, 0x40, 0x0e, 0xc1, 0x00, 0x0c, + 0x20, 0x60, 0x71, 0x34, 0x30, 0x40, 0x00, 0x01, + 0x00, + + // 'w' (0x77) 13x10, offset 1364-1381, at +1/-9 + 0x01, 0x3c, 0x10, 0x5f, 0x80, 0xc0, 0xe1, 0x80, + 0x01, 0x18, 0x80, 0x07, 0xff, 0x43, 0x00, 0x01, + 0x00, + + // 'x' (0x78) 12x10, offset 1381-1396, at +1/-9 + 0x00, 0x06, 0x38, 0xf0, 0xa1, 0x4d, 0xe2, 0x00, + 0x03, 0x1a, 0xc5, 0x0e, 0x1e, 0x70, 0x80, + + // 'y' (0x79) 12x14, offset 1396-1417, at +1/-9 + 0x01, 0x60, 0x00, 0x78, 0x00, 0x66, 0x80, 0x60, + 0x30, 0x60, 0x0b, 0x30, 0x02, 0x03, 0x31, 0x40, + 0x03, 0x30, 0x00, 0x04, 0x00, + + // 'z' (0x7a) 9x10, offset 1417-1429, at +3/-9 + 0x03, 0x04, 0x1e, 0x64, 0x88, 0x11, 0x26, 0x78, + 0x60, 0x80, 0x00, 0x03, + + // '{' (0x7b) 5x18, offset 1429-1441, at +5/-14 + 0x00, 0x02, 0x00, 0x14, 0xe0, 0xdf, 0x5f, 0x00, + 0x80, 0x01, 0x00, 0x02, + + // '|' (0x7c) 1x18, offset 1441-1444, at +7/-14 + 0xff, 0xff, 0x03, + + // '}' (0x7d) 5x18, offset 1444-1456, at +5/-14 + 0x01, 0x00, 0x06, 0x00, 0xe8, 0xcf, 0x1f, 0x40, + 0x01, 0x00, 0x02, 0x00, + + // '~' (0x7e) 10x3, offset 1456-1460, at +2/-7 + 0x54, 0x32, 0x91, 0x16, +}; + +const uint8_t FreeMono12_RM[] = { + + // ' ' (0x20) 0x0, offset 0-0, at +0/+1 + + // '!' (0x21) 3x15, offset 0-6, at +6/-14 + 0x49, 0x24, 0x92, 0x48, 0x01, 0xf8, + + // '"' (0x22) 8x7, offset 6-13, at +3/-14 + 0xe7, 0xe7, 0x67, 0x42, 0x42, 0x42, 0x42, + + // '#' (0x23) 10x16, offset 13-33, at +2/-14 + 0x09, 0x02, 0x41, 0x10, 0x44, 0x11, 0x1f, 0xf1, + 0x10, 0x4c, 0x12, 0x3f, 0xe1, 0x20, 0x48, 0x12, + 0x04, 0x81, 0x20, 0x48, + + // '$' (0x24) 10x17, offset 33-55, at +2/-14 + 0x04, 0x07, 0xa2, 0x19, 0x02, 0x40, 0x10, 0x03, + 0x00, 0x3c, 0x00, 0x80, 0x10, 0x06, 0x01, 0xe0, + 0xa7, 0xc0, 0x40, 0x10, 0x04, 0x00, + + // '%' (0x25) 10x15, offset 55-74, at +2/-14 + 0x3c, 0x19, 0x84, 0x21, 0x08, 0x66, 0x0f, 0x00, + 0x0c, 0x1c, 0x78, 0x01, 0xe0, 0xcc, 0x21, 0x08, + 0x43, 0x30, 0x78, + + // '&' (0x26) 9x12, offset 74-88, at +3/-11 + 0x3e, 0x30, 0x10, 0x08, 0x02, 0x03, 0x03, 0x47, + 0x14, 0x8a, 0x43, 0x11, 0x8f, 0x60, + + // ''' (0x27) 3x7, offset 88-91, at +5/-14 + 0xfd, 0xa4, 0x90, + + // '(' (0x28) 3x18, offset 91-98, at +7/-14 + 0x05, 0x25, 0x24, 0x92, 0x48, 0x92, 0x24, + + // ')' (0x29) 3x18, offset 98-105, at +4/-14 + 0x11, 0x24, 0x89, 0x24, 0x92, 0x92, 0x90, + + // '*' (0x2a) 9x9, offset 105-116, at +3/-14 + 0x00, 0x04, 0x02, 0x11, 0x07, 0xf0, 0xc0, 0x50, + 0x48, 0x42, 0x00, + + // '+' (0x2b) 9x11, offset 116-129, at +3/-11 + 0x08, 0x04, 0x02, 0x01, 0x00, 0x87, 0xfc, 0x20, + 0x10, 0x08, 0x04, 0x02, 0x00, + + // ',' (0x2c) 5x7, offset 129-134, at +3/-3 + 0x3b, 0x9c, 0xce, 0x62, 0x00, + + // '-' (0x2d) 11x1, offset 134-136, at +2/-6 + 0xff, 0xe0, + + // '.' (0x2e) 3x3, offset 136-138, at +5/-2 + 0xff, 0x80, + + // '/' (0x2f) 9x18, offset 138-159, at +3/-15 + 0x00, 0x80, 0xc0, 0x40, 0x20, 0x20, 0x10, 0x10, + 0x08, 0x08, 0x04, 0x04, 0x02, 0x02, 0x01, 0x01, + 0x00, 0x80, 0x80, 0x40, 0x00, + + // '0' (0x30) 9x15, offset 159-176, at +3/-14 + 0x1c, 0x31, 0x90, 0x58, 0x38, 0x0c, 0x06, 0x03, + 0x01, 0x80, 0xc0, 0x60, 0x30, 0x34, 0x13, 0x18, + 0x70, + + // '1' (0x31) 7x14, offset 176-189, at +4/-13 + 0x30, 0xe1, 0x44, 0x81, 0x02, 0x04, 0x08, 0x10, + 0x20, 0x40, 0x81, 0x1f, 0xc0, + + // '2' (0x32) 9x15, offset 189-206, at +2/-14 + 0x1e, 0x10, 0x90, 0x68, 0x10, 0x08, 0x0c, 0x04, + 0x04, 0x04, 0x06, 0x06, 0x06, 0x06, 0x0e, 0x07, + 0xfe, + + // '3' (0x33) 10x15, offset 206-225, at +2/-14 + 0x3e, 0x10, 0x40, 0x08, 0x02, 0x00, 0x80, 0x40, + 0xe0, 0x04, 0x00, 0x80, 0x10, 0x04, 0x01, 0x00, + 0xd8, 0x63, 0xe0, + + // '4' (0x34) 8x15, offset 225-240, at +3/-14 + 0x06, 0x0a, 0x0a, 0x12, 0x22, 0x22, 0x42, 0x42, + 0x82, 0x82, 0xff, 0x02, 0x02, 0x02, 0x0f, + + // '5' (0x35) 9x15, offset 240-257, at +3/-14 + 0x7f, 0x20, 0x10, 0x08, 0x04, 0x02, 0xf1, 0x8c, + 0x03, 0x00, 0x80, 0x40, 0x20, 0x18, 0x16, 0x18, + 0xf0, + + // '6' (0x36) 9x15, offset 257-274, at +3/-14 + 0x0f, 0x8c, 0x08, 0x08, 0x04, 0x04, 0x02, 0x79, + 0x46, 0xc1, 0xe0, 0x60, 0x28, 0x14, 0x19, 0x08, + 0x78, + + // '7' (0x37) 8x15, offset 274-289, at +3/-14 + 0xff, 0x81, 0x81, 0x02, 0x02, 0x02, 0x02, 0x04, + 0x04, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, + + // '8' (0x38) 9x15, offset 289-306, at +3/-14 + 0x3e, 0x31, 0xb0, 0x70, 0x18, 0x0c, 0x05, 0x8c, + 0x38, 0x63, 0x40, 0x60, 0x30, 0x18, 0x1b, 0x18, + 0xf8, + + // '9' (0x39) 9x15, offset 306-323, at +3/-14 + 0x3c, 0x31, 0x30, 0x50, 0x28, 0x0c, 0x0f, 0x06, + 0x85, 0x3c, 0x80, 0x40, 0x40, 0x20, 0x20, 0x63, + 0xe0, + + // ':' (0x3a) 3x10, offset 323-327, at +5/-9 + 0xff, 0x80, 0x07, 0xfc, + + // ';' (0x3b) 5x13, offset 327-336, at +3/-9 + 0x39, 0xce, 0x00, 0x00, 0x06, 0x33, 0x98, 0xc4, + 0x00, + + // '<' (0x3c) 11x11, offset 336-352, at +2/-11 + 0x00, 0xc0, 0x60, 0x18, 0x0c, 0x06, 0x01, 0x80, + 0x0c, 0x00, 0x60, 0x03, 0x00, 0x30, 0x01, 0x00, + + // '=' (0x3d) 12x4, offset 352-358, at +1/-8 + 0xff, 0xf0, 0x00, 0x00, 0x0f, 0xff, + + // '>' (0x3e) 11x11, offset 358-374, at +2/-11 + 0xc0, 0x06, 0x00, 0x30, 0x01, 0x80, 0x18, 0x01, + 0x80, 0xc0, 0x30, 0x18, 0x0c, 0x02, 0x00, 0x00, + + // '?' (0x3f) 9x14, offset 374-390, at +3/-13 + 0x3e, 0x60, 0xa0, 0x20, 0x10, 0x08, 0x08, 0x18, + 0x10, 0x08, 0x00, 0x00, 0x00, 0x01, 0xc0, 0xe0, + + // '@' (0x40) 9x16, offset 390-408, at +3/-14 + 0x1c, 0x31, 0x10, 0x50, 0x28, 0x14, 0x3a, 0x25, + 0x22, 0x91, 0x4c, 0xa3, 0xf0, 0x08, 0x02, 0x01, + 0x80, 0x7c, + + // 'A' (0x41) 14x14, offset 408-433, at +0/-13 + 0x3f, 0x00, 0x0c, 0x00, 0x48, 0x01, 0x20, 0x04, + 0x40, 0x21, 0x00, 0x84, 0x04, 0x08, 0x1f, 0xe0, + 0x40, 0x82, 0x01, 0x08, 0x04, 0x20, 0x13, 0xe1, + 0xf0, + + // 'B' (0x42) 11x14, offset 433-453, at +2/-13 + 0xff, 0x08, 0x11, 0x01, 0x20, 0x24, 0x04, 0x81, + 0x1f, 0xc2, 0x06, 0x40, 0x68, 0x05, 0x00, 0xa0, + 0x14, 0x05, 0xff, 0x00, + + // 'C' (0x43) 10x14, offset 453-471, at +2/-13 + 0x1e, 0x48, 0x74, 0x05, 0x01, 0x80, 0x20, 0x08, + 0x02, 0x00, 0x80, 0x20, 0x04, 0x01, 0x01, 0x30, + 0x87, 0xc0, + + // 'D' (0x44) 10x14, offset 471-489, at +2/-13 + 0xfe, 0x10, 0x44, 0x09, 0x02, 0x40, 0x50, 0x14, + 0x05, 0x01, 0x40, 0x50, 0x14, 0x0d, 0x02, 0x41, + 0x3f, 0x80, + + // 'E' (0x45) 11x14, offset 489-509, at +2/-13 + 0xff, 0xc8, 0x09, 0x01, 0x20, 0x04, 0x00, 0x88, + 0x1f, 0x02, 0x20, 0x40, 0x08, 0x01, 0x00, 0xa0, + 0x14, 0x03, 0xff, 0xc0, + + // 'F' (0x46) 11x14, offset 509-529, at +2/-13 + 0xff, 0xe8, 0x05, 0x00, 0xa0, 0x04, 0x00, 0x88, + 0x1f, 0x02, 0x20, 0x40, 0x08, 0x01, 0x00, 0x20, + 0x04, 0x01, 0xf0, 0x00, + + // 'G' (0x47) 11x14, offset 529-549, at +2/-13 + 0x1f, 0x46, 0x19, 0x01, 0x60, 0x28, 0x01, 0x00, + 0x20, 0x04, 0x00, 0x83, 0xf0, 0x0b, 0x01, 0x20, + 0x23, 0x0c, 0x3e, 0x00, + + // 'H' (0x48) 10x14, offset 549-567, at +2/-13 + 0xe1, 0xd0, 0x24, 0x09, 0x02, 0x40, 0x90, 0x27, + 0xf9, 0x02, 0x40, 0x90, 0x24, 0x09, 0x02, 0x40, + 0xb8, 0x70, + + // 'I' (0x49) 7x14, offset 567-580, at +4/-13 + 0xfe, 0x20, 0x40, 0x81, 0x02, 0x04, 0x08, 0x10, + 0x20, 0x40, 0x81, 0x1f, 0xc0, + + // 'J' (0x4a) 11x14, offset 580-600, at +2/-13 + 0x0f, 0xe0, 0x10, 0x02, 0x00, 0x40, 0x08, 0x01, + 0x00, 0x20, 0x04, 0x80, 0x90, 0x12, 0x02, 0x40, + 0xc6, 0x30, 0x7c, 0x00, + + // 'K' (0x4b) 12x14, offset 600-621, at +2/-13 + 0xf1, 0xe4, 0x0c, 0x41, 0x04, 0x20, 0x44, 0x04, + 0x80, 0x5c, 0x06, 0x60, 0x43, 0x04, 0x10, 0x40, + 0x84, 0x08, 0x40, 0xcf, 0x07, + + // 'L' (0x4c) 11x14, offset 621-641, at +2/-13 + 0xf8, 0x04, 0x00, 0x80, 0x10, 0x02, 0x00, 0x40, + 0x08, 0x01, 0x00, 0x20, 0x04, 0x04, 0x80, 0x90, + 0x12, 0x03, 0xff, 0xc0, + + // 'M' (0x4d) 13x14, offset 641-664, at +1/-13 + 0xe0, 0x3b, 0x01, 0x94, 0x14, 0xa0, 0xa4, 0x89, + 0x24, 0x49, 0x14, 0x48, 0xa2, 0x45, 0x12, 0x10, + 0x90, 0x04, 0x80, 0x24, 0x01, 0x78, 0x3c, + + // 'N' (0x4e) 12x14, offset 664-685, at +1/-13 + 0xe0, 0xf6, 0x02, 0x50, 0x25, 0x02, 0x48, 0x24, + 0xc2, 0x44, 0x24, 0x22, 0x43, 0x24, 0x12, 0x40, + 0xa4, 0x0a, 0x40, 0x6f, 0x06, + + // 'O' (0x4f) 12x14, offset 685-706, at +1/-13 + 0x0f, 0x03, 0x0c, 0x60, 0x64, 0x02, 0x80, 0x18, + 0x01, 0x80, 0x18, 0x01, 0x80, 0x18, 0x01, 0x40, + 0x26, 0x06, 0x30, 0xc0, 0xf0, + + // 'P' (0x50) 10x14, offset 706-724, at +2/-13 + 0xff, 0x10, 0x64, 0x05, 0x01, 0x40, 0x50, 0x34, + 0x19, 0xfc, 0x40, 0x10, 0x04, 0x01, 0x00, 0x40, + 0x3e, 0x00, + + // 'Q' (0x51) 12x17, offset 724-750, at +1/-13 + 0x0f, 0x03, 0x0c, 0x60, 0x64, 0x02, 0x80, 0x18, + 0x01, 0x80, 0x18, 0x01, 0x80, 0x18, 0x01, 0x40, + 0x26, 0x06, 0x30, 0xc1, 0xf0, 0x0c, 0x01, 0xf1, + 0x30, 0xe0, + + // 'R' (0x52) 12x14, offset 750-771, at +2/-13 + 0xff, 0x04, 0x18, 0x40, 0xc4, 0x04, 0x40, 0x44, + 0x0c, 0x41, 0x87, 0xe0, 0x43, 0x04, 0x10, 0x40, + 0x84, 0x04, 0x40, 0x4f, 0x03, + + // 'S' (0x53) 10x14, offset 771-789, at +2/-13 + 0x1f, 0x48, 0x34, 0x05, 0x01, 0x40, 0x08, 0x01, + 0xc0, 0x0e, 0x00, 0x40, 0x18, 0x06, 0x01, 0xe1, + 0xa7, 0xc0, + + // 'T' (0x54) 11x14, offset 789-809, at +2/-13 + 0xff, 0xf0, 0x86, 0x10, 0x82, 0x00, 0x40, 0x08, + 0x01, 0x00, 0x20, 0x04, 0x00, 0x80, 0x10, 0x02, + 0x00, 0x40, 0x7f, 0x00, + + // 'U' (0x55) 12x14, offset 809-830, at +1/-13 + 0xf0, 0xf4, 0x02, 0x40, 0x24, 0x02, 0x40, 0x24, + 0x02, 0x40, 0x24, 0x02, 0x40, 0x24, 0x02, 0x40, + 0x22, 0x04, 0x30, 0xc0, 0xf0, + + // 'V' (0x56) 14x14, offset 830-855, at +0/-13 + 0xf8, 0x7c, 0x80, 0x22, 0x01, 0x04, 0x04, 0x10, + 0x20, 0x40, 0x80, 0x82, 0x02, 0x10, 0x08, 0x40, + 0x11, 0x00, 0x48, 0x01, 0xa0, 0x03, 0x00, 0x0c, + 0x00, + + // 'W' (0x57) 14x14, offset 855-880, at +0/-13 + 0xf8, 0x7c, 0x80, 0x22, 0x00, 0x88, 0xc2, 0x23, + 0x10, 0x8e, 0x42, 0x29, 0x09, 0x24, 0x24, 0x90, + 0x91, 0x41, 0x85, 0x06, 0x14, 0x18, 0x70, 0x60, + 0x80, + + // 'X' (0x58) 12x14, offset 880-901, at +1/-13 + 0xf0, 0xf2, 0x06, 0x30, 0x41, 0x08, 0x09, 0x80, + 0x50, 0x06, 0x00, 0x60, 0x0d, 0x00, 0x88, 0x10, + 0xc2, 0x04, 0x60, 0x2f, 0x0f, + + // 'Y' (0x59) 12x14, offset 901-922, at +1/-13 + 0xf0, 0xf2, 0x02, 0x10, 0x41, 0x04, 0x08, 0x80, + 0x50, 0x05, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, + 0x00, 0x20, 0x02, 0x01, 0xfc, + + // 'Z' (0x5a) 9x14, offset 922-938, at +3/-13 + 0xff, 0x40, 0xa0, 0x90, 0x40, 0x40, 0x40, 0x20, + 0x20, 0x20, 0x10, 0x50, 0x30, 0x18, 0x0f, 0xfc, + + // '[' (0x5b) 3x18, offset 938-945, at +7/-14 + 0xf2, 0x49, 0x24, 0x92, 0x49, 0x24, 0x9c, + + // '\' (0x5c) 9x18, offset 945-966, at +3/-15 + 0x80, 0x60, 0x10, 0x08, 0x02, 0x01, 0x00, 0x40, + 0x20, 0x08, 0x04, 0x01, 0x00, 0x80, 0x20, 0x10, + 0x04, 0x02, 0x00, 0x80, 0x40, + + // ']' (0x5d) 3x18, offset 966-973, at +5/-14 + 0xe4, 0x92, 0x49, 0x24, 0x92, 0x49, 0x3c, + + // '^' (0x5e) 9x6, offset 973-980, at +3/-14 + 0x08, 0x0c, 0x09, 0x0c, 0x4c, 0x14, 0x04, + + // '_' (0x5f) 14x1, offset 980-982, at +0/+3 + 0xff, 0xfc, + + // '`' (0x60) 4x4, offset 982-984, at +4/-15 + 0x84, 0x21, + + // 'a' (0x61) 10x10, offset 984-997, at +2/-9 + 0x3e, 0x00, 0x60, 0x08, 0x02, 0x3f, 0x98, 0x28, + 0x0a, 0x02, 0xc3, 0x9f, 0x30, + + // 'b' (0x62) 13x15, offset 997-1022, at +0/-14 + 0xe0, 0x01, 0x00, 0x08, 0x00, 0x40, 0x02, 0x00, + 0x13, 0xe0, 0xa0, 0x86, 0x02, 0x20, 0x09, 0x00, + 0x48, 0x02, 0x40, 0x13, 0x01, 0x14, 0x1b, 0x9f, + 0x00, + + // 'c' (0x63) 11x10, offset 1022-1036, at +2/-9 + 0x1f, 0x4c, 0x19, 0x01, 0x40, 0x28, 0x01, 0x00, + 0x20, 0x02, 0x00, 0x60, 0x43, 0xf0, + + // 'd' (0x64) 11x15, offset 1036-1057, at +2/-14 + 0x00, 0xc0, 0x08, 0x01, 0x00, 0x20, 0x04, 0x3c, + 0x98, 0x52, 0x06, 0x80, 0x50, 0x0a, 0x01, 0x40, + 0x24, 0x0c, 0xc2, 0x87, 0x98, + + // 'e' (0x65) 10x10, offset 1057-1070, at +2/-9 + 0x3f, 0x18, 0x68, 0x06, 0x01, 0xff, 0xe0, 0x08, + 0x03, 0x00, 0x60, 0xc7, 0xc0, + + // 'f' (0x66) 9x15, offset 1070-1087, at +4/-14 + 0x0f, 0x98, 0x08, 0x04, 0x02, 0x07, 0xf8, 0x80, + 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x03, + 0xf8, + + // 'g' (0x67) 11x14, offset 1087-1107, at +2/-9 + 0x1e, 0x6c, 0x39, 0x03, 0x40, 0x28, 0x05, 0x00, + 0xa0, 0x12, 0x06, 0x61, 0x43, 0xc8, 0x01, 0x00, + 0x20, 0x08, 0x3e, 0x00, + + // 'h' (0x68) 10x15, offset 1107-1126, at +2/-14 + 0xc0, 0x10, 0x04, 0x01, 0x00, 0x40, 0x13, 0x87, + 0x11, 0x82, 0x40, 0x90, 0x24, 0x09, 0x02, 0x40, + 0x90, 0x2e, 0x1c, + + // 'i' (0x69) 9x15, offset 1126-1143, at +3/-14 + 0x08, 0x04, 0x02, 0x00, 0x00, 0x03, 0xc0, 0x20, + 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0x80, 0x43, + 0xfe, + + // 'j' (0x6a) 7x19, offset 1143-1160, at +3/-14 + 0x04, 0x08, 0x10, 0x00, 0x1f, 0xc0, 0x81, 0x02, + 0x04, 0x08, 0x10, 0x20, 0x40, 0x81, 0x02, 0x0b, + 0xe0, + + // 'k' (0x6b) 12x15, offset 1160-1183, at +1/-14 + 0xe0, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, + 0x3c, 0x21, 0x02, 0x60, 0x2c, 0x03, 0x80, 0x24, + 0x02, 0x20, 0x21, 0x02, 0x08, 0xe1, 0xf0, + + // 'l' (0x6c) 9x15, offset 1183-1200, at +3/-14 + 0x78, 0x04, 0x02, 0x01, 0x00, 0x80, 0x40, 0x20, + 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0x80, 0x43, + 0xfe, + + // 'm' (0x6d) 13x10, offset 1200-1217, at +1/-9 + 0xdc, 0xe3, 0x19, 0x90, 0x84, 0x84, 0x24, 0x21, + 0x21, 0x09, 0x08, 0x48, 0x42, 0x42, 0x17, 0x18, + 0xc0, + + // 'n' (0x6e) 12x10, offset 1217-1232, at +1/-9 + 0x67, 0x83, 0x84, 0x20, 0x22, 0x02, 0x20, 0x22, + 0x02, 0x20, 0x22, 0x02, 0x20, 0x2f, 0x07, + + // 'o' (0x6f) 11x10, offset 1232-1246, at +2/-9 + 0x1f, 0x04, 0x11, 0x01, 0x40, 0x18, 0x03, 0x00, + 0x60, 0x0a, 0x02, 0x20, 0x83, 0xe0, + + // 'p' (0x70) 12x14, offset 1246-1267, at +1/-9 + 0xcf, 0x85, 0x06, 0x60, 0x24, 0x01, 0x40, 0x14, + 0x01, 0x40, 0x16, 0x02, 0x50, 0x44, 0xf8, 0x40, + 0x04, 0x00, 0x40, 0x0f, 0x00, + + // 'q' (0x71) 11x14, offset 1267-1287, at +2/-9 + 0x1e, 0x6c, 0x3b, 0x03, 0x40, 0x28, 0x05, 0x00, + 0xa0, 0x12, 0x06, 0x61, 0x43, 0xc8, 0x01, 0x00, + 0x20, 0x04, 0x03, 0xc0, + + // 'r' (0x72) 10x10, offset 1287-1300, at +3/-9 + 0xe3, 0x8b, 0x13, 0x80, 0x80, 0x20, 0x08, 0x02, + 0x00, 0x80, 0x20, 0x3f, 0x80, + + // 's' (0x73) 10x10, offset 1300-1313, at +2/-9 + 0x1f, 0x58, 0x34, 0x05, 0x80, 0x1e, 0x00, 0x60, + 0x06, 0x01, 0xc0, 0xaf, 0xc0, + + // 't' (0x74) 11x14, offset 1313-1333, at +1/-13 + 0x20, 0x04, 0x00, 0x80, 0x10, 0x0f, 0xf0, 0x40, + 0x08, 0x01, 0x00, 0x20, 0x04, 0x00, 0x80, 0x10, + 0x03, 0x04, 0x3f, 0x00, + + // 'u' (0x75) 11x10, offset 1333-1347, at +2/-9 + 0xc1, 0xc8, 0x09, 0x01, 0x20, 0x24, 0x04, 0x80, + 0x90, 0x12, 0x02, 0x61, 0xc7, 0xcc, + + // 'v' (0x76) 13x10, offset 1347-1364, at +1/-9 + 0xf8, 0xf9, 0x01, 0x08, 0x10, 0x60, 0x81, 0x08, + 0x08, 0x40, 0x22, 0x01, 0x20, 0x05, 0x00, 0x30, + 0x00, + + // 'w' (0x77) 13x10, offset 1364-1381, at +1/-9 + 0xf0, 0x7a, 0x01, 0x10, 0x08, 0x8c, 0x42, 0x62, + 0x12, 0x90, 0xa5, 0x05, 0x18, 0x28, 0xc0, 0x86, + 0x00, + + // 'x' (0x78) 12x10, offset 1381-1396, at +1/-9 + 0x78, 0xf3, 0x04, 0x18, 0x80, 0xd0, 0x06, 0x00, + 0x70, 0x09, 0x81, 0x0c, 0x20, 0x6f, 0x8f, + + // 'y' (0x79) 12x14, offset 1396-1417, at +1/-9 + 0xf0, 0xf2, 0x02, 0x20, 0x41, 0x04, 0x10, 0x80, + 0x88, 0x09, 0x00, 0x50, 0x06, 0x00, 0x20, 0x04, + 0x00, 0x40, 0x08, 0x0f, 0xe0, + + // 'z' (0x7a) 9x10, offset 1417-1429, at +3/-9 + 0xff, 0x41, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x40, 0xbf, 0xc0, + + // '{' (0x7b) 5x18, offset 1429-1441, at +5/-14 + 0x19, 0x08, 0x42, 0x10, 0x84, 0x64, 0x18, 0x42, + 0x10, 0x84, 0x20, 0xc0, + + // '|' (0x7c) 1x18, offset 1441-1444, at +7/-14 + 0xff, 0xff, 0xc0, + + // '}' (0x7d) 5x18, offset 1444-1456, at +5/-14 + 0xc1, 0x08, 0x42, 0x10, 0x84, 0x10, 0x4c, 0x42, + 0x10, 0x84, 0x26, 0x00, + + // '~' (0x7e) 10x3, offset 1456-1460, at +2/-7 + 0x38, 0x13, 0x38, 0x38, +}; + +const GFXglyph FreeMono18Glyphs[] = { + // off, w, h, xa, xo, yo + { 0, 0, 0, 21, 0, 23 }, // ' ' + { 0, 4, 22, 21, 8, 1 }, // '!' + { 11, 11, 10, 21, 5, 2 }, // '"' + { 25, 14, 24, 21, 3, 1 }, // '#' + { 67, 13, 26, 21, 4, 0 }, // '$' + { 110, 15, 21, 21, 3, 2 }, // '%' + { 150, 12, 18, 21, 4, 5 }, // '&' + { 177, 4, 10, 21, 8, 2 }, // ''' + { 182, 5, 25, 21, 10, 2 }, // '(' + { 198, 5, 25, 21, 6, 2 }, // ')' + { 214, 13, 12, 21, 4, 2 }, // '*' + { 234, 15, 17, 21, 3, 5 }, // '+' + { 266, 7, 10, 21, 5, 18 }, // ',' + { 275, 15, 1, 21, 3, 13 }, // '-' + { 277, 5, 5, 21, 8, 18 }, // '.' + { 281, 13, 26, 21, 4, 0 }, // '/' + { 324, 13, 21, 21, 4, 2 }, // '0' + { 359, 13, 21, 21, 4, 2 }, // '1' + { 394, 13, 21, 21, 3, 2 }, // '2' + { 429, 14, 21, 21, 3, 2 }, // '3' + { 466, 12, 21, 21, 4, 2 }, // '4' + { 498, 14, 21, 21, 3, 2 }, // '5' + { 535, 12, 21, 21, 5, 2 }, // '6' + { 567, 12, 21, 21, 4, 2 }, // '7' + { 599, 13, 21, 21, 4, 2 }, // '8' + { 634, 12, 21, 21, 5, 2 }, // '9' + { 666, 5, 15, 21, 8, 8 }, // ':' + { 676, 7, 20, 21, 5, 8 }, // ';' + { 694, 15, 16, 21, 3, 5 }, // '<' + { 724, 17, 6, 21, 2, 10 }, // '=' + { 737, 15, 16, 21, 3, 5 }, // '>' + { 767, 12, 20, 21, 5, 3 }, // '?' + { 797, 13, 23, 21, 4, 2 }, // '@' + { 835, 21, 20, 21, 0, 3 }, // 'A' + { 888, 18, 20, 21, 1, 3 }, // 'B' + { 933, 17, 20, 21, 2, 3 }, // 'C' + { 976, 16, 20, 21, 2, 3 }, // 'D' + { 1016, 17, 20, 21, 1, 3 }, // 'E' + { 1059, 17, 20, 21, 1, 3 }, // 'F' + { 1102, 17, 20, 21, 2, 3 }, // 'G' + { 1145, 16, 20, 21, 2, 3 }, // 'H' + { 1185, 13, 20, 21, 4, 3 }, // 'I' + { 1218, 17, 20, 21, 3, 3 }, // 'J' + { 1261, 18, 20, 21, 1, 3 }, // 'K' + { 1306, 15, 20, 21, 3, 3 }, // 'L' + { 1344, 19, 20, 21, 1, 3 }, // 'M' + { 1392, 18, 20, 21, 1, 3 }, // 'N' + { 1437, 17, 20, 21, 2, 3 }, // 'O' + { 1480, 16, 20, 21, 1, 3 }, // 'P' + { 1520, 17, 24, 21, 2, 3 }, // 'Q' + { 1571, 19, 20, 21, 1, 3 }, // 'R' + { 1619, 14, 20, 21, 3, 3 }, // 'S' + { 1654, 15, 20, 21, 3, 3 }, // 'T' + { 1692, 17, 20, 21, 2, 3 }, // 'U' + { 1735, 21, 20, 21, 0, 3 }, // 'V' + { 1788, 19, 20, 21, 1, 3 }, // 'W' + { 1836, 19, 20, 21, 1, 3 }, // 'X' + { 1884, 17, 20, 21, 2, 3 }, // 'Y' + { 1927, 13, 20, 21, 4, 3 }, // 'Z' + { 1960, 5, 25, 21, 10, 2 }, // '[' + { 1976, 13, 26, 21, 4, 0 }, // '\' + { 2019, 5, 25, 21, 6, 2 }, // ']' + { 2035, 13, 9, 21, 4, 2 }, // '^' + { 2050, 21, 1, 21, 0, 26 }, // '_' + { 2053, 6, 5, 21, 5, 1 }, // '`' + { 2057, 16, 15, 21, 3, 8 }, // 'a' + { 2087, 18, 21, 21, 1, 2 }, // 'b' + { 2135, 15, 15, 21, 3, 8 }, // 'c' + { 2164, 18, 21, 21, 2, 2 }, // 'd' + { 2212, 16, 15, 21, 2, 8 }, // 'e' + { 2242, 14, 21, 21, 4, 2 }, // 'f' + { 2279, 17, 22, 21, 2, 8 }, // 'g' + { 2326, 17, 21, 21, 1, 2 }, // 'h' + { 2371, 14, 22, 21, 4, 1 }, // 'i' + { 2410, 10, 29, 21, 5, 1 }, // 'j' + { 2447, 16, 21, 21, 2, 2 }, // 'k' + { 2489, 14, 21, 21, 4, 2 }, // 'l' + { 2526, 19, 15, 21, 1, 8 }, // 'm' + { 2562, 17, 15, 21, 1, 8 }, // 'n' + { 2594, 15, 15, 21, 3, 8 }, // 'o' + { 2623, 18, 22, 21, 1, 8 }, // 'p' + { 2673, 18, 22, 21, 2, 8 }, // 'q' + { 2723, 15, 15, 21, 3, 8 }, // 'r' + { 2752, 13, 15, 21, 4, 8 }, // 's' + { 2777, 16, 20, 21, 1, 3 }, // 't' + { 2817, 17, 15, 21, 1, 8 }, // 'u' + { 2849, 19, 15, 21, 1, 8 }, // 'v' + { 2885, 19, 15, 21, 1, 8 }, // 'w' + { 2921, 17, 15, 21, 2, 8 }, // 'x' + { 2953, 17, 22, 21, 2, 8 }, // 'y' + { 3000, 13, 15, 21, 4, 8 }, // 'z' + { 3025, 8, 25, 21, 6, 2 }, // '{' + { 3050, 1, 25, 21, 10, 2 }, // '|' + { 3054, 8, 25, 21, 7, 2 }, // '}' + { 3079, 15, 5, 21, 3, 11 }, // '~' +}; + +const uint8_t FreeMono18_BCM[] = { + + // ' ' (0x20) 0x0, offset 0-0, at +0/+1 + + // '!' (0x21) 4x22, offset 0-11, at +8/-21 + 0x00, 0x00, 0x98, 0xff, 0x00, 0xff, 0xff, 0xc7, + 0xfb, 0x0f, 0x60, + + // '"' (0x22) 11x10, offset 11-25, at +5/-20 + 0x1f, 0xfc, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, + 0xc0, 0x0f, 0xff, 0xff, 0xff, 0x01, + + // '#' (0x23) 14x24, offset 25-67, at +3/-21 + 0x00, 0x40, 0x00, 0x00, 0x42, 0x00, 0x00, 0x42, + 0x00, 0x00, 0x42, 0x00, 0x00, 0xfa, 0xff, 0xff, + 0x47, 0x00, 0x00, 0x42, 0x00, 0x00, 0x42, 0x00, + 0x00, 0x42, 0xe0, 0x80, 0xff, 0x3f, 0x7f, 0x42, + 0x00, 0x00, 0x42, 0x00, 0x00, 0x42, 0x00, 0x00, + 0x42, 0x00, + + // '$' (0x24) 13x26, offset 67-110, at +4/-22 + 0x00, 0x00, 0x1f, 0x00, 0x0f, 0x30, 0x00, 0x63, + 0x80, 0x00, 0x04, 0x03, 0x06, 0x08, 0x08, 0x10, + 0x20, 0x20, 0x40, 0xf0, 0x80, 0x00, 0x3f, 0x02, + 0x04, 0x04, 0x08, 0x10, 0x10, 0x60, 0x40, 0x20, + 0x00, 0x01, 0x83, 0x00, 0x1e, 0x08, 0x01, 0x00, + 0xc0, 0x03, 0x00, + + // '%' (0x25) 15x21, offset 110-150, at +3/-20 + 0x00, 0x10, 0x80, 0x07, 0x02, 0x08, 0x61, 0x80, + 0x40, 0x04, 0x10, 0x88, 0x00, 0x02, 0x19, 0x4f, + 0x20, 0x11, 0x12, 0x22, 0x81, 0x3c, 0x26, 0x10, + 0xc0, 0x04, 0x02, 0x88, 0x40, 0x80, 0x21, 0x04, + 0x30, 0xcc, 0x00, 0x02, 0x0f, 0x40, 0x00, 0x00, + + // '&' (0x26) 12x18, offset 150-177, at +4/-17 + 0x00, 0xf8, 0x00, 0x30, 0xc6, 0x63, 0xb0, 0xb0, + 0x80, 0x01, 0x07, 0x06, 0x38, 0x18, 0x80, 0x63, + 0x00, 0x58, 0x01, 0xc0, 0x05, 0xc0, 0x0d, 0xc0, + 0x21, 0x00, 0x81, + + // ''' (0x27) 4x10, offset 177-182, at +8/-20 + 0x1f, 0xfc, 0xff, 0xff, 0x07, + + // '(' (0x28) 5x25, offset 182-198, at +10/-20 + 0x00, 0xff, 0x01, 0xc0, 0xff, 0x1f, 0xe0, 0x03, + 0xf8, 0x71, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x18, + + // ')' (0x29) 5x25, offset 198-214, at +6/-20 + 0x03, 0x00, 0x80, 0x1d, 0x00, 0xc0, 0xe1, 0x03, + 0xf0, 0x01, 0xff, 0x7f, 0x00, 0xe0, 0x1f, 0x00, + + // '*' (0x2a) 13x12, offset 214-234, at +4/-20 + 0x10, 0x00, 0x01, 0x20, 0x08, 0x62, 0x20, 0x03, + 0x1c, 0x7f, 0x00, 0x1c, 0x20, 0x03, 0xe2, 0x20, + 0x00, 0x01, 0x10, 0x00, + + // '+' (0x2b) 15x17, offset 234-266, at +3/-17 + 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, + 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x80, 0xff, + 0xff, 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, + 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, + + // ',' (0x2c) 7x10, offset 266-275, at +5/-4 + 0x80, 0xe3, 0xff, 0xcf, 0x0f, 0x1f, 0x1c, 0x10, + 0x00, + + // '-' (0x2d) 15x1, offset 275-277, at +3/-9 + 0xff, 0x7f, + + // '.' (0x2e) 5x5, offset 277-281, at +8/-4 + 0xee, 0xff, 0xef, 0x00, + + // '/' (0x2f) 13x26, offset 281-324, at +4/-22 + 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x80, + 0x03, 0x00, 0x80, 0x03, 0x00, 0x80, 0x03, 0x00, + 0x80, 0x03, 0x00, 0x80, 0x03, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x00, + + // '0' (0x30) 13x21, offset 324-359, at +4/-20 + 0xe0, 0xff, 0x00, 0x07, 0x60, 0x18, 0x00, 0x30, + 0x01, 0x00, 0x14, 0x00, 0x00, 0x03, 0x00, 0x60, + 0x00, 0x00, 0x0c, 0x00, 0x80, 0x01, 0x00, 0x50, + 0x00, 0x00, 0x11, 0x00, 0x30, 0x1c, 0xc0, 0x01, + 0xfe, 0x0f, 0x00, + + // '1' (0x31) 13x21, offset 359-394, at +4/-20 + 0x00, 0x00, 0x10, 0x06, 0x00, 0xe2, 0x00, 0x40, + 0x06, 0x00, 0x68, 0x00, 0x00, 0x07, 0x00, 0xe0, + 0xff, 0xff, 0x07, 0x00, 0x80, 0x00, 0x00, 0x10, + 0x00, 0x00, 0x02, 0x00, 0x40, 0x00, 0x00, 0x08, + 0x00, 0x00, 0x01, + + // '2' (0x32) 13x21, offset 394-429, at +3/-20 + 0x00, 0x00, 0x18, 0x03, 0x80, 0x13, 0x00, 0x58, + 0x01, 0x80, 0x39, 0x00, 0x18, 0x03, 0x80, 0x61, + 0x00, 0x18, 0x0c, 0x80, 0x81, 0x01, 0x18, 0x50, + 0x80, 0x01, 0x0a, 0x08, 0x40, 0xc6, 0x00, 0x08, + 0x07, 0xe0, 0x01, + + // '3' (0x33) 14x21, offset 429-466, at +3/-20 + 0x00, 0x00, 0x84, 0x00, 0x80, 0x19, 0x00, 0x20, + 0x01, 0x00, 0x14, 0x00, 0x00, 0x03, 0x00, 0x60, + 0x80, 0x00, 0x0c, 0x10, 0x80, 0x01, 0x02, 0x30, + 0xc0, 0x00, 0x0a, 0x14, 0x20, 0x42, 0x04, 0x86, + 0x07, 0x61, 0x00, 0xc0, 0x03, + + // '4' (0x34) 12x21, offset 466-498, at +4/-20 + 0x00, 0x60, 0x00, 0x00, 0x0b, 0x00, 0x18, 0x01, + 0xc0, 0x20, 0x00, 0x0e, 0x04, 0x70, 0x80, 0x20, + 0x03, 0x10, 0x1c, 0x00, 0x82, 0x01, 0x40, 0xf0, + 0xff, 0xff, 0x03, 0x00, 0x41, 0x00, 0x20, 0x08, + + // '5' (0x35) 14x21, offset 498-535, at +3/-20 + 0x00, 0x00, 0x06, 0x00, 0x80, 0xfc, 0x07, 0xa0, + 0x80, 0x00, 0x14, 0x08, 0x00, 0x03, 0x01, 0x60, + 0x20, 0x00, 0x0c, 0x04, 0x80, 0x81, 0x00, 0x30, + 0x10, 0x00, 0x07, 0x04, 0xa0, 0x80, 0x01, 0x02, + 0x60, 0x30, 0x00, 0xf0, 0x03, + + // '6' (0x36) 12x21, offset 535-567, at +5/-20 + 0x80, 0x7f, 0x00, 0x1c, 0x76, 0x60, 0x60, 0x10, + 0x06, 0x02, 0x44, 0x60, 0x00, 0x05, 0x04, 0xa0, + 0x80, 0x00, 0x0c, 0x10, 0x80, 0x01, 0x02, 0x38, + 0x80, 0x00, 0x05, 0x60, 0x98, 0x00, 0xf8, 0x01, + + // '7' (0x37) 12x21, offset 567-599, at +4/-20 + 0x0f, 0x00, 0x20, 0x00, 0x00, 0x04, 0x00, 0x80, + 0x00, 0x00, 0x10, 0x00, 0x00, 0x02, 0x00, 0x40, + 0x00, 0x80, 0x0f, 0x00, 0x1f, 0x01, 0x3c, 0x20, + 0xf0, 0x00, 0xe4, 0x01, 0x80, 0x07, 0x00, 0x00, + + // '8' (0x38) 13x21, offset 599-634, at +4/-20 + 0xf8, 0xe0, 0x83, 0x21, 0xc6, 0x08, 0x28, 0x20, + 0x01, 0x07, 0x1c, 0x40, 0x00, 0x03, 0x08, 0x60, + 0x00, 0x01, 0x0c, 0x20, 0x80, 0x01, 0x04, 0x50, + 0xc0, 0x01, 0x0b, 0x28, 0x20, 0xc6, 0x18, 0x83, + 0x0f, 0x3e, 0x00, + + // '9' (0x39) 12x21, offset 634-666, at +5/-20 + 0xf8, 0x01, 0x90, 0x61, 0x00, 0x0a, 0x10, 0xc0, + 0x01, 0x04, 0x18, 0x80, 0x00, 0x03, 0x10, 0x50, + 0x00, 0x02, 0x0a, 0x60, 0x20, 0x02, 0x04, 0x86, + 0x60, 0x60, 0xe0, 0x86, 0x03, 0xe0, 0x1f, 0x00, + + // ':' (0x3a) 5x15, offset 666-676, at +8/-14 + 0x0e, 0xb8, 0x0f, 0xfe, 0x07, 0xff, 0x83, 0xef, + 0x80, 0x03, + + // ';' (0x3b) 7x20, offset 676-694, at +5/-14 + 0x00, 0x00, 0x0f, 0x00, 0xfe, 0x0e, 0xfc, 0xf3, + 0xc1, 0x0f, 0x1f, 0x3c, 0xf0, 0xc1, 0x00, 0x0e, + 0x00, 0x00, + + // '<' (0x3c) 15x16, offset 694-724, at +3/-17 + 0x00, 0x01, 0x80, 0x01, 0x80, 0x03, 0xc0, 0x02, + 0x60, 0x06, 0x20, 0x04, 0x30, 0x0c, 0x10, 0x18, + 0x18, 0x10, 0x08, 0x30, 0x0c, 0x20, 0x04, 0x60, + 0x06, 0x40, 0x03, 0xc0, 0x01, 0x80, + + // '=' (0x3d) 17x6, offset 724-737, at +2/-12 + 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, + 0x86, 0x61, 0x18, 0x86, 0x21, + + // '>' (0x3e) 15x16, offset 737-767, at +3/-17 + 0x01, 0x80, 0x03, 0xc0, 0x06, 0x40, 0x04, 0x60, + 0x0c, 0x20, 0x08, 0x30, 0x18, 0x10, 0x10, 0x18, + 0x30, 0x0c, 0x20, 0x04, 0x60, 0x06, 0xc0, 0x02, + 0x80, 0x03, 0x80, 0x01, 0x00, 0x01, + + // '?' (0x3f) 12x20, offset 767-797, at +5/-19 + 0x1e, 0x00, 0x20, 0x00, 0x00, 0x03, 0x00, 0x10, + 0x00, 0x60, 0x01, 0x00, 0x1f, 0xc0, 0xf1, 0x01, + 0x06, 0x1f, 0x20, 0x60, 0x03, 0x03, 0x20, 0x10, + 0x00, 0x84, 0x00, 0x80, 0x07, 0x00, + + // '@' (0x40) 13x23, offset 797-835, at +4/-20 + 0xe0, 0xff, 0x03, 0x0c, 0x00, 0x86, 0x01, 0x00, + 0x4c, 0x00, 0x00, 0x14, 0xc0, 0x03, 0x0c, 0x10, + 0x03, 0x06, 0x04, 0x01, 0x03, 0x02, 0x81, 0x82, + 0x80, 0x40, 0x41, 0x40, 0x20, 0x21, 0x20, 0x08, + 0xff, 0x1f, 0x04, 0x00, 0x08, 0x00, + + // 'A' (0x41) 21x20, offset 835-888, at +0/-19 + 0x00, 0x00, 0x08, 0x00, 0x80, 0x00, 0x00, 0x18, + 0x00, 0xf0, 0x01, 0xe0, 0x19, 0xc0, 0x83, 0x81, + 0x17, 0x18, 0x0f, 0x01, 0x1f, 0x10, 0x70, 0x00, + 0x01, 0x01, 0x10, 0xf0, 0x00, 0x01, 0x78, 0x10, + 0x00, 0x1e, 0x81, 0x00, 0x1f, 0x08, 0x80, 0x87, + 0x00, 0xc0, 0x0b, 0x00, 0xf0, 0x00, 0x00, 0x08, + 0x00, 0x80, 0x00, 0x00, 0x08, + + // 'B' (0x42) 18x20, offset 888-933, at +1/-19 + 0x01, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0xf8, + 0xff, 0xff, 0x01, 0x02, 0x18, 0x20, 0x80, 0x01, + 0x02, 0x18, 0x20, 0x80, 0x01, 0x02, 0x18, 0x20, + 0x80, 0x01, 0x02, 0x18, 0x20, 0x80, 0x01, 0x03, + 0x28, 0x70, 0x80, 0x84, 0x04, 0x8c, 0xc7, 0x40, + 0x00, 0x18, 0x02, 0x00, 0x1e, + + // 'C' (0x43) 17x20, offset 933-976, at +2/-19 + 0xc0, 0x3f, 0x00, 0x03, 0x0c, 0x0c, 0x00, 0x41, + 0x00, 0x20, 0x02, 0x00, 0x24, 0x00, 0x40, 0x01, + 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x18, 0x00, + 0x80, 0x01, 0x00, 0x38, 0x00, 0x80, 0x02, 0x00, + 0x64, 0x00, 0x40, 0x0c, 0x00, 0xf6, 0x03, 0x30, + 0x00, 0x00, 0x01, + + // 'D' (0x44) 16x20, offset 976-1016, at +2/-19 + 0x01, 0x00, 0x18, 0x00, 0x80, 0xff, 0xff, 0x1f, + 0x00, 0x80, 0x01, 0x00, 0x18, 0x00, 0x80, 0x01, + 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x18, 0x00, + 0x80, 0x01, 0x00, 0x28, 0x00, 0x40, 0x06, 0x00, + 0xc6, 0x00, 0x30, 0x30, 0xc0, 0x00, 0xfc, 0x03, + + // 'E' (0x45) 17x20, offset 1016-1059, at +1/-19 + 0x01, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0xf8, + 0xff, 0xff, 0x01, 0x02, 0x18, 0x20, 0x80, 0x01, + 0x02, 0x18, 0x20, 0x80, 0x01, 0x02, 0x18, 0x20, + 0x80, 0x81, 0x0f, 0x18, 0x00, 0x80, 0x01, 0x00, + 0x18, 0x00, 0x80, 0x01, 0x00, 0xf8, 0x01, 0x80, + 0x00, 0xc0, 0x0f, + + // 'F' (0x46) 17x20, offset 1059-1102, at +1/-19 + 0x01, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0xf8, + 0xff, 0xff, 0x01, 0x02, 0x18, 0x20, 0x80, 0x01, + 0x02, 0x18, 0x20, 0x80, 0x01, 0x02, 0x18, 0x20, + 0x80, 0x81, 0x0f, 0x10, 0x00, 0x00, 0x01, 0x00, + 0x10, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, + 0x1f, 0x00, 0x00, + + // 'G' (0x47) 17x20, offset 1102-1145, at +2/-19 + 0xc0, 0x3f, 0x00, 0x03, 0x0c, 0x08, 0x00, 0x43, + 0x00, 0x20, 0x02, 0x00, 0x24, 0x00, 0x40, 0x01, + 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x18, 0x80, + 0x80, 0x01, 0x08, 0x18, 0x80, 0x80, 0x03, 0x08, + 0x28, 0x80, 0x40, 0x06, 0x08, 0xf4, 0x81, 0x7f, + 0x00, 0x08, 0x00, + + // 'H' (0x48) 16x20, offset 1145-1185, at +2/-19 + 0x01, 0x00, 0x18, 0x00, 0x80, 0xff, 0xff, 0x1f, + 0x20, 0x80, 0x01, 0x02, 0x18, 0x20, 0x80, 0x00, + 0x02, 0x00, 0x20, 0x00, 0x00, 0x02, 0x00, 0x20, + 0x00, 0x01, 0x02, 0x18, 0x20, 0x80, 0x01, 0x02, + 0xf8, 0xff, 0xff, 0x01, 0x00, 0x18, 0x00, 0x80, + + // 'I' (0x49) 13x20, offset 1185-1218, at +4/-19 + 0x01, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x18, + 0x00, 0x80, 0x01, 0x00, 0x18, 0x00, 0x80, 0xff, + 0xff, 0x1f, 0x00, 0x80, 0x01, 0x00, 0x18, 0x00, + 0x80, 0x01, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, + 0x08, + + // 'J' (0x4a) 17x20, offset 1218-1261, at +3/-19 + 0x00, 0xf8, 0x01, 0x00, 0x20, 0x00, 0x00, 0x04, + 0x00, 0x40, 0x00, 0x00, 0x08, 0x00, 0x80, 0x01, + 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x18, 0x00, + 0x40, 0x01, 0x00, 0x16, 0x00, 0x30, 0xff, 0xff, + 0x10, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, + 0x01, 0x00, 0x00, + + // 'K' (0x4b) 18x20, offset 1261-1306, at +1/-19 + 0x01, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0xf8, + 0xff, 0xff, 0x01, 0x0c, 0x18, 0x60, 0x80, 0x01, + 0x03, 0x18, 0x38, 0x80, 0xc0, 0x02, 0x00, 0x66, + 0x00, 0x30, 0x0c, 0x90, 0x81, 0x03, 0x0d, 0xf0, + 0x70, 0x00, 0x3c, 0x03, 0x00, 0x1e, 0x00, 0x80, + 0x01, 0x00, 0x08, 0x00, 0x80, + + // 'L' (0x4c) 15x20, offset 1306-1344, at +3/-19 + 0x01, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x18, + 0x00, 0x80, 0xff, 0xff, 0x1f, 0x00, 0x80, 0x01, + 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x08, 0x00, + 0x80, 0x00, 0x00, 0x08, 0x00, 0x80, 0x00, 0x00, + 0x08, 0x00, 0x80, 0x00, 0xe0, 0x0f, + + // 'M' (0x4d) 19x20, offset 1344-1392, at +1/-19 + 0x01, 0x00, 0x18, 0x00, 0x80, 0xff, 0xff, 0x3f, + 0x00, 0x80, 0x0e, 0x00, 0x88, 0x03, 0x80, 0xe0, + 0x01, 0x08, 0x70, 0x00, 0x00, 0x3c, 0x00, 0x00, + 0x03, 0x00, 0x3c, 0x00, 0x70, 0x00, 0xe0, 0x01, + 0x80, 0x03, 0x80, 0x0e, 0x00, 0x38, 0x00, 0x80, + 0xff, 0xff, 0x1f, 0x00, 0x80, 0x01, 0x00, 0x08, + + // 'N' (0x4e) 18x20, offset 1392-1437, at +1/-19 + 0x01, 0x00, 0x10, 0x00, 0x80, 0x01, 0x00, 0xf8, + 0xff, 0xff, 0x07, 0x00, 0xc8, 0x00, 0x80, 0x30, + 0x00, 0x08, 0x0e, 0x80, 0x80, 0x01, 0x00, 0x60, + 0x00, 0x00, 0x18, 0x10, 0x00, 0x07, 0x01, 0xc0, + 0x10, 0x00, 0x30, 0x01, 0x00, 0xfe, 0xff, 0xff, + 0x01, 0x00, 0x10, 0x00, 0x00, + + // 'O' (0x4f) 17x20, offset 1437-1480, at +2/-19 + 0xc0, 0x3f, 0x00, 0x07, 0x0e, 0x18, 0x80, 0x41, + 0x00, 0x20, 0x02, 0x00, 0x24, 0x00, 0x40, 0x01, + 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x18, 0x00, + 0x80, 0x01, 0x00, 0x28, 0x00, 0x40, 0x02, 0x00, + 0x44, 0x00, 0x20, 0x18, 0x80, 0x01, 0x07, 0x0e, + 0x80, 0x3f, 0x00, + + // 'P' (0x50) 16x20, offset 1480-1520, at +1/-19 + 0x01, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0xf8, + 0xff, 0xff, 0x01, 0x04, 0x18, 0x40, 0x80, 0x01, + 0x04, 0x18, 0x40, 0x80, 0x01, 0x04, 0x18, 0x40, + 0x80, 0x01, 0x04, 0x10, 0x40, 0x00, 0x02, 0x02, + 0x20, 0x30, 0x00, 0x8c, 0x01, 0x80, 0x0f, 0x00, + + // 'Q' (0x51) 17x24, offset 1520-1571, at +2/-19 + 0xc0, 0x3f, 0x00, 0x70, 0xe0, 0x00, 0x18, 0x80, + 0x01, 0x04, 0x00, 0xc2, 0x02, 0x00, 0xc4, 0x02, + 0x00, 0xec, 0x01, 0x00, 0x78, 0x01, 0x00, 0x58, + 0x01, 0x00, 0x48, 0x01, 0x00, 0x48, 0x01, 0x00, + 0x48, 0x02, 0x00, 0x44, 0x02, 0x00, 0x84, 0x04, + 0x00, 0x82, 0x18, 0x80, 0x81, 0x70, 0xe0, 0xc0, + 0xc0, 0x3f, 0x40, + + // 'R' (0x52) 19x20, offset 1571-1619, at +1/-19 + 0x01, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0xf8, + 0xff, 0xff, 0x01, 0x04, 0x18, 0x40, 0x80, 0x01, + 0x04, 0x18, 0x40, 0x80, 0x01, 0x04, 0x10, 0x40, + 0x00, 0x01, 0x0c, 0x10, 0xe0, 0x01, 0x02, 0x32, + 0x20, 0x30, 0x06, 0x8c, 0xc1, 0x81, 0x0f, 0x70, + 0x00, 0x00, 0x0c, 0x00, 0x80, 0x00, 0x00, 0x08, + + // 'S' (0x53) 14x20, offset 1619-1654, at +3/-19 + 0x00, 0xc0, 0x8f, 0x07, 0x20, 0x84, 0x01, 0x24, + 0x10, 0x40, 0x03, 0x03, 0x18, 0x20, 0x80, 0x01, + 0x02, 0x18, 0x20, 0x80, 0x01, 0x06, 0x38, 0x40, + 0x80, 0x02, 0x04, 0x64, 0xc0, 0x40, 0x1f, 0x18, + 0x03, 0x00, 0x1f, + + // 'T' (0x54) 15x20, offset 1654-1692, at +3/-19 + 0x1f, 0x00, 0x10, 0x00, 0x00, 0x01, 0x00, 0x18, + 0x00, 0x80, 0x01, 0x00, 0x18, 0x00, 0x80, 0x01, + 0x00, 0xf8, 0xff, 0xff, 0x01, 0x00, 0x18, 0x00, + 0x80, 0x01, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, + 0x18, 0x00, 0x00, 0x1f, 0x00, 0x00, + + // 'U' (0x55) 17x20, offset 1692-1735, at +2/-19 + 0x01, 0x00, 0x10, 0x00, 0x00, 0xff, 0xff, 0x10, + 0x00, 0x30, 0x01, 0x00, 0x16, 0x00, 0x40, 0x00, + 0x00, 0x08, 0x00, 0x80, 0x00, 0x00, 0x08, 0x00, + 0x80, 0x00, 0x00, 0x18, 0x00, 0x40, 0x01, 0x00, + 0x16, 0x00, 0x30, 0xff, 0xff, 0x10, 0x00, 0x00, + 0x01, 0x00, 0x00, + + // 'V' (0x56) 21x20, offset 1735-1788, at +0/-19 + 0x01, 0x00, 0x10, 0x00, 0x00, 0x01, 0x00, 0xf0, + 0x00, 0x00, 0x79, 0x00, 0x10, 0x3e, 0x00, 0x01, + 0x0f, 0x00, 0x80, 0x07, 0x00, 0xc0, 0x03, 0x00, + 0xf0, 0x00, 0x00, 0x0c, 0x00, 0xf0, 0x00, 0xe0, + 0x01, 0x80, 0x03, 0x01, 0x0f, 0x10, 0x1e, 0x00, + 0x79, 0x00, 0xf0, 0x00, 0x00, 0x01, 0x00, 0x10, + 0x00, 0x00, 0x01, 0x00, 0x00, + + // 'W' (0x57) 19x20, offset 1788-1836, at +1/-19 + 0x01, 0x00, 0x70, 0x00, 0x00, 0xf9, 0x07, 0x10, + 0x80, 0x3f, 0x01, 0x00, 0x1c, 0x00, 0xf8, 0x00, + 0xf0, 0x00, 0xf0, 0x01, 0xe0, 0x03, 0x00, 0x02, + 0x00, 0xc0, 0x03, 0x00, 0xe0, 0x01, 0x01, 0xe0, + 0x11, 0x00, 0xe0, 0x01, 0x00, 0x1c, 0xe0, 0xff, + 0xff, 0x1f, 0xf0, 0x00, 0x00, 0x01, 0x00, 0x00, + + // 'X' (0x58) 19x20, offset 1836-1884, at +1/-19 + 0x00, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x7c, + 0x00, 0xe0, 0x0d, 0x80, 0x9b, 0x03, 0x8c, 0x71, + 0x60, 0x08, 0x8c, 0x03, 0x80, 0x0f, 0x00, 0x60, + 0x00, 0x80, 0x0f, 0x00, 0x8c, 0x03, 0x71, 0x60, + 0x98, 0x01, 0x9c, 0x0f, 0x80, 0x7b, 0x00, 0xe0, + 0x01, 0x00, 0x1c, 0x00, 0x80, 0x00, 0x00, 0x08, + + // 'Y' (0x59) 17x20, offset 1884-1927, at +2/-19 + 0x01, 0x00, 0x10, 0x00, 0x00, 0x03, 0x00, 0xf0, + 0x00, 0x80, 0x19, 0x00, 0x18, 0x07, 0x80, 0xc0, + 0x01, 0x08, 0x30, 0x80, 0x00, 0xfe, 0x0f, 0x30, + 0x80, 0xc0, 0x01, 0x18, 0x07, 0x80, 0x19, 0x00, + 0xf8, 0x00, 0x80, 0x03, 0x00, 0x10, 0x00, 0x00, + 0x01, 0x00, 0x00, + + // 'Z' (0x5a) 13x20, offset 1927-1960, at +4/-19 + 0x3f, 0x00, 0x1e, 0x00, 0x90, 0x01, 0xc0, 0x18, + 0x00, 0x82, 0x01, 0x18, 0x18, 0x40, 0x80, 0x01, + 0x03, 0x18, 0x08, 0x80, 0x61, 0x00, 0x18, 0x01, + 0x80, 0x0d, 0x00, 0x38, 0x00, 0x80, 0x00, 0xe0, + 0x0f, + + // '[' (0x5b) 5x25, offset 1960-1976, at +10/-20 + 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x06, 0x00, + 0x00, 0x0c, 0x00, 0x00, 0x18, 0x00, 0x00, 0x10, + + // '\' (0x5c) 13x26, offset 1976-2019, at +4/-22 + 0x01, 0x00, 0x00, 0x38, 0x00, 0x00, 0x80, 0x03, + 0x00, 0x00, 0x38, 0x00, 0x00, 0x80, 0x03, 0x00, + 0x00, 0x30, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x30, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x30, 0x00, + 0x00, 0x00, 0x03, + + // ']' (0x5d) 5x25, offset 2019-2035, at +6/-20 + 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, + 0x00, 0x0c, 0x00, 0x00, 0xf8, 0xff, 0xff, 0x1f, + + // '^' (0x5e) 13x9, offset 2035-2050, at +4/-20 + 0x80, 0x81, 0x81, 0x81, 0xc1, 0xc1, 0xc0, 0x00, + 0x03, 0x1c, 0x60, 0x80, 0x01, 0x06, 0x18, + + // '_' (0x5f) 21x1, offset 2050-2053, at +0/+4 + 0xff, 0xff, 0x1f, + + // '`' (0x60) 6x5, offset 2053-2057, at +5/-21 + 0x61, 0x18, 0x86, 0x21, + + // 'a' (0x61) 16x15, offset 2057-2087, at +3/-14 + 0x00, 0x1e, 0x81, 0x90, 0x20, 0x58, 0x10, 0x18, + 0x04, 0x0c, 0x02, 0x06, 0x01, 0x83, 0x80, 0x41, + 0xe0, 0x20, 0x90, 0x10, 0xcc, 0x08, 0x82, 0xff, + 0x07, 0x00, 0x02, 0x00, 0x01, 0x80, + + // 'b' (0x62) 18x21, offset 2087-2135, at +1/-20 + 0x01, 0x00, 0x30, 0x00, 0x00, 0x06, 0x00, 0xc0, + 0xff, 0xff, 0x0f, 0x60, 0x70, 0x00, 0x02, 0x18, + 0x20, 0x00, 0x02, 0x04, 0xc0, 0x40, 0x00, 0x10, + 0x08, 0x00, 0x02, 0x01, 0x40, 0x20, 0x00, 0x08, + 0x04, 0x00, 0x01, 0x01, 0x10, 0x20, 0x00, 0x02, + 0x08, 0x20, 0x00, 0x06, 0x03, 0x00, 0x1f, 0x00, + + // 'c' (0x63) 15x15, offset 2135-2164, at +3/-14 + 0xe0, 0x07, 0x0c, 0x06, 0x01, 0x44, 0x00, 0x24, + 0x00, 0x0a, 0x00, 0x06, 0x00, 0x03, 0x80, 0x01, + 0xc0, 0x00, 0xe0, 0x00, 0x58, 0x00, 0x64, 0x00, + 0xfb, 0x80, 0x00, 0x20, 0x00, + + // 'd' (0x64) 18x21, offset 2164-2212, at +2/-20 + 0x00, 0xf8, 0x01, 0xc0, 0x60, 0x00, 0x04, 0x10, + 0x40, 0x00, 0x04, 0x08, 0x80, 0x81, 0x00, 0x20, + 0x10, 0x00, 0x04, 0x02, 0x80, 0x40, 0x00, 0x10, + 0x08, 0x00, 0x02, 0x02, 0xe0, 0x40, 0x00, 0x14, + 0x10, 0xc0, 0x02, 0x0c, 0xce, 0xff, 0xff, 0x07, + 0x00, 0x80, 0x00, 0x00, 0x10, 0x00, 0x00, 0x02, + + // 'e' (0x65) 16x15, offset 2212-2242, at +2/-14 + 0xe0, 0x03, 0xfc, 0x07, 0x23, 0xc6, 0x10, 0x22, + 0x08, 0x1a, 0x04, 0x05, 0x02, 0x03, 0x81, 0x81, + 0xc0, 0x40, 0x60, 0x20, 0x50, 0x10, 0x68, 0x08, + 0x62, 0x04, 0xe1, 0xc2, 0xe0, 0x21, + + // 'f' (0x66) 14x21, offset 2242-2279, at +4/-20 + 0x40, 0x00, 0x10, 0x08, 0x00, 0x02, 0x01, 0x40, + 0x20, 0x00, 0xc8, 0xff, 0xff, 0x85, 0x00, 0xe0, + 0x10, 0x00, 0x0c, 0x02, 0x80, 0x41, 0x00, 0x30, + 0x08, 0x00, 0x06, 0x01, 0xc0, 0x20, 0x00, 0x18, + 0x04, 0x00, 0x02, 0x00, 0x00, + + // 'g' (0x67) 17x22, offset 2279-2326, at +2/-14 + 0xf0, 0x03, 0x00, 0x07, 0x03, 0x60, 0x00, 0x01, + 0x08, 0x80, 0x00, 0x03, 0x60, 0x60, 0x00, 0x10, + 0x18, 0x00, 0x04, 0x06, 0x00, 0x81, 0x01, 0x40, + 0xe0, 0x00, 0x18, 0x28, 0x00, 0x02, 0x1a, 0x40, + 0x40, 0x1c, 0x0c, 0xc8, 0xff, 0xff, 0x11, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, + + // 'h' (0x68) 17x21, offset 2326-2371, at +1/-20 + 0x01, 0x00, 0x20, 0x00, 0x00, 0x06, 0x00, 0xc0, + 0xff, 0xff, 0x0f, 0x30, 0x00, 0x01, 0x03, 0x20, + 0x20, 0x00, 0x00, 0x02, 0x00, 0x40, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, + 0x08, 0x00, 0x01, 0x03, 0x20, 0x80, 0xff, 0x07, + 0x00, 0x80, 0x00, 0x00, 0x10, + + // 'i' (0x69) 14x22, offset 2371-2410, at +4/-21 + 0x00, 0x00, 0x20, 0x20, 0x00, 0x08, 0x08, 0x00, + 0x02, 0x02, 0x80, 0x80, 0x00, 0xe0, 0x23, 0x00, + 0xf8, 0xf8, 0xff, 0x03, 0x00, 0x80, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x08, 0x00, 0x00, 0x02, 0x00, + 0x80, 0x00, 0x00, 0x20, 0x00, 0x00, 0x08, + + // 'j' (0x6a) 10x29, offset 2410-2447, at +5/-21 + 0x80, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x02, + 0x02, 0x00, 0x40, 0x40, 0x00, 0x00, 0x08, 0x08, + 0x00, 0x00, 0x01, 0x01, 0x00, 0xe0, 0x23, 0x00, + 0x00, 0x7c, 0x04, 0x00, 0x40, 0x80, 0x00, 0x00, + 0x0c, 0xf0, 0xff, 0x7f, 0x00, + + // 'k' (0x6b) 16x21, offset 2447-2489, at +2/-20 + 0x01, 0x00, 0x30, 0x00, 0x00, 0x06, 0x00, 0xc0, + 0xff, 0xff, 0x0f, 0x00, 0x03, 0x00, 0x30, 0x00, + 0x00, 0x0f, 0x00, 0x30, 0x03, 0x40, 0xc3, 0x00, + 0x68, 0x30, 0x00, 0x07, 0x4c, 0x60, 0x00, 0x0f, + 0x04, 0xc0, 0x81, 0x00, 0x30, 0x10, 0x00, 0x04, + 0x00, 0x80, + + // 'l' (0x6c) 14x21, offset 2489-2526, at +4/-20 + 0x00, 0x00, 0x30, 0x00, 0x00, 0x06, 0x00, 0xc0, + 0x00, 0x00, 0x18, 0x00, 0x00, 0x03, 0x00, 0xe0, + 0xff, 0xff, 0x07, 0x00, 0x80, 0x00, 0x00, 0x10, + 0x00, 0x00, 0x02, 0x00, 0x40, 0x00, 0x00, 0x08, + 0x00, 0x00, 0x01, 0x00, 0x20, + + // 'm' (0x6d) 19x15, offset 2526-2562, at +1/-14 + 0x01, 0xc0, 0x00, 0xe0, 0xff, 0xdf, 0x00, 0x38, + 0x00, 0x0c, 0x00, 0x04, 0x00, 0x02, 0x00, 0x03, + 0x00, 0xff, 0xbf, 0x01, 0x70, 0x00, 0x18, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0xfc, 0x7f, + 0x00, 0x20, 0x00, 0x10, + + // 'n' (0x6e) 17x15, offset 2562-2594, at +1/-14 + 0x00, 0xc0, 0x00, 0x60, 0x00, 0xf0, 0xff, 0xcf, + 0x00, 0x34, 0x00, 0x0a, 0x00, 0x02, 0x00, 0x01, + 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x20, 0x00, + 0x34, 0x00, 0xe2, 0xff, 0x01, 0x80, 0x00, 0x40, + + // 'o' (0x6f) 15x15, offset 2594-2623, at +3/-14 + 0xe0, 0x03, 0x0c, 0x06, 0x01, 0x44, 0x00, 0x24, + 0x00, 0x0a, 0x00, 0x06, 0x00, 0x03, 0x80, 0x01, + 0xc0, 0x00, 0xa0, 0x00, 0x48, 0x00, 0x44, 0x00, + 0xc1, 0x60, 0x80, 0x0f, 0x00, + + // 'p' (0x70) 18x22, offset 2623-2673, at +1/-14 + 0x01, 0x00, 0x60, 0x00, 0x00, 0x18, 0x00, 0x00, + 0xfe, 0xff, 0xff, 0x1c, 0x0c, 0xa0, 0x01, 0x04, + 0x28, 0x00, 0x02, 0x0e, 0x80, 0x80, 0x01, 0x40, + 0x40, 0x00, 0x10, 0x10, 0x00, 0x04, 0x04, 0x00, + 0x01, 0x01, 0x40, 0xc0, 0x00, 0x08, 0x20, 0x00, + 0x02, 0x10, 0x40, 0x00, 0x18, 0x0c, 0x00, 0xfc, + 0x00, 0x00, + + // 'q' (0x71) 18x22, offset 2673-2723, at +2/-14 + 0xf0, 0x03, 0x00, 0x07, 0x03, 0x40, 0x00, 0x01, + 0x08, 0x80, 0x00, 0x03, 0x20, 0x40, 0x00, 0x10, + 0x10, 0x00, 0x04, 0x04, 0x00, 0x01, 0x01, 0x40, + 0x40, 0x00, 0x10, 0x30, 0x00, 0x02, 0x0a, 0x80, + 0x80, 0x06, 0x10, 0x20, 0x07, 0x03, 0xf8, 0xff, + 0xff, 0x07, 0x00, 0x80, 0x01, 0x00, 0x60, 0x00, + 0x00, 0x08, + + // 'r' (0x72) 15x15, offset 2723-2752, at +3/-14 + 0x01, 0xc0, 0x00, 0x60, 0x00, 0x30, 0x00, 0xf8, + 0xff, 0xc7, 0x00, 0x32, 0x00, 0x09, 0x80, 0x02, + 0xc0, 0x01, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, + 0x18, 0x00, 0x08, 0x00, 0x00, + + // 's' (0x73) 13x15, offset 2752-2777, at +4/-14 + 0x00, 0x7c, 0x1e, 0x98, 0x19, 0x48, 0x08, 0x18, + 0x04, 0x0c, 0x06, 0x06, 0x02, 0x03, 0x81, 0x81, + 0xc0, 0x41, 0xa0, 0x60, 0xe8, 0x61, 0x06, 0xe0, + 0x01, + + // 't' (0x74) 16x20, offset 2777-2817, at +1/-19 + 0x20, 0x00, 0x00, 0x02, 0x00, 0x20, 0x00, 0x00, + 0x02, 0x00, 0xff, 0xff, 0x03, 0x02, 0x40, 0x20, + 0x00, 0x0c, 0x02, 0x80, 0x20, 0x00, 0x08, 0x02, + 0x80, 0x20, 0x00, 0x08, 0x02, 0x80, 0x20, 0x00, + 0x0c, 0x02, 0x40, 0x00, 0x00, 0x04, 0x00, 0x60, + + // 'u' (0x75) 17x15, offset 2817-2849, at +1/-14 + 0x01, 0x80, 0x00, 0x40, 0x00, 0xe0, 0xff, 0x03, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x80, 0x00, + 0x40, 0x00, 0x60, 0x00, 0x38, 0x00, 0x14, 0x00, + 0x0b, 0x80, 0xfc, 0xff, 0x01, 0x80, 0x00, 0x40, + + // 'v' (0x76) 19x15, offset 2849-2885, at +1/-14 + 0x01, 0x80, 0x00, 0x40, 0x00, 0xe0, 0x01, 0xd0, + 0x03, 0x08, 0x07, 0x04, 0x1e, 0x00, 0x38, 0x00, + 0x70, 0x00, 0x20, 0x00, 0x18, 0x80, 0x13, 0x78, + 0x08, 0x07, 0xf4, 0x00, 0x1e, 0x00, 0x01, 0x80, + 0x00, 0x40, 0x00, 0x00, + + // 'w' (0x77) 19x15, offset 2885-2921, at +1/-14 + 0x01, 0x80, 0x00, 0xc0, 0x07, 0x20, 0x7f, 0x10, + 0xf0, 0x0b, 0x00, 0x03, 0xf0, 0x01, 0x1f, 0xf0, + 0x01, 0x0c, 0x00, 0x3c, 0x00, 0xf0, 0x00, 0xc0, + 0x0b, 0x00, 0x07, 0xfc, 0xf3, 0x07, 0x1f, 0x80, + 0x00, 0x40, 0x00, 0x00, + + // 'x' (0x78) 17x15, offset 2921-2953, at +2/-14 + 0x00, 0xc0, 0x00, 0xe0, 0x00, 0xfc, 0x00, 0xdb, + 0xc0, 0xcc, 0x30, 0xc2, 0x0c, 0xc0, 0x03, 0xc0, + 0x00, 0xf0, 0x00, 0xcc, 0x20, 0xc3, 0xd8, 0xc0, + 0x3c, 0xc0, 0x0f, 0xc0, 0x03, 0x80, 0x00, 0x40, + + // 'y' (0x79) 17x22, offset 2953-3000, at +2/-14 + 0x01, 0x00, 0x60, 0x00, 0x00, 0xf8, 0x00, 0x00, + 0xf6, 0x00, 0x80, 0xf1, 0x00, 0x60, 0xe0, 0x00, + 0x08, 0xe0, 0xc0, 0x03, 0xe0, 0xbd, 0x00, 0xe0, + 0x21, 0x00, 0x1c, 0x08, 0xc0, 0x01, 0x04, 0x1e, + 0x00, 0xe1, 0x00, 0x40, 0x0e, 0x00, 0xf0, 0x00, + 0x00, 0x0c, 0x00, 0x00, 0x01, 0x00, 0x00, + + // 'z' (0x7a) 13x15, offset 3000-3025, at +4/-14 + 0x0f, 0xc0, 0x00, 0x78, 0x00, 0x32, 0x80, 0x18, + 0x20, 0x0c, 0x0c, 0x06, 0x03, 0x43, 0x80, 0x11, + 0xc0, 0x04, 0xe0, 0x01, 0x30, 0x00, 0x08, 0x80, + 0x07, + + // '{' (0x7b) 8x25, offset 3025-3050, at +6/-20 + 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0xa0, + 0x00, 0x00, 0x40, 0x01, 0xe0, 0x7f, 0xfc, 0x6f, + 0x00, 0x00, 0x70, 0x00, 0x00, 0xc0, 0x00, 0x00, + 0x80, + + // '|' (0x7c) 1x25, offset 3050-3054, at +10/-20 + 0xff, 0xff, 0xff, 0x01, + + // '}' (0x7d) 8x25, offset 3054-3079, at +7/-20 + 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0e, 0x00, + 0x00, 0xf6, 0x3f, 0xfe, 0x07, 0x80, 0x02, 0x00, + 0x00, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, + + // '~' (0x7e) 15x5, offset 3079-3089, at +3/-11 + 0x88, 0x99, 0x10, 0x82, 0x20, 0x08, 0x42, 0xc8, + 0x8c, 0x00, +}; + +const uint8_t FreeMono18_RM[] = { + + // ' ' (0x20) 0x0, offset 0-0, at +0/+1 + + // '!' (0x21) 4x22, offset 0-11, at +8/-21 + 0x27, 0x77, 0x77, 0x77, 0x77, 0x22, 0x22, 0x20, + 0x00, 0x6f, 0xf6, + + // '"' (0x22) 11x10, offset 11-25, at +5/-20 + 0xf1, 0xfe, 0x3f, 0xc7, 0xf8, 0xff, 0x1e, 0xc3, + 0x98, 0x33, 0x06, 0x60, 0xcc, 0x18, + + // '#' (0x23) 14x24, offset 25-67, at +3/-21 + 0x04, 0x20, 0x10, 0x80, 0x42, 0x01, 0x08, 0x04, + 0x20, 0x10, 0x80, 0x42, 0x01, 0x10, 0x04, 0x41, + 0xff, 0xf0, 0x44, 0x02, 0x10, 0x08, 0x40, 0x21, + 0x0f, 0xff, 0xc2, 0x10, 0x08, 0x40, 0x21, 0x00, + 0x84, 0x02, 0x10, 0x08, 0x40, 0x23, 0x00, 0x88, + 0x02, 0x20, + + // '$' (0x24) 13x26, offset 67-110, at +4/-22 + 0x02, 0x00, 0x10, 0x00, 0x80, 0x1f, 0xa3, 0x07, + 0x10, 0x09, 0x00, 0x48, 0x00, 0x40, 0x03, 0x00, + 0x0c, 0x00, 0x3c, 0x00, 0x1e, 0x00, 0x18, 0x00, + 0x20, 0x01, 0x80, 0x0c, 0x00, 0x70, 0x05, 0xe0, + 0xc9, 0xf8, 0x01, 0x00, 0x08, 0x00, 0x40, 0x02, + 0x00, 0x10, 0x00, + + // '%' (0x25) 15x21, offset 110-150, at +3/-20 + 0x1e, 0x00, 0x42, 0x01, 0x02, 0x02, 0x04, 0x04, + 0x08, 0x08, 0x10, 0x08, 0x40, 0x0f, 0x00, 0x00, + 0x1e, 0x01, 0xf0, 0x1f, 0x01, 0xe0, 0x0e, 0x00, + 0x00, 0x3c, 0x00, 0x86, 0x02, 0x06, 0x04, 0x04, + 0x08, 0x08, 0x10, 0x30, 0x10, 0xc0, 0x1e, 0x00, + + // '&' (0x26) 12x18, offset 150-177, at +4/-17 + 0x0f, 0xc1, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, + 0x00, 0x10, 0x01, 0x00, 0x08, 0x03, 0xc0, 0x6c, + 0x3c, 0x62, 0x82, 0x68, 0x34, 0x81, 0xcc, 0x08, + 0x61, 0xc3, 0xe7, + + // ''' (0x27) 4x10, offset 177-182, at +8/-20 + 0xff, 0xff, 0xf6, 0x66, 0x66, + + // '(' (0x28) 5x25, offset 182-198, at +10/-20 + 0x08, 0xc4, 0x62, 0x31, 0x8c, 0xc6, 0x31, 0x8c, + 0x63, 0x18, 0xc3, 0x18, 0xc2, 0x18, 0xc3, 0x18, + + // ')' (0x29) 5x25, offset 198-214, at +6/-20 + 0x86, 0x10, 0xc2, 0x18, 0xc6, 0x10, 0xc6, 0x31, + 0x8c, 0x63, 0x18, 0x8c, 0x62, 0x31, 0x98, 0x80, + + // '*' (0x2a) 13x12, offset 214-234, at +4/-20 + 0x02, 0x00, 0x10, 0x00, 0x80, 0x04, 0x0c, 0x21, + 0x9d, 0x70, 0x1c, 0x00, 0xa0, 0x0d, 0x80, 0xc6, + 0x04, 0x10, 0x40, 0x80, + + // '+' (0x2b) 15x17, offset 234-266, at +3/-17 + 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, + 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0xff, + 0xfe, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, + 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x01, 0x00, + + // ',' (0x2c) 7x10, offset 266-275, at +5/-4 + 0x3e, 0x78, 0xf3, 0xc7, 0x8e, 0x18, 0x70, 0xc1, + 0x80, + + // '-' (0x2d) 15x1, offset 275-277, at +3/-9 + 0xff, 0xfe, + + // '.' (0x2e) 5x5, offset 277-281, at +8/-4 + 0x77, 0xff, 0xf7, 0x00, + + // '/' (0x2f) 13x26, offset 281-324, at +4/-22 + 0x00, 0x08, 0x00, 0xc0, 0x04, 0x00, 0x60, 0x02, + 0x00, 0x30, 0x01, 0x00, 0x18, 0x00, 0x80, 0x0c, + 0x00, 0x40, 0x02, 0x00, 0x20, 0x01, 0x00, 0x10, + 0x00, 0x80, 0x08, 0x00, 0x40, 0x04, 0x00, 0x20, + 0x02, 0x00, 0x10, 0x01, 0x00, 0x08, 0x00, 0x80, + 0x04, 0x00, 0x00, + + // '0' (0x30) 13x21, offset 324-359, at +4/-20 + 0x0f, 0x81, 0x82, 0x08, 0x08, 0x80, 0x24, 0x01, + 0x60, 0x0e, 0x00, 0x30, 0x01, 0x80, 0x0c, 0x00, + 0x60, 0x03, 0x00, 0x18, 0x00, 0xc0, 0x06, 0x00, + 0x30, 0x03, 0x40, 0x12, 0x00, 0x88, 0x08, 0x60, + 0xc0, 0xf8, 0x00, + + // '1' (0x31) 13x21, offset 359-394, at +4/-20 + 0x06, 0x00, 0x70, 0x06, 0x80, 0x64, 0x06, 0x20, + 0x31, 0x00, 0x08, 0x00, 0x40, 0x02, 0x00, 0x10, + 0x00, 0x80, 0x04, 0x00, 0x20, 0x01, 0x00, 0x08, + 0x00, 0x40, 0x02, 0x00, 0x10, 0x00, 0x80, 0x04, + 0x0f, 0xff, 0x80, + + // '2' (0x32) 13x21, offset 394-429, at +3/-20 + 0x0f, 0x80, 0xc3, 0x08, 0x04, 0x80, 0x24, 0x00, + 0x80, 0x04, 0x00, 0x20, 0x02, 0x00, 0x10, 0x01, + 0x00, 0x10, 0x01, 0x80, 0x18, 0x01, 0x80, 0x18, + 0x01, 0x80, 0x18, 0x01, 0x80, 0x58, 0x03, 0x80, + 0x1f, 0xff, 0x80, + + // '3' (0x33) 14x21, offset 429-466, at +3/-20 + 0x0f, 0xc0, 0xc0, 0x86, 0x01, 0x00, 0x02, 0x00, + 0x08, 0x00, 0x20, 0x00, 0x80, 0x04, 0x00, 0x20, + 0x0f, 0x00, 0x06, 0x00, 0x04, 0x00, 0x08, 0x00, + 0x10, 0x00, 0x40, 0x01, 0x00, 0x04, 0x00, 0x2c, + 0x01, 0x9c, 0x0c, 0x0f, 0xc0, + + // '4' (0x34) 12x21, offset 466-498, at +4/-20 + 0x01, 0xc0, 0x14, 0x02, 0x40, 0x64, 0x04, 0x40, + 0xc4, 0x08, 0x41, 0x84, 0x10, 0x42, 0x04, 0x20, + 0x44, 0x04, 0x40, 0x48, 0x04, 0xff, 0xf0, 0x04, + 0x00, 0x40, 0x04, 0x00, 0x40, 0x04, 0x07, 0xf0, + + // '5' (0x35) 14x21, offset 498-535, at +3/-20 + 0x3f, 0xf0, 0x80, 0x02, 0x00, 0x08, 0x00, 0x20, + 0x00, 0x80, 0x02, 0x00, 0x0b, 0xf0, 0x30, 0x30, + 0x00, 0x60, 0x00, 0x80, 0x01, 0x00, 0x04, 0x00, + 0x10, 0x00, 0x40, 0x01, 0x00, 0x0e, 0x00, 0x2c, + 0x01, 0x0c, 0x18, 0x0f, 0xc0, + + // '6' (0x36) 12x21, offset 535-567, at +5/-20 + 0x01, 0xf0, 0x60, 0x18, 0x03, 0x00, 0x20, 0x04, + 0x00, 0x40, 0x0c, 0x00, 0x80, 0x08, 0xf8, 0x98, + 0x4a, 0x02, 0xe0, 0x3c, 0x01, 0x80, 0x14, 0x01, + 0x40, 0x14, 0x03, 0x20, 0x21, 0x0c, 0x0f, 0x80, + + // '7' (0x37) 12x21, offset 567-599, at +4/-20 + 0xff, 0xf8, 0x01, 0x80, 0x18, 0x03, 0x00, 0x20, + 0x02, 0x00, 0x20, 0x04, 0x00, 0x40, 0x04, 0x00, + 0xc0, 0x08, 0x00, 0x80, 0x18, 0x01, 0x00, 0x10, + 0x01, 0x00, 0x30, 0x02, 0x00, 0x20, 0x02, 0x00, + + // '8' (0x38) 13x21, offset 599-634, at +4/-20 + 0x0f, 0x81, 0x83, 0x10, 0x05, 0x80, 0x38, 0x00, + 0xc0, 0x06, 0x00, 0x30, 0x03, 0x40, 0x11, 0x83, + 0x07, 0xf0, 0x60, 0xc4, 0x01, 0x60, 0x0e, 0x00, + 0x30, 0x01, 0x80, 0x0e, 0x00, 0xd0, 0x04, 0x60, + 0xc1, 0xfc, 0x00, + + // '9' (0x39) 12x21, offset 634-666, at +5/-20 + 0x1f, 0x03, 0x08, 0x40, 0x4c, 0x02, 0x80, 0x28, + 0x02, 0x80, 0x18, 0x03, 0xc0, 0x74, 0x05, 0x21, + 0x91, 0xf1, 0x00, 0x10, 0x03, 0x00, 0x20, 0x02, + 0x00, 0x40, 0x0c, 0x01, 0x80, 0x60, 0xf8, 0x00, + + // ':' (0x3a) 5x15, offset 666-676, at +8/-14 + 0x77, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x1d, 0xff, + 0xfd, 0xc0, + + // ';' (0x3b) 7x20, offset 676-694, at +5/-14 + 0x1c, 0x7c, 0xf9, 0xf1, 0xc0, 0x00, 0x00, 0x00, + 0x00, 0xf1, 0xe3, 0x8f, 0x1c, 0x38, 0xe1, 0xc3, + 0x06, 0x00, + + // '<' (0x3c) 15x16, offset 694-724, at +3/-17 + 0x00, 0x06, 0x00, 0x18, 0x00, 0xe0, 0x07, 0x00, + 0x38, 0x01, 0xc0, 0x06, 0x00, 0x38, 0x00, 0xe0, + 0x00, 0x70, 0x00, 0x38, 0x00, 0x18, 0x00, 0x1c, + 0x00, 0x0e, 0x00, 0x07, 0x00, 0x03, + + // '=' (0x3d) 17x6, offset 724-737, at +2/-12 + 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0xff, 0xfc, + + // '>' (0x3e) 15x16, offset 737-767, at +3/-17 + 0xc0, 0x00, 0xc0, 0x00, 0xe0, 0x00, 0x70, 0x00, + 0x38, 0x00, 0x1c, 0x00, 0x0c, 0x00, 0x0e, 0x00, + 0x0e, 0x00, 0x70, 0x03, 0x80, 0x0c, 0x00, 0x70, + 0x03, 0x80, 0x1c, 0x00, 0x60, 0x00, + + // '?' (0x3f) 12x20, offset 767-797, at +5/-19 + 0x3f, 0x8e, 0x0c, 0x80, 0x28, 0x01, 0x80, 0x10, + 0x01, 0x00, 0x10, 0x02, 0x00, 0xc0, 0x38, 0x06, + 0x00, 0x40, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0e, 0x01, 0xf0, 0x1f, 0x00, 0xe0, + + // '@' (0x40) 13x23, offset 797-835, at +4/-20 + 0x0f, 0x01, 0x86, 0x08, 0x08, 0x80, 0x24, 0x01, + 0x40, 0x0a, 0x00, 0x50, 0x1e, 0x83, 0x14, 0x20, + 0xa2, 0x05, 0x10, 0x28, 0x81, 0x46, 0x0a, 0x18, + 0x50, 0x3f, 0x80, 0x04, 0x00, 0x10, 0x00, 0x80, + 0x02, 0x00, 0x18, 0x18, 0x3f, 0x00, + + // 'A' (0x41) 21x20, offset 835-888, at +0/-19 + 0x1f, 0xf0, 0x00, 0x06, 0x80, 0x00, 0x34, 0x00, + 0x01, 0x30, 0x00, 0x18, 0x80, 0x00, 0x86, 0x00, + 0x04, 0x30, 0x00, 0x60, 0x80, 0x02, 0x06, 0x00, + 0x10, 0x10, 0x01, 0x80, 0x80, 0x08, 0x06, 0x00, + 0x7f, 0xf0, 0x06, 0x00, 0x80, 0x20, 0x06, 0x01, + 0x00, 0x10, 0x18, 0x00, 0xc0, 0x80, 0x06, 0x04, + 0x00, 0x11, 0xfc, 0x0f, 0xf0, + + // 'B' (0x42) 18x20, offset 888-933, at +1/-19 + 0xff, 0xf8, 0x04, 0x01, 0x01, 0x00, 0x20, 0x40, + 0x04, 0x10, 0x01, 0x04, 0x00, 0x41, 0x00, 0x10, + 0x40, 0x08, 0x10, 0x0c, 0x07, 0xff, 0x01, 0x00, + 0x70, 0x40, 0x06, 0x10, 0x00, 0x84, 0x00, 0x11, + 0x00, 0x04, 0x40, 0x01, 0x10, 0x00, 0x44, 0x00, + 0x21, 0x00, 0x33, 0xff, 0xf8, + + // 'C' (0x43) 17x20, offset 933-976, at +2/-19 + 0x03, 0xf1, 0x06, 0x0e, 0x8c, 0x01, 0xc4, 0x00, + 0x64, 0x00, 0x12, 0x00, 0x0a, 0x00, 0x01, 0x00, + 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, + 0x80, 0x00, 0x20, 0x01, 0x88, 0x01, 0x83, 0x03, + 0x80, 0x7e, 0x00, + + // 'D' (0x44) 16x20, offset 976-1016, at +2/-19 + 0xff, 0xe0, 0x20, 0x18, 0x20, 0x0c, 0x20, 0x04, + 0x20, 0x02, 0x20, 0x02, 0x20, 0x01, 0x20, 0x01, + 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, + 0x20, 0x01, 0x20, 0x01, 0x20, 0x02, 0x20, 0x02, + 0x20, 0x04, 0x20, 0x0c, 0x20, 0x18, 0xff, 0xe0, + + // 'E' (0x45) 17x20, offset 1016-1059, at +1/-19 + 0xff, 0xff, 0x08, 0x00, 0x84, 0x00, 0x42, 0x00, + 0x21, 0x00, 0x10, 0x80, 0x00, 0x40, 0x00, 0x20, + 0x40, 0x10, 0x20, 0x0f, 0xf0, 0x04, 0x08, 0x02, + 0x04, 0x01, 0x00, 0x00, 0x80, 0x00, 0x40, 0x02, + 0x20, 0x01, 0x10, 0x00, 0x88, 0x00, 0x44, 0x00, + 0x3f, 0xff, 0xf0, + + // 'F' (0x46) 17x20, offset 1059-1102, at +1/-19 + 0xff, 0xff, 0x88, 0x00, 0x44, 0x00, 0x22, 0x00, + 0x11, 0x00, 0x08, 0x80, 0x00, 0x40, 0x00, 0x20, + 0x40, 0x10, 0x20, 0x0f, 0xf0, 0x04, 0x08, 0x02, + 0x04, 0x01, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, + 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x1f, 0xf8, 0x00, + + // 'G' (0x47) 17x20, offset 1102-1145, at +2/-19 + 0x03, 0xf9, 0x06, 0x07, 0x84, 0x00, 0xc4, 0x00, + 0x24, 0x00, 0x12, 0x00, 0x02, 0x00, 0x01, 0x00, + 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, + 0x0f, 0xf8, 0x00, 0x14, 0x00, 0x09, 0x00, 0x04, + 0x80, 0x02, 0x20, 0x01, 0x18, 0x00, 0x83, 0x01, + 0xc0, 0x7f, 0x00, + + // 'H' (0x48) 16x20, offset 1145-1185, at +2/-19 + 0xfc, 0x3f, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, + 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, + 0x20, 0x04, 0x3f, 0xfc, 0x20, 0x04, 0x20, 0x04, + 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, + 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0xfc, 0x3f, + + // 'I' (0x49) 13x20, offset 1185-1218, at +4/-19 + 0xff, 0xf8, 0x10, 0x00, 0x80, 0x04, 0x00, 0x20, + 0x01, 0x00, 0x08, 0x00, 0x40, 0x02, 0x00, 0x10, + 0x00, 0x80, 0x04, 0x00, 0x20, 0x01, 0x00, 0x08, + 0x00, 0x40, 0x02, 0x00, 0x10, 0x00, 0x81, 0xff, + 0xf0, + + // 'J' (0x4a) 17x20, offset 1218-1261, at +3/-19 + 0x03, 0xff, 0x80, 0x04, 0x00, 0x02, 0x00, 0x01, + 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, + 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x10, + 0x01, 0x08, 0x00, 0x84, 0x00, 0x42, 0x00, 0x21, + 0x00, 0x10, 0x80, 0x10, 0x20, 0x18, 0x0c, 0x18, + 0x01, 0xf0, 0x00, + + // 'K' (0x4b) 18x20, offset 1261-1306, at +1/-19 + 0xff, 0x1f, 0x84, 0x01, 0x81, 0x00, 0xc0, 0x40, + 0x60, 0x10, 0x30, 0x04, 0x18, 0x01, 0x0c, 0x00, + 0x46, 0x00, 0x13, 0x00, 0x05, 0xf0, 0x01, 0xc6, + 0x00, 0x60, 0xc0, 0x10, 0x18, 0x04, 0x06, 0x01, + 0x00, 0xc0, 0x40, 0x30, 0x10, 0x04, 0x04, 0x01, + 0x81, 0x00, 0x23, 0xfc, 0x0f, + + // 'L' (0x4c) 15x20, offset 1306-1344, at +3/-19 + 0xff, 0x80, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, + 0x80, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, + 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, + 0x01, 0x00, 0x42, 0x00, 0x84, 0x01, 0x08, 0x02, + 0x10, 0x04, 0x20, 0x0f, 0xff, 0xf0, + + // 'M' (0x4d) 19x20, offset 1344-1392, at +1/-19 + 0xf0, 0x01, 0xe7, 0x00, 0x70, 0xa0, 0x0a, 0x16, + 0x03, 0x42, 0x40, 0x48, 0x4c, 0x19, 0x08, 0x82, + 0x21, 0x10, 0x44, 0x23, 0x18, 0x84, 0x22, 0x10, + 0x86, 0xc2, 0x10, 0x50, 0x42, 0x0e, 0x08, 0x41, + 0xc1, 0x08, 0x00, 0x21, 0x00, 0x04, 0x20, 0x00, + 0x84, 0x00, 0x10, 0x80, 0x02, 0x7f, 0x03, 0xf0, + + // 'N' (0x4e) 18x20, offset 1392-1437, at +1/-19 + 0xf8, 0x1f, 0xc6, 0x00, 0x41, 0xc0, 0x10, 0x50, + 0x04, 0x12, 0x01, 0x04, 0xc0, 0x41, 0x10, 0x10, + 0x46, 0x04, 0x10, 0x81, 0x04, 0x10, 0x41, 0x04, + 0x10, 0x40, 0x84, 0x10, 0x31, 0x04, 0x04, 0x41, + 0x01, 0x90, 0x40, 0x24, 0x10, 0x05, 0x04, 0x01, + 0xc1, 0x00, 0x31, 0xfc, 0x0c, + + // 'O' (0x4f) 17x20, offset 1437-1480, at +2/-19 + 0x03, 0xe0, 0x06, 0x0c, 0x04, 0x01, 0x04, 0x00, + 0x46, 0x00, 0x32, 0x00, 0x0b, 0x00, 0x05, 0x00, + 0x01, 0x80, 0x00, 0xc0, 0x00, 0x60, 0x00, 0x30, + 0x00, 0x18, 0x00, 0x0e, 0x00, 0x0d, 0x00, 0x04, + 0xc0, 0x06, 0x20, 0x02, 0x08, 0x02, 0x03, 0x06, + 0x00, 0x7c, 0x00, + + // 'P' (0x50) 16x20, offset 1480-1520, at +1/-19 + 0xff, 0xf0, 0x10, 0x0c, 0x10, 0x02, 0x10, 0x03, + 0x10, 0x01, 0x10, 0x01, 0x10, 0x01, 0x10, 0x03, + 0x10, 0x06, 0x10, 0x0c, 0x1f, 0xf0, 0x10, 0x00, + 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, + 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0xff, 0xc0, + + // 'Q' (0x51) 17x24, offset 1520-1571, at +2/-19 + 0x03, 0xe0, 0x06, 0x0c, 0x04, 0x01, 0x04, 0x00, + 0x46, 0x00, 0x32, 0x00, 0x0b, 0x00, 0x07, 0x00, + 0x01, 0x80, 0x00, 0xc0, 0x00, 0x60, 0x00, 0x30, + 0x00, 0x18, 0x00, 0x0e, 0x00, 0x0d, 0x00, 0x04, + 0xc0, 0x06, 0x20, 0x02, 0x08, 0x02, 0x03, 0x06, + 0x00, 0xfc, 0x00, 0x30, 0x00, 0x30, 0x00, 0x7f, + 0xc6, 0x38, 0x1e, + + // 'R' (0x52) 19x20, offset 1571-1619, at +1/-19 + 0xff, 0xf0, 0x02, 0x01, 0x80, 0x40, 0x08, 0x08, + 0x01, 0x81, 0x00, 0x10, 0x20, 0x02, 0x04, 0x00, + 0x40, 0x80, 0x18, 0x10, 0x06, 0x02, 0x03, 0x80, + 0x7f, 0xc0, 0x08, 0x18, 0x01, 0x01, 0x80, 0x20, + 0x18, 0x04, 0x01, 0x80, 0x80, 0x10, 0x10, 0x03, + 0x02, 0x00, 0x20, 0x40, 0x06, 0x7f, 0x80, 0x70, + + // 'S' (0x53) 14x20, offset 1619-1654, at +3/-19 + 0x0f, 0xc8, 0x61, 0xe2, 0x01, 0x90, 0x02, 0x40, + 0x09, 0x00, 0x04, 0x00, 0x08, 0x00, 0x38, 0x00, + 0x3e, 0x00, 0x0f, 0x00, 0x06, 0x00, 0x0c, 0x00, + 0x18, 0x00, 0x60, 0x01, 0x80, 0x0f, 0x00, 0x2b, + 0x03, 0x23, 0xf0, + + // 'T' (0x54) 15x20, offset 1654-1692, at +3/-19 + 0xff, 0xff, 0x02, 0x06, 0x04, 0x0c, 0x08, 0x18, + 0x10, 0x20, 0x20, 0x00, 0x40, 0x00, 0x80, 0x01, + 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, + 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x01, 0x00, + 0x02, 0x00, 0x04, 0x01, 0xff, 0xc0, + + // 'U' (0x55) 17x20, offset 1692-1735, at +2/-19 + 0xfc, 0x1f, 0x90, 0x01, 0x08, 0x00, 0x84, 0x00, + 0x42, 0x00, 0x21, 0x00, 0x10, 0x80, 0x08, 0x40, + 0x04, 0x20, 0x02, 0x10, 0x01, 0x08, 0x00, 0x84, + 0x00, 0x42, 0x00, 0x21, 0x00, 0x10, 0x80, 0x08, + 0x40, 0x04, 0x10, 0x04, 0x0c, 0x06, 0x03, 0x06, + 0x00, 0x7c, 0x00, + + // 'V' (0x56) 21x20, offset 1735-1788, at +0/-19 + 0xfe, 0x03, 0xf8, 0x80, 0x02, 0x04, 0x00, 0x10, + 0x30, 0x01, 0x80, 0x80, 0x08, 0x06, 0x00, 0xc0, + 0x30, 0x06, 0x00, 0x80, 0x20, 0x06, 0x03, 0x00, + 0x30, 0x10, 0x00, 0x80, 0x80, 0x06, 0x0c, 0x00, + 0x10, 0x40, 0x00, 0x86, 0x00, 0x06, 0x20, 0x00, + 0x11, 0x00, 0x00, 0xd8, 0x00, 0x06, 0x80, 0x00, + 0x1c, 0x00, 0x00, 0xe0, 0x00, + + // 'W' (0x57) 19x20, offset 1788-1836, at +1/-19 + 0xfc, 0x0f, 0xe8, 0x00, 0x19, 0x00, 0x03, 0x10, + 0x00, 0x62, 0x00, 0x08, 0x41, 0x81, 0x08, 0x28, + 0x21, 0x05, 0x04, 0x21, 0xa0, 0x84, 0x36, 0x30, + 0x84, 0x46, 0x08, 0x88, 0xc1, 0x31, 0x18, 0x24, + 0x12, 0x04, 0x82, 0x40, 0xb0, 0x48, 0x14, 0x09, + 0x02, 0x80, 0xa0, 0x30, 0x1c, 0x06, 0x03, 0x80, + + // 'X' (0x58) 19x20, offset 1836-1884, at +1/-19 + 0x7e, 0x0f, 0xc2, 0x00, 0x60, 0x60, 0x0c, 0x06, + 0x03, 0x00, 0x60, 0xc0, 0x0c, 0x10, 0x00, 0xc6, + 0x00, 0x0d, 0x80, 0x00, 0xa0, 0x00, 0x1c, 0x00, + 0x03, 0x80, 0x00, 0xd8, 0x00, 0x11, 0x00, 0x06, + 0x30, 0x01, 0x83, 0x00, 0x60, 0x30, 0x08, 0x06, + 0x03, 0x00, 0x60, 0xc0, 0x06, 0x7f, 0x07, 0xf0, + + // 'Y' (0x59) 17x20, offset 1884-1927, at +2/-19 + 0xfc, 0x1f, 0x98, 0x03, 0x04, 0x01, 0x03, 0x01, + 0x80, 0xc1, 0x80, 0x20, 0x80, 0x18, 0xc0, 0x04, + 0x40, 0x03, 0x60, 0x00, 0xe0, 0x00, 0x20, 0x00, + 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, + 0x01, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, + 0x03, 0xff, 0x80, + + // 'Z' (0x5a) 13x20, offset 1927-1960, at +4/-19 + 0xff, 0xf4, 0x00, 0xa0, 0x09, 0x00, 0x48, 0x04, + 0x40, 0x40, 0x02, 0x00, 0x20, 0x02, 0x00, 0x10, + 0x01, 0x00, 0x10, 0x00, 0x80, 0x08, 0x04, 0x80, + 0x24, 0x01, 0x40, 0x0c, 0x00, 0x60, 0x03, 0xff, + 0xf0, + + // '[' (0x5b) 5x25, offset 1960-1976, at +10/-20 + 0xfc, 0x21, 0x08, 0x42, 0x10, 0x84, 0x21, 0x08, + 0x42, 0x10, 0x84, 0x21, 0x08, 0x42, 0x10, 0xf8, + + // '\' (0x5c) 13x26, offset 1976-2019, at +4/-22 + 0x80, 0x02, 0x00, 0x10, 0x00, 0xc0, 0x02, 0x00, + 0x18, 0x00, 0x40, 0x03, 0x00, 0x08, 0x00, 0x40, + 0x01, 0x00, 0x08, 0x00, 0x20, 0x01, 0x00, 0x04, + 0x00, 0x20, 0x00, 0x80, 0x04, 0x00, 0x10, 0x00, + 0x80, 0x02, 0x00, 0x10, 0x00, 0x40, 0x02, 0x00, + 0x08, 0x00, 0x40, + + // ']' (0x5d) 5x25, offset 2019-2035, at +6/-20 + 0xf8, 0x42, 0x10, 0x84, 0x21, 0x08, 0x42, 0x10, + 0x84, 0x21, 0x08, 0x42, 0x10, 0x84, 0x21, 0xf8, + + // '^' (0x5e) 13x9, offset 2035-2050, at +4/-20 + 0x02, 0x00, 0x38, 0x03, 0x60, 0x11, 0x01, 0x8c, + 0x18, 0x31, 0x80, 0xd8, 0x03, 0x80, 0x08, + + // '_' (0x5f) 21x1, offset 2050-2053, at +0/+4 + 0xff, 0xff, 0xf8, + + // '`' (0x60) 6x5, offset 2053-2057, at +5/-21 + 0xc1, 0x83, 0x06, 0x0c, + + // 'a' (0x61) 16x15, offset 2057-2087, at +3/-14 + 0x0f, 0xc0, 0x70, 0x30, 0x00, 0x10, 0x00, 0x08, + 0x00, 0x08, 0x00, 0x08, 0x0f, 0xf8, 0x30, 0x08, + 0x40, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, + 0x80, 0x38, 0x60, 0xe8, 0x3f, 0x8f, + + // 'b' (0x62) 18x21, offset 2087-2135, at +1/-20 + 0xf0, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x40, + 0x00, 0x10, 0x00, 0x04, 0x00, 0x01, 0x0f, 0x80, + 0x4c, 0x18, 0x14, 0x01, 0x06, 0x00, 0x21, 0x80, + 0x08, 0x40, 0x01, 0x10, 0x00, 0x44, 0x00, 0x11, + 0x00, 0x04, 0x40, 0x01, 0x18, 0x00, 0x86, 0x00, + 0x21, 0xc0, 0x10, 0x5c, 0x18, 0xf1, 0xf8, 0x00, + + // 'c' (0x63) 15x15, offset 2135-2164, at +3/-14 + 0x07, 0xe4, 0x30, 0x78, 0x80, 0x32, 0x00, 0x24, + 0x00, 0x50, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, + 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x12, 0x00, + 0xc3, 0x07, 0x01, 0xf8, 0x00, + + // 'd' (0x64) 18x21, offset 2164-2212, at +2/-20 + 0x00, 0x1e, 0x00, 0x00, 0x80, 0x00, 0x20, 0x00, + 0x08, 0x00, 0x02, 0x00, 0x00, 0x80, 0x7c, 0x20, + 0x60, 0xc8, 0x20, 0x0a, 0x10, 0x01, 0x84, 0x00, + 0x62, 0x00, 0x08, 0x80, 0x02, 0x20, 0x00, 0x88, + 0x00, 0x22, 0x00, 0x08, 0xc0, 0x06, 0x10, 0x01, + 0x82, 0x00, 0xe0, 0x60, 0xe8, 0x0f, 0xe3, 0xc0, + + // 'e' (0x65) 16x15, offset 2212-2242, at +2/-14 + 0x07, 0xe0, 0x1c, 0x18, 0x30, 0x0c, 0x60, 0x06, + 0x40, 0x03, 0xc0, 0x03, 0xc0, 0x01, 0xff, 0xff, + 0xc0, 0x00, 0xc0, 0x00, 0x40, 0x00, 0x60, 0x00, + 0x30, 0x03, 0x0c, 0x0e, 0x03, 0xf0, + + // 'f' (0x66) 14x21, offset 2242-2279, at +4/-20 + 0x03, 0xfc, 0x18, 0x00, 0x80, 0x02, 0x00, 0x08, + 0x00, 0x20, 0x0f, 0xff, 0x82, 0x00, 0x08, 0x00, + 0x20, 0x00, 0x80, 0x02, 0x00, 0x08, 0x00, 0x20, + 0x00, 0x80, 0x02, 0x00, 0x08, 0x00, 0x20, 0x00, + 0x80, 0x02, 0x00, 0xff, 0xf0, + + // 'g' (0x67) 17x22, offset 2279-2326, at +2/-14 + 0x0f, 0xc7, 0x9c, 0x3a, 0x18, 0x07, 0x08, 0x01, + 0x8c, 0x00, 0xc4, 0x00, 0x22, 0x00, 0x11, 0x00, + 0x08, 0x80, 0x04, 0x40, 0x02, 0x10, 0x03, 0x08, + 0x01, 0x82, 0x01, 0x40, 0xc3, 0x20, 0x3f, 0x10, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, + 0x00, 0x01, 0x00, 0x01, 0x00, 0x7f, 0x00, + + // 'h' (0x68) 17x21, offset 2326-2371, at +1/-20 + 0xf0, 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, + 0x01, 0x00, 0x00, 0x80, 0x00, 0x47, 0xc0, 0x2c, + 0x18, 0x1c, 0x04, 0x0c, 0x01, 0x04, 0x00, 0x82, + 0x00, 0x41, 0x00, 0x20, 0x80, 0x10, 0x40, 0x08, + 0x20, 0x04, 0x10, 0x02, 0x08, 0x01, 0x04, 0x00, + 0x82, 0x00, 0x47, 0xc0, 0xf8, + + // 'i' (0x69) 14x22, offset 2371-2410, at +4/-21 + 0x06, 0x00, 0x18, 0x00, 0x60, 0x01, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x02, 0x00, + 0x08, 0x00, 0x20, 0x00, 0x80, 0x02, 0x00, 0x08, + 0x00, 0x20, 0x00, 0x80, 0x02, 0x00, 0x08, 0x00, + 0x20, 0x00, 0x80, 0x02, 0x03, 0xff, 0xf0, + + // 'j' (0x6a) 10x29, offset 2410-2447, at +5/-21 + 0x03, 0x00, 0xc0, 0x30, 0x0c, 0x00, 0x00, 0x00, + 0x03, 0xff, 0x00, 0x40, 0x10, 0x04, 0x01, 0x00, + 0x40, 0x10, 0x04, 0x01, 0x00, 0x40, 0x10, 0x04, + 0x01, 0x00, 0x40, 0x10, 0x04, 0x01, 0x00, 0x40, + 0x10, 0x08, 0x06, 0xfe, 0x00, + + // 'k' (0x6b) 16x21, offset 2447-2489, at +2/-20 + 0xf0, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, + 0x10, 0x00, 0x10, 0x00, 0x10, 0xfe, 0x10, 0x30, + 0x10, 0xe0, 0x11, 0xc0, 0x13, 0x00, 0x16, 0x00, + 0x1e, 0x00, 0x1b, 0x00, 0x11, 0x80, 0x10, 0xc0, + 0x10, 0x60, 0x10, 0x30, 0x10, 0x18, 0x10, 0x1c, + 0xf0, 0x3f, + + // 'l' (0x6c) 14x21, offset 2489-2526, at +4/-20 + 0x7e, 0x00, 0x08, 0x00, 0x20, 0x00, 0x80, 0x02, + 0x00, 0x08, 0x00, 0x20, 0x00, 0x80, 0x02, 0x00, + 0x08, 0x00, 0x20, 0x00, 0x80, 0x02, 0x00, 0x08, + 0x00, 0x20, 0x00, 0x80, 0x02, 0x00, 0x08, 0x00, + 0x20, 0x00, 0x80, 0xff, 0xfc, + + // 'm' (0x6d) 19x15, offset 2526-2562, at +1/-14 + 0xef, 0x9e, 0x07, 0x1e, 0x20, 0xc1, 0x82, 0x10, + 0x20, 0x42, 0x04, 0x08, 0x40, 0x81, 0x08, 0x10, + 0x21, 0x02, 0x04, 0x20, 0x40, 0x84, 0x08, 0x10, + 0x81, 0x02, 0x10, 0x20, 0x42, 0x04, 0x08, 0x40, + 0x81, 0x3e, 0x1c, 0x38, + + // 'n' (0x6e) 17x15, offset 2562-2594, at +1/-14 + 0x71, 0xf0, 0x0b, 0x06, 0x07, 0x01, 0x03, 0x00, + 0x41, 0x00, 0x20, 0x80, 0x10, 0x40, 0x08, 0x20, + 0x04, 0x10, 0x02, 0x08, 0x01, 0x04, 0x00, 0x82, + 0x00, 0x41, 0x00, 0x20, 0x80, 0x13, 0xf0, 0x3e, + + // 'o' (0x6f) 15x15, offset 2594-2623, at +3/-14 + 0x07, 0xc0, 0x30, 0x60, 0x80, 0x22, 0x00, 0x24, + 0x00, 0x50, 0x00, 0x60, 0x00, 0xc0, 0x01, 0x80, + 0x03, 0x00, 0x05, 0x00, 0x12, 0x00, 0x22, 0x00, + 0x83, 0x06, 0x01, 0xf0, 0x00, + + // 'p' (0x70) 18x22, offset 2623-2673, at +1/-14 + 0xf1, 0xfc, 0x05, 0xc1, 0x81, 0xc0, 0x10, 0x60, + 0x02, 0x18, 0x00, 0xc4, 0x00, 0x11, 0x00, 0x04, + 0x40, 0x01, 0x10, 0x00, 0x44, 0x00, 0x11, 0x80, + 0x08, 0x60, 0x02, 0x14, 0x01, 0x04, 0xc1, 0x81, + 0x0f, 0x80, 0x40, 0x00, 0x10, 0x00, 0x04, 0x00, + 0x01, 0x00, 0x00, 0x40, 0x00, 0x10, 0x00, 0x3f, + 0xc0, 0x00, + + // 'q' (0x71) 18x22, offset 2673-2723, at +2/-14 + 0x0f, 0xe3, 0xc6, 0x0e, 0x86, 0x00, 0xe1, 0x00, + 0x18, 0xc0, 0x06, 0x20, 0x00, 0x88, 0x00, 0x22, + 0x00, 0x08, 0x80, 0x02, 0x20, 0x00, 0x84, 0x00, + 0x61, 0x00, 0x18, 0x20, 0x0a, 0x06, 0x0c, 0x80, + 0x7c, 0x20, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, + 0x80, 0x00, 0x20, 0x00, 0x08, 0x00, 0x02, 0x00, + 0x0f, 0xf0, + + // 'r' (0x72) 15x15, offset 2723-2752, at +3/-14 + 0xf8, 0x7c, 0x11, 0x8c, 0x2c, 0x00, 0x70, 0x00, + 0xc0, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, + 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, + 0x01, 0x00, 0x3f, 0xfc, 0x00, + + // 's' (0x73) 13x15, offset 2752-2777, at +4/-14 + 0x0f, 0xd1, 0x83, 0x98, 0x04, 0x80, 0x24, 0x00, + 0x30, 0x00, 0xf0, 0x00, 0xfc, 0x00, 0x30, 0x00, + 0xe0, 0x03, 0x00, 0x1c, 0x01, 0xf0, 0x1a, 0x7f, + 0x00, + + // 't' (0x74) 16x20, offset 2777-2817, at +1/-19 + 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, + 0x08, 0x00, 0xff, 0xfc, 0x08, 0x00, 0x08, 0x00, + 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, + 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, + 0x08, 0x00, 0x08, 0x01, 0x06, 0x0f, 0x03, 0xf8, + + // 'u' (0x75) 17x15, offset 2817-2849, at +1/-14 + 0xf0, 0x3e, 0x08, 0x01, 0x04, 0x00, 0x82, 0x00, + 0x41, 0x00, 0x20, 0x80, 0x10, 0x40, 0x08, 0x20, + 0x04, 0x10, 0x02, 0x08, 0x01, 0x04, 0x00, 0x82, + 0x00, 0x41, 0x00, 0xe0, 0x41, 0xd0, 0x1f, 0x8e, + + // 'v' (0x76) 19x15, offset 2849-2885, at +1/-14 + 0xfe, 0x0f, 0xe2, 0x00, 0x20, 0x60, 0x0c, 0x0c, + 0x01, 0x80, 0x80, 0x20, 0x18, 0x0c, 0x01, 0x01, + 0x00, 0x30, 0x60, 0x02, 0x08, 0x00, 0x41, 0x00, + 0x0c, 0x60, 0x00, 0x88, 0x00, 0x19, 0x00, 0x01, + 0x40, 0x00, 0x38, 0x00, + + // 'w' (0x77) 19x15, offset 2885-2921, at +1/-14 + 0xfc, 0x07, 0xe4, 0x00, 0x10, 0x80, 0x02, 0x18, + 0x20, 0xc3, 0x0e, 0x18, 0x21, 0x42, 0x04, 0x28, + 0x40, 0x8d, 0x88, 0x19, 0x93, 0x03, 0x22, 0x60, + 0x2c, 0x68, 0x05, 0x85, 0x00, 0xa0, 0xa0, 0x1c, + 0x1c, 0x01, 0x81, 0x80, + + // 'x' (0x78) 17x15, offset 2921-2953, at +2/-14 + 0x7c, 0x1f, 0x18, 0x03, 0x06, 0x03, 0x01, 0x83, + 0x00, 0x63, 0x00, 0x1b, 0x00, 0x07, 0x00, 0x03, + 0x80, 0x03, 0x60, 0x03, 0x18, 0x03, 0x06, 0x03, + 0x01, 0x83, 0x00, 0x61, 0x00, 0x33, 0xf0, 0x7e, + + // 'y' (0x79) 17x22, offset 2953-3000, at +2/-14 + 0xfc, 0x1f, 0x90, 0x01, 0x8c, 0x00, 0x86, 0x00, + 0xc1, 0x80, 0x40, 0xc0, 0x60, 0x20, 0x20, 0x18, + 0x30, 0x04, 0x10, 0x03, 0x08, 0x00, 0x8c, 0x00, + 0x64, 0x00, 0x16, 0x00, 0x0e, 0x00, 0x07, 0x00, + 0x01, 0x00, 0x01, 0x80, 0x00, 0x80, 0x00, 0xc0, + 0x00, 0x60, 0x00, 0x20, 0x07, 0xfe, 0x00, + + // 'z' (0x7a) 13x15, offset 3000-3025, at +4/-14 + 0xff, 0xf4, 0x01, 0x20, 0x09, 0x00, 0x80, 0x08, + 0x00, 0x80, 0x08, 0x00, 0xc0, 0x04, 0x00, 0x40, + 0x04, 0x00, 0x40, 0x14, 0x00, 0xa0, 0x07, 0xff, + 0xe0, + + // '{' (0x7b) 8x25, offset 3025-3050, at +6/-20 + 0x07, 0x0c, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x30, 0xc0, 0x30, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x0c, + 0x07, + + // '|' (0x7c) 1x25, offset 3050-3054, at +10/-20 + 0xff, 0xff, 0xff, 0x80, + + // '}' (0x7d) 8x25, offset 3054-3079, at +7/-20 + 0xe0, 0x30, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x08, 0x07, 0x0c, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x30, + 0xe0, + + // '~' (0x7e) 15x5, offset 3079-3089, at +3/-11 + 0x1c, 0x00, 0x44, 0x0d, 0x84, 0x36, 0x04, 0x40, + 0x07, 0x00, +}; + +const GFXglyph TomThumbGlyphs[] = { + // off, w, h, xa, xo, yo + { 0, 8, 1, 2, 0, 0 }, // ' ' + { 1, 8, 5, 2, 0, 0 }, // '!' + { 6, 8, 2, 4, 0, 0 }, // '"' + { 8, 8, 5, 4, 0, 0 }, // '#' + { 13, 8, 5, 4, 0, 0 }, // '$' + { 18, 8, 5, 4, 0, 0 }, // '%' + { 23, 8, 5, 4, 0, 0 }, // '&' + { 28, 8, 2, 2, 0, 0 }, // ''' + { 30, 8, 5, 3, 0, 0 }, // '(' + { 35, 8, 5, 3, 0, 0 }, // ')' + { 40, 8, 3, 4, 0, 0 }, // '*' + { 43, 8, 3, 4, 0, 1 }, // '+' + { 46, 8, 2, 3, 0, 3 }, // ',' + { 48, 8, 1, 4, 0, 2 }, // '-' + { 49, 8, 1, 2, 0, 4 }, // '.' + { 50, 8, 5, 4, 0, 0 }, // '/' + { 55, 8, 5, 4, 0, 0 }, // '0' + { 60, 8, 5, 3, 0, 0 }, // '1' + { 65, 8, 5, 4, 0, 0 }, // '2' + { 70, 8, 5, 4, 0, 0 }, // '3' + { 75, 8, 5, 4, 0, 0 }, // '4' + { 80, 8, 5, 4, 0, 0 }, // '5' + { 85, 8, 5, 4, 0, 0 }, // '6' + { 90, 8, 5, 4, 0, 0 }, // '7' + { 95, 8, 5, 4, 0, 0 }, // '8' + { 100, 8, 5, 4, 0, 0 }, // '9' + { 105, 8, 3, 2, 0, 1 }, // ':' + { 108, 8, 4, 3, 0, 1 }, // ';' + { 112, 8, 5, 4, 0, 0 }, // '<' + { 117, 8, 3, 4, 0, 1 }, // '=' + { 120, 8, 5, 4, 0, 0 }, // '>' + { 125, 8, 5, 4, 0, 0 }, // '?' + { 130, 8, 5, 4, 0, 0 }, // '@' + { 135, 8, 5, 4, 0, 0 }, // 'A' + { 140, 8, 5, 4, 0, 0 }, // 'B' + { 145, 8, 5, 4, 0, 0 }, // 'C' + { 150, 8, 5, 4, 0, 0 }, // 'D' + { 155, 8, 5, 4, 0, 0 }, // 'E' + { 160, 8, 5, 4, 0, 0 }, // 'F' + { 165, 8, 5, 4, 0, 0 }, // 'G' + { 170, 8, 5, 4, 0, 0 }, // 'H' + { 175, 8, 5, 4, 0, 0 }, // 'I' + { 180, 8, 5, 4, 0, 0 }, // 'J' + { 185, 8, 5, 4, 0, 0 }, // 'K' + { 190, 8, 5, 4, 0, 0 }, // 'L' + { 195, 8, 5, 4, 0, 0 }, // 'M' + { 200, 8, 5, 4, 0, 0 }, // 'N' + { 205, 8, 5, 4, 0, 0 }, // 'O' + { 210, 8, 5, 4, 0, 0 }, // 'P' + { 215, 8, 5, 4, 0, 0 }, // 'Q' + { 220, 8, 5, 4, 0, 0 }, // 'R' + { 225, 8, 5, 4, 0, 0 }, // 'S' + { 230, 8, 5, 4, 0, 0 }, // 'T' + { 235, 8, 5, 4, 0, 0 }, // 'U' + { 240, 8, 5, 4, 0, 0 }, // 'V' + { 245, 8, 5, 4, 0, 0 }, // 'W' + { 250, 8, 5, 4, 0, 0 }, // 'X' + { 255, 8, 5, 4, 0, 0 }, // 'Y' + { 260, 8, 5, 4, 0, 0 }, // 'Z' + { 265, 8, 5, 4, 0, 0 }, // '[' + { 270, 8, 3, 4, 0, 1 }, // '\' + { 273, 8, 5, 4, 0, 0 }, // ']' + { 278, 8, 2, 4, 0, 0 }, // '^' + { 280, 8, 1, 4, 0, 4 }, // '_' + { 281, 8, 2, 3, 0, 0 }, // '`' + { 283, 8, 4, 4, 0, 1 }, // 'a' + { 287, 8, 5, 4, 0, 0 }, // 'b' + { 292, 8, 4, 4, 0, 1 }, // 'c' + { 296, 8, 5, 4, 0, 0 }, // 'd' + { 301, 8, 4, 4, 0, 1 }, // 'e' + { 305, 8, 5, 4, 0, 0 }, // 'f' + { 310, 8, 5, 4, 0, 1 }, // 'g' + { 315, 8, 5, 4, 0, 0 }, // 'h' + { 320, 8, 5, 2, 0, 0 }, // 'i' + { 325, 8, 6, 4, 0, 0 }, // 'j' + { 331, 8, 5, 4, 0, 0 }, // 'k' + { 336, 8, 5, 4, 0, 0 }, // 'l' + { 341, 8, 4, 4, 0, 1 }, // 'm' + { 345, 8, 4, 4, 0, 1 }, // 'n' + { 349, 8, 4, 4, 0, 1 }, // 'o' + { 353, 8, 5, 4, 0, 1 }, // 'p' + { 358, 8, 5, 4, 0, 1 }, // 'q' + { 363, 8, 4, 4, 0, 1 }, // 'r' + { 367, 8, 4, 4, 0, 1 }, // 's' + { 371, 8, 5, 4, 0, 0 }, // 't' + { 376, 8, 4, 4, 0, 1 }, // 'u' + { 380, 8, 4, 4, 0, 1 }, // 'v' + { 384, 8, 4, 4, 0, 1 }, // 'w' + { 388, 8, 4, 4, 0, 1 }, // 'x' + { 392, 8, 5, 4, 0, 1 }, // 'y' + { 397, 8, 4, 4, 0, 1 }, // 'z' + { 401, 8, 5, 4, 0, 0 }, // '{' + { 406, 8, 5, 2, 0, 0 }, // '|' + { 411, 8, 5, 4, 0, 0 }, // '}' + { 416, 8, 2, 4, 0, 0 }, // '~' +}; + +const uint8_t TomThumb_BCM[] = { + + // ' ' (0x20) 8x1, offset 0-1, at +0/-5 + 0x00, + + // '!' (0x21) 8x5, offset 1-6, at +0/-5 + 0x17, 0x00, 0x00, 0x00, 0x00, + + // '"' (0x22) 8x2, offset 6-8, at +0/-5 + 0x33, 0x00, + + // '#' (0x23) 8x5, offset 8-13, at +0/-5 + 0x5f, 0x7d, 0x00, 0x00, 0x00, + + // '$' (0x24) 8x5, offset 13-18, at +0/-5 + 0xea, 0x17, 0x00, 0x00, 0x00, + + // '%' (0x25) 8x5, offset 18-23, at +0/-5 + 0x89, 0x48, 0x00, 0x00, 0x00, + + // '&' (0x26) 8x5, offset 23-28, at +0/-5 + 0xef, 0x72, 0x00, 0x00, 0x00, + + // ''' (0x27) 8x2, offset 28-30, at +0/-5 + 0x03, 0x00, + + // '(' (0x28) 8x5, offset 30-35, at +0/-5 + 0x2e, 0x02, 0x00, 0x00, 0x00, + + // ')' (0x29) 8x5, offset 35-40, at +0/-5 + 0xd1, 0x01, 0x00, 0x00, 0x00, + + // '*' (0x2a) 8x3, offset 40-43, at +0/-5 + 0x55, 0x01, 0x00, + + // '+' (0x2b) 8x3, offset 43-46, at +0/-4 + 0xba, 0x00, 0x00, + + // ',' (0x2c) 8x2, offset 46-48, at +0/-2 + 0x06, 0x00, + + // '-' (0x2d) 8x1, offset 48-49, at +0/-3 + 0x07, + + // '.' (0x2e) 8x1, offset 49-50, at +0/-1 + 0x01, + + // '/' (0x2f) 8x5, offset 50-55, at +0/-5 + 0x98, 0x0c, 0x00, 0x00, 0x00, + + // '0' (0x30) 8x5, offset 55-60, at +0/-5 + 0x3e, 0x3e, 0x00, 0x00, 0x00, + + // '1' (0x31) 8x5, offset 60-65, at +0/-5 + 0xe2, 0x03, 0x00, 0x00, 0x00, + + // '2' (0x32) 8x5, offset 65-70, at +0/-5 + 0xb9, 0x4a, 0x00, 0x00, 0x00, + + // '3' (0x33) 8x5, offset 70-75, at +0/-5 + 0xb1, 0x2a, 0x00, 0x00, 0x00, + + // '4' (0x34) 8x5, offset 75-80, at +0/-5 + 0x87, 0x7c, 0x00, 0x00, 0x00, + + // '5' (0x35) 8x5, offset 80-85, at +0/-5 + 0xb7, 0x26, 0x00, 0x00, 0x00, + + // '6' (0x36) 8x5, offset 85-90, at +0/-5 + 0xbe, 0x76, 0x00, 0x00, 0x00, + + // '7' (0x37) 8x5, offset 90-95, at +0/-5 + 0xb9, 0x0c, 0x00, 0x00, 0x00, + + // '8' (0x38) 8x5, offset 95-100, at +0/-5 + 0xbf, 0x7e, 0x00, 0x00, 0x00, + + // '9' (0x39) 8x5, offset 100-105, at +0/-5 + 0xb7, 0x3e, 0x00, 0x00, 0x00, + + // ':' (0x3a) 8x3, offset 105-108, at +0/-4 + 0x05, 0x00, 0x00, + + // ';' (0x3b) 8x4, offset 108-112, at +0/-4 + 0x58, 0x00, 0x00, 0x00, + + // '<' (0x3c) 8x5, offset 112-117, at +0/-5 + 0x44, 0x45, 0x00, 0x00, 0x00, + + // '=' (0x3d) 8x3, offset 117-120, at +0/-4 + 0x6d, 0x01, 0x00, + + // '>' (0x3e) 8x5, offset 120-125, at +0/-5 + 0x51, 0x11, 0x00, 0x00, 0x00, + + // '?' (0x3f) 8x5, offset 125-130, at +0/-5 + 0xa1, 0x0e, 0x00, 0x00, 0x00, + + // '@' (0x40) 8x5, offset 130-135, at +0/-5 + 0xae, 0x5a, 0x00, 0x00, 0x00, + + // 'A' (0x41) 8x5, offset 135-140, at +0/-5 + 0xbe, 0x78, 0x00, 0x00, 0x00, + + // 'B' (0x42) 8x5, offset 140-145, at +0/-5 + 0xbf, 0x2a, 0x00, 0x00, 0x00, + + // 'C' (0x43) 8x5, offset 145-150, at +0/-5 + 0x2e, 0x46, 0x00, 0x00, 0x00, + + // 'D' (0x44) 8x5, offset 150-155, at +0/-5 + 0x3f, 0x3a, 0x00, 0x00, 0x00, + + // 'E' (0x45) 8x5, offset 155-160, at +0/-5 + 0xbf, 0x56, 0x00, 0x00, 0x00, + + // 'F' (0x46) 8x5, offset 160-165, at +0/-5 + 0xbf, 0x14, 0x00, 0x00, 0x00, + + // 'G' (0x47) 8x5, offset 165-170, at +0/-5 + 0xae, 0x76, 0x00, 0x00, 0x00, + + // 'H' (0x48) 8x5, offset 170-175, at +0/-5 + 0x9f, 0x7c, 0x00, 0x00, 0x00, + + // 'I' (0x49) 8x5, offset 175-180, at +0/-5 + 0xf1, 0x47, 0x00, 0x00, 0x00, + + // 'J' (0x4a) 8x5, offset 180-185, at +0/-5 + 0x08, 0x3e, 0x00, 0x00, 0x00, + + // 'K' (0x4b) 8x5, offset 185-190, at +0/-5 + 0x9f, 0x6c, 0x00, 0x00, 0x00, + + // 'L' (0x4c) 8x5, offset 190-195, at +0/-5 + 0x1f, 0x42, 0x00, 0x00, 0x00, + + // 'M' (0x4d) 8x5, offset 195-200, at +0/-5 + 0xdf, 0x7c, 0x00, 0x00, 0x00, + + // 'N' (0x4e) 8x5, offset 200-205, at +0/-5 + 0xdf, 0x7d, 0x00, 0x00, 0x00, + + // 'O' (0x4f) 8x5, offset 205-210, at +0/-5 + 0x2e, 0x3a, 0x00, 0x00, 0x00, + + // 'P' (0x50) 8x5, offset 210-215, at +0/-5 + 0xbf, 0x08, 0x00, 0x00, 0x00, + + // 'Q' (0x51) 8x5, offset 215-220, at +0/-5 + 0x2e, 0x7b, 0x00, 0x00, 0x00, + + // 'R' (0x52) 8x5, offset 220-225, at +0/-5 + 0xbf, 0x59, 0x00, 0x00, 0x00, + + // 'S' (0x53) 8x5, offset 225-230, at +0/-5 + 0xb2, 0x26, 0x00, 0x00, 0x00, + + // 'T' (0x54) 8x5, offset 230-235, at +0/-5 + 0xe1, 0x07, 0x00, 0x00, 0x00, + + // 'U' (0x55) 8x5, offset 235-240, at +0/-5 + 0x0f, 0x7e, 0x00, 0x00, 0x00, + + // 'V' (0x56) 8x5, offset 240-245, at +0/-5 + 0x07, 0x1f, 0x00, 0x00, 0x00, + + // 'W' (0x57) 8x5, offset 245-250, at +0/-5 + 0x9f, 0x7d, 0x00, 0x00, 0x00, + + // 'X' (0x58) 8x5, offset 250-255, at +0/-5 + 0x9b, 0x6c, 0x00, 0x00, 0x00, + + // 'Y' (0x59) 8x5, offset 255-260, at +0/-5 + 0x83, 0x0f, 0x00, 0x00, 0x00, + + // 'Z' (0x5a) 8x5, offset 260-265, at +0/-5 + 0xb9, 0x4e, 0x00, 0x00, 0x00, + + // '[' (0x5b) 8x5, offset 265-270, at +0/-5 + 0x3f, 0x46, 0x00, 0x00, 0x00, + + // '\' (0x5c) 8x3, offset 270-273, at +0/-4 + 0x11, 0x01, 0x00, + + // ']' (0x5d) 8x5, offset 273-278, at +0/-5 + 0x31, 0x7e, 0x00, 0x00, 0x00, + + // '^' (0x5e) 8x2, offset 278-280, at +0/-5 + 0x26, 0x00, + + // '_' (0x5f) 8x1, offset 280-281, at +0/-1 + 0x07, + + // '`' (0x60) 8x2, offset 281-283, at +0/-5 + 0x09, 0x00, + + // 'a' (0x61) 8x4, offset 283-287, at +0/-4 + 0xbd, 0x0e, 0x00, 0x00, + + // 'b' (0x62) 8x5, offset 287-292, at +0/-5 + 0x5f, 0x32, 0x00, 0x00, 0x00, + + // 'c' (0x63) 8x4, offset 292-296, at +0/-4 + 0x96, 0x09, 0x00, 0x00, + + // 'd' (0x64) 8x5, offset 296-301, at +0/-5 + 0x4c, 0x7e, 0x00, 0x00, 0x00, + + // 'e' (0x65) 8x4, offset 301-305, at +0/-4 + 0xd6, 0x0b, 0x00, 0x00, + + // 'f' (0x66) 8x5, offset 305-310, at +0/-5 + 0xc4, 0x17, 0x00, 0x00, 0x00, + + // 'g' (0x67) 8x5, offset 310-315, at +0/-4 + 0xa6, 0x3e, 0x00, 0x00, 0x00, + + // 'h' (0x68) 8x5, offset 315-320, at +0/-5 + 0x5f, 0x70, 0x00, 0x00, 0x00, + + // 'i' (0x69) 8x5, offset 320-325, at +0/-5 + 0x1d, 0x00, 0x00, 0x00, 0x00, + + // 'j' (0x6a) 8x6, offset 325-331, at +0/-5 + 0x10, 0xd8, 0x01, 0x00, 0x00, 0x00, + + // 'k' (0x6b) 8x5, offset 331-336, at +0/-5 + 0x9f, 0x49, 0x00, 0x00, 0x00, + + // 'l' (0x6c) 8x5, offset 336-341, at +0/-5 + 0xf1, 0x43, 0x00, 0x00, 0x00, + + // 'm' (0x6d) 8x4, offset 341-345, at +0/-4 + 0x7f, 0x0f, 0x00, 0x00, + + // 'n' (0x6e) 8x4, offset 345-349, at +0/-4 + 0x1f, 0x0e, 0x00, 0x00, + + // 'o' (0x6f) 8x4, offset 349-353, at +0/-4 + 0x96, 0x06, 0x00, 0x00, + + // 'p' (0x70) 8x5, offset 353-358, at +0/-4 + 0x3f, 0x19, 0x00, 0x00, 0x00, + + // 'q' (0x71) 8x5, offset 358-363, at +0/-4 + 0x26, 0x7d, 0x00, 0x00, 0x00, + + // 'r' (0x72) 8x4, offset 363-367, at +0/-4 + 0x1e, 0x01, 0x00, 0x00, + + // 's' (0x73) 8x4, offset 367-371, at +0/-4 + 0xfa, 0x05, 0x00, 0x00, + + // 't' (0x74) 8x5, offset 371-376, at +0/-5 + 0xe2, 0x4b, 0x00, 0x00, 0x00, + + // 'u' (0x75) 8x4, offset 376-380, at +0/-4 + 0x87, 0x0f, 0x00, 0x00, + + // 'v' (0x76) 8x4, offset 380-384, at +0/-4 + 0xc7, 0x07, 0x00, 0x00, + + // 'w' (0x77) 8x4, offset 384-388, at +0/-4 + 0xef, 0x0f, 0x00, 0x00, + + // 'x' (0x78) 8x4, offset 388-392, at +0/-4 + 0x69, 0x09, 0x00, 0x00, + + // 'y' (0x79) 8x5, offset 392-397, at +0/-4 + 0x83, 0x3e, 0x00, 0x00, 0x00, + + // 'z' (0x7a) 8x4, offset 397-401, at +0/-4 + 0xfd, 0x0b, 0x00, 0x00, + + // '{' (0x7b) 8x5, offset 401-406, at +0/-5 + 0x64, 0x47, 0x00, 0x00, 0x00, + + // '|' (0x7c) 8x5, offset 406-411, at +0/-5 + 0x1b, 0x00, 0x00, 0x00, 0x00, + + // '}' (0x7d) 8x5, offset 411-416, at +0/-5 + 0x71, 0x13, 0x00, 0x00, 0x00, + + // '~' (0x7e) 8x2, offset 416-418, at +0/-5 + 0x1e, 0x00, +}; + +const uint8_t TomThumb_RM[] = { + + // ' ' (0x20) 8x1, offset 0-1, at +0/-5 + 0x00, + + // '!' (0x21) 8x5, offset 1-6, at +0/-5 + 0x80, 0x80, 0x80, 0x00, 0x80, + + // '"' (0x22) 8x2, offset 6-8, at +0/-5 + 0xa0, 0xa0, + + // '#' (0x23) 8x5, offset 8-13, at +0/-5 + 0xa0, 0xe0, 0xa0, 0xe0, 0xa0, + + // '$' (0x24) 8x5, offset 13-18, at +0/-5 + 0x60, 0xc0, 0x60, 0xc0, 0x40, + + // '%' (0x25) 8x5, offset 18-23, at +0/-5 + 0x80, 0x20, 0x40, 0x80, 0x20, + + // '&' (0x26) 8x5, offset 23-28, at +0/-5 + 0xc0, 0xc0, 0xe0, 0xa0, 0x60, + + // ''' (0x27) 8x2, offset 28-30, at +0/-5 + 0x80, 0x80, + + // '(' (0x28) 8x5, offset 30-35, at +0/-5 + 0x40, 0x80, 0x80, 0x80, 0x40, + + // ')' (0x29) 8x5, offset 35-40, at +0/-5 + 0x80, 0x40, 0x40, 0x40, 0x80, + + // '*' (0x2a) 8x3, offset 40-43, at +0/-5 + 0xa0, 0x40, 0xa0, + + // '+' (0x2b) 8x3, offset 43-46, at +0/-4 + 0x40, 0xe0, 0x40, + + // ',' (0x2c) 8x2, offset 46-48, at +0/-2 + 0x40, 0x80, + + // '-' (0x2d) 8x1, offset 48-49, at +0/-3 + 0xe0, + + // '.' (0x2e) 8x1, offset 49-50, at +0/-1 + 0x80, + + // '/' (0x2f) 8x5, offset 50-55, at +0/-5 + 0x20, 0x20, 0x40, 0x80, 0x80, + + // '0' (0x30) 8x5, offset 55-60, at +0/-5 + 0x60, 0xa0, 0xa0, 0xa0, 0xc0, + + // '1' (0x31) 8x5, offset 60-65, at +0/-5 + 0x40, 0xc0, 0x40, 0x40, 0x40, + + // '2' (0x32) 8x5, offset 65-70, at +0/-5 + 0xc0, 0x20, 0x40, 0x80, 0xe0, + + // '3' (0x33) 8x5, offset 70-75, at +0/-5 + 0xc0, 0x20, 0x40, 0x20, 0xc0, + + // '4' (0x34) 8x5, offset 75-80, at +0/-5 + 0xa0, 0xa0, 0xe0, 0x20, 0x20, + + // '5' (0x35) 8x5, offset 80-85, at +0/-5 + 0xe0, 0x80, 0xc0, 0x20, 0xc0, + + // '6' (0x36) 8x5, offset 85-90, at +0/-5 + 0x60, 0x80, 0xe0, 0xa0, 0xe0, + + // '7' (0x37) 8x5, offset 90-95, at +0/-5 + 0xe0, 0x20, 0x40, 0x80, 0x80, + + // '8' (0x38) 8x5, offset 95-100, at +0/-5 + 0xe0, 0xa0, 0xe0, 0xa0, 0xe0, + + // '9' (0x39) 8x5, offset 100-105, at +0/-5 + 0xe0, 0xa0, 0xe0, 0x20, 0xc0, + + // ':' (0x3a) 8x3, offset 105-108, at +0/-4 + 0x80, 0x00, 0x80, + + // ';' (0x3b) 8x4, offset 108-112, at +0/-4 + 0x40, 0x00, 0x40, 0x80, + + // '<' (0x3c) 8x5, offset 112-117, at +0/-5 + 0x20, 0x40, 0x80, 0x40, 0x20, + + // '=' (0x3d) 8x3, offset 117-120, at +0/-4 + 0xe0, 0x00, 0xe0, + + // '>' (0x3e) 8x5, offset 120-125, at +0/-5 + 0x80, 0x40, 0x20, 0x40, 0x80, + + // '?' (0x3f) 8x5, offset 125-130, at +0/-5 + 0xe0, 0x20, 0x40, 0x00, 0x40, + + // '@' (0x40) 8x5, offset 130-135, at +0/-5 + 0x40, 0xa0, 0xe0, 0x80, 0x60, + + // 'A' (0x41) 8x5, offset 135-140, at +0/-5 + 0x40, 0xa0, 0xe0, 0xa0, 0xa0, + + // 'B' (0x42) 8x5, offset 140-145, at +0/-5 + 0xc0, 0xa0, 0xc0, 0xa0, 0xc0, + + // 'C' (0x43) 8x5, offset 145-150, at +0/-5 + 0x60, 0x80, 0x80, 0x80, 0x60, + + // 'D' (0x44) 8x5, offset 150-155, at +0/-5 + 0xc0, 0xa0, 0xa0, 0xa0, 0xc0, + + // 'E' (0x45) 8x5, offset 155-160, at +0/-5 + 0xe0, 0x80, 0xe0, 0x80, 0xe0, + + // 'F' (0x46) 8x5, offset 160-165, at +0/-5 + 0xe0, 0x80, 0xe0, 0x80, 0x80, + + // 'G' (0x47) 8x5, offset 165-170, at +0/-5 + 0x60, 0x80, 0xe0, 0xa0, 0x60, + + // 'H' (0x48) 8x5, offset 170-175, at +0/-5 + 0xa0, 0xa0, 0xe0, 0xa0, 0xa0, + + // 'I' (0x49) 8x5, offset 175-180, at +0/-5 + 0xe0, 0x40, 0x40, 0x40, 0xe0, + + // 'J' (0x4a) 8x5, offset 180-185, at +0/-5 + 0x20, 0x20, 0x20, 0xa0, 0x40, + + // 'K' (0x4b) 8x5, offset 185-190, at +0/-5 + 0xa0, 0xa0, 0xc0, 0xa0, 0xa0, + + // 'L' (0x4c) 8x5, offset 190-195, at +0/-5 + 0x80, 0x80, 0x80, 0x80, 0xe0, + + // 'M' (0x4d) 8x5, offset 195-200, at +0/-5 + 0xa0, 0xe0, 0xe0, 0xa0, 0xa0, + + // 'N' (0x4e) 8x5, offset 200-205, at +0/-5 + 0xa0, 0xe0, 0xe0, 0xe0, 0xa0, + + // 'O' (0x4f) 8x5, offset 205-210, at +0/-5 + 0x40, 0xa0, 0xa0, 0xa0, 0x40, + + // 'P' (0x50) 8x5, offset 210-215, at +0/-5 + 0xc0, 0xa0, 0xc0, 0x80, 0x80, + + // 'Q' (0x51) 8x5, offset 215-220, at +0/-5 + 0x40, 0xa0, 0xa0, 0xe0, 0x60, + + // 'R' (0x52) 8x5, offset 220-225, at +0/-5 + 0xc0, 0xa0, 0xe0, 0xc0, 0xa0, + + // 'S' (0x53) 8x5, offset 225-230, at +0/-5 + 0x60, 0x80, 0x40, 0x20, 0xc0, + + // 'T' (0x54) 8x5, offset 230-235, at +0/-5 + 0xe0, 0x40, 0x40, 0x40, 0x40, + + // 'U' (0x55) 8x5, offset 235-240, at +0/-5 + 0xa0, 0xa0, 0xa0, 0xa0, 0x60, + + // 'V' (0x56) 8x5, offset 240-245, at +0/-5 + 0xa0, 0xa0, 0xa0, 0x40, 0x40, + + // 'W' (0x57) 8x5, offset 245-250, at +0/-5 + 0xa0, 0xa0, 0xe0, 0xe0, 0xa0, + + // 'X' (0x58) 8x5, offset 250-255, at +0/-5 + 0xa0, 0xa0, 0x40, 0xa0, 0xa0, + + // 'Y' (0x59) 8x5, offset 255-260, at +0/-5 + 0xa0, 0xa0, 0x40, 0x40, 0x40, + + // 'Z' (0x5a) 8x5, offset 260-265, at +0/-5 + 0xe0, 0x20, 0x40, 0x80, 0xe0, + + // '[' (0x5b) 8x5, offset 265-270, at +0/-5 + 0xe0, 0x80, 0x80, 0x80, 0xe0, + + // '\' (0x5c) 8x3, offset 270-273, at +0/-4 + 0x80, 0x40, 0x20, + + // ']' (0x5d) 8x5, offset 273-278, at +0/-5 + 0xe0, 0x20, 0x20, 0x20, 0xe0, + + // '^' (0x5e) 8x2, offset 278-280, at +0/-5 + 0x40, 0xa0, + + // '_' (0x5f) 8x1, offset 280-281, at +0/-1 + 0xe0, + + // '`' (0x60) 8x2, offset 281-283, at +0/-5 + 0x80, 0x40, + + // 'a' (0x61) 8x4, offset 283-287, at +0/-4 + 0xc0, 0x60, 0xa0, 0xe0, + + // 'b' (0x62) 8x5, offset 287-292, at +0/-5 + 0x80, 0xc0, 0xa0, 0xa0, 0xc0, + + // 'c' (0x63) 8x4, offset 292-296, at +0/-4 + 0x60, 0x80, 0x80, 0x60, + + // 'd' (0x64) 8x5, offset 296-301, at +0/-5 + 0x20, 0x60, 0xa0, 0xa0, 0x60, + + // 'e' (0x65) 8x4, offset 301-305, at +0/-4 + 0x60, 0xa0, 0xc0, 0x60, + + // 'f' (0x66) 8x5, offset 305-310, at +0/-5 + 0x20, 0x40, 0xe0, 0x40, 0x40, + + // 'g' (0x67) 8x5, offset 310-315, at +0/-4 + 0x60, 0xa0, 0xe0, 0x20, 0x40, + + // 'h' (0x68) 8x5, offset 315-320, at +0/-5 + 0x80, 0xc0, 0xa0, 0xa0, 0xa0, + + // 'i' (0x69) 8x5, offset 320-325, at +0/-5 + 0x80, 0x00, 0x80, 0x80, 0x80, + + // 'j' (0x6a) 8x6, offset 325-331, at +0/-5 + 0x20, 0x00, 0x20, 0x20, 0xa0, 0x40, + + // 'k' (0x6b) 8x5, offset 331-336, at +0/-5 + 0x80, 0xa0, 0xc0, 0xc0, 0xa0, + + // 'l' (0x6c) 8x5, offset 336-341, at +0/-5 + 0xc0, 0x40, 0x40, 0x40, 0xe0, + + // 'm' (0x6d) 8x4, offset 341-345, at +0/-4 + 0xe0, 0xe0, 0xe0, 0xa0, + + // 'n' (0x6e) 8x4, offset 345-349, at +0/-4 + 0xc0, 0xa0, 0xa0, 0xa0, + + // 'o' (0x6f) 8x4, offset 349-353, at +0/-4 + 0x40, 0xa0, 0xa0, 0x40, + + // 'p' (0x70) 8x5, offset 353-358, at +0/-4 + 0xc0, 0xa0, 0xa0, 0xc0, 0x80, + + // 'q' (0x71) 8x5, offset 358-363, at +0/-4 + 0x60, 0xa0, 0xa0, 0x60, 0x20, + + // 'r' (0x72) 8x4, offset 363-367, at +0/-4 + 0x60, 0x80, 0x80, 0x80, + + // 's' (0x73) 8x4, offset 367-371, at +0/-4 + 0x60, 0xc0, 0x60, 0xc0, + + // 't' (0x74) 8x5, offset 371-376, at +0/-5 + 0x40, 0xe0, 0x40, 0x40, 0x60, + + // 'u' (0x75) 8x4, offset 376-380, at +0/-4 + 0xa0, 0xa0, 0xa0, 0x60, + + // 'v' (0x76) 8x4, offset 380-384, at +0/-4 + 0xa0, 0xa0, 0xe0, 0x40, + + // 'w' (0x77) 8x4, offset 384-388, at +0/-4 + 0xa0, 0xe0, 0xe0, 0xe0, + + // 'x' (0x78) 8x4, offset 388-392, at +0/-4 + 0xa0, 0x40, 0x40, 0xa0, + + // 'y' (0x79) 8x5, offset 392-397, at +0/-4 + 0xa0, 0xa0, 0x60, 0x20, 0x40, + + // 'z' (0x7a) 8x4, offset 397-401, at +0/-4 + 0xe0, 0x60, 0xc0, 0xe0, + + // '{' (0x7b) 8x5, offset 401-406, at +0/-5 + 0x60, 0x40, 0x80, 0x40, 0x60, + + // '|' (0x7c) 8x5, offset 406-411, at +0/-5 + 0x80, 0x80, 0x00, 0x80, 0x80, + + // '}' (0x7d) 8x5, offset 411-416, at +0/-5 + 0xc0, 0x40, 0x20, 0x40, 0xc0, + + // '~' (0x7e) 8x2, offset 416-418, at +0/-5 + 0x60, 0xc0, +}; + +const GFXglyph SansLight10Glyphs[] = { + // off, w, h, xa, xo, yo + { 0, 1, 1, 4, 0, 8 }, // ' ' + { 1, 3, 7, 3, 0, 1 }, // '!' + { 4, 3, 3, 5, 1, 1 }, // '"' + { 6, 7, 7, 7, 0, 1 }, // '#' + { 13, 5, 9, 7, 1, 0 }, // '$' + { 19, 7, 7, 9, 1, 1 }, // '%' + { 26, 7, 7, 8, 1, 1 }, // '&' + { 33, 3, 3, 3, 0, 1 }, // ''' + { 35, 4, 9, 4, 0, 1 }, // '(' + { 40, 4, 9, 4, 0, 1 }, // ')' + { 45, 5, 4, 7, 1, 1 }, // '*' + { 48, 5, 5, 7, 1, 2 }, // '+' + { 52, 2, 2, 3, 0, 7 }, // ',' + { 53, 4, 1, 4, 0, 5 }, // '-' + { 54, 3, 1, 3, 0, 7 }, // '.' + { 55, 4, 7, 4, 0, 1 }, // '/' + { 59, 5, 7, 7, 1, 1 }, // '0' + { 64, 3, 7, 7, 1, 1 }, // '1' + { 67, 5, 7, 7, 1, 1 }, // '2' + { 72, 6, 7, 7, 0, 1 }, // '3' + { 78, 7, 7, 7, 0, 1 }, // '4' + { 85, 5, 7, 7, 1, 1 }, // '5' + { 90, 5, 7, 7, 1, 1 }, // '6' + { 95, 5, 7, 7, 1, 1 }, // '7' + { 100, 5, 7, 7, 1, 1 }, // '8' + { 105, 5, 7, 7, 1, 1 }, // '9' + { 110, 3, 5, 3, 0, 3 }, // ':' + { 112, 2, 6, 3, 0, 3 }, // ';' + { 114, 5, 5, 7, 1, 2 }, // '<' + { 118, 5, 3, 7, 1, 3 }, // '=' + { 120, 5, 5, 7, 1, 2 }, // '>' + { 124, 5, 7, 5, 0, 1 }, // '?' + { 129, 8, 8, 10, 1, 1 }, // '@' + { 137, 7, 7, 7, 0, 1 }, // 'A' + { 144, 5, 7, 7, 1, 1 }, // 'B' + { 149, 6, 7, 7, 1, 1 }, // 'C' + { 155, 6, 7, 8, 1, 1 }, // 'D' + { 161, 5, 7, 7, 1, 1 }, // 'E' + { 166, 5, 7, 6, 1, 1 }, // 'F' + { 171, 6, 7, 8, 1, 1 }, // 'G' + { 177, 6, 7, 8, 1, 1 }, // 'H' + { 183, 2, 7, 4, 1, 1 }, // 'I' + { 185, 3, 9, 3, -1, 1 }, // 'J' + { 189, 6, 7, 7, 1, 1 }, // 'K' + { 195, 5, 7, 6, 1, 1 }, // 'L' + { 200, 8, 7, 10, 1, 1 }, // 'M' + { 207, 6, 7, 8, 1, 1 }, // 'N' + { 213, 7, 7, 9, 1, 1 }, // 'O' + { 220, 5, 7, 7, 1, 1 }, // 'P' + { 225, 7, 9, 9, 1, 1 }, // 'Q' + { 233, 6, 7, 7, 1, 1 }, // 'R' + { 239, 5, 7, 6, 1, 1 }, // 'S' + { 244, 6, 7, 6, 0, 1 }, // 'T' + { 250, 6, 7, 8, 1, 1 }, // 'U' + { 256, 7, 7, 7, 0, 1 }, // 'V' + { 263, 10, 7, 10, 0, 1 }, // 'W' + { 272, 6, 7, 6, 0, 1 }, // 'X' + { 278, 6, 7, 6, 0, 1 }, // 'Y' + { 284, 7, 7, 7, 0, 1 }, // 'Z' + { 291, 3, 9, 4, 1, 1 }, // '[' + { 295, 4, 7, 4, 0, 1 }, // '\' + { 299, 3, 9, 4, 0, 1 }, // ']' + { 303, 7, 4, 7, 0, 1 }, // '^' + { 307, 5, 1, 5, 0, 9 }, // '_' + { 308, 3, 2, 7, 2, 0 }, // '`' + { 309, 5, 5, 6, 0, 3 }, // 'a' + { 313, 5, 7, 7, 1, 1 }, // 'b' + { 318, 5, 5, 6, 1, 3 }, // 'c' + { 322, 5, 7, 7, 1, 1 }, // 'd' + { 327, 4, 5, 6, 1, 3 }, // 'e' + { 330, 5, 7, 4, 0, 1 }, // 'f' + { 335, 6, 7, 6, 0, 3 }, // 'g' + { 341, 5, 7, 7, 1, 1 }, // 'h' + { 346, 3, 7, 3, 0, 1 }, // 'i' + { 349, 3, 9, 3, -1, 1 }, // 'j' + { 353, 5, 7, 6, 1, 1 }, // 'k' + { 358, 3, 7, 3, 0, 1 }, // 'l' + { 361, 8, 5, 10, 1, 3 }, // 'm' + { 366, 5, 5, 7, 1, 3 }, // 'n' + { 370, 5, 5, 7, 1, 3 }, // 'o' + { 374, 5, 7, 7, 1, 3 }, // 'p' + { 379, 5, 7, 7, 1, 3 }, // 'q' + { 384, 4, 5, 5, 1, 3 }, // 'r' + { 387, 5, 5, 6, 0, 3 }, // 's' + { 391, 4, 6, 4, 0, 2 }, // 't' + { 394, 5, 5, 7, 1, 3 }, // 'u' + { 398, 6, 5, 6, 0, 3 }, // 'v' + { 402, 8, 5, 8, 0, 3 }, // 'w' + { 407, 6, 5, 6, 0, 3 }, // 'x' + { 411, 6, 7, 6, 0, 3 }, // 'y' + { 417, 6, 5, 6, 0, 3 }, // 'z' + { 421, 5, 9, 5, 0, 1 }, // '{' + { 427, 2, 9, 6, 2, 1 }, // '|' + { 430, 5, 9, 5, 0, 1 }, // '}' +}; + +const uint8_t SansLight10_BCM[] = { + + // ' ' (0x20) 1x1, offset 0-1, at +0/+0 + 0x00, + + // '!' (0x21) 3x7, offset 1-4, at +0/-7 + 0x80, 0x27, 0x00, + + // '"' (0x22) 3x3, offset 4-6, at +1/-7 + 0x1b, 0x00, + + // '#' (0x23) 7x7, offset 6-13, at +0/-7 + 0x10, 0xfe, 0x85, 0xfe, 0x21, 0x00, 0x00, + + // '$' (0x24) 5x9, offset 13-19, at +1/-8 + 0x8c, 0xfc, 0x49, 0x12, 0x03, 0x00, + + // '%' (0x25) 7x7, offset 19-26, at +1/-7 + 0x8f, 0xb4, 0x87, 0xb6, 0xc4, 0x03, 0x00, + + // '&' (0x26) 7x7, offset 26-33, at +1/-7 + 0xf6, 0x64, 0x55, 0x0c, 0x06, 0x00, 0x00, + + // ''' (0x27) 3x3, offset 33-35, at +0/-7 + 0x03, 0x00, + + // '(' (0x28) 4x9, offset 35-40, at +0/-7 + 0x7c, 0x06, 0x03, 0x00, 0x00, + + // ')' (0x29) 4x9, offset 40-45, at +0/-7 + 0x00, 0x06, 0xf3, 0x01, 0x00, + + // '*' (0x2a) 5x4, offset 45-48, at +1/-7 + 0x78, 0x84, 0x00, + + // '+' (0x2b) 5x5, offset 48-52, at +1/-6 + 0xc4, 0x11, 0x02, 0x00, + + // ',' (0x2c) 2x2, offset 52-53, at +0/-1 + 0x03, + + // '-' (0x2d) 4x1, offset 53-54, at +0/-3 + 0x07, + + // '.' (0x2e) 3x1, offset 54-55, at +0/-1 + 0x02, + + // '/' (0x2f) 4x7, offset 55-59, at +0/-7 + 0x60, 0xce, 0x00, 0x00, + + // '0' (0x30) 5x7, offset 59-64, at +1/-7 + 0xbe, 0x60, 0xd0, 0x07, 0x00, + + // '1' (0x31) 3x7, offset 64-67, at +1/-7 + 0x82, 0x1f, 0x00, + + // '2' (0x32) 5x7, offset 67-72, at +1/-7 + 0xe1, 0x68, 0xd2, 0x08, 0x00, + + // '3' (0x33) 6x7, offset 72-78, at +0/-7 + 0x80, 0x60, 0x32, 0x79, 0x07, 0x00, + + // '4' (0x34) 7x7, offset 78-85, at +0/-7 + 0x10, 0x8e, 0x24, 0xf2, 0x87, 0x00, 0x00, + + // '5' (0x35) 5x7, offset 85-90, at +1/-7 + 0xcf, 0x64, 0x32, 0x0f, 0x00, + + // '6' (0x36) 5x7, offset 90-95, at +1/-7 + 0xbe, 0x62, 0xb1, 0x0f, 0x00, + + // '7' (0x37) 5x7, offset 95-100, at +1/-7 + 0x81, 0x70, 0xe6, 0x00, 0x00, + + // '8' (0x38) 5x7, offset 100-105, at +1/-7 + 0xf7, 0x64, 0xf2, 0x0e, 0x00, + + // '9' (0x39) 5x7, offset 105-110, at +1/-7 + 0xdf, 0x68, 0xd4, 0x07, 0x00, + + // ':' (0x3a) 3x5, offset 110-112, at +0/-5 + 0x20, 0x02, + + // ';' (0x3b) 2x6, offset 112-114, at +0/-5 + 0x21, 0x00, + + // '<' (0x3c) 5x5, offset 114-118, at +1/-6 + 0x44, 0xa9, 0x08, 0x00, + + // '=' (0x3d) 5x3, offset 118-120, at +1/-5 + 0x6d, 0x0b, + + // '>' (0x3e) 5x5, offset 120-124, at +1/-6 + 0x51, 0x29, 0x02, 0x00, + + // '?' (0x3f) 5x7, offset 124-129, at +0/-7 + 0x80, 0x68, 0xc2, 0x00, 0x00, + + // '@' (0x40) 8x8, offset 129-137, at +1/-7 + 0x7e, 0x99, 0xa5, 0xa5, 0xbd, 0x21, 0x3e, 0x00, + + // 'A' (0x41) 7x7, offset 137-144, at +0/-7 + 0x60, 0x8c, 0xe5, 0x82, 0x01, 0x03, 0x00, + + // 'B' (0x42) 5x7, offset 144-149, at +1/-7 + 0xff, 0x64, 0xf2, 0x0e, 0x00, + + // 'C' (0x43) 6x7, offset 149-155, at +1/-7 + 0xbe, 0x60, 0x30, 0x08, 0x00, 0x00, + + // 'D' (0x44) 6x7, offset 155-161, at +1/-7 + 0xff, 0x60, 0x30, 0xe8, 0x03, 0x00, + + // 'E' (0x45) 5x7, offset 161-166, at +1/-7 + 0xff, 0x64, 0x32, 0x09, 0x00, + + // 'F' (0x46) 5x7, offset 166-171, at +1/-7 + 0xff, 0x44, 0x22, 0x01, 0x00, + + // 'G' (0x47) 6x7, offset 171-177, at +1/-7 + 0xbe, 0x60, 0x30, 0x99, 0x07, 0x00, + + // 'H' (0x48) 6x7, offset 177-183, at +1/-7 + 0x7f, 0x04, 0x02, 0xf1, 0x07, 0x00, + + // 'I' (0x49) 2x7, offset 183-185, at +1/-7 + 0x7f, 0x00, + + // 'J' (0x4a) 3x9, offset 185-189, at -1/-7 + 0x00, 0xff, 0x03, 0x00, + + // 'K' (0x4b) 6x7, offset 189-195, at +1/-7 + 0x7f, 0x04, 0x47, 0x14, 0x04, 0x00, + + // 'L' (0x4c) 5x7, offset 195-200, at +1/-7 + 0x7f, 0x20, 0x10, 0x08, 0x00, + + // 'M' (0x4d) 8x7, offset 200-207, at +1/-7 + 0x7f, 0x02, 0x0e, 0x88, 0x23, 0xfc, 0x01, + + // 'N' (0x4e) 6x7, offset 207-213, at +1/-7 + 0x3f, 0x02, 0x02, 0xe6, 0x07, 0x00, + + // 'O' (0x4f) 7x7, offset 213-220, at +1/-7 + 0xbe, 0x60, 0x30, 0x18, 0xf4, 0x01, 0x00, + + // 'P' (0x50) 5x7, offset 220-225, at +1/-7 + 0xff, 0x48, 0xe4, 0x03, 0x00, + + // 'Q' (0x51) 7x9, offset 225-233, at +1/-7 + 0x3e, 0x82, 0x04, 0x09, 0x12, 0xdc, 0x07, 0x00, + + // 'R' (0x52) 6x7, offset 233-239, at +1/-7 + 0xff, 0x44, 0xe6, 0x05, 0x04, 0x00, + + // 'S' (0x53) 5x7, offset 239-244, at +1/-7 + 0xc7, 0x64, 0x12, 0x06, 0x00, + + // 'T' (0x54) 6x7, offset 244-250, at +0/-7 + 0x81, 0xc0, 0x3f, 0x10, 0x00, 0x00, + + // 'U' (0x55) 6x7, offset 250-256, at +1/-7 + 0x3f, 0x20, 0x10, 0xf8, 0x03, 0x00, + + // 'V' (0x56) 7x7, offset 256-263, at +0/-7 + 0x03, 0x06, 0x1c, 0xc6, 0x18, 0x00, 0x00, + + // 'W' (0x57) 10x7, offset 263-272, at +0/-7 + 0x03, 0x0e, 0xd8, 0x33, 0xe0, 0x80, 0x39, 0x03, + 0x00, + + // 'X' (0x58) 6x7, offset 272-278, at +0/-7 + 0x41, 0x1b, 0xc2, 0x16, 0x04, 0x00, + + // 'Y' (0x59) 6x7, offset 278-284, at +0/-7 + 0x01, 0x03, 0xde, 0x10, 0x00, 0x00, + + // 'Z' (0x5a) 7x7, offset 284-291, at +0/-7 + 0xc0, 0x70, 0xb6, 0x38, 0x04, 0x02, 0x00, + + // '[' (0x5b) 3x9, offset 291-295, at +1/-7 + 0xff, 0x01, 0x00, 0x00, + + // '\' (0x5c) 4x7, offset 295-299, at +0/-7 + 0x03, 0x0e, 0x18, 0x00, + + // ']' (0x5d) 3x9, offset 299-303, at +0/-7 + 0x00, 0xfe, 0x03, 0x00, + + // '^' (0x5e) 7x4, offset 303-307, at +0/-7 + 0x40, 0x32, 0x04, 0x00, + + // '_' (0x5f) 5x1, offset 307-308, at +0/+1 + 0x0f, + + // '`' (0x60) 3x2, offset 308-309, at +2/-8 + 0x09, + + // 'a' (0x61) 5x5, offset 309-313, at +0/-5 + 0xa8, 0xd6, 0x07, 0x00, + + // 'b' (0x62) 5x7, offset 313-318, at +1/-7 + 0x3e, 0x22, 0x91, 0x0f, 0x00, + + // 'c' (0x63) 5x5, offset 318-322, at +1/-5 + 0x3e, 0xc6, 0x08, 0x00, + + // 'd' (0x64) 5x7, offset 322-327, at +1/-7 + 0x7c, 0x22, 0xd1, 0x07, 0x00, + + // 'e' (0x65) 4x5, offset 327-330, at +1/-5 + 0xbf, 0x5e, 0x00, + + // 'f' (0x66) 5x7, offset 330-335, at +0/-7 + 0x84, 0x7f, 0x21, 0x00, 0x00, + + // 'g' (0x67) 6x7, offset 335-341, at +0/-5 + 0xa2, 0x6e, 0xf5, 0x1a, 0x02, 0x00, + + // 'h' (0x68) 5x7, offset 341-346, at +1/-7 + 0x3e, 0x02, 0x81, 0x07, 0x00, + + // 'i' (0x69) 3x7, offset 346-349, at +0/-7 + 0x80, 0x1c, 0x00, + + // 'j' (0x6a) 3x9, offset 349-353, at -1/-7 + 0x00, 0xf3, 0x03, 0x00, + + // 'k' (0x6b) 5x7, offset 353-358, at +1/-7 + 0x3e, 0x08, 0x8a, 0x08, 0x00, + + // 'l' (0x6c) 3x7, offset 358-361, at +0/-7 + 0x00, 0x1f, 0x00, + + // 'm' (0x6d) 8x5, offset 361-366, at +1/-5 + 0x2e, 0x04, 0x1f, 0xc2, 0x03, + + // 'n' (0x6e) 5x5, offset 366-370, at +1/-5 + 0x2e, 0x84, 0x07, 0x00, + + // 'o' (0x6f) 5x5, offset 370-374, at +1/-5 + 0x3f, 0xc6, 0x0f, 0x00, + + // 'p' (0x70) 5x7, offset 374-379, at +1/-5 + 0xbe, 0x48, 0xe4, 0x03, 0x00, + + // 'q' (0x71) 5x7, offset 379-384, at +1/-5 + 0x9f, 0x48, 0xc4, 0x07, 0x00, + + // 'r' (0x72) 4x5, offset 384-387, at +1/-5 + 0x2e, 0x04, 0x00, + + // 's' (0x73) 5x5, offset 387-391, at +0/-5 + 0xa2, 0xd6, 0x0c, 0x00, + + // 't' (0x74) 4x6, offset 391-394, at +0/-6 + 0x82, 0x2f, 0x02, + + // 'u' (0x75) 5x5, offset 394-398, at +1/-5 + 0x1e, 0x42, 0x07, 0x00, + + // 'v' (0x76) 6x5, offset 398-402, at +0/-5 + 0x83, 0x41, 0x36, 0x00, + + // 'w' (0x77) 8x5, offset 402-407, at +0/-5 + 0x83, 0xb3, 0xc1, 0xf8, 0x00, + + // 'x' (0x78) 6x5, offset 407-411, at +0/-5 + 0x70, 0x91, 0x05, 0x01, + + // 'y' (0x79) 6x7, offset 411-417, at +0/-5 + 0x43, 0x26, 0x8c, 0x31, 0x00, 0x00, + + // 'z' (0x7a) 6x5, offset 417-421, at +0/-5 + 0x30, 0xd7, 0x19, 0x01, + + // '{' (0x7b) 5x9, offset 421-427, at +0/-7 + 0x00, 0xfc, 0x05, 0x04, 0x00, 0x00, + + // '|' (0x7c) 2x9, offset 427-430, at +2/-7 + 0xff, 0x01, 0x00, + + // '}' (0x7d) 5x9, offset 430-436, at +0/-7 + 0x00, 0x02, 0xfa, 0x03, 0x00, 0x00, +}; + +const uint8_t SansLight10_RM[] = { + + // ' ' (0x20) 1x1, offset 0-1, at +0/+0 + 0x00, + + // '!' (0x21) 3x7, offset 1-4, at +0/-7 + 0x49, 0x20, 0x10, + + // '"' (0x22) 3x3, offset 4-6, at +1/-7 + 0xd8, 0x00, + + // '#' (0x23) 7x7, offset 6-13, at +0/-7 + 0x28, 0x51, 0xf2, 0x4f, 0x8a, 0x14, 0x00, + + // '$' (0x24) 5x9, offset 13-19, at +1/-8 + 0x03, 0xb1, 0x86, 0x29, 0x5c, 0x00, + + // '%' (0x25) 7x7, offset 19-26, at +1/-7 + 0xc9, 0x52, 0xc7, 0x63, 0x4a, 0x93, 0x00, + + // '&' (0x26) 7x7, offset 26-33, at +1/-7 + 0x61, 0x22, 0x82, 0x0a, 0x13, 0x3e, 0x00, + + // ''' (0x27) 3x3, offset 33-35, at +0/-7 + 0x90, 0x00, + + // '(' (0x28) 4x9, offset 35-40, at +0/-7 + 0x44, 0x88, 0x88, 0x84, 0x40, + + // ')' (0x29) 4x9, offset 40-45, at +0/-7 + 0x44, 0x22, 0x22, 0x24, 0x40, + + // '*' (0x2a) 5x4, offset 45-48, at +1/-7 + 0x42, 0x19, 0x20, + + // '+' (0x2b) 5x5, offset 48-52, at +1/-6 + 0x02, 0x3c, 0x80, 0x00, + + // ',' (0x2c) 2x2, offset 52-53, at +0/-1 + 0xa0, + + // '-' (0x2d) 4x1, offset 53-54, at +0/-3 + 0xe0, + + // '.' (0x2e) 3x1, offset 54-55, at +0/-1 + 0x40, + + // '/' (0x2f) 4x7, offset 55-59, at +0/-7 + 0x22, 0x44, 0x48, 0x80, + + // '0' (0x30) 5x7, offset 59-64, at +1/-7 + 0x64, 0xa5, 0x29, 0x49, 0x80, + + // '1' (0x31) 3x7, offset 64-67, at +1/-7 + 0x59, 0x24, 0x80, + + // '2' (0x32) 5x7, offset 67-72, at +1/-7 + 0xe0, 0x84, 0x44, 0x43, 0xc0, + + // '3' (0x33) 6x7, offset 72-78, at +0/-7 + 0x78, 0x20, 0x8c, 0x08, 0x27, 0x80, + + // '4' (0x34) 7x7, offset 78-85, at +0/-7 + 0x18, 0x51, 0x22, 0x4f, 0xc1, 0x02, 0x00, + + // '5' (0x35) 5x7, offset 85-90, at +1/-7 + 0xf4, 0x21, 0xe1, 0x0b, 0xc0, + + // '6' (0x36) 5x7, offset 90-95, at +1/-7 + 0x74, 0x3d, 0x29, 0x49, 0xc0, + + // '7' (0x37) 5x7, offset 95-100, at +1/-7 + 0xf0, 0x84, 0x42, 0x21, 0x00, + + // '8' (0x38) 5x7, offset 100-105, at +1/-7 + 0xf4, 0xa4, 0xc9, 0x4b, 0xc0, + + // '9' (0x39) 5x7, offset 105-110, at +1/-7 + 0xe4, 0xa5, 0x2f, 0x0b, 0x80, + + // ':' (0x3a) 3x5, offset 110-112, at +0/-5 + 0x40, 0x04, + + // ';' (0x3b) 2x6, offset 112-114, at +0/-5 + 0x80, 0x20, + + // '<' (0x3c) 5x5, offset 114-118, at +1/-6 + 0x13, 0x20, 0xc1, 0x00, + + // '=' (0x3d) 5x3, offset 118-120, at +1/-5 + 0xf0, 0x3c, + + // '>' (0x3e) 5x5, offset 120-124, at +1/-6 + 0x83, 0x04, 0xc8, 0x00, + + // '?' (0x3f) 5x7, offset 124-129, at +0/-7 + 0x60, 0x84, 0x44, 0x01, 0x00, + + // '@' (0x40) 8x8, offset 129-137, at +1/-7 + 0x7c, 0x82, 0xba, 0xca, 0xca, 0xbe, 0x80, 0x78, + + // 'A' (0x41) 7x7, offset 137-144, at +0/-7 + 0x10, 0x60, 0xc2, 0x47, 0x90, 0xa1, 0x00, + + // 'B' (0x42) 5x7, offset 144-149, at +1/-7 + 0xf4, 0xa5, 0xc9, 0x4b, 0xc0, + + // 'C' (0x43) 6x7, offset 149-155, at +1/-7 + 0x72, 0x08, 0x20, 0x82, 0x07, 0x00, + + // 'D' (0x44) 6x7, offset 155-161, at +1/-7 + 0xf2, 0x28, 0xa2, 0x8a, 0x2f, 0x00, + + // 'E' (0x45) 5x7, offset 161-166, at +1/-7 + 0xf4, 0x21, 0xe8, 0x43, 0xc0, + + // 'F' (0x46) 5x7, offset 166-171, at +1/-7 + 0xf4, 0x21, 0xe8, 0x42, 0x00, + + // 'G' (0x47) 6x7, offset 171-177, at +1/-7 + 0x7a, 0x08, 0x26, 0x8a, 0x27, 0x80, + + // 'H' (0x48) 6x7, offset 177-183, at +1/-7 + 0x8a, 0x28, 0xbe, 0x8a, 0x28, 0x80, + + // 'I' (0x49) 2x7, offset 183-185, at +1/-7 + 0xaa, 0xa8, + + // 'J' (0x4a) 3x9, offset 185-189, at -1/-7 + 0x49, 0x24, 0x92, 0xc0, + + // 'K' (0x4b) 6x7, offset 189-195, at +1/-7 + 0x8a, 0x4a, 0x38, 0xa2, 0x48, 0x80, + + // 'L' (0x4c) 5x7, offset 195-200, at +1/-7 + 0x84, 0x21, 0x08, 0x43, 0xc0, + + // 'M' (0x4d) 8x7, offset 200-207, at +1/-7 + 0x82, 0x82, 0xc6, 0xaa, 0xaa, 0xaa, 0x92, + + // 'N' (0x4e) 6x7, offset 207-213, at +1/-7 + 0x82, 0x2c, 0xaa, 0x9a, 0x60, 0x80, + + // 'O' (0x4f) 7x7, offset 213-220, at +1/-7 + 0x79, 0x0a, 0x14, 0x28, 0x50, 0x9e, 0x00, + + // 'P' (0x50) 5x7, offset 220-225, at +1/-7 + 0xf4, 0xa5, 0x2f, 0x42, 0x00, + + // 'Q' (0x51) 7x9, offset 225-233, at +1/-7 + 0x79, 0x0a, 0x14, 0x28, 0x50, 0x9e, 0x04, 0x08, + + // 'R' (0x52) 6x7, offset 233-239, at +1/-7 + 0xf2, 0x49, 0x3c, 0xa2, 0x48, 0x80, + + // 'S' (0x53) 5x7, offset 239-244, at +1/-7 + 0xe4, 0x20, 0xc1, 0x0b, 0x80, + + // 'T' (0x54) 6x7, offset 244-250, at +0/-7 + 0xf8, 0x82, 0x08, 0x20, 0x82, 0x00, + + // 'U' (0x55) 6x7, offset 250-256, at +1/-7 + 0x8a, 0x28, 0xa2, 0x8a, 0x27, 0x00, + + // 'V' (0x56) 7x7, offset 256-263, at +0/-7 + 0x85, 0x09, 0x22, 0x43, 0x06, 0x08, 0x00, + + // 'W' (0x57) 10x7, offset 263-272, at +0/-7 + 0x88, 0xa6, 0x25, 0x51, 0x54, 0x55, 0x08, 0x82, + 0x20, + + // 'X' (0x58) 6x7, offset 272-278, at +0/-7 + 0x89, 0x45, 0x08, 0x51, 0x48, 0x80, + + // 'Y' (0x59) 6x7, offset 278-284, at +0/-7 + 0x89, 0x45, 0x08, 0x20, 0x82, 0x00, + + // 'Z' (0x5a) 7x7, offset 284-291, at +0/-7 + 0x78, 0x10, 0x41, 0x02, 0x08, 0x3f, 0x00, + + // '[' (0x5b) 3x9, offset 291-295, at +1/-7 + 0x92, 0x49, 0x24, 0x80, + + // '\' (0x5c) 4x7, offset 295-299, at +0/-7 + 0x88, 0x44, 0x42, 0x20, + + // ']' (0x5d) 3x9, offset 299-303, at +0/-7 + 0x49, 0x24, 0x92, 0x40, + + // '^' (0x5e) 7x4, offset 303-307, at +0/-7 + 0x10, 0x61, 0x20, 0x00, + + // '_' (0x5f) 5x1, offset 307-308, at +0/+1 + 0xf0, + + // '`' (0x60) 3x2, offset 308-309, at +2/-8 + 0x88, + + // 'a' (0x61) 5x5, offset 309-313, at +0/-5 + 0x70, 0x9d, 0x26, 0x00, + + // 'b' (0x62) 5x7, offset 313-318, at +1/-7 + 0x04, 0x3d, 0x29, 0x49, 0xc0, + + // 'c' (0x63) 5x5, offset 318-322, at +1/-5 + 0x74, 0x21, 0x0f, 0x00, + + // 'd' (0x64) 5x7, offset 322-327, at +1/-7 + 0x00, 0xbd, 0x29, 0x4b, 0x80, + + // 'e' (0x65) 4x5, offset 327-330, at +1/-5 + 0xea, 0xe8, 0xe0, + + // 'f' (0x66) 5x7, offset 330-335, at +0/-7 + 0x72, 0x38, 0x84, 0x21, 0x00, + + // 'g' (0x67) 6x7, offset 335-341, at +0/-5 + 0x7a, 0x47, 0x10, 0x72, 0x27, 0x00, + + // 'h' (0x68) 5x7, offset 341-346, at +1/-7 + 0x04, 0x3d, 0x29, 0x48, 0x00, + + // 'i' (0x69) 3x7, offset 346-349, at +0/-7 + 0x40, 0x24, 0x80, + + // 'j' (0x6a) 3x9, offset 349-353, at -1/-7 + 0x40, 0x24, 0x92, 0xc0, + + // 'k' (0x6b) 5x7, offset 353-358, at +1/-7 + 0x04, 0x25, 0x4c, 0x50, 0x40, + + // 'l' (0x6c) 3x7, offset 358-361, at +0/-7 + 0x09, 0x24, 0x80, + + // 'm' (0x6d) 8x5, offset 361-366, at +1/-5 + 0x6e, 0x92, 0x92, 0x92, 0x10, + + // 'n' (0x6e) 5x5, offset 366-370, at +1/-5 + 0x74, 0xa5, 0x20, 0x00, + + // 'o' (0x6f) 5x5, offset 370-374, at +1/-5 + 0xf4, 0xa5, 0x2f, 0x00, + + // 'p' (0x70) 5x7, offset 374-379, at +1/-5 + 0x74, 0xa5, 0x2f, 0x40, 0x00, + + // 'q' (0x71) 5x7, offset 379-384, at +1/-5 + 0xe4, 0xa5, 0x2f, 0x08, 0x00, + + // 'r' (0x72) 4x5, offset 384-387, at +1/-5 + 0x68, 0x88, 0x00, + + // 's' (0x73) 5x5, offset 387-391, at +0/-5 + 0x74, 0x18, 0x27, 0x00, + + // 't' (0x74) 4x6, offset 391-394, at +0/-6 + 0x0e, 0x44, 0x46, + + // 'u' (0x75) 5x5, offset 394-398, at +1/-5 + 0x04, 0xa5, 0x2e, 0x00, + + // 'v' (0x76) 6x5, offset 398-402, at +0/-5 + 0x8a, 0x25, 0x14, 0x20, + + // 'w' (0x77) 8x5, offset 402-407, at +0/-5 + 0x92, 0x92, 0x6c, 0x6c, 0x44, + + // 'x' (0x78) 6x5, offset 407-411, at +0/-5 + 0x51, 0x42, 0x14, 0x88, + + // 'y' (0x79) 6x7, offset 411-417, at +0/-5 + 0x8a, 0x25, 0x14, 0x20, 0x8c, 0x00, + + // 'z' (0x7a) 6x5, offset 417-421, at +0/-5 + 0x78, 0x42, 0x10, 0xf8, + + // '{' (0x7b) 5x9, offset 421-427, at +0/-7 + 0x22, 0x10, 0x84, 0x21, 0x08, 0x20, + + // '|' (0x7c) 2x9, offset 427-430, at +2/-7 + 0xaa, 0xaa, 0x80, + + // '}' (0x7d) 5x9, offset 430-436, at +0/-7 + 0x41, 0x08, 0x42, 0x10, 0x84, 0x40, +}; + +const GFXglyph SansLight12Glyphs[] = { + // off, w, h, xa, xo, yo + { 0, 1, 1, 4, 0, 9 }, // ' ' + { 1, 2, 9, 4, 1, 0 }, // '!' + { 4, 3, 3, 5, 1, 0 }, // '"' + { 6, 9, 9, 9, 0, 0 }, // '#' + { 17, 6, 10, 8, 1, 0 }, // '$' + { 25, 9, 9, 11, 1, 0 }, // '%' + { 36, 9, 9, 10, 1, 0 }, // '&' + { 47, 3, 3, 3, 0, 0 }, // ''' + { 49, 4, 11, 4, 0, 0 }, // '(' + { 55, 4, 11, 4, 0, 0 }, // ')' + { 61, 6, 5, 8, 1, 0 }, // '*' + { 65, 6, 7, 8, 1, 1 }, // '+' + { 71, 3, 3, 4, 0, 8 }, // ',' + { 73, 3, 1, 5, 1, 6 }, // '-' + { 74, 2, 1, 4, 1, 8 }, // '.' + { 75, 5, 9, 5, 0, 0 }, // '/' + { 81, 6, 9, 8, 1, 0 }, // '0' + { 88, 4, 9, 8, 1, 0 }, // '1' + { 93, 6, 9, 8, 1, 0 }, // '2' + { 100, 6, 9, 8, 1, 0 }, // '3' + { 107, 8, 9, 8, 0, 0 }, // '4' + { 116, 6, 9, 8, 1, 0 }, // '5' + { 123, 6, 9, 8, 1, 0 }, // '6' + { 130, 6, 9, 8, 1, 0 }, // '7' + { 137, 6, 9, 8, 1, 0 }, // '8' + { 144, 6, 9, 8, 1, 0 }, // '9' + { 151, 2, 6, 4, 1, 3 }, // ':' + { 153, 3, 8, 4, 0, 3 }, // ';' + { 156, 6, 6, 8, 1, 1 }, // '<' + { 161, 6, 3, 8, 1, 3 }, // '=' + { 164, 6, 6, 8, 1, 1 }, // '>' + { 169, 6, 9, 6, 0, 0 }, // '?' + { 176, 10, 10, 12, 1, 0 }, // '@' + { 189, 8, 9, 8, 0, 0 }, // 'A' + { 198, 7, 9, 9, 1, 0 }, // 'B' + { 206, 7, 9, 8, 1, 0 }, // 'C' + { 214, 7, 9, 9, 1, 0 }, // 'D' + { 222, 6, 9, 8, 1, 0 }, // 'E' + { 229, 6, 9, 7, 1, 0 }, // 'F' + { 236, 8, 9, 10, 1, 0 }, // 'G' + { 245, 8, 9, 10, 1, 0 }, // 'H' + { 254, 2, 9, 4, 1, 0 }, // 'I' + { 257, 4, 11, 4, -1, 0 }, // 'J' + { 263, 7, 9, 8, 1, 0 }, // 'K' + { 271, 6, 9, 7, 1, 0 }, // 'L' + { 278, 9, 9, 11, 1, 0 }, // 'M' + { 289, 8, 9, 10, 1, 0 }, // 'N' + { 298, 8, 9, 10, 1, 0 }, // 'O' + { 307, 6, 9, 8, 1, 0 }, // 'P' + { 314, 8, 11, 10, 1, 0 }, // 'Q' + { 325, 7, 9, 8, 1, 0 }, // 'R' + { 333, 6, 9, 8, 1, 0 }, // 'S' + { 340, 7, 9, 7, 0, 0 }, // 'T' + { 348, 8, 9, 10, 1, 0 }, // 'U' + { 357, 8, 9, 8, 0, 0 }, // 'V' + { 366, 12, 9, 12, 0, 0 }, // 'W' + { 380, 7, 9, 7, 0, 0 }, // 'X' + { 388, 7, 9, 7, 0, 0 }, // 'Y' + { 396, 8, 9, 8, 0, 0 }, // 'Z' + { 405, 4, 11, 5, 1, 0 }, // '[' + { 411, 5, 9, 5, 0, 0 }, // '\' + { 417, 4, 11, 5, 0, 0 }, // ']' + { 423, 6, 5, 8, 1, 0 }, // '^' + { 427, 6, 1, 6, 0, 10 }, // '_' + { 428, 4, 2, 8, 2, 0 }, // '`' + { 429, 5, 6, 7, 1, 3 }, // 'a' + { 433, 6, 9, 8, 1, 0 }, // 'b' + { 440, 6, 6, 7, 1, 3 }, // 'c' + { 445, 6, 9, 8, 1, 0 }, // 'd' + { 452, 6, 6, 8, 1, 3 }, // 'e' + { 457, 5, 9, 5, 0, 0 }, // 'f' + { 463, 7, 9, 7, 0, 3 }, // 'g' + { 471, 6, 9, 8, 1, 0 }, // 'h' + { 478, 2, 9, 4, 1, 0 }, // 'i' + { 481, 3, 12, 4, 0, 0 }, // 'j' + { 486, 6, 9, 7, 1, 0 }, // 'k' + { 493, 2, 9, 4, 1, 0 }, // 'l' + { 496, 10, 6, 12, 1, 3 }, // 'm' + { 504, 6, 6, 8, 1, 3 }, // 'n' + { 509, 6, 6, 8, 1, 3 }, // 'o' + { 514, 6, 9, 8, 1, 3 }, // 'p' + { 521, 6, 9, 8, 1, 3 }, // 'q' + { 528, 5, 6, 6, 1, 3 }, // 'r' + { 532, 5, 6, 7, 1, 3 }, // 's' + { 536, 5, 8, 5, 0, 1 }, // 't' + { 541, 6, 6, 8, 1, 3 }, // 'u' + { 546, 7, 6, 7, 0, 3 }, // 'v' + { 552, 10, 6, 10, 0, 3 }, // 'w' + { 560, 7, 6, 7, 0, 3 }, // 'x' + { 566, 7, 9, 7, 0, 3 }, // 'y' + { 574, 5, 6, 7, 1, 3 }, // 'z' + { 578, 5, 11, 5, 0, 0 }, // '{' + { 585, 2, 12, 8, 3, 0 }, // '|' + { 588, 5, 11, 5, 0, 0 }, // '}' +}; + +const uint8_t SansLight12_BCM[] = { + + // ' ' (0x20) 1x1, offset 0-1, at +0/+0 + 0x00, + + // '!' (0x21) 2x9, offset 1-4, at +1/-9 + 0x7f, 0x01, 0x00, + + // '"' (0x22) 3x3, offset 4-6, at +1/-9 + 0x1b, 0x00, + + // '#' (0x23) 9x9, offset 6-17, at +0/-9 + 0x20, 0x48, 0xf2, 0x3b, 0x41, 0xde, 0x47, 0x09, + 0x02, 0x00, 0x00, + + // '$' (0x24) 6x10, offset 17-25, at +1/-9 + 0x0c, 0x49, 0xf4, 0xbf, 0x44, 0xe0, 0x00, 0x00, + + // '%' (0x25) 9x9, offset 25-36, at +1/-9 + 0x3f, 0x42, 0xfa, 0x83, 0x81, 0xc0, 0x5f, 0x42, + 0xfc, 0x00, 0x00, + + // '&' (0x26) 9x9, offset 36-47, at +1/-9 + 0xe0, 0x3e, 0x46, 0x4c, 0x69, 0x14, 0x10, 0x58, + 0x00, 0x00, 0x00, + + // ''' (0x27) 3x3, offset 47-49, at +0/-9 + 0x18, 0x00, + + // '(' (0x28) 4x11, offset 49-55, at +0/-9 + 0xf8, 0x30, 0x58, 0x00, 0x01, 0x00, + + // ')' (0x29) 4x11, offset 55-61, at +0/-9 + 0x01, 0x34, 0x18, 0x3e, 0x00, 0x00, + + // '*' (0x2a) 6x5, offset 61-65, at +1/-9 + 0x84, 0x1f, 0x4e, 0x00, + + // '+' (0x2b) 6x7, offset 65-71, at +1/-8 + 0x08, 0xc4, 0x1f, 0x81, 0x00, 0x00, + + // ',' (0x2c) 3x3, offset 71-73, at +0/-1 + 0x1c, 0x00, + + // '-' (0x2d) 3x1, offset 73-74, at +1/-3 + 0x03, + + // '.' (0x2e) 2x1, offset 74-75, at +1/-1 + 0x01, + + // '/' (0x2f) 5x9, offset 75-81, at +0/-9 + 0x80, 0xe1, 0x30, 0x18, 0x00, 0x00, + + // '0' (0x30) 6x9, offset 81-88, at +1/-9 + 0xfe, 0x02, 0x06, 0x0c, 0xe8, 0x0f, 0x00, + + // '1' (0x31) 4x9, offset 88-93, at +1/-9 + 0x00, 0x04, 0xfc, 0x07, 0x00, + + // '2' (0x32) 6x9, offset 93-100, at +1/-9 + 0x82, 0x83, 0x86, 0x8c, 0xe8, 0x10, 0x00, + + // '3' (0x33) 6x9, offset 100-107, at +1/-9 + 0x02, 0x23, 0x46, 0x8c, 0xe8, 0x0e, 0x00, + + // '4' (0x34) 8x9, offset 107-116, at +0/-9 + 0x40, 0xe0, 0x20, 0x31, 0x12, 0xc4, 0x3f, 0x10, + 0x00, + + // '5' (0x35) 6x9, offset 116-123, at +1/-9 + 0x1f, 0x23, 0x46, 0x8c, 0x18, 0x0e, 0x00, + + // '6' (0x36) 6x9, offset 123-130, at +1/-9 + 0xfc, 0x14, 0x26, 0x4c, 0x18, 0x0f, 0x00, + + // '7' (0x37) 6x9, offset 130-137, at +1/-9 + 0x01, 0x02, 0x86, 0xcb, 0x70, 0x00, 0x00, + + // '8' (0x38) 6x9, offset 137-144, at +1/-9 + 0xee, 0x22, 0x46, 0x8c, 0xe8, 0x0e, 0x00, + + // '9' (0x39) 6x9, offset 144-151, at +1/-9 + 0x1e, 0x43, 0x86, 0x0c, 0xe5, 0x07, 0x00, + + // ':' (0x3a) 2x6, offset 151-153, at +1/-6 + 0x21, 0x00, + + // ';' (0x3b) 3x8, offset 153-156, at +0/-6 + 0x00, 0x61, 0x00, + + // '<' (0x3c) 6x6, offset 156-161, at +1/-8 + 0x08, 0x23, 0x49, 0x21, 0x00, + + // '=' (0x3d) 6x3, offset 161-164, at +1/-6 + 0x6d, 0x5b, 0x00, + + // '>' (0x3e) 6x6, offset 164-169, at +1/-8 + 0xa1, 0x24, 0x31, 0x08, 0x00, + + // '?' (0x3f) 6x9, offset 169-176, at +0/-9 + 0x00, 0x02, 0x86, 0x88, 0xe0, 0x00, 0x00, + + // '@' (0x40) 10x10, offset 176-189, at +1/-9 + 0xfc, 0x09, 0x94, 0x67, 0xa1, 0x85, 0x16, 0xda, + 0xaf, 0x20, 0x7c, 0x00, 0x00, + + // 'A' (0x41) 8x9, offset 189-198, at +0/-9 + 0x80, 0xe1, 0xb0, 0x18, 0xc1, 0x02, 0x0e, 0x60, + 0x00, + + // 'B' (0x42) 7x9, offset 198-206, at +1/-9 + 0xff, 0x23, 0x46, 0x8c, 0x18, 0xd1, 0x1d, 0x00, + + // 'C' (0x43) 7x9, offset 206-214, at +1/-9 + 0xfc, 0x04, 0x07, 0x0c, 0x18, 0x10, 0x00, 0x00, + + // 'D' (0x44) 7x9, offset 214-222, at +1/-9 + 0xff, 0x03, 0x06, 0x0c, 0x28, 0xc8, 0x0f, 0x00, + + // 'E' (0x45) 6x9, offset 222-229, at +1/-9 + 0xff, 0x23, 0x46, 0x8c, 0x18, 0x11, 0x00, + + // 'F' (0x46) 6x9, offset 229-236, at +1/-9 + 0xff, 0x23, 0x44, 0x88, 0x10, 0x01, 0x00, + + // 'G' (0x47) 8x9, offset 236-245, at +1/-9 + 0x7c, 0x04, 0x05, 0x0c, 0x18, 0x31, 0x22, 0x7c, + 0x00, + + // 'H' (0x48) 8x9, offset 245-254, at +1/-9 + 0xff, 0x21, 0x40, 0x80, 0x00, 0x01, 0xc2, 0x7f, + 0x00, + + // 'I' (0x49) 2x9, offset 254-257, at +1/-9 + 0xff, 0x01, 0x00, + + // 'J' (0x4a) 4x11, offset 257-263, at -1/-9 + 0x00, 0x04, 0xe0, 0xff, 0x00, 0x00, + + // 'K' (0x4b) 7x9, offset 263-271, at +1/-9 + 0xff, 0x21, 0x60, 0x20, 0x23, 0x28, 0x20, 0x00, + + // 'L' (0x4c) 6x9, offset 271-278, at +1/-9 + 0xff, 0x01, 0x02, 0x04, 0x08, 0x10, 0x00, + + // 'M' (0x4d) 9x9, offset 278-289, at +1/-9 + 0xff, 0x0d, 0xe0, 0x00, 0x0e, 0x0c, 0x87, 0x81, + 0xff, 0x00, 0x00, + + // 'N' (0x4e) 8x9, offset 289-298, at +1/-9 + 0xff, 0x05, 0x30, 0x80, 0x00, 0x06, 0xd0, 0x7f, + 0x00, + + // 'O' (0x4f) 8x9, offset 298-307, at +1/-9 + 0x7c, 0x04, 0x05, 0x0c, 0x18, 0x50, 0x10, 0x1f, + 0x00, + + // 'P' (0x50) 6x9, offset 307-314, at +1/-9 + 0xff, 0x43, 0x84, 0x08, 0xe1, 0x01, 0x00, + + // 'Q' (0x51) 8x11, offset 314-325, at +1/-9 + 0x7c, 0x10, 0x44, 0x40, 0x02, 0x12, 0x30, 0x41, + 0xf2, 0x01, 0x00, + + // 'R' (0x52) 7x9, offset 325-333, at +1/-9 + 0xff, 0x23, 0x44, 0x88, 0xe1, 0x0c, 0x20, 0x00, + + // 'S' (0x53) 6x9, offset 333-340, at +1/-9 + 0x0e, 0x23, 0x46, 0x8c, 0x18, 0x0e, 0x00, + + // 'T' (0x54) 7x9, offset 340-348, at +0/-9 + 0x01, 0x02, 0x04, 0xf8, 0x1f, 0x20, 0x00, 0x00, + + // 'U' (0x55) 8x9, offset 348-357, at +1/-9 + 0x7f, 0x00, 0x03, 0x04, 0x08, 0x10, 0xd0, 0x1f, + 0x00, + + // 'V' (0x56) 8x9, offset 357-366, at +0/-9 + 0x03, 0x38, 0x80, 0x03, 0x08, 0x8e, 0xc3, 0x00, + 0x00, + + // 'W' (0x57) 12x9, offset 366-380, at +0/-9 + 0x01, 0x3c, 0x80, 0x07, 0xe7, 0x61, 0x00, 0x07, + 0x70, 0xe0, 0x3d, 0x04, 0x00, 0x00, + + // 'X' (0x58) 7x9, offset 380-388, at +0/-9 + 0x01, 0x8d, 0xa1, 0xc0, 0x61, 0x2c, 0x20, 0x00, + + // 'Y' (0x59) 7x9, offset 388-396, at +0/-9 + 0x01, 0x0c, 0x60, 0x80, 0xef, 0x20, 0x00, 0x00, + + // 'Z' (0x5a) 8x9, offset 396-405, at +0/-9 + 0x00, 0x03, 0x87, 0x8d, 0xd8, 0x70, 0x20, 0x40, + 0x00, + + // '[' (0x5b) 4x11, offset 405-411, at +1/-9 + 0xff, 0x0f, 0x60, 0x00, 0x01, 0x00, + + // '\' (0x5c) 5x9, offset 411-417, at +0/-9 + 0x03, 0x38, 0x80, 0x01, 0x0c, 0x00, + + // ']' (0x5d) 4x11, offset 417-423, at +0/-9 + 0x01, 0x0c, 0xe0, 0xff, 0x01, 0x00, + + // '^' (0x5e) 6x5, offset 423-427, at +1/-9 + 0xd8, 0x04, 0x83, 0x01, + + // '_' (0x5f) 6x1, offset 427-428, at +0/+1 + 0x1f, + + // '`' (0x60) 4x2, offset 428-429, at +2/-9 + 0x0c, + + // 'a' (0x61) 5x6, offset 429-433, at +1/-6 + 0x7c, 0x59, 0xfe, 0x00, + + // 'b' (0x62) 6x9, offset 433-440, at +1/-9 + 0xff, 0x10, 0x22, 0x44, 0x08, 0x0f, 0x00, + + // 'c' (0x63) 6x6, offset 440-445, at +1/-6 + 0x5e, 0x18, 0x86, 0x00, 0x00, + + // 'd' (0x64) 6x9, offset 445-452, at +1/-9 + 0xf0, 0x10, 0x22, 0x44, 0xf8, 0x1f, 0x00, + + // 'e' (0x65) 6x6, offset 452-457, at +1/-6 + 0x5e, 0x59, 0x96, 0x26, 0x00, + + // 'f' (0x66) 5x9, offset 457-463, at +0/-9 + 0x08, 0xfc, 0x27, 0x48, 0x00, 0x00, + + // 'g' (0x67) 7x9, offset 463-471, at +0/-6 + 0xc0, 0x7e, 0xa6, 0x4c, 0x79, 0x32, 0x18, 0x00, + + // 'h' (0x68) 6x9, offset 471-478, at +1/-9 + 0xff, 0x11, 0x20, 0x40, 0x00, 0x1f, 0x00, + + // 'i' (0x69) 2x9, offset 478-481, at +1/-9 + 0xf9, 0x01, 0x00, + + // 'j' (0x6a) 3x12, offset 481-486, at +0/-9 + 0x00, 0x98, 0x7f, 0x00, 0x00, + + // 'k' (0x6b) 6x9, offset 486-493, at +1/-9 + 0xff, 0x41, 0x40, 0x41, 0x04, 0x10, 0x00, + + // 'l' (0x6c) 2x9, offset 493-496, at +1/-9 + 0xff, 0x01, 0x00, + + // 'm' (0x6d) 10x6, offset 496-504, at +1/-6 + 0x7f, 0x10, 0x04, 0x7e, 0x10, 0x04, 0x3e, 0x00, + + // 'n' (0x6e) 6x6, offset 504-509, at +1/-6 + 0x7f, 0x10, 0x04, 0x3e, 0x00, + + // 'o' (0x6f) 6x6, offset 509-514, at +1/-6 + 0x5e, 0x18, 0x86, 0x1e, 0x00, + + // 'p' (0x70) 6x9, offset 514-521, at +1/-6 + 0xff, 0x43, 0x84, 0x08, 0xe1, 0x01, 0x00, + + // 'q' (0x71) 6x9, offset 521-528, at +1/-6 + 0x1e, 0x42, 0x84, 0x08, 0xf1, 0x1f, 0x00, + + // 'r' (0x72) 5x6, offset 528-532, at +1/-6 + 0x7f, 0x10, 0x04, 0x00, + + // 's' (0x73) 5x6, offset 532-536, at +1/-6 + 0x67, 0x99, 0xe6, 0x00, + + // 't' (0x74) 5x8, offset 536-541, at +0/-8 + 0x04, 0xff, 0x84, 0x84, 0x00, + + // 'u' (0x75) 6x6, offset 541-546, at +1/-6 + 0x1f, 0x08, 0x82, 0x3f, 0x00, + + // 'v' (0x76) 7x6, offset 546-552, at +0/-6 + 0x03, 0x03, 0xc3, 0xcc, 0x00, 0x00, + + // 'w' (0x77) 10x6, offset 552-560, at +0/-6 + 0x03, 0x07, 0x33, 0x03, 0x03, 0x33, 0x03, 0x00, + + // 'x' (0x78) 7x6, offset 560-566, at +0/-6 + 0xc0, 0xcc, 0x30, 0x33, 0x00, 0x00, + + // 'y' (0x79) 7x9, offset 566-574, at +0/-6 + 0x03, 0x19, 0xc2, 0x83, 0xc1, 0x60, 0x00, 0x00, + + // 'z' (0x7a) 5x6, offset 574-578, at +1/-6 + 0x71, 0x5a, 0x8e, 0x00, + + // '{' (0x7b) 5x11, offset 578-585, at +0/-9 + 0x00, 0xf0, 0x5f, 0x00, 0x03, 0x08, 0x00, + + // '|' (0x7c) 2x12, offset 585-588, at +3/-9 + 0xff, 0x0f, 0x00, + + // '}' (0x7d) 5x11, offset 588-595, at +0/-9 + 0x01, 0x0c, 0xa0, 0xff, 0x00, 0x00, 0x00, +}; + +const uint8_t SansLight12_RM[] = { + + // ' ' (0x20) 1x1, offset 0-1, at +0/+0 + 0x00, + + // '!' (0x21) 2x9, offset 1-4, at +1/-9 + 0xaa, 0xa8, 0x80, + + // '"' (0x22) 3x3, offset 4-6, at +1/-9 + 0xd8, 0x00, + + // '#' (0x23) 9x9, offset 6-17, at +0/-9 + 0x12, 0x0a, 0x1f, 0xc4, 0x82, 0x47, 0xf0, 0xa0, + 0x50, 0x48, 0x00, + + // '$' (0x24) 6x10, offset 17-25, at +1/-9 + 0x21, 0xca, 0x28, 0x70, 0xa2, 0x8a, 0xf0, 0x80, + + // '%' (0x25) 9x9, offset 25-36, at +1/-9 + 0xc2, 0x52, 0x29, 0x15, 0xeb, 0x57, 0xa8, 0x94, + 0x4a, 0x43, 0x00, + + // '&' (0x26) 9x9, offset 36-47, at +1/-9 + 0x70, 0x24, 0x12, 0x0a, 0x06, 0x04, 0x92, 0x29, + 0x08, 0x7a, 0x00, + + // ''' (0x27) 3x3, offset 47-49, at +0/-9 + 0x48, 0x00, + + // '(' (0x28) 4x11, offset 49-55, at +0/-9 + 0x24, 0x48, 0x88, 0x88, 0x44, 0x20, + + // ')' (0x29) 4x11, offset 55-61, at +0/-9 + 0x84, 0x42, 0x22, 0x22, 0x44, 0x80, + + // '*' (0x2a) 6x5, offset 61-65, at +1/-9 + 0x20, 0x8f, 0x94, 0x50, + + // '+' (0x2b) 6x7, offset 65-71, at +1/-8 + 0x20, 0x82, 0x3e, 0x20, 0x82, 0x00, + + // ',' (0x2c) 3x3, offset 71-73, at +0/-1 + 0x4a, 0x00, + + // '-' (0x2d) 3x1, offset 73-74, at +1/-3 + 0xc0, + + // '.' (0x2e) 2x1, offset 74-75, at +1/-1 + 0x80, + + // '/' (0x2f) 5x9, offset 75-81, at +0/-9 + 0x10, 0x88, 0x44, 0x21, 0x10, 0x80, + + // '0' (0x30) 6x9, offset 81-88, at +1/-9 + 0x72, 0x28, 0xa2, 0x8a, 0x28, 0xa2, 0x70, + + // '1' (0x31) 4x9, offset 88-93, at +1/-9 + 0x26, 0x22, 0x22, 0x22, 0x20, + + // '2' (0x32) 6x9, offset 93-100, at +1/-9 + 0x72, 0x20, 0x82, 0x10, 0x84, 0x20, 0xf8, + + // '3' (0x33) 6x9, offset 100-107, at +1/-9 + 0x72, 0x20, 0x82, 0x70, 0x20, 0x82, 0xf0, + + // '4' (0x34) 8x9, offset 107-116, at +0/-9 + 0x08, 0x14, 0x14, 0x24, 0x44, 0x44, 0xfe, 0x04, + 0x04, + + // '5' (0x35) 6x9, offset 116-123, at +1/-9 + 0xfa, 0x08, 0x20, 0xf0, 0x20, 0x82, 0xf0, + + // '6' (0x36) 6x9, offset 123-130, at +1/-9 + 0x39, 0x08, 0x3c, 0x8a, 0x28, 0xa2, 0x70, + + // '7' (0x37) 6x9, offset 130-137, at +1/-9 + 0xf8, 0x20, 0x84, 0x10, 0x82, 0x08, 0x40, + + // '8' (0x38) 6x9, offset 137-144, at +1/-9 + 0x72, 0x28, 0xa2, 0x72, 0x28, 0xa2, 0x70, + + // '9' (0x39) 6x9, offset 144-151, at +1/-9 + 0x72, 0x28, 0xa2, 0x89, 0xe0, 0x84, 0xe0, + + // ':' (0x3a) 2x6, offset 151-153, at +1/-6 + 0x80, 0x20, + + // ';' (0x3b) 3x8, offset 153-156, at +0/-6 + 0x40, 0x00, 0x90, + + // '<' (0x3c) 6x6, offset 156-161, at +1/-8 + 0x08, 0xc4, 0x30, 0x30, 0x20, + + // '=' (0x3d) 6x3, offset 161-164, at +1/-6 + 0xf8, 0x0f, 0x80, + + // '>' (0x3e) 6x6, offset 164-169, at +1/-8 + 0x81, 0x81, 0x06, 0x62, 0x00, + + // '?' (0x3f) 6x9, offset 169-176, at +0/-9 + 0x70, 0x20, 0x82, 0x10, 0x80, 0x00, 0x40, + + // '@' (0x40) 10x10, offset 176-189, at +1/-9 + 0x3e, 0x10, 0x49, 0xea, 0x8a, 0xa2, 0xa8, 0xaa, + 0x2a, 0x7c, 0xc0, 0x0f, 0x80, + + // 'A' (0x41) 8x9, offset 189-198, at +0/-9 + 0x10, 0x10, 0x28, 0x28, 0x44, 0x7c, 0x44, 0x82, + 0x82, + + // 'B' (0x42) 7x9, offset 198-206, at +1/-9 + 0xf9, 0x0a, 0x14, 0x2f, 0x90, 0xa1, 0x42, 0xf8, + + // 'C' (0x43) 7x9, offset 206-214, at +1/-9 + 0x38, 0x82, 0x04, 0x08, 0x10, 0x20, 0x60, 0x78, + + // 'D' (0x44) 7x9, offset 214-222, at +1/-9 + 0xf1, 0x1a, 0x14, 0x28, 0x50, 0xa1, 0x44, 0xf0, + + // 'E' (0x45) 6x9, offset 222-229, at +1/-9 + 0xfa, 0x08, 0x20, 0xfa, 0x08, 0x20, 0xf8, + + // 'F' (0x46) 6x9, offset 229-236, at +1/-9 + 0xfa, 0x08, 0x20, 0xfa, 0x08, 0x20, 0x80, + + // 'G' (0x47) 8x9, offset 236-245, at +1/-9 + 0x3c, 0x40, 0x80, 0x80, 0x8e, 0x82, 0x82, 0x42, + 0x3e, + + // 'H' (0x48) 8x9, offset 245-254, at +1/-9 + 0x82, 0x82, 0x82, 0x82, 0xfe, 0x82, 0x82, 0x82, + 0x82, + + // 'I' (0x49) 2x9, offset 254-257, at +1/-9 + 0xaa, 0xaa, 0x80, + + // 'J' (0x4a) 4x11, offset 257-263, at -1/-9 + 0x22, 0x22, 0x22, 0x22, 0x22, 0xc0, + + // 'K' (0x4b) 7x9, offset 263-271, at +1/-9 + 0x85, 0x12, 0x45, 0x0e, 0x12, 0x24, 0x44, 0x84, + + // 'L' (0x4c) 6x9, offset 271-278, at +1/-9 + 0x82, 0x08, 0x20, 0x82, 0x08, 0x20, 0xf8, + + // 'M' (0x4d) 9x9, offset 278-289, at +1/-9 + 0x81, 0x61, 0xb0, 0xd4, 0xaa, 0x55, 0x2a, 0x65, + 0x32, 0x91, 0x00, + + // 'N' (0x4e) 8x9, offset 289-298, at +1/-9 + 0x82, 0xc2, 0xa2, 0xa2, 0x92, 0x8a, 0x8a, 0x86, + 0x82, + + // 'O' (0x4f) 8x9, offset 298-307, at +1/-9 + 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0x82, 0x44, + 0x38, + + // 'P' (0x50) 6x9, offset 307-314, at +1/-9 + 0xf2, 0x28, 0xa2, 0x8b, 0xc8, 0x20, 0x80, + + // 'Q' (0x51) 8x11, offset 314-325, at +1/-9 + 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0x82, 0x44, + 0x38, 0x08, 0x04, + + // 'R' (0x52) 7x9, offset 325-333, at +1/-9 + 0xf1, 0x12, 0x24, 0x4f, 0x12, 0x22, 0x44, 0x84, + + // 'S' (0x53) 6x9, offset 333-340, at +1/-9 + 0x7a, 0x08, 0x20, 0x70, 0x20, 0x82, 0xf0, + + // 'T' (0x54) 7x9, offset 340-348, at +0/-9 + 0xfc, 0x20, 0x40, 0x81, 0x02, 0x04, 0x08, 0x10, + + // 'U' (0x55) 8x9, offset 348-357, at +1/-9 + 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x44, + 0x78, + + // 'V' (0x56) 8x9, offset 357-366, at +0/-9 + 0x82, 0x82, 0x44, 0x44, 0x44, 0x28, 0x28, 0x28, + 0x10, + + // 'W' (0x57) 12x9, offset 366-380, at +0/-9 + 0x84, 0x24, 0xc4, 0x4a, 0x44, 0xa4, 0x4a, 0x43, + 0x18, 0x31, 0x83, 0x18, 0x20, 0x80, + + // 'X' (0x58) 7x9, offset 380-388, at +0/-9 + 0x84, 0x91, 0x21, 0x81, 0x06, 0x12, 0x24, 0x84, + + // 'Y' (0x59) 7x9, offset 388-396, at +0/-9 + 0x84, 0x91, 0x21, 0x43, 0x02, 0x04, 0x08, 0x10, + + // 'Z' (0x5a) 8x9, offset 396-405, at +0/-9 + 0x7c, 0x04, 0x08, 0x08, 0x10, 0x20, 0x20, 0x40, + 0xfe, + + // '[' (0x5b) 4x11, offset 405-411, at +1/-9 + 0xe8, 0x88, 0x88, 0x88, 0x88, 0xe0, + + // '\' (0x5c) 5x9, offset 411-417, at +0/-9 + 0x84, 0x10, 0x84, 0x10, 0x82, 0x10, + + // ']' (0x5d) 4x11, offset 417-423, at +0/-9 + 0xe2, 0x22, 0x22, 0x22, 0x22, 0xe0, + + // '^' (0x5e) 6x5, offset 423-427, at +1/-9 + 0x21, 0x45, 0x22, 0x88, + + // '_' (0x5f) 6x1, offset 427-428, at +0/+1 + 0xf8, + + // '`' (0x60) 4x2, offset 428-429, at +2/-9 + 0x44, + + // 'a' (0x61) 5x6, offset 429-433, at +1/-6 + 0x70, 0xbd, 0x29, 0x78, + + // 'b' (0x62) 6x9, offset 433-440, at +1/-9 + 0x82, 0x08, 0x3c, 0x8a, 0x28, 0xa2, 0x70, + + // 'c' (0x63) 6x6, offset 440-445, at +1/-6 + 0x72, 0x08, 0x20, 0x81, 0xc0, + + // 'd' (0x64) 6x9, offset 445-452, at +1/-9 + 0x08, 0x20, 0x9e, 0x8a, 0x28, 0xa2, 0x78, + + // 'e' (0x65) 6x6, offset 452-457, at +1/-6 + 0x72, 0x2f, 0xa0, 0x81, 0xe0, + + // 'f' (0x66) 5x9, offset 457-463, at +0/-9 + 0x32, 0x11, 0xe4, 0x21, 0x08, 0x40, + + // 'g' (0x67) 7x9, offset 463-471, at +0/-6 + 0x7c, 0x91, 0x23, 0x84, 0x0f, 0x21, 0x42, 0x78, + + // 'h' (0x68) 6x9, offset 471-478, at +1/-9 + 0x82, 0x08, 0x3c, 0x8a, 0x28, 0xa2, 0x88, + + // 'i' (0x69) 2x9, offset 478-481, at +1/-9 + 0x82, 0xaa, 0x80, + + // 'j' (0x6a) 3x12, offset 481-486, at +0/-9 + 0x40, 0x24, 0x92, 0x49, 0x40, + + // 'k' (0x6b) 6x9, offset 486-493, at +1/-9 + 0x82, 0x08, 0x24, 0xa3, 0x0a, 0x24, 0x88, + + // 'l' (0x6c) 2x9, offset 493-496, at +1/-9 + 0xaa, 0xaa, 0x80, + + // 'm' (0x6d) 10x6, offset 496-504, at +1/-6 + 0xf7, 0x22, 0x28, 0x8a, 0x22, 0x88, 0xa2, 0x20, + + // 'n' (0x6e) 6x6, offset 504-509, at +1/-6 + 0xf2, 0x28, 0xa2, 0x8a, 0x20, + + // 'o' (0x6f) 6x6, offset 509-514, at +1/-6 + 0x72, 0x28, 0xa2, 0x89, 0xc0, + + // 'p' (0x70) 6x9, offset 514-521, at +1/-6 + 0xf2, 0x28, 0xa2, 0x8b, 0xc8, 0x20, 0x80, + + // 'q' (0x71) 6x9, offset 521-528, at +1/-6 + 0x7a, 0x28, 0xa2, 0x89, 0xe0, 0x82, 0x08, + + // 'r' (0x72) 5x6, offset 528-532, at +1/-6 + 0xf4, 0x21, 0x08, 0x40, + + // 's' (0x73) 5x6, offset 532-536, at +1/-6 + 0xf4, 0x30, 0x61, 0x78, + + // 't' (0x74) 5x8, offset 536-541, at +0/-8 + 0x42, 0x3c, 0x84, 0x21, 0x0e, + + // 'u' (0x75) 6x6, offset 541-546, at +1/-6 + 0x8a, 0x28, 0xa2, 0x89, 0xe0, + + // 'v' (0x76) 7x6, offset 546-552, at +0/-6 + 0x85, 0x09, 0x22, 0x43, 0x06, 0x00, + + // 'w' (0x77) 10x6, offset 552-560, at +0/-6 + 0x88, 0xa2, 0x25, 0x51, 0x54, 0x62, 0x08, 0x80, + + // 'x' (0x78) 7x6, offset 560-566, at +0/-6 + 0x48, 0x90, 0xc1, 0x84, 0x89, 0x00, + + // 'y' (0x79) 7x9, offset 566-574, at +0/-6 + 0x85, 0x09, 0x22, 0x43, 0x06, 0x08, 0x10, 0xc0, + + // 'z' (0x7a) 5x6, offset 574-578, at +1/-6 + 0xf0, 0x88, 0x88, 0x78, + + // '{' (0x7b) 5x11, offset 578-585, at +0/-9 + 0x32, 0x10, 0x84, 0x21, 0x08, 0x42, 0x0c, + + // '|' (0x7c) 2x12, offset 585-588, at +3/-9 + 0xaa, 0xaa, 0xaa, + + // '}' (0x7d) 5x11, offset 588-595, at +0/-9 + 0xc1, 0x08, 0x42, 0x10, 0x84, 0x21, 0x30, +}; + +const GFXglyph SansLight14Glyphs[] = { + // off, w, h, xa, xo, yo + { 0, 1, 1, 5, 0, 11 }, // ' ' + { 1, 2, 10, 4, 1, 1 }, // '!' + { 4, 4, 4, 6, 1, 1 }, // '"' + { 6, 10, 10, 10, 0, 1 }, // '#' + { 19, 7, 12, 9, 1, 0 }, // '$' + { 30, 10, 10, 12, 1, 1 }, // '%' + { 43, 10, 10, 11, 1, 1 }, // '&' + { 56, 2, 4, 4, 1, 1 }, // ''' + { 57, 4, 12, 5, 1, 1 }, // '(' + { 63, 4, 12, 5, 0, 1 }, // ')' + { 69, 7, 6, 9, 1, 0 }, // '*' + { 75, 7, 7, 9, 1, 2 }, // '+' + { 82, 3, 4, 4, 0, 9 }, // ',' + { 84, 4, 1, 6, 1, 7 }, // '-' + { 85, 2, 1, 4, 1, 10 }, // '.' + { 86, 6, 10, 6, 0, 1 }, // '/' + { 94, 7, 10, 9, 1, 1 }, // '0' + { 103, 5, 10, 9, 1, 1 }, // '1' + { 110, 7, 10, 9, 1, 1 }, // '2' + { 119, 7, 10, 9, 1, 1 }, // '3' + { 128, 9, 10, 9, 0, 1 }, // '4' + { 140, 7, 10, 9, 1, 1 }, // '5' + { 149, 7, 10, 9, 1, 1 }, // '6' + { 158, 7, 10, 9, 1, 1 }, // '7' + { 167, 7, 10, 9, 1, 1 }, // '8' + { 176, 7, 10, 9, 1, 1 }, // '9' + { 185, 2, 8, 4, 1, 3 }, // ':' + { 187, 3, 10, 4, 0, 3 }, // ';' + { 191, 7, 7, 9, 1, 2 }, // '<' + { 198, 7, 3, 9, 1, 4 }, // '=' + { 201, 7, 7, 9, 1, 2 }, // '>' + { 208, 6, 10, 7, 0, 1 }, // '?' + { 216, 11, 11, 13, 1, 1 }, // '@' + { 232, 9, 10, 9, 0, 1 }, // 'A' + { 244, 8, 10, 10, 1, 1 }, // 'B' + { 254, 9, 10, 10, 1, 1 }, // 'C' + { 266, 9, 10, 11, 1, 1 }, // 'D' + { 278, 7, 10, 9, 1, 1 }, // 'E' + { 287, 7, 10, 8, 1, 1 }, // 'F' + { 296, 9, 10, 11, 1, 1 }, // 'G' + { 308, 9, 10, 11, 1, 1 }, // 'H' + { 320, 3, 10, 5, 1, 1 }, // 'I' + { 324, 4, 13, 4, -1, 1 }, // 'J' + { 331, 8, 10, 9, 1, 1 }, // 'K' + { 341, 7, 10, 8, 1, 1 }, // 'L' + { 350, 11, 10, 13, 1, 1 }, // 'M' + { 364, 9, 10, 11, 1, 1 }, // 'N' + { 376, 10, 10, 12, 1, 1 }, // 'O' + { 389, 7, 10, 9, 1, 1 }, // 'P' + { 398, 10, 12, 12, 1, 1 }, // 'Q' + { 413, 8, 10, 9, 1, 1 }, // 'R' + { 423, 7, 10, 9, 1, 1 }, // 'S' + { 432, 8, 10, 8, 0, 1 }, // 'T' + { 442, 9, 10, 11, 1, 1 }, // 'U' + { 454, 9, 10, 9, 0, 1 }, // 'V' + { 466, 13, 10, 13, 0, 1 }, // 'W' + { 483, 9, 10, 9, 0, 1 }, // 'X' + { 495, 8, 10, 8, 0, 1 }, // 'Y' + { 505, 7, 10, 9, 1, 1 }, // 'Z' + { 514, 4, 12, 5, 1, 1 }, // '[' + { 520, 6, 10, 6, 0, 1 }, // '\' + { 528, 4, 12, 5, 0, 1 }, // ']' + { 534, 7, 6, 9, 1, 1 }, // '^' + { 540, 7, 1, 7, 0, 12 }, // '_' + { 541, 3, 2, 9, 3, 1 }, // '`' + { 542, 6, 8, 8, 1, 3 }, // 'a' + { 548, 7, 11, 9, 1, 0 }, // 'b' + { 558, 6, 8, 8, 1, 3 }, // 'c' + { 564, 7, 11, 9, 1, 0 }, // 'd' + { 574, 7, 8, 9, 1, 3 }, // 'e' + { 581, 6, 11, 5, 0, 0 }, // 'f' + { 590, 8, 11, 8, 0, 3 }, // 'g' + { 601, 7, 11, 9, 1, 0 }, // 'h' + { 611, 2, 10, 4, 1, 1 }, // 'i' + { 614, 4, 13, 4, -1, 1 }, // 'j' + { 621, 7, 11, 8, 1, 0 }, // 'k' + { 631, 2, 11, 4, 1, 0 }, // 'l' + { 634, 11, 8, 13, 1, 3 }, // 'm' + { 645, 7, 8, 9, 1, 3 }, // 'n' + { 652, 7, 8, 9, 1, 3 }, // 'o' + { 659, 7, 11, 9, 1, 3 }, // 'p' + { 669, 7, 11, 9, 1, 3 }, // 'q' + { 679, 5, 8, 6, 1, 3 }, // 'r' + { 684, 6, 8, 8, 1, 3 }, // 's' + { 690, 6, 10, 6, 0, 1 }, // 't' + { 698, 7, 8, 9, 1, 3 }, // 'u' + { 705, 7, 8, 7, 0, 3 }, // 'v' + { 712, 11, 8, 11, 0, 3 }, // 'w' + { 723, 8, 8, 8, 0, 3 }, // 'x' + { 731, 7, 11, 7, 0, 3 }, // 'y' + { 741, 5, 8, 7, 1, 3 }, // 'z' + { 746, 6, 12, 6, 0, 1 }, // '{' + { 755, 3, 14, 9, 3, 0 }, // '|' + { 761, 5, 12, 6, 1, 1 }, // '}' +}; + +const uint8_t SansLight14_BCM[] = { + + // ' ' (0x20) 1x1, offset 0-1, at +0/+0 + 0x00, + + // '!' (0x21) 2x10, offset 1-4, at +1/-10 + 0x7f, 0x02, 0x00, + + // '"' (0x22) 4x4, offset 4-6, at +1/-10 + 0x0f, 0x0f, + + // '#' (0x23) 10x10, offset 6-19, at +0/-10 + 0x40, 0x20, 0x81, 0xfe, 0x17, 0x48, 0xa0, 0xff, + 0x05, 0x12, 0x08, 0x00, 0x00, + + // '$' (0x24) 7x12, offset 19-30, at +1/-11 + 0x1c, 0x20, 0x43, 0xff, 0x2f, 0x42, 0x42, 0x06, + 0x18, 0x00, 0x00, + + // '%' (0x25) 10x10, offset 30-43, at +1/-10 + 0x3f, 0x84, 0x10, 0xb2, 0x37, 0x30, 0xb0, 0x37, + 0x21, 0x84, 0xf0, 0x03, 0x00, + + // '&' (0x26) 10x10, offset 43-56, at +1/-10 + 0xc0, 0xb9, 0x18, 0x61, 0x8c, 0x49, 0x1a, 0x06, + 0x18, 0x90, 0x00, 0x00, 0x00, + + // ''' (0x27) 2x4, offset 56-57, at +1/-10 + 0x0f, + + // '(' (0x28) 4x12, offset 57-63, at +1/-10 + 0xfc, 0x33, 0xc0, 0x00, 0x00, 0x00, + + // ')' (0x29) 4x12, offset 63-69, at +0/-10 + 0x00, 0x30, 0xc0, 0xfc, 0x03, 0x00, + + // '*' (0x2a) 7x6, offset 69-75, at +1/-11 + 0x04, 0xfd, 0x60, 0x24, 0x01, 0x00, + + // '+' (0x2b) 7x7, offset 75-82, at +1/-9 + 0x08, 0x84, 0x0f, 0x81, 0x40, 0x00, 0x00, + + // ',' (0x2c) 3x4, offset 82-84, at +0/-2 + 0x78, 0x00, + + // '-' (0x2d) 4x1, offset 84-85, at +1/-4 + 0x07, + + // '.' (0x2e) 2x1, offset 85-86, at +1/-1 + 0x01, + + // '/' (0x2f) 6x10, offset 86-94, at +0/-10 + 0x00, 0x02, 0x07, 0x83, 0x03, 0x01, 0x00, 0x00, + + // '0' (0x30) 7x10, offset 94-103, at +1/-10 + 0xfe, 0x0d, 0x1c, 0x60, 0x80, 0x03, 0xfb, 0x07, + 0x00, + + // '1' (0x31) 5x10, offset 103-110, at +1/-10 + 0x00, 0x08, 0x10, 0xc0, 0xff, 0x00, 0x00, + + // '2' (0x32) 7x10, offset 110-119, at +1/-10 + 0x02, 0x07, 0x1a, 0x64, 0x88, 0x13, 0x32, 0x08, + 0x00, + + // '3' (0x33) 7x10, offset 119-128, at +1/-10 + 0x02, 0x46, 0x18, 0x61, 0x84, 0x29, 0x9b, 0x07, + 0x00, + + // '4' (0x34) 9x10, offset 128-140, at +0/-10 + 0x40, 0x80, 0x81, 0x05, 0x11, 0x42, 0xfc, 0x0f, + 0x04, 0x10, 0x00, 0x00, + + // '5' (0x35) 7x10, offset 140-149, at +1/-10 + 0x1e, 0x46, 0x18, 0x61, 0x84, 0x11, 0x82, 0x07, + 0x00, + + // '6' (0x36) 7x10, offset 149-158, at +1/-10 + 0xfc, 0x48, 0x1c, 0x61, 0x84, 0x11, 0x82, 0x07, + 0x00, + + // '7' (0x37) 7x10, offset 158-167, at +1/-10 + 0x01, 0x04, 0x18, 0x58, 0x18, 0x19, 0x1c, 0x00, + 0x00, + + // '8' (0x38) 7x10, offset 167-176, at +1/-10 + 0xc6, 0xa5, 0x18, 0x61, 0x84, 0x29, 0x1a, 0x07, + 0x00, + + // '9' (0x39) 7x10, offset 176-185, at +1/-10 + 0x1e, 0x86, 0x18, 0x62, 0x88, 0x23, 0xf1, 0x03, + 0x00, + + // ':' (0x3a) 2x8, offset 185-187, at +1/-8 + 0x81, 0x00, + + // ';' (0x3b) 3x10, offset 187-191, at +0/-8 + 0x00, 0x04, 0x07, 0x00, + + // '<' (0x3c) 7x7, offset 191-198, at +1/-9 + 0x08, 0x0a, 0x45, 0x24, 0x0a, 0x02, 0x00, + + // '=' (0x3d) 7x3, offset 198-201, at +1/-7 + 0x6d, 0xdb, 0x02, + + // '>' (0x3e) 7x7, offset 201-208, at +1/-9 + 0x41, 0x91, 0x88, 0x42, 0x41, 0x00, 0x00, + + // '?' (0x3f) 6x10, offset 208-216, at +0/-10 + 0x00, 0x04, 0x10, 0x66, 0x04, 0x0f, 0x00, 0x00, + + // '@' (0x40) 11x11, offset 216-232, at +1/-10 + 0xf8, 0x31, 0x90, 0x18, 0x23, 0x99, 0xc8, 0x44, + 0xe6, 0x31, 0x10, 0x82, 0xe0, 0x03, 0x00, 0x00, + + // 'A' (0x41) 9x10, offset 232-244, at +0/-10 + 0x00, 0x03, 0x83, 0x87, 0x11, 0x47, 0xe0, 0x01, + 0x0c, 0xc0, 0x00, 0x00, + + // 'B' (0x42) 8x10, offset 244-254, at +1/-10 + 0xff, 0x47, 0x18, 0x61, 0x84, 0x11, 0xa6, 0xe8, + 0x1e, 0x00, + + // 'C' (0x43) 9x10, offset 254-266, at +1/-10 + 0xfc, 0x08, 0x34, 0x60, 0x80, 0x01, 0x06, 0x18, + 0x20, 0x00, 0x00, 0x00, + + // 'D' (0x44) 9x10, offset 266-278, at +1/-10 + 0xff, 0x07, 0x18, 0x60, 0x80, 0x01, 0x06, 0x2c, + 0x10, 0x3f, 0x00, 0x00, + + // 'E' (0x45) 7x10, offset 278-287, at +1/-10 + 0xff, 0x47, 0x18, 0x61, 0x84, 0x11, 0x46, 0x08, + 0x00, + + // 'F' (0x46) 7x10, offset 287-296, at +1/-10 + 0xff, 0x47, 0x10, 0x41, 0x04, 0x11, 0x44, 0x00, + 0x00, + + // 'G' (0x47) 9x10, offset 296-308, at +1/-10 + 0xfc, 0x08, 0x24, 0x60, 0x80, 0x21, 0x86, 0x18, + 0xa2, 0xf8, 0x00, 0x00, + + // 'H' (0x48) 9x10, offset 308-320, at +1/-10 + 0xff, 0x43, 0x00, 0x01, 0x04, 0x10, 0x40, 0x00, + 0xc1, 0xff, 0x00, 0x00, + + // 'I' (0x49) 3x10, offset 320-324, at +1/-10 + 0xff, 0x03, 0x00, 0x00, + + // 'J' (0x4a) 4x13, offset 324-331, at -1/-10 + 0x00, 0x10, 0x00, 0xfe, 0x3f, 0x00, 0x00, + + // 'K' (0x4b) 8x10, offset 331-341, at +1/-10 + 0xff, 0x83, 0x00, 0x01, 0x0a, 0xc4, 0x0c, 0x04, + 0x20, 0x00, + + // 'L' (0x4c) 7x10, offset 341-350, at +1/-10 + 0xff, 0x03, 0x08, 0x20, 0x80, 0x00, 0x02, 0x08, + 0x00, + + // 'M' (0x4d) 11x10, offset 350-364, at +1/-10 + 0xff, 0x0f, 0xc0, 0x01, 0x18, 0x80, 0x03, 0x06, + 0x06, 0x07, 0x03, 0xfc, 0x0f, 0x00, + + // 'N' (0x4e) 9x10, offset 364-376, at +1/-10 + 0xff, 0x0b, 0x40, 0x00, 0x06, 0x60, 0x00, 0x02, + 0xd0, 0xff, 0x00, 0x00, + + // 'O' (0x4f) 10x10, offset 376-389, at +1/-10 + 0xfc, 0x08, 0x14, 0x60, 0x80, 0x01, 0x06, 0x18, + 0xa0, 0x40, 0xfc, 0x00, 0x00, + + // 'P' (0x50) 7x10, offset 389-398, at +1/-10 + 0xff, 0x87, 0x10, 0x42, 0x08, 0x21, 0x78, 0x00, + 0x00, + + // 'Q' (0x51) 10x12, offset 398-413, at +1/-10 + 0xfc, 0x20, 0x10, 0x01, 0x12, 0x20, 0x01, 0x12, + 0x60, 0x01, 0x2a, 0x90, 0xfc, 0x00, 0x00, + + // 'R' (0x52) 8x10, offset 413-423, at +1/-10 + 0xff, 0x87, 0x10, 0x42, 0x08, 0xe1, 0x78, 0x0c, + 0x00, 0x00, + + // 'S' (0x53) 7x10, offset 423-432, at +1/-10 + 0x0e, 0x46, 0x18, 0x61, 0x88, 0x21, 0x02, 0x07, + 0x00, + + // 'T' (0x54) 8x10, offset 432-442, at +0/-10 + 0x01, 0x04, 0x10, 0xc0, 0xff, 0x01, 0x04, 0x10, + 0x00, 0x00, + + // 'U' (0x55) 9x10, offset 442-454, at +1/-10 + 0xff, 0x00, 0x04, 0x20, 0x80, 0x00, 0x02, 0x08, + 0xd0, 0x3f, 0x00, 0x00, + + // 'V' (0x56) 9x10, offset 454-466, at +0/-10 + 0x03, 0x30, 0x00, 0x07, 0x60, 0x80, 0xc3, 0xc1, + 0xc0, 0x00, 0x00, 0x00, + + // 'W' (0x57) 13x10, offset 466-483, at +0/-10 + 0x01, 0x78, 0x00, 0x0e, 0xe0, 0x78, 0x1c, 0xe0, + 0x00, 0x1c, 0x80, 0x83, 0xe3, 0x41, 0x00, 0x00, + 0x00, + + // 'X' (0x58) 9x10, offset 483-495, at +0/-10 + 0x00, 0x0e, 0x44, 0x0c, 0x0e, 0x38, 0x10, 0x23, + 0x50, 0x80, 0x00, 0x00, + + // 'Y' (0x59) 8x10, offset 495-505, at +0/-10 + 0x01, 0x18, 0x80, 0x01, 0xf8, 0x18, 0x18, 0x10, + 0x00, 0x00, + + // 'Z' (0x5a) 7x10, offset 505-514, at +1/-10 + 0x01, 0x07, 0x1b, 0x62, 0x86, 0x05, 0x0e, 0x08, + 0x00, + + // '[' (0x5b) 4x12, offset 514-520, at +1/-10 + 0xff, 0x1f, 0x80, 0x01, 0x08, 0x00, + + // '\' (0x5c) 6x10, offset 520-528, at +0/-10 + 0x01, 0x38, 0x00, 0x03, 0x70, 0x00, 0x02, 0x00, + + // ']' (0x5d) 4x12, offset 528-534, at +0/-10 + 0x01, 0x18, 0x80, 0xff, 0x0f, 0x00, + + // '^' (0x5e) 7x6, offset 534-540, at +1/-10 + 0x30, 0x23, 0x0c, 0x0c, 0x0c, 0x00, + + // '_' (0x5f) 7x1, offset 540-541, at +0/+1 + 0x3f, + + // '`' (0x60) 3x2, offset 541-542, at +3/-10 + 0x09, + + // 'a' (0x61) 6x8, offset 542-548, at +1/-8 + 0xf0, 0x89, 0x89, 0x49, 0xfe, 0x00, + + // 'b' (0x62) 7x11, offset 548-558, at +1/-11 + 0xff, 0x87, 0x10, 0x02, 0x11, 0x88, 0x40, 0xf8, + 0x01, 0x00, + + // 'c' (0x63) 6x8, offset 558-564, at +1/-8 + 0x7c, 0xc2, 0x81, 0x81, 0x81, 0x00, + + // 'd' (0x64) 7x11, offset 564-574, at +1/-11 + 0xf0, 0x43, 0x20, 0x02, 0x11, 0x08, 0xa1, 0xff, + 0x03, 0x00, + + // 'e' (0x65) 7x8, offset 574-581, at +1/-8 + 0x7e, 0xc9, 0x89, 0x89, 0x89, 0x0e, 0x00, + + // 'f' (0x66) 6x11, offset 581-590, at +0/-11 + 0x08, 0xf0, 0x7f, 0x02, 0x12, 0x10, 0x00, 0x00, + 0x00, + + // 'g' (0x67) 8x11, offset 590-601, at +0/-8 + 0x00, 0x73, 0x67, 0x24, 0x23, 0x19, 0xc9, 0x47, + 0x06, 0x0c, 0x00, + + // 'h' (0x68) 7x11, offset 601-611, at +1/-11 + 0xff, 0x87, 0x00, 0x02, 0x10, 0x80, 0x00, 0xf8, + 0x03, 0x00, + + // 'i' (0x69) 2x10, offset 611-614, at +1/-10 + 0xfd, 0x03, 0x00, + + // 'j' (0x6a) 4x13, offset 614-621, at -1/-10 + 0x00, 0x10, 0x00, 0xf6, 0x3f, 0x00, 0x00, + + // 'k' (0x6b) 7x11, offset 621-631, at +1/-11 + 0xff, 0x07, 0x04, 0x10, 0x40, 0x83, 0x21, 0x00, + 0x02, 0x00, + + // 'l' (0x6c) 2x11, offset 631-634, at +1/-11 + 0xff, 0x07, 0x00, + + // 'm' (0x6d) 11x8, offset 634-645, at +1/-8 + 0xff, 0x02, 0x01, 0x01, 0x03, 0xfe, 0x01, 0x01, + 0x01, 0xfe, 0x00, + + // 'n' (0x6e) 7x8, offset 645-652, at +1/-8 + 0xff, 0x02, 0x01, 0x01, 0x01, 0xfe, 0x00, + + // 'o' (0x6f) 7x8, offset 652-659, at +1/-8 + 0x7e, 0x81, 0x81, 0x81, 0x81, 0x7e, 0x00, + + // 'p' (0x70) 7x11, offset 659-669, at +1/-8 + 0xff, 0x17, 0x42, 0x20, 0x02, 0x11, 0x08, 0x3f, + 0x00, 0x00, + + // 'q' (0x71) 7x11, offset 669-679, at +1/-8 + 0x7e, 0x08, 0x44, 0x20, 0x02, 0x21, 0x84, 0xff, + 0x03, 0x00, + + // 'r' (0x72) 5x8, offset 679-684, at +1/-8 + 0xff, 0x02, 0x01, 0x01, 0x00, + + // 's' (0x73) 6x8, offset 684-690, at +1/-8 + 0x86, 0x89, 0x89, 0x91, 0x71, 0x00, + + // 't' (0x74) 6x10, offset 690-698, at +0/-10 + 0x04, 0xf8, 0x47, 0x20, 0x81, 0x00, 0x02, 0x00, + + // 'u' (0x75) 7x8, offset 698-705, at +1/-8 + 0x7f, 0x80, 0x80, 0x80, 0x40, 0xff, 0x00, + + // 'v' (0x76) 7x8, offset 705-712, at +0/-8 + 0x03, 0x1c, 0x60, 0xe0, 0x1c, 0x03, 0x00, + + // 'w' (0x77) 11x8, offset 712-723, at +0/-8 + 0x03, 0x3c, 0xc0, 0x30, 0x0e, 0x07, 0x78, 0xc0, + 0x3c, 0x03, 0x00, + + // 'x' (0x78) 8x8, offset 723-731, at +0/-8 + 0x00, 0xc3, 0x24, 0x18, 0x24, 0xc3, 0x00, 0x00, + + // 'y' (0x79) 7x11, offset 731-741, at +0/-8 + 0x03, 0xe4, 0x20, 0xf8, 0xc0, 0xc0, 0x81, 0x01, + 0x00, 0x00, + + // 'z' (0x7a) 5x8, offset 741-746, at +1/-8 + 0xc1, 0xb1, 0x8d, 0x83, 0x00, + + // '{' (0x7b) 6x12, offset 746-755, at +0/-10 + 0x40, 0x00, 0x04, 0xbe, 0x17, 0x80, 0x01, 0x08, + 0x00, + + // '|' (0x7c) 3x14, offset 755-761, at +3/-11 + 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, + + // '}' (0x7d) 5x12, offset 761-769, at +1/-10 + 0x01, 0xe8, 0x7b, 0x40, 0x00, 0x04, 0x00, 0x00, +}; + +const uint8_t SansLight14_RM[] = { + + // ' ' (0x20) 1x1, offset 0-1, at +0/+0 + 0x00, + + // '!' (0x21) 2x10, offset 1-4, at +1/-10 + 0xaa, 0xa8, 0x20, + + // '"' (0x22) 4x4, offset 4-6, at +1/-10 + 0xaa, 0xaa, + + // '#' (0x23) 10x10, offset 6-19, at +0/-10 + 0x12, 0x04, 0x81, 0x21, 0xfe, 0x12, 0x09, 0x0f, + 0xf0, 0x90, 0x24, 0x09, 0x00, + + // '$' (0x24) 7x12, offset 19-30, at +1/-11 + 0x20, 0xf2, 0x85, 0x0e, 0x0e, 0x0a, 0x12, 0x24, + 0x51, 0xe1, 0x00, + + // '%' (0x25) 10x10, offset 30-43, at +1/-10 + 0xe2, 0x24, 0x89, 0x42, 0x50, 0x9b, 0xbb, 0x21, + 0x48, 0x52, 0x24, 0x88, 0xe0, + + // '&' (0x26) 10x10, offset 43-56, at +1/-10 + 0x38, 0x11, 0x04, 0x41, 0x20, 0x30, 0x14, 0x08, + 0x92, 0x18, 0x86, 0x1e, 0x40, + + // ''' (0x27) 2x4, offset 56-57, at +1/-10 + 0xaa, + + // '(' (0x28) 4x12, offset 57-63, at +1/-10 + 0x44, 0x88, 0x88, 0x88, 0x88, 0x44, + + // ')' (0x29) 4x12, offset 63-69, at +0/-10 + 0x44, 0x22, 0x22, 0x22, 0x22, 0x44, + + // '*' (0x2a) 7x6, offset 69-75, at +1/-11 + 0x20, 0x43, 0xb1, 0x85, 0x09, 0x00, + + // '+' (0x2b) 7x7, offset 75-82, at +1/-9 + 0x00, 0x40, 0x87, 0xe2, 0x04, 0x00, 0x00, + + // ',' (0x2c) 3x4, offset 82-84, at +0/-2 + 0x49, 0x40, + + // '-' (0x2d) 4x1, offset 84-85, at +1/-4 + 0xe0, + + // '.' (0x2e) 2x1, offset 85-86, at +1/-1 + 0x80, + + // '/' (0x2f) 6x10, offset 86-94, at +0/-10 + 0x08, 0x41, 0x04, 0x20, 0x84, 0x10, 0x42, 0x00, + + // '0' (0x30) 7x10, offset 94-103, at +1/-10 + 0x79, 0x9a, 0x14, 0x28, 0x50, 0xa1, 0x42, 0xcc, + 0xf0, + + // '1' (0x31) 5x10, offset 103-110, at +1/-10 + 0x32, 0x84, 0x21, 0x08, 0x42, 0x10, 0x80, + + // '2' (0x32) 7x10, offset 110-119, at +1/-10 + 0x79, 0x10, 0x10, 0x20, 0x82, 0x08, 0x20, 0x81, + 0xf8, + + // '3' (0x33) 7x10, offset 119-128, at +1/-10 + 0x79, 0x08, 0x10, 0x47, 0x01, 0x81, 0x02, 0x0d, + 0xf0, + + // '4' (0x34) 9x10, offset 128-140, at +0/-10 + 0x04, 0x06, 0x05, 0x04, 0x82, 0x42, 0x23, 0xfc, + 0x08, 0x04, 0x02, 0x00, + + // '5' (0x35) 7x10, offset 140-149, at +1/-10 + 0x79, 0x02, 0x04, 0x0f, 0x80, 0x81, 0x02, 0x05, + 0xf0, + + // '6' (0x36) 7x10, offset 149-158, at +1/-10 + 0x38, 0x82, 0x04, 0x0f, 0x90, 0xa1, 0x42, 0x44, + 0xf0, + + // '7' (0x37) 7x10, offset 158-167, at +1/-10 + 0xfc, 0x08, 0x10, 0x40, 0x82, 0x04, 0x10, 0x20, + 0x80, + + // '8' (0x38) 7x10, offset 167-176, at +1/-10 + 0x79, 0x0a, 0x12, 0x43, 0x09, 0x21, 0x42, 0x84, + 0xf0, + + // '9' (0x39) 7x10, offset 176-185, at +1/-10 + 0x79, 0x12, 0x14, 0x28, 0x4f, 0x81, 0x02, 0x09, + 0xe0, + + // ':' (0x3a) 2x8, offset 185-187, at +1/-8 + 0x80, 0x02, + + // ';' (0x3b) 3x10, offset 187-191, at +0/-8 + 0x40, 0x00, 0x12, 0x40, + + // '<' (0x3c) 7x7, offset 191-198, at +1/-9 + 0x04, 0x31, 0x84, 0x06, 0x03, 0x01, 0x00, + + // '=' (0x3d) 7x3, offset 198-201, at +1/-7 + 0xfc, 0x03, 0xf0, + + // '>' (0x3e) 7x7, offset 201-208, at +1/-9 + 0x80, 0xc0, 0x60, 0x21, 0x8c, 0x20, 0x00, + + // '?' (0x3f) 6x10, offset 208-216, at +0/-10 + 0x78, 0x20, 0x82, 0x10, 0x82, 0x00, 0x00, 0x80, + + // '@' (0x40) 11x11, offset 216-232, at +1/-10 + 0x1f, 0x0c, 0x11, 0x01, 0x47, 0x29, 0x25, 0x44, + 0xa8, 0x94, 0xec, 0x80, 0x08, 0x00, 0xf8, 0x00, + + // 'A' (0x41) 9x10, offset 232-244, at +0/-10 + 0x08, 0x0c, 0x06, 0x04, 0x82, 0x41, 0x21, 0xf8, + 0x84, 0x81, 0x40, 0x80, + + // 'B' (0x42) 8x10, offset 244-254, at +1/-10 + 0xfc, 0x82, 0x82, 0x86, 0xf8, 0x86, 0x82, 0x82, + 0x82, 0xfc, + + // 'C' (0x43) 9x10, offset 254-266, at +1/-10 + 0x3e, 0x30, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, + 0x00, 0x40, 0x1f, 0x00, + + // 'D' (0x44) 9x10, offset 266-278, at +1/-10 + 0xfc, 0x41, 0x20, 0x50, 0x28, 0x14, 0x0a, 0x05, + 0x02, 0x86, 0x7e, 0x00, + + // 'E' (0x45) 7x10, offset 278-287, at +1/-10 + 0xfd, 0x02, 0x04, 0x0f, 0xd0, 0x20, 0x40, 0x81, + 0xf8, + + // 'F' (0x46) 7x10, offset 287-296, at +1/-10 + 0xfd, 0x02, 0x04, 0x0f, 0xd0, 0x20, 0x40, 0x81, + 0x00, + + // 'G' (0x47) 9x10, offset 296-308, at +1/-10 + 0x1e, 0x30, 0xa0, 0x10, 0x08, 0x04, 0x7a, 0x05, + 0x02, 0x41, 0x1f, 0x80, + + // 'H' (0x48) 9x10, offset 308-320, at +1/-10 + 0x81, 0x40, 0xa0, 0x50, 0x2f, 0xf4, 0x0a, 0x05, + 0x02, 0x81, 0x40, 0x80, + + // 'I' (0x49) 3x10, offset 320-324, at +1/-10 + 0x92, 0x49, 0x24, 0x90, + + // 'J' (0x4a) 4x13, offset 324-331, at -1/-10 + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0xc0, + + // 'K' (0x4b) 8x10, offset 331-341, at +1/-10 + 0x84, 0x84, 0x88, 0x90, 0xa0, 0xd0, 0x88, 0x88, + 0x84, 0x82, + + // 'L' (0x4c) 7x10, offset 341-350, at +1/-10 + 0x81, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x81, + 0xf8, + + // 'M' (0x4d) 11x10, offset 350-364, at +1/-10 + 0xc0, 0xd8, 0x1a, 0x85, 0x50, 0xaa, 0x15, 0x24, + 0xa4, 0x94, 0x62, 0x8c, 0x51, 0x08, + + // 'N' (0x4e) 9x10, offset 364-376, at +1/-10 + 0x81, 0x60, 0xa8, 0x52, 0x29, 0x14, 0x4a, 0x25, + 0x0a, 0x83, 0x40, 0x80, + + // 'O' (0x4f) 10x10, offset 376-389, at +1/-10 + 0x3e, 0x10, 0x48, 0x0a, 0x02, 0x80, 0xa0, 0x28, + 0x0a, 0x02, 0x41, 0x0f, 0x80, + + // 'P' (0x50) 7x10, offset 389-398, at +1/-10 + 0xf9, 0x0a, 0x14, 0x28, 0x5f, 0x20, 0x40, 0x81, + 0x00, + + // 'Q' (0x51) 10x12, offset 398-413, at +1/-10 + 0x3e, 0x10, 0x48, 0x0a, 0x02, 0x80, 0xa0, 0x28, + 0x0a, 0x02, 0x41, 0x0f, 0x80, 0x40, 0x0c, + + // 'R' (0x52) 8x10, offset 413-423, at +1/-10 + 0xf8, 0x84, 0x84, 0x84, 0x84, 0xf8, 0x88, 0x88, + 0x84, 0x84, + + // 'S' (0x53) 7x10, offset 423-432, at +1/-10 + 0x79, 0x02, 0x04, 0x06, 0x03, 0x01, 0x02, 0x05, + 0xf0, + + // 'T' (0x54) 8x10, offset 432-442, at +0/-10 + 0xfe, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, + + // 'U' (0x55) 9x10, offset 442-454, at +1/-10 + 0x81, 0x40, 0xa0, 0x50, 0x28, 0x14, 0x0a, 0x05, + 0x02, 0x42, 0x1e, 0x00, + + // 'V' (0x56) 9x10, offset 454-466, at +0/-10 + 0x81, 0x40, 0x90, 0x88, 0x42, 0x41, 0x20, 0x90, + 0x30, 0x18, 0x04, 0x00, + + // 'W' (0x57) 13x10, offset 466-483, at +0/-10 + 0x84, 0x12, 0x31, 0x11, 0x88, 0x94, 0x44, 0x92, + 0x14, 0xa0, 0xa5, 0x06, 0x18, 0x10, 0x80, 0x84, + 0x00, + + // 'X' (0x58) 9x10, offset 483-495, at +0/-10 + 0x41, 0x21, 0x09, 0x03, 0x01, 0x80, 0xc0, 0x90, + 0x48, 0x42, 0x40, 0x80, + + // 'Y' (0x59) 8x10, offset 495-505, at +0/-10 + 0x82, 0x44, 0x44, 0x28, 0x28, 0x10, 0x10, 0x10, + 0x10, 0x10, + + // 'Z' (0x5a) 7x10, offset 505-514, at +1/-10 + 0xfc, 0x08, 0x20, 0x81, 0x04, 0x10, 0x20, 0x81, + 0xf8, + + // '[' (0x5b) 4x12, offset 514-520, at +1/-10 + 0xe8, 0x88, 0x88, 0x88, 0x88, 0x8e, + + // '\' (0x5c) 6x10, offset 520-528, at +0/-10 + 0x81, 0x04, 0x10, 0x20, 0x81, 0x04, 0x10, 0x20, + + // ']' (0x5d) 4x12, offset 528-534, at +0/-10 + 0xe2, 0x22, 0x22, 0x22, 0x22, 0x2e, + + // '^' (0x5e) 7x6, offset 534-540, at +1/-10 + 0x10, 0x61, 0x22, 0x48, 0x50, 0x80, + + // '_' (0x5f) 7x1, offset 540-541, at +0/+1 + 0xfc, + + // '`' (0x60) 3x2, offset 541-542, at +3/-10 + 0x88, + + // 'a' (0x61) 6x8, offset 542-548, at +1/-8 + 0x70, 0x20, 0x9e, 0x8a, 0x29, 0xba, + + // 'b' (0x62) 7x11, offset 548-558, at +1/-11 + 0x81, 0x02, 0x05, 0xcc, 0x50, 0xa1, 0x42, 0x85, + 0x8a, 0xe0, + + // 'c' (0x63) 6x8, offset 558-564, at +1/-8 + 0x39, 0x08, 0x20, 0x82, 0x0c, 0x1e, + + // 'd' (0x64) 7x11, offset 564-574, at +1/-11 + 0x04, 0x08, 0x13, 0xa8, 0xd0, 0xa1, 0x42, 0x85, + 0x19, 0xd0, + + // 'e' (0x65) 7x8, offset 574-581, at +1/-8 + 0x79, 0x0a, 0x17, 0xe8, 0x10, 0x30, 0x3c, + + // 'f' (0x66) 6x11, offset 581-590, at +0/-11 + 0x39, 0x04, 0x3c, 0x41, 0x04, 0x10, 0x41, 0x04, + 0x00, + + // 'g' (0x67) 8x11, offset 590-601, at +0/-8 + 0x3e, 0x44, 0x44, 0x44, 0x38, 0x40, 0x40, 0x7c, + 0x82, 0x82, 0x7c, + + // 'h' (0x68) 7x11, offset 601-611, at +1/-11 + 0x81, 0x02, 0x05, 0xcc, 0x50, 0xa1, 0x42, 0x85, + 0x0a, 0x10, + + // 'i' (0x69) 2x10, offset 611-614, at +1/-10 + 0x8a, 0xaa, 0xa0, + + // 'j' (0x6a) 4x13, offset 614-621, at -1/-10 + 0x20, 0x22, 0x22, 0x22, 0x22, 0x22, 0xc0, + + // 'k' (0x6b) 7x11, offset 621-631, at +1/-11 + 0x81, 0x02, 0x04, 0x48, 0x92, 0x28, 0x68, 0x91, + 0x12, 0x10, + + // 'l' (0x6c) 2x11, offset 631-634, at +1/-11 + 0xaa, 0xaa, 0xa8, + + // 'm' (0x6d) 11x8, offset 634-645, at +1/-8 + 0xbb, 0x99, 0x8a, 0x11, 0x42, 0x28, 0x45, 0x08, + 0xa1, 0x14, 0x22, + + // 'n' (0x6e) 7x8, offset 645-652, at +1/-8 + 0xb9, 0x8a, 0x14, 0x28, 0x50, 0xa1, 0x42, + + // 'o' (0x6f) 7x8, offset 652-659, at +1/-8 + 0x79, 0x0a, 0x14, 0x28, 0x50, 0xa1, 0x3c, + + // 'p' (0x70) 7x11, offset 659-669, at +1/-8 + 0xb9, 0x8a, 0x14, 0x28, 0x50, 0xb1, 0x5c, 0x81, + 0x02, 0x00, + + // 'q' (0x71) 7x11, offset 669-679, at +1/-8 + 0x75, 0x1a, 0x14, 0x28, 0x50, 0xa3, 0x3a, 0x04, + 0x08, 0x10, + + // 'r' (0x72) 5x8, offset 679-684, at +1/-8 + 0xb6, 0x21, 0x08, 0x42, 0x10, + + // 's' (0x73) 6x8, offset 684-690, at +1/-8 + 0x7a, 0x08, 0x18, 0x18, 0x20, 0xbc, + + // 't' (0x74) 6x10, offset 690-698, at +0/-10 + 0x01, 0x0f, 0x10, 0x41, 0x04, 0x10, 0x40, 0xe0, + + // 'u' (0x75) 7x8, offset 698-705, at +1/-8 + 0x85, 0x0a, 0x14, 0x28, 0x50, 0xa3, 0x3a, + + // 'v' (0x76) 7x8, offset 705-712, at +0/-8 + 0x85, 0x09, 0x22, 0x44, 0x86, 0x0c, 0x08, + + // 'w' (0x77) 11x8, offset 712-723, at +0/-8 + 0x84, 0x51, 0x89, 0x32, 0x25, 0x45, 0x28, 0xa5, + 0x08, 0xc1, 0x08, + + // 'x' (0x78) 8x8, offset 723-731, at +0/-8 + 0x44, 0x44, 0x28, 0x10, 0x10, 0x28, 0x44, 0x44, + + // 'y' (0x79) 7x11, offset 731-741, at +0/-8 + 0x85, 0x09, 0x22, 0x44, 0x86, 0x0c, 0x10, 0x20, + 0x43, 0x00, + + // 'z' (0x7a) 5x8, offset 741-746, at +1/-8 + 0xf0, 0x88, 0x44, 0x22, 0x1e, + + // '{' (0x7b) 6x12, offset 746-755, at +0/-10 + 0x18, 0x82, 0x08, 0x20, 0x8c, 0x08, 0x20, 0x82, + 0x06, + + // '|' (0x7c) 3x14, offset 755-761, at +3/-11 + 0x92, 0x49, 0x24, 0x92, 0x49, 0x00, + + // '}' (0x7d) 5x12, offset 761-769, at +1/-10 + 0x82, 0x10, 0x84, 0x20, 0xc8, 0x42, 0x11, 0x00, +}; + +const GFXglyph SansLight16Glyphs[] = { + // off, w, h, xa, xo, yo + { 0, 1, 1, 5, 0, 13 }, // ' ' + { 1, 3, 12, 5, 1, 1 }, // '!' + { 6, 5, 4, 7, 1, 1 }, // '"' + { 9, 11, 12, 11, 0, 1 }, // '#' + { 26, 8, 13, 10, 1, 1 }, // '$' + { 39, 12, 12, 14, 1, 1 }, // '%' + { 57, 11, 12, 12, 1, 1 }, // '&' + { 74, 2, 4, 4, 1, 1 }, // ''' + { 75, 4, 15, 5, 1, 1 }, // '(' + { 83, 4, 15, 5, 0, 1 }, // ')' + { 91, 8, 7, 10, 1, 0 }, // '*' + { 98, 8, 7, 10, 1, 3 }, // '+' + { 105, 3, 4, 4, 0, 11 }, // ',' + { 107, 4, 1, 6, 1, 8 }, // '-' + { 108, 3, 2, 5, 1, 11 }, // '.' + { 109, 6, 12, 6, 0, 1 }, // '/' + { 118, 8, 12, 10, 1, 1 }, // '0' + { 130, 4, 12, 10, 2, 1 }, // '1' + { 136, 8, 12, 10, 1, 1 }, // '2' + { 148, 8, 12, 10, 1, 1 }, // '3' + { 160, 10, 12, 10, 0, 1 }, // '4' + { 175, 8, 12, 10, 1, 1 }, // '5' + { 187, 8, 12, 10, 1, 1 }, // '6' + { 199, 8, 12, 10, 1, 1 }, // '7' + { 211, 8, 12, 10, 1, 1 }, // '8' + { 223, 8, 12, 10, 1, 1 }, // '9' + { 235, 3, 9, 5, 1, 4 }, // ':' + { 239, 3, 11, 5, 1, 4 }, // ';' + { 244, 8, 7, 10, 1, 3 }, // '<' + { 251, 8, 4, 10, 1, 5 }, // '=' + { 255, 8, 7, 10, 1, 3 }, // '>' + { 262, 7, 12, 8, 0, 1 }, // '?' + { 273, 13, 14, 15, 1, 1 }, // '@' + { 296, 11, 12, 11, 0, 1 }, // 'A' + { 313, 8, 12, 11, 2, 1 }, // 'B' + { 325, 10, 12, 11, 1, 1 }, // 'C' + { 340, 9, 12, 12, 2, 1 }, // 'D' + { 354, 7, 12, 10, 2, 1 }, // 'E' + { 365, 7, 12, 9, 2, 1 }, // 'F' + { 376, 11, 12, 13, 1, 1 }, // 'G' + { 393, 9, 12, 13, 2, 1 }, // 'H' + { 407, 3, 12, 5, 1, 1 }, // 'I' + { 412, 4, 15, 5, -1, 1 }, // 'J' + { 420, 8, 12, 10, 2, 1 }, // 'K' + { 432, 7, 12, 9, 2, 1 }, // 'L' + { 443, 11, 12, 15, 2, 1 }, // 'M' + { 460, 9, 12, 13, 2, 1 }, // 'N' + { 474, 11, 12, 13, 1, 1 }, // 'O' + { 491, 7, 12, 10, 2, 1 }, // 'P' + { 502, 11, 15, 13, 1, 1 }, // 'Q' + { 523, 9, 12, 11, 2, 1 }, // 'R' + { 537, 8, 12, 10, 1, 1 }, // 'S' + { 549, 9, 12, 9, 0, 1 }, // 'T' + { 563, 9, 12, 13, 2, 1 }, // 'U' + { 577, 10, 12, 10, 0, 1 }, // 'V' + { 592, 15, 12, 15, 0, 1 }, // 'W' + { 615, 10, 12, 10, 0, 1 }, // 'X' + { 630, 9, 12, 9, 0, 1 }, // 'Y' + { 644, 8, 12, 10, 1, 1 }, // 'Z' + { 656, 5, 15, 6, 1, 1 }, // '[' + { 666, 6, 12, 6, 0, 1 }, // '\' + { 675, 5, 15, 6, 0, 1 }, // ']' + { 685, 8, 7, 10, 1, 1 }, // '^' + { 692, 8, 1, 8, 0, 14 }, // '_' + { 693, 4, 3, 10, 3, 0 }, // '`' + { 695, 7, 9, 9, 1, 4 }, // 'a' + { 703, 8, 13, 11, 2, 0 }, // 'b' + { 716, 7, 9, 9, 1, 4 }, // 'c' + { 724, 9, 13, 11, 1, 0 }, // 'd' + { 739, 8, 9, 10, 1, 4 }, // 'e' + { 748, 7, 13, 6, 0, 0 }, // 'f' + { 760, 9, 13, 9, 0, 4 }, // 'g' + { 775, 8, 13, 10, 1, 0 }, // 'h' + { 788, 2, 12, 5, 1, 1 }, // 'i' + { 791, 4, 16, 5, -1, 1 }, // 'j' + { 799, 8, 13, 9, 1, 0 }, // 'k' + { 812, 3, 13, 5, 1, 0 }, // 'l' + { 817, 13, 9, 15, 1, 4 }, // 'm' + { 832, 8, 9, 10, 1, 4 }, // 'n' + { 841, 8, 9, 10, 1, 4 }, // 'o' + { 850, 8, 13, 11, 2, 4 }, // 'p' + { 863, 9, 13, 11, 1, 4 }, // 'q' + { 878, 6, 9, 7, 1, 4 }, // 'r' + { 885, 6, 9, 8, 1, 4 }, // 's' + { 892, 6, 11, 6, 0, 2 }, // 't' + { 901, 8, 9, 10, 1, 4 }, // 'u' + { 910, 8, 9, 8, 0, 4 }, // 'v' + { 919, 13, 9, 13, 0, 4 }, // 'w' + { 934, 9, 9, 9, 0, 4 }, // 'x' + { 945, 8, 13, 8, 0, 4 }, // 'y' + { 958, 6, 9, 8, 1, 4 }, // 'z' + { 965, 5, 15, 7, 1, 1 }, // '{' + { 975, 2, 17, 10, 4, 0 }, // '|' + { 980, 6, 15, 7, 1, 1 }, // '}' + { 992, 8, 2, 10, 0, 6 }, // '~' + { 994, 8, 4, 8, 2, 0 }, // '' +}; + +const uint8_t SansLight16_BCM[] = { + + // ' ' (0x20) 1x1, offset 0-1, at +0/+0 + 0x00, + + // '!' (0x21) 3x12, offset 1-6, at +1/-12 + 0xff, 0x0c, 0xc0, 0x00, 0x00, + + // '"' (0x22) 5x4, offset 6-9, at +1/-12 + 0x0f, 0xf0, 0x00, + + // '#' (0x23) 11x12, offset 9-26, at +0/-12 + 0x80, 0x00, 0x09, 0x90, 0xcf, 0x0f, 0x93, 0x00, + 0xc9, 0xf0, 0xf3, 0x09, 0x90, 0x00, 0x01, 0x00, + 0x00, + + // '$' (0x24) 8x13, offset 26-39, at +1/-12 + 0x18, 0x84, 0x04, 0x09, 0xa1, 0xff, 0x2f, 0x8c, + 0x04, 0x09, 0xc0, 0x00, 0x00, + + // '%' (0x25) 12x12, offset 39-57, at +1/-12 + 0x3e, 0x10, 0x04, 0x41, 0x68, 0x63, 0x88, 0x01, + 0x06, 0x18, 0x61, 0x6e, 0x21, 0x08, 0x82, 0xc0, + 0x07, 0x00, + + // '&' (0x26) 11x12, offset 57-74, at +1/-12 + 0x80, 0xe7, 0xc4, 0x31, 0x18, 0x82, 0x51, 0xe8, + 0x88, 0x00, 0x05, 0x60, 0xc0, 0x09, 0x00, 0x00, + 0x00, + + // ''' (0x27) 2x4, offset 74-75, at +1/-12 + 0x0f, + + // '(' (0x28) 4x15, offset 75-83, at +1/-12 + 0xfc, 0x9f, 0x01, 0x30, 0x00, 0x00, 0x00, 0x00, + + // ')' (0x29) 4x15, offset 83-91, at +0/-12 + 0x00, 0x80, 0x01, 0x30, 0xff, 0x07, 0x00, 0x00, + + // '*' (0x2a) 8x7, offset 91-98, at +1/-13 + 0x08, 0x24, 0xee, 0x81, 0x43, 0x12, 0x00, + + // '+' (0x2b) 8x7, offset 98-105, at +1/-10 + 0x08, 0x04, 0xe2, 0x8f, 0x40, 0x20, 0x00, + + // ',' (0x2c) 3x4, offset 105-107, at +0/-2 + 0x78, 0x00, + + // '-' (0x2d) 4x1, offset 107-108, at +1/-5 + 0x07, + + // '.' (0x2e) 3x2, offset 108-109, at +1/-2 + 0x0f, + + // '/' (0x2f) 6x12, offset 109-118, at +0/-12 + 0x00, 0x08, 0x70, 0xf0, 0xe0, 0x00, 0x01, 0x00, + 0x00, + + // '0' (0x30) 8x12, offset 118-130, at +1/-12 + 0xfc, 0x23, 0x40, 0x01, 0x18, 0x80, 0x01, 0x28, + 0x40, 0xfc, 0x03, 0x00, + + // '1' (0x31) 4x12, offset 130-136, at +2/-12 + 0x04, 0x20, 0x00, 0xff, 0x0f, 0x00, + + // '2' (0x32) 8x12, offset 136-148, at +1/-12 + 0x02, 0x1c, 0xa0, 0x01, 0x19, 0x88, 0x41, 0xe8, + 0x83, 0x00, 0x08, 0x00, + + // '3' (0x33) 8x12, offset 148-160, at +1/-12 + 0x02, 0x18, 0x82, 0x21, 0x18, 0x82, 0x21, 0x28, + 0x45, 0x8c, 0x03, 0x00, + + // '4' (0x34) 10x12, offset 160-175, at +0/-12 + 0x00, 0x01, 0x1c, 0x20, 0x81, 0x11, 0x04, 0x21, + 0x10, 0xff, 0x0f, 0x10, 0x00, 0x01, 0x00, + + // '5' (0x35) 8x12, offset 175-187, at +1/-12 + 0x30, 0xf4, 0x82, 0x21, 0x18, 0x82, 0x21, 0x18, + 0x44, 0xc0, 0x03, 0x00, + + // '6' (0x36) 8x12, offset 187-199, at +1/-12 + 0xf8, 0x63, 0x44, 0x22, 0x18, 0x82, 0x21, 0x18, + 0xc2, 0xc0, 0x07, 0x00, + + // '7' (0x37) 8x12, offset 199-211, at +1/-12 + 0x01, 0x10, 0x00, 0x01, 0x1c, 0x38, 0x61, 0xd0, + 0x01, 0x03, 0x00, 0x00, + + // '8' (0x38) 8x12, offset 211-223, at +1/-12 + 0x8c, 0x27, 0xc5, 0x21, 0x18, 0x82, 0x51, 0x28, + 0xc5, 0x8c, 0x07, 0x00, + + // '9' (0x39) 8x12, offset 223-235, at +1/-12 + 0x3e, 0x30, 0x84, 0x41, 0x18, 0x84, 0x41, 0x24, + 0x62, 0xfc, 0x01, 0x00, + + // ':' (0x3a) 3x9, offset 235-239, at +1/-9 + 0x83, 0x07, 0x03, 0x00, + + // ';' (0x3b) 3x11, offset 239-244, at +1/-9 + 0x83, 0x1f, 0x00, 0x00, 0x00, + + // '<' (0x3c) 8x7, offset 244-251, at +1/-10 + 0x08, 0x0c, 0x85, 0x24, 0x12, 0x05, 0x01, + + // '=' (0x3d) 8x4, offset 251-255, at +1/-8 + 0x99, 0x99, 0x99, 0x09, + + // '>' (0x3e) 8x7, offset 255-262, at +1/-10 + 0x41, 0x91, 0x88, 0x44, 0xc1, 0x20, 0x00, + + // '?' (0x3f) 7x12, offset 262-273, at +0/-12 + 0x00, 0x10, 0x00, 0x81, 0x1d, 0x04, 0x21, 0xe0, + 0x01, 0x00, 0x00, + + // '@' (0x40) 13x14, offset 273-296, at +1/-12 + 0xf0, 0x07, 0x03, 0x22, 0x00, 0x89, 0x87, 0x11, + 0x62, 0x82, 0x98, 0x20, 0x26, 0x84, 0xf9, 0x83, + 0x80, 0x40, 0x20, 0xe0, 0x07, 0x00, 0x00, + + // 'A' (0x41) 11x12, offset 296-313, at +0/-12 + 0x00, 0x08, 0x70, 0xc0, 0x80, 0x0b, 0x86, 0x70, + 0x08, 0x98, 0x00, 0x0e, 0x00, 0x07, 0x80, 0x00, + 0x00, + + // 'B' (0x42) 8x12, offset 313-325, at +2/-12 + 0xff, 0x1f, 0x82, 0x21, 0x18, 0x82, 0x21, 0x28, + 0x45, 0xce, 0x07, 0x00, + + // 'C' (0x43) 10x12, offset 325-340, at +1/-12 + 0xf8, 0x41, 0x60, 0x02, 0x14, 0x80, 0x01, 0x18, + 0x80, 0x01, 0x18, 0x80, 0x00, 0x00, 0x00, + + // 'D' (0x44) 9x12, offset 340-354, at +2/-12 + 0xff, 0x1f, 0x80, 0x01, 0x18, 0x80, 0x01, 0x28, + 0x40, 0x06, 0x86, 0x1f, 0x00, 0x00, + + // 'E' (0x45) 7x12, offset 354-365, at +2/-12 + 0xff, 0x1f, 0x82, 0x21, 0x18, 0x82, 0x21, 0x18, + 0x82, 0x00, 0x00, + + // 'F' (0x46) 7x12, offset 365-376, at +2/-12 + 0xff, 0x1f, 0x04, 0x41, 0x10, 0x04, 0x41, 0x10, + 0x04, 0x00, 0x00, + + // 'G' (0x47) 11x12, offset 376-393, at +1/-12 + 0xf8, 0x41, 0x20, 0x02, 0x34, 0x80, 0x01, 0x18, + 0x84, 0x41, 0x18, 0x84, 0x41, 0x08, 0x7c, 0x00, + 0x00, + + // 'H' (0x48) 9x12, offset 393-407, at +2/-12 + 0xff, 0x0f, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, + 0x02, 0x20, 0xf0, 0xff, 0x00, 0x00, + + // 'I' (0x49) 3x12, offset 407-412, at +1/-12 + 0x00, 0xf0, 0xff, 0x00, 0x00, + + // 'J' (0x4a) 4x15, offset 412-420, at -1/-12 + 0x00, 0x40, 0x00, 0xe0, 0xff, 0x0f, 0x00, 0x00, + + // 'K' (0x4b) 8x12, offset 420-432, at +2/-12 + 0xff, 0x0f, 0x02, 0x70, 0x80, 0x08, 0x04, 0x33, + 0x40, 0x00, 0x08, 0x00, + + // 'L' (0x4c) 7x12, offset 432-443, at +2/-12 + 0xff, 0x0f, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, + 0x80, 0x00, 0x00, + + // 'M' (0x4d) 11x12, offset 443-460, at +2/-12 + 0xff, 0xcf, 0x00, 0x70, 0x00, 0x18, 0x00, 0x0e, + 0x60, 0x80, 0x01, 0x07, 0x0e, 0xf0, 0xff, 0x00, + 0x00, + + // 'N' (0x4e) 9x12, offset 460-474, at +2/-12 + 0xff, 0x4f, 0x00, 0x08, 0x00, 0x03, 0xc0, 0x00, + 0x10, 0x00, 0xf6, 0xff, 0x00, 0x00, + + // 'O' (0x4f) 11x12, offset 474-491, at +1/-12 + 0xf8, 0x61, 0x60, 0x02, 0x14, 0x80, 0x01, 0x18, + 0x80, 0x01, 0x28, 0x40, 0x06, 0x86, 0x1f, 0x00, + 0x00, + + // 'P' (0x50) 7x12, offset 491-502, at +2/-12 + 0xff, 0x1f, 0x04, 0x41, 0x10, 0x04, 0x23, 0xe0, + 0x03, 0x00, 0x00, + + // 'Q' (0x51) 11x15, offset 502-523, at +1/-12 + 0xf8, 0x01, 0x03, 0x83, 0x00, 0x21, 0x00, 0x11, + 0x80, 0x08, 0x40, 0x04, 0x60, 0x04, 0xc8, 0x06, + 0x46, 0xfc, 0x00, 0x00, 0x00, + + // 'R' (0x52) 9x12, offset 523-537, at +2/-12 + 0xff, 0x1f, 0x04, 0x41, 0x10, 0x04, 0xc1, 0x21, + 0x22, 0x1c, 0x0c, 0x00, 0x00, 0x00, + + // 'S' (0x53) 8x12, offset 537-549, at +1/-12 + 0x1e, 0x28, 0x81, 0x21, 0x18, 0x82, 0x41, 0x18, + 0xc4, 0x82, 0x07, 0x00, + + // 'T' (0x54) 9x12, offset 549-563, at +0/-12 + 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0xff, 0x1f, + 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, + + // 'U' (0x55) 9x12, offset 563-577, at +2/-12 + 0xff, 0x07, 0x40, 0x00, 0x08, 0x80, 0x00, 0x08, + 0x80, 0x00, 0xf4, 0x7f, 0x00, 0x00, + + // 'V' (0x56) 10x12, offset 577-592, at +0/-12 + 0x03, 0xc0, 0x01, 0x60, 0x00, 0x38, 0x00, 0x0c, + 0x30, 0xe0, 0xc0, 0x01, 0x03, 0x00, 0x00, + + // 'W' (0x57) 15x12, offset 592-615, at +0/-12 + 0x01, 0xe0, 0x01, 0xe0, 0x01, 0xe0, 0x80, 0x87, + 0x07, 0x07, 0xf0, 0x00, 0x70, 0x00, 0x78, 0x00, + 0x0e, 0x1e, 0x1e, 0x10, 0x00, 0x00, 0x00, + + // 'X' (0x58) 10x12, offset 615-630, at +0/-12 + 0x00, 0x38, 0x40, 0x04, 0x83, 0x0d, 0x20, 0x00, + 0x0d, 0x0c, 0x33, 0x40, 0x00, 0x08, 0x00, + + // 'Y' (0x59) 9x12, offset 630-644, at +0/-12 + 0x01, 0x60, 0x00, 0x18, 0x00, 0x06, 0xe0, 0x8f, + 0x01, 0x06, 0x10, 0x00, 0x00, 0x00, + + // 'Z' (0x5a) 8x12, offset 644-656, at +1/-12 + 0x01, 0x1c, 0xb0, 0x81, 0x18, 0x86, 0x11, 0xd8, + 0x80, 0x03, 0x08, 0x00, + + // '[' (0x5b) 5x15, offset 656-666, at +1/-12 + 0xff, 0xff, 0x00, 0x60, 0x00, 0x30, 0x00, 0x08, + 0x00, 0x00, + + // '\' (0x5c) 6x12, offset 666-675, at +0/-12 + 0x01, 0xe0, 0x00, 0xf0, 0x00, 0x70, 0x00, 0x08, + 0x00, + + // ']' (0x5d) 5x15, offset 675-685, at +0/-12 + 0x01, 0xc0, 0x00, 0x60, 0x00, 0xf0, 0xff, 0x0f, + 0x00, 0x00, + + // '^' (0x5e) 8x7, offset 685-692, at +1/-12 + 0x60, 0x8c, 0x21, 0x60, 0xc0, 0x80, 0x01, + + // '_' (0x5f) 8x1, offset 692-693, at +0/+1 + 0x7f, + + // '`' (0x60) 4x3, offset 693-695, at +3/-13 + 0x11, 0x01, + + // 'a' (0x61) 7x9, offset 695-703, at +1/-9 + 0xe0, 0x22, 0x46, 0x8c, 0x38, 0xc9, 0x3f, 0x00, + + // 'b' (0x62) 8x13, offset 703-716, at +2/-13 + 0xff, 0x1f, 0x02, 0x42, 0x40, 0x08, 0x08, 0x01, + 0x41, 0x10, 0xf0, 0x01, 0x00, + + // 'c' (0x63) 7x9, offset 716-724, at +1/-9 + 0x7c, 0x04, 0x05, 0x0c, 0x18, 0x30, 0x20, 0x00, + + // 'd' (0x64) 9x13, offset 724-739, at +1/-13 + 0xc0, 0x07, 0x04, 0x41, 0x40, 0x08, 0x08, 0x01, + 0x21, 0x20, 0x18, 0xfb, 0xff, 0x00, 0x00, + + // 'e' (0x65) 8x9, offset 739-748, at +1/-9 + 0x7c, 0x24, 0x45, 0x8c, 0x18, 0x51, 0x22, 0x07, + 0x00, + + // 'f' (0x66) 7x13, offset 748-760, at +0/-13 + 0x10, 0x00, 0x02, 0xf8, 0xff, 0x08, 0x10, 0x01, + 0x02, 0x00, 0x00, 0x00, + + // 'g' (0x67) 9x13, offset 760-775, at +0/-9 + 0x00, 0xcc, 0x53, 0x87, 0xc5, 0x90, 0x18, 0x12, + 0x67, 0x62, 0x43, 0x0a, 0x30, 0x00, 0x00, + + // 'h' (0x68) 8x13, offset 775-788, at +1/-13 + 0xff, 0x1f, 0x04, 0x40, 0x00, 0x08, 0x00, 0x01, + 0x60, 0x00, 0xf0, 0x07, 0x00, + + // 'i' (0x69) 2x12, offset 788-791, at +1/-12 + 0xfb, 0x0f, 0x00, + + // 'j' (0x6a) 4x16, offset 791-799, at -1/-12 + 0x00, 0x80, 0x00, 0x80, 0xfb, 0xff, 0x00, 0x00, + + // 'k' (0x6b) 8x13, offset 799-812, at +1/-13 + 0xff, 0x1f, 0x40, 0x00, 0x04, 0xe0, 0x01, 0x42, + 0x20, 0x10, 0x00, 0x04, 0x00, + + // 'l' (0x6c) 3x13, offset 812-817, at +1/-13 + 0xff, 0x1f, 0x00, 0x00, 0x00, + + // 'm' (0x6d) 13x9, offset 817-832, at +1/-9 + 0xff, 0x05, 0x04, 0x08, 0x10, 0x40, 0x80, 0xff, + 0x00, 0x01, 0x02, 0x0c, 0xe0, 0x0f, 0x00, + + // 'n' (0x6e) 8x9, offset 832-841, at +1/-9 + 0xff, 0x05, 0x04, 0x08, 0x10, 0x60, 0x00, 0x7f, + 0x00, + + // 'o' (0x6f) 8x9, offset 841-850, at +1/-9 + 0x7c, 0x04, 0x05, 0x0c, 0x18, 0x50, 0x10, 0x1f, + 0x00, + + // 'p' (0x70) 8x13, offset 850-863, at +2/-9 + 0xff, 0x3f, 0x20, 0x04, 0x84, 0x80, 0x10, 0x10, + 0x04, 0x01, 0x1f, 0x00, 0x00, + + // 'q' (0x71) 9x13, offset 863-878, at +1/-9 + 0x7c, 0x40, 0x10, 0x04, 0x84, 0x80, 0x10, 0x10, + 0x02, 0x82, 0x31, 0xf8, 0xff, 0x00, 0x00, + + // 'r' (0x72) 6x9, offset 878-885, at +1/-9 + 0xff, 0x05, 0x04, 0x08, 0x10, 0x00, 0x00, + + // 's' (0x73) 6x9, offset 885-892, at +1/-9 + 0x0e, 0x13, 0x46, 0x8c, 0x18, 0x0e, 0x00, + + // 't' (0x74) 6x11, offset 892-901, at +0/-11 + 0x04, 0xf8, 0x1f, 0x01, 0x09, 0x08, 0x40, 0x00, + 0x00, + + // 'u' (0x75) 8x9, offset 901-910, at +1/-9 + 0x7f, 0x00, 0x03, 0x04, 0x08, 0x10, 0xd0, 0x7f, + 0x00, + + // 'v' (0x76) 8x9, offset 910-919, at +0/-9 + 0x03, 0x38, 0x80, 0x03, 0x08, 0x8e, 0xc3, 0x00, + 0x00, + + // 'w' (0x77) 13x9, offset 919-934, at +0/-9 + 0x01, 0x3c, 0x80, 0x03, 0x8e, 0xc3, 0xc0, 0x01, + 0x1c, 0xc0, 0xc1, 0x79, 0x08, 0x00, 0x00, + + // 'x' (0x78) 9x9, offset 934-945, at +0/-9 + 0x00, 0x02, 0x1b, 0xc1, 0x81, 0xc3, 0x48, 0x60, + 0x00, 0x00, 0x00, + + // 'y' (0x79) 8x13, offset 945-958, at +0/-9 + 0x03, 0x90, 0x03, 0x82, 0x33, 0x80, 0x01, 0x0e, + 0x38, 0xc0, 0x00, 0x00, 0x00, + + // 'z' (0x7a) 6x9, offset 958-965, at +1/-9 + 0x81, 0xc3, 0x46, 0x6c, 0x38, 0x10, 0x00, + + // '{' (0x7b) 5x15, offset 965-975, at +1/-12 + 0x80, 0x00, 0xbe, 0xcf, 0x00, 0x38, 0x00, 0x08, + 0x00, 0x00, + + // '|' (0x7c) 2x17, offset 975-980, at +4/-13 + 0xff, 0xff, 0x01, 0x00, 0x00, + + // '}' (0x7d) 6x15, offset 980-992, at +1/-12 + 0x01, 0xc0, 0x01, 0x30, 0xdf, 0x07, 0x10, 0x00, + 0x08, 0x00, 0x00, 0x00, + + // '~' (0x7e) 8x2, offset 992-994, at +0/-7 + 0x56, 0x6a, + + // '' (0x7f) 8x4, offset 994-998, at +2/-13 + 0x00, 0x96, 0x69, 0x00, +}; + +const uint8_t SansLight16_RM[] = { + + // ' ' (0x20) 1x1, offset 0-1, at +0/+0 + 0x00, + + // '!' (0x21) 3x12, offset 1-6, at +1/-12 + 0x92, 0x49, 0x24, 0x03, 0x60, + + // '"' (0x22) 5x4, offset 6-9, at +1/-12 + 0x94, 0xa5, 0x20, + + // '#' (0x23) 11x12, offset 9-26, at +0/-12 + 0x09, 0x01, 0x20, 0x44, 0x08, 0x87, 0xfc, 0x24, + 0x04, 0x87, 0xfc, 0x22, 0x04, 0x40, 0x90, 0x12, + 0x00, + + // '$' (0x24) 8x13, offset 26-39, at +1/-12 + 0x10, 0x3c, 0x50, 0x90, 0x90, 0x50, 0x38, 0x1c, + 0x12, 0x12, 0x94, 0x78, 0x10, + + // '%' (0x25) 12x12, offset 39-57, at +1/-12 + 0x60, 0x89, 0x10, 0x91, 0x08, 0xa0, 0x92, 0x09, + 0x5c, 0x65, 0x20, 0x92, 0x0a, 0x21, 0x12, 0x11, + 0x22, 0x0c, + + // '&' (0x26) 11x12, offset 57-74, at +1/-12 + 0x38, 0x08, 0x81, 0x10, 0x22, 0x02, 0x80, 0x60, + 0x12, 0x24, 0x24, 0x82, 0x90, 0x23, 0x0c, 0x3e, + 0x40, + + // ''' (0x27) 2x4, offset 74-75, at +1/-12 + 0xaa, + + // '(' (0x28) 4x15, offset 75-83, at +1/-12 + 0x44, 0x88, 0x88, 0x88, 0x88, 0x88, 0x84, 0x40, + + // ')' (0x29) 4x15, offset 83-91, at +0/-12 + 0x44, 0x22, 0x22, 0x22, 0x22, 0x22, 0x24, 0x40, + + // '*' (0x2a) 8x7, offset 91-98, at +1/-13 + 0x10, 0x10, 0x12, 0xfc, 0x28, 0x28, 0x44, + + // '+' (0x2b) 8x7, offset 98-105, at +1/-10 + 0x10, 0x10, 0x10, 0xfe, 0x10, 0x10, 0x10, + + // ',' (0x2c) 3x4, offset 105-107, at +0/-2 + 0x49, 0x40, + + // '-' (0x2d) 4x1, offset 107-108, at +1/-5 + 0xe0, + + // '.' (0x2e) 3x2, offset 108-109, at +1/-2 + 0xd8, + + // '/' (0x2f) 6x12, offset 109-118, at +0/-12 + 0x08, 0x41, 0x04, 0x20, 0x82, 0x08, 0x41, 0x04, + 0x20, + + // '0' (0x30) 8x12, offset 118-130, at +1/-12 + 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, + 0x82, 0x82, 0x44, 0x38, + + // '1' (0x31) 4x12, offset 130-136, at +2/-12 + 0x26, 0xa2, 0x22, 0x22, 0x22, 0x22, + + // '2' (0x32) 8x12, offset 136-148, at +1/-12 + 0x78, 0x84, 0x04, 0x04, 0x04, 0x04, 0x08, 0x10, + 0x20, 0x40, 0x80, 0xfe, + + // '3' (0x33) 8x12, offset 148-160, at +1/-12 + 0x78, 0x84, 0x02, 0x02, 0x04, 0x78, 0x04, 0x02, + 0x02, 0x02, 0x04, 0xf8, + + // '4' (0x34) 10x12, offset 160-175, at +0/-12 + 0x02, 0x01, 0x80, 0xa0, 0x48, 0x12, 0x08, 0x84, + 0x21, 0x08, 0xff, 0x80, 0x80, 0x20, 0x08, + + // '5' (0x35) 8x12, offset 175-187, at +1/-12 + 0x7c, 0x40, 0x40, 0x40, 0x80, 0xf8, 0x06, 0x02, + 0x02, 0x02, 0x84, 0x78, + + // '6' (0x36) 8x12, offset 187-199, at +1/-12 + 0x1c, 0x60, 0x40, 0x80, 0x80, 0xbc, 0xc2, 0x82, + 0x82, 0x82, 0x46, 0x3c, + + // '7' (0x37) 8x12, offset 199-211, at +1/-12 + 0xfe, 0x02, 0x04, 0x04, 0x04, 0x08, 0x08, 0x10, + 0x10, 0x10, 0x20, 0x20, + + // '8' (0x38) 8x12, offset 211-223, at +1/-12 + 0x38, 0x44, 0x82, 0x82, 0x4c, 0x30, 0x4c, 0x82, + 0x82, 0x82, 0xc6, 0x7c, + + // '9' (0x39) 8x12, offset 223-235, at +1/-12 + 0x78, 0xc4, 0x82, 0x82, 0x82, 0x86, 0x7a, 0x02, + 0x02, 0x04, 0x0c, 0x70, + + // ':' (0x3a) 3x9, offset 235-239, at +1/-9 + 0xd8, 0x00, 0x06, 0xc0, + + // ';' (0x3b) 3x11, offset 239-244, at +1/-9 + 0xd8, 0x00, 0x04, 0x92, 0x00, + + // '<' (0x3c) 8x7, offset 244-251, at +1/-10 + 0x02, 0x0c, 0x30, 0xc0, 0x60, 0x1c, 0x02, + + // '=' (0x3d) 8x4, offset 251-255, at +1/-8 + 0xfe, 0x00, 0x00, 0xfe, + + // '>' (0x3e) 8x7, offset 255-262, at +1/-10 + 0x80, 0x60, 0x18, 0x06, 0x0c, 0x70, 0x80, + + // '?' (0x3f) 7x12, offset 262-273, at +0/-12 + 0x78, 0x08, 0x10, 0x20, 0x41, 0x04, 0x10, 0x20, + 0x00, 0x81, 0x00, + + // '@' (0x40) 13x14, offset 273-296, at +1/-12 + 0x0f, 0x81, 0x82, 0x10, 0x08, 0x8f, 0x28, 0x89, + 0x48, 0x4a, 0x42, 0x52, 0x12, 0x91, 0x94, 0x77, + 0x20, 0x00, 0x80, 0x02, 0x00, 0x0f, 0x80, + + // 'A' (0x41) 11x12, offset 296-313, at +0/-12 + 0x04, 0x01, 0x80, 0x30, 0x09, 0x01, 0x20, 0x22, + 0x08, 0x41, 0xf8, 0x40, 0x88, 0x11, 0x02, 0x40, + 0x20, + + // 'B' (0x42) 8x12, offset 313-325, at +2/-12 + 0xf8, 0x86, 0x82, 0x82, 0x84, 0xf8, 0x86, 0x82, + 0x82, 0x82, 0x86, 0xf8, + + // 'C' (0x43) 10x12, offset 325-340, at +1/-12 + 0x1f, 0x08, 0x04, 0x02, 0x00, 0x80, 0x20, 0x08, + 0x02, 0x00, 0x80, 0x10, 0x06, 0x00, 0x7c, + + // 'D' (0x44) 9x12, offset 340-354, at +2/-12 + 0xf8, 0x43, 0x20, 0x90, 0x28, 0x14, 0x0a, 0x05, + 0x02, 0x81, 0x41, 0x21, 0x9f, 0x00, + + // 'E' (0x45) 7x12, offset 354-365, at +2/-12 + 0xfd, 0x02, 0x04, 0x08, 0x1f, 0xa0, 0x40, 0x81, + 0x02, 0x07, 0xe0, + + // 'F' (0x46) 7x12, offset 365-376, at +2/-12 + 0xfd, 0x02, 0x04, 0x08, 0x10, 0x3f, 0x40, 0x81, + 0x02, 0x04, 0x00, + + // 'G' (0x47) 11x12, offset 376-393, at +1/-12 + 0x1f, 0x86, 0x01, 0x00, 0x40, 0x08, 0x01, 0x00, + 0x21, 0xf4, 0x02, 0x80, 0x48, 0x08, 0x81, 0x0f, + 0xc0, + + // 'H' (0x48) 9x12, offset 393-407, at +2/-12 + 0x81, 0x40, 0xa0, 0x50, 0x28, 0x17, 0xfa, 0x05, + 0x02, 0x81, 0x40, 0xa0, 0x50, 0x20, + + // 'I' (0x49) 3x12, offset 407-412, at +1/-12 + 0x49, 0x24, 0x92, 0x49, 0x20, + + // 'J' (0x4a) 4x15, offset 412-420, at -1/-12 + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0xc0, + + // 'K' (0x4b) 8x12, offset 420-432, at +2/-12 + 0x84, 0x84, 0x88, 0x90, 0xa0, 0xe0, 0xa0, 0x90, + 0x88, 0x88, 0x84, 0x82, + + // 'L' (0x4c) 7x12, offset 432-443, at +2/-12 + 0x81, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x81, + 0x02, 0x07, 0xe0, + + // 'M' (0x4d) 11x12, offset 443-460, at +2/-12 + 0x80, 0x50, 0x1b, 0x03, 0x60, 0x6a, 0x15, 0x42, + 0xa8, 0x54, 0x92, 0x92, 0x51, 0x8a, 0x31, 0x44, + 0x20, + + // 'N' (0x4e) 9x12, offset 460-474, at +2/-12 + 0x81, 0x40, 0xb0, 0x54, 0x29, 0x14, 0x8a, 0x25, + 0x12, 0x85, 0x41, 0xa0, 0xd0, 0x20, + + // 'O' (0x4f) 11x12, offset 474-491, at +1/-12 + 0x1e, 0x0c, 0x31, 0x02, 0x40, 0x28, 0x05, 0x00, + 0xa0, 0x14, 0x02, 0x80, 0x48, 0x11, 0x86, 0x0f, + 0x00, + + // 'P' (0x50) 7x12, offset 491-502, at +2/-12 + 0xf9, 0x1a, 0x14, 0x28, 0x51, 0xbc, 0x40, 0x81, + 0x02, 0x04, 0x00, + + // 'Q' (0x51) 11x15, offset 502-523, at +1/-12 + 0x1e, 0x0c, 0x31, 0x02, 0x40, 0x28, 0x05, 0x00, + 0xa0, 0x14, 0x02, 0x80, 0x48, 0x11, 0x86, 0x0f, + 0x00, 0x20, 0x02, 0x00, 0x60, + + // 'R' (0x52) 9x12, offset 523-537, at +2/-12 + 0xf8, 0x42, 0x20, 0x90, 0x48, 0x24, 0x23, 0xe1, + 0x10, 0x88, 0x42, 0x20, 0x90, 0x40, + + // 'S' (0x53) 8x12, offset 537-549, at +1/-12 + 0x3c, 0xc2, 0x80, 0x80, 0xc0, 0x30, 0x0c, 0x02, + 0x02, 0x02, 0x06, 0xfc, + + // 'T' (0x54) 9x12, offset 549-563, at +0/-12 + 0xff, 0x04, 0x02, 0x01, 0x00, 0x80, 0x40, 0x20, + 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, + + // 'U' (0x55) 9x12, offset 563-577, at +2/-12 + 0x81, 0x40, 0xa0, 0x50, 0x28, 0x14, 0x0a, 0x05, + 0x02, 0x81, 0x40, 0xb0, 0xc7, 0x80, + + // 'V' (0x56) 10x12, offset 577-592, at +0/-12 + 0x80, 0xa0, 0x24, 0x11, 0x04, 0x41, 0x08, 0x82, + 0x20, 0x48, 0x14, 0x05, 0x00, 0x80, 0x20, + + // 'W' (0x57) 15x12, offset 592-615, at +0/-12 + 0x83, 0x04, 0x86, 0x11, 0x0c, 0x22, 0x28, 0x44, + 0x48, 0x84, 0x92, 0x09, 0x24, 0x14, 0x28, 0x28, + 0x50, 0x30, 0xc0, 0x61, 0x80, 0x81, 0x00, + + // 'X' (0x58) 10x12, offset 615-630, at +0/-12 + 0x41, 0x10, 0x42, 0x20, 0x48, 0x14, 0x02, 0x01, + 0x40, 0x50, 0x22, 0x08, 0x84, 0x12, 0x02, + + // 'Y' (0x59) 9x12, offset 630-644, at +0/-12 + 0x81, 0x21, 0x10, 0x84, 0x82, 0x40, 0xc0, 0x60, + 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, + + // 'Z' (0x5a) 8x12, offset 644-656, at +1/-12 + 0xfe, 0x02, 0x04, 0x04, 0x08, 0x10, 0x10, 0x20, + 0x40, 0x40, 0x80, 0xfe, + + // '[' (0x5b) 5x15, offset 656-666, at +1/-12 + 0xf4, 0x21, 0x08, 0x42, 0x10, 0x84, 0x21, 0x08, + 0x43, 0xc0, + + // '\' (0x5c) 6x12, offset 666-675, at +0/-12 + 0x81, 0x04, 0x10, 0x20, 0x82, 0x08, 0x10, 0x41, + 0x02, + + // ']' (0x5d) 5x15, offset 675-685, at +0/-12 + 0xf0, 0x84, 0x21, 0x08, 0x42, 0x10, 0x84, 0x21, + 0x0b, 0xc0, + + // '^' (0x5e) 8x7, offset 685-692, at +1/-12 + 0x10, 0x28, 0x28, 0x44, 0x44, 0x82, 0x82, + + // '_' (0x5f) 8x1, offset 692-693, at +0/+1 + 0xfe, + + // '`' (0x60) 4x3, offset 693-695, at +3/-13 + 0x84, 0x20, + + // 'a' (0x61) 7x9, offset 695-703, at +1/-9 + 0x78, 0x18, 0x10, 0x27, 0xd0, 0xa1, 0x46, 0x74, + + // 'b' (0x62) 8x13, offset 703-716, at +2/-13 + 0x80, 0x80, 0x80, 0x80, 0xf8, 0x84, 0x82, 0x82, + 0x82, 0x82, 0x82, 0x84, 0xf8, + + // 'c' (0x63) 7x9, offset 716-724, at +1/-9 + 0x3c, 0x82, 0x04, 0x08, 0x10, 0x20, 0x20, 0x3c, + + // 'd' (0x64) 9x13, offset 724-739, at +1/-13 + 0x01, 0x00, 0x80, 0x40, 0x23, 0xd2, 0x1a, 0x0d, + 0x02, 0x81, 0x40, 0xa0, 0xc8, 0x63, 0xd0, + + // 'e' (0x65) 8x9, offset 739-748, at +1/-9 + 0x38, 0x44, 0x82, 0x82, 0xfe, 0x80, 0x80, 0x40, + 0x3c, + + // 'f' (0x66) 7x13, offset 748-760, at +0/-13 + 0x1c, 0x40, 0x81, 0x0f, 0x84, 0x08, 0x10, 0x20, + 0x40, 0x81, 0x02, 0x00, + + // 'g' (0x67) 9x13, offset 760-775, at +0/-9 + 0x3f, 0x22, 0x10, 0x88, 0x44, 0x41, 0xe0, 0x80, + 0x80, 0x3e, 0x20, 0xa0, 0x58, 0x47, 0xc0, + + // 'h' (0x68) 8x13, offset 775-788, at +1/-13 + 0x80, 0x80, 0x80, 0x80, 0xbc, 0xc4, 0x82, 0x82, + 0x82, 0x82, 0x82, 0x82, 0x82, + + // 'i' (0x69) 2x12, offset 788-791, at +1/-12 + 0xa2, 0xaa, 0xaa, + + // 'j' (0x6a) 4x16, offset 791-799, at -1/-12 + 0x22, 0x02, 0x22, 0x22, 0x22, 0x22, 0x22, 0x2e, + + // 'k' (0x6b) 8x13, offset 799-812, at +1/-13 + 0x80, 0x80, 0x80, 0x80, 0x84, 0x88, 0x90, 0x90, + 0xb0, 0xd0, 0x88, 0x84, 0x82, + + // 'l' (0x6c) 3x13, offset 812-817, at +1/-13 + 0x92, 0x49, 0x24, 0x92, 0x48, + + // 'm' (0x6d) 13x9, offset 817-832, at +1/-9 + 0xb9, 0xe6, 0x31, 0x20, 0x85, 0x04, 0x28, 0x21, + 0x41, 0x0a, 0x08, 0x50, 0x42, 0x82, 0x10, + + // 'n' (0x6e) 8x9, offset 832-841, at +1/-9 + 0xbc, 0xc4, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, + 0x82, + + // 'o' (0x6f) 8x9, offset 841-850, at +1/-9 + 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0x82, 0x44, + 0x38, + + // 'p' (0x70) 8x13, offset 850-863, at +2/-9 + 0xf8, 0x84, 0x82, 0x82, 0x82, 0x82, 0x82, 0x84, + 0xf8, 0x80, 0x80, 0x80, 0x80, + + // 'q' (0x71) 9x13, offset 863-878, at +1/-9 + 0x3d, 0x21, 0xa0, 0xd0, 0x28, 0x14, 0x0a, 0x0c, + 0x86, 0x3d, 0x00, 0x80, 0x40, 0x20, 0x10, + + // 'r' (0x72) 6x9, offset 878-885, at +1/-9 + 0xbb, 0x08, 0x20, 0x82, 0x08, 0x20, 0x80, + + // 's' (0x73) 6x9, offset 885-892, at +1/-9 + 0x7a, 0x08, 0x30, 0x30, 0x20, 0x82, 0xf0, + + // 't' (0x74) 6x11, offset 892-901, at +0/-11 + 0x41, 0x0f, 0x10, 0x41, 0x04, 0x10, 0x41, 0x03, + 0x80, + + // 'u' (0x75) 8x9, offset 901-910, at +1/-9 + 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x46, + 0x7a, + + // 'v' (0x76) 8x9, offset 910-919, at +0/-9 + 0x82, 0x82, 0x44, 0x44, 0x44, 0x28, 0x28, 0x28, + 0x10, + + // 'w' (0x77) 13x9, offset 919-934, at +0/-9 + 0x82, 0x12, 0x31, 0x11, 0x88, 0x92, 0x44, 0x92, + 0x14, 0xa0, 0xc3, 0x06, 0x18, 0x10, 0x80, + + // 'x' (0x78) 9x9, offset 934-945, at +0/-9 + 0x42, 0x12, 0x09, 0x03, 0x01, 0x80, 0xc0, 0x90, + 0x84, 0x42, 0x00, + + // 'y' (0x79) 8x13, offset 945-958, at +0/-9 + 0x82, 0x82, 0x44, 0x44, 0x44, 0x28, 0x28, 0x28, + 0x10, 0x10, 0x20, 0x20, 0xc0, + + // 'z' (0x7a) 6x9, offset 958-965, at +1/-9 + 0xf8, 0x21, 0x04, 0x21, 0x04, 0x20, 0xf8, + + // '{' (0x7b) 5x15, offset 965-975, at +1/-12 + 0x31, 0x10, 0x84, 0x21, 0x10, 0x42, 0x10, 0x84, + 0x10, 0xc0, + + // '|' (0x7c) 2x17, offset 975-980, at +4/-13 + 0xaa, 0xaa, 0xaa, 0xaa, 0x80, + + // '}' (0x7d) 6x15, offset 980-992, at +1/-12 + 0xc1, 0x02, 0x08, 0x20, 0x82, 0x06, 0x20, 0x82, + 0x08, 0x21, 0x0c, 0x00, + + // '~' (0x7e) 8x2, offset 992-994, at +0/-7 + 0x71, 0x8e, + + // '' (0x7f) 8x4, offset 994-998, at +2/-13 + 0x18, 0x24, 0x24, 0x18, +}; + +const GFXglyph Org01Glyphs[] = { + // off, w, h, xa, xo, yo + { 0, 0, 0, 6, 0, 5 }, // ' ' + { 0, 1, 5, 2, 0, 0 }, // '!' + { 1, 3, 1, 4, 0, 0 }, // '"' + { 2, 5, 5, 6, 0, 0 }, // '#' + { 6, 5, 5, 6, 0, 0 }, // '$' + { 10, 5, 5, 6, 0, 0 }, // '%' + { 14, 5, 5, 6, 0, 0 }, // '&' + { 18, 1, 1, 2, 0, 0 }, // ''' + { 19, 2, 5, 3, 0, 0 }, // '(' + { 21, 2, 5, 3, 0, 0 }, // ')' + { 23, 3, 3, 4, 0, 1 }, // '*' + { 25, 3, 3, 4, 0, 1 }, // '+' + { 27, 1, 2, 2, 0, 4 }, // ',' + { 28, 4, 1, 5, 0, 2 }, // '-' + { 29, 1, 1, 2, 0, 4 }, // '.' + { 30, 5, 5, 6, 0, 0 }, // '/' + { 34, 5, 5, 6, 0, 0 }, // '0' + { 38, 1, 5, 2, 0, 0 }, // '1' + { 39, 5, 5, 6, 0, 0 }, // '2' + { 43, 5, 5, 6, 0, 0 }, // '3' + { 47, 5, 5, 6, 0, 0 }, // '4' + { 51, 5, 5, 6, 0, 0 }, // '5' + { 55, 5, 5, 6, 0, 0 }, // '6' + { 59, 5, 5, 6, 0, 0 }, // '7' + { 63, 5, 5, 6, 0, 0 }, // '8' + { 67, 5, 5, 6, 0, 0 }, // '9' + { 71, 1, 4, 2, 0, 1 }, // ':' + { 72, 1, 4, 2, 0, 1 }, // ';' + { 73, 3, 5, 4, 0, 0 }, // '<' + { 75, 4, 3, 5, 0, 1 }, // '=' + { 77, 3, 5, 4, 0, 0 }, // '>' + { 79, 5, 5, 6, 0, 0 }, // '?' + { 83, 5, 5, 6, 0, 0 }, // '@' + { 87, 5, 5, 6, 0, 0 }, // 'A' + { 91, 5, 5, 6, 0, 0 }, // 'B' + { 95, 5, 5, 6, 0, 0 }, // 'C' + { 99, 5, 5, 6, 0, 0 }, // 'D' + { 103, 5, 5, 6, 0, 0 }, // 'E' + { 107, 5, 5, 6, 0, 0 }, // 'F' + { 111, 5, 5, 6, 0, 0 }, // 'G' + { 115, 5, 5, 6, 0, 0 }, // 'H' + { 119, 5, 5, 6, 0, 0 }, // 'I' + { 123, 5, 5, 6, 0, 0 }, // 'J' + { 127, 5, 5, 6, 0, 0 }, // 'K' + { 131, 5, 5, 6, 0, 0 }, // 'L' + { 135, 5, 5, 6, 0, 0 }, // 'M' + { 139, 5, 5, 6, 0, 0 }, // 'N' + { 143, 5, 5, 6, 0, 0 }, // 'O' + { 147, 5, 5, 6, 0, 0 }, // 'P' + { 151, 5, 5, 6, 0, 0 }, // 'Q' + { 155, 5, 5, 6, 0, 0 }, // 'R' + { 159, 5, 5, 6, 0, 0 }, // 'S' + { 163, 5, 5, 6, 0, 0 }, // 'T' + { 167, 5, 5, 6, 0, 0 }, // 'U' + { 171, 5, 5, 6, 0, 0 }, // 'V' + { 175, 5, 5, 6, 0, 0 }, // 'W' + { 179, 5, 5, 6, 0, 0 }, // 'X' + { 183, 5, 5, 6, 0, 0 }, // 'Y' + { 187, 5, 5, 6, 0, 0 }, // 'Z' + { 191, 2, 5, 3, 0, 0 }, // '[' + { 193, 5, 5, 6, 0, 0 }, // '\' + { 197, 2, 5, 3, 0, 0 }, // ']' + { 199, 3, 2, 4, 0, 0 }, // '^' + { 200, 5, 1, 6, 0, 5 }, // '_' + { 201, 1, 1, 2, 0, 0 }, // '`' + { 202, 4, 4, 5, 0, 1 }, // 'a' + { 204, 4, 5, 5, 0, 0 }, // 'b' + { 207, 4, 4, 5, 0, 1 }, // 'c' + { 209, 4, 5, 5, 0, 0 }, // 'd' + { 212, 4, 4, 5, 0, 1 }, // 'e' + { 214, 3, 5, 4, 0, 0 }, // 'f' + { 216, 4, 5, 5, 0, 1 }, // 'g' + { 219, 4, 5, 5, 0, 0 }, // 'h' + { 222, 1, 4, 2, 0, 1 }, // 'i' + { 223, 2, 5, 3, 0, 1 }, // 'j' + { 225, 4, 5, 5, 0, 0 }, // 'k' + { 228, 1, 5, 2, 0, 0 }, // 'l' + { 229, 5, 4, 6, 0, 1 }, // 'm' + { 232, 4, 4, 5, 0, 1 }, // 'n' + { 234, 4, 4, 5, 0, 1 }, // 'o' + { 236, 4, 5, 5, 0, 1 }, // 'p' + { 239, 4, 5, 5, 0, 1 }, // 'q' + { 242, 4, 4, 5, 0, 1 }, // 'r' + { 244, 4, 4, 5, 0, 1 }, // 's' + { 246, 5, 5, 6, 0, 0 }, // 't' + { 250, 4, 4, 5, 0, 1 }, // 'u' + { 252, 4, 4, 5, 0, 1 }, // 'v' + { 254, 5, 4, 6, 0, 1 }, // 'w' + { 257, 4, 4, 5, 0, 1 }, // 'x' + { 259, 4, 5, 5, 0, 1 }, // 'y' + { 262, 4, 4, 5, 0, 1 }, // 'z' + { 264, 3, 5, 4, 0, 0 }, // '{' + { 266, 1, 5, 2, 0, 0 }, // '|' + { 267, 3, 5, 4, 0, 0 }, // '}' + { 269, 5, 3, 6, 0, 1 }, // '~' +}; + +const uint8_t Org01_BCM[] = { + + // ' ' (0x20) 0x0, offset 0-0, at +0/+1 + + // '!' (0x21) 1x5, offset 0-1, at +0/-4 + 0x17, + + // '"' (0x22) 3x1, offset 1-2, at +0/-4 + 0x05, + + // '#' (0x23) 5x5, offset 2-6, at +0/-4 + 0xea, 0xab, 0xaf, 0x00, + + // '$' (0x24) 5x5, offset 6-10, at +0/-4 + 0xb7, 0xfe, 0xda, 0x01, + + // '%' (0x25) 5x5, offset 10-14, at +0/-4 + 0x11, 0x11, 0x11, 0x01, + + // '&' (0x26) 5x5, offset 14-18, at +0/-4 + 0xbf, 0xd6, 0x47, 0x01, + + // ''' (0x27) 1x1, offset 18-19, at +0/-4 + 0x01, + + // '(' (0x28) 2x5, offset 19-21, at +0/-4 + 0x2e, 0x02, + + // ')' (0x29) 2x5, offset 21-23, at +0/-4 + 0xd1, 0x01, + + // '*' (0x2a) 3x3, offset 23-25, at +0/-3 + 0x55, 0x01, + + // '+' (0x2b) 3x3, offset 25-27, at +0/-3 + 0xba, 0x00, + + // ',' (0x2c) 1x2, offset 27-28, at +0/+0 + 0x03, + + // '-' (0x2d) 4x1, offset 28-29, at +0/-2 + 0x0f, + + // '.' (0x2e) 1x1, offset 29-30, at +0/+0 + 0x01, + + // '/' (0x2f) 5x5, offset 30-34, at +0/-4 + 0x10, 0x11, 0x11, 0x00, + + // '0' (0x30) 5x5, offset 34-38, at +0/-4 + 0x3f, 0xc6, 0xf8, 0x01, + + // '1' (0x31) 1x5, offset 38-39, at +0/-4 + 0x1f, + + // '2' (0x32) 5x5, offset 39-43, at +0/-4 + 0xbd, 0xd6, 0x7a, 0x01, + + // '3' (0x33) 5x5, offset 43-47, at +0/-4 + 0xb5, 0xd6, 0xfa, 0x01, + + // '4' (0x34) 5x5, offset 47-51, at +0/-4 + 0x87, 0x10, 0xf2, 0x01, + + // '5' (0x35) 5x5, offset 51-55, at +0/-4 + 0xb7, 0xd6, 0xda, 0x01, + + // '6' (0x36) 5x5, offset 55-59, at +0/-4 + 0xbf, 0xd6, 0xda, 0x01, + + // '7' (0x37) 5x5, offset 59-63, at +0/-4 + 0x21, 0x84, 0xf0, 0x01, + + // '8' (0x38) 5x5, offset 63-67, at +0/-4 + 0xbf, 0xd6, 0xfa, 0x01, + + // '9' (0x39) 5x5, offset 67-71, at +0/-4 + 0xb7, 0xd6, 0xfa, 0x01, + + // ':' (0x3a) 1x4, offset 71-72, at +0/-3 + 0x09, + + // ';' (0x3b) 1x4, offset 72-73, at +0/-3 + 0x0d, + + // '<' (0x3c) 3x5, offset 73-75, at +0/-4 + 0x44, 0x45, + + // '=' (0x3d) 4x3, offset 75-77, at +0/-3 + 0x6d, 0x0b, + + // '>' (0x3e) 3x5, offset 77-79, at +0/-4 + 0x51, 0x11, + + // '?' (0x3f) 5x5, offset 79-83, at +0/-4 + 0x21, 0xd4, 0x72, 0x00, + + // '@' (0x40) 5x5, offset 83-87, at +0/-4 + 0x3f, 0xde, 0x7a, 0x01, + + // 'A' (0x41) 5x5, offset 87-91, at +0/-4 + 0xbf, 0x94, 0xf2, 0x01, + + // 'B' (0x42) 5x5, offset 91-95, at +0/-4 + 0xbf, 0xd6, 0xaa, 0x00, + + // 'C' (0x43) 5x5, offset 95-99, at +0/-4 + 0x3f, 0xc6, 0x18, 0x01, + + // 'D' (0x44) 5x5, offset 99-103, at +0/-4 + 0x3f, 0xc6, 0xe8, 0x00, + + // 'E' (0x45) 5x5, offset 103-107, at +0/-4 + 0xbf, 0xd6, 0x5a, 0x01, + + // 'F' (0x46) 5x5, offset 107-111, at +0/-4 + 0xbf, 0x94, 0x52, 0x00, + + // 'G' (0x47) 5x5, offset 111-115, at +0/-4 + 0x3f, 0xd6, 0xda, 0x01, + + // 'H' (0x48) 5x5, offset 115-119, at +0/-4 + 0x9f, 0x10, 0xf2, 0x01, + + // 'I' (0x49) 5x5, offset 119-123, at +0/-4 + 0x31, 0xfe, 0x18, 0x01, + + // 'J' (0x4a) 5x5, offset 123-127, at +0/-4 + 0x38, 0xc6, 0x1f, 0x01, + + // 'K' (0x4b) 5x5, offset 127-131, at +0/-4 + 0x9f, 0x28, 0x15, 0x01, + + // 'L' (0x4c) 5x5, offset 131-135, at +0/-4 + 0x1f, 0x42, 0x08, 0x01, + + // 'M' (0x4d) 5x5, offset 135-139, at +0/-4 + 0x3f, 0xfc, 0xf0, 0x01, + + // 'N' (0x4e) 5x5, offset 139-143, at +0/-4 + 0x3f, 0x84, 0xf0, 0x01, + + // 'O' (0x4f) 5x5, offset 143-147, at +0/-4 + 0x3f, 0xc6, 0xf8, 0x01, + + // 'P' (0x50) 5x5, offset 147-151, at +0/-4 + 0xbf, 0x94, 0x72, 0x00, + + // 'Q' (0x51) 5x5, offset 151-155, at +0/-4 + 0x3f, 0xc6, 0xfc, 0x01, + + // 'R' (0x52) 5x5, offset 155-159, at +0/-4 + 0xbf, 0x94, 0x7e, 0x00, + + // 'S' (0x53) 5x5, offset 159-163, at +0/-4 + 0xb7, 0xd6, 0xda, 0x01, + + // 'T' (0x54) 5x5, offset 163-167, at +0/-4 + 0x21, 0xfc, 0x10, 0x00, + + // 'U' (0x55) 5x5, offset 167-171, at +0/-4 + 0x1f, 0x42, 0xf8, 0x01, + + // 'V' (0x56) 5x5, offset 171-175, at +0/-4 + 0x07, 0x41, 0x74, 0x00, + + // 'W' (0x57) 5x5, offset 175-179, at +0/-4 + 0x1f, 0x7e, 0xf8, 0x01, + + // 'X' (0x58) 5x5, offset 179-183, at +0/-4 + 0x51, 0x11, 0x15, 0x01, + + // 'Y' (0x59) 5x5, offset 183-187, at +0/-4 + 0x83, 0x60, 0x32, 0x00, + + // 'Z' (0x5a) 5x5, offset 187-191, at +0/-4 + 0xbd, 0xd6, 0x7a, 0x01, + + // '[' (0x5b) 2x5, offset 191-193, at +0/-4 + 0x3f, 0x02, + + // '\' (0x5c) 5x5, offset 193-197, at +0/-4 + 0x41, 0x10, 0x04, 0x01, + + // ']' (0x5d) 2x5, offset 197-199, at +0/-4 + 0xf1, 0x03, + + // '^' (0x5e) 3x2, offset 199-200, at +0/-4 + 0x26, + + // '_' (0x5f) 5x1, offset 200-201, at +0/+1 + 0x1f, + + // '`' (0x60) 1x1, offset 201-202, at +0/-4 + 0x01, + + // 'a' (0x61) 4x4, offset 202-204, at +0/-3 + 0xdd, 0xfd, + + // 'b' (0x62) 4x5, offset 204-207, at +0/-4 + 0x5f, 0x4a, 0x0f, + + // 'c' (0x63) 4x4, offset 207-209, at +0/-3 + 0x9f, 0x99, + + // 'd' (0x64) 4x5, offset 209-212, at +0/-4 + 0x5e, 0xca, 0x0f, + + // 'e' (0x65) 4x4, offset 212-214, at +0/-3 + 0xbf, 0xbb, + + // 'f' (0x66) 3x5, offset 214-216, at +0/-4 + 0xe4, 0x17, + + // 'g' (0x67) 4x5, offset 216-219, at +0/-3 + 0x2f, 0xa5, 0x0f, + + // 'h' (0x68) 4x5, offset 219-222, at +0/-4 + 0x5f, 0x08, 0x0f, + + // 'i' (0x69) 1x4, offset 222-223, at +0/-3 + 0x0f, + + // 'j' (0x6a) 2x5, offset 223-225, at +0/-3 + 0xf0, 0x03, + + // 'k' (0x6b) 4x5, offset 225-228, at +0/-4 + 0x9f, 0x18, 0x0e, + + // 'l' (0x6c) 1x5, offset 228-229, at +0/-4 + 0x1f, + + // 'm' (0x6d) 5x4, offset 229-232, at +0/-3 + 0x1f, 0x13, 0x0f, + + // 'n' (0x6e) 4x4, offset 232-234, at +0/-3 + 0x1f, 0xf1, + + // 'o' (0x6f) 4x4, offset 234-236, at +0/-3 + 0x9f, 0xf9, + + // 'p' (0x70) 4x5, offset 236-239, at +0/-3 + 0x3f, 0xa5, 0x07, + + // 'q' (0x71) 4x5, offset 239-242, at +0/-3 + 0x2f, 0xe5, 0x07, + + // 'r' (0x72) 4x4, offset 242-244, at +0/-3 + 0x1f, 0x11, + + // 's' (0x73) 4x4, offset 244-246, at +0/-3 + 0xb8, 0xea, + + // 't' (0x74) 5x5, offset 246-250, at +0/-4 + 0x42, 0x7c, 0x21, 0x00, + + // 'u' (0x75) 4x4, offset 250-252, at +0/-3 + 0x8f, 0xf8, + + // 'v' (0x76) 4x4, offset 252-254, at +0/-3 + 0x87, 0xf8, + + // 'w' (0x77) 5x4, offset 254-257, at +0/-3 + 0x8f, 0x8c, 0x0f, + + // 'x' (0x78) 4x4, offset 257-259, at +0/-3 + 0x69, 0x96, + + // 'y' (0x79) 4x5, offset 259-262, at +0/-3 + 0x0f, 0xa1, 0x0f, + + // 'z' (0x7a) 4x4, offset 262-264, at +0/-3 + 0xae, 0x8b, + + // '{' (0x7b) 3x5, offset 264-266, at +0/-4 + 0xc4, 0x45, + + // '|' (0x7c) 1x5, offset 266-267, at +0/-4 + 0x1f, + + // '}' (0x7d) 3x5, offset 267-269, at +0/-4 + 0xd1, 0x11, + + // '~' (0x7e) 5x3, offset 269-271, at +0/-3 + 0x96, 0x34, +}; + +const uint8_t Org01_RM[] = { + + // ' ' (0x20) 0x0, offset 0-0, at +0/+1 + + // '!' (0x21) 1x5, offset 0-1, at +0/-4 + 0xe8, + + // '"' (0x22) 3x1, offset 1-2, at +0/-4 + 0xa0, + + // '#' (0x23) 5x5, offset 2-6, at +0/-4 + 0x57, 0xd5, 0xf5, 0x00, + + // '$' (0x24) 5x5, offset 6-10, at +0/-4 + 0xfd, 0x3e, 0x5f, 0x80, + + // '%' (0x25) 5x5, offset 10-14, at +0/-4 + 0x88, 0x88, 0x88, 0x80, + + // '&' (0x26) 5x5, offset 14-18, at +0/-4 + 0xf4, 0xbf, 0x2e, 0x80, + + // ''' (0x27) 1x1, offset 18-19, at +0/-4 + 0x80, + + // '(' (0x28) 2x5, offset 19-21, at +0/-4 + 0x6a, 0x40, + + // ')' (0x29) 2x5, offset 21-23, at +0/-4 + 0x95, 0x80, + + // '*' (0x2a) 3x3, offset 23-25, at +0/-3 + 0xaa, 0x80, + + // '+' (0x2b) 3x3, offset 25-27, at +0/-3 + 0x5d, 0x00, + + // ',' (0x2c) 1x2, offset 27-28, at +0/+0 + 0xc0, + + // '-' (0x2d) 4x1, offset 28-29, at +0/-2 + 0xf0, + + // '.' (0x2e) 1x1, offset 29-30, at +0/+0 + 0x80, + + // '/' (0x2f) 5x5, offset 30-34, at +0/-4 + 0x08, 0x88, 0x88, 0x00, + + // '0' (0x30) 5x5, offset 34-38, at +0/-4 + 0xfc, 0x63, 0x1f, 0x80, + + // '1' (0x31) 1x5, offset 38-39, at +0/-4 + 0xf8, + + // '2' (0x32) 5x5, offset 39-43, at +0/-4 + 0xf8, 0x7f, 0x0f, 0x80, + + // '3' (0x33) 5x5, offset 43-47, at +0/-4 + 0xf8, 0x7e, 0x1f, 0x80, + + // '4' (0x34) 5x5, offset 47-51, at +0/-4 + 0x8c, 0x7e, 0x10, 0x80, + + // '5' (0x35) 5x5, offset 51-55, at +0/-4 + 0xfc, 0x3e, 0x1f, 0x80, + + // '6' (0x36) 5x5, offset 55-59, at +0/-4 + 0xfc, 0x3f, 0x1f, 0x80, + + // '7' (0x37) 5x5, offset 59-63, at +0/-4 + 0xf8, 0x42, 0x10, 0x80, + + // '8' (0x38) 5x5, offset 63-67, at +0/-4 + 0xfc, 0x7f, 0x1f, 0x80, + + // '9' (0x39) 5x5, offset 67-71, at +0/-4 + 0xfc, 0x7e, 0x1f, 0x80, + + // ':' (0x3a) 1x4, offset 71-72, at +0/-3 + 0x90, + + // ';' (0x3b) 1x4, offset 72-73, at +0/-3 + 0xb0, + + // '<' (0x3c) 3x5, offset 73-75, at +0/-4 + 0x2a, 0x22, + + // '=' (0x3d) 4x3, offset 75-77, at +0/-3 + 0xf0, 0xf0, + + // '>' (0x3e) 3x5, offset 77-79, at +0/-4 + 0x88, 0xa8, + + // '?' (0x3f) 5x5, offset 79-83, at +0/-4 + 0xf8, 0x4e, 0x02, 0x00, + + // '@' (0x40) 5x5, offset 83-87, at +0/-4 + 0xfd, 0x6f, 0x0f, 0x80, + + // 'A' (0x41) 5x5, offset 87-91, at +0/-4 + 0xfc, 0x7f, 0x18, 0x80, + + // 'B' (0x42) 5x5, offset 91-95, at +0/-4 + 0xf4, 0x7d, 0x1f, 0x00, + + // 'C' (0x43) 5x5, offset 95-99, at +0/-4 + 0xfc, 0x21, 0x0f, 0x80, + + // 'D' (0x44) 5x5, offset 99-103, at +0/-4 + 0xf4, 0x63, 0x1f, 0x00, + + // 'E' (0x45) 5x5, offset 103-107, at +0/-4 + 0xfc, 0x3f, 0x0f, 0x80, + + // 'F' (0x46) 5x5, offset 107-111, at +0/-4 + 0xfc, 0x3f, 0x08, 0x00, + + // 'G' (0x47) 5x5, offset 111-115, at +0/-4 + 0xfc, 0x2f, 0x1f, 0x80, + + // 'H' (0x48) 5x5, offset 115-119, at +0/-4 + 0x8c, 0x7f, 0x18, 0x80, + + // 'I' (0x49) 5x5, offset 119-123, at +0/-4 + 0xf9, 0x08, 0x4f, 0x80, + + // 'J' (0x4a) 5x5, offset 123-127, at +0/-4 + 0x78, 0x85, 0x2f, 0x80, + + // 'K' (0x4b) 5x5, offset 127-131, at +0/-4 + 0x8d, 0xb1, 0x68, 0x80, + + // 'L' (0x4c) 5x5, offset 131-135, at +0/-4 + 0x84, 0x21, 0x0f, 0x80, + + // 'M' (0x4d) 5x5, offset 135-139, at +0/-4 + 0xfd, 0x6b, 0x5a, 0x80, + + // 'N' (0x4e) 5x5, offset 139-143, at +0/-4 + 0xfc, 0x63, 0x18, 0x80, + + // 'O' (0x4f) 5x5, offset 143-147, at +0/-4 + 0xfc, 0x63, 0x1f, 0x80, + + // 'P' (0x50) 5x5, offset 147-151, at +0/-4 + 0xfc, 0x7f, 0x08, 0x00, + + // 'Q' (0x51) 5x5, offset 151-155, at +0/-4 + 0xfc, 0x63, 0x3f, 0x80, + + // 'R' (0x52) 5x5, offset 155-159, at +0/-4 + 0xfc, 0x7f, 0x29, 0x00, + + // 'S' (0x53) 5x5, offset 159-163, at +0/-4 + 0xfc, 0x3e, 0x1f, 0x80, + + // 'T' (0x54) 5x5, offset 163-167, at +0/-4 + 0xf9, 0x08, 0x42, 0x00, + + // 'U' (0x55) 5x5, offset 167-171, at +0/-4 + 0x8c, 0x63, 0x1f, 0x80, + + // 'V' (0x56) 5x5, offset 171-175, at +0/-4 + 0x8c, 0x62, 0xa2, 0x00, + + // 'W' (0x57) 5x5, offset 175-179, at +0/-4 + 0xad, 0x6b, 0x5f, 0x80, + + // 'X' (0x58) 5x5, offset 179-183, at +0/-4 + 0x8a, 0x88, 0xa8, 0x80, + + // 'Y' (0x59) 5x5, offset 183-187, at +0/-4 + 0x8c, 0x54, 0x42, 0x00, + + // 'Z' (0x5a) 5x5, offset 187-191, at +0/-4 + 0xf8, 0x7f, 0x0f, 0x80, + + // '[' (0x5b) 2x5, offset 191-193, at +0/-4 + 0xea, 0xc0, + + // '\' (0x5c) 5x5, offset 193-197, at +0/-4 + 0x82, 0x08, 0x20, 0x80, + + // ']' (0x5d) 2x5, offset 197-199, at +0/-4 + 0xd5, 0xc0, + + // '^' (0x5e) 3x2, offset 199-200, at +0/-4 + 0x54, + + // '_' (0x5f) 5x1, offset 200-201, at +0/+1 + 0xf8, + + // '`' (0x60) 1x1, offset 201-202, at +0/-4 + 0x80, + + // 'a' (0x61) 4x4, offset 202-204, at +0/-3 + 0xf1, 0xff, + + // 'b' (0x62) 4x5, offset 204-207, at +0/-4 + 0x8f, 0x99, 0xf0, + + // 'c' (0x63) 4x4, offset 207-209, at +0/-3 + 0xf8, 0x8f, + + // 'd' (0x64) 4x5, offset 209-212, at +0/-4 + 0x1f, 0x99, 0xf0, + + // 'e' (0x65) 4x4, offset 212-214, at +0/-3 + 0xff, 0x8f, + + // 'f' (0x66) 3x5, offset 214-216, at +0/-4 + 0x6b, 0xa4, + + // 'g' (0x67) 4x5, offset 216-219, at +0/-3 + 0xf9, 0x9f, 0x10, + + // 'h' (0x68) 4x5, offset 219-222, at +0/-4 + 0x8f, 0x99, 0x90, + + // 'i' (0x69) 1x4, offset 222-223, at +0/-3 + 0xf0, + + // 'j' (0x6a) 2x5, offset 223-225, at +0/-3 + 0x55, 0xc0, + + // 'k' (0x6b) 4x5, offset 225-228, at +0/-4 + 0x8a, 0xf9, 0x90, + + // 'l' (0x6c) 1x5, offset 228-229, at +0/-4 + 0xf8, + + // 'm' (0x6d) 5x4, offset 229-232, at +0/-3 + 0xfd, 0x63, 0x10, + + // 'n' (0x6e) 4x4, offset 232-234, at +0/-3 + 0xf9, 0x99, + + // 'o' (0x6f) 4x4, offset 234-236, at +0/-3 + 0xf9, 0x9f, + + // 'p' (0x70) 4x5, offset 236-239, at +0/-3 + 0xf9, 0x9f, 0x80, + + // 'q' (0x71) 4x5, offset 239-242, at +0/-3 + 0xf9, 0x9f, 0x20, + + // 'r' (0x72) 4x4, offset 242-244, at +0/-3 + 0xf8, 0x88, + + // 's' (0x73) 4x4, offset 244-246, at +0/-3 + 0x47, 0x1f, + + // 't' (0x74) 5x5, offset 246-250, at +0/-4 + 0x27, 0xc8, 0x42, 0x00, + + // 'u' (0x75) 4x4, offset 250-252, at +0/-3 + 0x99, 0x9f, + + // 'v' (0x76) 4x4, offset 252-254, at +0/-3 + 0x99, 0x97, + + // 'w' (0x77) 5x4, offset 254-257, at +0/-3 + 0x8c, 0x6b, 0xf0, + + // 'x' (0x78) 4x4, offset 257-259, at +0/-3 + 0x96, 0x69, + + // 'y' (0x79) 4x5, offset 259-262, at +0/-3 + 0x99, 0x9f, 0x10, + + // 'z' (0x7a) 4x4, offset 262-264, at +0/-3 + 0x2e, 0x8f, + + // '{' (0x7b) 3x5, offset 264-266, at +0/-4 + 0x2b, 0x22, + + // '|' (0x7c) 1x5, offset 266-267, at +0/-4 + 0xf8, + + // '}' (0x7d) 3x5, offset 267-269, at +0/-4 + 0x89, 0xa8, + + // '~' (0x7e) 5x3, offset 269-271, at +0/-3 + 0x0f, 0xe0, +}; + +const Font Fonts[] = { + { + FreeMono9_RM, + FreeMono9_BCM, + FreeMono9Glyphs, + 0x20, 0x7e, 18, + "FreeMono9" + }, + { + FreeMono12_RM, + FreeMono12_BCM, + FreeMono12Glyphs, + 0x20, 0x7e, 24, + "FreeMono12" + }, + { + FreeMono18_RM, + FreeMono18_BCM, + FreeMono18Glyphs, + 0x20, 0x7e, 35, + "FreeMono18" + }, + { + TomThumb_RM, + TomThumb_BCM, + TomThumbGlyphs, + 0x20, 0x7e, 6, + "TomThumb" + }, + { + SansLight10_RM, + SansLight10_BCM, + SansLight10Glyphs, + 0x20, 0x7d, 14, + "SansLight10" + }, + { + SansLight12_RM, + SansLight12_BCM, + SansLight12Glyphs, + 0x20, 0x7d, 17, + "SansLight12" + }, + { + SansLight14_RM, + SansLight14_BCM, + SansLight14Glyphs, + 0x20, 0x7d, 20, + "SansLight14" + }, + { + SansLight16_RM, + SansLight16_BCM, + SansLight16Glyphs, + 0x20, 0x7f, 23, + "SansLight16" + }, + { + Org01_RM, + Org01_BCM, + Org01Glyphs, + 0x20, 0x7e, 7, + "Org01" + }, +}; + +uint8_t NumFonts = sizeof(Fonts)/sizeof(Fonts[0]); diff --git a/drv/display/fonts.h b/drv/display/fonts.h index 4903975..e24a1b5 100644 --- a/drv/display/fonts.h +++ b/drv/display/fonts.h @@ -3,14 +3,9 @@ #include "font.h" -// row-major definitions (standard layout) -extern const Font FontsRM[]; -extern uint8_t NumFontsRM; +extern Font Fonts[]; +extern uint8_t NumFonts; extern const uint8_t Font6x8[]; extern const uint16_t SizeofFont6x8; -// byte-column-major definitions for SSD130x family -extern const Font FontsBCM[]; -extern uint8_t NumFontsBCM; - #endif diff --git a/drv/display/fonts_byte_column_major.c b/drv/display/fonts_byte_column_major.c deleted file mode 100644 index 9b5da1f..0000000 --- a/drv/display/fonts_byte_column_major.c +++ /dev/null @@ -1,8961 +0,0 @@ -#include -#include "font.h" -#include "glyphs.h" - -/* -#include "FreeSans9pt7b.h" -#include "FreeSans12pt7b.h" -#include "FreeMono9pt7b.h" -#include "FreeMono12pt7b.h" -#include "FreeMono18pt7b.h" -#include "FreeMono24pt7b.h" -#include "TomThumb.h" -#include "Org_01.h" -#include "opensanslight-10.h" -#include "opensanslight-12.h" -#include "opensanslight-14.h" -#include "opensanslight-16.h" -*/ - - - -static const uint8_t FreeSans9pt7b_BCM[] = { - - // ' ' (0x20) 0x0, offset 0-0, at +0/+1 - // in regular row-major format - - // '!' (0x21) 2x13, offset 0-4, at +2/-12 - 0xff, 0xf7, 0x7f, 0x02, - // in regular row-major format -// 0xff, 0xff, 0xf8, 0xc0, - - // '"' (0x22) 5x4, offset 4-7, at +1/-12 - 0x7f, 0xf0, 0x07, - // in regular row-major format -// 0xde, 0xf7, 0x20, - - // '#' (0x23) 10x12, offset 7-22, at +0/-11 - 0x00, 0x81, 0x90, 0xc8, 0xef, 0x1f, 0x0f, 0x81, - 0xf0, 0xf8, 0xf7, 0x13, 0x09, 0x81, 0x00, - // in regular row-major format -// 0x09, 0x86, 0x41, 0x91, 0xff, 0x13, 0x04, 0xc3, -// 0x20, 0xc8, 0xff, 0x89, 0x82, 0x61, 0x90, - - // '$' (0x24) 9x16, offset 22-40, at +1/-13 - 0x78, 0x0c, 0x7c, 0x3c, 0x82, 0x20, 0xff, 0xff, - 0x82, 0x20, 0x82, 0x21, 0x06, 0x31, 0x1c, 0x1f, - 0x18, 0x0e, - // in regular row-major format -// 0x10, 0x1f, 0x14, 0xda, 0x3d, 0x1e, 0x83, 0x40, -// 0x78, 0x17, 0x08, 0xf4, 0x7a, 0x35, 0x33, 0xf0, -// 0x40, 0x20, - - // '%' (0x25) 16x13, offset 40-66, at +1/-12 - 0x1e, 0xc0, 0x07, 0x8c, 0x81, 0x20, 0x30, 0x06, - 0x7d, 0x18, 0xc7, 0x00, 0x06, 0x20, 0x00, 0xe3, - 0x19, 0xfe, 0xc0, 0x0c, 0x08, 0x01, 0x33, 0xc0, - 0x03, 0x78, - // in regular row-major format -// 0x38, 0x10, 0xec, 0x20, 0xc6, 0x20, 0xc6, 0x40, -// 0xc6, 0x40, 0x6c, 0x80, 0x39, 0x00, 0x01, 0x3c, -// 0x02, 0x77, 0x02, 0x63, 0x04, 0x63, 0x04, 0x77, -// 0x08, 0x3c, - - // '&' (0x26) 11x13, offset 66-84, at +1/-12 - 0x00, 0x07, 0xf0, 0x39, 0x63, 0x2f, 0x18, 0x07, - 0xe3, 0xe1, 0xe7, 0x72, 0x70, 0x80, 0x0f, 0x30, - 0x03, 0x00, - // in regular row-major format -// 0x0e, 0x06, 0x60, 0xcc, 0x19, 0x81, 0xe0, 0x18, -// 0x0f, 0x03, 0x36, 0xc2, 0xd8, 0x73, 0x06, 0x31, -// 0xe3, 0xc4, - - // ''' (0x27) 2x4, offset 84-85, at +1/-12 - 0x7f, - // in regular row-major format -// 0xfe, - - // '(' (0x28) 4x17, offset 85-94, at +1/-12 - 0xe0, 0x07, 0xf0, 0x7f, 0x78, 0xc0, 0x1b, 0x00, - 0x0c, - // in regular row-major format -// 0x13, 0x26, 0x6c, 0xcc, 0xcc, 0xc4, 0x66, 0x23, -// 0x10, - - // ')' (0x29) 4x17, offset 94-103, at +1/-12 - 0x03, 0x80, 0x3d, 0xe0, 0xe1, 0xff, 0x00, 0x3f, - 0x00, - // in regular row-major format -// 0x8c, 0x46, 0x63, 0x33, 0x33, 0x32, 0x66, 0x4c, -// 0x80, - - // '*' (0x2a) 5x5, offset 103-107, at +1/-12 - 0x86, 0x1f, 0x6e, 0x00, - // in regular row-major format -// 0x25, 0x7e, 0xa5, 0x00, - - // '+' (0x2b) 6x8, offset 107-113, at +3/-7 - 0x08, 0x08, 0xff, 0xff, 0x08, 0x08, - // in regular row-major format -// 0x30, 0xc3, 0x3f, 0x30, 0xc3, 0x0c, - - // ',' (0x2c) 2x4, offset 113-114, at +2/+0 - 0x79, - // in regular row-major format -// 0xd6, - - // '-' (0x2d) 4x1, offset 114-115, at +1/-4 - 0x0f, - // in regular row-major format -// 0xf0, - - // '.' (0x2e) 2x1, offset 115-116, at +1/+0 - 0x03, - // in regular row-major format -// 0xc0, - - // '/' (0x2f) 5x13, offset 116-125, at +0/-12 - 0x00, 0x18, 0xe0, 0x80, 0x03, 0x0e, 0x30, 0x00, - 0x00, - // in regular row-major format -// 0x08, 0x44, 0x21, 0x10, 0x84, 0x42, 0x11, 0x08, -// 0x00, - - // '0' (0x30) 8x13, offset 125-138, at +1/-12 - 0xf8, 0xc3, 0xff, 0x0d, 0xe0, 0x00, 0x18, 0x00, - 0x07, 0xb0, 0xff, 0xc3, 0x1f, - // in regular row-major format -// 0x3c, 0x66, 0x42, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, -// 0xc3, 0xc3, 0x42, 0x66, 0x3c, - - // '1' (0x31) 4x13, offset 138-145, at +3/-12 - 0x08, 0x00, 0x01, 0xf0, 0xff, 0xff, 0x0f, - // in regular row-major format -// 0x11, 0x3f, 0x33, 0x33, 0x33, 0x33, 0x30, - - // '2' (0x32) 9x13, offset 145-160, at +1/-12 - 0x0c, 0xc0, 0x81, 0x0f, 0xc8, 0x80, 0x19, 0x18, - 0x83, 0xe1, 0x38, 0xf4, 0x83, 0x3c, 0x10, - // in regular row-major format -// 0x3e, 0x31, 0xb0, 0x78, 0x30, 0x18, 0x1c, 0x1c, -// 0x1c, 0x18, 0x18, 0x10, 0x08, 0x07, 0xf8, - - // '3' (0x33) 8x13, offset 160-173, at +1/-12 - 0x0c, 0xc6, 0xc1, 0x0d, 0xe0, 0x20, 0x18, 0x04, - 0xc7, 0xb1, 0xef, 0xe3, 0x3c, - // in regular row-major format -// 0x3c, 0x66, 0xc3, 0xc3, 0x03, 0x06, 0x1c, 0x07, -// 0x03, 0xc3, 0xc3, 0x66, 0x3c, - - // '4' (0x34) 7x13, offset 173-185, at +2/-12 - 0xc0, 0x01, 0x24, 0x60, 0x04, 0x82, 0xf0, 0xff, - 0xff, 0x3f, 0x40, 0x00, - // in regular row-major format -// 0x0c, 0x18, 0x71, 0x62, 0xc9, 0xa3, 0x46, 0xfe, -// 0x18, 0x30, 0x60, 0xc0, - - // '5' (0x35) 9x13, offset 185-200, at +1/-12 - 0x70, 0xe4, 0x8d, 0x85, 0xe1, 0x10, 0x18, 0x02, - 0x43, 0x60, 0x18, 0x0e, 0x7e, 0x80, 0x07, - // in regular row-major format -// 0x7f, 0x20, 0x10, 0x08, 0x08, 0x07, 0xf3, 0x8c, -// 0x03, 0x01, 0x80, 0xf0, 0x6c, 0x63, 0xe0, - - // '6' (0x36) 9x13, offset 200-215, at +1/-12 - 0xf8, 0xc3, 0xff, 0x19, 0xe1, 0x10, 0x18, 0x02, - 0x43, 0xe0, 0x18, 0x36, 0x7e, 0x84, 0x07, - // in regular row-major format -// 0x1e, 0x31, 0x98, 0x78, 0x0c, 0x06, 0xf3, 0x8d, -// 0x83, 0xc1, 0xe0, 0xd0, 0x6c, 0x63, 0xe0, - - // '7' (0x37) 8x13, offset 215-228, at +0/-12 - 0x01, 0x20, 0x00, 0x04, 0xe0, 0xc0, 0x1f, 0x3e, - 0x72, 0xc0, 0x03, 0x18, 0x00, - // in regular row-major format -// 0xff, 0x03, 0x02, 0x06, 0x04, 0x0c, 0x08, 0x18, -// 0x18, 0x18, 0x10, 0x30, 0x30, - - // '8' (0x38) 9x13, offset 228-243, at +1/-12 - 0x1c, 0xc7, 0xf7, 0x8d, 0xe3, 0x20, 0x18, 0x04, - 0x83, 0xe0, 0x38, 0xf6, 0x7d, 0x1c, 0x07, - // in regular row-major format -// 0x3e, 0x31, 0xb0, 0x78, 0x3c, 0x1b, 0x18, 0xf8, -// 0xc6, 0xc1, 0xe0, 0xf0, 0x6c, 0x63, 0xe0, - - // '9' (0x39) 8x13, offset 243-256, at +1/-12 - 0x3c, 0xc4, 0x8f, 0x0d, 0xe3, 0x40, 0x18, 0x08, - 0x87, 0xb0, 0xff, 0xc3, 0x1f, - // in regular row-major format -// 0x3c, 0x66, 0xc2, 0xc3, 0xc3, 0xc3, 0x67, 0x3b, -// 0x03, 0x03, 0xc2, 0x66, 0x3c, - - // ':' (0x3a) 2x10, offset 256-259, at +1/-9 - 0x01, 0x06, 0x08, - // in regular row-major format -// 0xc0, 0x00, 0x30, - - // ';' (0x3b) 3x12, offset 259-264, at +1/-8 - 0x01, 0x10, 0x90, 0x00, 0x07, - // in regular row-major format -// 0xc0, 0x00, 0x00, 0x64, 0xa0, - - // '<' (0x3c) 9x9, offset 264-275, at +1/-8 - 0x30, 0x70, 0xa0, 0x60, 0x43, 0x84, 0x98, 0x21, - 0xc1, 0x03, 0x01, - // in regular row-major format -// 0x00, 0x81, 0xc7, 0x8e, 0x0c, 0x07, 0x80, 0x70, -// 0x0e, 0x01, 0x80, - - // '=' (0x3d) 9x4, offset 275-280, at +1/-5 - 0x99, 0x99, 0x99, 0x99, 0x09, - // in regular row-major format -// 0xff, 0x80, 0x00, 0x1f, 0xf0, - - // '>' (0x3e) 9x9, offset 280-291, at +1/-8 - 0x82, 0x05, 0x19, 0x22, 0xc2, 0x04, 0x0d, 0x0a, - 0x18, 0x10, 0x00, - // in regular row-major format -// 0x00, 0x70, 0x0e, 0x01, 0xc0, 0x18, 0x38, 0x71, -// 0xc0, 0x80, 0x00, - - // '?' (0x3f) 9x13, offset 291-306, at +1/-12 - 0x0c, 0xc0, 0x01, 0x0c, 0x80, 0x80, 0x19, 0x3c, - 0x83, 0xc1, 0x18, 0xf0, 0x01, 0x1c, 0x00, - // in regular row-major format -// 0x3e, 0x31, 0xb0, 0x78, 0x30, 0x18, 0x18, 0x38, -// 0x18, 0x18, 0x0c, 0x00, 0x00, 0x01, 0x80, - - // '@' (0x40) 17x16, offset 306-340, at +1/-12 - 0xc0, 0x07, 0xf0, 0x1f, 0x38, 0x38, 0x0c, 0x60, - 0x86, 0x47, 0xe2, 0xcf, 0x61, 0x8c, 0x11, 0x88, - 0x11, 0x88, 0x11, 0x84, 0xe1, 0x8f, 0xf3, 0xc9, - 0x32, 0x08, 0x06, 0x0c, 0x1c, 0x06, 0xf8, 0x07, - 0xf0, 0x01, - // in regular row-major format -// 0x03, 0xf0, 0x06, 0x0e, 0x06, 0x01, 0x86, 0x00, -// 0x66, 0x1d, 0xbb, 0x31, 0xcf, 0x18, 0xc7, 0x98, -// 0x63, 0xcc, 0x31, 0xe6, 0x11, 0xb3, 0x99, 0xcc, -// 0xf7, 0x86, 0x00, 0x01, 0x80, 0x00, 0x70, 0x40, -// 0x0f, 0xe0, - - // 'A' (0x41) 12x13, offset 340-360, at +0/-12 - 0x00, 0x10, 0x80, 0x03, 0x3e, 0xf8, 0xe0, 0x13, - 0x0e, 0xc2, 0x41, 0xf0, 0x09, 0xf0, 0x01, 0xf0, - 0x01, 0x70, 0x00, 0x08, - // in regular row-major format -// 0x06, 0x00, 0xf0, 0x0f, 0x00, 0x90, 0x19, 0x81, -// 0x98, 0x10, 0x83, 0x0c, 0x3f, 0xc2, 0x04, 0x60, -// 0x66, 0x06, 0xc0, 0x30, - - // 'B' (0x42) 11x13, offset 360-378, at +1/-12 - 0xff, 0xff, 0xff, 0x07, 0xc1, 0x20, 0x18, 0x04, - 0x83, 0x60, 0x10, 0x1c, 0x83, 0xbe, 0x98, 0xf3, - 0x01, 0x1c, - // in regular row-major format -// 0xff, 0x18, 0x33, 0x03, 0x60, 0x6c, 0x0d, 0x83, -// 0x3f, 0xc6, 0x06, 0xc0, 0x78, 0x0f, 0x01, 0xe0, -// 0x6f, 0xf8, - - // 'C' (0x43) 11x13, offset 378-396, at +1/-12 - 0xf0, 0x81, 0xff, 0x18, 0xb0, 0x01, 0x1c, 0x00, - 0x03, 0x60, 0x00, 0x0c, 0x80, 0x03, 0xcc, 0xe1, - 0x31, 0x0c, - // in regular row-major format -// 0x1f, 0x86, 0x19, 0x81, 0xa0, 0x3c, 0x01, 0x80, -// 0x30, 0x06, 0x00, 0xc0, 0x68, 0x0d, 0x83, 0x18, -// 0x61, 0xf0, - - // 'D' (0x44) 11x13, offset 396-414, at +1/-12 - 0xff, 0xff, 0xff, 0x07, 0xc0, 0x00, 0x18, 0x00, - 0x03, 0x60, 0x00, 0x1c, 0xc0, 0x06, 0x8c, 0xff, - 0xe0, 0x0f, - // in regular row-major format -// 0xff, 0x18, 0x33, 0x03, 0x60, 0x3c, 0x07, 0x80, -// 0xf0, 0x1e, 0x03, 0xc0, 0x78, 0x0f, 0x03, 0x60, -// 0xcf, 0xf0, - - // 'E' (0x45) 9x13, offset 414-429, at +1/-12 - 0xff, 0xff, 0xff, 0x07, 0xc1, 0x20, 0x18, 0x04, - 0x83, 0x60, 0x10, 0x0c, 0x82, 0x01, 0x10, - // in regular row-major format -// 0xff, 0xe0, 0x30, 0x18, 0x0c, 0x06, 0x03, 0xfd, -// 0x80, 0xc0, 0x60, 0x30, 0x18, 0x0f, 0xf8, - - // 'F' (0x46) 8x13, offset 429-442, at +1/-12 - 0xff, 0xff, 0xff, 0x07, 0x81, 0x20, 0x10, 0x04, - 0x82, 0x40, 0x10, 0x08, 0x00, - // in regular row-major format -// 0xff, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xfe, 0xc0, -// 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, - - // 'G' (0x47) 12x13, offset 442-462, at +1/-12 - 0xf0, 0x81, 0xff, 0x38, 0x38, 0x01, 0x14, 0x00, - 0x03, 0x60, 0x00, 0x0c, 0x82, 0x43, 0xc8, 0x88, - 0x39, 0x3f, 0xe4, 0x0f, - // in regular row-major format -// 0x0f, 0x83, 0x0e, 0x60, 0x66, 0x03, 0xc0, 0x0c, -// 0x00, 0xc1, 0xfc, 0x03, 0xc0, 0x36, 0x03, 0x60, -// 0x73, 0x0f, 0x0f, 0x10, - - // 'H' (0x48) 11x13, offset 462-480, at +1/-12 - 0xff, 0xff, 0xff, 0x03, 0x01, 0x20, 0x00, 0x04, - 0x80, 0x00, 0x10, 0x00, 0x02, 0x40, 0xe0, 0xff, - 0xff, 0x7f, - // in regular row-major format -// 0xc0, 0x78, 0x0f, 0x01, 0xe0, 0x3c, 0x07, 0x80, -// 0xff, 0xfe, 0x03, 0xc0, 0x78, 0x0f, 0x01, 0xe0, -// 0x3c, 0x06, - - // 'I' (0x49) 2x13, offset 480-484, at +2/-12 - 0xff, 0xff, 0xff, 0x03, - // in regular row-major format -// 0xff, 0xff, 0xff, 0xc0, - - // 'J' (0x4a) 7x13, offset 484-496, at +1/-12 - 0x00, 0x0e, 0xc0, 0x03, 0x40, 0x00, 0x08, 0x00, - 0xff, 0xdf, 0xff, 0x01, - // in regular row-major format -// 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc1, 0x83, 0x07, -// 0x8f, 0x1e, 0x27, 0x80, - - // 'K' (0x4b) 11x13, offset 496-514, at +1/-12 - 0xff, 0xff, 0xff, 0x03, 0x03, 0x30, 0x00, 0x07, - 0xf0, 0x01, 0xe3, 0x30, 0x38, 0x03, 0x3c, 0x00, - 0x03, 0x00, - // in regular row-major format -// 0xc0, 0xd8, 0x33, 0x0c, 0x63, 0x0c, 0xc1, 0xb8, -// 0x3f, 0x07, 0x30, 0xc3, 0x18, 0x63, 0x06, 0x60, -// 0x6c, 0x0c, - - // 'L' (0x4c) 8x13, offset 514-527, at +1/-12 - 0xff, 0xff, 0xff, 0x03, 0x40, 0x00, 0x08, 0x00, - 0x01, 0x20, 0x00, 0x04, 0x80, - // in regular row-major format -// 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -// 0xc0, 0xc0, 0xc0, 0xc0, 0xff, - - // 'M' (0x4d) 13x13, offset 527-549, at +1/-12 - 0xff, 0xff, 0xff, 0x3f, 0x00, 0x3e, 0x00, 0x3e, - 0x00, 0x3e, 0x00, 0x06, 0xf8, 0xe0, 0x83, 0x0f, - 0x3c, 0x80, 0xff, 0xff, 0xff, 0x01, - // in regular row-major format -// 0xe0, 0x3f, 0x01, 0xfc, 0x1f, 0xe0, 0xfd, 0x05, -// 0xec, 0x6f, 0x63, 0x79, 0x13, 0xcd, 0x9e, 0x6c, -// 0xf1, 0x47, 0x8e, 0x3c, 0x71, 0x80, - - // 'N' (0x4e) 11x13, offset 549-567, at +1/-12 - 0xff, 0xff, 0xff, 0x1f, 0x00, 0x0e, 0x00, 0x03, - 0xc0, 0x01, 0xe0, 0x00, 0x38, 0x00, 0xfc, 0xff, - 0xff, 0x7f, - // in regular row-major format -// 0xe0, 0x7c, 0x0f, 0xc1, 0xe8, 0x3d, 0x87, 0x98, -// 0xf1, 0x1e, 0x33, 0xc3, 0x78, 0x6f, 0x07, 0xe0, -// 0x7c, 0x0e, - - // 'O' (0x4f) 13x13, offset 567-589, at +1/-12 - 0xf0, 0x81, 0xff, 0x38, 0x38, 0x01, 0x14, 0x00, - 0x03, 0x60, 0x00, 0x0c, 0x80, 0x01, 0x50, 0x00, - 0x39, 0x38, 0xfe, 0x03, 0x1f, 0x00, - // in regular row-major format -// 0x0f, 0x81, 0x83, 0x18, 0x0c, 0xc0, 0x6c, 0x01, -// 0xe0, 0x0f, 0x00, 0x78, 0x03, 0xc0, 0x1b, 0x01, -// 0x98, 0x0c, 0x60, 0xc0, 0xf8, 0x00, - - // 'P' (0x50) 10x13, offset 589-606, at +1/-12 - 0xff, 0xff, 0xff, 0x07, 0x81, 0x20, 0x10, 0x04, - 0x82, 0x40, 0x10, 0x18, 0x03, 0x3e, 0x80, 0x03, - 0x00, - // in regular row-major format -// 0xff, 0x30, 0x6c, 0x0f, 0x03, 0xc0, 0xf0, 0x6f, -// 0xf3, 0x00, 0xc0, 0x30, 0x0c, 0x03, 0x00, 0xc0, -// 0x00, - - // 'Q' (0x51) 13x14, offset 606-629, at +1/-12 - 0xf0, 0x01, 0xff, 0xe1, 0xe0, 0x08, 0x20, 0x01, - 0x50, 0x00, 0x14, 0x00, 0x05, 0x50, 0x01, 0x94, - 0x00, 0xe2, 0xe0, 0xf1, 0xdf, 0xf0, 0x01, - // in regular row-major format -// 0x0f, 0x81, 0x83, 0x18, 0x0c, 0xc0, 0x6c, 0x01, -// 0xe0, 0x0f, 0x00, 0x78, 0x03, 0xc0, 0x1b, 0x01, -// 0x98, 0x6c, 0x60, 0xc0, 0xfb, 0x00, 0x08, - - // 'R' (0x52) 12x13, offset 629-649, at +1/-12 - 0xff, 0xff, 0xff, 0x07, 0x81, 0x20, 0x10, 0x04, - 0x82, 0x40, 0x10, 0x08, 0x02, 0xe3, 0xc0, 0xf7, - 0x7b, 0x7e, 0x00, 0x08, - // in regular row-major format -// 0xff, 0x8c, 0x0e, 0xc0, 0x6c, 0x06, 0xc0, 0x6c, -// 0x0c, 0xff, 0x8c, 0x0e, 0xc0, 0x6c, 0x06, 0xc0, -// 0x6c, 0x06, 0xc0, 0x70, - - // 'S' (0x53) 10x13, offset 649-666, at +1/-12 - 0x1c, 0xc6, 0xc7, 0x8d, 0xe0, 0x30, 0x18, 0x06, - 0x83, 0x60, 0x30, 0x1c, 0xc6, 0x8e, 0x8f, 0xe1, - 0x00, - // in regular row-major format -// 0x3f, 0x18, 0x6c, 0x0f, 0x03, 0xc0, 0x1e, 0x01, -// 0xf0, 0x0e, 0x00, 0xf0, 0x3c, 0x0d, 0x86, 0x3f, -// 0x00, - - // 'T' (0x54) 9x13, offset 666-681, at +1/-12 - 0x01, 0x20, 0x00, 0x04, 0x80, 0x00, 0xf0, 0xff, - 0xff, 0x7f, 0x00, 0x08, 0x00, 0x01, 0x00, - // in regular row-major format -// 0xff, 0x86, 0x03, 0x01, 0x80, 0xc0, 0x60, 0x30, -// 0x18, 0x0c, 0x06, 0x03, 0x01, 0x80, 0xc0, - - // 'U' (0x55) 11x13, offset 681-699, at +1/-12 - 0xff, 0xe7, 0xff, 0x01, 0x20, 0x00, 0x08, 0x00, - 0x01, 0x20, 0x00, 0x04, 0x80, 0x00, 0xe8, 0xff, - 0xfd, 0x1f, - // in regular row-major format -// 0xc0, 0x78, 0x0f, 0x01, 0xe0, 0x3c, 0x07, 0x80, -// 0xf0, 0x1e, 0x03, 0xc0, 0x78, 0x0f, 0x01, 0xb0, -// 0x61, 0xf0, - - // 'V' (0x56) 11x13, offset 699-717, at +0/-12 - 0x01, 0xe0, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, - 0x00, 0x38, 0x80, 0x07, 0x3e, 0xf8, 0xe0, 0x03, - 0x0c, 0x00, - // in regular row-major format -// 0xc0, 0x6c, 0x0d, 0x81, 0x10, 0x63, 0x0c, 0x61, -// 0x04, 0x60, 0xcc, 0x19, 0x01, 0x60, 0x3c, 0x07, -// 0x00, 0x60, - - // 'W' (0x57) 17x13, offset 717-745, at +0/-12 - 0x01, 0xe0, 0x03, 0xf8, 0x03, 0xe0, 0x07, 0xc0, - 0x01, 0x0f, 0x3c, 0x78, 0x00, 0x07, 0xc0, 0x07, - 0xc0, 0x0f, 0x80, 0x0f, 0xc0, 0xc1, 0x9f, 0x3f, - 0x78, 0x00, 0x00, 0x00, - // in regular row-major format -// 0xc1, 0x81, 0x30, 0xe1, 0x98, 0x70, 0xcc, 0x28, -// 0x66, 0x26, 0x21, 0x13, 0x30, 0xc8, 0x98, 0x6c, -// 0x4c, 0x14, 0x34, 0x0a, 0x1a, 0x07, 0x07, 0x03, -// 0x03, 0x80, 0x81, 0x80, - - // 'X' (0x58) 12x13, offset 745-765, at +0/-12 - 0x00, 0x20, 0x00, 0x1f, 0x70, 0x87, 0x83, 0x3b, - 0xe0, 0x01, 0x3c, 0xc0, 0x1c, 0x0e, 0xee, 0x80, - 0x07, 0x60, 0x00, 0x00, - // in regular row-major format -// 0x60, 0x63, 0x0c, 0x30, 0xc1, 0x98, 0x0f, 0x00, -// 0xe0, 0x06, 0x00, 0xf0, 0x19, 0x01, 0x98, 0x30, -// 0xc6, 0x0e, 0x60, 0x60, - - // 'Y' (0x59) 12x13, offset 765-785, at +0/-12 - 0x01, 0x60, 0x00, 0x38, 0x00, 0x1e, 0x00, 0x07, - 0xc0, 0x3f, 0xf0, 0x87, 0x03, 0x3c, 0xc0, 0x01, - 0x0c, 0x80, 0x00, 0x00, - // in regular row-major format -// 0xc0, 0x36, 0x06, 0x30, 0xc3, 0x0c, 0x19, 0x81, -// 0xd8, 0x0f, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, -// 0x00, 0x60, 0x06, 0x00, - - // 'Z' (0x5a) 10x13, offset 785-802, at +1/-12 - 0x01, 0x38, 0xc0, 0x07, 0xdc, 0xe0, 0x18, 0x0e, - 0xe3, 0x60, 0x07, 0x7c, 0x80, 0x03, 0x30, 0x00, - 0x02, - // in regular row-major format -// 0xff, 0xc0, 0x60, 0x30, 0x0c, 0x06, 0x03, 0x01, -// 0xc0, 0x60, 0x30, 0x18, 0x06, 0x03, 0x00, 0xff, -// 0xc0, - - // '[' (0x5b) 3x17, offset 802-809, at +1/-12 - 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x04, - // in regular row-major format -// 0xfb, 0x6d, 0xb6, 0xdb, 0x6d, 0xb6, 0xe0, - - // '\' (0x5c) 5x13, offset 809-818, at +0/-12 - 0x03, 0x80, 0x03, 0x80, 0x03, 0x80, 0x03, 0x80, - 0x01, - // in regular row-major format -// 0x84, 0x10, 0x84, 0x10, 0x84, 0x10, 0x84, 0x10, -// 0x80, - - // ']' (0x5d) 3x17, offset 818-825, at +0/-12 - 0x01, 0x00, 0xff, 0xff, 0xff, 0xff, 0x07, - // in regular row-major format -// 0xed, 0xb6, 0xdb, 0x6d, 0xb6, 0xdb, 0xe0, - - // '^' (0x5e) 7x7, offset 825-832, at +1/-12 - 0x60, 0xdc, 0x61, 0xc0, 0x81, 0x03, 0x01, - // in regular row-major format -// 0x30, 0x60, 0xa2, 0x44, 0xd8, 0xa1, 0x80, - - // '_' (0x5f) 10x1, offset 832-834, at +0/+3 - 0xff, 0x03, - // in regular row-major format -// 0xff, 0xc0, - - // '`' (0x60) 4x3, offset 834-836, at +0/-12 - 0x99, 0x09, - // in regular row-major format -// 0xc6, 0x30, - - // 'a' (0x61) 9x10, offset 836-848, at +1/-9 - 0xc6, 0x9d, 0x3f, 0x62, 0x88, 0x31, 0x46, 0xf4, - 0xbf, 0xff, 0x00, 0x02, - // in regular row-major format -// 0x7e, 0x71, 0xb0, 0xc0, 0x60, 0xf3, 0xdb, 0x0d, -// 0x86, 0xc7, 0x3d, 0xc0, - - // 'b' (0x62) 9x13, offset 848-863, at +1/-12 - 0xff, 0xff, 0xff, 0x43, 0x20, 0x04, 0x88, 0x00, - 0x11, 0x20, 0x06, 0x86, 0x7f, 0xe0, 0x07, - // in regular row-major format -// 0xc0, 0x60, 0x30, 0x1b, 0xce, 0x36, 0x0f, 0x07, -// 0x83, 0xc1, 0xe0, 0xf0, 0x7c, 0x6d, 0xe0, - - // 'c' (0x63) 8x10, offset 863-873, at +1/-9 - 0xfc, 0xf8, 0x37, 0x70, 0x80, 0x01, 0x0e, 0x6c, - 0x18, 0x21, - // in regular row-major format -// 0x3c, 0x66, 0xc3, 0xc0, 0xc0, 0xc0, 0xc0, 0xc3, -// 0x66, 0x3c, - - // 'd' (0x64) 8x13, offset 873-886, at +1/-12 - 0xe0, 0x07, 0xfe, 0x61, 0x60, 0x04, 0x88, 0x00, - 0x21, 0xd0, 0xff, 0xff, 0xff, - // in regular row-major format -// 0x03, 0x03, 0x03, 0x3b, 0x67, 0xc3, 0xc3, 0xc3, -// 0xc3, 0xc3, 0xc3, 0x67, 0x3b, - - // 'e' (0x65) 8x10, offset 886-896, at +1/-9 - 0xfc, 0xf8, 0x37, 0x71, 0x84, 0x11, 0x4e, 0xec, - 0x19, 0x27, - // in regular row-major format -// 0x3c, 0x66, 0xc3, 0xc3, 0xff, 0xc0, 0xc0, 0xc3, -// 0x66, 0x3c, - - // 'f' (0x66) 4x13, offset 896-903, at +1/-12 - 0x08, 0xc0, 0xff, 0xff, 0xff, 0x04, 0x00, - // in regular row-major format -// 0x36, 0x6f, 0x66, 0x66, 0x66, 0x66, 0x60, - - // 'g' (0x67) 8x14, offset 903-917, at +1/-9 - 0xfc, 0x90, 0x7f, 0x3c, 0x30, 0x06, 0x88, 0x01, - 0xa2, 0x40, 0xfc, 0xff, 0xfd, 0x3f, - // in regular row-major format -// 0x3b, 0x67, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, -// 0x67, 0x3b, 0x03, 0x03, 0xc6, 0x7c, - - // 'h' (0x68) 8x13, offset 917-930, at +1/-12 - 0xff, 0xff, 0xff, 0x43, 0x00, 0x04, 0x80, 0x00, - 0x10, 0x00, 0xfe, 0x87, 0xff, - // in regular row-major format -// 0xc0, 0xc0, 0xc0, 0xde, 0xe3, 0xc3, 0xc3, 0xc3, -// 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, - - // 'i' (0x69) 2x13, offset 930-934, at +1/-12 - 0xf9, 0x3f, 0xff, 0x03, - // in regular row-major format -// 0xc3, 0xff, 0xff, 0xc0, - - // 'j' (0x6a) 4x17, offset 934-943, at +0/-12 - 0x00, 0x00, 0x01, 0x00, 0xe6, 0xff, 0xcf, 0xff, - 0x07, - // in regular row-major format -// 0x30, 0x03, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, -// 0xe0, - - // 'k' (0x6b) 9x13, offset 943-958, at +1/-12 - 0xff, 0xff, 0xff, 0x03, 0x06, 0x60, 0x00, 0x1e, - 0x60, 0x0e, 0x02, 0x07, 0xc0, 0x00, 0x00, - // in regular row-major format -// 0xc0, 0x60, 0x30, 0x18, 0x4c, 0x46, 0x63, 0x61, -// 0xf0, 0xec, 0x62, 0x31, 0x98, 0x6c, 0x30, - - // 'l' (0x6c) 2x13, offset 958-962, at +1/-12 - 0xff, 0xff, 0xff, 0x03, - // in regular row-major format -// 0xff, 0xff, 0xff, 0xc0, - - // 'm' (0x6d) 13x10, offset 962-979, at +1/-9 - 0xff, 0xff, 0x2f, 0x40, 0x00, 0x01, 0x04, 0xf0, - 0xbf, 0xff, 0x03, 0x04, 0x10, 0xc0, 0xff, 0xfe, - 0x03, - // in regular row-major format -// 0xde, 0xf7, 0x1c, 0xf0, 0xc7, 0x86, 0x3c, 0x31, -// 0xe1, 0x8f, 0x0c, 0x78, 0x63, 0xc3, 0x1e, 0x18, -// 0xc0, - - // 'n' (0x6e) 8x10, offset 979-989, at +1/-9 - 0xff, 0xff, 0x2f, 0x40, 0x00, 0x01, 0x04, 0xf0, - 0xbf, 0xff, - // in regular row-major format -// 0xde, 0xe3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, -// 0xc3, 0xc3, - - // 'o' (0x6f) 8x10, offset 989-999, at +1/-9 - 0xfc, 0xf8, 0x37, 0x70, 0x80, 0x01, 0x0e, 0xec, - 0x1f, 0x3f, - // in regular row-major format -// 0x3c, 0x66, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, -// 0x66, 0x3c, - - // 'p' (0x70) 9x13, offset 999-1014, at +1/-9 - 0xff, 0xff, 0xff, 0x0b, 0x84, 0x00, 0x11, 0x20, - 0x02, 0xc4, 0xc0, 0xf0, 0x0f, 0xfc, 0x00, - // in regular row-major format -// 0xde, 0x71, 0xb0, 0x78, 0x3c, 0x1e, 0x0f, 0x07, -// 0x83, 0xe3, 0x6f, 0x30, 0x18, 0x0c, 0x00, - - // 'q' (0x71) 8x13, offset 1014-1027, at +1/-9 - 0xfc, 0xc0, 0x3f, 0x0c, 0x8c, 0x00, 0x11, 0x20, - 0x04, 0xc2, 0xff, 0xff, 0xff, - // in regular row-major format -// 0x3b, 0x67, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, -// 0x67, 0x3b, 0x03, 0x03, 0x03, - - // 'r' (0x72) 5x10, offset 1027-1034, at +1/-9 - 0xff, 0xff, 0x2f, 0x40, 0x00, 0x01, 0x00, - // in regular row-major format -// 0xdf, 0x31, 0x8c, 0x63, 0x18, 0xc6, 0x00, - - // 's' (0x73) 8x10, offset 1034-1044, at +1/-9 - 0x9e, 0x79, 0x3e, 0x73, 0x88, 0x21, 0x86, 0x39, - 0xbc, 0x70, - // in regular row-major format -// 0x3e, 0xe3, 0xc0, 0xc0, 0xe0, 0x3c, 0x07, 0xc3, -// 0xe3, 0x7e, - - // 't' (0x74) 4x12, offset 1044-1050, at +1/-11 - 0x04, 0xf0, 0xff, 0xff, 0x4f, 0x80, - // in regular row-major format -// 0x66, 0xf6, 0x66, 0x66, 0x66, 0x67, - - // 'u' (0x75) 8x10, offset 1050-1060, at +1/-9 - 0xff, 0xfd, 0x0f, 0x20, 0x80, 0x00, 0x02, 0xf4, - 0xff, 0xff, - // in regular row-major format -// 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, -// 0xc7, 0x7b, - - // 'v' (0x76) 9x10, offset 1060-1072, at +0/-9 - 0x01, 0x3c, 0xc0, 0x07, 0xf8, 0x00, 0x83, 0xc7, - 0xc3, 0x01, 0x01, 0x00, - // in regular row-major format -// 0xc1, 0xa0, 0x98, 0xcc, 0x42, 0x21, 0xb0, 0xd0, -// 0x28, 0x1c, 0x0c, 0x00, - - // 'w' (0x77) 13x10, offset 1072-1089, at +0/-9 - 0x03, 0x7c, 0x80, 0x1f, 0xe0, 0xf0, 0xff, 0x70, - 0x80, 0x1f, 0xe0, 0x03, 0x8e, 0xcf, 0x07, 0x01, - 0x00, - // in regular row-major format -// 0xc6, 0x1e, 0x38, 0x91, 0xc4, 0xca, 0x66, 0xd3, -// 0x16, 0xd0, 0xa6, 0x87, 0x1c, 0x38, 0xc0, 0xc6, -// 0x00, - - // 'x' (0x78) 8x10, offset 1089-1099, at +0/-9 - 0x00, 0x0c, 0x6c, 0x1c, 0x1f, 0x78, 0xb0, 0x73, - 0x78, 0x80, - // in regular row-major format -// 0x43, 0x62, 0x36, 0x1c, 0x18, 0x1c, 0x3c, 0x26, -// 0x62, 0x43, - - // 'y' (0x79) 9x14, offset 1099-1115, at +0/-9 - 0x01, 0xc0, 0x03, 0xc8, 0x07, 0x82, 0x7f, 0x80, - 0x0f, 0x7c, 0xe0, 0x03, 0x1c, 0x00, 0x00, 0x00, - // in regular row-major format -// 0xc1, 0x21, 0x98, 0xcc, 0x42, 0x61, 0xb0, 0xd0, -// 0x38, 0x1c, 0x0c, 0x06, 0x03, 0x01, 0x03, 0x00, - - // 'z' (0x7a) 7x10, offset 1115-1124, at +1/-9 - 0x01, 0x07, 0x1f, 0x66, 0x8e, 0x1d, 0x1e, 0x38, - 0x20, - // in regular row-major format -// 0xfe, 0x0c, 0x30, 0xc1, 0x86, 0x18, 0x20, 0xc1, -// 0xfc, - - // '{' (0x7b) 4x17, offset 1124-1133, at +1/-12 - 0x80, 0x03, 0xfc, 0xff, 0xfd, 0xfb, 0x0f, 0x00, - 0x08, - // in regular row-major format -// 0x36, 0x66, 0x66, 0x6e, 0xce, 0x66, 0x66, 0x66, -// 0x30, - - // '|' (0x7c) 2x17, offset 1133-1138, at +2/-12 - 0xff, 0xff, 0xff, 0xff, 0x03, - // in regular row-major format -// 0xff, 0xff, 0xff, 0xff, 0xc0, - - // '}' (0x7d) 4x17, offset 1138-1147, at +1/-12 - 0x01, 0x00, 0xff, 0xfd, 0xfb, 0xff, 0x03, 0x1c, - 0x00, - // in regular row-major format -// 0xc6, 0x66, 0x66, 0x67, 0x37, 0x66, 0x66, 0x66, -// 0xc0, -}; - -static const uint8_t FreeSans12pt7b_BCM[] = { - - // ' ' (0x20) 0x0, offset 0-0, at +0/+1 - // in regular row-major format - - // '!' (0x21) 2x18, offset 0-5, at +3/-17 - 0xff, 0x3f, 0xff, 0xff, 0x0c, - // in regular row-major format -// 0xff, 0xff, 0xff, 0xf0, 0xf0, - - // '"' (0x22) 6x6, offset 5-10, at +1/-16 - 0xff, 0x03, 0x00, 0xff, 0x03, - // in regular row-major format -// 0xcf, 0x3c, 0xf3, 0x8a, 0x20, - - // '#' (0x23) 13x16, offset 10-36, at +0/-15 - 0x00, 0x06, 0x30, 0x06, 0x30, 0xe6, 0xb0, 0xff, - 0xfc, 0x0f, 0x7f, 0x06, 0x33, 0x06, 0x30, 0xf6, - 0xb0, 0xff, 0xfc, 0x07, 0x3f, 0x06, 0x31, 0x06, - 0x30, 0x00, - // in regular row-major format -// 0x06, 0x30, 0x31, 0x03, 0x18, 0x18, 0xc7, 0xff, -// 0xbf, 0xfc, 0x31, 0x03, 0x18, 0x18, 0xc7, 0xff, -// 0xbf, 0xfc, 0x31, 0x01, 0x18, 0x18, 0xc0, 0xc6, -// 0x06, 0x30, - - // '$' (0x24) 11x20, offset 36-64, at +1/-17 - 0xf8, 0x70, 0xc0, 0x1f, 0x1f, 0x8c, 0x81, 0x61, - 0x30, 0x30, 0x06, 0x03, 0xf3, 0xff, 0xff, 0x06, - 0x03, 0x63, 0x60, 0x30, 0x0c, 0x86, 0xc1, 0xc3, - 0x1f, 0x30, 0x78, 0x00, - // in regular row-major format -// 0x04, 0x03, 0xe1, 0xff, 0x72, 0x6c, 0x47, 0x88, -// 0xf1, 0x07, 0x20, 0x7e, 0x03, 0xf0, 0x17, 0x02, -// 0x3c, 0x47, 0x88, 0xf1, 0x1b, 0x26, 0x7f, 0xc3, -// 0xe0, 0x10, 0x02, 0x00, - - // '%' (0x25) 20x17, offset 64-107, at +1/-16 - 0x78, 0x00, 0xf8, 0x01, 0x38, 0x07, 0x30, 0x0c, - 0x60, 0x18, 0xc0, 0x39, 0x30, 0x3f, 0x18, 0x3c, - 0x1c, 0x00, 0x0e, 0x00, 0x07, 0x00, 0x03, 0x80, - 0xc3, 0xc3, 0xc1, 0xef, 0xc0, 0x79, 0x80, 0x61, - 0x00, 0xc3, 0x00, 0x86, 0x01, 0x9c, 0x03, 0xf0, - 0x03, 0xc0, 0x03, - // in regular row-major format -// 0x00, 0x06, 0x03, 0xc0, 0x40, 0x7e, 0x0c, 0x0e, -// 0x70, 0x80, 0xc3, 0x18, 0x0c, 0x31, 0x00, 0xe7, -// 0x30, 0x07, 0xe6, 0x00, 0x3c, 0x40, 0x00, 0x0c, -// 0x7c, 0x00, 0x8f, 0xe0, 0x19, 0xc7, 0x01, 0x18, -// 0x30, 0x31, 0x83, 0x02, 0x1c, 0x70, 0x40, 0xfe, -// 0x04, 0x07, 0xc0, - - // '&' (0x26) 14x17, offset 107-137, at +1/-16 - 0x00, 0x7c, 0x00, 0xfc, 0xf1, 0x1c, 0xf3, 0x1b, - 0x7c, 0x1e, 0x78, 0x38, 0xf0, 0xf0, 0xe0, 0x33, - 0x67, 0x7e, 0xfc, 0x78, 0xf0, 0x00, 0xe0, 0x01, - 0xf0, 0x0f, 0x60, 0x1c, 0x00, 0x20, - // in regular row-major format -// 0x0f, 0x00, 0x7e, 0x03, 0x9c, 0x0c, 0x30, 0x30, -// 0xc0, 0xe7, 0x01, 0xf8, 0x03, 0x80, 0x3e, 0x01, -// 0xcc, 0x6e, 0x19, 0xb0, 0x7c, 0xc0, 0xf3, 0x03, -// 0xce, 0x1f, 0x9f, 0xe6, 0x1e, 0x1c, - - // ''' (0x27) 2x6, offset 137-139, at +1/-16 - 0xff, 0x03, - // in regular row-major format -// 0xff, 0xa0, - - // '(' (0x28) 5x23, offset 139-154, at +2/-17 - 0x80, 0x7f, 0x00, 0xf8, 0xff, 0x01, 0x1f, 0xc0, - 0xc3, 0x01, 0x00, 0x17, 0x00, 0x00, 0x06, - // in regular row-major format -// 0x08, 0x8c, 0x66, 0x31, 0x98, 0xc6, 0x31, 0x8c, -// 0x63, 0x08, 0x63, 0x08, 0x61, 0x0c, 0x20, - - // ')' (0x29) 5x23, offset 154-169, at +1/-17 - 0x01, 0x00, 0x60, 0x07, 0x00, 0x1c, 0x1f, 0xc0, - 0x03, 0xfe, 0x7f, 0x00, 0xf8, 0x07, 0x00, - // in regular row-major format -// 0x82, 0x18, 0xc3, 0x18, 0xc3, 0x18, 0xc6, 0x31, -// 0x8c, 0x62, 0x31, 0x88, 0xc4, 0x62, 0x00, - - // '*' (0x2a) 7x7, offset 169-176, at +1/-17 - 0x04, 0x36, 0xee, 0x83, 0x63, 0x13, 0x00, - // in regular row-major format -// 0x10, 0x23, 0x5b, 0xe3, 0x8d, 0x91, 0x00, - - // '+' (0x2b) 10x11, offset 176-190, at +2/-10 - 0x30, 0x80, 0x01, 0x0c, 0x60, 0xf0, 0xff, 0xff, - 0xc3, 0x00, 0x06, 0x30, 0x80, 0x01, - // in regular row-major format -// 0x0c, 0x03, 0x00, 0xc0, 0x30, 0xff, 0xff, 0xf0, -// 0xc0, 0x30, 0x0c, 0x03, 0x00, 0xc0, - - // ',' (0x2c) 2x6, offset 190-192, at +2/-1 - 0xe3, 0x07, - // in regular row-major format -// 0xf5, 0x60, - - // '-' (0x2d) 6x2, offset 192-194, at +1/-7 - 0xff, 0x0f, - // in regular row-major format -// 0xff, 0xf0, - - // '.' (0x2e) 2x2, offset 194-195, at +2/-1 - 0x0f, - // in regular row-major format -// 0xf0, - - // '/' (0x2f) 7x18, offset 195-211, at +0/-17 - 0x00, 0x00, 0x03, 0x80, 0x07, 0xc0, 0x03, 0xe0, - 0x01, 0xf0, 0x00, 0x78, 0x00, 0x30, 0x00, 0x00, - // in regular row-major format -// 0x02, 0x0c, 0x10, 0x20, 0xc1, 0x02, 0x0c, 0x10, -// 0x20, 0xc1, 0x02, 0x0c, 0x10, 0x20, 0xc1, 0x00, - - // '0' (0x30) 11x17, offset 211-235, at +1/-16 - 0xf0, 0x1f, 0xf8, 0xff, 0x78, 0x80, 0x3b, 0x00, - 0x3e, 0x00, 0x78, 0x00, 0xf0, 0x00, 0xe0, 0x03, - 0xe0, 0x1e, 0xf0, 0xf8, 0xff, 0xc0, 0x7f, 0x00, - // in regular row-major format -// 0x1f, 0x07, 0xf1, 0xc7, 0x30, 0x6e, 0x0f, 0x80, -// 0xf0, 0x1e, 0x03, 0xc0, 0x78, 0x0f, 0x01, 0xe0, -// 0x3c, 0x0e, 0xc1, 0x9c, 0x71, 0xfc, 0x1f, 0x00, - - // '1' (0x31) 5x17, offset 235-246, at +3/-16 - 0x18, 0x00, 0x30, 0x00, 0x70, 0x00, 0xf0, 0xff, - 0xff, 0xff, 0x1f, - // in regular row-major format -// 0x08, 0xcf, 0xff, 0x8c, 0x63, 0x18, 0xc6, 0x31, -// 0x8c, 0x63, 0x18, - - // '2' (0x32) 11x17, offset 246-270, at +1/-16 - 0x18, 0xc0, 0x3d, 0xe0, 0x1b, 0x60, 0x1e, 0x60, - 0x3c, 0xc0, 0x78, 0xc0, 0xf0, 0x80, 0xe1, 0x83, - 0xc1, 0x8e, 0x83, 0xfd, 0x03, 0xe3, 0x03, 0x06, - // in regular row-major format -// 0x1f, 0x0f, 0xf9, 0x87, 0x60, 0x7c, 0x06, 0x00, -// 0xc0, 0x18, 0x07, 0x01, 0xc0, 0xf0, 0x78, 0x1c, -// 0x06, 0x00, 0x80, 0x30, 0x07, 0xff, 0xff, 0xe0, - - // '3' (0x33) 11x17, offset 270-294, at +1/-16 - 0x1c, 0x30, 0x3c, 0xe0, 0x1d, 0x00, 0x1b, 0x00, - 0x3c, 0x18, 0x78, 0x30, 0xf0, 0x60, 0xe0, 0xe3, - 0xe0, 0xfe, 0xc3, 0xf8, 0xfc, 0x00, 0xf0, 0x00, - // in regular row-major format -// 0x3f, 0x0f, 0xf3, 0x87, 0x60, 0x6c, 0x0c, 0x01, -// 0x80, 0x70, 0x7c, 0x0f, 0x80, 0x18, 0x01, 0x80, -// 0x3c, 0x07, 0x80, 0xd8, 0x73, 0xfc, 0x1f, 0x00, - - // '4' (0x34) 11x17, offset 294-318, at +1/-16 - 0x00, 0x1c, 0x00, 0x3c, 0x00, 0x6e, 0x00, 0xc6, - 0x00, 0x87, 0x01, 0x07, 0x83, 0x03, 0x86, 0xff, - 0xff, 0xff, 0xff, 0x01, 0x30, 0x00, 0x60, 0x00, - // in regular row-major format -// 0x01, 0x80, 0x70, 0x0e, 0x03, 0xc0, 0xd8, 0x1b, -// 0x06, 0x61, 0x8c, 0x21, 0x8c, 0x33, 0x06, 0x7f, -// 0xff, 0xfe, 0x03, 0x00, 0x60, 0x0c, 0x01, 0x80, - - // '5' (0x35) 11x17, offset 318-342, at +1/-16 - 0x80, 0x60, 0xfc, 0xc1, 0xfd, 0x03, 0x1b, 0x02, - 0x3c, 0x06, 0x78, 0x0c, 0xf0, 0x18, 0xe0, 0x71, - 0xe0, 0xc3, 0xe1, 0x06, 0xff, 0x00, 0xfc, 0x00, - // in regular row-major format -// 0x3f, 0xcf, 0xf9, 0x80, 0x30, 0x06, 0x00, 0xde, -// 0x1f, 0xe7, 0x0e, 0x00, 0xe0, 0x0c, 0x01, 0x80, -// 0x30, 0x07, 0x81, 0xf8, 0x73, 0xfc, 0x1f, 0x00, - - // '6' (0x36) 11x17, offset 342-366, at +1/-16 - 0xe0, 0x1f, 0xf8, 0xff, 0x38, 0x8e, 0x33, 0x0c, - 0x3e, 0x0c, 0x78, 0x18, 0xf0, 0x30, 0xe0, 0x61, - 0xe0, 0x8e, 0xe3, 0x1c, 0xff, 0x20, 0xf8, 0x00, - // in regular row-major format -// 0x0f, 0x07, 0xf9, 0xc3, 0x30, 0x74, 0x01, 0x80, -// 0x33, 0xc7, 0xfe, 0xf0, 0xdc, 0x1f, 0x01, 0xe0, -// 0x3c, 0x06, 0xc1, 0xdc, 0x71, 0xfc, 0x1f, 0x00, - - // '7' (0x37) 11x17, offset 366-390, at +1/-16 - 0x03, 0x00, 0x06, 0x00, 0x0c, 0x00, 0x1e, 0x80, - 0x3f, 0xe0, 0x67, 0xf0, 0xc0, 0x70, 0x80, 0x39, - 0x00, 0x1b, 0x00, 0x1e, 0x00, 0x0c, 0x00, 0x00, - // in regular row-major format -// 0xff, 0xff, 0xfc, 0x01, 0x00, 0x60, 0x18, 0x02, -// 0x00, 0xc0, 0x30, 0x06, 0x01, 0x80, 0x30, 0x04, -// 0x01, 0x80, 0x30, 0x06, 0x01, 0x80, 0x30, 0x00, - - // '8' (0x38) 11x17, offset 390-414, at +1/-16 - 0x00, 0x3c, 0x78, 0xfc, 0xf8, 0x0f, 0x3b, 0x1e, - 0x3c, 0x18, 0x78, 0x30, 0xf0, 0x60, 0xe0, 0xe3, - 0xc1, 0xfe, 0xc3, 0x78, 0xfc, 0x00, 0xf0, 0x00, - // in regular row-major format -// 0x1f, 0x07, 0xf1, 0xc7, 0x30, 0x66, 0x0c, 0xc1, -// 0x8c, 0x61, 0xfc, 0x3f, 0x8e, 0x3b, 0x01, 0xe0, -// 0x3c, 0x07, 0x80, 0xd8, 0x31, 0xfc, 0x1f, 0x00, - - // '9' (0x39) 11x17, offset 414-438, at +1/-16 - 0xf8, 0x20, 0xf8, 0xc7, 0x39, 0x0c, 0x3b, 0x30, - 0x3c, 0x60, 0x78, 0xc0, 0xf0, 0x80, 0xe1, 0x83, - 0x61, 0x8e, 0xe3, 0xf8, 0xff, 0xc0, 0x3f, 0x00, - // in regular row-major format -// 0x1f, 0x07, 0xf1, 0xc7, 0x70, 0x6c, 0x07, 0x80, -// 0xf0, 0x1e, 0x07, 0x61, 0xef, 0xfc, 0x79, 0x80, -// 0x30, 0x05, 0x81, 0x98, 0x73, 0xfc, 0x1e, 0x00, - - // ':' (0x3a) 2x13, offset 438-442, at +2/-12 - 0x03, 0x78, 0x00, 0x03, - // in regular row-major format -// 0xf0, 0x00, 0x03, 0xc0, - - // ';' (0x3b) 2x16, offset 442-446, at +2/-11 - 0x03, 0x8c, 0x03, 0x7c, - // in regular row-major format -// 0xf0, 0x00, 0x0f, 0x56, - - // '<' (0x3c) 12x12, offset 446-464, at +1/-11 - 0x60, 0x00, 0x0e, 0xf0, 0x00, 0x0b, 0x98, 0x81, - 0x19, 0x08, 0xc3, 0x30, 0x0c, 0x66, 0x60, 0x06, - 0x24, 0xc0, - // in regular row-major format -// 0x00, 0x00, 0x07, 0x01, 0xe0, 0xf8, 0x3c, 0x0f, -// 0x00, 0xe0, 0x07, 0xc0, 0x0f, 0x00, 0x3c, 0x00, -// 0xf0, 0x01, - - // '=' (0x3d) 12x6, offset 464-473, at +1/-8 - 0xf3, 0x3c, 0xcf, 0xf3, 0x3c, 0xcf, 0xf3, 0x3c, - 0xcf, - // in regular row-major format -// 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, -// 0xff, - - // '>' (0x3e) 12x12, offset 473-491, at +1/-11 - 0x02, 0x6c, 0x40, 0x06, 0xc6, 0x60, 0x0c, 0x83, - 0x31, 0x18, 0x81, 0x19, 0xb0, 0x00, 0x0f, 0xe0, - 0x00, 0x06, - // in regular row-major format -// 0x00, 0x0e, 0x00, 0x78, 0x01, 0xf0, 0x07, 0xc0, -// 0x0f, 0x00, 0x70, 0x1e, 0x0f, 0x03, 0xc0, 0xf0, -// 0x08, 0x00, - - // '?' (0x3f) 10x18, offset 491-514, at +2/-17 - 0x1c, 0x00, 0x78, 0x00, 0x60, 0x00, 0xc0, 0x00, - 0x00, 0x03, 0x3c, 0x0f, 0xf8, 0x3c, 0x70, 0xc0, - 0xe1, 0x00, 0xfe, 0x01, 0xe0, 0x01, 0x00, - // in regular row-major format -// 0x1f, 0x1f, 0xee, 0x1b, 0x03, 0xc0, 0xc0, 0x30, -// 0x0c, 0x06, 0x03, 0x81, 0xc0, 0xe0, 0x30, 0x0c, -// 0x03, 0x00, 0x00, 0x00, 0x0c, 0x03, 0x00, - - // '@' (0x40) 22x21, offset 514-572, at +1/-17 - 0x00, 0x7f, 0x00, 0xf8, 0x3f, 0xc0, 0x03, 0x0f, - 0x1c, 0x80, 0xc3, 0x01, 0x60, 0x18, 0xfc, 0x98, - 0xc1, 0x3f, 0x33, 0x1c, 0xce, 0xc3, 0x80, 0x79, - 0x0c, 0x30, 0x8f, 0x01, 0xe6, 0x31, 0x60, 0x3c, - 0x06, 0x86, 0x87, 0xff, 0xf3, 0xe1, 0x7f, 0x32, - 0x1e, 0x4c, 0x4e, 0x80, 0x81, 0x01, 0x38, 0x70, - 0x80, 0x03, 0x3c, 0x38, 0x00, 0xfe, 0x03, 0x80, - 0x1f, 0x00, - // in regular row-major format -// 0x00, 0xfe, 0x00, 0x0f, 0xfe, 0x00, 0xf0, 0x3e, -// 0x07, 0x00, 0x3c, 0x38, 0x00, 0x30, 0xc1, 0xe0, -// 0x66, 0x0f, 0xd9, 0xd8, 0x61, 0xc3, 0xc3, 0x07, -// 0x0f, 0x1c, 0x1c, 0x3c, 0x60, 0x60, 0xf1, 0x81, -// 0x83, 0xc6, 0x06, 0x1b, 0x18, 0x38, 0xee, 0x71, -// 0xe7, 0x18, 0xfd, 0xf8, 0x71, 0xe7, 0xc0, 0xe0, -// 0x00, 0x01, 0xe0, 0x00, 0x01, 0xff, 0xc0, 0x01, -// 0xfc, 0x00, - - // 'A' (0x41) 16x18, offset 572-608, at +0/-17 - 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x3f, 0x80, - 0x3f, 0xc0, 0x1f, 0xe0, 0x6f, 0xf0, 0x87, 0xc1, - 0x03, 0x06, 0x0f, 0x18, 0xfc, 0x61, 0x80, 0xbf, - 0x01, 0xf0, 0x0f, 0x00, 0xfe, 0x00, 0xc0, 0x0f, - 0x00, 0x38, 0x00, 0x00, - // in regular row-major format -// 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0x07, 0xe0, -// 0x06, 0x60, 0x06, 0x60, 0x0e, 0x70, 0x0c, 0x30, -// 0x0c, 0x30, 0x1c, 0x38, 0x18, 0x18, 0x1f, 0xf8, -// 0x3f, 0xfc, 0x30, 0x1c, 0x30, 0x0c, 0x70, 0x0e, -// 0x60, 0x06, 0x60, 0x06, - - // 'B' (0x42) 13x18, offset 608-638, at +2/-17 - 0xff, 0xff, 0xff, 0xff, 0x3f, 0x30, 0xf0, 0xc0, - 0xc0, 0x03, 0x03, 0x0f, 0x0c, 0x3c, 0x30, 0xf0, - 0xc0, 0xc0, 0x03, 0x03, 0x1f, 0x0e, 0xec, 0x6f, - 0x18, 0x1e, 0x7f, 0x00, 0x78, 0x00, - // in regular row-major format -// 0xff, 0xc7, 0xff, 0x30, 0x19, 0x80, 0x6c, 0x03, -// 0x60, 0x1b, 0x00, 0xd8, 0x0c, 0xff, 0xc7, 0xff, -// 0x30, 0x0d, 0x80, 0x3c, 0x01, 0xe0, 0x0f, 0x00, -// 0x78, 0x06, 0xff, 0xf7, 0xfe, 0x00, - - // 'C' (0x43) 15x18, offset 638-672, at +1/-17 - 0xc0, 0x0f, 0xe0, 0xff, 0xc1, 0x03, 0x8f, 0x03, - 0x70, 0x06, 0x80, 0x0d, 0x00, 0x3e, 0x00, 0xf0, - 0x00, 0xc0, 0x03, 0x00, 0x0f, 0x00, 0x3c, 0x00, - 0xb0, 0x01, 0x60, 0x0e, 0xc0, 0x71, 0xc0, 0x03, - 0x01, 0x03, - // in regular row-major format -// 0x07, 0xe0, 0x3f, 0xf0, 0xe0, 0x73, 0x80, 0x66, -// 0x00, 0x6c, 0x00, 0x30, 0x00, 0x60, 0x00, 0xc0, -// 0x01, 0x80, 0x03, 0x00, 0x06, 0x00, 0x06, 0x00, -// 0x6c, 0x00, 0xdc, 0x03, 0x1e, 0x0e, 0x1f, 0xf8, -// 0x0f, 0xc0, - - // 'D' (0x44) 14x18, offset 672-704, at +2/-17 - 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0xf0, 0x00, - 0xc0, 0x03, 0x00, 0x0f, 0x00, 0x3c, 0x00, 0xf0, - 0x00, 0xc0, 0x03, 0x00, 0x1b, 0x00, 0xee, 0x00, - 0x1c, 0x0f, 0x3c, 0xf8, 0x7f, 0x80, 0x7f, 0x00, - // in regular row-major format -// 0xff, 0x83, 0xff, 0x8c, 0x07, 0x30, 0x0e, 0xc0, -// 0x1b, 0x00, 0x7c, 0x00, 0xf0, 0x03, 0xc0, 0x0f, -// 0x00, 0x3c, 0x00, 0xf0, 0x03, 0xc0, 0x1f, 0x00, -// 0x6c, 0x03, 0xb0, 0x1c, 0xff, 0xe3, 0xff, 0x00, - - // 'E' (0x45) 12x18, offset 704-731, at +2/-17 - 0xff, 0xff, 0xff, 0xff, 0x3f, 0x30, 0xf0, 0xc0, - 0xc0, 0x03, 0x03, 0x0f, 0x0c, 0x3c, 0x30, 0xf0, - 0xc0, 0xc0, 0x03, 0x03, 0x0f, 0x0c, 0x3c, 0x30, - 0xf0, 0x00, 0xc0, - // in regular row-major format -// 0xff, 0xff, 0xff, 0xc0, 0x0c, 0x00, 0xc0, 0x0c, -// 0x00, 0xc0, 0x0c, 0x00, 0xff, 0xef, 0xfe, 0xc0, -// 0x0c, 0x00, 0xc0, 0x0c, 0x00, 0xc0, 0x0c, 0x00, -// 0xff, 0xff, 0xff, - - // 'F' (0x46) 11x18, offset 731-756, at +2/-17 - 0xff, 0xff, 0xff, 0xff, 0x3f, 0x30, 0xc0, 0xc0, - 0x00, 0x03, 0x03, 0x0c, 0x0c, 0x30, 0x30, 0xc0, - 0xc0, 0x00, 0x03, 0x03, 0x0c, 0x0c, 0x30, 0x00, - 0x00, - // in regular row-major format -// 0xff, 0xff, 0xff, 0x00, 0x60, 0x0c, 0x01, 0x80, -// 0x30, 0x06, 0x00, 0xff, 0xdf, 0xfb, 0x00, 0x60, -// 0x0c, 0x01, 0x80, 0x30, 0x06, 0x00, 0xc0, 0x18, -// 0x00, - - // 'G' (0x47) 16x18, offset 756-792, at +1/-17 - 0xe0, 0x0f, 0xe0, 0xff, 0xc0, 0x03, 0x8f, 0x03, - 0x70, 0x06, 0x80, 0x1d, 0x00, 0x3e, 0x00, 0xf0, - 0x00, 0xc0, 0x03, 0x00, 0x0f, 0x0c, 0x3c, 0x30, - 0xf0, 0xc1, 0x60, 0x06, 0xc3, 0x39, 0x8c, 0xc3, - 0xf1, 0x1f, 0xc4, 0xff, - // in regular row-major format -// 0x07, 0xf0, 0x1f, 0xfc, 0x3c, 0x1e, 0x70, 0x06, -// 0x60, 0x03, 0xe0, 0x00, 0xc0, 0x00, 0xc0, 0x00, -// 0xc0, 0x7f, 0xc0, 0x7f, 0xc0, 0x03, 0xc0, 0x03, -// 0x60, 0x03, 0x60, 0x07, 0x30, 0x0f, 0x3c, 0x1f, -// 0x1f, 0xfb, 0x07, 0xe1, - - // 'H' (0x48) 13x18, offset 792-822, at +2/-17 - 0xff, 0xff, 0xff, 0xff, 0x0f, 0x30, 0x00, 0xc0, - 0x00, 0x00, 0x03, 0x00, 0x0c, 0x00, 0x30, 0x00, - 0xc0, 0x00, 0x00, 0x03, 0x00, 0x0c, 0x00, 0x30, - 0xc0, 0xff, 0xff, 0xff, 0xff, 0x03, - // in regular row-major format -// 0xc0, 0x1e, 0x00, 0xf0, 0x07, 0x80, 0x3c, 0x01, -// 0xe0, 0x0f, 0x00, 0x78, 0x03, 0xff, 0xff, 0xff, -// 0xf0, 0x07, 0x80, 0x3c, 0x01, 0xe0, 0x0f, 0x00, -// 0x78, 0x03, 0xc0, 0x1e, 0x00, 0xc0, - - // 'I' (0x49) 2x18, offset 822-827, at +2/-17 - 0xff, 0xff, 0xff, 0xff, 0x0f, - // in regular row-major format -// 0xff, 0xff, 0xff, 0xff, 0xf0, - - // 'J' (0x4a) 9x18, offset 827-848, at +1/-17 - 0x00, 0xf0, 0x00, 0xc0, 0x07, 0x00, 0x38, 0x00, - 0xc0, 0x00, 0x00, 0x03, 0x00, 0x0c, 0x00, 0xf8, - 0xff, 0x7f, 0xff, 0xff, 0x00, - // in regular row-major format -// 0x01, 0x80, 0xc0, 0x60, 0x30, 0x18, 0x0c, 0x06, -// 0x03, 0x01, 0x80, 0xc0, 0x60, 0x3c, 0x1e, 0x0f, -// 0x07, 0xc7, 0x7f, 0x1f, 0x00, - - // 'K' (0x4b) 14x18, offset 848-880, at +2/-17 - 0xff, 0xff, 0xff, 0xff, 0x0f, 0x60, 0x00, 0xc0, - 0x00, 0xc0, 0x01, 0x80, 0x0f, 0x00, 0x7f, 0x00, - 0x8e, 0x07, 0x1c, 0x3c, 0x38, 0xc0, 0x73, 0x00, - 0xde, 0x00, 0xe0, 0x01, 0x00, 0x03, 0x00, 0x00, - // in regular row-major format -// 0xc0, 0x3b, 0x01, 0xcc, 0x0e, 0x30, 0x70, 0xc3, -// 0x83, 0x1c, 0x0c, 0xe0, 0x33, 0x80, 0xde, 0x03, -// 0xdc, 0x0e, 0x38, 0x30, 0x60, 0xc1, 0xc3, 0x03, -// 0x8c, 0x06, 0x30, 0x1c, 0xc0, 0x3b, 0x00, 0x60, - - // 'L' (0x4c) 10x18, offset 880-903, at +2/-17 - 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x30, 0x00, - 0xc0, 0x00, 0x00, 0x03, 0x00, 0x0c, 0x00, 0x30, - 0x00, 0xc0, 0x00, 0x00, 0x03, 0x00, 0x0c, - // in regular row-major format -// 0xc0, 0x30, 0x0c, 0x03, 0x00, 0xc0, 0x30, 0x0c, -// 0x03, 0x00, 0xc0, 0x30, 0x0c, 0x03, 0x00, 0xc0, -// 0x30, 0x0c, 0x03, 0x00, 0xff, 0xff, 0xf0, - - // 'M' (0x4d) 16x18, offset 903-939, at +2/-17 - 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x3f, - 0x00, 0xe0, 0x07, 0x00, 0xfc, 0x00, 0x80, 0x1f, - 0x00, 0xf0, 0x00, 0xc0, 0x03, 0xe0, 0x07, 0xf0, - 0x03, 0xf8, 0x01, 0xfc, 0x00, 0x7c, 0x00, 0xf0, - 0xff, 0xff, 0xff, 0xff, - // in regular row-major format -// 0xe0, 0x07, 0xe0, 0x07, 0xf0, 0x0f, 0xf0, 0x0f, -// 0xd0, 0x0f, 0xd8, 0x1b, 0xd8, 0x1b, 0xd8, 0x1b, -// 0xcc, 0x33, 0xcc, 0x33, 0xcc, 0x33, 0xc6, 0x63, -// 0xc6, 0x63, 0xc6, 0x63, 0xc3, 0xc3, 0xc3, 0xc3, -// 0xc3, 0xc3, 0xc1, 0x83, - - // 'N' (0x4e) 13x18, offset 939-969, at +2/-17 - 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x0f, - 0x00, 0xf0, 0x00, 0x80, 0x07, 0x00, 0x78, 0x00, - 0x80, 0x07, 0x00, 0x3c, 0x00, 0xc0, 0x03, 0x00, - 0xfc, 0xff, 0xff, 0xff, 0xff, 0x03, - // in regular row-major format -// 0xe0, 0x1f, 0x00, 0xfc, 0x07, 0xe0, 0x3d, 0x81, -// 0xee, 0x0f, 0x30, 0x79, 0xc3, 0xc6, 0x1e, 0x18, -// 0xf0, 0xe7, 0x83, 0x3c, 0x1d, 0xe0, 0x6f, 0x01, -// 0xf8, 0x0f, 0xc0, 0x3e, 0x01, 0xc0, - - // 'O' (0x4f) 17x18, offset 969-1008, at +1/-17 - 0xc0, 0x0f, 0xc0, 0xff, 0xc0, 0x03, 0x8f, 0x03, - 0x70, 0x06, 0x80, 0x19, 0x00, 0x3e, 0x00, 0xf0, - 0x00, 0xc0, 0x03, 0x00, 0x0f, 0x00, 0x3c, 0x00, - 0xb0, 0x01, 0xe0, 0x06, 0x80, 0x31, 0x00, 0xc7, - 0x03, 0x0f, 0xfc, 0x0f, 0xc0, 0x0f, 0x00, - // in regular row-major format -// 0x03, 0xe0, 0x0f, 0xfc, 0x0f, 0x07, 0x86, 0x00, -// 0xc6, 0x00, 0x33, 0x00, 0x1b, 0x00, 0x07, 0x80, -// 0x03, 0xc0, 0x01, 0xe0, 0x00, 0xf0, 0x00, 0x78, -// 0x00, 0x36, 0x00, 0x33, 0x00, 0x18, 0xc0, 0x18, -// 0x78, 0x3c, 0x1f, 0xfc, 0x03, 0xf8, 0x00, - - // 'P' (0x50) 12x18, offset 1008-1035, at +2/-17 - 0xff, 0xff, 0xff, 0xff, 0x3f, 0x30, 0xc0, 0xc0, - 0x00, 0x03, 0x03, 0x0c, 0x0c, 0x30, 0x30, 0xc0, - 0xc0, 0x00, 0x03, 0x03, 0x18, 0x0e, 0xe0, 0x1f, - 0x00, 0x3e, 0x00, - // in regular row-major format -// 0xff, 0x8f, 0xfe, 0xc0, 0x6c, 0x03, 0xc0, 0x3c, -// 0x03, 0xc0, 0x3c, 0x07, 0xff, 0xef, 0xfc, 0xc0, -// 0x0c, 0x00, 0xc0, 0x0c, 0x00, 0xc0, 0x0c, 0x00, -// 0xc0, 0x0c, 0x00, - - // 'Q' (0x51) 17x19, offset 1035-1076, at +1/-17 - 0xc0, 0x0f, 0x80, 0xff, 0x01, 0x0f, 0x3c, 0x1c, - 0x80, 0x63, 0x00, 0x18, 0x03, 0xc0, 0x0d, 0x00, - 0x6c, 0x00, 0x60, 0x03, 0x00, 0x1b, 0x00, 0xd8, - 0x00, 0xd8, 0x0c, 0xc0, 0x67, 0x00, 0x1c, 0x06, - 0xe0, 0xf0, 0xc0, 0x0f, 0xfe, 0xef, 0xc0, 0x0f, - 0x00, - // in regular row-major format -// 0x03, 0xe0, 0x0f, 0xfc, 0x0f, 0x07, 0x86, 0x00, -// 0xc6, 0x00, 0x33, 0x00, 0x1b, 0x00, 0x07, 0x80, -// 0x03, 0xc0, 0x01, 0xe0, 0x00, 0xf0, 0x00, 0x78, -// 0x00, 0x36, 0x00, 0x33, 0x01, 0x98, 0xc0, 0xfc, -// 0x78, 0x3c, 0x1f, 0xff, 0x03, 0xf9, 0x80, 0x00, -// 0x40, - - // 'R' (0x52) 14x18, offset 1076-1108, at +2/-17 - 0xff, 0xff, 0xff, 0xff, 0x3f, 0x30, 0xc0, 0xc0, - 0x00, 0x03, 0x03, 0x0c, 0x0c, 0x30, 0x30, 0xc0, - 0xc0, 0x00, 0x03, 0x03, 0x0c, 0x0c, 0x60, 0x78, - 0x80, 0xbf, 0xff, 0x7c, 0xfc, 0x03, 0x00, 0x08, - // in regular row-major format -// 0xff, 0xc3, 0xff, 0xcc, 0x03, 0xb0, 0x06, 0xc0, -// 0x1b, 0x00, 0x6c, 0x01, 0xb0, 0x0c, 0xff, 0xe3, -// 0xff, 0xcc, 0x03, 0xb0, 0x06, 0xc0, 0x1b, 0x00, -// 0x6c, 0x01, 0xb0, 0x06, 0xc0, 0x1b, 0x00, 0x70, - - // 'S' (0x53) 14x18, offset 1108-1140, at +1/-17 - 0x00, 0x70, 0xe0, 0xc3, 0xc3, 0x1f, 0x9c, 0x63, - 0x60, 0x87, 0x83, 0x0f, 0x0c, 0x3c, 0x30, 0xf0, - 0xc0, 0xc0, 0x03, 0x07, 0x0f, 0x18, 0x7c, 0x60, - 0xb8, 0x83, 0x63, 0x1c, 0xfc, 0x60, 0xe0, 0x01, - // in regular row-major format -// 0x0f, 0xe0, 0x7f, 0xc3, 0x83, 0x9c, 0x07, 0x60, -// 0x0d, 0x80, 0x06, 0x00, 0x1e, 0x00, 0x3f, 0x80, -// 0x3f, 0xc0, 0x0f, 0x80, 0x07, 0xc0, 0x0f, 0x00, -// 0x3e, 0x00, 0xde, 0x0e, 0x3f, 0xf0, 0x3f, 0x80, - - // 'T' (0x54) 12x18, offset 1140-1167, at +1/-17 - 0x03, 0x00, 0x0c, 0x00, 0x30, 0x00, 0xc0, 0x00, - 0x00, 0x03, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, - 0x00, 0x00, 0x03, 0x00, 0x0c, 0x00, 0x30, 0x00, - 0xc0, 0x00, 0x00, - // in regular row-major format -// 0xff, 0xff, 0xff, 0x06, 0x00, 0x60, 0x06, 0x00, -// 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, -// 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, -// 0x06, 0x00, 0x60, - - // 'U' (0x55) 13x18, offset 1167-1197, at +2/-17 - 0xff, 0x7f, 0xfc, 0xff, 0x03, 0x00, 0x1c, 0x00, - 0x60, 0x00, 0x00, 0x03, 0x00, 0x0c, 0x00, 0x30, - 0x00, 0xc0, 0x00, 0x00, 0x03, 0x00, 0x06, 0x00, - 0xdc, 0xff, 0x3f, 0xff, 0x7f, 0x00, - // in regular row-major format -// 0xc0, 0x1e, 0x00, 0xf0, 0x07, 0x80, 0x3c, 0x01, -// 0xe0, 0x0f, 0x00, 0x78, 0x03, 0xc0, 0x1e, 0x00, -// 0xf0, 0x07, 0x80, 0x3c, 0x01, 0xe0, 0x0f, 0x80, -// 0xee, 0x0e, 0x3f, 0xe0, 0x7c, 0x00, - - // 'V' (0x56) 15x18, offset 1197-1231, at +0/-17 - 0x00, 0x00, 0x1c, 0x00, 0xf0, 0x03, 0x00, 0x7f, - 0x00, 0xe0, 0x0f, 0x00, 0xfc, 0x01, 0x80, 0x3f, - 0x00, 0xf0, 0x00, 0xe0, 0x03, 0xf0, 0x07, 0xf8, - 0x03, 0xfc, 0x01, 0xfe, 0x00, 0x7c, 0x00, 0x30, - 0x00, 0x00, - // in regular row-major format -// 0x60, 0x06, 0xc0, 0x1d, 0xc0, 0x31, 0x80, 0x63, -// 0x01, 0xc7, 0x03, 0x06, 0x06, 0x0c, 0x1c, 0x1c, -// 0x30, 0x18, 0x60, 0x31, 0xc0, 0x73, 0x00, 0x66, -// 0x00, 0xdc, 0x01, 0xf0, 0x01, 0xe0, 0x03, 0xc0, -// 0x07, 0x00, - - // 'W' (0x57) 22x18, offset 1231-1281, at +0/-17 - 0x01, 0x00, 0x7c, 0x00, 0xf0, 0x1f, 0x00, 0xfc, - 0x07, 0x00, 0xff, 0x01, 0xc0, 0x0f, 0x00, 0x3e, - 0x80, 0x7f, 0xc0, 0x1f, 0xf0, 0x0f, 0xf0, 0x03, - 0xc0, 0x07, 0x00, 0xfe, 0x00, 0xc0, 0x3f, 0x00, - 0xf0, 0x07, 0x00, 0xfe, 0x00, 0xc0, 0x03, 0xf0, - 0x0f, 0xfe, 0xc7, 0xff, 0x01, 0x7f, 0x00, 0x1c, - 0x00, 0x00, - // in regular row-major format -// 0xe0, 0x30, 0x1d, 0x80, 0xe0, 0x76, 0x07, 0x81, -// 0xd8, 0x1e, 0x06, 0x70, 0x7c, 0x18, 0xc1, 0xb0, -// 0xe3, 0x0c, 0xc3, 0x8c, 0x33, 0x0c, 0x38, 0xc6, -// 0x30, 0x67, 0x18, 0xc1, 0x98, 0x67, 0x06, 0x61, -// 0xd8, 0x1d, 0x83, 0x60, 0x3c, 0x0d, 0x80, 0xf0, -// 0x3e, 0x03, 0xc0, 0x70, 0x0f, 0x01, 0xc0, 0x18, -// 0x07, 0x00, - - // 'X' (0x58) 15x18, offset 1281-1315, at +0/-17 - 0x00, 0x00, 0x04, 0x00, 0x7c, 0x00, 0xf8, 0x03, - 0x78, 0x3c, 0xf0, 0xe0, 0xf1, 0x00, 0xfe, 0x01, - 0xf0, 0x01, 0xc0, 0x07, 0x80, 0x7b, 0x80, 0x87, - 0x87, 0x07, 0x3c, 0x0f, 0xc0, 0x0f, 0x00, 0x1e, - 0x00, 0x20, - // in regular row-major format -// 0x70, 0x0e, 0x60, 0x38, 0xe0, 0x60, 0xe1, 0xc0, -// 0xc3, 0x01, 0xcc, 0x01, 0xf8, 0x01, 0xe0, 0x03, -// 0x80, 0x07, 0x80, 0x1f, 0x00, 0x33, 0x00, 0xe7, -// 0x03, 0x86, 0x06, 0x0e, 0x1c, 0x0e, 0x70, 0x0c, -// 0xc0, 0x1c, - - // 'Y' (0x59) 16x18, offset 1315-1351, at +0/-17 - 0x00, 0x00, 0x0c, 0x00, 0xf0, 0x00, 0x80, 0x07, - 0x00, 0x78, 0x00, 0xc0, 0x03, 0x00, 0x3c, 0x00, - 0xc0, 0xff, 0x00, 0xff, 0x03, 0x0f, 0x00, 0x0f, - 0x00, 0x1f, 0x00, 0x1e, 0x00, 0x1c, 0x00, 0x30, - 0x00, 0x00, 0x00, 0x00, - // in regular row-major format -// 0x60, 0x06, 0x70, 0x0e, 0x30, 0x1c, 0x38, 0x18, -// 0x1c, 0x38, 0x0c, 0x30, 0x0e, 0x70, 0x06, 0x60, -// 0x03, 0xc0, 0x03, 0xc0, 0x01, 0x80, 0x01, 0x80, -// 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, -// 0x01, 0x80, 0x01, 0x80, - - // 'Z' (0x5a) 13x18, offset 1351-1381, at +1/-17 - 0x03, 0x80, 0x0f, 0x00, 0x3f, 0x00, 0xff, 0x00, - 0xde, 0x03, 0x1c, 0x0f, 0x3c, 0x3c, 0x78, 0xf0, - 0x70, 0xc0, 0xf3, 0x00, 0xef, 0x01, 0xfc, 0x01, - 0xf0, 0x03, 0xc0, 0x07, 0x00, 0x03, - // in regular row-major format -// 0xff, 0xff, 0xff, 0xc0, 0x0e, 0x00, 0xe0, 0x0e, -// 0x00, 0x60, 0x07, 0x00, 0x70, 0x07, 0x00, 0x30, -// 0x03, 0x80, 0x38, 0x03, 0x80, 0x18, 0x01, 0xc0, -// 0x1c, 0x00, 0xff, 0xff, 0xff, 0xc0, - - // '[' (0x5b) 4x23, offset 1381-1393, at +2/-17 - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, - 0x78, 0x00, 0x00, 0x0c, - // in regular row-major format -// 0xff, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, -// 0xcc, 0xcc, 0xcf, 0xf0, - - // '\' (0x5c) 7x18, offset 1393-1409, at +0/-17 - 0x03, 0x00, 0x78, 0x00, 0x00, 0x0f, 0x00, 0xe0, - 0x01, 0x00, 0x3c, 0x00, 0x80, 0x07, 0x00, 0x30, - // in regular row-major format -// 0x81, 0x81, 0x02, 0x06, 0x04, 0x08, 0x18, 0x10, -// 0x20, 0x60, 0x40, 0x81, 0x81, 0x02, 0x06, 0x04, - - // ']' (0x5d) 4x23, offset 1409-1421, at +1/-17 - 0x03, 0x00, 0xe0, 0x01, 0x00, 0xf0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0f, - // in regular row-major format -// 0xff, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, -// 0x33, 0x33, 0x3f, 0xf0, - - // '^' (0x5e) 9x9, offset 1421-1432, at +1/-16 - 0x00, 0x81, 0xe3, 0xf1, 0x30, 0xe0, 0x01, 0x1f, - 0xf0, 0x80, 0x01, - // in regular row-major format -// 0x0c, 0x0e, 0x05, 0x86, 0xc3, 0x21, 0x19, 0x8c, -// 0x83, 0xc1, 0x80, - - // '_' (0x5f) 15x1, offset 1432-1434, at -1/+4 - 0xff, 0x7f, - // in regular row-major format -// 0xff, 0xfe, - - // '`' (0x60) 5x4, offset 1434-1437, at +1/-17 - 0x31, 0xe7, 0x08, - // in regular row-major format -// 0xe3, 0x8c, 0x30, - - // 'a' (0x61) 12x13, offset 1437-1457, at +1/-12 - 0x8c, 0xc7, 0xf1, 0x1d, 0xf3, 0x61, 0x3c, 0x8c, - 0x87, 0xf0, 0x10, 0x3b, 0x23, 0xfe, 0x8f, 0xff, - 0x03, 0x60, 0x00, 0x0c, - // in regular row-major format -// 0x3f, 0x07, 0xf8, 0xe1, 0xcc, 0x0c, 0x00, 0xc0, -// 0x1c, 0x3f, 0xcf, 0x8c, 0xc0, 0xcc, 0x0c, 0xe3, -// 0xc7, 0xef, 0x3c, 0x70, - - // 'b' (0x62) 12x18, offset 1457-1484, at +1/-17 - 0xff, 0xff, 0xff, 0xff, 0x0f, 0x18, 0x0c, 0x30, - 0x60, 0x60, 0x00, 0x83, 0x01, 0x0c, 0x06, 0x30, - 0x18, 0xc0, 0xe0, 0x80, 0x03, 0x07, 0x07, 0xf8, - 0x0f, 0xc0, 0x0f, - // in regular row-major format -// 0xc0, 0x0c, 0x00, 0xc0, 0x0c, 0x00, 0xc0, 0x0c, -// 0xf8, 0xdf, 0xcf, 0x0e, 0xe0, 0x7c, 0x03, 0xc0, -// 0x3c, 0x03, 0xc0, 0x3c, 0x03, 0xe0, 0x6f, 0x0e, -// 0xdf, 0xcc, 0xf8, - - // 'c' (0x63) 10x13, offset 1484-1501, at +1/-12 - 0xf8, 0x83, 0xff, 0x38, 0xb8, 0x03, 0x3e, 0x80, - 0x07, 0xf0, 0x00, 0x3e, 0xe0, 0x0e, 0x0e, 0xc1, - 0x00, - // in regular row-major format -// 0x1f, 0x0f, 0xe7, 0x1b, 0x83, 0xc0, 0x30, 0x0c, -// 0x03, 0x00, 0xc0, 0x38, 0x37, 0x1c, 0xfe, 0x1f, -// 0x00, - - // 'd' (0x64) 11x18, offset 1501-1526, at +1/-17 - 0x00, 0x7f, 0x00, 0xfe, 0x03, 0x1c, 0x1c, 0x38, - 0xe0, 0x60, 0x00, 0x83, 0x01, 0x0c, 0x06, 0x30, - 0x30, 0x60, 0xc0, 0xc1, 0xfc, 0xff, 0xff, 0xff, - 0x3f, - // in regular row-major format -// 0x00, 0x60, 0x0c, 0x01, 0x80, 0x30, 0x06, 0x3c, -// 0xcf, 0xfb, 0x8f, 0xe0, 0xf8, 0x0f, 0x01, 0xe0, -// 0x3c, 0x07, 0x80, 0xf8, 0x3b, 0x8f, 0x3f, 0x63, -// 0xcc, - - // 'e' (0x65) 11x13, offset 1526-1544, at +1/-12 - 0xf8, 0x83, 0xff, 0xb8, 0xb9, 0x33, 0x3e, 0x86, - 0xc7, 0xf0, 0x18, 0x3e, 0xc3, 0x66, 0x8c, 0xcf, - 0xe1, 0x09, - // in regular row-major format -// 0x1f, 0x07, 0xf1, 0xc7, 0x70, 0x3c, 0x07, 0xff, -// 0xff, 0xfe, 0x00, 0xc0, 0x1c, 0x0d, 0xc3, 0x1f, -// 0xe1, 0xf0, - - // 'f' (0x66) 5x18, offset 1544-1556, at +1/-17 - 0x60, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x18, - 0x00, 0x63, 0x00, 0x00, - // in regular row-major format -// 0x3b, 0xd8, 0xc6, 0x7f, 0xec, 0x63, 0x18, 0xc6, -// 0x31, 0x8c, 0x63, 0x00, - - // 'g' (0x67) 11x18, offset 1556-1581, at +1/-12 - 0xf8, 0x83, 0xf0, 0x1f, 0xe6, 0xe0, 0xf0, 0x01, - 0xc7, 0x03, 0x18, 0x0f, 0x60, 0x3c, 0x80, 0xb1, - 0x01, 0xe3, 0x0e, 0xc6, 0xfd, 0xff, 0xf7, 0xff, - 0x07, - // in regular row-major format -// 0x1e, 0x67, 0xfd, 0xc7, 0xf0, 0x7c, 0x07, 0x80, -// 0xf0, 0x1e, 0x03, 0xc0, 0x7c, 0x1d, 0xc7, 0x9f, -// 0xb1, 0xe6, 0x00, 0xc0, 0x3e, 0x0e, 0x7f, 0xc7, -// 0xe0, - - // 'h' (0x68) 10x18, offset 1581-1604, at +1/-17 - 0xff, 0xff, 0xff, 0xff, 0x0f, 0x18, 0x00, 0x30, - 0x00, 0x60, 0x00, 0x80, 0x01, 0x00, 0x06, 0x00, - 0x38, 0x00, 0xc0, 0xff, 0x03, 0xfe, 0x0f, - // in regular row-major format -// 0xc0, 0x30, 0x0c, 0x03, 0x00, 0xc0, 0x33, 0xcd, -// 0xfb, 0xc7, 0xe0, 0xf0, 0x3c, 0x0f, 0x03, 0xc0, -// 0xf0, 0x3c, 0x0f, 0x03, 0xc0, 0xf0, 0x30, - - // 'i' (0x69) 2x18, offset 1604-1609, at +2/-17 - 0xe3, 0xff, 0x8f, 0xff, 0x0f, - // in regular row-major format -// 0xf0, 0x3f, 0xff, 0xff, 0xf0, - - // 'j' (0x6a) 4x23, offset 1609-1621, at +0/-17 - 0x00, 0x00, 0x60, 0x00, 0x00, 0xf0, 0xf8, 0xff, - 0x7f, 0xfc, 0xff, 0x07, - // in regular row-major format -// 0x33, 0x00, 0x03, 0x33, 0x33, 0x33, 0x33, 0x33, -// 0x33, 0x33, 0x3f, 0xe0, - - // 'k' (0x6b) 11x18, offset 1621-1646, at +1/-17 - 0xff, 0xff, 0xff, 0xff, 0x0f, 0xc0, 0x00, 0x80, - 0x01, 0x00, 0x0f, 0x00, 0xfe, 0x00, 0x8c, 0x07, - 0x18, 0x78, 0x20, 0xc0, 0x03, 0x00, 0x0c, 0x00, - 0x00, - // in regular row-major format -// 0xc0, 0x18, 0x03, 0x00, 0x60, 0x0c, 0x01, 0x83, -// 0x30, 0xc6, 0x30, 0xcc, 0x1b, 0x83, 0xf0, 0x77, -// 0x0c, 0x61, 0x8e, 0x30, 0xe6, 0x0c, 0xc1, 0xd8, -// 0x18, - - // 'l' (0x6c) 2x18, offset 1646-1651, at +1/-17 - 0xff, 0xff, 0xff, 0xff, 0x0f, - // in regular row-major format -// 0xff, 0xff, 0xff, 0xff, 0xf0, - - // 'm' (0x6d) 17x13, offset 1651-1679, at +1/-12 - 0xff, 0xff, 0xff, 0x33, 0x00, 0x03, 0x30, 0x00, - 0x06, 0xc0, 0x00, 0x38, 0x00, 0xfe, 0x9f, 0xff, - 0x1b, 0x80, 0x01, 0x30, 0x00, 0x06, 0xc0, 0x01, - 0xf8, 0xff, 0xfe, 0x1f, - // in regular row-major format -// 0xcf, 0x1f, 0x6f, 0xdf, 0xfc, 0x78, 0xfc, 0x18, -// 0x3c, 0x0c, 0x1e, 0x06, 0x0f, 0x03, 0x07, 0x81, -// 0x83, 0xc0, 0xc1, 0xe0, 0x60, 0xf0, 0x30, 0x78, -// 0x18, 0x3c, 0x0c, 0x18, - - // 'n' (0x6e) 10x13, offset 1679-1696, at +1/-12 - 0xff, 0xff, 0xff, 0x33, 0x00, 0x03, 0x30, 0x00, - 0x06, 0xc0, 0x00, 0x38, 0x00, 0xfe, 0x9f, 0xff, - 0x03, - // in regular row-major format -// 0xcf, 0x37, 0xef, 0x1f, 0x83, 0xc0, 0xf0, 0x3c, -// 0x0f, 0x03, 0xc0, 0xf0, 0x3c, 0x0f, 0x03, 0xc0, -// 0xc0, - - // 'o' (0x6f) 11x13, offset 1696-1714, at +1/-12 - 0xf8, 0x83, 0xff, 0x38, 0xb8, 0x03, 0x3e, 0x80, - 0x07, 0xf0, 0x00, 0x3e, 0xe0, 0x0e, 0x8e, 0xff, - 0xe0, 0x0f, - // in regular row-major format -// 0x1f, 0x07, 0xf1, 0xc7, 0x70, 0x7c, 0x07, 0x80, -// 0xf0, 0x1e, 0x03, 0xc0, 0x7c, 0x1d, 0xc7, 0x1f, -// 0xc1, 0xf0, - - // 'p' (0x70) 12x17, offset 1714-1740, at +1/-12 - 0xff, 0xff, 0xff, 0xff, 0x33, 0x38, 0x30, 0x60, - 0x30, 0x80, 0x61, 0x00, 0xc3, 0x00, 0x86, 0x01, - 0x0c, 0x07, 0x1c, 0x1c, 0x1c, 0xf0, 0x1f, 0x80, - 0x1f, 0x00, - // in regular row-major format -// 0xcf, 0x8d, 0xfc, 0xf0, 0xee, 0x06, 0xc0, 0x3c, -// 0x03, 0xc0, 0x3c, 0x03, 0xc0, 0x3e, 0x07, 0xf0, -// 0xef, 0xfc, 0xcf, 0x8c, 0x00, 0xc0, 0x0c, 0x00, -// 0xc0, 0x00, - - // 'q' (0x71) 11x17, offset 1740-1764, at +1/-12 - 0xf8, 0x03, 0xf8, 0x0f, 0x38, 0x38, 0x38, 0xe0, - 0x30, 0x80, 0x61, 0x00, 0xc3, 0x00, 0x06, 0x03, - 0x06, 0x0e, 0x0e, 0xfe, 0xff, 0xff, 0xff, 0x07, - // in regular row-major format -// 0x1e, 0x67, 0xfd, 0xc7, 0xf0, 0x7c, 0x07, 0x80, -// 0xf0, 0x1e, 0x03, 0xc0, 0x7c, 0x1d, 0xc7, 0x9f, -// 0xf1, 0xe6, 0x00, 0xc0, 0x18, 0x03, 0x00, 0x60, - - // 'r' (0x72) 6x13, offset 1764-1774, at +1/-12 - 0xff, 0xff, 0xff, 0x33, 0x00, 0x03, 0x30, 0x00, - 0x06, 0x00, - // in regular row-major format -// 0xcf, 0x7f, 0x38, 0xc3, 0x0c, 0x30, 0xc3, 0x0c, -// 0x30, 0xc0, - - // 's' (0x73) 10x13, offset 1774-1791, at +1/-12 - 0x3c, 0xc6, 0xcf, 0x9d, 0xf1, 0x31, 0x3c, 0x8c, - 0x87, 0xf1, 0x30, 0x36, 0x6e, 0x86, 0x0f, 0xe0, - 0x00, - // in regular row-major format -// 0x3e, 0x1f, 0xee, 0x1b, 0x00, 0xc0, 0x3c, 0x07, -// 0xf0, 0x3e, 0x01, 0xf0, 0x3e, 0x1d, 0xfe, 0x3e, -// 0x00, - - // 't' (0x74) 5x16, offset 1791-1801, at +1/-15 - 0x18, 0x00, 0xff, 0x7f, 0xff, 0xff, 0x18, 0xc0, - 0x18, 0xc0, - // in regular row-major format -// 0x63, 0x19, 0xff, 0xb1, 0x8c, 0x63, 0x18, 0xc6, -// 0x31, 0xe7, - - // 'u' (0x75) 10x13, offset 1801-1818, at +1/-12 - 0xff, 0xe7, 0xff, 0x01, 0x70, 0x00, 0x0c, 0x80, - 0x01, 0x30, 0x00, 0x03, 0x30, 0xff, 0xff, 0xff, - 0x03, - // in regular row-major format -// 0xc0, 0xf0, 0x3c, 0x0f, 0x03, 0xc0, 0xf0, 0x3c, -// 0x0f, 0x03, 0xc0, 0xf0, 0x7e, 0x3d, 0xfb, 0x3c, -// 0xc0, - - // 'v' (0x76) 12x13, offset 1818-1838, at +0/-12 - 0x01, 0xe0, 0x01, 0xfc, 0x01, 0xfc, 0x01, 0xfc, - 0x01, 0x3c, 0x80, 0x07, 0x3e, 0xf8, 0xe1, 0x07, - 0x1c, 0x00, 0x00, 0x00, - // in regular row-major format -// 0xe0, 0x66, 0x06, 0x60, 0x67, 0x0c, 0x30, 0xc3, -// 0x0c, 0x39, 0x81, 0x98, 0x19, 0x81, 0xf0, 0x0f, -// 0x00, 0xe0, 0x0e, 0x00, - - // 'w' (0x77) 17x13, offset 1838-1866, at +0/-12 - 0x01, 0xe0, 0x03, 0xf8, 0x03, 0xf0, 0x07, 0xe0, - 0x01, 0x3e, 0xfc, 0xf9, 0x03, 0x07, 0xe0, 0x0f, - 0xe0, 0x1f, 0xc0, 0x0f, 0xc0, 0x81, 0xbf, 0x7f, - 0xf8, 0x01, 0x03, 0x00, - // in regular row-major format -// 0xc1, 0xc1, 0xb0, 0xe1, 0xd8, 0x70, 0xcc, 0x2c, -// 0x66, 0x36, 0x31, 0x9b, 0x18, 0xcd, 0x98, 0x64, -// 0x6c, 0x16, 0x36, 0x0f, 0x1a, 0x07, 0x8f, 0x03, -// 0x83, 0x80, 0xc1, 0xc0, - - // 'x' (0x78) 11x13, offset 1866-1884, at +0/-12 - 0x00, 0x60, 0x00, 0x1f, 0x70, 0x8f, 0x83, 0x3b, - 0xe0, 0x01, 0x7c, 0xe0, 0x3c, 0x0f, 0x6e, 0x80, - 0x07, 0x40, - // in regular row-major format -// 0x60, 0xee, 0x18, 0xc6, 0x0c, 0xc1, 0xf0, 0x1c, -// 0x01, 0x80, 0x78, 0x1b, 0x03, 0x30, 0xc7, 0x30, -// 0x66, 0x06, - - // 'y' (0x79) 11x18, offset 1884-1909, at +0/-12 - 0x01, 0x00, 0x3c, 0x00, 0xfc, 0x07, 0x30, 0xfe, - 0xe0, 0xc0, 0xff, 0x01, 0xf0, 0x03, 0xf0, 0x01, - 0xf8, 0x01, 0xfc, 0x00, 0x7c, 0x00, 0x30, 0x00, - 0x00, - // in regular row-major format -// 0xe0, 0x6c, 0x0d, 0x83, 0x38, 0x63, 0x0c, 0x63, -// 0x0e, 0x60, 0xcc, 0x1b, 0x03, 0x60, 0x3c, 0x07, -// 0x00, 0xe0, 0x18, 0x03, 0x00, 0xe0, 0x78, 0x0e, -// 0x00, - - // 'z' (0x7a) 10x13, offset 1909-1926, at +1/-12 - 0x03, 0x7c, 0xc0, 0x0f, 0xfc, 0xe1, 0x3c, 0x8e, - 0xe7, 0xf0, 0x0e, 0xfe, 0xc0, 0x07, 0x78, 0x00, - 0x03, - // in regular row-major format -// 0xff, 0xff, 0xf0, 0x18, 0x0c, 0x07, 0x03, 0x81, -// 0xc0, 0x60, 0x30, 0x18, 0x0e, 0x03, 0xff, 0xff, -// 0xc0, - - // '{' (0x7b) 5x23, offset 1926-1941, at +1/-17 - 0x00, 0x08, 0x00, 0x00, 0x0e, 0x80, 0xff, 0xfd, - 0xef, 0x7f, 0xfc, 0x3f, 0x00, 0x00, 0x06, - // in regular row-major format -// 0x19, 0xcc, 0x63, 0x18, 0xc6, 0x31, 0x99, 0x86, -// 0x18, 0xc6, 0x31, 0x8c, 0x63, 0x1c, 0x60, - - // '|' (0x7c) 2x23, offset 1941-1947, at +2/-17 - 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, - // in regular row-major format -// 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - - // '}' (0x7d) 5x23, offset 1947-1962, at +2/-17 - 0x03, 0x00, 0xe0, 0xff, 0xf1, 0xbf, 0xff, 0xfd, - 0x0f, 0x80, 0x03, 0x00, 0x80, 0x00, 0x00, - // in regular row-major format -// 0xc7, 0x18, 0xc6, 0x31, 0x8c, 0x63, 0x0c, 0x33, -// 0x31, 0x8c, 0x63, 0x18, 0xc6, 0x73, 0x00, -}; - -static const uint8_t FreeMono9pt7b_BCM[] = { - - // ' ' (0x20) 0x0, offset 0-0, at +0/+1 - // in regular row-major format - - // '!' (0x21) 2x11, offset 0-3, at +4/-10 - 0x7f, 0x04, 0x20, - // in regular row-major format -// 0xaa, 0xa8, 0x0c, - - // '"' (0x22) 6x5, offset 3-7, at +2/-10 - 0xe1, 0x07, 0xf0, 0x03, - // in regular row-major format -// 0xed, 0x24, 0x92, 0x48, - - // '#' (0x23) 7x12, offset 7-18, at +2/-10 - 0x90, 0x00, 0xc9, 0xff, 0x03, 0x09, 0x90, 0xff, - 0x0f, 0x90, 0x00, - // in regular row-major format -// 0x24, 0x48, 0x91, 0x2f, 0xe4, 0x89, 0x7f, 0x28, -// 0x51, 0x22, 0x40, - - // '$' (0x24) 8x12, offset 18-30, at +1/-10 - 0x80, 0xc3, 0x10, 0x16, 0x22, 0x21, 0x23, 0x2e, - 0x22, 0x26, 0x03, 0x1c, - // in regular row-major format -// 0x08, 0x3e, 0x62, 0x40, 0x30, 0x0e, 0x01, 0x81, -// 0xc3, 0xbe, 0x08, 0x08, - - // '%' (0x25) 7x11, offset 30-40, at +2/-10 - 0x46, 0x48, 0x42, 0xd2, 0x52, 0x69, 0x4a, 0x50, - 0x42, 0x0c, - // in regular row-major format -// 0x71, 0x12, 0x23, 0x80, 0x23, 0xb8, 0x0e, 0x22, -// 0x44, 0x70, - - // '&' (0x26) 7x10, offset 40-49, at +2/-9 - 0xe0, 0xf9, 0x1c, 0x61, 0x98, 0x81, 0x01, 0x0b, - 0x22, - // in regular row-major format -// 0x38, 0x81, 0x02, 0x06, 0x1a, 0x65, 0x46, 0xc8, -// 0xec, - - // ''' (0x27) 3x5, offset 49-51, at +4/-10 - 0xe1, 0x07, - // in regular row-major format -// 0xe9, 0x24, - - // '(' (0x28) 2x13, offset 51-55, at +5/-10 - 0xfc, 0x67, 0x00, 0x03, - // in regular row-major format -// 0x5a, 0xaa, 0xa9, 0x40, - - // ')' (0x29) 2x13, offset 55-59, at +4/-10 - 0x07, 0x1c, 0x7f, 0x00, - // in regular row-major format -// 0xa9, 0x55, 0x5a, 0x80, - - // '*' (0x2a) 7x7, offset 59-66, at +2/-10 - 0x04, 0x24, 0xee, 0x83, 0x42, 0x12, 0x00, - // in regular row-major format -// 0x10, 0x22, 0x4b, 0xe3, 0x05, 0x11, 0x00, - - // '+' (0x2b) 7x7, offset 66-73, at +2/-8 - 0x08, 0x04, 0xe2, 0x8f, 0x40, 0x20, 0x00, - // in regular row-major format -// 0x10, 0x20, 0x47, 0xf1, 0x02, 0x04, 0x00, - - // ',' (0x2c) 3x5, offset 73-75, at +2/-1 - 0xfc, 0x04, - // in regular row-major format -// 0x6b, 0x48, - - // '-' (0x2d) 9x1, offset 75-77, at +1/-5 - 0xff, 0x00, - // in regular row-major format -// 0xff, 0x00, - - // '.' (0x2e) 2x2, offset 77-78, at +4/-1 - 0x0f, - // in regular row-major format -// 0xf0, - - // '/' (0x2f) 7x13, offset 78-90, at +2/-11 - 0x00, 0x10, 0x80, 0x01, 0x0c, 0x60, 0x80, 0x03, - 0x1c, 0x40, 0x00, 0x00, - // in regular row-major format -// 0x02, 0x08, 0x10, 0x60, 0x81, 0x04, 0x08, 0x20, -// 0x41, 0x02, 0x08, 0x00, - - // '0' (0x30) 7x11, offset 90-100, at +2/-10 - 0xfc, 0x11, 0x50, 0x00, 0x03, 0x18, 0x40, 0x01, - 0xf1, 0x07, - // in regular row-major format -// 0x38, 0x8a, 0x0c, 0x18, 0x30, 0x60, 0xc1, 0x82, -// 0x88, 0xe0, - - // '1' (0x31) 5x11, offset 100-107, at +3/-10 - 0x06, 0x14, 0xe0, 0xff, 0x01, 0x08, 0x40, - // in regular row-major format -// 0x27, 0x28, 0x42, 0x10, 0x84, 0x21, 0x3e, - - // '2' (0x32) 7x11, offset 107-117, at +2/-10 - 0x04, 0x16, 0x68, 0x40, 0x03, 0x19, 0x44, 0x11, - 0x72, 0x10, - // in regular row-major format -// 0x38, 0x8a, 0x08, 0x10, 0x20, 0x82, 0x08, 0x61, -// 0x03, 0xf8, - - // '3' (0x33) 8x11, offset 117-128, at +1/-10 - 0x00, 0x08, 0x50, 0x00, 0x23, 0x18, 0xc1, 0x19, - 0xba, 0x08, 0x38, - // in regular row-major format -// 0x7c, 0x06, 0x02, 0x02, 0x1c, 0x06, 0x01, 0x01, -// 0x01, 0x42, 0x3c, - - // '4' (0x34) 6x11, offset 128-137, at +3/-10 - 0xf0, 0x40, 0x84, 0x21, 0x02, 0xf9, 0x7f, 0x40, - 0x02, - // in regular row-major format -// 0x18, 0xa2, 0x92, 0x8a, 0x28, 0xbf, 0x08, 0x21, -// 0xc0, - - // '5' (0x35) 7x11, offset 137-147, at +2/-10 - 0x00, 0xfa, 0x50, 0x02, 0x13, 0x98, 0xc0, 0x0c, - 0x81, 0x07, - // in regular row-major format -// 0x7c, 0x81, 0x03, 0xe4, 0x40, 0x40, 0x81, 0x03, -// 0x88, 0xe0, - - // '6' (0x36) 7x11, offset 147-157, at +2/-10 - 0xf8, 0x21, 0x9b, 0x04, 0x23, 0x18, 0xc1, 0x10, - 0x05, 0x07, - // in regular row-major format -// 0x1e, 0x41, 0x04, 0x0b, 0x98, 0xb0, 0xc1, 0xc2, -// 0x88, 0xe0, - - // '7' (0x37) 7x11, offset 157-167, at +2/-10 - 0x01, 0x08, 0x40, 0x00, 0x02, 0x1c, 0x9c, 0x1c, - 0x1c, 0x00, - // in regular row-major format -// 0xfe, 0x04, 0x08, 0x20, 0x40, 0x82, 0x04, 0x08, -// 0x20, 0x40, - - // '8' (0x38) 7x11, offset 167-177, at +2/-10 - 0x8c, 0x93, 0x52, 0x08, 0x43, 0x18, 0x42, 0x29, - 0x31, 0x0e, - // in regular row-major format -// 0x38, 0x8a, 0x0c, 0x14, 0x47, 0x11, 0x41, 0x83, -// 0x8c, 0xe0, - - // '9' (0x39) 7x11, offset 177-187, at +2/-10 - 0x1c, 0x14, 0x61, 0x10, 0x83, 0x18, 0x24, 0x9b, - 0xf0, 0x03, - // in regular row-major format -// 0x38, 0x8a, 0x1c, 0x18, 0x68, 0xce, 0x81, 0x04, -// 0x13, 0xc0, - - // ':' (0x3a) 2x8, offset 187-189, at +4/-7 - 0xc3, 0xc3, - // in regular row-major format -// 0xf0, 0x0f, - - // ';' (0x3b) 3x11, offset 189-194, at +3/-7 - 0x00, 0x1f, 0xcf, 0x08, 0x00, - // in regular row-major format -// 0x6c, 0x00, 0xd2, 0xd2, 0x00, - - // '<' (0x3c) 8x8, offset 194-202, at +1/-8 - 0x00, 0x18, 0x18, 0x24, 0x24, 0x42, 0x81, 0x81, - // in regular row-major format -// 0x03, 0x04, 0x18, 0x60, 0x60, 0x18, 0x04, 0x03, - - // '=' (0x3d) 9x4, offset 202-207, at +1/-6 - 0x99, 0x99, 0x99, 0x99, 0x09, - // in regular row-major format -// 0xff, 0x80, 0x00, 0x1f, 0xf0, - - // '>' (0x3e) 9x8, offset 207-216, at +1/-8 - 0x00, 0x81, 0x42, 0x42, 0x24, 0x24, 0x18, 0x08, - 0x00, - // in regular row-major format -// 0x40, 0x18, 0x03, 0x00, 0x60, 0x20, 0x60, 0xc0, -// 0x80, - - // '?' (0x3f) 7x10, offset 216-225, at +2/-9 - 0x02, 0x08, 0x10, 0x40, 0x88, 0x11, 0x66, 0xe0, - 0x00, - // in regular row-major format -// 0x3d, 0x84, 0x08, 0x30, 0xc2, 0x00, 0x00, 0x00, -// 0x30, - - // '@' (0x40) 8x12, offset 225-237, at +2/-10 - 0xfc, 0x23, 0x40, 0x71, 0x18, 0x89, 0x89, 0xb8, - 0x88, 0xfe, 0x00, 0x08, - // in regular row-major format -// 0x3c, 0x46, 0x82, 0x8e, 0xb2, 0xa2, 0xa2, 0x9f, -// 0x80, 0x80, 0x40, 0x3c, - - // 'A' (0x41) 11x10, offset 237-251, at +0/-9 - 0x00, 0x02, 0x1c, 0x6e, 0x96, 0x47, 0x04, 0xe1, - 0x04, 0x9c, 0x80, 0x03, 0x08, 0x20, - // in regular row-major format -// 0x3c, 0x01, 0x40, 0x28, 0x09, 0x01, 0x10, 0x42, -// 0x0f, 0xc1, 0x04, 0x40, 0x9e, 0x3c, - - // 'B' (0x42) 9x10, offset 251-263, at +1/-9 - 0x01, 0xfe, 0x1f, 0x61, 0x84, 0x11, 0x46, 0xb8, - 0xa1, 0xcb, 0xc0, 0x01, - // in regular row-major format -// 0xfe, 0x21, 0x90, 0x48, 0x67, 0xe2, 0x09, 0x02, -// 0x81, 0x41, 0xff, 0x80, - - // 'C' (0x43) 9x10, offset 263-275, at +1/-9 - 0x7c, 0x18, 0x36, 0x50, 0x80, 0x01, 0x06, 0x18, - 0xa0, 0x80, 0x07, 0x01, - // in regular row-major format -// 0x3e, 0xb0, 0xf0, 0x30, 0x08, 0x04, 0x02, 0x00, -// 0x80, 0x60, 0x8f, 0x80, - - // 'D' (0x44) 9x10, offset 275-287, at +1/-9 - 0x01, 0xfe, 0x1f, 0x60, 0x80, 0x01, 0x06, 0x38, - 0xb0, 0x61, 0xfc, 0x00, - // in regular row-major format -// 0xfe, 0x21, 0x90, 0x68, 0x14, 0x0a, 0x05, 0x02, -// 0x83, 0x43, 0x7f, 0x00, - - // 'E' (0x45) 9x10, offset 287-299, at +1/-9 - 0x01, 0xfe, 0x1f, 0x61, 0x84, 0x11, 0xe6, 0x18, - 0xe0, 0x80, 0x80, 0x03, - // in regular row-major format -// 0xff, 0x20, 0x90, 0x08, 0x87, 0xc2, 0x21, 0x00, -// 0x81, 0x40, 0xff, 0xc0, - - // 'F' (0x46) 9x10, offset 299-311, at +1/-9 - 0x01, 0xfe, 0x1f, 0x61, 0x84, 0x11, 0xe4, 0x10, - 0x40, 0x00, 0x03, 0x00, - // in regular row-major format -// 0xff, 0xa0, 0x50, 0x08, 0x87, 0xc2, 0x21, 0x00, -// 0x80, 0x40, 0x78, 0x00, - - // 'G' (0x47) 10x10, offset 311-324, at +1/-9 - 0xfc, 0x18, 0x26, 0x50, 0x80, 0x01, 0x06, 0x18, - 0xa2, 0x88, 0xe7, 0x81, 0x00, - // in regular row-major format -// 0x1e, 0x98, 0x6c, 0x0a, 0x00, 0x80, 0x20, 0xf8, -// 0x0b, 0x02, 0x60, 0x87, 0xc0, - - // 'H' (0x48) 9x10, offset 324-336, at +1/-9 - 0x01, 0xfe, 0x1f, 0x21, 0x04, 0x10, 0x40, 0x10, - 0xe1, 0xff, 0x01, 0x02, - // in regular row-major format -// 0xe3, 0xa0, 0x90, 0x48, 0x27, 0xf2, 0x09, 0x04, -// 0x82, 0x41, 0x71, 0xc0, - - // 'I' (0x49) 5x10, offset 336-343, at +3/-9 - 0x01, 0x06, 0xf8, 0x7f, 0x80, 0x01, 0x02, - // in regular row-major format -// 0xf9, 0x08, 0x42, 0x10, 0x84, 0x27, 0xc0, - - // 'J' (0x4a) 8x10, offset 343-353, at +2/-9 - 0xc0, 0x01, 0x0c, 0x60, 0x80, 0x01, 0x06, 0xf4, - 0x5f, 0x00, - // in regular row-major format -// 0x1f, 0x02, 0x02, 0x02, 0x02, 0x02, 0x82, 0x82, -// 0xc6, 0x78, - - // 'K' (0x4b) 9x10, offset 353-365, at +1/-9 - 0x01, 0xfe, 0x1f, 0x22, 0x04, 0x18, 0x90, 0x30, - 0x4c, 0xc0, 0x01, 0x02, - // in regular row-major format -// 0xe3, 0xa1, 0x11, 0x09, 0x05, 0x83, 0x21, 0x08, -// 0x84, 0x41, 0x70, 0xc0, - - // 'L' (0x4c) 8x10, offset 365-375, at +2/-9 - 0x01, 0xfe, 0x1f, 0x20, 0x80, 0x00, 0x02, 0x08, - 0x20, 0xf0, - // in regular row-major format -// 0xe0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x41, 0x41, -// 0x41, 0xff, - - // 'M' (0x4d) 11x10, offset 375-389, at +0/-9 - 0x01, 0xfe, 0x3f, 0x20, 0x03, 0x30, 0x00, 0x01, - 0x03, 0x03, 0x03, 0xfe, 0x1f, 0x20, - // in regular row-major format -// 0xe0, 0xec, 0x19, 0x45, 0x28, 0xa4, 0xa4, 0x94, -// 0x91, 0x12, 0x02, 0x40, 0x5c, 0x1c, - - // 'N' (0x4e) 9x10, offset 389-401, at +1/-9 - 0x01, 0xfe, 0x2f, 0x20, 0x03, 0x30, 0x00, 0x13, - 0xd0, 0xff, 0x01, 0x00, - // in regular row-major format -// 0xc3, 0xb0, 0x94, 0x4a, 0x24, 0x92, 0x49, 0x14, -// 0x8a, 0x43, 0x70, 0x80, - - // 'O' (0x4f) 9x10, offset 401-413, at +1/-9 - 0x78, 0x18, 0x26, 0x50, 0x80, 0x01, 0x06, 0x38, - 0xb0, 0x61, 0x78, 0x00, - // in regular row-major format -// 0x1e, 0x31, 0x90, 0x50, 0x18, 0x0c, 0x06, 0x02, -// 0x82, 0x63, 0x0f, 0x00, - - // 'P' (0x50) 8x10, offset 413-423, at +1/-9 - 0x01, 0xfe, 0x1f, 0x62, 0x88, 0x21, 0x84, 0x30, - 0x81, 0x03, - // in regular row-major format -// 0xfe, 0x43, 0x41, 0x41, 0x42, 0x7c, 0x40, 0x40, -// 0x40, 0xf0, - - // 'Q' (0x51) 9x13, offset 423-438, at +1/-9 - 0x78, 0xc0, 0x30, 0x08, 0xec, 0x00, 0x17, 0xa0, - 0x02, 0x94, 0xc0, 0x34, 0x8c, 0x78, 0x08, - // in regular row-major format -// 0x1c, 0x31, 0x90, 0x50, 0x18, 0x0c, 0x06, 0x02, -// 0x82, 0x63, 0x1f, 0x04, 0x07, 0x92, 0x30, - - // 'R' (0x52) 9x10, offset 438-450, at +1/-9 - 0x01, 0xfe, 0x1f, 0x62, 0x08, 0x21, 0x84, 0x31, - 0x89, 0xc3, 0x00, 0x02, - // in regular row-major format -// 0xfe, 0x21, 0x90, 0x48, 0x24, 0x23, 0xe1, 0x10, -// 0x84, 0x41, 0x70, 0xc0, - - // 'S' (0x53) 7x10, offset 450-459, at +2/-9 - 0x80, 0x3b, 0x34, 0x61, 0x84, 0x21, 0x8a, 0x7c, - 0x1c, - // in regular row-major format -// 0x3a, 0xcd, 0x0a, 0x03, 0x01, 0x80, 0xc1, 0xc7, -// 0x78, - - // 'T' (0x54) 9x10, offset 459-471, at +1/-9 - 0x07, 0x04, 0x10, 0x60, 0x80, 0xff, 0x07, 0x18, - 0x60, 0x00, 0x07, 0x00, - // in regular row-major format -// 0xff, 0xc4, 0x62, 0x21, 0x00, 0x80, 0x40, 0x20, -// 0x10, 0x08, 0x1f, 0x00, - - // 'U' (0x55) 9x10, offset 471-483, at +1/-9 - 0x01, 0xfc, 0x13, 0x10, 0x80, 0x00, 0x02, 0x18, - 0xd0, 0x3f, 0x01, 0x00, - // in regular row-major format -// 0xe3, 0xa0, 0x90, 0x48, 0x24, 0x12, 0x09, 0x04, -// 0x82, 0x22, 0x0e, 0x00, - - // 'V' (0x56) 11x10, offset 483-497, at +0/-9 - 0x01, 0x0c, 0xd0, 0x41, 0x18, 0x80, 0x01, 0x0c, - 0x4c, 0x0c, 0x0f, 0x04, 0x10, 0x00, - // in regular row-major format -// 0xf1, 0xe8, 0x10, 0x82, 0x10, 0x42, 0x10, 0x22, -// 0x04, 0x80, 0x50, 0x0c, 0x00, 0x80, - - // 'W' (0x57) 11x10, offset 497-511, at +0/-9 - 0x01, 0x7c, 0x10, 0x7e, 0x70, 0x38, 0x10, 0x80, - 0x47, 0xe0, 0xf9, 0x1f, 0x10, 0x00, - // in regular row-major format -// 0xf1, 0xe8, 0x09, 0x11, 0x25, 0x44, 0xa8, 0x55, -// 0x0c, 0xa1, 0x8c, 0x31, 0x84, 0x30, - - // 'X' (0x58) 9x10, offset 511-523, at +1/-9 - 0x01, 0x0e, 0x5c, 0x2c, 0x0a, 0x30, 0x20, 0x51, - 0xe8, 0xc0, 0x01, 0x02, - // in regular row-major format -// 0xe3, 0xa0, 0x88, 0x82, 0x80, 0x80, 0xc0, 0x90, -// 0x44, 0x41, 0x71, 0xc0, - - // 'Y' (0x59) 9x10, offset 523-535, at +1/-9 - 0x01, 0x0c, 0x50, 0x20, 0x86, 0xe0, 0x63, 0x58, - 0xe0, 0x00, 0x01, 0x00, - // in regular row-major format -// 0xe3, 0xa0, 0x88, 0x82, 0x81, 0x40, 0x40, 0x20, -// 0x10, 0x08, 0x1f, 0x00, - - // 'Z' (0x5a) 7x10, offset 535-544, at +2/-9 - 0x07, 0x07, 0x1b, 0x62, 0x86, 0x05, 0x0e, 0x08, - 0x38, - // in regular row-major format -// 0xfd, 0x0a, 0x20, 0x81, 0x04, 0x10, 0x21, 0x83, -// 0xfc, - - // '[' (0x5b) 2x13, offset 544-548, at +5/-10 - 0xff, 0x3f, 0x00, 0x02, - // in regular row-major format -// 0xea, 0xaa, 0xaa, 0xc0, - - // '\' (0x5c) 7x13, offset 548-560, at +2/-11 - 0x01, 0xc0, 0x01, 0xe0, 0x00, 0x60, 0x00, 0x30, - 0x00, 0x18, 0x00, 0x04, - // in regular row-major format -// 0x80, 0x81, 0x03, 0x02, 0x04, 0x04, 0x08, 0x08, -// 0x10, 0x10, 0x20, 0x20, - - // ']' (0x5d) 2x13, offset 560-564, at +4/-10 - 0x01, 0xf0, 0xff, 0x03, - // in regular row-major format -// 0xd5, 0x55, 0x55, 0xc0, - - // '^' (0x5e) 7x5, offset 564-569, at +2/-10 - 0x90, 0x89, 0x60, 0x10, 0x04, - // in regular row-major format -// 0x10, 0x51, 0x22, 0x28, 0x20, - - // '_' (0x5f) 11x1, offset 569-571, at +0/+2 - 0xff, 0x07, - // in regular row-major format -// 0xff, 0xe0, - - // '`' (0x60) 3x3, offset 571-573, at +3/-11 - 0x11, 0x01, - // in regular row-major format -// 0x88, 0x80, - - // 'a' (0x61) 9x8, offset 573-582, at +1/-7 - 0x70, 0x91, 0x89, 0x89, 0x89, 0x89, 0x49, 0xfe, - 0x80, - // in regular row-major format -// 0x7e, 0x00, 0x80, 0x47, 0xec, 0x14, 0x0a, 0x0c, -// 0xfb, - - // 'b' (0x62) 9x11, offset 582-595, at +1/-10 - 0x01, 0xfc, 0x3f, 0x84, 0x10, 0x88, 0x40, 0x04, - 0x22, 0x10, 0x42, 0xe0, 0x01, - // in regular row-major format -// 0xc0, 0x20, 0x10, 0x0b, 0xc6, 0x12, 0x05, 0x02, -// 0x81, 0x40, 0xb0, 0xb7, 0x80, - - // 'c' (0x63) 7x8, offset 595-602, at +2/-7 - 0x3c, 0x42, 0x81, 0x81, 0x81, 0x82, 0x47, - // in regular row-major format -// 0x3a, 0x8e, 0x0c, 0x08, 0x10, 0x10, 0x9e, - - // 'd' (0x64) 9x11, offset 602-615, at +1/-10 - 0xe0, 0x81, 0x10, 0x02, 0x11, 0x88, 0x40, 0x04, - 0x46, 0xe8, 0xff, 0x00, 0x04, - // in regular row-major format -// 0x03, 0x00, 0x80, 0x47, 0xa4, 0x34, 0x0a, 0x05, -// 0x02, 0x81, 0x21, 0x8f, 0x60, - - // 'e' (0x65) 8x8, offset 615-623, at +1/-7 - 0x3c, 0x4a, 0xc9, 0x89, 0x89, 0x89, 0x8a, 0x4e, - // in regular row-major format -// 0x3c, 0x43, 0x81, 0xff, 0x80, 0x80, 0x61, 0x3e, - - // 'f' (0x66) 6x11, offset 623-632, at +3/-10 - 0x08, 0xf4, 0x7f, 0x02, 0x13, 0x98, 0xc0, 0x00, - 0x00, - // in regular row-major format -// 0x3d, 0x04, 0x3e, 0x41, 0x04, 0x10, 0x41, 0x0f, -// 0x80, - - // 'g' (0x67) 9x11, offset 632-645, at +1/-7 - 0x3c, 0x10, 0x42, 0x20, 0x02, 0x19, 0xc8, 0x40, - 0x0a, 0xf9, 0x7f, 0x01, 0x00, - // in regular row-major format -// 0x3d, 0xa1, 0xa0, 0x50, 0x28, 0x14, 0x09, 0x0c, -// 0x7a, 0x01, 0x01, 0x87, 0x80, - - // 'h' (0x68) 9x11, offset 645-658, at +1/-10 - 0x01, 0xfc, 0x3f, 0x04, 0x11, 0x80, 0x00, 0x04, - 0x60, 0x10, 0xfe, 0x00, 0x04, - // in regular row-major format -// 0xc0, 0x20, 0x10, 0x0b, 0xc6, 0x32, 0x09, 0x04, -// 0x82, 0x41, 0x20, 0xb8, 0xe0, - - // 'i' (0x69) 7x10, offset 658-667, at +2/-9 - 0x00, 0x12, 0x48, 0x60, 0xff, 0x00, 0x02, 0x08, - 0x20, - // in regular row-major format -// 0x10, 0x01, 0xc0, 0x81, 0x02, 0x04, 0x08, 0x11, -// 0xfc, - - // 'j' (0x6a) 5x13, offset 667-676, at +3/-9 - 0x04, 0x90, 0x00, 0x12, 0xc0, 0x02, 0xcc, 0xff, - 0x00, - // in regular row-major format -// 0x10, 0x3e, 0x10, 0x84, 0x21, 0x08, 0x42, 0x3f, -// 0x00, - - // 'k' (0x6b) 8x11, offset 676-687, at +2/-10 - 0x01, 0xfc, 0x3f, 0x10, 0xc0, 0x80, 0x0a, 0x8c, - 0x22, 0x18, 0x81, - // in regular row-major format -// 0xc0, 0x40, 0x40, 0x4f, 0x44, 0x58, 0x70, 0x48, -// 0x44, 0x42, 0xc7, - - // 'l' (0x6c) 7x11, offset 687-697, at +2/-10 - 0x00, 0x0c, 0x60, 0x00, 0xff, 0x0f, 0x40, 0x00, - 0x02, 0x10, - // in regular row-major format -// 0x70, 0x20, 0x40, 0x81, 0x02, 0x04, 0x08, 0x10, -// 0x23, 0xf8, - - // 'm' (0x6d) 9x8, offset 697-706, at +1/-7 - 0xff, 0x82, 0x01, 0x01, 0xfe, 0x01, 0x01, 0x01, - 0xfe, - // in regular row-major format -// 0xb7, 0x64, 0x62, 0x31, 0x18, 0x8c, 0x46, 0x23, -// 0x91, - - // 'n' (0x6e) 9x8, offset 706-715, at +1/-7 - 0x80, 0xff, 0x82, 0x01, 0x01, 0x01, 0x83, 0xfe, - 0x80, - // in regular row-major format -// 0x5e, 0x31, 0x90, 0x48, 0x24, 0x12, 0x09, 0x05, -// 0xc7, - - // 'o' (0x6f) 9x8, offset 715-724, at +1/-7 - 0x3c, 0x42, 0xc3, 0x81, 0x81, 0x81, 0xc3, 0x42, - 0x3c, - // in regular row-major format -// 0x3e, 0x31, 0xa0, 0x30, 0x18, 0x0c, 0x05, 0x8c, -// 0x7c, - - // 'p' (0x70) 9x11, offset 724-737, at +1/-7 - 0x01, 0xfc, 0xbf, 0x10, 0x03, 0x11, 0x88, 0x40, - 0x04, 0x42, 0x08, 0x3c, 0x00, - // in regular row-major format -// 0xde, 0x30, 0x90, 0x28, 0x14, 0x0a, 0x05, 0x84, -// 0xbc, 0x40, 0x20, 0x38, 0x00, - - // 'q' (0x71) 9x11, offset 737-750, at +1/-7 - 0x3c, 0x10, 0x42, 0x20, 0x02, 0x11, 0x88, 0x40, - 0x08, 0xf1, 0xff, 0x01, 0x04, - // in regular row-major format -// 0x3d, 0xa1, 0xa0, 0x50, 0x28, 0x14, 0x09, 0x0c, -// 0x7a, 0x01, 0x00, 0x80, 0xe0, - - // 'r' (0x72) 7x8, offset 750-757, at +3/-7 - 0x81, 0xff, 0x84, 0x82, 0x81, 0x01, 0x01, - // in regular row-major format -// 0xce, 0xa1, 0x82, 0x04, 0x08, 0x10, 0x7c, - - // 's' (0x73) 7x8, offset 757-764, at +2/-7 - 0xe0, 0x4e, 0x89, 0x89, 0x91, 0x92, 0x77, - // in regular row-major format -// 0x3a, 0x8d, 0x0b, 0x80, 0xf0, 0x70, 0xde, - - // 't' (0x74) 8x10, offset 764-774, at +2/-9 - 0x04, 0xfc, 0x47, 0x20, 0x81, 0x04, 0x12, 0x08, - 0x20, 0x40, - // in regular row-major format -// 0x40, 0x40, 0xfc, 0x40, 0x40, 0x40, 0x40, 0x40, -// 0x41, 0x3e, - - // 'u' (0x75) 8x8, offset 774-782, at +1/-7 - 0x01, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x41, 0xff, - // in regular row-major format -// 0xc3, 0x41, 0x41, 0x41, 0x41, 0x41, 0x43, 0x3d, - - // 'v' (0x76) 9x8, offset 782-791, at +1/-7 - 0x01, 0x07, 0x19, 0x60, 0x80, 0x60, 0x1d, 0x03, - 0x01, - // in regular row-major format -// 0xe3, 0xa0, 0x90, 0x84, 0x42, 0x20, 0xa0, 0x50, -// 0x10, - - // 'w' (0x77) 9x8, offset 791-800, at +1/-7 - 0x03, 0x7d, 0xc1, 0x38, 0x1c, 0x60, 0xc1, 0x3f, - 0x01, - // in regular row-major format -// 0xe3, 0xc0, 0x92, 0x4b, 0x25, 0x92, 0xa9, 0x98, -// 0x44, - - // 'x' (0x78) 9x8, offset 800-809, at +1/-7 - 0x81, 0xc3, 0xa3, 0x14, 0x08, 0x14, 0xa3, 0xc1, - 0x80, - // in regular row-major format -// 0xe3, 0x31, 0x05, 0x01, 0x01, 0x41, 0x11, 0x05, -// 0xc7, - - // 'y' (0x79) 9x11, offset 809-822, at +1/-7 - 0x01, 0x3c, 0x60, 0x06, 0xc1, 0x0e, 0x4c, 0x18, - 0x34, 0x60, 0x00, 0x01, 0x00, - // in regular row-major format -// 0xe3, 0xa0, 0x90, 0x84, 0x42, 0x40, 0xa0, 0x60, -// 0x10, 0x10, 0x08, 0x3e, 0x00, - - // 'z' (0x7a) 7x8, offset 822-829, at +2/-7 - 0x03, 0xe1, 0x91, 0x89, 0x85, 0x83, 0xc0, - // in regular row-major format -// 0xfd, 0x08, 0x20, 0x82, 0x08, 0x10, 0xbf, - - // '{' (0x7b) 3x13, offset 829-834, at +4/-10 - 0x40, 0xc0, 0xf7, 0x07, 0x40, - // in regular row-major format -// 0x29, 0x24, 0xa2, 0x49, 0x26, - - // '|' (0x7c) 1x13, offset 834-836, at +5/-10 - 0xff, 0x1f, - // in regular row-major format -// 0xff, 0xf8, - - // '}' (0x7d) 3x13, offset 836-841, at +4/-10 - 0x01, 0xd0, 0xf7, 0x03, 0x01, - // in regular row-major format -// 0x89, 0x24, 0x8a, 0x49, 0x2c, -}; - -static const uint8_t FreeMono12pt7b_BCM[] = { - - // ' ' (0x20) 0x0, offset 0-0, at +0/+1 - // in regular row-major format - - // '!' (0x21) 3x15, offset 0-6, at +6/-14 - 0x00, 0xe0, 0xff, 0x31, 0x00, 0x18, - // in regular row-major format -// 0x49, 0x24, 0x92, 0x48, 0x01, 0xf8, - - // '"' (0x22) 8x7, offset 6-13, at +3/-14 - 0x83, 0xff, 0x01, 0x00, 0x38, 0xfc, 0x0f, - // in regular row-major format -// 0xe7, 0xe7, 0x67, 0x42, 0x42, 0x42, 0x42, - - // '#' (0x23) 10x16, offset 13-33, at +2/-14 - 0x00, 0x02, 0x20, 0x02, 0x20, 0x02, 0xfc, 0xff, - 0x23, 0x02, 0x20, 0x02, 0xa0, 0xff, 0xff, 0x02, - 0x20, 0x02, 0x20, 0x00, - // in regular row-major format -// 0x09, 0x02, 0x41, 0x10, 0x44, 0x11, 0x1f, 0xf1, -// 0x10, 0x4c, 0x12, 0x3f, 0xe1, 0x20, 0x48, 0x12, -// 0x04, 0x81, 0x20, 0x48, - - // '$' (0x24) 10x17, offset 33-55, at +2/-14 - 0x00, 0x38, 0x70, 0x20, 0x10, 0x41, 0x10, 0x02, - 0x21, 0x08, 0x62, 0x10, 0xbc, 0x20, 0x08, 0x42, - 0x10, 0x0e, 0x11, 0x00, 0x1c, 0x00, - // in regular row-major format -// 0x04, 0x07, 0xa2, 0x19, 0x02, 0x40, 0x10, 0x03, -// 0x00, 0x3c, 0x00, 0x80, 0x10, 0x06, 0x01, 0xe0, -// 0xa7, 0xc0, 0x40, 0x10, 0x04, 0x00, - - // '%' (0x25) 10x15, offset 55-74, at +2/-14 - 0x00, 0x00, 0x8f, 0xc0, 0x4c, 0x20, 0x24, 0x10, - 0xd2, 0x9b, 0x35, 0x7b, 0x0a, 0x01, 0x85, 0x40, - 0x66, 0x20, 0x1e, - // in regular row-major format -// 0x3c, 0x19, 0x84, 0x21, 0x08, 0x66, 0x0f, 0x00, -// 0x0c, 0x1c, 0x78, 0x01, 0xe0, 0xcc, 0x21, 0x08, -// 0x43, 0x30, 0x78, - - // '&' (0x26) 9x12, offset 74-88, at +3/-11 - 0xc0, 0xe3, 0xc6, 0x33, 0x18, 0x84, 0x81, 0x19, - 0x60, 0x81, 0x0f, 0x84, 0x40, 0x00, - // in regular row-major format -// 0x3e, 0x30, 0x10, 0x08, 0x02, 0x03, 0x03, 0x47, -// 0x14, 0x8a, 0x43, 0x11, 0x8f, 0x60, - - // ''' (0x27) 3x7, offset 88-91, at +5/-14 - 0x83, 0xff, 0x01, - // in regular row-major format -// 0xfd, 0xa4, 0x90, - - // '(' (0x28) 3x18, offset 91-98, at +7/-14 - 0xe0, 0x1f, 0x70, 0x80, 0x23, 0x00, 0x30, - // in regular row-major format -// 0x05, 0x25, 0x24, 0x92, 0x48, 0x92, 0x24, - - // ')' (0x29) 3x18, offset 98-105, at +4/-14 - 0x02, 0x00, 0xf3, 0x80, 0x03, 0xfc, 0x01, - // in regular row-major format -// 0x11, 0x24, 0x89, 0x24, 0x92, 0x92, 0x90, - - // '*' (0x2a) 9x9, offset 105-116, at +3/-14 - 0x08, 0x20, 0x42, 0x82, 0xe3, 0x03, 0x1a, 0x44, - 0x08, 0x00, 0x00, - // in regular row-major format -// 0x00, 0x04, 0x02, 0x11, 0x07, 0xf0, 0xc0, 0x50, -// 0x48, 0x42, 0x00, - - // '+' (0x2b) 9x11, offset 116-129, at +3/-11 - 0x20, 0x00, 0x01, 0x08, 0x40, 0xf0, 0x7f, 0x10, - 0x80, 0x00, 0x04, 0x20, 0x00, - // in regular row-major format -// 0x08, 0x04, 0x02, 0x01, 0x00, 0x87, 0xfc, 0x20, -// 0x10, 0x08, 0x04, 0x02, 0x00, - - // ',' (0x2c) 5x7, offset 129-134, at +3/-3 - 0x70, 0xdf, 0xe7, 0x10, 0x00, - // in regular row-major format -// 0x3b, 0x9c, 0xce, 0x62, 0x00, - - // '-' (0x2d) 11x1, offset 134-136, at +2/-6 - 0xff, 0x07, - // in regular row-major format -// 0xff, 0xe0, - - // '.' (0x2e) 3x3, offset 136-138, at +5/-2 - 0xff, 0x01, - // in regular row-major format -// 0xff, 0x80, - - // '/' (0x2f) 9x18, offset 138-159, at +3/-15 - 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x80, - 0x03, 0x00, 0x03, 0x00, 0x00, - // in regular row-major format -// 0x00, 0x80, 0xc0, 0x40, 0x20, 0x20, 0x10, 0x10, -// 0x08, 0x08, 0x04, 0x04, 0x02, 0x02, 0x01, 0x01, -// 0x00, 0x80, 0x80, 0x40, 0x00, - - // '0' (0x30) 9x15, offset 159-176, at +3/-14 - 0xf8, 0x0f, 0x07, 0x98, 0x00, 0x28, 0x00, 0x18, - 0x00, 0x0c, 0x00, 0x0a, 0x80, 0x1c, 0x70, 0xf8, - 0x0f, - // in regular row-major format -// 0x1c, 0x31, 0x90, 0x58, 0x38, 0x0c, 0x06, 0x03, -// 0x01, 0x80, 0xc0, 0x60, 0x30, 0x34, 0x13, 0x18, -// 0x70, - - // '1' (0x31) 7x14, offset 176-189, at +4/-13 - 0x08, 0xa0, 0x01, 0x38, 0x00, 0xfe, 0xff, 0x00, - 0x20, 0x00, 0x08, 0x00, 0x02, - // in regular row-major format -// 0x30, 0xe1, 0x44, 0x81, 0x02, 0x04, 0x08, 0x10, -// 0x20, 0x40, 0x81, 0x1f, 0xc0, - - // '2' (0x32) 9x15, offset 189-206, at +2/-14 - 0x00, 0x60, 0x06, 0xb8, 0x00, 0x36, 0x80, 0x19, - 0x60, 0x0c, 0x18, 0x06, 0x02, 0xcd, 0x80, 0x3c, - 0x70, - // in regular row-major format -// 0x1e, 0x10, 0x90, 0x68, 0x10, 0x08, 0x0c, 0x04, -// 0x04, 0x04, 0x06, 0x06, 0x06, 0x06, 0x0e, 0x07, -// 0xfe, - - // '3' (0x33) 10x15, offset 206-225, at +2/-14 - 0x00, 0x00, 0x01, 0x50, 0x00, 0x38, 0x00, 0x18, - 0x04, 0x0c, 0x02, 0x06, 0x01, 0x45, 0x41, 0x1c, - 0x31, 0x00, 0x0f, - // in regular row-major format -// 0x3e, 0x10, 0x40, 0x08, 0x02, 0x00, 0x80, 0x40, -// 0xe0, 0x04, 0x00, 0x80, 0x10, 0x04, 0x01, 0x00, -// 0xd8, 0x63, 0xe0, - - // '4' (0x34) 8x15, offset 225-240, at +3/-14 - 0x00, 0x07, 0x60, 0x02, 0x0c, 0x01, 0x81, 0x60, - 0x40, 0x0c, 0x20, 0xfe, 0xff, 0x01, 0x88, - // in regular row-major format -// 0x06, 0x0a, 0x0a, 0x12, 0x22, 0x22, 0x42, 0x42, -// 0x82, 0x82, 0xff, 0x02, 0x02, 0x02, 0x0f, - - // '5' (0x35) 9x15, offset 240-257, at +3/-14 - 0x00, 0xb0, 0x3f, 0x50, 0x10, 0x30, 0x04, 0x18, - 0x02, 0x0c, 0x01, 0x86, 0x81, 0x82, 0x61, 0x80, - 0x0f, - // in regular row-major format -// 0x7f, 0x20, 0x10, 0x08, 0x04, 0x02, 0xf1, 0x8c, -// 0x03, 0x00, 0x80, 0x40, 0x20, 0x18, 0x16, 0x18, -// 0xf0, - - // '6' (0x36) 9x15, offset 257-274, at +3/-14 - 0xe0, 0x07, 0x8c, 0x0d, 0x21, 0x48, 0x08, 0x38, - 0x04, 0x0c, 0x02, 0x06, 0x03, 0x03, 0x63, 0x01, - 0x1f, - // in regular row-major format -// 0x0f, 0x8c, 0x08, 0x08, 0x04, 0x04, 0x02, 0x79, -// 0x46, 0xc1, 0xe0, 0x60, 0x28, 0x14, 0x19, 0x08, -// 0x78, - - // '7' (0x37) 8x15, offset 274-289, at +3/-14 - 0x07, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, - 0x80, 0x0f, 0x3c, 0xe4, 0x01, 0x0e, 0x00, - // in regular row-major format -// 0xff, 0x81, 0x81, 0x02, 0x02, 0x02, 0x02, 0x04, -// 0x04, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, - - // '8' (0x38) 9x15, offset 289-306, at +3/-14 - 0x3c, 0x1e, 0xa3, 0xd0, 0x50, 0x38, 0x10, 0x18, - 0x08, 0x0c, 0x04, 0x0e, 0x85, 0x8d, 0x62, 0x3c, - 0x1e, - // in regular row-major format -// 0x3e, 0x31, 0xb0, 0x70, 0x18, 0x0c, 0x05, 0x8c, -// 0x38, 0x63, 0x40, 0x60, 0x30, 0x18, 0x1b, 0x18, -// 0xf8, - - // '9' (0x39) 9x15, offset 306-323, at +3/-14 - 0x7c, 0x40, 0x63, 0xe0, 0x40, 0x30, 0x20, 0x18, - 0x10, 0x0e, 0x08, 0x09, 0x42, 0xd8, 0x18, 0xf0, - 0x03, - // in regular row-major format -// 0x3c, 0x31, 0x30, 0x50, 0x28, 0x0c, 0x0f, 0x06, -// 0x85, 0x3c, 0x80, 0x40, 0x40, 0x20, 0x20, 0x63, -// 0xe0, - - // ':' (0x3a) 3x10, offset 323-327, at +5/-9 - 0x87, 0x1f, 0x7e, 0x38, - // in regular row-major format -// 0xff, 0x80, 0x07, 0xfc, - - // ';' (0x3b) 5x13, offset 327-336, at +3/-9 - 0x00, 0x00, 0xc0, 0x1f, 0xbe, 0xc3, 0x71, 0x00, - 0x00, - // in regular row-major format -// 0x39, 0xce, 0x00, 0x00, 0x06, 0x33, 0x98, 0xc4, -// 0x00, - - // '<' (0x3c) 11x11, offset 336-352, at +2/-11 - 0x20, 0x80, 0x01, 0x14, 0x90, 0x80, 0x08, 0x42, - 0x18, 0x44, 0x60, 0x01, 0x0a, 0x20, 0x00, 0x00, - // in regular row-major format -// 0x00, 0xc0, 0x60, 0x18, 0x0c, 0x06, 0x01, 0x80, -// 0x0c, 0x00, 0x60, 0x03, 0x00, 0x30, 0x01, 0x00, - - // '=' (0x3d) 12x4, offset 352-358, at +1/-8 - 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, - // in regular row-major format -// 0xff, 0xf0, 0x00, 0x00, 0x0f, 0xff, - - // '>' (0x3e) 11x11, offset 358-374, at +2/-11 - 0x01, 0x0c, 0x90, 0x80, 0x04, 0x42, 0x10, 0x42, - 0x20, 0x03, 0x0b, 0x30, 0x00, 0x01, 0x00, 0x00, - // in regular row-major format -// 0xc0, 0x06, 0x00, 0x30, 0x01, 0x80, 0x18, 0x01, -// 0x80, 0xc0, 0x30, 0x18, 0x0c, 0x02, 0x00, 0x00, - - // '?' (0x3f) 9x14, offset 374-390, at +3/-13 - 0x06, 0x80, 0x00, 0x10, 0x00, 0x04, 0xc0, 0x81, - 0x71, 0x10, 0x1c, 0x04, 0x88, 0x00, 0x1c, 0x00, - // in regular row-major format -// 0x3e, 0x60, 0xa0, 0x20, 0x10, 0x08, 0x08, 0x18, -// 0x10, 0x08, 0x00, 0x00, 0x00, 0x01, 0xc0, 0xe0, - - // '@' (0x40) 9x16, offset 390-408, at +3/-14 - 0xf8, 0x1f, 0x06, 0x60, 0x02, 0xc0, 0x81, 0x83, - 0x41, 0x86, 0x21, 0x84, 0x22, 0x84, 0xfc, 0x07, - 0x00, 0x04, - // in regular row-major format -// 0x1c, 0x31, 0x10, 0x50, 0x28, 0x14, 0x3a, 0x25, -// 0x22, 0x91, 0x4c, 0xa3, 0xf0, 0x08, 0x02, 0x01, -// 0x80, 0x7c, - - // 'A' (0x41) 14x14, offset 408-433, at +0/-13 - 0x00, 0x20, 0x00, 0x18, 0xc0, 0x07, 0x8e, 0x61, - 0x61, 0x47, 0x30, 0x10, 0x0c, 0x04, 0x0c, 0x01, - 0x5c, 0x08, 0x38, 0x02, 0xf0, 0x00, 0x20, 0x00, - 0x08, - // in regular row-major format -// 0x3f, 0x00, 0x0c, 0x00, 0x48, 0x01, 0x20, 0x04, -// 0x40, 0x21, 0x00, 0x84, 0x04, 0x08, 0x1f, 0xe0, -// 0x40, 0x82, 0x01, 0x08, 0x04, 0x20, 0x13, 0xe1, -// 0xf0, - - // 'B' (0x42) 11x14, offset 433-453, at +2/-13 - 0x01, 0xe0, 0xff, 0x1f, 0x04, 0x06, 0x81, 0x41, - 0x60, 0x10, 0x18, 0x04, 0x06, 0x81, 0xa2, 0x20, - 0x67, 0x04, 0xf0, 0x00, - // in regular row-major format -// 0xff, 0x08, 0x11, 0x01, 0x20, 0x24, 0x04, 0x81, -// 0x1f, 0xc2, 0x06, 0x40, 0x68, 0x05, 0x00, 0xa0, -// 0x14, 0x05, 0xff, 0x00, - - // 'C' (0x43) 10x14, offset 453-471, at +2/-13 - 0xf0, 0x03, 0x03, 0x23, 0x00, 0x05, 0xc0, 0x01, - 0x60, 0x00, 0x18, 0x00, 0x0a, 0x80, 0x02, 0xd0, - 0x03, 0x02, - // in regular row-major format -// 0x1e, 0x48, 0x74, 0x05, 0x01, 0x80, 0x20, 0x08, -// 0x02, 0x00, 0x80, 0x20, 0x04, 0x01, 0x01, 0x30, -// 0x87, 0xc0, - - // 'D' (0x44) 10x14, offset 471-489, at +2/-13 - 0x01, 0xe0, 0xff, 0x1f, 0x00, 0x06, 0x80, 0x01, - 0x60, 0x00, 0x18, 0x00, 0x0a, 0x40, 0x0c, 0x0c, - 0xfc, 0x01, - // in regular row-major format -// 0xfe, 0x10, 0x44, 0x09, 0x02, 0x40, 0x50, 0x14, -// 0x05, 0x01, 0x40, 0x50, 0x14, 0x0d, 0x02, 0x41, -// 0x3f, 0x80, - - // 'E' (0x45) 11x14, offset 489-509, at +2/-13 - 0x01, 0xe0, 0xff, 0x1f, 0x04, 0x06, 0x81, 0x41, - 0x60, 0x38, 0x18, 0x00, 0x06, 0x80, 0x01, 0xe0, - 0x01, 0x08, 0xc0, 0x03, - // in regular row-major format -// 0xff, 0xc8, 0x09, 0x01, 0x20, 0x04, 0x00, 0x88, -// 0x1f, 0x02, 0x20, 0x40, 0x08, 0x01, 0x00, 0xa0, -// 0x14, 0x03, 0xff, 0xc0, - - // 'F' (0x46) 11x14, offset 509-529, at +2/-13 - 0x01, 0xe0, 0xff, 0x1f, 0x04, 0x06, 0x81, 0x41, - 0x60, 0x38, 0x10, 0x00, 0x04, 0x00, 0x01, 0x40, - 0x00, 0x70, 0x00, 0x00, - // in regular row-major format -// 0xff, 0xe8, 0x05, 0x00, 0xa0, 0x04, 0x00, 0x88, -// 0x1f, 0x02, 0x20, 0x40, 0x08, 0x01, 0x00, 0x20, -// 0x04, 0x01, 0xf0, 0x00, - - // 'G' (0x47) 11x14, offset 529-549, at +2/-13 - 0xf8, 0x07, 0x03, 0x23, 0x00, 0x0d, 0xc0, 0x01, - 0x60, 0x00, 0x18, 0x10, 0x06, 0x84, 0x02, 0xd1, - 0xc3, 0x07, 0x10, 0x00, - // in regular row-major format -// 0x1f, 0x46, 0x19, 0x01, 0x60, 0x28, 0x01, 0x00, -// 0x20, 0x04, 0x00, 0x83, 0xf0, 0x0b, 0x01, 0x20, -// 0x23, 0x0c, 0x3e, 0x00, - - // 'H' (0x48) 10x14, offset 549-567, at +2/-13 - 0x01, 0xe0, 0xff, 0x1f, 0x04, 0x02, 0x01, 0x40, - 0x00, 0x10, 0x00, 0x04, 0x04, 0x81, 0xff, 0x7f, - 0x00, 0x08, - // in regular row-major format -// 0xe1, 0xd0, 0x24, 0x09, 0x02, 0x40, 0x90, 0x27, -// 0xf9, 0x02, 0x40, 0x90, 0x24, 0x09, 0x02, 0x40, -// 0xb8, 0x70, - - // 'I' (0x49) 7x14, offset 567-580, at +4/-13 - 0x01, 0x60, 0x00, 0x18, 0x00, 0xfe, 0xff, 0x01, - 0x60, 0x00, 0x18, 0x00, 0x02, - // in regular row-major format -// 0xfe, 0x20, 0x40, 0x81, 0x02, 0x04, 0x08, 0x10, -// 0x20, 0x40, 0x81, 0x1f, 0xc0, - - // 'J' (0x4a) 11x14, offset 580-600, at +2/-13 - 0x00, 0x0f, 0x00, 0x04, 0x00, 0x03, 0x80, 0x01, - 0x60, 0x00, 0x18, 0x00, 0x07, 0x60, 0xff, 0x4f, - 0x00, 0x10, 0x00, 0x00, - // in regular row-major format -// 0x0f, 0xe0, 0x10, 0x02, 0x00, 0x40, 0x08, 0x01, -// 0x00, 0x20, 0x04, 0x80, 0x90, 0x12, 0x02, 0x40, -// 0xc6, 0x30, 0x7c, 0x00, - - // 'K' (0x4b) 12x14, offset 600-621, at +2/-13 - 0x01, 0xe0, 0xff, 0x1f, 0x08, 0x06, 0x81, 0x60, - 0x00, 0x34, 0x80, 0x18, 0x14, 0x0c, 0x03, 0xdc, - 0x00, 0x1c, 0x00, 0x02, 0x80, - // in regular row-major format -// 0xf1, 0xe4, 0x0c, 0x41, 0x04, 0x20, 0x44, 0x04, -// 0x80, 0x5c, 0x06, 0x60, 0x43, 0x04, 0x10, 0x40, -// 0x84, 0x08, 0x40, 0xcf, 0x07, - - // 'L' (0x4c) 11x14, offset 621-641, at +2/-13 - 0x01, 0x60, 0x00, 0xf8, 0xff, 0x07, 0x80, 0x01, - 0x20, 0x00, 0x08, 0x00, 0x02, 0x80, 0x00, 0x20, - 0x00, 0x08, 0xe0, 0x03, - // in regular row-major format -// 0xf8, 0x04, 0x00, 0x80, 0x10, 0x02, 0x00, 0x40, -// 0x08, 0x01, 0x00, 0x20, 0x04, 0x04, 0x80, 0x90, -// 0x12, 0x03, 0xff, 0xc0, - - // 'M' (0x4d) 13x14, offset 641-664, at +1/-13 - 0x01, 0xe0, 0xff, 0x3f, 0x00, 0x32, 0x80, 0x30, - 0x00, 0x70, 0x00, 0x20, 0x00, 0x07, 0x30, 0x00, - 0x03, 0x38, 0x00, 0xfe, 0xff, 0x01, 0x20, - // in regular row-major format -// 0xe0, 0x3b, 0x01, 0x94, 0x14, 0xa0, 0xa4, 0x89, -// 0x24, 0x49, 0x14, 0x48, 0xa2, 0x45, 0x12, 0x10, -// 0x90, 0x04, 0x80, 0x24, 0x01, 0x78, 0x3c, - - // 'N' (0x4e) 12x14, offset 664-685, at +1/-13 - 0x01, 0xe0, 0xff, 0x3f, 0x00, 0x32, 0x80, 0x30, - 0x00, 0x18, 0x00, 0x18, 0x00, 0x0c, 0x01, 0x4c, - 0x00, 0xfc, 0xff, 0x07, 0x00, - // in regular row-major format -// 0xe0, 0xf6, 0x02, 0x50, 0x25, 0x02, 0x48, 0x24, -// 0xc2, 0x44, 0x24, 0x22, 0x43, 0x24, 0x12, 0x40, -// 0xa4, 0x0a, 0x40, 0x6f, 0x06, - - // 'O' (0x4f) 12x14, offset 685-706, at +1/-13 - 0xf0, 0x03, 0x03, 0x63, 0x80, 0x09, 0x40, 0x01, - 0x60, 0x00, 0x18, 0x00, 0x06, 0x80, 0x02, 0x90, - 0x01, 0xc6, 0xc0, 0xc0, 0x0f, - // in regular row-major format -// 0x0f, 0x03, 0x0c, 0x60, 0x64, 0x02, 0x80, 0x18, -// 0x01, 0x80, 0x18, 0x01, 0x80, 0x18, 0x01, 0x40, -// 0x26, 0x06, 0x30, 0xc0, 0xf0, - - // 'P' (0x50) 10x14, offset 706-724, at +2/-13 - 0x01, 0xe0, 0xff, 0x1f, 0x08, 0x06, 0x82, 0x81, - 0x60, 0x20, 0x10, 0x08, 0x0c, 0x03, 0x62, 0x00, - 0x0f, 0x00, - // in regular row-major format -// 0xff, 0x10, 0x64, 0x05, 0x01, 0x40, 0x50, 0x34, -// 0x19, 0xfc, 0x40, 0x10, 0x04, 0x01, 0x00, 0x40, -// 0x3e, 0x00, - - // 'Q' (0x51) 12x17, offset 724-750, at +1/-13 - 0xf0, 0x03, 0x18, 0x18, 0x18, 0x60, 0x14, 0x80, - 0x1d, 0x00, 0x2e, 0x00, 0x5c, 0x00, 0xa8, 0x00, - 0x50, 0x02, 0x10, 0x0d, 0x30, 0x32, 0x30, 0x84, - 0x1f, 0x04, - // in regular row-major format -// 0x0f, 0x03, 0x0c, 0x60, 0x64, 0x02, 0x80, 0x18, -// 0x01, 0x80, 0x18, 0x01, 0x80, 0x18, 0x01, 0x40, -// 0x26, 0x06, 0x30, 0xc1, 0xf0, 0x0c, 0x01, 0xf1, -// 0x30, 0xe0, - - // 'R' (0x52) 12x14, offset 750-771, at +2/-13 - 0x01, 0xe0, 0xff, 0x1f, 0x08, 0x06, 0x82, 0x81, - 0x40, 0x20, 0x10, 0x18, 0x0c, 0x0d, 0x66, 0x04, - 0x0f, 0x06, 0x00, 0x02, 0x80, - // in regular row-major format -// 0xff, 0x04, 0x18, 0x40, 0xc4, 0x04, 0x40, 0x44, -// 0x0c, 0x41, 0x87, 0xe0, 0x43, 0x04, 0x10, 0x40, -// 0x84, 0x04, 0x40, 0x4f, 0x03, - - // 'S' (0x53) 10x14, offset 771-789, at +2/-13 - 0x00, 0x3c, 0x07, 0x24, 0x02, 0x05, 0x81, 0x41, - 0x60, 0x10, 0x18, 0x08, 0x06, 0xc2, 0x82, 0xd0, - 0xc3, 0x03, - // in regular row-major format -// 0x1f, 0x48, 0x34, 0x05, 0x01, 0x40, 0x08, 0x01, -// 0xc0, 0x0e, 0x00, 0x40, 0x18, 0x06, 0x01, 0xe1, -// 0xa7, 0xc0, - - // 'T' (0x54) 11x14, offset 789-809, at +2/-13 - 0x07, 0x40, 0x00, 0x10, 0x00, 0x06, 0x80, 0x01, - 0xe0, 0xff, 0x1f, 0x00, 0x06, 0x80, 0x01, 0x60, - 0x00, 0x70, 0x00, 0x00, - // in regular row-major format -// 0xff, 0xf0, 0x86, 0x10, 0x82, 0x00, 0x40, 0x08, -// 0x01, 0x00, 0x20, 0x04, 0x00, 0x80, 0x10, 0x02, -// 0x00, 0x40, 0x7f, 0x00, - - // 'U' (0x55) 12x14, offset 809-830, at +1/-13 - 0x01, 0xc0, 0xff, 0x11, 0x80, 0x05, 0x40, 0x00, - 0x20, 0x00, 0x08, 0x00, 0x02, 0x80, 0x01, 0x50, - 0x00, 0xf6, 0x7f, 0x04, 0x00, - // in regular row-major format -// 0xf0, 0xf4, 0x02, 0x40, 0x24, 0x02, 0x40, 0x24, -// 0x02, 0x40, 0x24, 0x02, 0x40, 0x24, 0x02, 0x40, -// 0x22, 0x04, 0x30, 0xc0, 0xf0, - - // 'V' (0x56) 14x14, offset 830-855, at +0/-13 - 0x01, 0x40, 0x00, 0x70, 0x00, 0xe4, 0x00, 0xc1, - 0x01, 0x80, 0x03, 0x80, 0x03, 0xc0, 0x00, 0x4c, - 0xe0, 0x10, 0x07, 0x34, 0x00, 0x03, 0x40, 0x00, - 0x00, - // in regular row-major format -// 0xf8, 0x7c, 0x80, 0x22, 0x01, 0x04, 0x04, 0x10, -// 0x20, 0x40, 0x80, 0x82, 0x02, 0x10, 0x08, 0x40, -// 0x11, 0x00, 0x48, 0x01, 0xa0, 0x03, 0x00, 0x0c, -// 0x00, - - // 'W' (0x57) 14x14, offset 855-880, at +0/-13 - 0x01, 0x40, 0x00, 0xf0, 0x3f, 0x04, 0xf0, 0x01, - 0x3c, 0xe0, 0x80, 0x07, 0xe0, 0x00, 0xe0, 0x41, - 0x80, 0x17, 0x00, 0xc7, 0x7f, 0x0f, 0x40, 0x00, - 0x00, - // in regular row-major format -// 0xf8, 0x7c, 0x80, 0x22, 0x00, 0x88, 0xc2, 0x23, -// 0x10, 0x8e, 0x42, 0x29, 0x09, 0x24, 0x24, 0x90, -// 0x91, 0x41, 0x85, 0x06, 0x14, 0x18, 0x70, 0x60, -// 0x80, - - // 'X' (0x58) 12x14, offset 880-901, at +1/-13 - 0x01, 0x60, 0x00, 0x7c, 0x80, 0x37, 0x90, 0x10, - 0x03, 0x78, 0x00, 0x0c, 0xc0, 0x04, 0x19, 0xe6, - 0x01, 0x3b, 0x00, 0x07, 0x80, - // in regular row-major format -// 0xf0, 0xf2, 0x06, 0x30, 0x41, 0x08, 0x09, 0x80, -// 0x50, 0x06, 0x00, 0x60, 0x0d, 0x00, 0x88, 0x10, -// 0xc2, 0x04, 0x60, 0x2f, 0x0f, - - // 'Y' (0x59) 12x14, offset 901-922, at +1/-13 - 0x01, 0x40, 0x00, 0x30, 0x00, 0x34, 0x80, 0x10, - 0x20, 0x18, 0x08, 0xf8, 0x83, 0x81, 0x11, 0x60, - 0x03, 0x38, 0x00, 0x04, 0x00, - // in regular row-major format -// 0xf0, 0xf2, 0x02, 0x10, 0x41, 0x04, 0x08, 0x80, -// 0x50, 0x05, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, -// 0x00, 0x20, 0x02, 0x01, 0xfc, - - // 'Z' (0x5a) 9x14, offset 922-938, at +3/-13 - 0x0f, 0x78, 0x00, 0x19, 0x30, 0x06, 0x82, 0x61, - 0x60, 0x04, 0xd8, 0x00, 0x0e, 0x80, 0x00, 0x3e, - // in regular row-major format -// 0xff, 0x40, 0xa0, 0x90, 0x40, 0x40, 0x40, 0x20, -// 0x20, 0x20, 0x10, 0x50, 0x30, 0x18, 0x0f, 0xfc, - - // '[' (0x5b) 3x18, offset 938-945, at +7/-14 - 0xff, 0xff, 0x07, 0x00, 0x18, 0x00, 0x20, - // in regular row-major format -// 0xf2, 0x49, 0x24, 0x92, 0x49, 0x24, 0x9c, - - // '\' (0x5c) 9x18, offset 945-966, at +3/-15 - 0x03, 0x00, 0x38, 0x00, 0x00, 0x03, 0x00, 0x30, - 0x00, 0x00, 0x03, 0x00, 0x30, 0x00, 0x00, 0x03, - 0x00, 0x30, 0x00, 0x00, 0x03, - // in regular row-major format -// 0x80, 0x60, 0x10, 0x08, 0x02, 0x01, 0x00, 0x40, -// 0x20, 0x08, 0x04, 0x01, 0x00, 0x80, 0x20, 0x10, -// 0x04, 0x02, 0x00, 0x80, 0x40, - - // ']' (0x5d) 3x18, offset 966-973, at +5/-14 - 0x01, 0x00, 0x06, 0x00, 0xf8, 0xff, 0x3f, - // in regular row-major format -// 0xe4, 0x92, 0x49, 0x24, 0x92, 0x49, 0x3c, - - // '^' (0x5e) 9x6, offset 973-980, at +3/-14 - 0x30, 0xc6, 0x08, 0x03, 0x81, 0x40, 0x20, - // in regular row-major format -// 0x08, 0x0c, 0x09, 0x0c, 0x4c, 0x14, 0x04, - - // '_' (0x5f) 14x1, offset 980-982, at +0/+3 - 0xff, 0x3f, - // in regular row-major format -// 0xff, 0xfc, - - // '`' (0x60) 4x4, offset 982-984, at +4/-15 - 0x21, 0x84, - // in regular row-major format -// 0x84, 0x21, - - // 'a' (0x61) 10x10, offset 984-997, at +2/-9 - 0xc0, 0x81, 0x1c, 0x63, 0x84, 0x11, 0x46, 0x18, - 0x91, 0x44, 0xfe, 0x03, 0x08, - // in regular row-major format -// 0x3e, 0x00, 0x60, 0x08, 0x02, 0x3f, 0x98, 0x28, -// 0x0a, 0x02, 0xc3, 0x9f, 0x30, - - // 'b' (0x62) 13x15, offset 997-1022, at +0/-14 - 0x01, 0xc0, 0x00, 0xe0, 0xff, 0x1f, 0x10, 0x02, - 0x04, 0x02, 0x01, 0x82, 0x00, 0x41, 0x80, 0x20, - 0x40, 0x10, 0x20, 0x10, 0x08, 0x10, 0x06, 0xf0, - 0x00, - // in regular row-major format -// 0xe0, 0x01, 0x00, 0x08, 0x00, 0x40, 0x02, 0x00, -// 0x13, 0xe0, 0xa0, 0x86, 0x02, 0x20, 0x09, 0x00, -// 0x48, 0x02, 0x40, 0x13, 0x01, 0x14, 0x1b, 0x9f, -// 0x00, - - // 'c' (0x63) 11x10, offset 1022-1036, at +2/-9 - 0x78, 0x18, 0x26, 0x50, 0x80, 0x01, 0x06, 0x18, - 0x60, 0x80, 0x02, 0x3e, 0x04, 0x00, - // in regular row-major format -// 0x1f, 0x4c, 0x19, 0x01, 0x40, 0x28, 0x01, 0x00, -// 0x20, 0x02, 0x00, 0x60, 0x43, 0xf0, - - // 'd' (0x64) 11x15, offset 1036-1057, at +2/-14 - 0x00, 0x0f, 0x60, 0x18, 0x10, 0x08, 0x04, 0x08, - 0x02, 0x04, 0x01, 0x82, 0x00, 0x81, 0x40, 0x81, - 0x90, 0xff, 0x3f, 0x00, 0x10, - // in regular row-major format -// 0x00, 0xc0, 0x08, 0x01, 0x00, 0x20, 0x04, 0x3c, -// 0x98, 0x52, 0x06, 0x80, 0x50, 0x0a, 0x01, 0x40, -// 0x24, 0x0c, 0xc2, 0x87, 0x98, - - // 'e' (0x65) 10x10, offset 1057-1070, at +2/-9 - 0xfc, 0x48, 0x36, 0x51, 0x84, 0x11, 0x46, 0x18, - 0xe1, 0x84, 0x12, 0x71, 0x04, - // in regular row-major format -// 0x3f, 0x18, 0x68, 0x06, 0x01, 0xff, 0xe0, 0x08, -// 0x03, 0x00, 0x60, 0xc7, 0xc0, - - // 'f' (0x66) 9x15, offset 1070-1087, at +4/-14 - 0x20, 0x40, 0x10, 0xa0, 0xff, 0x5f, 0x04, 0x18, - 0x02, 0x0c, 0x01, 0x86, 0x00, 0x43, 0x00, 0x01, - 0x00, - // in regular row-major format -// 0x0f, 0x98, 0x08, 0x04, 0x02, 0x07, 0xf8, 0x80, -// 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x03, -// 0xf8, - - // 'g' (0x67) 11x14, offset 1087-1107, at +2/-9 - 0x78, 0x80, 0x61, 0x20, 0x10, 0x04, 0x88, 0x01, - 0x62, 0x80, 0x18, 0x20, 0x0a, 0x84, 0x86, 0xd0, - 0xff, 0x13, 0x00, 0x00, - // in regular row-major format -// 0x1e, 0x6c, 0x39, 0x03, 0x40, 0x28, 0x05, 0x00, -// 0xa0, 0x12, 0x06, 0x61, 0x43, 0xc8, 0x01, 0x00, -// 0x20, 0x08, 0x3e, 0x00, - - // 'h' (0x68) 10x15, offset 1107-1126, at +2/-14 - 0x01, 0xc0, 0xff, 0x3f, 0x30, 0x10, 0x08, 0x00, - 0x02, 0x00, 0x01, 0x80, 0x00, 0x80, 0x80, 0x80, - 0x7f, 0x00, 0x20, - // in regular row-major format -// 0xc0, 0x10, 0x04, 0x01, 0x00, 0x40, 0x13, 0x87, -// 0x11, 0x82, 0x40, 0x90, 0x24, 0x09, 0x02, 0x40, -// 0x90, 0x2e, 0x1c, - - // 'i' (0x69) 9x15, offset 1126-1143, at +3/-14 - 0x00, 0x40, 0x10, 0x20, 0x08, 0x10, 0x04, 0x78, - 0xfe, 0x07, 0x00, 0x02, 0x00, 0x01, 0x80, 0x00, - 0x40, - // in regular row-major format -// 0x08, 0x04, 0x02, 0x00, 0x00, 0x03, 0xc0, 0x20, -// 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0x80, 0x43, -// 0xfe, - - // 'j' (0x6a) 7x19, offset 1143-1160, at +3/-14 - 0x20, 0x00, 0x04, 0x01, 0x20, 0x08, 0x00, 0x41, - 0x00, 0x08, 0x02, 0xc0, 0x13, 0x00, 0x81, 0xff, - 0x07, - // in regular row-major format -// 0x04, 0x08, 0x10, 0x00, 0x1f, 0xc0, 0x81, 0x02, -// 0x04, 0x08, 0x10, 0x20, 0x40, 0x81, 0x02, 0x0b, -// 0xe0, - - // 'k' (0x6b) 12x15, offset 1160-1183, at +1/-14 - 0x01, 0xc0, 0x00, 0xe0, 0xff, 0x1f, 0x40, 0x00, - 0x30, 0x00, 0x2c, 0x80, 0x22, 0xc0, 0xa0, 0x20, - 0x60, 0x10, 0x20, 0x00, 0x10, 0x00, 0x08, - // in regular row-major format -// 0xe0, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, -// 0x3c, 0x21, 0x02, 0x60, 0x2c, 0x03, 0x80, 0x24, -// 0x02, 0x20, 0x21, 0x02, 0x08, 0xe1, 0xf0, - - // 'l' (0x6c) 9x15, offset 1183-1200, at +3/-14 - 0x00, 0xc0, 0x00, 0x60, 0x00, 0x30, 0x00, 0xf8, - 0xff, 0x07, 0x00, 0x02, 0x00, 0x01, 0x80, 0x00, - 0x40, - // in regular row-major format -// 0x78, 0x04, 0x02, 0x01, 0x00, 0x80, 0x40, 0x20, -// 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0x80, 0x43, -// 0xfe, - - // 'm' (0x6d) 13x10, offset 1200-1217, at +1/-9 - 0x01, 0xfe, 0x2f, 0x60, 0x00, 0x01, 0x04, 0xe0, - 0xbf, 0x80, 0x01, 0x04, 0x30, 0x80, 0xff, 0x00, - 0x02, - // in regular row-major format -// 0xdc, 0xe3, 0x19, 0x90, 0x84, 0x84, 0x24, 0x21, -// 0x21, 0x09, 0x08, 0x48, 0x42, 0x42, 0x17, 0x18, -// 0xc0, - - // 'n' (0x6e) 12x10, offset 1217-1232, at +1/-9 - 0x00, 0x06, 0xf8, 0xbf, 0x80, 0x02, 0x04, 0x10, - 0x40, 0x00, 0x01, 0x08, 0xc8, 0x3f, 0x80, - // in regular row-major format -// 0x67, 0x83, 0x84, 0x20, 0x22, 0x02, 0x20, 0x22, -// 0x02, 0x20, 0x22, 0x02, 0x20, 0x2f, 0x07, - - // 'o' (0x6f) 11x10, offset 1232-1246, at +2/-9 - 0x78, 0x10, 0x22, 0x50, 0x80, 0x01, 0x06, 0x18, - 0x60, 0x80, 0x02, 0x11, 0x82, 0x07, - // in regular row-major format -// 0x1f, 0x04, 0x11, 0x01, 0x40, 0x18, 0x03, 0x00, -// 0x60, 0x0a, 0x02, 0x20, 0x83, 0xe0, - - // 'p' (0x70) 12x14, offset 1246-1267, at +1/-9 - 0x01, 0xe0, 0xff, 0x4f, 0x08, 0x0a, 0x84, 0x01, - 0x42, 0x80, 0x10, 0x20, 0x04, 0x08, 0x01, 0x82, - 0x40, 0x60, 0x08, 0xe0, 0x01, - // in regular row-major format -// 0xcf, 0x85, 0x06, 0x60, 0x24, 0x01, 0x40, 0x14, -// 0x01, 0x40, 0x16, 0x02, 0x50, 0x44, 0xf8, 0x40, -// 0x04, 0x00, 0x40, 0x0f, 0x00, - - // 'q' (0x71) 11x14, offset 1267-1287, at +2/-9 - 0x7c, 0x80, 0x61, 0x20, 0x10, 0x04, 0x08, 0x01, - 0x42, 0x80, 0x10, 0x20, 0x08, 0x84, 0x86, 0xe0, - 0xff, 0x1f, 0x00, 0x02, - // in regular row-major format -// 0x1e, 0x6c, 0x3b, 0x03, 0x40, 0x28, 0x05, 0x00, -// 0xa0, 0x12, 0x06, 0x61, 0x43, 0xc8, 0x01, 0x00, -// 0x20, 0x04, 0x03, 0xc0, - - // 'r' (0x72) 10x10, offset 1287-1300, at +3/-9 - 0x01, 0x06, 0xf8, 0x3f, 0x81, 0x06, 0x0a, 0x18, - 0x60, 0x00, 0x01, 0x08, 0x00, - // in regular row-major format -// 0xe3, 0x8b, 0x13, 0x80, 0x80, 0x20, 0x08, 0x02, -// 0x00, 0x80, 0x20, 0x3f, 0x80, - - // 's' (0x73) 10x10, offset 1300-1313, at +2/-9 - 0x80, 0x3b, 0xa4, 0x60, 0x84, 0x11, 0x46, 0x18, - 0x61, 0x88, 0x22, 0x1d, 0x03, - // in regular row-major format -// 0x1f, 0x58, 0x34, 0x05, 0x80, 0x1e, 0x00, 0x60, -// 0x06, 0x01, 0xc0, 0xaf, 0xc0, - - // 't' (0x74) 11x14, offset 1313-1333, at +1/-13 - 0x10, 0x00, 0x04, 0xf0, 0xff, 0x41, 0xc0, 0x10, - 0x20, 0x04, 0x08, 0x01, 0x42, 0x80, 0x00, 0x20, - 0x00, 0x04, 0x00, 0x00, - // in regular row-major format -// 0x20, 0x04, 0x00, 0x80, 0x10, 0x0f, 0xf0, 0x40, -// 0x08, 0x01, 0x00, 0x20, 0x04, 0x00, 0x80, 0x10, -// 0x03, 0x04, 0x3f, 0x00, - - // 'u' (0x75) 11x10, offset 1333-1347, at +2/-9 - 0x01, 0xfc, 0x07, 0x30, 0x80, 0x00, 0x02, 0x08, - 0x60, 0x40, 0x01, 0xfd, 0x0f, 0x20, - // in regular row-major format -// 0xc1, 0xc8, 0x09, 0x01, 0x20, 0x24, 0x04, 0x80, -// 0x90, 0x12, 0x02, 0x61, 0xc7, 0xcc, - - // 'v' (0x76) 13x10, offset 1347-1364, at +1/-9 - 0x01, 0x04, 0xf0, 0x40, 0x0e, 0xc1, 0x00, 0x0c, - 0x20, 0x60, 0x71, 0x34, 0x30, 0x40, 0x00, 0x01, - 0x00, - // in regular row-major format -// 0xf8, 0xf9, 0x01, 0x08, 0x10, 0x60, 0x81, 0x08, -// 0x08, 0x40, 0x22, 0x01, 0x20, 0x05, 0x00, 0x30, -// 0x00, - - // 'w' (0x77) 13x10, offset 1364-1381, at +1/-9 - 0x01, 0x3c, 0x10, 0x5f, 0x80, 0xc0, 0xe1, 0x80, - 0x01, 0x18, 0x80, 0x07, 0xff, 0x43, 0x00, 0x01, - 0x00, - // in regular row-major format -// 0xf0, 0x7a, 0x01, 0x10, 0x08, 0x8c, 0x42, 0x62, -// 0x12, 0x90, 0xa5, 0x05, 0x18, 0x28, 0xc0, 0x86, -// 0x00, - - // 'x' (0x78) 12x10, offset 1381-1396, at +1/-9 - 0x00, 0x06, 0x38, 0xf0, 0xa1, 0x4d, 0xe2, 0x00, - 0x03, 0x1a, 0xc5, 0x0e, 0x1e, 0x70, 0x80, - // in regular row-major format -// 0x78, 0xf3, 0x04, 0x18, 0x80, 0xd0, 0x06, 0x00, -// 0x70, 0x09, 0x81, 0x0c, 0x20, 0x6f, 0x8f, - - // 'y' (0x79) 12x14, offset 1396-1417, at +1/-9 - 0x01, 0x60, 0x00, 0x78, 0x00, 0x66, 0x80, 0x60, - 0x30, 0x60, 0x0b, 0x30, 0x02, 0x03, 0x31, 0x40, - 0x03, 0x30, 0x00, 0x04, 0x00, - // in regular row-major format -// 0xf0, 0xf2, 0x02, 0x20, 0x41, 0x04, 0x10, 0x80, -// 0x88, 0x09, 0x00, 0x50, 0x06, 0x00, 0x20, 0x04, -// 0x00, 0x40, 0x08, 0x0f, 0xe0, - - // 'z' (0x7a) 9x10, offset 1417-1429, at +3/-9 - 0x03, 0x04, 0x1e, 0x64, 0x88, 0x11, 0x26, 0x78, - 0x60, 0x80, 0x00, 0x03, - // in regular row-major format -// 0xff, 0x41, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, -// 0x80, 0x40, 0xbf, 0xc0, - - // '{' (0x7b) 5x18, offset 1429-1441, at +5/-14 - 0x00, 0x02, 0x00, 0x14, 0xe0, 0xdf, 0x5f, 0x00, - 0x80, 0x01, 0x00, 0x02, - // in regular row-major format -// 0x19, 0x08, 0x42, 0x10, 0x84, 0x64, 0x18, 0x42, -// 0x10, 0x84, 0x20, 0xc0, - - // '|' (0x7c) 1x18, offset 1441-1444, at +7/-14 - 0xff, 0xff, 0x03, - // in regular row-major format -// 0xff, 0xff, 0xc0, - - // '}' (0x7d) 5x18, offset 1444-1456, at +5/-14 - 0x01, 0x00, 0x06, 0x00, 0xe8, 0xcf, 0x1f, 0x40, - 0x01, 0x00, 0x02, 0x00, - // in regular row-major format -// 0xc1, 0x08, 0x42, 0x10, 0x84, 0x10, 0x4c, 0x42, -// 0x10, 0x84, 0x26, 0x00, -}; - -static const uint8_t FreeMono18pt7b_BCM[] = { - - // ' ' (0x20) 0x0, offset 0-0, at +0/+1 - // in regular row-major format - - // '!' (0x21) 4x22, offset 0-11, at +8/-21 - 0x00, 0x00, 0x98, 0xff, 0x00, 0xff, 0xff, 0xc7, - 0xfb, 0x0f, 0x60, - // in regular row-major format -// 0x27, 0x77, 0x77, 0x77, 0x77, 0x22, 0x22, 0x20, -// 0x00, 0x6f, 0xf6, - - // '"' (0x22) 11x10, offset 11-25, at +5/-20 - 0x1f, 0xfc, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, - 0xc0, 0x0f, 0xff, 0xff, 0xff, 0x01, - // in regular row-major format -// 0xf1, 0xfe, 0x3f, 0xc7, 0xf8, 0xff, 0x1e, 0xc3, -// 0x98, 0x33, 0x06, 0x60, 0xcc, 0x18, - - // '#' (0x23) 14x24, offset 25-67, at +3/-21 - 0x00, 0x40, 0x00, 0x00, 0x42, 0x00, 0x00, 0x42, - 0x00, 0x00, 0x42, 0x00, 0x00, 0xfa, 0xff, 0xff, - 0x47, 0x00, 0x00, 0x42, 0x00, 0x00, 0x42, 0x00, - 0x00, 0x42, 0xe0, 0x80, 0xff, 0x3f, 0x7f, 0x42, - 0x00, 0x00, 0x42, 0x00, 0x00, 0x42, 0x00, 0x00, - 0x42, 0x00, - // in regular row-major format -// 0x04, 0x20, 0x10, 0x80, 0x42, 0x01, 0x08, 0x04, -// 0x20, 0x10, 0x80, 0x42, 0x01, 0x10, 0x04, 0x41, -// 0xff, 0xf0, 0x44, 0x02, 0x10, 0x08, 0x40, 0x21, -// 0x0f, 0xff, 0xc2, 0x10, 0x08, 0x40, 0x21, 0x00, -// 0x84, 0x02, 0x10, 0x08, 0x40, 0x23, 0x00, 0x88, -// 0x02, 0x20, - - // '$' (0x24) 13x26, offset 67-110, at +4/-22 - 0x00, 0x00, 0x1f, 0x00, 0x0f, 0x30, 0x00, 0x63, - 0x80, 0x00, 0x04, 0x03, 0x06, 0x08, 0x08, 0x10, - 0x20, 0x20, 0x40, 0xf0, 0x80, 0x00, 0x3f, 0x02, - 0x04, 0x04, 0x08, 0x10, 0x10, 0x60, 0x40, 0x20, - 0x00, 0x01, 0x83, 0x00, 0x1e, 0x08, 0x01, 0x00, - 0xc0, 0x03, 0x00, - // in regular row-major format -// 0x02, 0x00, 0x10, 0x00, 0x80, 0x1f, 0xa3, 0x07, -// 0x10, 0x09, 0x00, 0x48, 0x00, 0x40, 0x03, 0x00, -// 0x0c, 0x00, 0x3c, 0x00, 0x1e, 0x00, 0x18, 0x00, -// 0x20, 0x01, 0x80, 0x0c, 0x00, 0x70, 0x05, 0xe0, -// 0xc9, 0xf8, 0x01, 0x00, 0x08, 0x00, 0x40, 0x02, -// 0x00, 0x10, 0x00, - - // '%' (0x25) 15x21, offset 110-150, at +3/-20 - 0x00, 0x10, 0x80, 0x07, 0x02, 0x08, 0x61, 0x80, - 0x40, 0x04, 0x10, 0x88, 0x00, 0x02, 0x19, 0x4f, - 0x20, 0x11, 0x12, 0x22, 0x81, 0x3c, 0x26, 0x10, - 0xc0, 0x04, 0x02, 0x88, 0x40, 0x80, 0x21, 0x04, - 0x30, 0xcc, 0x00, 0x02, 0x0f, 0x40, 0x00, 0x00, - // in regular row-major format -// 0x1e, 0x00, 0x42, 0x01, 0x02, 0x02, 0x04, 0x04, -// 0x08, 0x08, 0x10, 0x08, 0x40, 0x0f, 0x00, 0x00, -// 0x1e, 0x01, 0xf0, 0x1f, 0x01, 0xe0, 0x0e, 0x00, -// 0x00, 0x3c, 0x00, 0x86, 0x02, 0x06, 0x04, 0x04, -// 0x08, 0x08, 0x10, 0x30, 0x10, 0xc0, 0x1e, 0x00, - - // '&' (0x26) 12x18, offset 150-177, at +4/-17 - 0x00, 0xf8, 0x00, 0x30, 0xc6, 0x63, 0xb0, 0xb0, - 0x80, 0x01, 0x07, 0x06, 0x38, 0x18, 0x80, 0x63, - 0x00, 0x58, 0x01, 0xc0, 0x05, 0xc0, 0x0d, 0xc0, - 0x21, 0x00, 0x81, - // in regular row-major format -// 0x0f, 0xc1, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, -// 0x00, 0x10, 0x01, 0x00, 0x08, 0x03, 0xc0, 0x6c, -// 0x3c, 0x62, 0x82, 0x68, 0x34, 0x81, 0xcc, 0x08, -// 0x61, 0xc3, 0xe7, - - // ''' (0x27) 4x10, offset 177-182, at +8/-20 - 0x1f, 0xfc, 0xff, 0xff, 0x07, - // in regular row-major format -// 0xff, 0xff, 0xf6, 0x66, 0x66, - - // '(' (0x28) 5x25, offset 182-198, at +10/-20 - 0x00, 0xff, 0x01, 0xc0, 0xff, 0x1f, 0xe0, 0x03, - 0xf8, 0x71, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x18, - // in regular row-major format -// 0x08, 0xc4, 0x62, 0x31, 0x8c, 0xc6, 0x31, 0x8c, -// 0x63, 0x18, 0xc3, 0x18, 0xc2, 0x18, 0xc3, 0x18, - - // ')' (0x29) 5x25, offset 198-214, at +6/-20 - 0x03, 0x00, 0x80, 0x1d, 0x00, 0xc0, 0xe1, 0x03, - 0xf0, 0x01, 0xff, 0x7f, 0x00, 0xe0, 0x1f, 0x00, - // in regular row-major format -// 0x86, 0x10, 0xc2, 0x18, 0xc6, 0x10, 0xc6, 0x31, -// 0x8c, 0x63, 0x18, 0x8c, 0x62, 0x31, 0x98, 0x80, - - // '*' (0x2a) 13x12, offset 214-234, at +4/-20 - 0x10, 0x00, 0x01, 0x20, 0x08, 0x62, 0x20, 0x03, - 0x1c, 0x7f, 0x00, 0x1c, 0x20, 0x03, 0xe2, 0x20, - 0x00, 0x01, 0x10, 0x00, - // in regular row-major format -// 0x02, 0x00, 0x10, 0x00, 0x80, 0x04, 0x0c, 0x21, -// 0x9d, 0x70, 0x1c, 0x00, 0xa0, 0x0d, 0x80, 0xc6, -// 0x04, 0x10, 0x40, 0x80, - - // '+' (0x2b) 15x17, offset 234-266, at +3/-17 - 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, - 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x80, 0xff, - 0xff, 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, - 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, - // in regular row-major format -// 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, -// 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0xff, -// 0xfe, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, -// 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x01, 0x00, - - // ',' (0x2c) 7x10, offset 266-275, at +5/-4 - 0x80, 0xe3, 0xff, 0xcf, 0x0f, 0x1f, 0x1c, 0x10, - 0x00, - // in regular row-major format -// 0x3e, 0x78, 0xf3, 0xc7, 0x8e, 0x18, 0x70, 0xc1, -// 0x80, - - // '-' (0x2d) 15x1, offset 275-277, at +3/-9 - 0xff, 0x7f, - // in regular row-major format -// 0xff, 0xfe, - - // '.' (0x2e) 5x5, offset 277-281, at +8/-4 - 0xee, 0xff, 0xef, 0x00, - // in regular row-major format -// 0x77, 0xff, 0xf7, 0x00, - - // '/' (0x2f) 13x26, offset 281-324, at +4/-22 - 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, - 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, - 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x80, - 0x03, 0x00, 0x80, 0x03, 0x00, 0x80, 0x03, 0x00, - 0x80, 0x03, 0x00, 0x80, 0x03, 0x00, 0x00, 0x03, - 0x00, 0x00, 0x00, - // in regular row-major format -// 0x00, 0x08, 0x00, 0xc0, 0x04, 0x00, 0x60, 0x02, -// 0x00, 0x30, 0x01, 0x00, 0x18, 0x00, 0x80, 0x0c, -// 0x00, 0x40, 0x02, 0x00, 0x20, 0x01, 0x00, 0x10, -// 0x00, 0x80, 0x08, 0x00, 0x40, 0x04, 0x00, 0x20, -// 0x02, 0x00, 0x10, 0x01, 0x00, 0x08, 0x00, 0x80, -// 0x04, 0x00, 0x00, - - // '0' (0x30) 13x21, offset 324-359, at +4/-20 - 0xe0, 0xff, 0x00, 0x07, 0x60, 0x18, 0x00, 0x30, - 0x01, 0x00, 0x14, 0x00, 0x00, 0x03, 0x00, 0x60, - 0x00, 0x00, 0x0c, 0x00, 0x80, 0x01, 0x00, 0x50, - 0x00, 0x00, 0x11, 0x00, 0x30, 0x1c, 0xc0, 0x01, - 0xfe, 0x0f, 0x00, - // in regular row-major format -// 0x0f, 0x81, 0x82, 0x08, 0x08, 0x80, 0x24, 0x01, -// 0x60, 0x0e, 0x00, 0x30, 0x01, 0x80, 0x0c, 0x00, -// 0x60, 0x03, 0x00, 0x18, 0x00, 0xc0, 0x06, 0x00, -// 0x30, 0x03, 0x40, 0x12, 0x00, 0x88, 0x08, 0x60, -// 0xc0, 0xf8, 0x00, - - // '1' (0x31) 13x21, offset 359-394, at +4/-20 - 0x00, 0x00, 0x10, 0x06, 0x00, 0xe2, 0x00, 0x40, - 0x06, 0x00, 0x68, 0x00, 0x00, 0x07, 0x00, 0xe0, - 0xff, 0xff, 0x07, 0x00, 0x80, 0x00, 0x00, 0x10, - 0x00, 0x00, 0x02, 0x00, 0x40, 0x00, 0x00, 0x08, - 0x00, 0x00, 0x01, - // in regular row-major format -// 0x06, 0x00, 0x70, 0x06, 0x80, 0x64, 0x06, 0x20, -// 0x31, 0x00, 0x08, 0x00, 0x40, 0x02, 0x00, 0x10, -// 0x00, 0x80, 0x04, 0x00, 0x20, 0x01, 0x00, 0x08, -// 0x00, 0x40, 0x02, 0x00, 0x10, 0x00, 0x80, 0x04, -// 0x0f, 0xff, 0x80, - - // '2' (0x32) 13x21, offset 394-429, at +3/-20 - 0x00, 0x00, 0x18, 0x03, 0x80, 0x13, 0x00, 0x58, - 0x01, 0x80, 0x39, 0x00, 0x18, 0x03, 0x80, 0x61, - 0x00, 0x18, 0x0c, 0x80, 0x81, 0x01, 0x18, 0x50, - 0x80, 0x01, 0x0a, 0x08, 0x40, 0xc6, 0x00, 0x08, - 0x07, 0xe0, 0x01, - // in regular row-major format -// 0x0f, 0x80, 0xc3, 0x08, 0x04, 0x80, 0x24, 0x00, -// 0x80, 0x04, 0x00, 0x20, 0x02, 0x00, 0x10, 0x01, -// 0x00, 0x10, 0x01, 0x80, 0x18, 0x01, 0x80, 0x18, -// 0x01, 0x80, 0x18, 0x01, 0x80, 0x58, 0x03, 0x80, -// 0x1f, 0xff, 0x80, - - // '3' (0x33) 14x21, offset 429-466, at +3/-20 - 0x00, 0x00, 0x84, 0x00, 0x80, 0x19, 0x00, 0x20, - 0x01, 0x00, 0x14, 0x00, 0x00, 0x03, 0x00, 0x60, - 0x80, 0x00, 0x0c, 0x10, 0x80, 0x01, 0x02, 0x30, - 0xc0, 0x00, 0x0a, 0x14, 0x20, 0x42, 0x04, 0x86, - 0x07, 0x61, 0x00, 0xc0, 0x03, - // in regular row-major format -// 0x0f, 0xc0, 0xc0, 0x86, 0x01, 0x00, 0x02, 0x00, -// 0x08, 0x00, 0x20, 0x00, 0x80, 0x04, 0x00, 0x20, -// 0x0f, 0x00, 0x06, 0x00, 0x04, 0x00, 0x08, 0x00, -// 0x10, 0x00, 0x40, 0x01, 0x00, 0x04, 0x00, 0x2c, -// 0x01, 0x9c, 0x0c, 0x0f, 0xc0, - - // '4' (0x34) 12x21, offset 466-498, at +4/-20 - 0x00, 0x60, 0x00, 0x00, 0x0b, 0x00, 0x18, 0x01, - 0xc0, 0x20, 0x00, 0x0e, 0x04, 0x70, 0x80, 0x20, - 0x03, 0x10, 0x1c, 0x00, 0x82, 0x01, 0x40, 0xf0, - 0xff, 0xff, 0x03, 0x00, 0x41, 0x00, 0x20, 0x08, - // in regular row-major format -// 0x01, 0xc0, 0x14, 0x02, 0x40, 0x64, 0x04, 0x40, -// 0xc4, 0x08, 0x41, 0x84, 0x10, 0x42, 0x04, 0x20, -// 0x44, 0x04, 0x40, 0x48, 0x04, 0xff, 0xf0, 0x04, -// 0x00, 0x40, 0x04, 0x00, 0x40, 0x04, 0x07, 0xf0, - - // '5' (0x35) 14x21, offset 498-535, at +3/-20 - 0x00, 0x00, 0x06, 0x00, 0x80, 0xfc, 0x07, 0xa0, - 0x80, 0x00, 0x14, 0x08, 0x00, 0x03, 0x01, 0x60, - 0x20, 0x00, 0x0c, 0x04, 0x80, 0x81, 0x00, 0x30, - 0x10, 0x00, 0x07, 0x04, 0xa0, 0x80, 0x01, 0x02, - 0x60, 0x30, 0x00, 0xf0, 0x03, - // in regular row-major format -// 0x3f, 0xf0, 0x80, 0x02, 0x00, 0x08, 0x00, 0x20, -// 0x00, 0x80, 0x02, 0x00, 0x0b, 0xf0, 0x30, 0x30, -// 0x00, 0x60, 0x00, 0x80, 0x01, 0x00, 0x04, 0x00, -// 0x10, 0x00, 0x40, 0x01, 0x00, 0x0e, 0x00, 0x2c, -// 0x01, 0x0c, 0x18, 0x0f, 0xc0, - - // '6' (0x36) 12x21, offset 535-567, at +5/-20 - 0x80, 0x7f, 0x00, 0x1c, 0x76, 0x60, 0x60, 0x10, - 0x06, 0x02, 0x44, 0x60, 0x00, 0x05, 0x04, 0xa0, - 0x80, 0x00, 0x0c, 0x10, 0x80, 0x01, 0x02, 0x38, - 0x80, 0x00, 0x05, 0x60, 0x98, 0x00, 0xf8, 0x01, - // in regular row-major format -// 0x01, 0xf0, 0x60, 0x18, 0x03, 0x00, 0x20, 0x04, -// 0x00, 0x40, 0x0c, 0x00, 0x80, 0x08, 0xf8, 0x98, -// 0x4a, 0x02, 0xe0, 0x3c, 0x01, 0x80, 0x14, 0x01, -// 0x40, 0x14, 0x03, 0x20, 0x21, 0x0c, 0x0f, 0x80, - - // '7' (0x37) 12x21, offset 567-599, at +4/-20 - 0x0f, 0x00, 0x20, 0x00, 0x00, 0x04, 0x00, 0x80, - 0x00, 0x00, 0x10, 0x00, 0x00, 0x02, 0x00, 0x40, - 0x00, 0x80, 0x0f, 0x00, 0x1f, 0x01, 0x3c, 0x20, - 0xf0, 0x00, 0xe4, 0x01, 0x80, 0x07, 0x00, 0x00, - // in regular row-major format -// 0xff, 0xf8, 0x01, 0x80, 0x18, 0x03, 0x00, 0x20, -// 0x02, 0x00, 0x20, 0x04, 0x00, 0x40, 0x04, 0x00, -// 0xc0, 0x08, 0x00, 0x80, 0x18, 0x01, 0x00, 0x10, -// 0x01, 0x00, 0x30, 0x02, 0x00, 0x20, 0x02, 0x00, - - // '8' (0x38) 13x21, offset 599-634, at +4/-20 - 0xf8, 0xe0, 0x83, 0x21, 0xc6, 0x08, 0x28, 0x20, - 0x01, 0x07, 0x1c, 0x40, 0x00, 0x03, 0x08, 0x60, - 0x00, 0x01, 0x0c, 0x20, 0x80, 0x01, 0x04, 0x50, - 0xc0, 0x01, 0x0b, 0x28, 0x20, 0xc6, 0x18, 0x83, - 0x0f, 0x3e, 0x00, - // in regular row-major format -// 0x0f, 0x81, 0x83, 0x10, 0x05, 0x80, 0x38, 0x00, -// 0xc0, 0x06, 0x00, 0x30, 0x03, 0x40, 0x11, 0x83, -// 0x07, 0xf0, 0x60, 0xc4, 0x01, 0x60, 0x0e, 0x00, -// 0x30, 0x01, 0x80, 0x0e, 0x00, 0xd0, 0x04, 0x60, -// 0xc1, 0xfc, 0x00, - - // '9' (0x39) 12x21, offset 634-666, at +5/-20 - 0xf8, 0x01, 0x90, 0x61, 0x00, 0x0a, 0x10, 0xc0, - 0x01, 0x04, 0x18, 0x80, 0x00, 0x03, 0x10, 0x50, - 0x00, 0x02, 0x0a, 0x60, 0x20, 0x02, 0x04, 0x86, - 0x60, 0x60, 0xe0, 0x86, 0x03, 0xe0, 0x1f, 0x00, - // in regular row-major format -// 0x1f, 0x03, 0x08, 0x40, 0x4c, 0x02, 0x80, 0x28, -// 0x02, 0x80, 0x18, 0x03, 0xc0, 0x74, 0x05, 0x21, -// 0x91, 0xf1, 0x00, 0x10, 0x03, 0x00, 0x20, 0x02, -// 0x00, 0x40, 0x0c, 0x01, 0x80, 0x60, 0xf8, 0x00, - - // ':' (0x3a) 5x15, offset 666-676, at +8/-14 - 0x0e, 0xb8, 0x0f, 0xfe, 0x07, 0xff, 0x83, 0xef, - 0x80, 0x03, - // in regular row-major format -// 0x77, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x1d, 0xff, -// 0xfd, 0xc0, - - // ';' (0x3b) 7x20, offset 676-694, at +5/-14 - 0x00, 0x00, 0x0f, 0x00, 0xfe, 0x0e, 0xfc, 0xf3, - 0xc1, 0x0f, 0x1f, 0x3c, 0xf0, 0xc1, 0x00, 0x0e, - 0x00, 0x00, - // in regular row-major format -// 0x1c, 0x7c, 0xf9, 0xf1, 0xc0, 0x00, 0x00, 0x00, -// 0x00, 0xf1, 0xe3, 0x8f, 0x1c, 0x38, 0xe1, 0xc3, -// 0x06, 0x00, - - // '<' (0x3c) 15x16, offset 694-724, at +3/-17 - 0x00, 0x01, 0x80, 0x01, 0x80, 0x03, 0xc0, 0x02, - 0x60, 0x06, 0x20, 0x04, 0x30, 0x0c, 0x10, 0x18, - 0x18, 0x10, 0x08, 0x30, 0x0c, 0x20, 0x04, 0x60, - 0x06, 0x40, 0x03, 0xc0, 0x01, 0x80, - // in regular row-major format -// 0x00, 0x06, 0x00, 0x18, 0x00, 0xe0, 0x07, 0x00, -// 0x38, 0x01, 0xc0, 0x06, 0x00, 0x38, 0x00, 0xe0, -// 0x00, 0x70, 0x00, 0x38, 0x00, 0x18, 0x00, 0x1c, -// 0x00, 0x0e, 0x00, 0x07, 0x00, 0x03, - - // '=' (0x3d) 17x6, offset 724-737, at +2/-12 - 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, - 0x86, 0x61, 0x18, 0x86, 0x21, - // in regular row-major format -// 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, -// 0x00, 0x00, 0x07, 0xff, 0xfc, - - // '>' (0x3e) 15x16, offset 737-767, at +3/-17 - 0x01, 0x80, 0x03, 0xc0, 0x06, 0x40, 0x04, 0x60, - 0x0c, 0x20, 0x08, 0x30, 0x18, 0x10, 0x10, 0x18, - 0x30, 0x0c, 0x20, 0x04, 0x60, 0x06, 0xc0, 0x02, - 0x80, 0x03, 0x80, 0x01, 0x00, 0x01, - // in regular row-major format -// 0xc0, 0x00, 0xc0, 0x00, 0xe0, 0x00, 0x70, 0x00, -// 0x38, 0x00, 0x1c, 0x00, 0x0c, 0x00, 0x0e, 0x00, -// 0x0e, 0x00, 0x70, 0x03, 0x80, 0x0c, 0x00, 0x70, -// 0x03, 0x80, 0x1c, 0x00, 0x60, 0x00, - - // '?' (0x3f) 12x20, offset 767-797, at +5/-19 - 0x1e, 0x00, 0x20, 0x00, 0x00, 0x03, 0x00, 0x10, - 0x00, 0x60, 0x01, 0x00, 0x1f, 0xc0, 0xf1, 0x01, - 0x06, 0x1f, 0x20, 0x60, 0x03, 0x03, 0x20, 0x10, - 0x00, 0x84, 0x00, 0x80, 0x07, 0x00, - // in regular row-major format -// 0x3f, 0x8e, 0x0c, 0x80, 0x28, 0x01, 0x80, 0x10, -// 0x01, 0x00, 0x10, 0x02, 0x00, 0xc0, 0x38, 0x06, -// 0x00, 0x40, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, -// 0x0e, 0x01, 0xf0, 0x1f, 0x00, 0xe0, - - // '@' (0x40) 13x23, offset 797-835, at +4/-20 - 0xe0, 0xff, 0x03, 0x0c, 0x00, 0x86, 0x01, 0x00, - 0x4c, 0x00, 0x00, 0x14, 0xc0, 0x03, 0x0c, 0x10, - 0x03, 0x06, 0x04, 0x01, 0x03, 0x02, 0x81, 0x82, - 0x80, 0x40, 0x41, 0x40, 0x20, 0x21, 0x20, 0x08, - 0xff, 0x1f, 0x04, 0x00, 0x08, 0x00, - // in regular row-major format -// 0x0f, 0x01, 0x86, 0x08, 0x08, 0x80, 0x24, 0x01, -// 0x40, 0x0a, 0x00, 0x50, 0x1e, 0x83, 0x14, 0x20, -// 0xa2, 0x05, 0x10, 0x28, 0x81, 0x46, 0x0a, 0x18, -// 0x50, 0x3f, 0x80, 0x04, 0x00, 0x10, 0x00, 0x80, -// 0x02, 0x00, 0x18, 0x18, 0x3f, 0x00, - - // 'A' (0x41) 21x20, offset 835-888, at +0/-19 - 0x00, 0x00, 0x08, 0x00, 0x80, 0x00, 0x00, 0x18, - 0x00, 0xf0, 0x01, 0xe0, 0x19, 0xc0, 0x83, 0x81, - 0x17, 0x18, 0x0f, 0x01, 0x1f, 0x10, 0x70, 0x00, - 0x01, 0x01, 0x10, 0xf0, 0x00, 0x01, 0x78, 0x10, - 0x00, 0x1e, 0x81, 0x00, 0x1f, 0x08, 0x80, 0x87, - 0x00, 0xc0, 0x0b, 0x00, 0xf0, 0x00, 0x00, 0x08, - 0x00, 0x80, 0x00, 0x00, 0x08, - // in regular row-major format -// 0x1f, 0xf0, 0x00, 0x06, 0x80, 0x00, 0x34, 0x00, -// 0x01, 0x30, 0x00, 0x18, 0x80, 0x00, 0x86, 0x00, -// 0x04, 0x30, 0x00, 0x60, 0x80, 0x02, 0x06, 0x00, -// 0x10, 0x10, 0x01, 0x80, 0x80, 0x08, 0x06, 0x00, -// 0x7f, 0xf0, 0x06, 0x00, 0x80, 0x20, 0x06, 0x01, -// 0x00, 0x10, 0x18, 0x00, 0xc0, 0x80, 0x06, 0x04, -// 0x00, 0x11, 0xfc, 0x0f, 0xf0, - - // 'B' (0x42) 18x20, offset 888-933, at +1/-19 - 0x01, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0xf8, - 0xff, 0xff, 0x01, 0x02, 0x18, 0x20, 0x80, 0x01, - 0x02, 0x18, 0x20, 0x80, 0x01, 0x02, 0x18, 0x20, - 0x80, 0x01, 0x02, 0x18, 0x20, 0x80, 0x01, 0x03, - 0x28, 0x70, 0x80, 0x84, 0x04, 0x8c, 0xc7, 0x40, - 0x00, 0x18, 0x02, 0x00, 0x1e, - // in regular row-major format -// 0xff, 0xf8, 0x04, 0x01, 0x01, 0x00, 0x20, 0x40, -// 0x04, 0x10, 0x01, 0x04, 0x00, 0x41, 0x00, 0x10, -// 0x40, 0x08, 0x10, 0x0c, 0x07, 0xff, 0x01, 0x00, -// 0x70, 0x40, 0x06, 0x10, 0x00, 0x84, 0x00, 0x11, -// 0x00, 0x04, 0x40, 0x01, 0x10, 0x00, 0x44, 0x00, -// 0x21, 0x00, 0x33, 0xff, 0xf8, - - // 'C' (0x43) 17x20, offset 933-976, at +2/-19 - 0xc0, 0x3f, 0x00, 0x03, 0x0c, 0x0c, 0x00, 0x41, - 0x00, 0x20, 0x02, 0x00, 0x24, 0x00, 0x40, 0x01, - 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x18, 0x00, - 0x80, 0x01, 0x00, 0x38, 0x00, 0x80, 0x02, 0x00, - 0x64, 0x00, 0x40, 0x0c, 0x00, 0xf6, 0x03, 0x30, - 0x00, 0x00, 0x01, - // in regular row-major format -// 0x03, 0xf1, 0x06, 0x0e, 0x8c, 0x01, 0xc4, 0x00, -// 0x64, 0x00, 0x12, 0x00, 0x0a, 0x00, 0x01, 0x00, -// 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, -// 0x00, 0x08, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, -// 0x80, 0x00, 0x20, 0x01, 0x88, 0x01, 0x83, 0x03, -// 0x80, 0x7e, 0x00, - - // 'D' (0x44) 16x20, offset 976-1016, at +2/-19 - 0x01, 0x00, 0x18, 0x00, 0x80, 0xff, 0xff, 0x1f, - 0x00, 0x80, 0x01, 0x00, 0x18, 0x00, 0x80, 0x01, - 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x18, 0x00, - 0x80, 0x01, 0x00, 0x28, 0x00, 0x40, 0x06, 0x00, - 0xc6, 0x00, 0x30, 0x30, 0xc0, 0x00, 0xfc, 0x03, - // in regular row-major format -// 0xff, 0xe0, 0x20, 0x18, 0x20, 0x0c, 0x20, 0x04, -// 0x20, 0x02, 0x20, 0x02, 0x20, 0x01, 0x20, 0x01, -// 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, -// 0x20, 0x01, 0x20, 0x01, 0x20, 0x02, 0x20, 0x02, -// 0x20, 0x04, 0x20, 0x0c, 0x20, 0x18, 0xff, 0xe0, - - // 'E' (0x45) 17x20, offset 1016-1059, at +1/-19 - 0x01, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0xf8, - 0xff, 0xff, 0x01, 0x02, 0x18, 0x20, 0x80, 0x01, - 0x02, 0x18, 0x20, 0x80, 0x01, 0x02, 0x18, 0x20, - 0x80, 0x81, 0x0f, 0x18, 0x00, 0x80, 0x01, 0x00, - 0x18, 0x00, 0x80, 0x01, 0x00, 0xf8, 0x01, 0x80, - 0x00, 0xc0, 0x0f, - // in regular row-major format -// 0xff, 0xff, 0x08, 0x00, 0x84, 0x00, 0x42, 0x00, -// 0x21, 0x00, 0x10, 0x80, 0x00, 0x40, 0x00, 0x20, -// 0x40, 0x10, 0x20, 0x0f, 0xf0, 0x04, 0x08, 0x02, -// 0x04, 0x01, 0x00, 0x00, 0x80, 0x00, 0x40, 0x02, -// 0x20, 0x01, 0x10, 0x00, 0x88, 0x00, 0x44, 0x00, -// 0x3f, 0xff, 0xf0, - - // 'F' (0x46) 17x20, offset 1059-1102, at +1/-19 - 0x01, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0xf8, - 0xff, 0xff, 0x01, 0x02, 0x18, 0x20, 0x80, 0x01, - 0x02, 0x18, 0x20, 0x80, 0x01, 0x02, 0x18, 0x20, - 0x80, 0x81, 0x0f, 0x10, 0x00, 0x00, 0x01, 0x00, - 0x10, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, - 0x1f, 0x00, 0x00, - // in regular row-major format -// 0xff, 0xff, 0x88, 0x00, 0x44, 0x00, 0x22, 0x00, -// 0x11, 0x00, 0x08, 0x80, 0x00, 0x40, 0x00, 0x20, -// 0x40, 0x10, 0x20, 0x0f, 0xf0, 0x04, 0x08, 0x02, -// 0x04, 0x01, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, -// 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, -// 0x1f, 0xf8, 0x00, - - // 'G' (0x47) 17x20, offset 1102-1145, at +2/-19 - 0xc0, 0x3f, 0x00, 0x03, 0x0c, 0x08, 0x00, 0x43, - 0x00, 0x20, 0x02, 0x00, 0x24, 0x00, 0x40, 0x01, - 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x18, 0x80, - 0x80, 0x01, 0x08, 0x18, 0x80, 0x80, 0x03, 0x08, - 0x28, 0x80, 0x40, 0x06, 0x08, 0xf4, 0x81, 0x7f, - 0x00, 0x08, 0x00, - // in regular row-major format -// 0x03, 0xf9, 0x06, 0x07, 0x84, 0x00, 0xc4, 0x00, -// 0x24, 0x00, 0x12, 0x00, 0x02, 0x00, 0x01, 0x00, -// 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, -// 0x0f, 0xf8, 0x00, 0x14, 0x00, 0x09, 0x00, 0x04, -// 0x80, 0x02, 0x20, 0x01, 0x18, 0x00, 0x83, 0x01, -// 0xc0, 0x7f, 0x00, - - // 'H' (0x48) 16x20, offset 1145-1185, at +2/-19 - 0x01, 0x00, 0x18, 0x00, 0x80, 0xff, 0xff, 0x1f, - 0x20, 0x80, 0x01, 0x02, 0x18, 0x20, 0x80, 0x00, - 0x02, 0x00, 0x20, 0x00, 0x00, 0x02, 0x00, 0x20, - 0x00, 0x01, 0x02, 0x18, 0x20, 0x80, 0x01, 0x02, - 0xf8, 0xff, 0xff, 0x01, 0x00, 0x18, 0x00, 0x80, - // in regular row-major format -// 0xfc, 0x3f, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, -// 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, -// 0x20, 0x04, 0x3f, 0xfc, 0x20, 0x04, 0x20, 0x04, -// 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, -// 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0xfc, 0x3f, - - // 'I' (0x49) 13x20, offset 1185-1218, at +4/-19 - 0x01, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x18, - 0x00, 0x80, 0x01, 0x00, 0x18, 0x00, 0x80, 0xff, - 0xff, 0x1f, 0x00, 0x80, 0x01, 0x00, 0x18, 0x00, - 0x80, 0x01, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, - 0x08, - // in regular row-major format -// 0xff, 0xf8, 0x10, 0x00, 0x80, 0x04, 0x00, 0x20, -// 0x01, 0x00, 0x08, 0x00, 0x40, 0x02, 0x00, 0x10, -// 0x00, 0x80, 0x04, 0x00, 0x20, 0x01, 0x00, 0x08, -// 0x00, 0x40, 0x02, 0x00, 0x10, 0x00, 0x81, 0xff, -// 0xf0, - - // 'J' (0x4a) 17x20, offset 1218-1261, at +3/-19 - 0x00, 0xf8, 0x01, 0x00, 0x20, 0x00, 0x00, 0x04, - 0x00, 0x40, 0x00, 0x00, 0x08, 0x00, 0x80, 0x01, - 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x18, 0x00, - 0x40, 0x01, 0x00, 0x16, 0x00, 0x30, 0xff, 0xff, - 0x10, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, - 0x01, 0x00, 0x00, - // in regular row-major format -// 0x03, 0xff, 0x80, 0x04, 0x00, 0x02, 0x00, 0x01, -// 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, -// 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x10, -// 0x01, 0x08, 0x00, 0x84, 0x00, 0x42, 0x00, 0x21, -// 0x00, 0x10, 0x80, 0x10, 0x20, 0x18, 0x0c, 0x18, -// 0x01, 0xf0, 0x00, - - // 'K' (0x4b) 18x20, offset 1261-1306, at +1/-19 - 0x01, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0xf8, - 0xff, 0xff, 0x01, 0x0c, 0x18, 0x60, 0x80, 0x01, - 0x03, 0x18, 0x38, 0x80, 0xc0, 0x02, 0x00, 0x66, - 0x00, 0x30, 0x0c, 0x90, 0x81, 0x03, 0x0d, 0xf0, - 0x70, 0x00, 0x3c, 0x03, 0x00, 0x1e, 0x00, 0x80, - 0x01, 0x00, 0x08, 0x00, 0x80, - // in regular row-major format -// 0xff, 0x1f, 0x84, 0x01, 0x81, 0x00, 0xc0, 0x40, -// 0x60, 0x10, 0x30, 0x04, 0x18, 0x01, 0x0c, 0x00, -// 0x46, 0x00, 0x13, 0x00, 0x05, 0xf0, 0x01, 0xc6, -// 0x00, 0x60, 0xc0, 0x10, 0x18, 0x04, 0x06, 0x01, -// 0x00, 0xc0, 0x40, 0x30, 0x10, 0x04, 0x04, 0x01, -// 0x81, 0x00, 0x23, 0xfc, 0x0f, - - // 'L' (0x4c) 15x20, offset 1306-1344, at +3/-19 - 0x01, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x18, - 0x00, 0x80, 0xff, 0xff, 0x1f, 0x00, 0x80, 0x01, - 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x08, 0x00, - 0x80, 0x00, 0x00, 0x08, 0x00, 0x80, 0x00, 0x00, - 0x08, 0x00, 0x80, 0x00, 0xe0, 0x0f, - // in regular row-major format -// 0xff, 0x80, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, -// 0x80, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, -// 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, -// 0x01, 0x00, 0x42, 0x00, 0x84, 0x01, 0x08, 0x02, -// 0x10, 0x04, 0x20, 0x0f, 0xff, 0xf0, - - // 'M' (0x4d) 19x20, offset 1344-1392, at +1/-19 - 0x01, 0x00, 0x18, 0x00, 0x80, 0xff, 0xff, 0x3f, - 0x00, 0x80, 0x0e, 0x00, 0x88, 0x03, 0x80, 0xe0, - 0x01, 0x08, 0x70, 0x00, 0x00, 0x3c, 0x00, 0x00, - 0x03, 0x00, 0x3c, 0x00, 0x70, 0x00, 0xe0, 0x01, - 0x80, 0x03, 0x80, 0x0e, 0x00, 0x38, 0x00, 0x80, - 0xff, 0xff, 0x1f, 0x00, 0x80, 0x01, 0x00, 0x08, - // in regular row-major format -// 0xf0, 0x01, 0xe7, 0x00, 0x70, 0xa0, 0x0a, 0x16, -// 0x03, 0x42, 0x40, 0x48, 0x4c, 0x19, 0x08, 0x82, -// 0x21, 0x10, 0x44, 0x23, 0x18, 0x84, 0x22, 0x10, -// 0x86, 0xc2, 0x10, 0x50, 0x42, 0x0e, 0x08, 0x41, -// 0xc1, 0x08, 0x00, 0x21, 0x00, 0x04, 0x20, 0x00, -// 0x84, 0x00, 0x10, 0x80, 0x02, 0x7f, 0x03, 0xf0, - - // 'N' (0x4e) 18x20, offset 1392-1437, at +1/-19 - 0x01, 0x00, 0x10, 0x00, 0x80, 0x01, 0x00, 0xf8, - 0xff, 0xff, 0x07, 0x00, 0xc8, 0x00, 0x80, 0x30, - 0x00, 0x08, 0x0e, 0x80, 0x80, 0x01, 0x00, 0x60, - 0x00, 0x00, 0x18, 0x10, 0x00, 0x07, 0x01, 0xc0, - 0x10, 0x00, 0x30, 0x01, 0x00, 0xfe, 0xff, 0xff, - 0x01, 0x00, 0x10, 0x00, 0x00, - // in regular row-major format -// 0xf8, 0x1f, 0xc6, 0x00, 0x41, 0xc0, 0x10, 0x50, -// 0x04, 0x12, 0x01, 0x04, 0xc0, 0x41, 0x10, 0x10, -// 0x46, 0x04, 0x10, 0x81, 0x04, 0x10, 0x41, 0x04, -// 0x10, 0x40, 0x84, 0x10, 0x31, 0x04, 0x04, 0x41, -// 0x01, 0x90, 0x40, 0x24, 0x10, 0x05, 0x04, 0x01, -// 0xc1, 0x00, 0x31, 0xfc, 0x0c, - - // 'O' (0x4f) 17x20, offset 1437-1480, at +2/-19 - 0xc0, 0x3f, 0x00, 0x07, 0x0e, 0x18, 0x80, 0x41, - 0x00, 0x20, 0x02, 0x00, 0x24, 0x00, 0x40, 0x01, - 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x18, 0x00, - 0x80, 0x01, 0x00, 0x28, 0x00, 0x40, 0x02, 0x00, - 0x44, 0x00, 0x20, 0x18, 0x80, 0x01, 0x07, 0x0e, - 0x80, 0x3f, 0x00, - // in regular row-major format -// 0x03, 0xe0, 0x06, 0x0c, 0x04, 0x01, 0x04, 0x00, -// 0x46, 0x00, 0x32, 0x00, 0x0b, 0x00, 0x05, 0x00, -// 0x01, 0x80, 0x00, 0xc0, 0x00, 0x60, 0x00, 0x30, -// 0x00, 0x18, 0x00, 0x0e, 0x00, 0x0d, 0x00, 0x04, -// 0xc0, 0x06, 0x20, 0x02, 0x08, 0x02, 0x03, 0x06, -// 0x00, 0x7c, 0x00, - - // 'P' (0x50) 16x20, offset 1480-1520, at +1/-19 - 0x01, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0xf8, - 0xff, 0xff, 0x01, 0x04, 0x18, 0x40, 0x80, 0x01, - 0x04, 0x18, 0x40, 0x80, 0x01, 0x04, 0x18, 0x40, - 0x80, 0x01, 0x04, 0x10, 0x40, 0x00, 0x02, 0x02, - 0x20, 0x30, 0x00, 0x8c, 0x01, 0x80, 0x0f, 0x00, - // in regular row-major format -// 0xff, 0xf0, 0x10, 0x0c, 0x10, 0x02, 0x10, 0x03, -// 0x10, 0x01, 0x10, 0x01, 0x10, 0x01, 0x10, 0x03, -// 0x10, 0x06, 0x10, 0x0c, 0x1f, 0xf0, 0x10, 0x00, -// 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, -// 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0xff, 0xc0, - - // 'Q' (0x51) 17x24, offset 1520-1571, at +2/-19 - 0xc0, 0x3f, 0x00, 0x70, 0xe0, 0x00, 0x18, 0x80, - 0x01, 0x04, 0x00, 0xc2, 0x02, 0x00, 0xc4, 0x02, - 0x00, 0xec, 0x01, 0x00, 0x78, 0x01, 0x00, 0x58, - 0x01, 0x00, 0x48, 0x01, 0x00, 0x48, 0x01, 0x00, - 0x48, 0x02, 0x00, 0x44, 0x02, 0x00, 0x84, 0x04, - 0x00, 0x82, 0x18, 0x80, 0x81, 0x70, 0xe0, 0xc0, - 0xc0, 0x3f, 0x40, - // in regular row-major format -// 0x03, 0xe0, 0x06, 0x0c, 0x04, 0x01, 0x04, 0x00, -// 0x46, 0x00, 0x32, 0x00, 0x0b, 0x00, 0x07, 0x00, -// 0x01, 0x80, 0x00, 0xc0, 0x00, 0x60, 0x00, 0x30, -// 0x00, 0x18, 0x00, 0x0e, 0x00, 0x0d, 0x00, 0x04, -// 0xc0, 0x06, 0x20, 0x02, 0x08, 0x02, 0x03, 0x06, -// 0x00, 0xfc, 0x00, 0x30, 0x00, 0x30, 0x00, 0x7f, -// 0xc6, 0x38, 0x1e, - - // 'R' (0x52) 19x20, offset 1571-1619, at +1/-19 - 0x01, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0xf8, - 0xff, 0xff, 0x01, 0x04, 0x18, 0x40, 0x80, 0x01, - 0x04, 0x18, 0x40, 0x80, 0x01, 0x04, 0x10, 0x40, - 0x00, 0x01, 0x0c, 0x10, 0xe0, 0x01, 0x02, 0x32, - 0x20, 0x30, 0x06, 0x8c, 0xc1, 0x81, 0x0f, 0x70, - 0x00, 0x00, 0x0c, 0x00, 0x80, 0x00, 0x00, 0x08, - // in regular row-major format -// 0xff, 0xf0, 0x02, 0x01, 0x80, 0x40, 0x08, 0x08, -// 0x01, 0x81, 0x00, 0x10, 0x20, 0x02, 0x04, 0x00, -// 0x40, 0x80, 0x18, 0x10, 0x06, 0x02, 0x03, 0x80, -// 0x7f, 0xc0, 0x08, 0x18, 0x01, 0x01, 0x80, 0x20, -// 0x18, 0x04, 0x01, 0x80, 0x80, 0x10, 0x10, 0x03, -// 0x02, 0x00, 0x20, 0x40, 0x06, 0x7f, 0x80, 0x70, - - // 'S' (0x53) 14x20, offset 1619-1654, at +3/-19 - 0x00, 0xc0, 0x8f, 0x07, 0x20, 0x84, 0x01, 0x24, - 0x10, 0x40, 0x03, 0x03, 0x18, 0x20, 0x80, 0x01, - 0x02, 0x18, 0x20, 0x80, 0x01, 0x06, 0x38, 0x40, - 0x80, 0x02, 0x04, 0x64, 0xc0, 0x40, 0x1f, 0x18, - 0x03, 0x00, 0x1f, - // in regular row-major format -// 0x0f, 0xc8, 0x61, 0xe2, 0x01, 0x90, 0x02, 0x40, -// 0x09, 0x00, 0x04, 0x00, 0x08, 0x00, 0x38, 0x00, -// 0x3e, 0x00, 0x0f, 0x00, 0x06, 0x00, 0x0c, 0x00, -// 0x18, 0x00, 0x60, 0x01, 0x80, 0x0f, 0x00, 0x2b, -// 0x03, 0x23, 0xf0, - - // 'T' (0x54) 15x20, offset 1654-1692, at +3/-19 - 0x1f, 0x00, 0x10, 0x00, 0x00, 0x01, 0x00, 0x18, - 0x00, 0x80, 0x01, 0x00, 0x18, 0x00, 0x80, 0x01, - 0x00, 0xf8, 0xff, 0xff, 0x01, 0x00, 0x18, 0x00, - 0x80, 0x01, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, - 0x18, 0x00, 0x00, 0x1f, 0x00, 0x00, - // in regular row-major format -// 0xff, 0xff, 0x02, 0x06, 0x04, 0x0c, 0x08, 0x18, -// 0x10, 0x20, 0x20, 0x00, 0x40, 0x00, 0x80, 0x01, -// 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, -// 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x01, 0x00, -// 0x02, 0x00, 0x04, 0x01, 0xff, 0xc0, - - // 'U' (0x55) 17x20, offset 1692-1735, at +2/-19 - 0x01, 0x00, 0x10, 0x00, 0x00, 0xff, 0xff, 0x10, - 0x00, 0x30, 0x01, 0x00, 0x16, 0x00, 0x40, 0x00, - 0x00, 0x08, 0x00, 0x80, 0x00, 0x00, 0x08, 0x00, - 0x80, 0x00, 0x00, 0x18, 0x00, 0x40, 0x01, 0x00, - 0x16, 0x00, 0x30, 0xff, 0xff, 0x10, 0x00, 0x00, - 0x01, 0x00, 0x00, - // in regular row-major format -// 0xfc, 0x1f, 0x90, 0x01, 0x08, 0x00, 0x84, 0x00, -// 0x42, 0x00, 0x21, 0x00, 0x10, 0x80, 0x08, 0x40, -// 0x04, 0x20, 0x02, 0x10, 0x01, 0x08, 0x00, 0x84, -// 0x00, 0x42, 0x00, 0x21, 0x00, 0x10, 0x80, 0x08, -// 0x40, 0x04, 0x10, 0x04, 0x0c, 0x06, 0x03, 0x06, -// 0x00, 0x7c, 0x00, - - // 'V' (0x56) 21x20, offset 1735-1788, at +0/-19 - 0x01, 0x00, 0x10, 0x00, 0x00, 0x01, 0x00, 0xf0, - 0x00, 0x00, 0x79, 0x00, 0x10, 0x3e, 0x00, 0x01, - 0x0f, 0x00, 0x80, 0x07, 0x00, 0xc0, 0x03, 0x00, - 0xf0, 0x00, 0x00, 0x0c, 0x00, 0xf0, 0x00, 0xe0, - 0x01, 0x80, 0x03, 0x01, 0x0f, 0x10, 0x1e, 0x00, - 0x79, 0x00, 0xf0, 0x00, 0x00, 0x01, 0x00, 0x10, - 0x00, 0x00, 0x01, 0x00, 0x00, - // in regular row-major format -// 0xfe, 0x03, 0xf8, 0x80, 0x02, 0x04, 0x00, 0x10, -// 0x30, 0x01, 0x80, 0x80, 0x08, 0x06, 0x00, 0xc0, -// 0x30, 0x06, 0x00, 0x80, 0x20, 0x06, 0x03, 0x00, -// 0x30, 0x10, 0x00, 0x80, 0x80, 0x06, 0x0c, 0x00, -// 0x10, 0x40, 0x00, 0x86, 0x00, 0x06, 0x20, 0x00, -// 0x11, 0x00, 0x00, 0xd8, 0x00, 0x06, 0x80, 0x00, -// 0x1c, 0x00, 0x00, 0xe0, 0x00, - - // 'W' (0x57) 19x20, offset 1788-1836, at +1/-19 - 0x01, 0x00, 0x70, 0x00, 0x00, 0xf9, 0x07, 0x10, - 0x80, 0x3f, 0x01, 0x00, 0x1c, 0x00, 0xf8, 0x00, - 0xf0, 0x00, 0xf0, 0x01, 0xe0, 0x03, 0x00, 0x02, - 0x00, 0xc0, 0x03, 0x00, 0xe0, 0x01, 0x01, 0xe0, - 0x11, 0x00, 0xe0, 0x01, 0x00, 0x1c, 0xe0, 0xff, - 0xff, 0x1f, 0xf0, 0x00, 0x00, 0x01, 0x00, 0x00, - // in regular row-major format -// 0xfc, 0x0f, 0xe8, 0x00, 0x19, 0x00, 0x03, 0x10, -// 0x00, 0x62, 0x00, 0x08, 0x41, 0x81, 0x08, 0x28, -// 0x21, 0x05, 0x04, 0x21, 0xa0, 0x84, 0x36, 0x30, -// 0x84, 0x46, 0x08, 0x88, 0xc1, 0x31, 0x18, 0x24, -// 0x12, 0x04, 0x82, 0x40, 0xb0, 0x48, 0x14, 0x09, -// 0x02, 0x80, 0xa0, 0x30, 0x1c, 0x06, 0x03, 0x80, - - // 'X' (0x58) 19x20, offset 1836-1884, at +1/-19 - 0x00, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x7c, - 0x00, 0xe0, 0x0d, 0x80, 0x9b, 0x03, 0x8c, 0x71, - 0x60, 0x08, 0x8c, 0x03, 0x80, 0x0f, 0x00, 0x60, - 0x00, 0x80, 0x0f, 0x00, 0x8c, 0x03, 0x71, 0x60, - 0x98, 0x01, 0x9c, 0x0f, 0x80, 0x7b, 0x00, 0xe0, - 0x01, 0x00, 0x1c, 0x00, 0x80, 0x00, 0x00, 0x08, - // in regular row-major format -// 0x7e, 0x0f, 0xc2, 0x00, 0x60, 0x60, 0x0c, 0x06, -// 0x03, 0x00, 0x60, 0xc0, 0x0c, 0x10, 0x00, 0xc6, -// 0x00, 0x0d, 0x80, 0x00, 0xa0, 0x00, 0x1c, 0x00, -// 0x03, 0x80, 0x00, 0xd8, 0x00, 0x11, 0x00, 0x06, -// 0x30, 0x01, 0x83, 0x00, 0x60, 0x30, 0x08, 0x06, -// 0x03, 0x00, 0x60, 0xc0, 0x06, 0x7f, 0x07, 0xf0, - - // 'Y' (0x59) 17x20, offset 1884-1927, at +2/-19 - 0x01, 0x00, 0x10, 0x00, 0x00, 0x03, 0x00, 0xf0, - 0x00, 0x80, 0x19, 0x00, 0x18, 0x07, 0x80, 0xc0, - 0x01, 0x08, 0x30, 0x80, 0x00, 0xfe, 0x0f, 0x30, - 0x80, 0xc0, 0x01, 0x18, 0x07, 0x80, 0x19, 0x00, - 0xf8, 0x00, 0x80, 0x03, 0x00, 0x10, 0x00, 0x00, - 0x01, 0x00, 0x00, - // in regular row-major format -// 0xfc, 0x1f, 0x98, 0x03, 0x04, 0x01, 0x03, 0x01, -// 0x80, 0xc1, 0x80, 0x20, 0x80, 0x18, 0xc0, 0x04, -// 0x40, 0x03, 0x60, 0x00, 0xe0, 0x00, 0x20, 0x00, -// 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, -// 0x01, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, -// 0x03, 0xff, 0x80, - - // 'Z' (0x5a) 13x20, offset 1927-1960, at +4/-19 - 0x3f, 0x00, 0x1e, 0x00, 0x90, 0x01, 0xc0, 0x18, - 0x00, 0x82, 0x01, 0x18, 0x18, 0x40, 0x80, 0x01, - 0x03, 0x18, 0x08, 0x80, 0x61, 0x00, 0x18, 0x01, - 0x80, 0x0d, 0x00, 0x38, 0x00, 0x80, 0x00, 0xe0, - 0x0f, - // in regular row-major format -// 0xff, 0xf4, 0x00, 0xa0, 0x09, 0x00, 0x48, 0x04, -// 0x40, 0x40, 0x02, 0x00, 0x20, 0x02, 0x00, 0x10, -// 0x01, 0x00, 0x10, 0x00, 0x80, 0x08, 0x04, 0x80, -// 0x24, 0x01, 0x40, 0x0c, 0x00, 0x60, 0x03, 0xff, -// 0xf0, - - // '[' (0x5b) 5x25, offset 1960-1976, at +10/-20 - 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x06, 0x00, - 0x00, 0x0c, 0x00, 0x00, 0x18, 0x00, 0x00, 0x10, - // in regular row-major format -// 0xfc, 0x21, 0x08, 0x42, 0x10, 0x84, 0x21, 0x08, -// 0x42, 0x10, 0x84, 0x21, 0x08, 0x42, 0x10, 0xf8, - - // '\' (0x5c) 13x26, offset 1976-2019, at +4/-22 - 0x01, 0x00, 0x00, 0x38, 0x00, 0x00, 0x80, 0x03, - 0x00, 0x00, 0x38, 0x00, 0x00, 0x80, 0x03, 0x00, - 0x00, 0x30, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, - 0x30, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x30, - 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x30, 0x00, - 0x00, 0x00, 0x03, - // in regular row-major format -// 0x80, 0x02, 0x00, 0x10, 0x00, 0xc0, 0x02, 0x00, -// 0x18, 0x00, 0x40, 0x03, 0x00, 0x08, 0x00, 0x40, -// 0x01, 0x00, 0x08, 0x00, 0x20, 0x01, 0x00, 0x04, -// 0x00, 0x20, 0x00, 0x80, 0x04, 0x00, 0x10, 0x00, -// 0x80, 0x02, 0x00, 0x10, 0x00, 0x40, 0x02, 0x00, -// 0x08, 0x00, 0x40, - - // ']' (0x5d) 5x25, offset 2019-2035, at +6/-20 - 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, - 0x00, 0x0c, 0x00, 0x00, 0xf8, 0xff, 0xff, 0x1f, - // in regular row-major format -// 0xf8, 0x42, 0x10, 0x84, 0x21, 0x08, 0x42, 0x10, -// 0x84, 0x21, 0x08, 0x42, 0x10, 0x84, 0x21, 0xf8, - - // '^' (0x5e) 13x9, offset 2035-2050, at +4/-20 - 0x80, 0x81, 0x81, 0x81, 0xc1, 0xc1, 0xc0, 0x00, - 0x03, 0x1c, 0x60, 0x80, 0x01, 0x06, 0x18, - // in regular row-major format -// 0x02, 0x00, 0x38, 0x03, 0x60, 0x11, 0x01, 0x8c, -// 0x18, 0x31, 0x80, 0xd8, 0x03, 0x80, 0x08, - - // '_' (0x5f) 21x1, offset 2050-2053, at +0/+4 - 0xff, 0xff, 0x1f, - // in regular row-major format -// 0xff, 0xff, 0xf8, - - // '`' (0x60) 6x5, offset 2053-2057, at +5/-21 - 0x61, 0x18, 0x86, 0x21, - // in regular row-major format -// 0xc1, 0x83, 0x06, 0x0c, - - // 'a' (0x61) 16x15, offset 2057-2087, at +3/-14 - 0x00, 0x1e, 0x81, 0x90, 0x20, 0x58, 0x10, 0x18, - 0x04, 0x0c, 0x02, 0x06, 0x01, 0x83, 0x80, 0x41, - 0xe0, 0x20, 0x90, 0x10, 0xcc, 0x08, 0x82, 0xff, - 0x07, 0x00, 0x02, 0x00, 0x01, 0x80, - // in regular row-major format -// 0x0f, 0xc0, 0x70, 0x30, 0x00, 0x10, 0x00, 0x08, -// 0x00, 0x08, 0x00, 0x08, 0x0f, 0xf8, 0x30, 0x08, -// 0x40, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, -// 0x80, 0x38, 0x60, 0xe8, 0x3f, 0x8f, - - // 'b' (0x62) 18x21, offset 2087-2135, at +1/-20 - 0x01, 0x00, 0x30, 0x00, 0x00, 0x06, 0x00, 0xc0, - 0xff, 0xff, 0x0f, 0x60, 0x70, 0x00, 0x02, 0x18, - 0x20, 0x00, 0x02, 0x04, 0xc0, 0x40, 0x00, 0x10, - 0x08, 0x00, 0x02, 0x01, 0x40, 0x20, 0x00, 0x08, - 0x04, 0x00, 0x01, 0x01, 0x10, 0x20, 0x00, 0x02, - 0x08, 0x20, 0x00, 0x06, 0x03, 0x00, 0x1f, 0x00, - // in regular row-major format -// 0xf0, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x40, -// 0x00, 0x10, 0x00, 0x04, 0x00, 0x01, 0x0f, 0x80, -// 0x4c, 0x18, 0x14, 0x01, 0x06, 0x00, 0x21, 0x80, -// 0x08, 0x40, 0x01, 0x10, 0x00, 0x44, 0x00, 0x11, -// 0x00, 0x04, 0x40, 0x01, 0x18, 0x00, 0x86, 0x00, -// 0x21, 0xc0, 0x10, 0x5c, 0x18, 0xf1, 0xf8, 0x00, - - // 'c' (0x63) 15x15, offset 2135-2164, at +3/-14 - 0xe0, 0x07, 0x0c, 0x06, 0x01, 0x44, 0x00, 0x24, - 0x00, 0x0a, 0x00, 0x06, 0x00, 0x03, 0x80, 0x01, - 0xc0, 0x00, 0xe0, 0x00, 0x58, 0x00, 0x64, 0x00, - 0xfb, 0x80, 0x00, 0x20, 0x00, - // in regular row-major format -// 0x07, 0xe4, 0x30, 0x78, 0x80, 0x32, 0x00, 0x24, -// 0x00, 0x50, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, -// 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x12, 0x00, -// 0xc3, 0x07, 0x01, 0xf8, 0x00, - - // 'd' (0x64) 18x21, offset 2164-2212, at +2/-20 - 0x00, 0xf8, 0x01, 0xc0, 0x60, 0x00, 0x04, 0x10, - 0x40, 0x00, 0x04, 0x08, 0x80, 0x81, 0x00, 0x20, - 0x10, 0x00, 0x04, 0x02, 0x80, 0x40, 0x00, 0x10, - 0x08, 0x00, 0x02, 0x02, 0xe0, 0x40, 0x00, 0x14, - 0x10, 0xc0, 0x02, 0x0c, 0xce, 0xff, 0xff, 0x07, - 0x00, 0x80, 0x00, 0x00, 0x10, 0x00, 0x00, 0x02, - // in regular row-major format -// 0x00, 0x1e, 0x00, 0x00, 0x80, 0x00, 0x20, 0x00, -// 0x08, 0x00, 0x02, 0x00, 0x00, 0x80, 0x7c, 0x20, -// 0x60, 0xc8, 0x20, 0x0a, 0x10, 0x01, 0x84, 0x00, -// 0x62, 0x00, 0x08, 0x80, 0x02, 0x20, 0x00, 0x88, -// 0x00, 0x22, 0x00, 0x08, 0xc0, 0x06, 0x10, 0x01, -// 0x82, 0x00, 0xe0, 0x60, 0xe8, 0x0f, 0xe3, 0xc0, - - // 'e' (0x65) 16x15, offset 2212-2242, at +2/-14 - 0xe0, 0x03, 0xfc, 0x07, 0x23, 0xc6, 0x10, 0x22, - 0x08, 0x1a, 0x04, 0x05, 0x02, 0x03, 0x81, 0x81, - 0xc0, 0x40, 0x60, 0x20, 0x50, 0x10, 0x68, 0x08, - 0x62, 0x04, 0xe1, 0xc2, 0xe0, 0x21, - // in regular row-major format -// 0x07, 0xe0, 0x1c, 0x18, 0x30, 0x0c, 0x60, 0x06, -// 0x40, 0x03, 0xc0, 0x03, 0xc0, 0x01, 0xff, 0xff, -// 0xc0, 0x00, 0xc0, 0x00, 0x40, 0x00, 0x60, 0x00, -// 0x30, 0x03, 0x0c, 0x0e, 0x03, 0xf0, - - // 'f' (0x66) 14x21, offset 2242-2279, at +4/-20 - 0x40, 0x00, 0x10, 0x08, 0x00, 0x02, 0x01, 0x40, - 0x20, 0x00, 0xc8, 0xff, 0xff, 0x85, 0x00, 0xe0, - 0x10, 0x00, 0x0c, 0x02, 0x80, 0x41, 0x00, 0x30, - 0x08, 0x00, 0x06, 0x01, 0xc0, 0x20, 0x00, 0x18, - 0x04, 0x00, 0x02, 0x00, 0x00, - // in regular row-major format -// 0x03, 0xfc, 0x18, 0x00, 0x80, 0x02, 0x00, 0x08, -// 0x00, 0x20, 0x0f, 0xff, 0x82, 0x00, 0x08, 0x00, -// 0x20, 0x00, 0x80, 0x02, 0x00, 0x08, 0x00, 0x20, -// 0x00, 0x80, 0x02, 0x00, 0x08, 0x00, 0x20, 0x00, -// 0x80, 0x02, 0x00, 0xff, 0xf0, - - // 'g' (0x67) 17x22, offset 2279-2326, at +2/-14 - 0xf0, 0x03, 0x00, 0x07, 0x03, 0x60, 0x00, 0x01, - 0x08, 0x80, 0x00, 0x03, 0x60, 0x60, 0x00, 0x10, - 0x18, 0x00, 0x04, 0x06, 0x00, 0x81, 0x01, 0x40, - 0xe0, 0x00, 0x18, 0x28, 0x00, 0x02, 0x1a, 0x40, - 0x40, 0x1c, 0x0c, 0xc8, 0xff, 0xff, 0x11, 0x00, - 0x00, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, - // in regular row-major format -// 0x0f, 0xc7, 0x9c, 0x3a, 0x18, 0x07, 0x08, 0x01, -// 0x8c, 0x00, 0xc4, 0x00, 0x22, 0x00, 0x11, 0x00, -// 0x08, 0x80, 0x04, 0x40, 0x02, 0x10, 0x03, 0x08, -// 0x01, 0x82, 0x01, 0x40, 0xc3, 0x20, 0x3f, 0x10, -// 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, -// 0x00, 0x01, 0x00, 0x01, 0x00, 0x7f, 0x00, - - // 'h' (0x68) 17x21, offset 2326-2371, at +1/-20 - 0x01, 0x00, 0x20, 0x00, 0x00, 0x06, 0x00, 0xc0, - 0xff, 0xff, 0x0f, 0x30, 0x00, 0x01, 0x03, 0x20, - 0x20, 0x00, 0x00, 0x02, 0x00, 0x40, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, - 0x08, 0x00, 0x01, 0x03, 0x20, 0x80, 0xff, 0x07, - 0x00, 0x80, 0x00, 0x00, 0x10, - // in regular row-major format -// 0xf0, 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, -// 0x01, 0x00, 0x00, 0x80, 0x00, 0x47, 0xc0, 0x2c, -// 0x18, 0x1c, 0x04, 0x0c, 0x01, 0x04, 0x00, 0x82, -// 0x00, 0x41, 0x00, 0x20, 0x80, 0x10, 0x40, 0x08, -// 0x20, 0x04, 0x10, 0x02, 0x08, 0x01, 0x04, 0x00, -// 0x82, 0x00, 0x47, 0xc0, 0xf8, - - // 'i' (0x69) 14x22, offset 2371-2410, at +4/-21 - 0x00, 0x00, 0x20, 0x20, 0x00, 0x08, 0x08, 0x00, - 0x02, 0x02, 0x80, 0x80, 0x00, 0xe0, 0x23, 0x00, - 0xf8, 0xf8, 0xff, 0x03, 0x00, 0x80, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x08, 0x00, 0x00, 0x02, 0x00, - 0x80, 0x00, 0x00, 0x20, 0x00, 0x00, 0x08, - // in regular row-major format -// 0x06, 0x00, 0x18, 0x00, 0x60, 0x01, 0x80, 0x00, -// 0x00, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x02, 0x00, -// 0x08, 0x00, 0x20, 0x00, 0x80, 0x02, 0x00, 0x08, -// 0x00, 0x20, 0x00, 0x80, 0x02, 0x00, 0x08, 0x00, -// 0x20, 0x00, 0x80, 0x02, 0x03, 0xff, 0xf0, - - // 'j' (0x6a) 10x29, offset 2410-2447, at +5/-21 - 0x80, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x02, - 0x02, 0x00, 0x40, 0x40, 0x00, 0x00, 0x08, 0x08, - 0x00, 0x00, 0x01, 0x01, 0x00, 0xe0, 0x23, 0x00, - 0x00, 0x7c, 0x04, 0x00, 0x40, 0x80, 0x00, 0x00, - 0x0c, 0xf0, 0xff, 0x7f, 0x00, - // in regular row-major format -// 0x03, 0x00, 0xc0, 0x30, 0x0c, 0x00, 0x00, 0x00, -// 0x03, 0xff, 0x00, 0x40, 0x10, 0x04, 0x01, 0x00, -// 0x40, 0x10, 0x04, 0x01, 0x00, 0x40, 0x10, 0x04, -// 0x01, 0x00, 0x40, 0x10, 0x04, 0x01, 0x00, 0x40, -// 0x10, 0x08, 0x06, 0xfe, 0x00, - - // 'k' (0x6b) 16x21, offset 2447-2489, at +2/-20 - 0x01, 0x00, 0x30, 0x00, 0x00, 0x06, 0x00, 0xc0, - 0xff, 0xff, 0x0f, 0x00, 0x03, 0x00, 0x30, 0x00, - 0x00, 0x0f, 0x00, 0x30, 0x03, 0x40, 0xc3, 0x00, - 0x68, 0x30, 0x00, 0x07, 0x4c, 0x60, 0x00, 0x0f, - 0x04, 0xc0, 0x81, 0x00, 0x30, 0x10, 0x00, 0x04, - 0x00, 0x80, - // in regular row-major format -// 0xf0, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, -// 0x10, 0x00, 0x10, 0x00, 0x10, 0xfe, 0x10, 0x30, -// 0x10, 0xe0, 0x11, 0xc0, 0x13, 0x00, 0x16, 0x00, -// 0x1e, 0x00, 0x1b, 0x00, 0x11, 0x80, 0x10, 0xc0, -// 0x10, 0x60, 0x10, 0x30, 0x10, 0x18, 0x10, 0x1c, -// 0xf0, 0x3f, - - // 'l' (0x6c) 14x21, offset 2489-2526, at +4/-20 - 0x00, 0x00, 0x30, 0x00, 0x00, 0x06, 0x00, 0xc0, - 0x00, 0x00, 0x18, 0x00, 0x00, 0x03, 0x00, 0xe0, - 0xff, 0xff, 0x07, 0x00, 0x80, 0x00, 0x00, 0x10, - 0x00, 0x00, 0x02, 0x00, 0x40, 0x00, 0x00, 0x08, - 0x00, 0x00, 0x01, 0x00, 0x20, - // in regular row-major format -// 0x7e, 0x00, 0x08, 0x00, 0x20, 0x00, 0x80, 0x02, -// 0x00, 0x08, 0x00, 0x20, 0x00, 0x80, 0x02, 0x00, -// 0x08, 0x00, 0x20, 0x00, 0x80, 0x02, 0x00, 0x08, -// 0x00, 0x20, 0x00, 0x80, 0x02, 0x00, 0x08, 0x00, -// 0x20, 0x00, 0x80, 0xff, 0xfc, - - // 'm' (0x6d) 19x15, offset 2526-2562, at +1/-14 - 0x01, 0xc0, 0x00, 0xe0, 0xff, 0xdf, 0x00, 0x38, - 0x00, 0x0c, 0x00, 0x04, 0x00, 0x02, 0x00, 0x03, - 0x00, 0xff, 0xbf, 0x01, 0x70, 0x00, 0x18, 0x00, - 0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0xfc, 0x7f, - 0x00, 0x20, 0x00, 0x10, - // in regular row-major format -// 0xef, 0x9e, 0x07, 0x1e, 0x20, 0xc1, 0x82, 0x10, -// 0x20, 0x42, 0x04, 0x08, 0x40, 0x81, 0x08, 0x10, -// 0x21, 0x02, 0x04, 0x20, 0x40, 0x84, 0x08, 0x10, -// 0x81, 0x02, 0x10, 0x20, 0x42, 0x04, 0x08, 0x40, -// 0x81, 0x3e, 0x1c, 0x38, - - // 'n' (0x6e) 17x15, offset 2562-2594, at +1/-14 - 0x00, 0xc0, 0x00, 0x60, 0x00, 0xf0, 0xff, 0xcf, - 0x00, 0x34, 0x00, 0x0a, 0x00, 0x02, 0x00, 0x01, - 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x20, 0x00, - 0x34, 0x00, 0xe2, 0xff, 0x01, 0x80, 0x00, 0x40, - // in regular row-major format -// 0x71, 0xf0, 0x0b, 0x06, 0x07, 0x01, 0x03, 0x00, -// 0x41, 0x00, 0x20, 0x80, 0x10, 0x40, 0x08, 0x20, -// 0x04, 0x10, 0x02, 0x08, 0x01, 0x04, 0x00, 0x82, -// 0x00, 0x41, 0x00, 0x20, 0x80, 0x13, 0xf0, 0x3e, - - // 'o' (0x6f) 15x15, offset 2594-2623, at +3/-14 - 0xe0, 0x03, 0x0c, 0x06, 0x01, 0x44, 0x00, 0x24, - 0x00, 0x0a, 0x00, 0x06, 0x00, 0x03, 0x80, 0x01, - 0xc0, 0x00, 0xa0, 0x00, 0x48, 0x00, 0x44, 0x00, - 0xc1, 0x60, 0x80, 0x0f, 0x00, - // in regular row-major format -// 0x07, 0xc0, 0x30, 0x60, 0x80, 0x22, 0x00, 0x24, -// 0x00, 0x50, 0x00, 0x60, 0x00, 0xc0, 0x01, 0x80, -// 0x03, 0x00, 0x05, 0x00, 0x12, 0x00, 0x22, 0x00, -// 0x83, 0x06, 0x01, 0xf0, 0x00, - - // 'p' (0x70) 18x22, offset 2623-2673, at +1/-14 - 0x01, 0x00, 0x60, 0x00, 0x00, 0x18, 0x00, 0x00, - 0xfe, 0xff, 0xff, 0x1c, 0x0c, 0xa0, 0x01, 0x04, - 0x28, 0x00, 0x02, 0x0e, 0x80, 0x80, 0x01, 0x40, - 0x40, 0x00, 0x10, 0x10, 0x00, 0x04, 0x04, 0x00, - 0x01, 0x01, 0x40, 0xc0, 0x00, 0x08, 0x20, 0x00, - 0x02, 0x10, 0x40, 0x00, 0x18, 0x0c, 0x00, 0xfc, - 0x00, 0x00, - // in regular row-major format -// 0xf1, 0xfc, 0x05, 0xc1, 0x81, 0xc0, 0x10, 0x60, -// 0x02, 0x18, 0x00, 0xc4, 0x00, 0x11, 0x00, 0x04, -// 0x40, 0x01, 0x10, 0x00, 0x44, 0x00, 0x11, 0x80, -// 0x08, 0x60, 0x02, 0x14, 0x01, 0x04, 0xc1, 0x81, -// 0x0f, 0x80, 0x40, 0x00, 0x10, 0x00, 0x04, 0x00, -// 0x01, 0x00, 0x00, 0x40, 0x00, 0x10, 0x00, 0x3f, -// 0xc0, 0x00, - - // 'q' (0x71) 18x22, offset 2673-2723, at +2/-14 - 0xf0, 0x03, 0x00, 0x07, 0x03, 0x40, 0x00, 0x01, - 0x08, 0x80, 0x00, 0x03, 0x20, 0x40, 0x00, 0x10, - 0x10, 0x00, 0x04, 0x04, 0x00, 0x01, 0x01, 0x40, - 0x40, 0x00, 0x10, 0x30, 0x00, 0x02, 0x0a, 0x80, - 0x80, 0x06, 0x10, 0x20, 0x07, 0x03, 0xf8, 0xff, - 0xff, 0x07, 0x00, 0x80, 0x01, 0x00, 0x60, 0x00, - 0x00, 0x08, - // in regular row-major format -// 0x0f, 0xe3, 0xc6, 0x0e, 0x86, 0x00, 0xe1, 0x00, -// 0x18, 0xc0, 0x06, 0x20, 0x00, 0x88, 0x00, 0x22, -// 0x00, 0x08, 0x80, 0x02, 0x20, 0x00, 0x84, 0x00, -// 0x61, 0x00, 0x18, 0x20, 0x0a, 0x06, 0x0c, 0x80, -// 0x7c, 0x20, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, -// 0x80, 0x00, 0x20, 0x00, 0x08, 0x00, 0x02, 0x00, -// 0x0f, 0xf0, - - // 'r' (0x72) 15x15, offset 2723-2752, at +3/-14 - 0x01, 0xc0, 0x00, 0x60, 0x00, 0x30, 0x00, 0xf8, - 0xff, 0xc7, 0x00, 0x32, 0x00, 0x09, 0x80, 0x02, - 0xc0, 0x01, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, - 0x18, 0x00, 0x08, 0x00, 0x00, - // in regular row-major format -// 0xf8, 0x7c, 0x11, 0x8c, 0x2c, 0x00, 0x70, 0x00, -// 0xc0, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, -// 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, -// 0x01, 0x00, 0x3f, 0xfc, 0x00, - - // 's' (0x73) 13x15, offset 2752-2777, at +4/-14 - 0x00, 0x7c, 0x1e, 0x98, 0x19, 0x48, 0x08, 0x18, - 0x04, 0x0c, 0x06, 0x06, 0x02, 0x03, 0x81, 0x81, - 0xc0, 0x41, 0xa0, 0x60, 0xe8, 0x61, 0x06, 0xe0, - 0x01, - // in regular row-major format -// 0x0f, 0xd1, 0x83, 0x98, 0x04, 0x80, 0x24, 0x00, -// 0x30, 0x00, 0xf0, 0x00, 0xfc, 0x00, 0x30, 0x00, -// 0xe0, 0x03, 0x00, 0x1c, 0x01, 0xf0, 0x1a, 0x7f, -// 0x00, - - // 't' (0x74) 16x20, offset 2777-2817, at +1/-19 - 0x20, 0x00, 0x00, 0x02, 0x00, 0x20, 0x00, 0x00, - 0x02, 0x00, 0xff, 0xff, 0x03, 0x02, 0x40, 0x20, - 0x00, 0x0c, 0x02, 0x80, 0x20, 0x00, 0x08, 0x02, - 0x80, 0x20, 0x00, 0x08, 0x02, 0x80, 0x20, 0x00, - 0x0c, 0x02, 0x40, 0x00, 0x00, 0x04, 0x00, 0x60, - // in regular row-major format -// 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, -// 0x08, 0x00, 0xff, 0xfc, 0x08, 0x00, 0x08, 0x00, -// 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, -// 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, -// 0x08, 0x00, 0x08, 0x01, 0x06, 0x0f, 0x03, 0xf8, - - // 'u' (0x75) 17x15, offset 2817-2849, at +1/-14 - 0x01, 0x80, 0x00, 0x40, 0x00, 0xe0, 0xff, 0x03, - 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x80, 0x00, - 0x40, 0x00, 0x60, 0x00, 0x38, 0x00, 0x14, 0x00, - 0x0b, 0x80, 0xfc, 0xff, 0x01, 0x80, 0x00, 0x40, - // in regular row-major format -// 0xf0, 0x3e, 0x08, 0x01, 0x04, 0x00, 0x82, 0x00, -// 0x41, 0x00, 0x20, 0x80, 0x10, 0x40, 0x08, 0x20, -// 0x04, 0x10, 0x02, 0x08, 0x01, 0x04, 0x00, 0x82, -// 0x00, 0x41, 0x00, 0xe0, 0x41, 0xd0, 0x1f, 0x8e, - - // 'v' (0x76) 19x15, offset 2849-2885, at +1/-14 - 0x01, 0x80, 0x00, 0x40, 0x00, 0xe0, 0x01, 0xd0, - 0x03, 0x08, 0x07, 0x04, 0x1e, 0x00, 0x38, 0x00, - 0x70, 0x00, 0x20, 0x00, 0x18, 0x80, 0x13, 0x78, - 0x08, 0x07, 0xf4, 0x00, 0x1e, 0x00, 0x01, 0x80, - 0x00, 0x40, 0x00, 0x00, - // in regular row-major format -// 0xfe, 0x0f, 0xe2, 0x00, 0x20, 0x60, 0x0c, 0x0c, -// 0x01, 0x80, 0x80, 0x20, 0x18, 0x0c, 0x01, 0x01, -// 0x00, 0x30, 0x60, 0x02, 0x08, 0x00, 0x41, 0x00, -// 0x0c, 0x60, 0x00, 0x88, 0x00, 0x19, 0x00, 0x01, -// 0x40, 0x00, 0x38, 0x00, - - // 'w' (0x77) 19x15, offset 2885-2921, at +1/-14 - 0x01, 0x80, 0x00, 0xc0, 0x07, 0x20, 0x7f, 0x10, - 0xf0, 0x0b, 0x00, 0x03, 0xf0, 0x01, 0x1f, 0xf0, - 0x01, 0x0c, 0x00, 0x3c, 0x00, 0xf0, 0x00, 0xc0, - 0x0b, 0x00, 0x07, 0xfc, 0xf3, 0x07, 0x1f, 0x80, - 0x00, 0x40, 0x00, 0x00, - // in regular row-major format -// 0xfc, 0x07, 0xe4, 0x00, 0x10, 0x80, 0x02, 0x18, -// 0x20, 0xc3, 0x0e, 0x18, 0x21, 0x42, 0x04, 0x28, -// 0x40, 0x8d, 0x88, 0x19, 0x93, 0x03, 0x22, 0x60, -// 0x2c, 0x68, 0x05, 0x85, 0x00, 0xa0, 0xa0, 0x1c, -// 0x1c, 0x01, 0x81, 0x80, - - // 'x' (0x78) 17x15, offset 2921-2953, at +2/-14 - 0x00, 0xc0, 0x00, 0xe0, 0x00, 0xfc, 0x00, 0xdb, - 0xc0, 0xcc, 0x30, 0xc2, 0x0c, 0xc0, 0x03, 0xc0, - 0x00, 0xf0, 0x00, 0xcc, 0x20, 0xc3, 0xd8, 0xc0, - 0x3c, 0xc0, 0x0f, 0xc0, 0x03, 0x80, 0x00, 0x40, - // in regular row-major format -// 0x7c, 0x1f, 0x18, 0x03, 0x06, 0x03, 0x01, 0x83, -// 0x00, 0x63, 0x00, 0x1b, 0x00, 0x07, 0x00, 0x03, -// 0x80, 0x03, 0x60, 0x03, 0x18, 0x03, 0x06, 0x03, -// 0x01, 0x83, 0x00, 0x61, 0x00, 0x33, 0xf0, 0x7e, - - // 'y' (0x79) 17x22, offset 2953-3000, at +2/-14 - 0x01, 0x00, 0x60, 0x00, 0x00, 0xf8, 0x00, 0x00, - 0xf6, 0x00, 0x80, 0xf1, 0x00, 0x60, 0xe0, 0x00, - 0x08, 0xe0, 0xc0, 0x03, 0xe0, 0xbd, 0x00, 0xe0, - 0x21, 0x00, 0x1c, 0x08, 0xc0, 0x01, 0x04, 0x1e, - 0x00, 0xe1, 0x00, 0x40, 0x0e, 0x00, 0xf0, 0x00, - 0x00, 0x0c, 0x00, 0x00, 0x01, 0x00, 0x00, - // in regular row-major format -// 0xfc, 0x1f, 0x90, 0x01, 0x8c, 0x00, 0x86, 0x00, -// 0xc1, 0x80, 0x40, 0xc0, 0x60, 0x20, 0x20, 0x18, -// 0x30, 0x04, 0x10, 0x03, 0x08, 0x00, 0x8c, 0x00, -// 0x64, 0x00, 0x16, 0x00, 0x0e, 0x00, 0x07, 0x00, -// 0x01, 0x00, 0x01, 0x80, 0x00, 0x80, 0x00, 0xc0, -// 0x00, 0x60, 0x00, 0x20, 0x07, 0xfe, 0x00, - - // 'z' (0x7a) 13x15, offset 3000-3025, at +4/-14 - 0x0f, 0xc0, 0x00, 0x78, 0x00, 0x32, 0x80, 0x18, - 0x20, 0x0c, 0x0c, 0x06, 0x03, 0x43, 0x80, 0x11, - 0xc0, 0x04, 0xe0, 0x01, 0x30, 0x00, 0x08, 0x80, - 0x07, - // in regular row-major format -// 0xff, 0xf4, 0x01, 0x20, 0x09, 0x00, 0x80, 0x08, -// 0x00, 0x80, 0x08, 0x00, 0xc0, 0x04, 0x00, 0x40, -// 0x04, 0x00, 0x40, 0x14, 0x00, 0xa0, 0x07, 0xff, -// 0xe0, - - // '{' (0x7b) 8x25, offset 3025-3050, at +6/-20 - 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0xa0, - 0x00, 0x00, 0x40, 0x01, 0xe0, 0x7f, 0xfc, 0x6f, - 0x00, 0x00, 0x70, 0x00, 0x00, 0xc0, 0x00, 0x00, - 0x80, - // in regular row-major format -// 0x07, 0x0c, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, -// 0x08, 0x08, 0x08, 0x30, 0xc0, 0x30, 0x08, 0x08, -// 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x0c, -// 0x07, - - // '|' (0x7c) 1x25, offset 3050-3054, at +10/-20 - 0xff, 0xff, 0xff, 0x01, - // in regular row-major format -// 0xff, 0xff, 0xff, 0x80, - - // '}' (0x7d) 8x25, offset 3054-3079, at +7/-20 - 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0e, 0x00, - 0x00, 0xf6, 0x3f, 0xfe, 0x07, 0x80, 0x02, 0x00, - 0x00, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, - 0x00, - // in regular row-major format -// 0xe0, 0x30, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, -// 0x10, 0x10, 0x10, 0x08, 0x07, 0x0c, 0x10, 0x10, -// 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x30, -// 0xe0, -}; - -static const uint8_t FreeMono24pt7b_BCM[] = { - - // ' ' (0x20) 0x0, offset 0-0, at +0/+1 - // in regular row-major format - - // '!' (0x21) 5x30, offset 0-19, at +11/-28 - 0x00, 0x00, 0x00, 0xdc, 0xff, 0x07, 0x80, 0xff, - 0xff, 0x7f, 0xe0, 0xff, 0x7f, 0x00, 0xf8, 0x00, - 0x00, 0x00, 0x1c, - // in regular row-major format -// 0x73, 0x9c, 0xe7, 0x39, 0xce, 0x73, 0x9c, 0xe7, -// 0x10, 0x84, 0x21, 0x08, 0x00, 0x00, 0x00, 0x03, -// 0xbf, 0xff, 0xb8, - - // '"' (0x22) 16x14, offset 19-47, at +6/-28 - 0x01, 0xc0, 0x3f, 0xf0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x7f, 0x10, 0x00, 0x00, 0x00, 0x00, 0x40, - 0x00, 0xf0, 0x1f, 0xfc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x1f, 0x04, 0x00, - // in regular row-major format -// 0xfe, 0x7f, 0x7c, 0x3e, 0x7c, 0x3e, 0x7c, 0x3e, -// 0x7c, 0x3e, 0x7c, 0x3e, 0x7c, 0x3e, 0x7c, 0x3e, -// 0x3c, 0x3e, 0x38, 0x1c, 0x38, 0x1c, 0x38, 0x1c, -// 0x38, 0x1c, 0x38, 0x1c, - - // '#' (0x23) 19x32, offset 47-123, at +4/-29 - 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x18, 0x00, - 0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x00, - 0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x98, 0xff, - 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, - 0xff, 0x19, 0x18, 0x00, 0x00, 0x18, 0x18, 0x00, - 0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0xd8, 0xff, - 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, - 0xff, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x00, - 0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x00, - 0x00, 0x18, 0x00, 0x00, - // in regular row-major format -// 0x01, 0x86, 0x00, 0x30, 0xc0, 0x06, 0x18, 0x00, -// 0xc3, 0x00, 0x18, 0x60, 0x03, 0x0c, 0x00, 0x61, -// 0x80, 0x0c, 0x70, 0x01, 0x8c, 0x00, 0x61, 0x80, -// 0x0c, 0x30, 0x3f, 0xff, 0xf7, 0xff, 0xfe, 0x06, -// 0x18, 0x00, 0xc3, 0x00, 0x18, 0x60, 0x03, 0x0c, -// 0x00, 0x61, 0x80, 0x0c, 0x30, 0x7f, 0xff, 0xef, -// 0xff, 0xfc, 0x06, 0x18, 0x00, 0xc7, 0x00, 0x38, -// 0xc0, 0x06, 0x18, 0x00, 0xc3, 0x00, 0x18, 0x60, -// 0x03, 0x0c, 0x00, 0x61, 0x80, 0x0c, 0x30, 0x01, -// 0x86, 0x00, 0x30, 0xc0, - - // '$' (0x24) 18x33, offset 123-198, at +5/-29 - 0x00, 0x00, 0xf0, 0x03, 0x00, 0x1f, 0xc0, 0x07, - 0x00, 0x7f, 0x00, 0x06, 0x00, 0xc7, 0x01, 0x18, - 0x00, 0x07, 0x03, 0x30, 0x00, 0x06, 0x0c, 0xe0, - 0x00, 0x06, 0x18, 0x80, 0x01, 0x0c, 0x30, 0x00, - 0x03, 0x1f, 0xc0, 0x00, 0xfe, 0x3f, 0x80, 0x01, - 0xfc, 0x63, 0x00, 0x03, 0x18, 0xc0, 0x00, 0x06, - 0x30, 0x00, 0x03, 0x1c, 0x70, 0x00, 0x06, 0x30, - 0x60, 0x00, 0x18, 0x60, 0xe0, 0x00, 0xf8, 0x80, - 0xe3, 0x00, 0xf0, 0x01, 0xff, 0x00, 0x00, 0x00, - 0xf8, 0x00, 0x00, - // in regular row-major format -// 0x00, 0xc0, 0x00, 0x30, 0x00, 0x0c, 0x00, 0x0f, -// 0xc0, 0x0f, 0xfd, 0x87, 0x03, 0xe3, 0x80, 0x39, -// 0xc0, 0x06, 0x60, 0x01, 0x98, 0x00, 0x06, 0x00, -// 0x01, 0xc0, 0x00, 0x38, 0x00, 0x07, 0xc0, 0x00, -// 0x7f, 0x80, 0x03, 0xf8, 0x00, 0x0f, 0x80, 0x00, -// 0x60, 0x00, 0x1c, 0x00, 0x03, 0x80, 0x00, 0xf0, -// 0x00, 0x3c, 0x00, 0x1f, 0x80, 0x0e, 0xfc, 0x0f, -// 0x37, 0xff, 0x80, 0x7f, 0x80, 0x03, 0x00, 0x00, -// 0xc0, 0x00, 0x30, 0x00, 0x0c, 0x00, 0x03, 0x00, -// 0x00, 0xc0, 0x00, - - // '%' (0x25) 20x29, offset 198-271, at +4/-27 - 0x00, 0x00, 0x03, 0x00, 0x1e, 0x60, 0x00, 0xf0, - 0x0f, 0x06, 0x00, 0x87, 0xc3, 0x00, 0x60, 0x60, - 0x18, 0x00, 0x06, 0x98, 0x01, 0xc0, 0x00, 0x33, - 0x00, 0x18, 0x60, 0x06, 0x0f, 0x03, 0x6c, 0xf8, - 0xc7, 0xc0, 0x8c, 0xc3, 0x39, 0x9c, 0x31, 0x30, - 0xfe, 0x19, 0x03, 0x0c, 0x0f, 0x63, 0x80, 0x01, - 0x60, 0x0c, 0x30, 0x00, 0x84, 0x01, 0x06, 0xc0, - 0x60, 0x60, 0x00, 0x18, 0x1c, 0x0e, 0x00, 0x01, - 0xff, 0x00, 0x30, 0x80, 0x0f, 0x00, 0x06, 0x00, - 0x00, - // in regular row-major format -// 0x07, 0x80, 0x01, 0xfe, 0x00, 0x38, 0x70, 0x03, -// 0x03, 0x00, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, -// 0x18, 0x06, 0x01, 0x80, 0x30, 0x30, 0x03, 0x87, -// 0x00, 0x1f, 0xe0, 0x30, 0x78, 0x1f, 0x00, 0x1f, -// 0x80, 0x0f, 0xc0, 0x07, 0xe0, 0x03, 0xf0, 0x00, -// 0xf8, 0x00, 0x0c, 0x01, 0xe0, 0x00, 0x7f, 0x80, -// 0x0e, 0x1c, 0x00, 0xc0, 0xc0, 0x18, 0x06, 0x01, -// 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x0c, -// 0x0e, 0x00, 0xe1, 0xc0, 0x07, 0xf8, 0x00, 0x1e, -// 0x00, - - // '&' (0x26) 18x25, offset 271-328, at +5/-23 - 0x00, 0xc0, 0x0f, 0x00, 0xc0, 0x7f, 0x00, 0xc0, - 0xc1, 0xc1, 0xc3, 0x00, 0xc7, 0x9f, 0x01, 0xcc, - 0xf1, 0x01, 0xf0, 0x81, 0x07, 0xe0, 0x01, 0x1c, - 0xc0, 0x03, 0xf0, 0x80, 0x07, 0x80, 0x83, 0x0d, - 0x00, 0x9e, 0x33, 0x00, 0xf0, 0x33, 0x00, 0xc0, - 0x63, 0x00, 0xf0, 0x1f, 0x00, 0xfc, 0x30, 0x00, - 0x38, 0x60, 0x00, 0x30, 0xc0, 0x00, 0x60, 0x80, - 0x01, - // in regular row-major format -// 0x03, 0xec, 0x01, 0xff, 0x00, 0xe1, 0x00, 0x70, -// 0x00, 0x18, 0x00, 0x06, 0x00, 0x01, 0x80, 0x00, -// 0x30, 0x00, 0x0c, 0x00, 0x01, 0x80, 0x00, 0x60, -// 0x00, 0x7c, 0x00, 0x3b, 0x83, 0xd8, 0x60, 0xfe, -// 0x0c, 0x33, 0x03, 0x98, 0xc0, 0x66, 0x30, 0x0d, -// 0x8c, 0x03, 0xc3, 0x00, 0x70, 0x60, 0x1c, 0x1c, -// 0x0f, 0x03, 0x87, 0x7c, 0x7f, 0x9f, 0x07, 0x80, -// 0x00, - - // ''' (0x27) 7x14, offset 328-341, at +11/-28 - 0x01, 0xc0, 0x3f, 0xf0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x7f, 0x10, 0x00, 0x00, - // in regular row-major format -// 0xfe, 0xf9, 0xf3, 0xe7, 0xcf, 0x9f, 0x3e, 0x3c, -// 0x70, 0xe1, 0xc3, 0x87, 0x00, - - // '(' (0x28) 7x34, offset 341-371, at +14/-27 - 0x00, 0xf0, 0x1f, 0x00, 0x00, 0xfc, 0xff, 0x07, - 0x00, 0xfe, 0xff, 0xff, 0x00, 0xfe, 0x01, 0xf0, - 0x0f, 0x7e, 0x00, 0x00, 0xfc, 0x3c, 0x00, 0x00, - 0x80, 0x37, 0x00, 0x00, 0x00, 0x30, - // in regular row-major format -// 0x06, 0x1c, 0x30, 0xe1, 0x87, 0x0e, 0x18, 0x70, -// 0xe1, 0xc3, 0x0e, 0x1c, 0x38, 0x70, 0xe1, 0xc3, -// 0x87, 0x0e, 0x0c, 0x1c, 0x38, 0x70, 0x60, 0xe1, -// 0xc1, 0x83, 0x83, 0x06, 0x06, 0x04, - - // ')' (0x29) 7x34, offset 371-401, at +8/-27 - 0x03, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x80, - 0xe7, 0x07, 0x00, 0x80, 0x0f, 0xfe, 0x03, 0xf0, - 0x0f, 0xe0, 0xff, 0xff, 0x0f, 0x00, 0xfc, 0xff, - 0x07, 0x00, 0x00, 0xff, 0x01, 0x00, - // in regular row-major format -// 0xc1, 0xc1, 0x83, 0x83, 0x07, 0x0e, 0x0c, 0x1c, -// 0x38, 0x70, 0xe0, 0xe1, 0xc3, 0x87, 0x0e, 0x1c, -// 0x38, 0x70, 0xe1, 0x87, 0x0e, 0x1c, 0x30, 0x61, -// 0xc3, 0x0e, 0x18, 0x70, 0xc1, 0x00, - - // '*' (0x2a) 18x16, offset 401-437, at +5/-27 - 0x40, 0x00, 0x60, 0x00, 0xc0, 0x00, 0xc0, 0x80, - 0xc0, 0xe0, 0x80, 0x71, 0x80, 0x39, 0x80, 0x0f, - 0xff, 0x07, 0xff, 0x07, 0x80, 0x0f, 0x80, 0x3d, - 0x80, 0x71, 0xc0, 0xe0, 0xc0, 0x80, 0xc0, 0x00, - 0x60, 0x00, 0x60, 0x00, - // in regular row-major format -// 0x00, 0xc0, 0x00, 0x30, 0x00, 0x0c, 0x00, 0x03, -// 0x00, 0x00, 0xc0, 0x10, 0x30, 0x3f, 0x8c, 0x7c, -// 0xff, 0xfc, 0x07, 0xf8, 0x00, 0x78, 0x00, 0x1f, -// 0x00, 0x0c, 0xc0, 0x06, 0x18, 0x03, 0x87, 0x00, -// 0xc0, 0xc0, 0x60, 0x18, - - // '+' (0x2b) 20x22, offset 437-492, at +4/-23 - 0x00, 0x0c, 0x00, 0x00, 0x03, 0x00, 0xc0, 0x00, - 0x00, 0x30, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x03, - 0x00, 0xc0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x0c, - 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x30, - 0x00, 0x00, 0x0c, 0x00, 0x00, 0x03, 0x00, 0xc0, - 0x00, 0x00, 0x30, 0x00, 0x00, 0x0c, 0x00, 0x00, - 0x03, 0x00, 0xc0, 0x00, 0x00, 0x30, 0x00, - // in regular row-major format -// 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x60, 0x00, -// 0x06, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, -// 0x60, 0x00, 0x06, 0x00, 0x00, 0x60, 0x00, 0x06, -// 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x60, -// 0x00, 0x06, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, -// 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x60, 0x00, -// 0x06, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, - - // ',' (0x2c) 9x14, offset 492-508, at +6/-6 - 0x00, 0x3c, 0xf0, 0x8f, 0xff, 0xfd, 0x1f, 0xff, - 0xc1, 0x1f, 0xf0, 0x01, 0x1c, 0x00, 0x01, 0x00, - // in regular row-major format -// 0x1f, 0x8f, 0x87, 0xc7, 0xc3, 0xe1, 0xe1, 0xf0, -// 0xf0, 0x78, 0x38, 0x3c, 0x1c, 0x0e, 0x06, 0x00, - - // '-' (0x2d) 22x2, offset 508-514, at +3/-13 - 0xfc, 0xff, 0xff, 0xff, 0xff, 0x0f, - // in regular row-major format -// 0x7f, 0xff, 0xfd, 0xff, 0xff, 0xf0, - - // '.' (0x2e) 7x6, offset 514-520, at +11/-4 - 0xde, 0xff, 0xff, 0xff, 0xef, 0x01, - // in regular row-major format -// 0x7d, 0xff, 0xff, 0xff, 0xef, 0x80, - - // '/' (0x2f) 18x35, offset 520-599, at +5/-30 - 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x3e, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, - 0xf8, 0x00, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, - 0xe0, 0x03, 0x00, 0x00, 0xc0, 0x07, 0x00, 0x00, - 0x80, 0x0f, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, - 0x00, 0x1e, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, - 0x00, 0x78, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, - 0x00, 0xe0, 0x01, 0x00, 0x00, 0xc0, 0x03, 0x00, - 0x00, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x0f, 0x00, - 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, - // in regular row-major format -// 0x00, 0x00, 0xc0, 0x00, 0x70, 0x00, 0x18, 0x00, -// 0x06, 0x00, 0x03, 0x00, 0x00, 0xc0, 0x00, 0x60, -// 0x00, 0x18, 0x00, 0x0c, 0x00, 0x03, 0x00, 0x01, -// 0x80, 0x00, 0x60, 0x00, 0x30, 0x00, 0x0c, 0x00, -// 0x06, 0x00, 0x01, 0x80, 0x00, 0xc0, 0x00, 0x30, -// 0x00, 0x18, 0x00, 0x06, 0x00, 0x03, 0x80, 0x00, -// 0xc0, 0x00, 0x70, 0x00, 0x18, 0x00, 0x0e, 0x00, -// 0x03, 0x00, 0x01, 0xc0, 0x00, 0x60, 0x00, 0x38, -// 0x00, 0x0c, 0x00, 0x07, 0x00, 0x01, 0x80, 0x00, -// 0x60, 0x00, 0x30, 0x00, 0x0c, 0x00, 0x00, - - // '0' (0x30) 18x30, offset 599-667, at +5/-28 - 0x00, 0xff, 0x3f, 0x00, 0xf8, 0xff, 0x7f, 0x80, - 0x1f, 0x00, 0x7e, 0xf0, 0x00, 0x00, 0x3c, 0x0e, - 0x00, 0x00, 0x9c, 0x01, 0x00, 0x00, 0x76, 0x00, - 0x00, 0x80, 0x0f, 0x00, 0x00, 0xc0, 0x03, 0x00, - 0x00, 0xf0, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, - 0x00, 0x1f, 0x00, 0x00, 0xe0, 0x06, 0x00, 0x00, - 0x98, 0x03, 0x00, 0x00, 0xc7, 0x03, 0x00, 0xf0, - 0xc0, 0x07, 0x80, 0x0f, 0xe0, 0xff, 0xff, 0x01, - 0xc0, 0xff, 0x0f, 0x00, - // in regular row-major format -// 0x03, 0xf0, 0x03, 0xff, 0x01, 0xe1, 0xe0, 0xe0, -// 0x18, 0x30, 0x03, 0x1c, 0x00, 0xe6, 0x00, 0x19, -// 0x80, 0x06, 0xe0, 0x01, 0xf0, 0x00, 0x3c, 0x00, -// 0x0f, 0x00, 0x03, 0xc0, 0x00, 0xf0, 0x00, 0x3c, -// 0x00, 0x0f, 0x00, 0x03, 0xc0, 0x00, 0xf0, 0x00, -// 0x3c, 0x00, 0x0f, 0x00, 0x03, 0xc0, 0x00, 0xf8, -// 0x00, 0x76, 0x00, 0x19, 0x80, 0x06, 0x70, 0x03, -// 0x8c, 0x00, 0xc3, 0x80, 0x60, 0x78, 0x78, 0x0f, -// 0xfc, 0x00, 0xfc, 0x00, - - // '1' (0x31) 16x29, offset 667-725, at +6/-28 - 0xc0, 0x00, 0x00, 0x18, 0x1c, 0x00, 0x00, 0xc3, - 0x01, 0x00, 0x60, 0x1c, 0x00, 0x00, 0xcc, 0x01, - 0x00, 0x80, 0x1d, 0x00, 0x00, 0xf0, 0x01, 0x00, - 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x1f, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x80, 0x01, - 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, - 0x00, 0xc0, - // in regular row-major format -// 0x03, 0x80, 0x07, 0x80, 0x0f, 0x80, 0x1d, 0x80, -// 0x39, 0x80, 0x71, 0x80, 0xe1, 0x80, 0xc1, 0x80, -// 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, -// 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, -// 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, -// 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, -// 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0xff, 0xff, -// 0xff, 0xff, - - // '2' (0x32) 18x29, offset 725-791, at +5/-28 - 0xe0, 0x00, 0x00, 0x1c, 0x1e, 0x00, 0x40, 0xe3, - 0x00, 0x00, 0x64, 0x06, 0x00, 0xc0, 0x6c, 0x00, - 0x00, 0x8c, 0x0d, 0x00, 0xc0, 0xf0, 0x00, 0x00, - 0x0c, 0x1e, 0x00, 0xc0, 0xc0, 0x03, 0x00, 0x0c, - 0x78, 0x00, 0xc0, 0x00, 0x0f, 0x00, 0x0c, 0xe0, - 0x01, 0xc0, 0x00, 0x6c, 0x00, 0x0c, 0x80, 0x1d, - 0xc0, 0x00, 0x30, 0x07, 0x0c, 0x00, 0xc6, 0xe1, - 0x00, 0xc0, 0xf0, 0x0f, 0x00, 0x1f, 0x78, 0x00, - 0xe0, 0x03, - // in regular row-major format -// 0x03, 0xf0, 0x03, 0xff, 0x01, 0xc0, 0xe0, 0xc0, -// 0x1c, 0x60, 0x03, 0xb8, 0x00, 0x6c, 0x00, 0x0f, -// 0x00, 0x03, 0x00, 0x00, 0xc0, 0x00, 0x30, 0x00, -// 0x18, 0x00, 0x06, 0x00, 0x03, 0x00, 0x01, 0x80, -// 0x00, 0xc0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x18, -// 0x00, 0x0c, 0x00, 0x06, 0x00, 0x03, 0x00, 0x01, -// 0x80, 0x00, 0xc0, 0x00, 0x60, 0x00, 0x30, 0x00, -// 0xd0, 0x00, 0x38, 0x00, 0x0f, 0xff, 0xff, 0xff, -// 0xff, 0xc0, - - // '3' (0x33) 19x30, offset 791-863, at +5/-28 - 0x00, 0x00, 0x00, 0x06, 0x04, 0x00, 0x80, 0x83, - 0x01, 0x00, 0xc0, 0x30, 0x00, 0x00, 0x60, 0x06, - 0x00, 0x00, 0x98, 0x01, 0x00, 0x00, 0x36, 0x00, - 0x00, 0x00, 0x0f, 0x00, 0x00, 0xc0, 0x03, 0x60, - 0x00, 0xf0, 0x00, 0x18, 0x00, 0x3c, 0x00, 0x06, - 0x00, 0x0f, 0x80, 0x01, 0xc0, 0x07, 0xe0, 0x00, - 0x98, 0x01, 0x3c, 0x00, 0xe6, 0x80, 0x1b, 0xc0, - 0x71, 0x70, 0x0e, 0x38, 0xf8, 0x0f, 0x07, 0x07, - 0xf8, 0x80, 0xff, 0x00, 0x00, 0x80, 0x0f, 0x00, - // in regular row-major format -// 0x03, 0xf8, 0x01, 0xff, 0xc0, 0x70, 0x3c, 0x18, -// 0x01, 0xc6, 0x00, 0x18, 0x00, 0x01, 0x80, 0x00, -// 0x30, 0x00, 0x06, 0x00, 0x00, 0xc0, 0x00, 0x18, -// 0x00, 0x06, 0x00, 0x01, 0xc0, 0x00, 0x70, 0x01, -// 0xfc, 0x00, 0x3f, 0x00, 0x00, 0x78, 0x00, 0x03, -// 0x80, 0x00, 0x38, 0x00, 0x03, 0x00, 0x00, 0x30, -// 0x00, 0x06, 0x00, 0x00, 0xc0, 0x00, 0x18, 0x00, -// 0x03, 0x00, 0x00, 0xd8, 0x00, 0x3b, 0x80, 0x0e, -// 0x3e, 0x07, 0x81, 0xff, 0xe0, 0x07, 0xe0, 0x00, - - // '4' (0x34) 16x28, offset 863-919, at +6/-27 - 0x00, 0x00, 0x0e, 0x00, 0x00, 0xd8, 0x00, 0x00, - 0xe0, 0x0c, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x0c, - 0x0c, 0x00, 0x70, 0xc0, 0x00, 0xc0, 0x01, 0x0c, - 0x00, 0x0e, 0xc0, 0x00, 0x38, 0x00, 0x0c, 0xec, - 0x00, 0xc0, 0xc0, 0x07, 0x00, 0x0c, 0x3c, 0x00, - 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0xc0, 0xc0, - // in regular row-major format -// 0x00, 0x3c, 0x00, 0x7c, 0x00, 0x6c, 0x00, 0xcc, -// 0x00, 0x8c, 0x01, 0x8c, 0x03, 0x0c, 0x03, 0x0c, -// 0x06, 0x0c, 0x04, 0x0c, 0x0c, 0x0c, 0x08, 0x0c, -// 0x10, 0x0c, 0x30, 0x0c, 0x20, 0x0c, 0x60, 0x0c, -// 0x40, 0x0c, 0x80, 0x0c, 0xff, 0xff, 0xff, 0xff, -// 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x0c, -// 0x00, 0x0c, 0x00, 0x0c, 0x00, 0xff, 0x00, 0xff, - - // '5' (0x35) 19x29, offset 919-988, at +5/-27 - 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xe0, 0xfc, - 0x7f, 0x00, 0x98, 0xff, 0x0f, 0x00, 0x36, 0x80, - 0x01, 0xc0, 0x06, 0x10, 0x00, 0xd8, 0x00, 0x02, - 0x00, 0x1e, 0x60, 0x00, 0xc0, 0x03, 0x0c, 0x00, - 0x78, 0x80, 0x01, 0x00, 0x0f, 0x30, 0x00, 0xe0, - 0x01, 0x06, 0x00, 0x3c, 0xc0, 0x00, 0xc0, 0x06, - 0x30, 0x00, 0xd8, 0x00, 0x06, 0x80, 0x1b, 0x80, - 0x01, 0x38, 0x00, 0xe0, 0xc0, 0x03, 0x00, 0xf8, - 0x3f, 0x00, 0x00, 0xfc, 0x00, - // in regular row-major format -// 0x3f, 0xff, 0x07, 0xff, 0xe0, 0xc0, 0x00, 0x18, -// 0x00, 0x03, 0x00, 0x00, 0x60, 0x00, 0x0c, 0x00, -// 0x01, 0x80, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00, -// 0xc7, 0xe0, 0x1f, 0xff, 0x03, 0x80, 0x70, 0x00, -// 0x03, 0x00, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00, -// 0x60, 0x00, 0x0c, 0x00, 0x01, 0x80, 0x00, 0x30, -// 0x00, 0x06, 0x00, 0x00, 0xc0, 0x00, 0x30, 0x00, -// 0x06, 0xc0, 0x01, 0xdc, 0x00, 0x71, 0xf0, 0x3c, -// 0x0f, 0xff, 0x00, 0x3f, 0x00, - - // '6' (0x36) 18x30, offset 988-1056, at +6/-28 - 0x00, 0xf8, 0x1f, 0x00, 0xc0, 0xff, 0x3f, 0x00, - 0xfc, 0xe0, 0x3e, 0x80, 0x07, 0x0e, 0x1c, 0x70, - 0xc0, 0x01, 0x0e, 0x0e, 0x38, 0x00, 0xc7, 0x01, - 0x06, 0x80, 0x31, 0xc0, 0x01, 0xc0, 0x0e, 0x30, - 0x00, 0xb0, 0x01, 0x0c, 0x00, 0x7c, 0x00, 0x03, - 0x00, 0x0f, 0xc0, 0x00, 0xc0, 0x03, 0x70, 0x00, - 0xd8, 0x00, 0x18, 0x00, 0x36, 0x00, 0x0c, 0xc0, - 0x0c, 0x00, 0x0f, 0x1c, 0x03, 0x00, 0xff, 0x83, - 0x00, 0x00, 0x3f, 0x00, - // in regular row-major format -// 0x00, 0x3f, 0x80, 0x3f, 0xf0, 0x3e, 0x00, 0x1e, -// 0x00, 0x0e, 0x00, 0x07, 0x00, 0x03, 0x80, 0x00, -// 0xc0, 0x00, 0x70, 0x00, 0x18, 0x00, 0x06, 0x00, -// 0x03, 0x80, 0x00, 0xc1, 0xf8, 0x31, 0xff, 0x0c, -// 0xf0, 0xf3, 0x70, 0x0c, 0xd8, 0x01, 0xbc, 0x00, -// 0x6e, 0x00, 0x0f, 0x80, 0x03, 0xc0, 0x00, 0xd8, -// 0x00, 0x36, 0x00, 0x0d, 0x80, 0x03, 0x30, 0x01, -// 0x8e, 0x00, 0x61, 0xc0, 0x30, 0x38, 0x38, 0x07, -// 0xfc, 0x00, 0x7c, 0x00, - - // '7' (0x37) 18x28, offset 1056-1119, at +5/-27 - 0x1f, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, 0x03, - 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x03, 0x00, - 0x00, 0x30, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, - 0x30, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x3c, - 0x00, 0x00, 0xf8, 0x03, 0x00, 0xf0, 0x33, 0x00, - 0xe0, 0x07, 0x03, 0xc0, 0x0f, 0x30, 0x80, 0x1f, - 0x00, 0x83, 0x3f, 0x00, 0x30, 0x7f, 0x00, 0x00, - 0xff, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, - // in regular row-major format -// 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x0f, 0x00, -// 0x03, 0xc0, 0x01, 0xc0, 0x00, 0x60, 0x00, 0x18, -// 0x00, 0x0e, 0x00, 0x03, 0x00, 0x00, 0xc0, 0x00, -// 0x30, 0x00, 0x18, 0x00, 0x06, 0x00, 0x01, 0x80, -// 0x00, 0xc0, 0x00, 0x30, 0x00, 0x0c, 0x00, 0x06, -// 0x00, 0x01, 0x80, 0x00, 0x60, 0x00, 0x30, 0x00, -// 0x0c, 0x00, 0x03, 0x00, 0x01, 0x80, 0x00, 0x60, -// 0x00, 0x18, 0x00, 0x0c, 0x00, 0x03, 0x00, - - // '8' (0x38) 18x30, offset 1119-1187, at +5/-28 - 0xe0, 0x03, 0xf8, 0x00, 0xfe, 0x81, 0xff, 0xc0, - 0xc3, 0x70, 0x70, 0x30, 0x60, 0x06, 0x30, 0x06, - 0xf0, 0x00, 0x98, 0x01, 0x3c, 0x00, 0x36, 0x00, - 0x06, 0x00, 0x0f, 0x80, 0x01, 0xc0, 0x03, 0x60, - 0x00, 0xf0, 0x00, 0x18, 0x00, 0x3c, 0x00, 0x06, - 0x00, 0x0f, 0x80, 0x01, 0xc0, 0x06, 0xf0, 0x00, - 0x98, 0x01, 0x3c, 0x00, 0xc7, 0x80, 0x19, 0xe0, - 0xf0, 0x30, 0x1c, 0x1c, 0xf8, 0x07, 0xfe, 0x03, - 0xf8, 0x00, 0x3e, 0x00, - // in regular row-major format -// 0x03, 0xf0, 0x03, 0xff, 0x03, 0xc0, 0xf1, 0xc0, -// 0x0e, 0x60, 0x01, 0xb8, 0x00, 0x7c, 0x00, 0x0f, -// 0x00, 0x03, 0xc0, 0x00, 0xf0, 0x00, 0x36, 0x00, -// 0x18, 0xc0, 0x0c, 0x1c, 0x0e, 0x03, 0xff, 0x00, -// 0xff, 0xc0, 0x70, 0x38, 0x30, 0x03, 0x18, 0x00, -// 0x66, 0x00, 0x1b, 0x00, 0x03, 0xc0, 0x00, 0xf0, -// 0x00, 0x3c, 0x00, 0x0f, 0x00, 0x03, 0x60, 0x01, -// 0x98, 0x00, 0xe3, 0x00, 0x70, 0x70, 0x38, 0x0f, -// 0xfc, 0x00, 0xfc, 0x00, - - // '9' (0x39) 18x30, offset 1187-1255, at +6/-28 - 0xc0, 0x0f, 0x00, 0x10, 0xfc, 0x0f, 0x00, 0x8c, - 0x03, 0x0f, 0x00, 0x33, 0x00, 0x03, 0xc0, 0x06, - 0x80, 0x01, 0xf0, 0x01, 0xe0, 0x00, 0x3c, 0x00, - 0x30, 0x00, 0x0f, 0x00, 0x0c, 0xe0, 0x03, 0x00, - 0x03, 0xd8, 0x00, 0xc0, 0x00, 0x37, 0x00, 0x38, - 0xc0, 0x18, 0x00, 0x06, 0x38, 0x0e, 0xc0, 0x01, - 0x07, 0x07, 0x38, 0xe0, 0x80, 0x03, 0x03, 0x1e, - 0xc0, 0x77, 0xf0, 0x03, 0xc0, 0xff, 0x3f, 0x00, - 0x80, 0xff, 0x01, 0x00, - // in regular row-major format -// 0x07, 0xe0, 0x03, 0xfe, 0x01, 0xc1, 0xc0, 0xc0, -// 0x38, 0x60, 0x07, 0x18, 0x00, 0xcc, 0x00, 0x1b, -// 0x00, 0x06, 0xc0, 0x01, 0xb0, 0x00, 0x3c, 0x00, -// 0x1f, 0x00, 0x07, 0x60, 0x03, 0xd8, 0x01, 0xb3, -// 0x00, 0xcc, 0xf0, 0xf3, 0x0f, 0xf8, 0xc1, 0xf8, -// 0x30, 0x00, 0x1c, 0x00, 0x06, 0x00, 0x01, 0x80, -// 0x00, 0xe0, 0x00, 0x30, 0x00, 0x1c, 0x00, 0x0e, -// 0x00, 0x07, 0x00, 0x07, 0x80, 0x07, 0xc0, 0xff, -// 0xc0, 0x1f, 0xc0, 0x00, - - // ':' (0x3a) 7x21, offset 1255-1274, at +11/-19 - 0x1e, 0x00, 0xef, 0x07, 0xf0, 0xff, 0x00, 0xfe, - 0x1f, 0xc0, 0xff, 0x03, 0xf8, 0x7f, 0x00, 0xbf, - 0x07, 0xc0, 0x03, - // in regular row-major format -// 0x7d, 0xff, 0xff, 0xff, 0xef, 0x80, 0x00, 0x00, -// 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0xff, 0xff, -// 0xff, 0xf7, 0xc0, - - // ';' (0x3b) 10x27, offset 1274-1308, at +7/-19 - 0x00, 0x00, 0x00, 0x03, 0x00, 0x80, 0x3f, 0x00, - 0xc0, 0xff, 0x3c, 0xc0, 0xff, 0xf3, 0x03, 0xfe, - 0x87, 0x1f, 0xf0, 0x0f, 0xfc, 0x80, 0x1f, 0xe0, - 0x07, 0x3c, 0x00, 0x3f, 0x60, 0x00, 0xf0, 0x00, - 0x01, 0x00, - // in regular row-major format -// 0x0f, 0x87, 0xf1, 0xfc, 0x7f, 0x1f, 0xc3, 0xe0, -// 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -// 0x07, 0xf1, 0xf8, 0x7c, 0x3f, 0x0f, 0x83, 0xe0, -// 0xf0, 0x7c, 0x1e, 0x07, 0x81, 0xc0, 0xf0, 0x38, -// 0x04, 0x00, - - // '<' (0x3c) 22x22, offset 1308-1369, at +3/-23 - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc0, 0x00, - 0x00, 0x78, 0x00, 0x00, 0x1e, 0x00, 0xc0, 0x0e, - 0x00, 0x38, 0x03, 0x00, 0x86, 0x01, 0xc0, 0x60, - 0x00, 0x30, 0x30, 0x00, 0x06, 0x0c, 0x80, 0x01, - 0x06, 0x30, 0x80, 0x03, 0x0c, 0xc0, 0x80, 0x01, - 0x70, 0x70, 0x00, 0x18, 0x0c, 0x00, 0x8c, 0x01, - 0x00, 0x63, 0x00, 0x80, 0x0d, 0x00, 0x60, 0x03, - 0x00, 0x30, 0x00, 0x00, 0x00, - // in regular row-major format -// 0x00, 0x00, 0x18, 0x00, 0x01, 0xe0, 0x00, 0x1e, -// 0x00, 0x00, 0xe0, 0x00, 0x0f, 0x00, 0x00, 0xf0, -// 0x00, 0x0f, 0x00, 0x00, 0xf0, 0x00, 0x07, 0x00, -// 0x00, 0x78, 0x00, 0x07, 0x80, 0x00, 0x0f, 0x00, -// 0x00, 0x1e, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x1e, -// 0x00, 0x00, 0x1e, 0x00, 0x00, 0x1e, 0x00, 0x00, -// 0x3c, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x3c, 0x00, -// 0x00, 0x38, 0x00, 0x00, 0x20, - - // '=' (0x3d) 24x9, offset 1369-1396, at +2/-17 - 0x00, 0x06, 0x0f, 0x1e, 0x3c, 0x78, 0xf0, 0xe0, - 0xc1, 0x83, 0x07, 0x0f, 0x1e, 0x3c, 0x78, 0xf0, - 0xe0, 0xc1, 0x83, 0x07, 0x0f, 0x1e, 0x3c, 0x78, - 0xf0, 0xe0, 0xc1, - // in regular row-major format -// 0x7f, 0xff, 0xff, 0x7f, 0xff, 0xff, 0x00, 0x00, -// 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -// 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, -// 0x7f, 0xff, 0xff, - - // '>' (0x3e) 21x22, offset 1396-1454, at +4/-23 - 0x03, 0x00, 0xf0, 0x00, 0x00, 0x6e, 0x00, 0x80, - 0x19, 0x00, 0x30, 0x0c, 0x00, 0x0c, 0x03, 0x80, - 0x81, 0x01, 0x60, 0xe0, 0x00, 0x0c, 0x30, 0x80, - 0x03, 0x18, 0x60, 0x00, 0x06, 0x1c, 0x00, 0x03, - 0x03, 0xc0, 0x60, 0x00, 0x60, 0x18, 0x00, 0x18, - 0x03, 0x00, 0xcc, 0x00, 0x00, 0x1f, 0x00, 0x80, - 0x07, 0x00, 0xc0, 0x00, 0x00, 0x30, 0x00, 0x00, - 0x00, 0x00, - // in regular row-major format -// 0xc0, 0x00, 0x07, 0x80, 0x00, 0x0f, 0x00, 0x00, -// 0x1e, 0x00, 0x00, 0x38, 0x00, 0x00, 0xf0, 0x00, -// 0x01, 0xe0, 0x00, 0x03, 0xc0, 0x00, 0x07, 0x80, -// 0x00, 0x0e, 0x00, 0x00, 0x3c, 0x00, 0x01, 0xe0, -// 0x00, 0x3c, 0x00, 0x07, 0x80, 0x00, 0xf0, 0x00, -// 0x1e, 0x00, 0x01, 0xe0, 0x00, 0x3c, 0x00, 0x07, -// 0x80, 0x00, 0xf0, 0x00, 0x0e, 0x00, 0x00, 0x60, -// 0x00, 0x00, - - // '?' (0x3f) 17x28, offset 1454-1514, at +6/-26 - 0x7c, 0x00, 0x00, 0xc0, 0x07, 0x00, 0x00, 0x06, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x06, 0x00, - 0x00, 0x30, 0x00, 0x00, 0x70, 0x03, 0x00, 0x80, - 0x3f, 0x00, 0x3c, 0xf8, 0x03, 0xe0, 0x83, 0x3f, - 0x00, 0x06, 0xf8, 0x03, 0x30, 0x00, 0x77, 0x00, - 0x03, 0x00, 0x06, 0x38, 0x00, 0xe0, 0x80, 0x01, - 0x00, 0x1c, 0x0e, 0x00, 0x80, 0x7f, 0x00, 0x00, - 0xe0, 0x03, 0x00, 0x00, - // in regular row-major format -// 0x07, 0xf0, 0x1f, 0xfe, 0x3e, 0x07, 0x98, 0x00, -// 0xec, 0x00, 0x36, 0x00, 0x0f, 0x00, 0x06, 0x00, -// 0x03, 0x00, 0x01, 0x80, 0x01, 0xc0, 0x00, 0xc0, -// 0x01, 0xc0, 0x03, 0xc0, 0x07, 0xc0, 0x07, 0x00, -// 0x03, 0x00, 0x01, 0x80, 0x00, 0xc0, 0x00, 0x00, -// 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -// 0x00, 0x07, 0x80, 0x07, 0xe0, 0x03, 0xf0, 0x01, -// 0xf8, 0x00, 0x78, 0x00, - - // '@' (0x40) 18x32, offset 1514-1586, at +5/-28 - 0x00, 0xff, 0xff, 0x00, 0xe0, 0xff, 0xff, 0x07, - 0xf8, 0x00, 0x00, 0x1f, 0x3c, 0x00, 0x00, 0x3c, - 0x0e, 0x00, 0x00, 0x70, 0x06, 0x00, 0x00, 0x60, - 0x07, 0xe0, 0x03, 0xe0, 0x03, 0xf0, 0x0f, 0xc0, - 0x03, 0x38, 0x1c, 0xc0, 0x03, 0x1c, 0x18, 0xc0, - 0x03, 0x0c, 0x38, 0xc0, 0x03, 0x0e, 0x30, 0xc0, - 0x06, 0x06, 0x30, 0xc0, 0x0e, 0x06, 0x30, 0x40, - 0x1c, 0x06, 0x30, 0x60, 0xf8, 0xff, 0x3f, 0x60, - 0xe0, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x30, 0x00, - // in regular row-major format -// 0x03, 0xf0, 0x03, 0xff, 0x01, 0xe0, 0xe0, 0xe0, -// 0x1c, 0x30, 0x03, 0x1c, 0x00, 0x66, 0x00, 0x19, -// 0x80, 0x06, 0xc0, 0x01, 0xb0, 0x07, 0xec, 0x07, -// 0xfb, 0x03, 0xc6, 0xc1, 0xc1, 0xb0, 0xe0, 0x6c, -// 0x30, 0x1b, 0x0c, 0x06, 0xc3, 0x01, 0xb0, 0xc0, -// 0x6c, 0x18, 0x1b, 0x07, 0x86, 0xc0, 0xff, 0xf0, -// 0x0f, 0xfc, 0x00, 0x03, 0x00, 0x00, 0x60, 0x00, -// 0x18, 0x00, 0x07, 0x00, 0x00, 0xc0, 0x00, 0x38, -// 0x00, 0x07, 0x80, 0xc0, 0xff, 0xf0, 0x0f, 0xe0, - - // 'A' (0x41) 28x26, offset 1586-1677, at +0/-25 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, - 0x00, 0x30, 0x00, 0x00, 0xe0, 0x00, 0x00, 0xf0, - 0x0f, 0x00, 0xf0, 0x3d, 0x00, 0xf8, 0xf0, 0x00, - 0x78, 0xc0, 0x03, 0xfc, 0x01, 0x0f, 0x3e, 0x06, - 0x3c, 0x3e, 0x18, 0xc0, 0x1f, 0x60, 0x00, 0x0f, - 0x80, 0x01, 0x0c, 0x00, 0x06, 0x70, 0x00, 0x18, - 0xc0, 0x07, 0x60, 0x00, 0xf8, 0x80, 0x01, 0x80, - 0x0f, 0x06, 0x00, 0xf0, 0x19, 0x30, 0x00, 0x7f, - 0xc0, 0x00, 0xe0, 0x03, 0x03, 0x00, 0x7c, 0x0c, - 0x00, 0xc0, 0x37, 0x00, 0x00, 0xf8, 0x00, 0x00, - 0x80, 0x03, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x30, - 0x00, 0x00, 0xc0, - // in regular row-major format -// 0x07, 0xff, 0x00, 0x00, 0x7f, 0xf0, 0x00, 0x00, -// 0x1b, 0x00, 0x00, 0x01, 0x98, 0x00, 0x00, 0x11, -// 0x80, 0x00, 0x03, 0x0c, 0x00, 0x00, 0x30, 0xc0, -// 0x00, 0x06, 0x0c, 0x00, 0x00, 0x60, 0x60, 0x00, -// 0x06, 0x06, 0x00, 0x00, 0xc0, 0x30, 0x00, 0x0c, -// 0x03, 0x00, 0x00, 0x80, 0x30, 0x00, 0x18, 0x01, -// 0x80, 0x01, 0x80, 0x18, 0x00, 0x3f, 0xff, 0x80, -// 0x03, 0xff, 0xfc, 0x00, 0x20, 0x00, 0xc0, 0x06, -// 0x00, 0x06, 0x00, 0x60, 0x00, 0x60, 0x0c, 0x00, -// 0x06, 0x00, 0xc0, 0x00, 0x30, 0x0c, 0x00, 0x03, -// 0x01, 0x80, 0x00, 0x18, 0x7f, 0xc0, 0x3f, 0xf7, -// 0xfc, 0x03, 0xff, - - // 'B' (0x42) 22x26, offset 1677-1749, at +3/-25 - 0x03, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x3c, 0x00, - 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0f, 0x60, 0x00, 0x3c, 0x80, 0x01, 0xf0, 0x00, - 0x06, 0xc0, 0x03, 0x18, 0x00, 0x0f, 0x60, 0x00, - 0x3c, 0x80, 0x01, 0xf0, 0x00, 0x06, 0xc0, 0x03, - 0x18, 0x00, 0x0f, 0x60, 0x00, 0x3c, 0x80, 0x01, - 0xf0, 0x00, 0x07, 0xc0, 0x06, 0x3c, 0x00, 0x3b, - 0xd8, 0x00, 0xc6, 0x71, 0x06, 0x1c, 0xfe, 0x78, - 0x38, 0xf0, 0xc1, 0x7f, 0x00, 0x00, 0x7c, 0x00, - // in regular row-major format -// 0xff, 0xff, 0x03, 0xff, 0xff, 0x01, 0x80, 0x0e, -// 0x06, 0x00, 0x1c, 0x18, 0x00, 0x38, 0x60, 0x00, -// 0x61, 0x80, 0x01, 0x86, 0x00, 0x06, 0x18, 0x00, -// 0x38, 0x60, 0x01, 0xc1, 0x80, 0x1e, 0x07, 0xff, -// 0xe0, 0x1f, 0xff, 0xc0, 0x60, 0x03, 0xc1, 0x80, -// 0x03, 0x86, 0x00, 0x06, 0x18, 0x00, 0x1c, 0x60, -// 0x00, 0x31, 0x80, 0x00, 0xc6, 0x00, 0x03, 0x18, -// 0x00, 0x0c, 0x60, 0x00, 0x61, 0x80, 0x03, 0x86, -// 0x00, 0x1c, 0xff, 0xff, 0xe3, 0xff, 0xfe, 0x00, - - // 'C' (0x43) 22x28, offset 1749-1826, at +3/-26 - 0x00, 0xfe, 0x07, 0x00, 0xfc, 0xff, 0x03, 0xf0, - 0x01, 0x78, 0x80, 0x07, 0x00, 0x0e, 0x1c, 0x00, - 0xc0, 0xc1, 0x00, 0x00, 0x38, 0x06, 0x00, 0x00, - 0x67, 0x00, 0x00, 0x60, 0x03, 0x00, 0x00, 0x36, - 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x3c, 0x00, - 0x00, 0xc0, 0x03, 0x00, 0x00, 0x3c, 0x00, 0x00, - 0xc0, 0x06, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x60, - 0x0e, 0x00, 0x00, 0xc6, 0x00, 0x00, 0x70, 0x38, - 0x00, 0x00, 0xe3, 0x0f, 0x00, 0x18, 0xfe, 0x00, - 0xc0, 0x00, 0x00, 0x00, 0x04, - // in regular row-major format -// 0x00, 0xfc, 0x00, 0x0f, 0xfe, 0x60, 0xf0, 0x3d, -// 0x87, 0x00, 0x3e, 0x38, 0x00, 0x38, 0xc0, 0x00, -// 0xe7, 0x00, 0x01, 0x98, 0x00, 0x06, 0x60, 0x00, -// 0x03, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x30, 0x00, -// 0x00, 0xc0, 0x00, 0x03, 0x00, 0x00, 0x0c, 0x00, -// 0x00, 0x30, 0x00, 0x00, 0xc0, 0x00, 0x03, 0x00, -// 0x00, 0x0c, 0x00, 0x00, 0x18, 0x00, 0x00, 0x60, -// 0x00, 0x01, 0xc0, 0x00, 0x03, 0x80, 0x00, 0xc7, -// 0x00, 0x06, 0x0e, 0x00, 0x70, 0x1e, 0x07, 0x80, -// 0x3f, 0xfc, 0x00, 0x1f, 0x80, - - // 'D' (0x44) 22x26, offset 1826-1898, at +3/-25 - 0x03, 0x00, 0x00, 0x0f, 0x00, 0x00, 0xfc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, - 0x0f, 0x00, 0x00, 0x3c, 0x00, 0x00, 0xf0, 0x00, - 0x00, 0xc0, 0x03, 0x00, 0x00, 0x0f, 0x00, 0x00, - 0x3c, 0x00, 0x00, 0xf0, 0x00, 0x00, 0xc0, 0x03, - 0x00, 0x00, 0x0f, 0x00, 0x00, 0x7c, 0x00, 0x00, - 0xb8, 0x01, 0x00, 0x60, 0x0e, 0x00, 0xc0, 0x71, - 0x00, 0x80, 0x83, 0x07, 0x00, 0x07, 0x7c, 0x00, - 0x0f, 0xc0, 0xff, 0x0f, 0x00, 0xfc, 0x0f, 0x00, - // in regular row-major format -// 0xff, 0xfe, 0x03, 0xff, 0xfe, 0x03, 0x00, 0x3c, -// 0x0c, 0x00, 0x38, 0x30, 0x00, 0x70, 0xc0, 0x00, -// 0xc3, 0x00, 0x03, 0x8c, 0x00, 0x06, 0x30, 0x00, -// 0x1c, 0xc0, 0x00, 0x33, 0x00, 0x00, 0xcc, 0x00, -// 0x03, 0x30, 0x00, 0x0c, 0xc0, 0x00, 0x33, 0x00, -// 0x00, 0xcc, 0x00, 0x03, 0x30, 0x00, 0x0c, 0xc0, -// 0x00, 0x33, 0x00, 0x01, 0x8c, 0x00, 0x06, 0x30, -// 0x00, 0x30, 0xc0, 0x01, 0xc3, 0x00, 0x0e, 0x0c, -// 0x00, 0xf0, 0xff, 0xff, 0x83, 0xff, 0xf8, 0x00, - - // 'E' (0x45) 22x26, offset 1898-1970, at +3/-25 - 0x03, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x3c, 0x00, - 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0f, 0x60, 0x00, 0x3c, 0x80, 0x01, 0xf0, 0x00, - 0x06, 0xc0, 0x03, 0x18, 0x00, 0x0f, 0x60, 0x00, - 0x3c, 0x80, 0x01, 0xf0, 0x00, 0x06, 0xc0, 0x03, - 0xff, 0x00, 0x0f, 0xfc, 0x03, 0x3c, 0x00, 0x00, - 0xf0, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x0f, - 0x00, 0x00, 0x3c, 0x00, 0x00, 0xf0, 0x1f, 0x00, - 0xc0, 0x7f, 0x00, 0xfc, 0x03, 0x00, 0xf0, 0x0f, - // in regular row-major format -// 0xff, 0xff, 0xfb, 0xff, 0xff, 0xe1, 0x80, 0x01, -// 0x86, 0x00, 0x06, 0x18, 0x00, 0x18, 0x60, 0x00, -// 0x61, 0x80, 0x01, 0x86, 0x00, 0x00, 0x18, 0x0c, -// 0x00, 0x60, 0x30, 0x01, 0x80, 0xc0, 0x07, 0xff, -// 0x00, 0x1f, 0xfc, 0x00, 0x60, 0x30, 0x01, 0x80, -// 0xc0, 0x06, 0x03, 0x00, 0x18, 0x00, 0x00, 0x60, -// 0x00, 0x01, 0x80, 0x00, 0xc6, 0x00, 0x03, 0x18, -// 0x00, 0x0c, 0x60, 0x00, 0x31, 0x80, 0x00, 0xc6, -// 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - - // 'F' (0x46) 22x26, offset 1970-2042, at +3/-25 - 0x03, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x3c, 0x00, - 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0f, 0x60, 0x00, 0x3c, 0x80, 0x01, 0xf0, 0x00, - 0x06, 0xc0, 0x03, 0x18, 0x00, 0x0f, 0x60, 0x00, - 0x3c, 0x80, 0x01, 0xf0, 0x00, 0x06, 0xc0, 0x03, - 0xff, 0x00, 0x0c, 0xfc, 0x03, 0x30, 0x00, 0x00, - 0xc0, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0c, - 0x00, 0x00, 0x30, 0x00, 0x00, 0xc0, 0x00, 0x00, - 0x00, 0x7f, 0x00, 0x00, 0xfc, 0x01, 0x00, 0x00, - // in regular row-major format -// 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x80, 0x00, -// 0xc6, 0x00, 0x03, 0x18, 0x00, 0x0c, 0x60, 0x00, -// 0x31, 0x80, 0x00, 0xc6, 0x00, 0x00, 0x18, 0x0c, -// 0x00, 0x60, 0x30, 0x01, 0x80, 0xc0, 0x07, 0xff, -// 0x00, 0x1f, 0xfc, 0x00, 0x60, 0x30, 0x01, 0x80, -// 0xc0, 0x06, 0x03, 0x00, 0x18, 0x00, 0x00, 0x60, -// 0x00, 0x01, 0x80, 0x00, 0x06, 0x00, 0x00, 0x18, -// 0x00, 0x00, 0x60, 0x00, 0x01, 0x80, 0x00, 0x06, -// 0x00, 0x00, 0xff, 0xf0, 0x03, 0xff, 0xc0, 0x00, - - // 'G' (0x47) 23x28, offset 2042-2123, at +3/-26 - 0x00, 0xfe, 0x0f, 0x00, 0xfc, 0xff, 0x03, 0xe0, - 0x03, 0xf8, 0x00, 0x07, 0x00, 0x1c, 0x18, 0x00, - 0x80, 0xc1, 0x00, 0x00, 0x30, 0x0e, 0x00, 0x00, - 0x67, 0x00, 0x00, 0x60, 0x07, 0x00, 0x00, 0x36, - 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x3c, 0x00, - 0x00, 0xc0, 0x03, 0x00, 0x00, 0x3c, 0x00, 0x18, - 0xc0, 0x03, 0x80, 0x01, 0x3c, 0x00, 0x18, 0xc0, - 0x06, 0x80, 0x01, 0x6c, 0x00, 0x18, 0x60, 0x0c, - 0x80, 0x01, 0xc6, 0x01, 0x18, 0x60, 0x7e, 0x80, - 0xff, 0xe3, 0x07, 0xf8, 0x3f, 0x00, 0x80, 0x01, - 0x00, - // in regular row-major format -// 0x00, 0xff, 0x00, 0x07, 0xff, 0x98, 0x1e, 0x03, -// 0xf0, 0x70, 0x01, 0xe1, 0x80, 0x01, 0xc6, 0x00, -// 0x01, 0x9c, 0x00, 0x03, 0x30, 0x00, 0x00, 0x60, -// 0x00, 0x01, 0xc0, 0x00, 0x03, 0x00, 0x00, 0x06, -// 0x00, 0x00, 0x0c, 0x00, 0x00, 0x18, 0x00, 0x00, -// 0x30, 0x00, 0x00, 0x60, 0x03, 0xff, 0xc0, 0x07, -// 0xff, 0x80, 0x00, 0x1b, 0x00, 0x00, 0x37, 0x00, -// 0x00, 0x66, 0x00, 0x00, 0xcc, 0x00, 0x01, 0x8c, -// 0x00, 0x03, 0x1c, 0x00, 0x06, 0x1e, 0x00, 0x0c, -// 0x0f, 0x00, 0xf8, 0x0f, 0xff, 0xc0, 0x03, 0xfc, -// 0x00, - - // 'H' (0x48) 23x26, offset 2123-2198, at +3/-25 - 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x3c, 0x00, - 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0f, 0x60, 0x00, 0x3c, 0x80, 0x01, 0xf0, 0x00, - 0x06, 0xc0, 0x00, 0x18, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x80, 0x01, 0x00, 0x00, 0x06, 0x00, 0x00, - 0x18, 0x00, 0x00, 0x60, 0x00, 0x00, 0x80, 0x01, - 0xc0, 0x00, 0x06, 0xc0, 0x03, 0x18, 0x00, 0x0f, - 0x60, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x03, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0c, - 0x00, 0x00, 0x30, - // in regular row-major format -// 0x7f, 0x01, 0xfc, 0xfe, 0x03, 0xf8, 0x60, 0x00, -// 0xc0, 0xc0, 0x01, 0x81, 0x80, 0x03, 0x03, 0x00, -// 0x06, 0x06, 0x00, 0x0c, 0x0c, 0x00, 0x18, 0x18, -// 0x00, 0x30, 0x30, 0x00, 0x60, 0x60, 0x00, 0xc0, -// 0xff, 0xff, 0x81, 0xff, 0xff, 0x03, 0x00, 0x06, -// 0x06, 0x00, 0x0c, 0x0c, 0x00, 0x18, 0x18, 0x00, -// 0x30, 0x30, 0x00, 0x60, 0x60, 0x00, 0xc0, 0xc0, -// 0x01, 0x81, 0x80, 0x03, 0x03, 0x00, 0x06, 0x06, -// 0x00, 0x0c, 0x0c, 0x00, 0x18, 0xff, 0x01, 0xff, -// 0xfe, 0x03, 0xfc, - - // 'I' (0x49) 16x26, offset 2198-2250, at +6/-25 - 0x03, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x3c, 0x00, - 0x00, 0xf0, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, - 0x0f, 0x00, 0x00, 0x3c, 0x00, 0x00, 0xf0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, - 0x3c, 0x00, 0x00, 0xf0, 0x00, 0x00, 0xc0, 0x03, - 0x00, 0x00, 0x0f, 0x00, 0x00, 0x3c, 0x00, 0x00, - 0xf0, 0x00, 0x00, 0xc0, - // in regular row-major format -// 0xff, 0xff, 0xff, 0xff, 0x01, 0x80, 0x01, 0x80, -// 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, -// 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, -// 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, -// 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, -// 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, -// 0xff, 0xff, 0xff, 0xff, - - // 'J' (0x4a) 23x27, offset 2250-2328, at +4/-25 - 0x00, 0x80, 0x7f, 0x00, 0x00, 0xfc, 0x07, 0x00, - 0x00, 0x70, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, - 0x30, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x18, - 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x1e, 0x00, - 0x00, 0xf0, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, - 0x3c, 0x00, 0x00, 0xb0, 0x01, 0x00, 0x80, 0x0d, - 0x00, 0x00, 0x66, 0x00, 0x00, 0x1c, 0xff, 0xff, - 0x7f, 0xf8, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x30, 0x00, 0x00, 0x80, 0x01, - 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - // in regular row-major format -// 0x00, 0xff, 0xfe, 0x01, 0xff, 0xfc, 0x00, 0x03, -// 0x00, 0x00, 0x06, 0x00, 0x00, 0x0c, 0x00, 0x00, -// 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, 0x00, -// 0x00, 0xc0, 0x00, 0x01, 0x80, 0x00, 0x03, 0x00, -// 0x00, 0x06, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x18, -// 0x00, 0x00, 0x30, 0x60, 0x00, 0x60, 0xc0, 0x00, -// 0xc1, 0x80, 0x01, 0x83, 0x00, 0x03, 0x06, 0x00, -// 0x06, 0x0c, 0x00, 0x0c, 0x18, 0x00, 0x30, 0x38, -// 0x00, 0x60, 0x38, 0x01, 0x80, 0x3c, 0x0e, 0x00, -// 0x3f, 0xf8, 0x00, 0x0f, 0xc0, 0x00, - - // 'K' (0x4b) 24x26, offset 2328-2406, at +3/-25 - 0x03, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x3c, 0x00, - 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0f, 0x80, 0x01, 0x3c, 0x00, 0x03, 0xf0, 0x00, - 0x0e, 0xc0, 0x03, 0x1c, 0x00, 0x03, 0x78, 0x00, - 0x00, 0xe0, 0x01, 0x00, 0xc0, 0x0c, 0x00, 0x80, - 0x31, 0x00, 0x00, 0x83, 0x01, 0x00, 0x0e, 0x1c, - 0xc0, 0x1c, 0xe0, 0x00, 0x3b, 0x00, 0x0f, 0x6c, - 0x00, 0xf0, 0xf1, 0x00, 0x00, 0xdf, 0x01, 0x00, - 0xf0, 0x03, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x3c, - 0x00, 0x00, 0x30, 0x00, 0x00, 0xc0, - // in regular row-major format -// 0xff, 0x81, 0xfe, 0xff, 0x81, 0xfe, 0x18, 0x00, -// 0x30, 0x18, 0x00, 0xe0, 0x18, 0x01, 0xc0, 0x18, -// 0x03, 0x80, 0x18, 0x07, 0x00, 0x18, 0x0e, 0x00, -// 0x18, 0x18, 0x00, 0x18, 0x70, 0x00, 0x18, 0xe0, -// 0x00, 0x19, 0xe0, 0x00, 0x1b, 0xf8, 0x00, 0x1f, -// 0x1c, 0x00, 0x1c, 0x06, 0x00, 0x18, 0x03, 0x00, -// 0x18, 0x03, 0x80, 0x18, 0x01, 0x80, 0x18, 0x00, -// 0xc0, 0x18, 0x00, 0xc0, 0x18, 0x00, 0x60, 0x18, -// 0x00, 0x60, 0x18, 0x00, 0x70, 0x18, 0x00, 0x30, -// 0xff, 0x80, 0x3f, 0xff, 0x80, 0x1f, - - // 'L' (0x4c) 21x26, offset 2406-2475, at +4/-25 - 0x03, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x3c, 0x00, - 0x00, 0xf0, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, - 0x00, 0xc0, 0x03, 0x00, 0x00, 0x0f, 0x00, 0x00, - 0x3c, 0x00, 0x00, 0xf0, 0x00, 0x00, 0xc0, 0x00, - 0x00, 0x00, 0x03, 0x00, 0x00, 0x0c, 0x00, 0x00, - 0x30, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x03, - 0x00, 0x00, 0x0c, 0x00, 0x00, 0x30, 0x00, 0xc0, - 0xff, 0x00, 0x00, 0xff, 0x03, - // in regular row-major format -// 0xff, 0xf0, 0x07, 0xff, 0x80, 0x01, 0x80, 0x00, -// 0x0c, 0x00, 0x00, 0x60, 0x00, 0x03, 0x00, 0x00, -// 0x18, 0x00, 0x00, 0xc0, 0x00, 0x06, 0x00, 0x00, -// 0x30, 0x00, 0x01, 0x80, 0x00, 0x0c, 0x00, 0x00, -// 0x60, 0x00, 0x03, 0x00, 0x00, 0x18, 0x00, 0x00, -// 0xc0, 0x00, 0x06, 0x00, 0x18, 0x30, 0x00, 0xc1, -// 0x80, 0x06, 0x0c, 0x00, 0x30, 0x60, 0x01, 0x83, -// 0x00, 0x0c, 0x18, 0x00, 0x60, 0xc0, 0x03, 0xff, -// 0xff, 0xff, 0xff, 0xff, 0xc0, - - // 'M' (0x4d) 26x26, offset 2475-2560, at +1/-25 - 0x03, 0x00, 0x00, 0x0f, 0x00, 0x00, 0xfc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, - 0x3f, 0x00, 0x00, 0xcc, 0x07, 0x00, 0x30, 0x7c, - 0x00, 0xc0, 0xc0, 0x07, 0x00, 0x00, 0x7c, 0x00, - 0x00, 0x80, 0x07, 0x00, 0x00, 0x78, 0x00, 0x00, - 0x80, 0x03, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x1e, - 0x00, 0x00, 0x1e, 0x00, 0x00, 0x1f, 0x00, 0x00, - 0x1f, 0x00, 0x00, 0x1f, 0x00, 0x30, 0x1f, 0x00, - 0xc0, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0xfc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, - 0x00, 0x0f, 0x00, 0x00, 0x0c, - // in regular row-major format -// 0xfc, 0x00, 0x0f, 0xff, 0x00, 0x03, 0xf3, 0x60, -// 0x01, 0xb0, 0xd8, 0x00, 0x6c, 0x33, 0x00, 0x33, -// 0x0c, 0xc0, 0x0c, 0xc3, 0x38, 0x07, 0x30, 0xc6, -// 0x01, 0x8c, 0x31, 0xc0, 0xe3, 0x0c, 0x30, 0x30, -// 0xc3, 0x0c, 0x0c, 0x30, 0xc1, 0x86, 0x0c, 0x30, -// 0x61, 0x83, 0x0c, 0x0c, 0xc0, 0xc3, 0x03, 0x30, -// 0x30, 0xc0, 0x78, 0x0c, 0x30, 0x1e, 0x03, 0x0c, -// 0x03, 0x00, 0xc3, 0x00, 0x00, 0x30, 0xc0, 0x00, -// 0x0c, 0x30, 0x00, 0x03, 0x0c, 0x00, 0x00, 0xc3, -// 0x00, 0x00, 0x30, 0xc0, 0x00, 0x0c, 0xff, 0x00, -// 0x3f, 0xff, 0xc0, 0x0f, 0xf0, - - // 'N' (0x4e) 24x26, offset 2560-2638, at +2/-25 - 0x03, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x3c, 0x00, - 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x3f, 0x00, 0x00, 0xcc, 0x01, 0x00, 0x30, 0x1e, - 0x00, 0xc0, 0xe0, 0x00, 0x00, 0x03, 0x0f, 0x00, - 0x00, 0xf0, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, - 0x78, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x3c, - 0x00, 0x00, 0xc0, 0x03, 0x03, 0x00, 0x1c, 0x0c, - 0x00, 0xe0, 0x31, 0x00, 0x00, 0xce, 0x00, 0x00, - 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, - 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, - // in regular row-major format -// 0xfc, 0x00, 0xff, 0xfc, 0x00, 0xff, 0x1e, 0x00, -// 0x0c, 0x1f, 0x00, 0x0c, 0x1b, 0x00, 0x0c, 0x19, -// 0x80, 0x0c, 0x19, 0xc0, 0x0c, 0x18, 0xc0, 0x0c, -// 0x18, 0x60, 0x0c, 0x18, 0x60, 0x0c, 0x18, 0x30, -// 0x0c, 0x18, 0x38, 0x0c, 0x18, 0x18, 0x0c, 0x18, -// 0x0c, 0x0c, 0x18, 0x0e, 0x0c, 0x18, 0x06, 0x0c, -// 0x18, 0x03, 0x0c, 0x18, 0x03, 0x0c, 0x18, 0x01, -// 0x8c, 0x18, 0x01, 0xcc, 0x18, 0x00, 0xcc, 0x18, -// 0x00, 0x6c, 0x18, 0x00, 0x7c, 0x18, 0x00, 0x3c, -// 0x7f, 0x80, 0x1c, 0x7f, 0x80, 0x1c, - - // 'O' (0x4f) 24x28, offset 2638-2722, at +2/-26 - 0x00, 0xfc, 0x03, 0x00, 0xf8, 0xff, 0x01, 0xe0, - 0x03, 0x7c, 0x00, 0x0f, 0x00, 0x0f, 0x38, 0x00, - 0xc0, 0xc1, 0x01, 0x00, 0x38, 0x0c, 0x00, 0x00, - 0x67, 0x00, 0x00, 0x60, 0x06, 0x00, 0x00, 0x36, - 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x3c, 0x00, - 0x00, 0xc0, 0x03, 0x00, 0x00, 0x3c, 0x00, 0x00, - 0xc0, 0x03, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x60, - 0x06, 0x00, 0x00, 0xe6, 0x00, 0x00, 0x70, 0x1c, - 0x00, 0x80, 0x83, 0x03, 0x00, 0x1c, 0xf0, 0x00, - 0xf0, 0x00, 0x3e, 0xc0, 0x07, 0x80, 0xff, 0x1f, - 0x00, 0xc0, 0x3f, 0x00, - // in regular row-major format -// 0x00, 0x7e, 0x00, 0x01, 0xff, 0xc0, 0x07, 0x81, -// 0xe0, 0x0e, 0x00, 0x70, 0x1c, 0x00, 0x38, 0x38, -// 0x00, 0x1c, 0x30, 0x00, 0x0c, 0x70, 0x00, 0x0e, -// 0x60, 0x00, 0x06, 0x60, 0x00, 0x06, 0xc0, 0x00, -// 0x03, 0xc0, 0x00, 0x03, 0xc0, 0x00, 0x03, 0xc0, -// 0x00, 0x03, 0xc0, 0x00, 0x03, 0xc0, 0x00, 0x03, -// 0xc0, 0x00, 0x03, 0xc0, 0x00, 0x03, 0x60, 0x00, -// 0x06, 0x60, 0x00, 0x06, 0x70, 0x00, 0x0e, 0x30, -// 0x00, 0x0c, 0x38, 0x00, 0x1c, 0x1c, 0x00, 0x38, -// 0x0e, 0x00, 0x70, 0x07, 0x81, 0xe0, 0x03, 0xff, -// 0xc0, 0x00, 0x7e, 0x00, - - // 'P' (0x50) 21x26, offset 2722-2791, at +3/-25 - 0x03, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x3c, 0x00, - 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0f, 0x80, 0x01, 0x3c, 0x00, 0x06, 0xf0, 0x00, - 0x18, 0xc0, 0x03, 0x60, 0x00, 0x0f, 0x80, 0x01, - 0x3c, 0x00, 0x06, 0xf0, 0x00, 0x18, 0xc0, 0x03, - 0x60, 0x00, 0x0c, 0x80, 0x01, 0x30, 0x00, 0x06, - 0xc0, 0x01, 0x0c, 0x00, 0x06, 0x30, 0x00, 0x38, - 0x60, 0x00, 0xc0, 0xe1, 0x01, 0x00, 0xfe, 0x01, - 0x00, 0xe0, 0x03, 0x00, 0x00, - // in regular row-major format -// 0xff, 0xff, 0x07, 0xff, 0xfe, 0x06, 0x00, 0x78, -// 0x30, 0x00, 0xe1, 0x80, 0x03, 0x0c, 0x00, 0x0c, -// 0x60, 0x00, 0x63, 0x00, 0x03, 0x18, 0x00, 0x18, -// 0xc0, 0x01, 0xc6, 0x00, 0x0c, 0x30, 0x00, 0xc1, -// 0x80, 0x1e, 0x0f, 0xff, 0xc0, 0x7f, 0xf8, 0x03, -// 0x00, 0x00, 0x18, 0x00, 0x00, 0xc0, 0x00, 0x06, -// 0x00, 0x00, 0x30, 0x00, 0x01, 0x80, 0x00, 0x0c, -// 0x00, 0x00, 0x60, 0x00, 0x03, 0x00, 0x00, 0xff, -// 0xf0, 0x07, 0xff, 0x80, 0x00, - - // 'Q' (0x51) 24x32, offset 2791-2887, at +2/-26 - 0x00, 0xfc, 0x03, 0x00, 0x80, 0xff, 0x1f, 0x00, - 0xe0, 0x03, 0x3c, 0x00, 0xf0, 0x00, 0x70, 0x00, - 0x38, 0x00, 0xc0, 0x00, 0x1c, 0x00, 0x80, 0xc1, - 0x0c, 0x00, 0x00, 0xe3, 0x06, 0x00, 0x00, 0xe2, - 0x06, 0x00, 0x00, 0x76, 0x03, 0x00, 0x00, 0x7c, - 0x03, 0x00, 0x00, 0x7c, 0x03, 0x00, 0x00, 0x6c, - 0x03, 0x00, 0x00, 0x6c, 0x03, 0x00, 0x00, 0x6c, - 0x03, 0x00, 0x00, 0x6c, 0x06, 0x00, 0x00, 0x66, - 0x06, 0x00, 0x00, 0xe6, 0x0c, 0x00, 0x00, 0xc7, - 0x1c, 0x00, 0x80, 0xc3, 0x38, 0x00, 0xc0, 0xc1, - 0xf0, 0x00, 0xf0, 0xc0, 0xe0, 0x03, 0x7c, 0x60, - 0x80, 0xff, 0x1f, 0x60, 0x00, 0xfc, 0x03, 0x20, - // in regular row-major format -// 0x00, 0x7e, 0x00, 0x01, 0xff, 0x80, 0x07, 0x81, -// 0xe0, 0x0e, 0x00, 0x70, 0x1c, 0x00, 0x38, 0x38, -// 0x00, 0x1c, 0x30, 0x00, 0x0c, 0x70, 0x00, 0x0e, -// 0x60, 0x00, 0x06, 0x60, 0x00, 0x06, 0xc0, 0x00, -// 0x03, 0xc0, 0x00, 0x03, 0xc0, 0x00, 0x03, 0xc0, -// 0x00, 0x03, 0xc0, 0x00, 0x03, 0xc0, 0x00, 0x03, -// 0xc0, 0x00, 0x03, 0xc0, 0x00, 0x03, 0x60, 0x00, -// 0x06, 0x60, 0x00, 0x06, 0x70, 0x00, 0x0e, 0x30, -// 0x00, 0x0c, 0x18, 0x00, 0x1c, 0x0c, 0x00, 0x38, -// 0x06, 0x00, 0x70, 0x03, 0x81, 0xe0, 0x00, 0xff, -// 0xc0, 0x00, 0x7e, 0x00, 0x00, 0xe0, 0x00, 0x03, -// 0xff, 0x87, 0x07, 0xff, 0xfe, 0x07, 0x00, 0xf8, - - // 'R' (0x52) 24x26, offset 2887-2965, at +3/-25 - 0x03, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x3c, 0x00, - 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0f, 0x80, 0x01, 0x3c, 0x00, 0x06, 0xf0, 0x00, - 0x18, 0xc0, 0x03, 0x60, 0x00, 0x0f, 0x80, 0x01, - 0x30, 0x00, 0x06, 0xc0, 0x00, 0x18, 0x00, 0x03, - 0xe0, 0x00, 0x0c, 0xc0, 0x07, 0x70, 0x00, 0x3b, - 0x80, 0x01, 0xce, 0x01, 0x0e, 0x18, 0x0e, 0x70, - 0x38, 0x70, 0x80, 0x7f, 0x80, 0x07, 0xf8, 0x00, - 0x78, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x0c, - 0x00, 0x00, 0x30, 0x00, 0x00, 0xc0, - // in regular row-major format -// 0xff, 0xfe, 0x00, 0xff, 0xff, 0x80, 0x18, 0x03, -// 0xc0, 0x18, 0x00, 0xe0, 0x18, 0x00, 0x60, 0x18, -// 0x00, 0x30, 0x18, 0x00, 0x30, 0x18, 0x00, 0x30, -// 0x18, 0x00, 0x30, 0x18, 0x00, 0x70, 0x18, 0x00, -// 0x60, 0x18, 0x01, 0xc0, 0x18, 0x07, 0x80, 0x1f, -// 0xff, 0x00, 0x1f, 0xfc, 0x00, 0x18, 0x0e, 0x00, -// 0x18, 0x07, 0x00, 0x18, 0x03, 0x80, 0x18, 0x01, -// 0xc0, 0x18, 0x00, 0xe0, 0x18, 0x00, 0x60, 0x18, -// 0x00, 0x30, 0x18, 0x00, 0x30, 0x18, 0x00, 0x18, -// 0xff, 0x80, 0x1f, 0xff, 0x80, 0x0f, - - // 'S' (0x53) 20x28, offset 2965-3035, at +4/-26 - 0x00, 0x00, 0xf0, 0x07, 0x3e, 0x00, 0x7f, 0xf8, - 0x07, 0xc0, 0xc1, 0xe1, 0x00, 0x30, 0x0e, 0x18, - 0x00, 0x67, 0x80, 0x01, 0x60, 0x07, 0x30, 0x00, - 0x3e, 0x00, 0x03, 0xc0, 0x03, 0x30, 0x00, 0x3c, - 0x00, 0x03, 0xc0, 0x03, 0x60, 0x00, 0x3c, 0x00, - 0x06, 0xc0, 0x03, 0x60, 0x00, 0x6c, 0x00, 0x06, - 0xe0, 0x06, 0x40, 0x00, 0xc6, 0x00, 0x0c, 0x70, - 0x1c, 0xc0, 0x01, 0xe3, 0x0f, 0x38, 0x3c, 0xfe, - 0x00, 0xff, 0x01, 0x00, 0xe0, 0x07, - // in regular row-major format -// 0x03, 0xf8, 0x00, 0xff, 0xe6, 0x1e, 0x07, 0xe3, -// 0x80, 0x1e, 0x30, 0x00, 0xe6, 0x00, 0x06, 0x60, -// 0x00, 0x66, 0x00, 0x06, 0x60, 0x00, 0x07, 0x00, -// 0x00, 0x30, 0x00, 0x01, 0xc0, 0x00, 0x0f, 0xc0, -// 0x00, 0x3f, 0xc0, 0x00, 0x3f, 0x80, 0x00, 0x1c, -// 0x00, 0x00, 0xe0, 0x00, 0x07, 0x00, 0x00, 0x30, -// 0x00, 0x03, 0xc0, 0x00, 0x3c, 0x00, 0x03, 0xe0, -// 0x00, 0x7e, 0x00, 0x06, 0xf8, 0x01, 0xed, 0xe0, -// 0x7c, 0xcf, 0xff, 0x00, 0x3f, 0xc0, - - // 'T' (0x54) 22x26, offset 3035-3107, at +3/-25 - 0x7f, 0x00, 0x00, 0xfc, 0x01, 0x00, 0x30, 0x00, - 0x00, 0xc0, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, - 0x0f, 0x00, 0x00, 0x3c, 0x00, 0x00, 0xf0, 0x00, - 0x00, 0xc0, 0x03, 0x00, 0x00, 0x0f, 0x00, 0x00, - 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, - 0x00, 0x00, 0x0f, 0x00, 0x00, 0x3c, 0x00, 0x00, - 0xf0, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x0f, - 0x00, 0x00, 0x3c, 0x00, 0x00, 0xc0, 0x00, 0x00, - 0x00, 0x7f, 0x00, 0x00, 0xfc, 0x01, 0x00, 0x00, - // in regular row-major format -// 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x03, 0x00, -// 0xf0, 0x0c, 0x03, 0xc0, 0x30, 0x0f, 0x00, 0xc0, -// 0x3c, 0x03, 0x00, 0xc0, 0x0c, 0x00, 0x00, 0x30, -// 0x00, 0x00, 0xc0, 0x00, 0x03, 0x00, 0x00, 0x0c, -// 0x00, 0x00, 0x30, 0x00, 0x00, 0xc0, 0x00, 0x03, -// 0x00, 0x00, 0x0c, 0x00, 0x00, 0x30, 0x00, 0x00, -// 0xc0, 0x00, 0x03, 0x00, 0x00, 0x0c, 0x00, 0x00, -// 0x30, 0x00, 0x00, 0xc0, 0x00, 0x03, 0x00, 0x00, -// 0x0c, 0x00, 0x0f, 0xff, 0xc0, 0x3f, 0xff, 0x00, - - // 'U' (0x55) 23x27, offset 3107-3185, at +3/-25 - 0x03, 0x00, 0x00, 0x18, 0x00, 0x00, 0xc0, 0xff, - 0xff, 0x07, 0xfe, 0xff, 0xff, 0x30, 0x00, 0x00, - 0x8f, 0x01, 0x00, 0xe0, 0x0c, 0x00, 0x00, 0x6e, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x07, 0x00, - 0x00, 0x30, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x03, - 0x00, 0x00, 0x7c, 0x00, 0x00, 0x60, 0x03, 0x00, - 0x80, 0x1b, 0x00, 0x00, 0xce, 0x00, 0x00, 0x3c, - 0xfe, 0xff, 0xff, 0xf0, 0xff, 0xff, 0x81, 0x01, - 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - // in regular row-major format -// 0xff, 0x01, 0xff, 0xfe, 0x03, 0xfc, 0xc0, 0x00, -// 0x61, 0x80, 0x00, 0xc3, 0x00, 0x01, 0x86, 0x00, -// 0x03, 0x0c, 0x00, 0x06, 0x18, 0x00, 0x0c, 0x30, -// 0x00, 0x18, 0x60, 0x00, 0x30, 0xc0, 0x00, 0x61, -// 0x80, 0x00, 0xc3, 0x00, 0x01, 0x86, 0x00, 0x03, -// 0x0c, 0x00, 0x06, 0x18, 0x00, 0x0c, 0x30, 0x00, -// 0x18, 0x60, 0x00, 0x30, 0xc0, 0x00, 0x61, 0x80, -// 0x00, 0xc3, 0x80, 0x03, 0x83, 0x00, 0x06, 0x07, -// 0x00, 0x1c, 0x07, 0x00, 0x70, 0x07, 0x83, 0xc0, -// 0x07, 0xff, 0x00, 0x03, 0xf8, 0x00, - - // 'V' (0x56) 28x26, offset 3185-3276, at +0/-25 - 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x30, 0x00, - 0x00, 0xc0, 0x01, 0x00, 0x00, 0x1f, 0x00, 0x00, - 0xec, 0x03, 0x00, 0x30, 0x7e, 0x00, 0xc0, 0xc0, - 0x07, 0x00, 0x03, 0xfc, 0x00, 0x0c, 0x80, 0x0f, - 0x00, 0x00, 0xf8, 0x01, 0x00, 0x00, 0x1f, 0x00, - 0x00, 0xe0, 0x03, 0x00, 0x00, 0x0e, 0x00, 0x00, - 0x38, 0x00, 0x00, 0x78, 0x00, 0x00, 0x7c, 0x00, - 0x00, 0x3c, 0x30, 0x00, 0x3e, 0xc0, 0x00, 0x3e, - 0x00, 0x03, 0x1f, 0x00, 0x0c, 0x1f, 0x00, 0xb0, - 0x0f, 0x00, 0xc0, 0x0f, 0x00, 0x00, 0x07, 0x00, - 0x00, 0x0c, 0x00, 0x00, 0x30, 0x00, 0x00, 0xc0, - 0x00, 0x00, 0x00, - // in regular row-major format -// 0x7f, 0xc0, 0x3f, 0xf7, 0xfc, 0x03, 0xff, 0x18, -// 0x00, 0x01, 0x80, 0xc0, 0x00, 0x30, 0x0c, 0x00, -// 0x03, 0x00, 0x60, 0x00, 0x30, 0x06, 0x00, 0x06, -// 0x00, 0x60, 0x00, 0x60, 0x03, 0x00, 0x0c, 0x00, -// 0x30, 0x00, 0xc0, 0x03, 0x80, 0x0c, 0x00, 0x18, -// 0x01, 0x80, 0x01, 0x80, 0x18, 0x00, 0x0c, 0x03, -// 0x00, 0x00, 0xc0, 0x30, 0x00, 0x0e, 0x03, 0x00, -// 0x00, 0x60, 0x60, 0x00, 0x06, 0x06, 0x00, 0x00, -// 0x30, 0xc0, 0x00, 0x03, 0x0c, 0x00, 0x00, 0x30, -// 0x80, 0x00, 0x01, 0x98, 0x00, 0x00, 0x19, 0x80, -// 0x00, 0x00, 0xf0, 0x00, 0x00, 0x0f, 0x00, 0x00, -// 0x00, 0xe0, 0x00, - - // 'W' (0x57) 26x26, offset 3276-3361, at +1/-25 - 0x03, 0x00, 0x00, 0x0c, 0x00, 0x00, 0xf0, 0x07, - 0x00, 0xc0, 0xff, 0x3f, 0x00, 0x83, 0xff, 0xff, - 0x0c, 0x00, 0xfe, 0x3f, 0x00, 0x00, 0xf0, 0x00, - 0x00, 0xfc, 0x03, 0x00, 0x7e, 0x00, 0x80, 0x3f, - 0x00, 0xc0, 0x0f, 0x00, 0xf0, 0x07, 0x00, 0xe0, - 0x01, 0x00, 0x80, 0x07, 0x00, 0x00, 0xfe, 0x00, - 0x00, 0xc0, 0x3f, 0x00, 0x00, 0xf0, 0x07, 0x0c, - 0x00, 0xfe, 0x31, 0x00, 0x80, 0xff, 0x00, 0x00, - 0xe0, 0x03, 0x00, 0xfc, 0x0f, 0xf0, 0xff, 0xf7, - 0xff, 0x1f, 0xc0, 0x3f, 0x00, 0x00, 0x03, 0x00, - 0x00, 0x0c, 0x00, 0x00, 0x00, - // in regular row-major format -// 0xff, 0x80, 0x7f, 0xff, 0xe0, 0x1f, 0xf3, 0x00, -// 0x00, 0x30, 0xc0, 0x00, 0x0c, 0x30, 0x00, 0x03, -// 0x0c, 0x03, 0x80, 0xc3, 0x01, 0xe0, 0x30, 0x60, -// 0x78, 0x0c, 0x18, 0x1f, 0x02, 0x06, 0x04, 0xc0, -// 0x81, 0x83, 0x30, 0x60, 0x60, 0xcc, 0x18, 0x18, -// 0x31, 0x86, 0x06, 0x18, 0x61, 0x81, 0x86, 0x18, -// 0x60, 0x71, 0x87, 0x18, 0x0c, 0x40, 0xc6, 0x03, -// 0x30, 0x31, 0x00, 0xcc, 0x0c, 0xc0, 0x33, 0x01, -// 0xb0, 0x0d, 0x80, 0x6c, 0x03, 0x60, 0x1b, 0x00, -// 0xd8, 0x06, 0xc0, 0x34, 0x00, 0xf0, 0x07, 0x00, -// 0x3c, 0x01, 0xc0, 0x0e, 0x00, - - // 'X' (0x58) 24x26, offset 3361-3439, at +2/-25 - 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x3c, 0x00, - 0x00, 0xf8, 0x01, 0x00, 0xf0, 0x1f, 0x00, 0xe0, - 0xef, 0x00, 0xe0, 0x3c, 0x07, 0xc0, 0xf1, 0x78, - 0x80, 0xc3, 0x80, 0x03, 0x07, 0x00, 0x1c, 0x07, - 0x00, 0xe0, 0x0e, 0x00, 0x00, 0x1f, 0x00, 0x00, - 0x78, 0x00, 0x00, 0xb8, 0x03, 0x00, 0x70, 0x1c, - 0x00, 0xe0, 0xc0, 0x01, 0xc3, 0x01, 0x0e, 0xcf, - 0x01, 0x70, 0xbc, 0x03, 0x80, 0xf3, 0x07, 0x00, - 0xf8, 0x0f, 0x00, 0xc0, 0x0f, 0x00, 0x00, 0x3e, - 0x00, 0x00, 0xf0, 0x00, 0x00, 0xc0, - // in regular row-major format -// 0x7f, 0x00, 0xff, 0x7f, 0x00, 0xff, 0x18, 0x00, -// 0x18, 0x0c, 0x00, 0x38, 0x0e, 0x00, 0x70, 0x07, -// 0x00, 0x60, 0x03, 0x00, 0xc0, 0x01, 0x81, 0x80, -// 0x01, 0xc3, 0x80, 0x00, 0xe7, 0x00, 0x00, 0x76, -// 0x00, 0x00, 0x3c, 0x00, 0x00, 0x18, 0x00, 0x00, -// 0x3c, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x66, 0x00, -// 0x00, 0xc3, 0x00, 0x01, 0x81, 0x80, 0x03, 0x81, -// 0xc0, 0x07, 0x00, 0xe0, 0x06, 0x00, 0x60, 0x0c, -// 0x00, 0x30, 0x18, 0x00, 0x18, 0x38, 0x00, 0x1c, -// 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, - - // 'Y' (0x59) 24x26, offset 3439-3517, at +2/-25 - 0x03, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x30, 0x00, - 0x00, 0xc0, 0x01, 0x00, 0x00, 0x1f, 0x00, 0x00, - 0xec, 0x00, 0x00, 0x3c, 0x0f, 0x00, 0xf0, 0x70, - 0x00, 0xc0, 0x80, 0x07, 0x00, 0x03, 0x38, 0x00, - 0x0c, 0xc0, 0x03, 0x30, 0x00, 0xfc, 0xff, 0x00, - 0xf0, 0xff, 0x03, 0xf0, 0x00, 0x0c, 0xe0, 0x00, - 0x30, 0xe0, 0x01, 0xc0, 0xc3, 0x01, 0x00, 0xcf, - 0x03, 0x00, 0xbc, 0x03, 0x00, 0xf0, 0x07, 0x00, - 0x00, 0x07, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x30, - 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, - // in regular row-major format -// 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x18, 0x00, -// 0x18, 0x0c, 0x00, 0x30, 0x0e, 0x00, 0x70, 0x06, -// 0x00, 0x60, 0x03, 0x00, 0xc0, 0x03, 0x81, 0xc0, -// 0x01, 0x81, 0x80, 0x00, 0xc3, 0x00, 0x00, 0xe7, -// 0x00, 0x00, 0x66, 0x00, 0x00, 0x3c, 0x00, 0x00, -// 0x3c, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, -// 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, -// 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, -// 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, -// 0x07, 0xff, 0xe0, 0x07, 0xff, 0xe0, - - // 'Z' (0x5a) 18x26, offset 3517-3576, at +5/-25 - 0x00, 0x00, 0xc0, 0xff, 0x03, 0x80, 0xff, 0x0f, - 0x00, 0xf7, 0x00, 0x00, 0xcf, 0x03, 0x00, 0x0e, - 0x0f, 0x00, 0x1e, 0x3c, 0x00, 0x3c, 0xf0, 0x00, - 0x38, 0xc0, 0x03, 0x78, 0x00, 0x0f, 0x70, 0x00, - 0x3c, 0xf0, 0x00, 0xf0, 0xe0, 0x01, 0xc0, 0xe3, - 0x01, 0x00, 0xcf, 0x03, 0x00, 0xbc, 0x03, 0x00, - 0xf0, 0x07, 0x00, 0xc0, 0x07, 0x00, 0xfe, 0x03, - 0x00, 0xf8, 0x0f, - // in regular row-major format -// 0x7f, 0xff, 0x9f, 0xff, 0xe6, 0x00, 0x19, 0x80, -// 0x0c, 0x60, 0x07, 0x18, 0x03, 0x86, 0x00, 0xc1, -// 0x80, 0x70, 0x00, 0x38, 0x00, 0x0c, 0x00, 0x07, -// 0x00, 0x03, 0x80, 0x00, 0xc0, 0x00, 0x60, 0x00, -// 0x38, 0x00, 0x1c, 0x00, 0x06, 0x00, 0x03, 0x80, -// 0x31, 0xc0, 0x0c, 0x60, 0x03, 0x30, 0x00, 0xdc, -// 0x00, 0x3e, 0x00, 0x0f, 0x00, 0x03, 0xff, 0xff, -// 0xff, 0xff, 0xf0, - - // '[' (0x5b) 7x34, offset 3576-3606, at +13/-27 - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x3f, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, - 0xc0, 0x03, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, - 0x00, 0x3c, 0x00, 0x00, 0x00, 0x30, - // in regular row-major format -// 0xff, 0xff, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc1, -// 0x83, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc1, 0x83, -// 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc1, 0x83, 0x06, -// 0x0c, 0x18, 0x30, 0x60, 0xff, 0xfc, - - // '\' (0x5c) 18x35, offset 3606-3685, at +5/-30 - 0x03, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, - 0x00, 0x0f, 0x00, 0x00, 0x00, 0xe0, 0x01, 0x00, - 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x80, 0x07, - 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, - 0x1e, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, - 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, - 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0x00, 0x7c, - 0x00, 0x00, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x00, - 0xf0, 0x01, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, - 0x00, 0x80, 0x07, 0x00, 0x00, 0x00, 0x30, - // in regular row-major format -// 0xc0, 0x00, 0x30, 0x00, 0x06, 0x00, 0x01, 0x80, -// 0x00, 0x30, 0x00, 0x0c, 0x00, 0x01, 0x80, 0x00, -// 0x60, 0x00, 0x0c, 0x00, 0x03, 0x00, 0x00, 0x60, -// 0x00, 0x18, 0x00, 0x03, 0x00, 0x00, 0xc0, 0x00, -// 0x18, 0x00, 0x06, 0x00, 0x00, 0xc0, 0x00, 0x30, -// 0x00, 0x06, 0x00, 0x01, 0x80, 0x00, 0x30, 0x00, -// 0x0c, 0x00, 0x03, 0x80, 0x00, 0x60, 0x00, 0x1c, -// 0x00, 0x03, 0x00, 0x00, 0xe0, 0x00, 0x18, 0x00, -// 0x07, 0x00, 0x00, 0xc0, 0x00, 0x30, 0x00, 0x06, -// 0x00, 0x01, 0x80, 0x00, 0x30, 0x00, 0x0c, - - // ']' (0x5d) 7x34, offset 3685-3715, at +8/-27 - 0x03, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, - 0x3c, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, - 0xc0, 0x03, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, - // in regular row-major format -// 0xff, 0xfc, 0x18, 0x30, 0x60, 0xc1, 0x83, 0x06, -// 0x0c, 0x18, 0x30, 0x60, 0xc1, 0x83, 0x06, 0x0c, -// 0x18, 0x30, 0x60, 0xc1, 0x83, 0x06, 0x0c, 0x18, -// 0x30, 0x60, 0xc1, 0x83, 0xff, 0xfc, - - // '^' (0x5e) 18x12, offset 3715-3742, at +5/-28 - 0x00, 0x08, 0xe0, 0x00, 0x07, 0x38, 0xc0, 0x01, - 0x07, 0x38, 0xc0, 0x01, 0x0e, 0x70, 0x00, 0x1c, - 0x80, 0x03, 0x70, 0x00, 0x0e, 0x80, 0x03, 0x70, - 0x00, 0x0e, 0xc0, - // in regular row-major format -// 0x00, 0x40, 0x00, 0x30, 0x00, 0x1e, 0x00, 0x0e, -// 0xc0, 0x07, 0x38, 0x01, 0x87, 0x00, 0xc0, 0xc0, -// 0x60, 0x18, 0x38, 0x03, 0x1c, 0x00, 0xe6, 0x00, -// 0x1f, 0x00, 0x03, - - // '_' (0x5f) 28x2, offset 3742-3749, at +0/+5 - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - // in regular row-major format -// 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - - // '`' (0x60) 8x7, offset 3749-3756, at +7/-29 - 0x83, 0x83, 0x83, 0x81, 0xc1, 0xc1, 0xc1, - // in regular row-major format -// 0xc0, 0xe0, 0x70, 0x3c, 0x0e, 0x07, 0x03, - - // 'a' (0x61) 22x22, offset 3756-3817, at +3/-20 - 0x00, 0xe0, 0x03, 0x00, 0xfc, 0x03, 0x80, 0xc3, - 0x19, 0x70, 0x60, 0x06, 0x0c, 0xb8, 0x01, 0x03, - 0x2c, 0xe0, 0x00, 0x0f, 0x18, 0xc0, 0x03, 0x06, - 0xf0, 0x80, 0x01, 0x3c, 0x60, 0x00, 0x0f, 0x18, - 0x60, 0x03, 0x06, 0xd8, 0x80, 0x01, 0x63, 0x60, - 0xc0, 0x18, 0x10, 0x18, 0x0c, 0x0c, 0x03, 0xff, - 0xff, 0x07, 0xff, 0xff, 0x01, 0x00, 0x60, 0x00, - 0x00, 0x18, 0x00, 0x00, 0x06, - // in regular row-major format -// 0x01, 0xfc, 0x00, 0x7f, 0xfc, 0x01, 0xc0, 0x3c, -// 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, 0x00, 0x01, -// 0x80, 0x00, 0x06, 0x00, 0x00, 0x18, 0x00, 0x00, -// 0x60, 0x0f, 0xf9, 0x81, 0xff, 0xfe, 0x0f, 0x80, -// 0x38, 0x70, 0x00, 0x63, 0x80, 0x01, 0x8c, 0x00, -// 0x06, 0x30, 0x00, 0x18, 0xc0, 0x00, 0xe3, 0x00, -// 0x07, 0x86, 0x00, 0x76, 0x1e, 0x07, 0x9f, 0x3f, -// 0xf8, 0x7c, 0x3f, 0x80, 0x00, - - // 'b' (0x62) 23x29, offset 3817-3901, at +2/-27 - 0x03, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x80, 0x0d, - 0x00, 0x00, 0xb0, 0xff, 0xff, 0xff, 0xf7, 0xff, - 0xff, 0xff, 0x00, 0xf0, 0xc0, 0x03, 0x00, 0x07, - 0xe0, 0x00, 0x30, 0x00, 0x38, 0x00, 0x07, 0x00, - 0x0e, 0x60, 0x00, 0x80, 0x01, 0x06, 0x00, 0x60, - 0xc0, 0x00, 0x00, 0x0c, 0x18, 0x00, 0x80, 0x01, - 0x03, 0x00, 0x30, 0x60, 0x00, 0x00, 0x06, 0x0c, - 0x00, 0xc0, 0x00, 0x03, 0x00, 0x0c, 0xe0, 0x00, - 0xc0, 0x01, 0x18, 0x00, 0x1c, 0x00, 0x0e, 0xc0, - 0x01, 0x80, 0x07, 0x1e, 0x00, 0xe0, 0xff, 0x01, - 0x00, 0xf0, 0x07, 0x00, - // in regular row-major format -// 0xf8, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x60, 0x00, -// 0x00, 0xc0, 0x00, 0x01, 0x80, 0x00, 0x03, 0x00, -// 0x00, 0x06, 0x00, 0x00, 0x0c, 0x1f, 0x80, 0x18, -// 0xff, 0xc0, 0x33, 0x81, 0xc0, 0x6e, 0x01, 0xc0, -// 0xf0, 0x00, 0xc1, 0xe0, 0x01, 0xc3, 0x80, 0x01, -// 0x87, 0x00, 0x03, 0x8c, 0x00, 0x03, 0x18, 0x00, -// 0x06, 0x30, 0x00, 0x0c, 0x60, 0x00, 0x18, 0xc0, -// 0x00, 0x31, 0x80, 0x00, 0x63, 0x80, 0x01, 0x87, -// 0x00, 0x03, 0x0f, 0x00, 0x0e, 0x1f, 0x00, 0x38, -// 0x37, 0x00, 0xe3, 0xe7, 0x03, 0x87, 0xc7, 0xfe, -// 0x00, 0x03, 0xf0, 0x00, - - // 'c' (0x63) 21x22, offset 3901-3959, at +4/-20 - 0x80, 0x7f, 0x00, 0xf8, 0x7f, 0x00, 0x0f, 0x3c, - 0xe0, 0x00, 0x1c, 0x0c, 0x00, 0x8c, 0x03, 0x00, - 0x67, 0x00, 0x80, 0x1d, 0x00, 0xe0, 0x03, 0x00, - 0xf0, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x0f, 0x00, - 0xc0, 0x03, 0x00, 0xf0, 0x00, 0x00, 0x6c, 0x00, - 0x00, 0x1b, 0x00, 0x60, 0x0c, 0x00, 0x18, 0x07, - 0x00, 0xe7, 0x0f, 0xc0, 0xf8, 0x03, 0x18, 0x00, - 0x00, 0x06, - // in regular row-major format -// 0x01, 0xfc, 0x00, 0x3f, 0xf9, 0x83, 0xc0, 0xfc, -// 0x38, 0x01, 0xe3, 0x00, 0x07, 0x38, 0x00, 0x19, -// 0x80, 0x00, 0xdc, 0x00, 0x06, 0xc0, 0x00, 0x06, -// 0x00, 0x00, 0x30, 0x00, 0x01, 0x80, 0x00, 0x0c, -// 0x00, 0x00, 0x60, 0x00, 0x03, 0x80, 0x00, 0x0c, -// 0x00, 0x00, 0x70, 0x00, 0x01, 0x80, 0x00, 0xc7, -// 0x00, 0x1e, 0x1e, 0x03, 0xc0, 0x7f, 0xfc, 0x00, -// 0xff, 0x00, - - // 'd' (0x64) 24x29, offset 3959-4046, at +3/-27 - 0x00, 0xc0, 0x1f, 0x00, 0x00, 0xfe, 0x1f, 0x00, - 0xe0, 0x81, 0x07, 0x00, 0x0e, 0xc0, 0x01, 0xe0, - 0x00, 0x70, 0x00, 0x0e, 0x00, 0x1c, 0xc0, 0x00, - 0x00, 0x03, 0x1c, 0x00, 0xe0, 0x80, 0x01, 0x00, - 0x18, 0x30, 0x00, 0x00, 0x03, 0x06, 0x00, 0x60, - 0xc0, 0x00, 0x00, 0x0c, 0x18, 0x00, 0x80, 0x01, - 0x06, 0x00, 0x18, 0xc0, 0x00, 0x00, 0x03, 0x30, - 0x00, 0x30, 0x03, 0x0e, 0x00, 0x67, 0x80, 0x03, - 0x70, 0x0c, 0xe0, 0x81, 0x83, 0xff, 0xff, 0xff, - 0xf7, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x18, - 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x60, - // in regular row-major format -// 0x00, 0x00, 0xf8, 0x00, 0x00, 0xf8, 0x00, 0x00, -// 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, -// 0x00, 0x18, 0x00, 0x00, 0x18, 0x01, 0xf8, 0x18, -// 0x07, 0xfe, 0x18, 0x0f, 0x07, 0x98, 0x1c, 0x01, -// 0xd8, 0x38, 0x00, 0xf8, 0x70, 0x00, 0x78, 0x60, -// 0x00, 0x38, 0xe0, 0x00, 0x38, 0xc0, 0x00, 0x18, -// 0xc0, 0x00, 0x18, 0xc0, 0x00, 0x18, 0xc0, 0x00, -// 0x18, 0xc0, 0x00, 0x18, 0xc0, 0x00, 0x18, 0x60, -// 0x00, 0x38, 0x60, 0x00, 0x38, 0x70, 0x00, 0x78, -// 0x38, 0x00, 0xd8, 0x1c, 0x01, 0xd8, 0x0f, 0x07, -// 0x9f, 0x07, 0xfe, 0x1f, 0x01, 0xf8, 0x00, - - // 'e' (0x65) 21x22, offset 4046-4104, at +3/-20 - 0x80, 0x3f, 0x00, 0xf8, 0x3f, 0x80, 0x67, 0x3c, - 0x70, 0x18, 0x1c, 0x0c, 0x06, 0x8e, 0x81, 0x01, - 0x63, 0x60, 0x80, 0x0d, 0x18, 0x60, 0x03, 0x06, - 0xf0, 0x80, 0x01, 0x3c, 0x60, 0x00, 0x0f, 0x18, - 0xc0, 0x03, 0x06, 0xf0, 0x80, 0x01, 0x6c, 0x60, - 0x00, 0x1b, 0x18, 0x60, 0x0c, 0x06, 0x18, 0x87, - 0x01, 0x86, 0x63, 0xc0, 0xc0, 0x1f, 0x38, 0xc0, - 0x07, 0x06, - // in regular row-major format -// 0x01, 0xfc, 0x00, 0x3f, 0xf8, 0x07, 0x80, 0xf0, -// 0x70, 0x01, 0xc3, 0x00, 0x07, 0x30, 0x00, 0x19, -// 0x80, 0x00, 0x78, 0x00, 0x03, 0xc0, 0x00, 0x1f, -// 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x0c, -// 0x00, 0x00, 0x60, 0x00, 0x01, 0x80, 0x00, 0x0c, -// 0x00, 0x00, 0x30, 0x00, 0x01, 0xc0, 0x00, 0xc7, -// 0x00, 0x0e, 0x1e, 0x03, 0xe0, 0x3f, 0xfc, 0x00, -// 0x7f, 0x00, - - // 'f' (0x66) 19x28, offset 4104-4171, at +6/-27 - 0x00, 0x03, 0x00, 0x0c, 0x30, 0x00, 0xc0, 0x00, - 0x03, 0x00, 0x0c, 0x30, 0x00, 0xc0, 0x00, 0x03, - 0x00, 0x8c, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, - 0xef, 0x30, 0x00, 0xc0, 0x06, 0x03, 0x00, 0x3c, - 0x30, 0x00, 0xc0, 0x03, 0x03, 0x00, 0x3c, 0x30, - 0x00, 0xc0, 0x03, 0x03, 0x00, 0x3c, 0x30, 0x00, - 0xc0, 0x03, 0x03, 0x00, 0x3c, 0x30, 0x00, 0xc0, - 0x03, 0x03, 0x00, 0x30, 0x00, 0x00, 0x00, 0x02, - 0x00, 0x00, 0x00, - // in regular row-major format -// 0x00, 0x7f, 0xc0, 0x3f, 0xfc, 0x0e, 0x00, 0x03, -// 0x80, 0x00, 0x60, 0x00, 0x0c, 0x00, 0x01, 0x80, -// 0x00, 0x30, 0x00, 0xff, 0xff, 0x9f, 0xff, 0xf0, -// 0x18, 0x00, 0x03, 0x00, 0x00, 0x60, 0x00, 0x0c, -// 0x00, 0x01, 0x80, 0x00, 0x30, 0x00, 0x06, 0x00, -// 0x00, 0xc0, 0x00, 0x18, 0x00, 0x03, 0x00, 0x00, -// 0x60, 0x00, 0x0c, 0x00, 0x01, 0x80, 0x00, 0x30, -// 0x00, 0x06, 0x00, 0x00, 0xc0, 0x03, 0xff, 0xfc, -// 0x7f, 0xff, 0x80, - - // 'g' (0x67) 23x30, offset 4171-4258, at +3/-20 - 0x80, 0x3f, 0x00, 0x00, 0xf8, 0x3f, 0x00, 0x00, - 0x0f, 0x3c, 0x00, 0xe0, 0x00, 0x1c, 0x00, 0x0c, - 0x00, 0x06, 0x80, 0x03, 0x00, 0x03, 0x60, 0x00, - 0xc0, 0x00, 0x0f, 0x00, 0x60, 0xc0, 0x03, 0x00, - 0x18, 0xf0, 0x00, 0x00, 0x06, 0x3c, 0x00, 0x80, - 0x01, 0x0f, 0x00, 0x60, 0xc0, 0x03, 0x00, 0x18, - 0xb0, 0x01, 0x00, 0x03, 0x6c, 0x00, 0xc0, 0x00, - 0x33, 0x00, 0x18, 0x60, 0x38, 0x00, 0x03, 0x1c, - 0x3c, 0x70, 0x80, 0xe3, 0xff, 0xff, 0x7f, 0xf8, - 0xff, 0xff, 0x07, 0x06, 0x00, 0x00, 0x80, 0x01, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - // in regular row-major format -// 0x01, 0xf8, 0x00, 0x0f, 0xfc, 0x7c, 0x38, 0x1c, -// 0xf8, 0xe0, 0x0d, 0x83, 0x00, 0x0f, 0x0e, 0x00, -// 0x1e, 0x18, 0x00, 0x1c, 0x70, 0x00, 0x38, 0xc0, -// 0x00, 0x31, 0x80, 0x00, 0x63, 0x00, 0x00, 0xc6, -// 0x00, 0x01, 0x8c, 0x00, 0x03, 0x18, 0x00, 0x06, -// 0x18, 0x00, 0x1c, 0x30, 0x00, 0x38, 0x30, 0x00, -// 0xf0, 0x70, 0x03, 0x60, 0x78, 0x1c, 0xc0, 0x3f, -// 0xf1, 0x80, 0x1f, 0x83, 0x00, 0x00, 0x06, 0x00, -// 0x00, 0x0c, 0x00, 0x00, 0x18, 0x00, 0x00, 0x30, -// 0x00, 0x00, 0xc0, 0x00, 0x03, 0x80, 0x00, 0x0e, -// 0x00, 0x3f, 0xf8, 0x00, 0x7f, 0xc0, 0x00, - - // 'h' (0x68) 23x28, offset 4258-4339, at +3/-27 - 0x03, 0x00, 0x00, 0x3c, 0x00, 0x00, 0xc0, 0x03, - 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0f, 0xc0, 0x01, 0xc0, 0x00, 0x0e, 0x00, - 0x0c, 0x60, 0x00, 0xc0, 0x00, 0x03, 0x00, 0x00, - 0x18, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x18, - 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x18, 0x00, - 0x00, 0x80, 0x01, 0x00, 0x00, 0x30, 0x00, 0xc0, - 0x00, 0x07, 0x00, 0x0c, 0xe0, 0x00, 0xc0, 0x00, - 0xfc, 0xff, 0x0f, 0x80, 0xff, 0xff, 0x00, 0x00, - 0x00, 0x0c, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, - 0x0c, - // in regular row-major format -// 0xf8, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x60, 0x00, -// 0x00, 0xc0, 0x00, 0x01, 0x80, 0x00, 0x03, 0x00, -// 0x00, 0x06, 0x00, 0x00, 0x0c, 0x3f, 0x00, 0x18, -// 0xff, 0x80, 0x37, 0x03, 0x80, 0x7c, 0x03, 0x80, -// 0xf0, 0x03, 0x81, 0xc0, 0x03, 0x03, 0x00, 0x06, -// 0x06, 0x00, 0x0c, 0x0c, 0x00, 0x18, 0x18, 0x00, -// 0x30, 0x30, 0x00, 0x60, 0x60, 0x00, 0xc0, 0xc0, -// 0x01, 0x81, 0x80, 0x03, 0x03, 0x00, 0x06, 0x06, -// 0x00, 0x0c, 0x0c, 0x00, 0x18, 0x18, 0x00, 0x30, -// 0x30, 0x00, 0x63, 0xfc, 0x07, 0xff, 0xf8, 0x0f, -// 0xf0, - - // 'i' (0x69) 18x29, offset 4339-4405, at +5/-28 - 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x03, - 0x18, 0x00, 0x60, 0x00, 0x03, 0x00, 0x0c, 0x60, - 0x00, 0x80, 0x01, 0x0c, 0x00, 0x30, 0x80, 0x01, - 0x00, 0xfe, 0x30, 0x00, 0xc0, 0x1f, 0xfe, 0xff, - 0xff, 0xc3, 0xff, 0xff, 0x03, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x80, 0x01, - 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, - 0x00, 0xc0, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, - 0x00, 0x03, - // in regular row-major format -// 0x01, 0xc0, 0x00, 0x70, 0x00, 0x1c, 0x00, 0x07, -// 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, -// 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x03, 0xfc, -// 0x00, 0x03, 0x00, 0x00, 0xc0, 0x00, 0x30, 0x00, -// 0x0c, 0x00, 0x03, 0x00, 0x00, 0xc0, 0x00, 0x30, -// 0x00, 0x0c, 0x00, 0x03, 0x00, 0x00, 0xc0, 0x00, -// 0x30, 0x00, 0x0c, 0x00, 0x03, 0x00, 0x00, 0xc0, -// 0x00, 0x30, 0x00, 0x0c, 0x03, 0xff, 0xff, 0xff, -// 0xff, 0xc0, - - // 'j' (0x6a) 14x38, offset 4405-4472, at +6/-28 - 0x00, 0x06, 0x00, 0x00, 0x30, 0x80, 0x01, 0x00, - 0x00, 0x0c, 0x60, 0x00, 0x00, 0x00, 0x03, 0x18, - 0x00, 0x00, 0xc0, 0x00, 0x06, 0x00, 0x00, 0x30, - 0x80, 0x01, 0x00, 0x00, 0x0c, 0x60, 0x00, 0x00, - 0x00, 0x03, 0x18, 0x00, 0x00, 0xc0, 0x00, 0x06, - 0x00, 0x00, 0xf0, 0x87, 0x01, 0x00, 0x00, 0xfe, - 0x61, 0x00, 0x00, 0xc0, 0x7d, 0x18, 0x00, 0x00, - 0x38, 0x00, 0xfe, 0xff, 0xff, 0x07, 0x80, 0xff, - 0xff, 0xff, 0x00, - // in regular row-major format -// 0x00, 0x70, 0x01, 0xc0, 0x07, 0x00, 0x1c, 0x00, -// 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, -// 0xff, 0xff, 0xff, 0xc0, 0x03, 0x00, 0x0c, 0x00, -// 0x30, 0x00, 0xc0, 0x03, 0x00, 0x0c, 0x00, 0x30, -// 0x00, 0xc0, 0x03, 0x00, 0x0c, 0x00, 0x30, 0x00, -// 0xc0, 0x03, 0x00, 0x0c, 0x00, 0x30, 0x00, 0xc0, -// 0x03, 0x00, 0x0c, 0x00, 0x30, 0x00, 0xc0, 0x03, -// 0x00, 0x0c, 0x00, 0x70, 0x03, 0x80, 0x1c, 0xff, -// 0xe3, 0xff, 0x00, - - // 'k' (0x6b) 22x28, offset 4472-4549, at +4/-27 - 0x03, 0x00, 0x00, 0x3c, 0x00, 0x00, 0xc0, 0x03, - 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0f, 0x00, 0x60, 0x00, 0x00, 0x00, 0x03, - 0x00, 0x00, 0x38, 0x00, 0x00, 0xc0, 0x07, 0x00, - 0x00, 0xee, 0x00, 0x00, 0x70, 0x1c, 0x00, 0xb0, - 0x83, 0x03, 0x00, 0x1b, 0x70, 0x00, 0xf0, 0x00, - 0xce, 0x00, 0x07, 0xc0, 0x0d, 0x30, 0x00, 0xf8, - 0x00, 0x03, 0x00, 0x0f, 0x30, 0x00, 0xe0, 0x00, - 0x03, 0x00, 0x0c, 0x00, 0x00, 0xc0, 0x00, 0x00, - 0x00, 0x0c, 0x00, 0x00, 0xc0, - // in regular row-major format -// 0xf8, 0x00, 0x03, 0xe0, 0x00, 0x01, 0x80, 0x00, -// 0x06, 0x00, 0x00, 0x18, 0x00, 0x00, 0x60, 0x00, -// 0x01, 0x80, 0x00, 0x06, 0x00, 0x00, 0x18, 0x1f, -// 0xe0, 0x60, 0x7f, 0x81, 0x80, 0x60, 0x06, 0x07, -// 0x00, 0x18, 0x38, 0x00, 0x61, 0xc0, 0x01, 0x8e, -// 0x00, 0x06, 0x70, 0x00, 0x1b, 0x80, 0x00, 0x7f, -// 0x00, 0x01, 0xce, 0x00, 0x06, 0x1c, 0x00, 0x18, -// 0x38, 0x00, 0x60, 0x70, 0x01, 0x80, 0xe0, 0x06, -// 0x01, 0xc0, 0x18, 0x03, 0x80, 0x60, 0x07, 0x0f, -// 0x80, 0x7f, 0xfe, 0x01, 0xff, - - // 'l' (0x6c) 18x28, offset 4549-4612, at +5/-27 - 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0xc0, 0x03, - 0x00, 0x00, 0x3c, 0x00, 0x00, 0xc0, 0x03, 0x00, - 0x00, 0x3c, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, - 0x3c, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x0c, 0x00, - 0x00, 0xc0, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, - 0xc0, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0xc0, - 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0xc0, - // in regular row-major format -// 0x3f, 0xc0, 0x0f, 0xf0, 0x00, 0x0c, 0x00, 0x03, -// 0x00, 0x00, 0xc0, 0x00, 0x30, 0x00, 0x0c, 0x00, -// 0x03, 0x00, 0x00, 0xc0, 0x00, 0x30, 0x00, 0x0c, -// 0x00, 0x03, 0x00, 0x00, 0xc0, 0x00, 0x30, 0x00, -// 0x0c, 0x00, 0x03, 0x00, 0x00, 0xc0, 0x00, 0x30, -// 0x00, 0x0c, 0x00, 0x03, 0x00, 0x00, 0xc0, 0x00, -// 0x30, 0x00, 0x0c, 0x00, 0x03, 0x00, 0x00, 0xc0, -// 0x00, 0x30, 0x0f, 0xff, 0xff, 0xff, 0xff, - - // 'm' (0x6d) 28x21, offset 4612-4686, at +0/-20 - 0x06, 0x00, 0xd8, 0x00, 0x00, 0x1b, 0x00, 0x60, - 0xff, 0xff, 0xef, 0xff, 0xff, 0x31, 0x00, 0x30, - 0x03, 0x00, 0x36, 0x00, 0x00, 0x03, 0x00, 0x60, - 0x00, 0x00, 0x0c, 0x00, 0x80, 0x03, 0x00, 0xe0, - 0x00, 0x00, 0xf8, 0xff, 0x3f, 0xfc, 0xff, 0xc7, - 0x00, 0xc0, 0x0c, 0x00, 0xd8, 0x00, 0x00, 0x0f, - 0x00, 0x80, 0x01, 0x00, 0x30, 0x00, 0x00, 0x0e, - 0x00, 0x80, 0x03, 0x00, 0xe0, 0xff, 0xff, 0xf8, - 0xff, 0x1f, 0x00, 0x00, 0x03, 0x00, 0x60, 0x00, - 0x00, 0x0c, - // in regular row-major format -// 0x00, 0xf0, 0x3c, 0x0f, 0x9f, 0x87, 0xe0, 0xfb, -// 0x1c, 0xc7, 0x01, 0xe0, 0xd8, 0x38, 0x1c, 0x07, -// 0x01, 0x81, 0x80, 0x60, 0x18, 0x18, 0x06, 0x01, -// 0x81, 0x80, 0x60, 0x18, 0x18, 0x06, 0x01, 0x81, -// 0x80, 0x60, 0x18, 0x18, 0x06, 0x01, 0x81, 0x80, -// 0x60, 0x18, 0x18, 0x06, 0x01, 0x81, 0x80, 0x60, -// 0x18, 0x18, 0x06, 0x01, 0x81, 0x80, 0x60, 0x18, -// 0x18, 0x06, 0x01, 0x81, 0x80, 0x60, 0x18, 0x18, -// 0x06, 0x01, 0x8f, 0xe0, 0x7c, 0x1f, 0xfe, 0x07, -// 0xc1, 0xf0, - - // 'n' (0x6e) 23x21, offset 4686-4747, at +2/-20 - 0x00, 0x00, 0xd8, 0x00, 0x00, 0x1b, 0x00, 0x60, - 0x03, 0x00, 0xec, 0xff, 0xff, 0xfd, 0xff, 0x3f, - 0x0c, 0x00, 0xc6, 0x00, 0xc0, 0x0c, 0x00, 0xd8, - 0x00, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x30, - 0x00, 0x00, 0x06, 0x00, 0xc0, 0x00, 0x00, 0x18, - 0x00, 0x00, 0x06, 0x00, 0xc0, 0x01, 0x00, 0x73, - 0x00, 0x60, 0xfc, 0xff, 0x0f, 0xff, 0xff, 0x01, - 0x00, 0x30, 0x00, 0x00, 0x06, - // in regular row-major format -// 0x00, 0x1f, 0x00, 0xf8, 0xff, 0x81, 0xf3, 0x83, -// 0x80, 0x6c, 0x03, 0x80, 0xf0, 0x03, 0x81, 0xc0, -// 0x03, 0x03, 0x00, 0x06, 0x06, 0x00, 0x0c, 0x0c, -// 0x00, 0x18, 0x18, 0x00, 0x30, 0x30, 0x00, 0x60, -// 0x60, 0x00, 0xc0, 0xc0, 0x01, 0x81, 0x80, 0x03, -// 0x03, 0x00, 0x06, 0x06, 0x00, 0x0c, 0x0c, 0x00, -// 0x18, 0x18, 0x00, 0x30, 0x30, 0x00, 0x67, 0xfc, -// 0x03, 0xff, 0xf8, 0x07, 0xe0, - - // 'o' (0x6f) 22x22, offset 4747-4808, at +3/-20 - 0x00, 0x3f, 0x00, 0xf8, 0x7f, 0x00, 0x0f, 0x3c, - 0xe0, 0x00, 0x1c, 0x1c, 0x00, 0x8e, 0x03, 0x00, - 0x67, 0x00, 0x80, 0x19, 0x00, 0x60, 0x03, 0x00, - 0xf0, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x0f, 0x00, - 0xc0, 0x03, 0x00, 0xf0, 0x00, 0x00, 0x6c, 0x00, - 0x80, 0x19, 0x00, 0x60, 0x0e, 0x00, 0x1c, 0x07, - 0x80, 0x83, 0x03, 0x70, 0xc0, 0x03, 0x0f, 0xe0, - 0xff, 0x01, 0xc0, 0x0f, 0x00, - // in regular row-major format -// 0x00, 0xfc, 0x00, 0x1f, 0xfe, 0x00, 0xf0, 0x3c, -// 0x07, 0x00, 0x38, 0x38, 0x00, 0x71, 0xc0, 0x00, -// 0xe6, 0x00, 0x01, 0x98, 0x00, 0x06, 0xc0, 0x00, -// 0x0f, 0x00, 0x00, 0x3c, 0x00, 0x00, 0xf0, 0x00, -// 0x03, 0xc0, 0x00, 0x0f, 0x00, 0x00, 0x36, 0x00, -// 0x01, 0x98, 0x00, 0x06, 0x70, 0x00, 0x38, 0xe0, -// 0x01, 0xc1, 0xc0, 0x0e, 0x03, 0xc0, 0xf0, 0x07, -// 0xff, 0x80, 0x03, 0xf0, 0x00, - - // 'p' (0x70) 23x30, offset 4808-4895, at +2/-20 - 0x06, 0x00, 0x00, 0xb0, 0x01, 0x00, 0x00, 0x6c, - 0x00, 0x00, 0x00, 0xfb, 0xff, 0xff, 0xff, 0xfe, - 0xff, 0xff, 0x3f, 0x3c, 0x70, 0x00, 0x8c, 0x03, - 0x30, 0x00, 0x33, 0x00, 0x18, 0xc0, 0x06, 0x00, - 0x0c, 0xb0, 0x01, 0x00, 0x03, 0x3c, 0x00, 0x80, - 0x01, 0x0c, 0x00, 0x60, 0x00, 0x03, 0x00, 0x18, - 0xc0, 0x00, 0x00, 0x06, 0x30, 0x00, 0x80, 0x01, - 0x0c, 0x00, 0x60, 0x00, 0x06, 0x00, 0x0c, 0x80, - 0x01, 0x00, 0x03, 0xc0, 0x00, 0x60, 0x00, 0xe0, - 0x00, 0x1c, 0x00, 0xf0, 0xc0, 0x03, 0x00, 0xf8, - 0x3f, 0x00, 0x00, 0xf8, 0x03, 0x00, 0x00, - // in regular row-major format -// 0x00, 0x3f, 0x01, 0xf1, 0xff, 0x83, 0xe7, 0x03, -// 0x80, 0xd8, 0x01, 0x81, 0xe0, 0x01, 0x83, 0xc0, -// 0x03, 0x87, 0x00, 0x03, 0x0e, 0x00, 0x07, 0x18, -// 0x00, 0x06, 0x30, 0x00, 0x0c, 0x60, 0x00, 0x18, -// 0xc0, 0x00, 0x31, 0x80, 0x00, 0x63, 0x00, 0x00, -// 0xc7, 0x00, 0x03, 0x0e, 0x00, 0x06, 0x1e, 0x00, -// 0x18, 0x36, 0x00, 0x70, 0x67, 0x03, 0xc0, 0xc7, -// 0xfe, 0x01, 0x83, 0xf0, 0x03, 0x00, 0x00, 0x06, -// 0x00, 0x00, 0x0c, 0x00, 0x00, 0x18, 0x00, 0x00, -// 0x30, 0x00, 0x00, 0x60, 0x00, 0x00, 0xc0, 0x00, -// 0x0f, 0xfc, 0x00, 0x1f, 0xf8, 0x00, 0x00, - - // 'q' (0x71) 24x30, offset 4895-4985, at +3/-20 - 0x80, 0x3f, 0x00, 0x00, 0xf8, 0x3f, 0x00, 0x00, - 0x0f, 0x1c, 0x00, 0xe0, 0x00, 0x0e, 0x00, 0x1c, - 0x00, 0x06, 0x80, 0x03, 0x80, 0x03, 0x60, 0x00, - 0xc0, 0x00, 0x1c, 0x00, 0x70, 0x00, 0x03, 0x00, - 0x18, 0xc0, 0x00, 0x00, 0x06, 0x30, 0x00, 0x80, - 0x01, 0x0c, 0x00, 0x60, 0x00, 0x03, 0x00, 0x18, - 0x80, 0x01, 0x00, 0x07, 0x60, 0x00, 0xc0, 0x00, - 0x3b, 0x00, 0x38, 0xc0, 0x0c, 0x00, 0x06, 0x30, - 0x0e, 0xe0, 0x00, 0x0c, 0x0f, 0x1c, 0x00, 0xfb, - 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xbf, 0x01, - 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x1b, 0x00, - 0x00, 0xc0, - // in regular row-major format -// 0x01, 0xf8, 0x00, 0x07, 0xff, 0x1f, 0x0f, 0x07, -// 0x9f, 0x1c, 0x01, 0xd8, 0x38, 0x00, 0x78, 0x70, -// 0x00, 0x78, 0x60, 0x00, 0x38, 0xe0, 0x00, 0x38, -// 0xc0, 0x00, 0x18, 0xc0, 0x00, 0x18, 0xc0, 0x00, -// 0x18, 0xc0, 0x00, 0x18, 0xc0, 0x00, 0x18, 0xc0, -// 0x00, 0x18, 0x60, 0x00, 0x38, 0x70, 0x00, 0x78, -// 0x30, 0x00, 0x78, 0x1c, 0x01, 0xd8, 0x0f, 0x07, -// 0x98, 0x07, 0xff, 0x18, 0x01, 0xfc, 0x18, 0x00, -// 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, -// 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, -// 0x18, 0x00, 0x00, 0x18, 0x00, 0x03, 0xff, 0x00, -// 0x03, 0xff, - - // 'r' (0x72) 21x20, offset 4985-5038, at +5/-19 - 0x00, 0x00, 0x3c, 0x00, 0xc0, 0x03, 0x00, 0x3c, - 0x00, 0xc0, 0x03, 0x00, 0xfc, 0xff, 0xff, 0xff, - 0xff, 0x0f, 0x07, 0xc0, 0x30, 0x00, 0x8c, 0x01, - 0xc0, 0x1c, 0x00, 0xcc, 0x00, 0xc0, 0x06, 0x00, - 0x6c, 0x00, 0xc0, 0x03, 0x00, 0x3c, 0x00, 0xc0, - 0x03, 0x00, 0x30, 0x00, 0x00, 0x06, 0x00, 0x60, - 0x00, 0x00, 0x04, 0x00, 0x00, - // in regular row-major format -// 0x7e, 0x03, 0xc3, 0xf0, 0x7f, 0x81, 0x8f, 0x0e, -// 0x0c, 0xe0, 0x00, 0x7e, 0x00, 0x03, 0xc0, 0x00, -// 0x1c, 0x00, 0x00, 0xc0, 0x00, 0x06, 0x00, 0x00, -// 0x30, 0x00, 0x01, 0x80, 0x00, 0x0c, 0x00, 0x00, -// 0x60, 0x00, 0x03, 0x00, 0x00, 0x18, 0x00, 0x00, -// 0xc0, 0x00, 0x06, 0x00, 0x00, 0x30, 0x00, 0x3f, -// 0xff, 0xc1, 0xff, 0xfe, 0x00, - - // 's' (0x73) 18x22, offset 5038-5088, at +5/-20 - 0x00, 0x80, 0x1f, 0x3e, 0xe0, 0xc7, 0x1f, 0xe0, - 0x38, 0x0e, 0x70, 0x06, 0x03, 0xd8, 0x81, 0x01, - 0x36, 0x60, 0x00, 0x0f, 0x18, 0xc0, 0x03, 0x04, - 0xf0, 0x00, 0x01, 0x3c, 0x40, 0x00, 0x0f, 0x30, - 0xc0, 0x06, 0x0c, 0xb8, 0x01, 0x03, 0xc6, 0x80, - 0xc1, 0xf9, 0xe1, 0x38, 0x7e, 0xf0, 0x07, 0x00, - 0xf8, 0x00, - // in regular row-major format -// 0x07, 0xf0, 0x07, 0xff, 0x63, 0xc0, 0xf9, 0xc0, -// 0x0e, 0x60, 0x01, 0x98, 0x00, 0x66, 0x00, 0x19, -// 0xc0, 0x00, 0x38, 0x00, 0x07, 0xc0, 0x00, 0x7f, -// 0xc0, 0x00, 0x7c, 0x00, 0x03, 0x80, 0x00, 0x70, -// 0x00, 0x0f, 0x00, 0x03, 0xc0, 0x00, 0xf8, 0x00, -// 0x7f, 0x00, 0x3b, 0xf0, 0x3c, 0xdf, 0xfe, 0x00, -// 0xfe, 0x00, - - // 't' (0x74) 21x27, offset 5088-5159, at +3/-25 - 0xc0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x30, - 0x00, 0x00, 0x80, 0x01, 0x00, 0xf0, 0xff, 0xff, - 0x87, 0xff, 0xff, 0xff, 0x00, 0x03, 0x00, 0x0e, - 0x18, 0x00, 0x60, 0xc0, 0x00, 0x00, 0x06, 0x06, - 0x00, 0x30, 0x30, 0x00, 0x80, 0x81, 0x01, 0x00, - 0x0c, 0x0c, 0x00, 0x60, 0x60, 0x00, 0x00, 0x03, - 0x03, 0x00, 0x18, 0x18, 0x00, 0x60, 0xc0, 0x00, - 0x00, 0x03, 0x00, 0x00, 0x18, 0x00, 0x00, 0xe0, - 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x08, - // in regular row-major format -// 0x0c, 0x00, 0x00, 0x60, 0x00, 0x03, 0x00, 0x00, -// 0x18, 0x00, 0x00, 0xc0, 0x00, 0x06, 0x00, 0x03, -// 0xff, 0xfe, 0x1f, 0xff, 0xf0, 0x0c, 0x00, 0x00, -// 0x60, 0x00, 0x03, 0x00, 0x00, 0x18, 0x00, 0x00, -// 0xc0, 0x00, 0x06, 0x00, 0x00, 0x30, 0x00, 0x01, -// 0x80, 0x00, 0x0c, 0x00, 0x00, 0x60, 0x00, 0x03, -// 0x00, 0x00, 0x18, 0x00, 0x00, 0xc0, 0x00, 0x06, -// 0x00, 0x00, 0x30, 0x00, 0x00, 0xc0, 0x07, 0x07, -// 0x01, 0xf0, 0x1f, 0xff, 0x00, 0x3f, 0x80, - - // 'u' (0x75) 23x21, offset 5159-5220, at +3/-19 - 0x03, 0x00, 0x60, 0x00, 0x00, 0x0c, 0x00, 0x80, - 0xff, 0xff, 0xf0, 0xff, 0x7f, 0x00, 0x00, 0x1c, - 0x00, 0x00, 0x03, 0x00, 0xc0, 0x00, 0x00, 0x18, - 0x00, 0x00, 0x03, 0x00, 0x60, 0x00, 0x00, 0x0c, - 0x00, 0xc0, 0x00, 0x00, 0xd8, 0x00, 0x00, 0x1b, - 0x00, 0x30, 0x03, 0x00, 0x63, 0x00, 0x30, 0xfc, - 0xff, 0xbf, 0xff, 0xff, 0x07, 0x00, 0xc0, 0x00, - 0x00, 0x18, 0x00, 0x00, 0x03, - // in regular row-major format -// 0xf8, 0x03, 0xf1, 0xf0, 0x07, 0xe0, 0x60, 0x00, -// 0xc0, 0xc0, 0x01, 0x81, 0x80, 0x03, 0x03, 0x00, -// 0x06, 0x06, 0x00, 0x0c, 0x0c, 0x00, 0x18, 0x18, -// 0x00, 0x30, 0x30, 0x00, 0x60, 0x60, 0x00, 0xc0, -// 0xc0, 0x01, 0x81, 0x80, 0x03, 0x03, 0x00, 0x06, -// 0x06, 0x00, 0x0c, 0x0c, 0x00, 0x38, 0x18, 0x00, -// 0xf0, 0x18, 0x03, 0x60, 0x38, 0x3c, 0xf8, 0x3f, -// 0xf1, 0xf0, 0x1f, 0x00, 0x00, - - // 'v' (0x76) 26x20, offset 5220-5285, at +1/-19 - 0x00, 0x00, 0x30, 0x00, 0x00, 0x03, 0x00, 0x30, - 0x00, 0x00, 0x0f, 0x00, 0xf0, 0x03, 0x00, 0xf3, - 0x01, 0x30, 0x7c, 0x00, 0x03, 0x1f, 0x30, 0x80, - 0x07, 0x00, 0xe0, 0x03, 0x00, 0xf8, 0x00, 0x00, - 0x0e, 0x00, 0xc0, 0x00, 0x00, 0x0f, 0x00, 0x3c, - 0x03, 0xf8, 0x30, 0xe0, 0x03, 0x83, 0x07, 0x30, - 0x1f, 0x00, 0x7f, 0x00, 0xf0, 0x01, 0x00, 0x03, - 0x00, 0x30, 0x00, 0x00, 0x03, 0x00, 0x30, 0x00, - 0x00, - // in regular row-major format -// 0x7f, 0xc0, 0xff, 0xdf, 0xf0, 0x3f, 0xf0, 0xc0, -// 0x00, 0xc0, 0x30, 0x00, 0x30, 0x06, 0x00, 0x1c, -// 0x01, 0x80, 0x06, 0x00, 0x30, 0x01, 0x80, 0x0c, -// 0x00, 0xc0, 0x03, 0x80, 0x30, 0x00, 0x60, 0x18, -// 0x00, 0x18, 0x06, 0x00, 0x03, 0x03, 0x00, 0x00, -// 0xc0, 0xc0, 0x00, 0x18, 0x30, 0x00, 0x06, 0x18, -// 0x00, 0x00, 0xc6, 0x00, 0x00, 0x33, 0x00, 0x00, -// 0x0e, 0xc0, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x78, -// 0x00, - - // 'w' (0x77) 26x20, offset 5285-5350, at +1/-19 - 0x00, 0x00, 0x30, 0x00, 0x00, 0x03, 0x00, 0xf0, - 0x03, 0x00, 0xff, 0x07, 0x30, 0xf8, 0x07, 0x03, - 0xf0, 0x3f, 0x00, 0xf0, 0x00, 0x80, 0x0f, 0x00, - 0x3f, 0x00, 0x7e, 0x00, 0xfc, 0x00, 0xe0, 0x01, - 0x00, 0x1e, 0x00, 0xc0, 0x0f, 0x00, 0xe0, 0x07, - 0x00, 0xf0, 0x01, 0x00, 0xf8, 0x03, 0x00, 0x3e, - 0x00, 0xff, 0x03, 0xff, 0xb0, 0xff, 0x00, 0x7f, - 0x00, 0x30, 0x00, 0x00, 0x03, 0x00, 0x30, 0x00, - 0x00, - // in regular row-major format -// 0x7f, 0x00, 0x3f, 0xdf, 0xc0, 0x0f, 0xf1, 0x80, -// 0x00, 0x20, 0x60, 0x00, 0x18, 0x18, 0x00, 0x06, -// 0x06, 0x03, 0x01, 0x80, 0x81, 0xe0, 0x60, 0x30, -// 0x78, 0x10, 0x0c, 0x1e, 0x0c, 0x03, 0x0c, 0xc3, -// 0x00, 0xc3, 0x30, 0xc0, 0x10, 0xcc, 0x30, 0x06, -// 0x61, 0x98, 0x01, 0x98, 0x66, 0x00, 0x66, 0x19, -// 0x80, 0x0b, 0x03, 0x60, 0x03, 0xc0, 0xd0, 0x00, -// 0xf0, 0x1c, 0x00, 0x38, 0x07, 0x00, 0x0e, 0x01, -// 0xc0, - - // 'x' (0x78) 24x20, offset 5350-5410, at +2/-19 - 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x3c, - 0x00, 0xe0, 0x07, 0x00, 0xff, 0x00, 0xd8, 0x1b, - 0xc0, 0x3c, 0x03, 0xc6, 0x63, 0x30, 0x0c, 0x8c, - 0x01, 0x80, 0x0d, 0x00, 0x70, 0x00, 0x00, 0x07, - 0x00, 0xd8, 0x00, 0xc0, 0x18, 0x30, 0x8e, 0xc3, - 0x73, 0x70, 0xbc, 0x03, 0xce, 0x1f, 0xc0, 0xfd, - 0x00, 0xf8, 0x07, 0x00, 0x3f, 0x00, 0xe0, 0x03, - 0x00, 0x0c, 0x00, 0xc0, - // in regular row-major format -// 0x3f, 0x81, 0xfe, 0x3f, 0x81, 0xfe, 0x0c, 0x00, -// 0x38, 0x06, 0x00, 0x70, 0x03, 0x00, 0xe0, 0x01, -// 0x81, 0xc0, 0x00, 0xc3, 0x80, 0x00, 0x67, 0x00, -// 0x00, 0x3c, 0x00, 0x00, 0x18, 0x00, 0x00, 0x3c, -// 0x00, 0x00, 0x67, 0x00, 0x00, 0xc3, 0x80, 0x01, -// 0x81, 0xc0, 0x03, 0x00, 0xe0, 0x06, 0x00, 0x70, -// 0x0c, 0x00, 0x38, 0x18, 0x00, 0x1c, 0x7f, 0x81, -// 0xff, 0x7f, 0x81, 0xff, - - // 'y' (0x79) 24x29, offset 5410-5497, at +2/-19 - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x0f, - 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0xfc, 0x03, - 0x00, 0x80, 0xe7, 0x01, 0x00, 0xf0, 0xf0, 0x00, - 0x00, 0x1e, 0x78, 0x00, 0xc0, 0x00, 0x3c, 0x00, - 0x1c, 0x00, 0x1e, 0xe0, 0x03, 0x00, 0x1f, 0x6f, - 0x00, 0x80, 0x7f, 0x0c, 0x00, 0xc0, 0x83, 0x01, - 0x00, 0x0f, 0x30, 0x00, 0x78, 0x00, 0x00, 0xc0, - 0x03, 0x00, 0x03, 0x1e, 0x00, 0x60, 0xf0, 0x00, - 0x00, 0x8c, 0x07, 0x00, 0x80, 0x3d, 0x00, 0x00, - 0xf0, 0x01, 0x00, 0x00, 0x0e, 0x00, 0x00, 0xc0, - 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, - // in regular row-major format -// 0x7f, 0x00, 0xff, 0x7f, 0x00, 0xff, 0x18, 0x00, -// 0x0c, 0x18, 0x00, 0x18, 0x0c, 0x00, 0x18, 0x0c, -// 0x00, 0x30, 0x06, 0x00, 0x30, 0x06, 0x00, 0x60, -// 0x03, 0x00, 0x60, 0x03, 0x00, 0xc0, 0x01, 0x80, -// 0xc0, 0x01, 0x81, 0x80, 0x00, 0xc1, 0x80, 0x00, -// 0xc3, 0x00, 0x00, 0x63, 0x00, 0x00, 0x66, 0x00, -// 0x00, 0x36, 0x00, 0x00, 0x34, 0x00, 0x00, 0x3c, -// 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, -// 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, -// 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0xc0, -// 0x00, 0x7f, 0xfc, 0x00, 0x7f, 0xfc, 0x00, - - // 'z' (0x7a) 17x20, offset 5497-5540, at +6/-19 - 0x1f, 0x00, 0xfc, 0x01, 0xf0, 0x03, 0x80, 0x3f, - 0x00, 0xdc, 0x03, 0x60, 0x3c, 0x00, 0xc3, 0x03, - 0x1c, 0x3c, 0xe0, 0xc0, 0x03, 0x07, 0x3c, 0x18, - 0xc0, 0xc3, 0x00, 0x3c, 0x07, 0xc0, 0x3b, 0x00, - 0xfc, 0x01, 0xc0, 0x0f, 0x00, 0x3c, 0x00, 0xf8, - 0x00, 0x80, 0x0f, - // in regular row-major format -// 0xff, 0xff, 0x7f, 0xff, 0xb0, 0x01, 0x98, 0x01, -// 0xcc, 0x01, 0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00, -// 0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xe0, 0x00, -// 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, -// 0x60, 0x03, 0x70, 0x01, 0xb0, 0x00, 0xff, 0xff, -// 0xff, 0xff, 0xf0, - - // '{' (0x7b) 11x34, offset 5540-5587, at +8/-27 - 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0c, 0x00, - 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0xe0, 0x01, - 0x00, 0x00, 0xc0, 0x0c, 0x00, 0xe0, 0xff, 0xf3, - 0xff, 0xe1, 0xff, 0x03, 0xff, 0x9f, 0x01, 0x00, - 0x00, 0x60, 0x03, 0x00, 0x00, 0x00, 0x0f, 0x00, - 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x30, - // in regular row-major format -// 0x00, 0xe0, 0x7c, 0x0c, 0x03, 0x00, 0x60, 0x0c, -// 0x01, 0x80, 0x30, 0x06, 0x00, 0xc0, 0x18, 0x03, -// 0x00, 0x60, 0x0c, 0x03, 0x00, 0xe0, 0xf0, 0x1e, -// 0x00, 0x70, 0x06, 0x00, 0x60, 0x0c, 0x01, 0x80, -// 0x30, 0x06, 0x00, 0xc0, 0x18, 0x03, 0x00, 0x60, -// 0x0c, 0x01, 0x80, 0x18, 0x03, 0xe0, 0x1c, - - // '|' (0x7c) 2x34, offset 5587-5596, at +13/-27 - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0f, - // in regular row-major format -// 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -// 0xf0, - - // '}' (0x7d) 11x34, offset 5596-5643, at +9/-27 - 0x03, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, - 0x3c, 0x00, 0x00, 0x00, 0xb0, 0x01, 0x00, 0x00, - 0x60, 0xfe, 0x3f, 0xf0, 0xff, 0xe1, 0xff, 0xf3, - 0xff, 0x01, 0x00, 0xcc, 0x00, 0x00, 0x00, 0xe0, - 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, - // in regular row-major format -// 0xe0, 0x1f, 0x00, 0x60, 0x06, 0x00, 0xc0, 0x18, -// 0x03, 0x00, 0x60, 0x0c, 0x01, 0x80, 0x30, 0x06, -// 0x00, 0xc0, 0x18, 0x01, 0x80, 0x38, 0x01, 0xe0, -// 0x3c, 0x1c, 0x03, 0x00, 0xc0, 0x18, 0x03, 0x00, -// 0x60, 0x0c, 0x01, 0x80, 0x30, 0x06, 0x00, 0xc0, -// 0x18, 0x03, 0x00, 0xc0, 0xf8, 0x1c, 0x00, -}; - -static const uint8_t TomThumb_BCM[] = { - - // ' ' (0x20) 8x1, offset 0-1, at +0/-5 - 0x00, - // in regular row-major format -// 0x00, - - // '!' (0x21) 8x5, offset 1-6, at +0/-5 - 0x17, 0x00, 0x00, 0x00, 0x00, - // in regular row-major format -// 0x80, 0x80, 0x80, 0x00, 0x80, - - // '"' (0x22) 8x2, offset 6-8, at +0/-5 - 0x33, 0x00, - // in regular row-major format -// 0xa0, 0xa0, - - // '#' (0x23) 8x5, offset 8-13, at +0/-5 - 0x5f, 0x7d, 0x00, 0x00, 0x00, - // in regular row-major format -// 0xa0, 0xe0, 0xa0, 0xe0, 0xa0, - - // '$' (0x24) 8x5, offset 13-18, at +0/-5 - 0xea, 0x17, 0x00, 0x00, 0x00, - // in regular row-major format -// 0x60, 0xc0, 0x60, 0xc0, 0x40, - - // '%' (0x25) 8x5, offset 18-23, at +0/-5 - 0x89, 0x48, 0x00, 0x00, 0x00, - // in regular row-major format -// 0x80, 0x20, 0x40, 0x80, 0x20, - - // '&' (0x26) 8x5, offset 23-28, at +0/-5 - 0xef, 0x72, 0x00, 0x00, 0x00, - // in regular row-major format -// 0xc0, 0xc0, 0xe0, 0xa0, 0x60, - - // ''' (0x27) 8x2, offset 28-30, at +0/-5 - 0x03, 0x00, - // in regular row-major format -// 0x80, 0x80, - - // '(' (0x28) 8x5, offset 30-35, at +0/-5 - 0x2e, 0x02, 0x00, 0x00, 0x00, - // in regular row-major format -// 0x40, 0x80, 0x80, 0x80, 0x40, - - // ')' (0x29) 8x5, offset 35-40, at +0/-5 - 0xd1, 0x01, 0x00, 0x00, 0x00, - // in regular row-major format -// 0x80, 0x40, 0x40, 0x40, 0x80, - - // '*' (0x2a) 8x3, offset 40-43, at +0/-5 - 0x55, 0x01, 0x00, - // in regular row-major format -// 0xa0, 0x40, 0xa0, - - // '+' (0x2b) 8x3, offset 43-46, at +0/-4 - 0xba, 0x00, 0x00, - // in regular row-major format -// 0x40, 0xe0, 0x40, - - // ',' (0x2c) 8x2, offset 46-48, at +0/-2 - 0x06, 0x00, - // in regular row-major format -// 0x40, 0x80, - - // '-' (0x2d) 8x1, offset 48-49, at +0/-3 - 0x07, - // in regular row-major format -// 0xe0, - - // '.' (0x2e) 8x1, offset 49-50, at +0/-1 - 0x01, - // in regular row-major format -// 0x80, - - // '/' (0x2f) 8x5, offset 50-55, at +0/-5 - 0x98, 0x0c, 0x00, 0x00, 0x00, - // in regular row-major format -// 0x20, 0x20, 0x40, 0x80, 0x80, - - // '0' (0x30) 8x5, offset 55-60, at +0/-5 - 0x3e, 0x3e, 0x00, 0x00, 0x00, - // in regular row-major format -// 0x60, 0xa0, 0xa0, 0xa0, 0xc0, - - // '1' (0x31) 8x5, offset 60-65, at +0/-5 - 0xe2, 0x03, 0x00, 0x00, 0x00, - // in regular row-major format -// 0x40, 0xc0, 0x40, 0x40, 0x40, - - // '2' (0x32) 8x5, offset 65-70, at +0/-5 - 0xb9, 0x4a, 0x00, 0x00, 0x00, - // in regular row-major format -// 0xc0, 0x20, 0x40, 0x80, 0xe0, - - // '3' (0x33) 8x5, offset 70-75, at +0/-5 - 0xb1, 0x2a, 0x00, 0x00, 0x00, - // in regular row-major format -// 0xc0, 0x20, 0x40, 0x20, 0xc0, - - // '4' (0x34) 8x5, offset 75-80, at +0/-5 - 0x87, 0x7c, 0x00, 0x00, 0x00, - // in regular row-major format -// 0xa0, 0xa0, 0xe0, 0x20, 0x20, - - // '5' (0x35) 8x5, offset 80-85, at +0/-5 - 0xb7, 0x26, 0x00, 0x00, 0x00, - // in regular row-major format -// 0xe0, 0x80, 0xc0, 0x20, 0xc0, - - // '6' (0x36) 8x5, offset 85-90, at +0/-5 - 0xbe, 0x76, 0x00, 0x00, 0x00, - // in regular row-major format -// 0x60, 0x80, 0xe0, 0xa0, 0xe0, - - // '7' (0x37) 8x5, offset 90-95, at +0/-5 - 0xb9, 0x0c, 0x00, 0x00, 0x00, - // in regular row-major format -// 0xe0, 0x20, 0x40, 0x80, 0x80, - - // '8' (0x38) 8x5, offset 95-100, at +0/-5 - 0xbf, 0x7e, 0x00, 0x00, 0x00, - // in regular row-major format -// 0xe0, 0xa0, 0xe0, 0xa0, 0xe0, - - // '9' (0x39) 8x5, offset 100-105, at +0/-5 - 0xb7, 0x3e, 0x00, 0x00, 0x00, - // in regular row-major format -// 0xe0, 0xa0, 0xe0, 0x20, 0xc0, - - // ':' (0x3a) 8x3, offset 105-108, at +0/-4 - 0x05, 0x00, 0x00, - // in regular row-major format -// 0x80, 0x00, 0x80, - - // ';' (0x3b) 8x4, offset 108-112, at +0/-4 - 0x58, 0x00, 0x00, 0x00, - // in regular row-major format -// 0x40, 0x00, 0x40, 0x80, - - // '<' (0x3c) 8x5, offset 112-117, at +0/-5 - 0x44, 0x45, 0x00, 0x00, 0x00, - // in regular row-major format -// 0x20, 0x40, 0x80, 0x40, 0x20, - - // '=' (0x3d) 8x3, offset 117-120, at +0/-4 - 0x6d, 0x01, 0x00, - // in regular row-major format -// 0xe0, 0x00, 0xe0, - - // '>' (0x3e) 8x5, offset 120-125, at +0/-5 - 0x51, 0x11, 0x00, 0x00, 0x00, - // in regular row-major format -// 0x80, 0x40, 0x20, 0x40, 0x80, - - // '?' (0x3f) 8x5, offset 125-130, at +0/-5 - 0xa1, 0x0e, 0x00, 0x00, 0x00, - // in regular row-major format -// 0xe0, 0x20, 0x40, 0x00, 0x40, - - // '@' (0x40) 8x5, offset 130-135, at +0/-5 - 0xae, 0x5a, 0x00, 0x00, 0x00, - // in regular row-major format -// 0x40, 0xa0, 0xe0, 0x80, 0x60, - - // 'A' (0x41) 8x5, offset 135-140, at +0/-5 - 0xbe, 0x78, 0x00, 0x00, 0x00, - // in regular row-major format -// 0x40, 0xa0, 0xe0, 0xa0, 0xa0, - - // 'B' (0x42) 8x5, offset 140-145, at +0/-5 - 0xbf, 0x2a, 0x00, 0x00, 0x00, - // in regular row-major format -// 0xc0, 0xa0, 0xc0, 0xa0, 0xc0, - - // 'C' (0x43) 8x5, offset 145-150, at +0/-5 - 0x2e, 0x46, 0x00, 0x00, 0x00, - // in regular row-major format -// 0x60, 0x80, 0x80, 0x80, 0x60, - - // 'D' (0x44) 8x5, offset 150-155, at +0/-5 - 0x3f, 0x3a, 0x00, 0x00, 0x00, - // in regular row-major format -// 0xc0, 0xa0, 0xa0, 0xa0, 0xc0, - - // 'E' (0x45) 8x5, offset 155-160, at +0/-5 - 0xbf, 0x56, 0x00, 0x00, 0x00, - // in regular row-major format -// 0xe0, 0x80, 0xe0, 0x80, 0xe0, - - // 'F' (0x46) 8x5, offset 160-165, at +0/-5 - 0xbf, 0x14, 0x00, 0x00, 0x00, - // in regular row-major format -// 0xe0, 0x80, 0xe0, 0x80, 0x80, - - // 'G' (0x47) 8x5, offset 165-170, at +0/-5 - 0xae, 0x76, 0x00, 0x00, 0x00, - // in regular row-major format -// 0x60, 0x80, 0xe0, 0xa0, 0x60, - - // 'H' (0x48) 8x5, offset 170-175, at +0/-5 - 0x9f, 0x7c, 0x00, 0x00, 0x00, - // in regular row-major format -// 0xa0, 0xa0, 0xe0, 0xa0, 0xa0, - - // 'I' (0x49) 8x5, offset 175-180, at +0/-5 - 0xf1, 0x47, 0x00, 0x00, 0x00, - // in regular row-major format -// 0xe0, 0x40, 0x40, 0x40, 0xe0, - - // 'J' (0x4a) 8x5, offset 180-185, at +0/-5 - 0x08, 0x3e, 0x00, 0x00, 0x00, - // in regular row-major format -// 0x20, 0x20, 0x20, 0xa0, 0x40, - - // 'K' (0x4b) 8x5, offset 185-190, at +0/-5 - 0x9f, 0x6c, 0x00, 0x00, 0x00, - // in regular row-major format -// 0xa0, 0xa0, 0xc0, 0xa0, 0xa0, - - // 'L' (0x4c) 8x5, offset 190-195, at +0/-5 - 0x1f, 0x42, 0x00, 0x00, 0x00, - // in regular row-major format -// 0x80, 0x80, 0x80, 0x80, 0xe0, - - // 'M' (0x4d) 8x5, offset 195-200, at +0/-5 - 0xdf, 0x7c, 0x00, 0x00, 0x00, - // in regular row-major format -// 0xa0, 0xe0, 0xe0, 0xa0, 0xa0, - - // 'N' (0x4e) 8x5, offset 200-205, at +0/-5 - 0xdf, 0x7d, 0x00, 0x00, 0x00, - // in regular row-major format -// 0xa0, 0xe0, 0xe0, 0xe0, 0xa0, - - // 'O' (0x4f) 8x5, offset 205-210, at +0/-5 - 0x2e, 0x3a, 0x00, 0x00, 0x00, - // in regular row-major format -// 0x40, 0xa0, 0xa0, 0xa0, 0x40, - - // 'P' (0x50) 8x5, offset 210-215, at +0/-5 - 0xbf, 0x08, 0x00, 0x00, 0x00, - // in regular row-major format -// 0xc0, 0xa0, 0xc0, 0x80, 0x80, - - // 'Q' (0x51) 8x5, offset 215-220, at +0/-5 - 0x2e, 0x7b, 0x00, 0x00, 0x00, - // in regular row-major format -// 0x40, 0xa0, 0xa0, 0xe0, 0x60, - - // 'R' (0x52) 8x5, offset 220-225, at +0/-5 - 0xbf, 0x59, 0x00, 0x00, 0x00, - // in regular row-major format -// 0xc0, 0xa0, 0xe0, 0xc0, 0xa0, - - // 'S' (0x53) 8x5, offset 225-230, at +0/-5 - 0xb2, 0x26, 0x00, 0x00, 0x00, - // in regular row-major format -// 0x60, 0x80, 0x40, 0x20, 0xc0, - - // 'T' (0x54) 8x5, offset 230-235, at +0/-5 - 0xe1, 0x07, 0x00, 0x00, 0x00, - // in regular row-major format -// 0xe0, 0x40, 0x40, 0x40, 0x40, - - // 'U' (0x55) 8x5, offset 235-240, at +0/-5 - 0x0f, 0x7e, 0x00, 0x00, 0x00, - // in regular row-major format -// 0xa0, 0xa0, 0xa0, 0xa0, 0x60, - - // 'V' (0x56) 8x5, offset 240-245, at +0/-5 - 0x07, 0x1f, 0x00, 0x00, 0x00, - // in regular row-major format -// 0xa0, 0xa0, 0xa0, 0x40, 0x40, - - // 'W' (0x57) 8x5, offset 245-250, at +0/-5 - 0x9f, 0x7d, 0x00, 0x00, 0x00, - // in regular row-major format -// 0xa0, 0xa0, 0xe0, 0xe0, 0xa0, - - // 'X' (0x58) 8x5, offset 250-255, at +0/-5 - 0x9b, 0x6c, 0x00, 0x00, 0x00, - // in regular row-major format -// 0xa0, 0xa0, 0x40, 0xa0, 0xa0, - - // 'Y' (0x59) 8x5, offset 255-260, at +0/-5 - 0x83, 0x0f, 0x00, 0x00, 0x00, - // in regular row-major format -// 0xa0, 0xa0, 0x40, 0x40, 0x40, - - // 'Z' (0x5a) 8x5, offset 260-265, at +0/-5 - 0xb9, 0x4e, 0x00, 0x00, 0x00, - // in regular row-major format -// 0xe0, 0x20, 0x40, 0x80, 0xe0, - - // '[' (0x5b) 8x5, offset 265-270, at +0/-5 - 0x3f, 0x46, 0x00, 0x00, 0x00, - // in regular row-major format -// 0xe0, 0x80, 0x80, 0x80, 0xe0, - - // '\' (0x5c) 8x3, offset 270-273, at +0/-4 - 0x11, 0x01, 0x00, - // in regular row-major format -// 0x80, 0x40, 0x20, - - // ']' (0x5d) 8x5, offset 273-278, at +0/-5 - 0x31, 0x7e, 0x00, 0x00, 0x00, - // in regular row-major format -// 0xe0, 0x20, 0x20, 0x20, 0xe0, - - // '^' (0x5e) 8x2, offset 278-280, at +0/-5 - 0x26, 0x00, - // in regular row-major format -// 0x40, 0xa0, - - // '_' (0x5f) 8x1, offset 280-281, at +0/-1 - 0x07, - // in regular row-major format -// 0xe0, - - // '`' (0x60) 8x2, offset 281-283, at +0/-5 - 0x09, 0x00, - // in regular row-major format -// 0x80, 0x40, - - // 'a' (0x61) 8x4, offset 283-287, at +0/-4 - 0xbd, 0x0e, 0x00, 0x00, - // in regular row-major format -// 0xc0, 0x60, 0xa0, 0xe0, - - // 'b' (0x62) 8x5, offset 287-292, at +0/-5 - 0x5f, 0x32, 0x00, 0x00, 0x00, - // in regular row-major format -// 0x80, 0xc0, 0xa0, 0xa0, 0xc0, - - // 'c' (0x63) 8x4, offset 292-296, at +0/-4 - 0x96, 0x09, 0x00, 0x00, - // in regular row-major format -// 0x60, 0x80, 0x80, 0x60, - - // 'd' (0x64) 8x5, offset 296-301, at +0/-5 - 0x4c, 0x7e, 0x00, 0x00, 0x00, - // in regular row-major format -// 0x20, 0x60, 0xa0, 0xa0, 0x60, - - // 'e' (0x65) 8x4, offset 301-305, at +0/-4 - 0xd6, 0x0b, 0x00, 0x00, - // in regular row-major format -// 0x60, 0xa0, 0xc0, 0x60, - - // 'f' (0x66) 8x5, offset 305-310, at +0/-5 - 0xc4, 0x17, 0x00, 0x00, 0x00, - // in regular row-major format -// 0x20, 0x40, 0xe0, 0x40, 0x40, - - // 'g' (0x67) 8x5, offset 310-315, at +0/-4 - 0xa6, 0x3e, 0x00, 0x00, 0x00, - // in regular row-major format -// 0x60, 0xa0, 0xe0, 0x20, 0x40, - - // 'h' (0x68) 8x5, offset 315-320, at +0/-5 - 0x5f, 0x70, 0x00, 0x00, 0x00, - // in regular row-major format -// 0x80, 0xc0, 0xa0, 0xa0, 0xa0, - - // 'i' (0x69) 8x5, offset 320-325, at +0/-5 - 0x1d, 0x00, 0x00, 0x00, 0x00, - // in regular row-major format -// 0x80, 0x00, 0x80, 0x80, 0x80, - - // 'j' (0x6a) 8x6, offset 325-331, at +0/-5 - 0x10, 0xd8, 0x01, 0x00, 0x00, 0x00, - // in regular row-major format -// 0x20, 0x00, 0x20, 0x20, 0xa0, 0x40, - - // 'k' (0x6b) 8x5, offset 331-336, at +0/-5 - 0x9f, 0x49, 0x00, 0x00, 0x00, - // in regular row-major format -// 0x80, 0xa0, 0xc0, 0xc0, 0xa0, - - // 'l' (0x6c) 8x5, offset 336-341, at +0/-5 - 0xf1, 0x43, 0x00, 0x00, 0x00, - // in regular row-major format -// 0xc0, 0x40, 0x40, 0x40, 0xe0, - - // 'm' (0x6d) 8x4, offset 341-345, at +0/-4 - 0x7f, 0x0f, 0x00, 0x00, - // in regular row-major format -// 0xe0, 0xe0, 0xe0, 0xa0, - - // 'n' (0x6e) 8x4, offset 345-349, at +0/-4 - 0x1f, 0x0e, 0x00, 0x00, - // in regular row-major format -// 0xc0, 0xa0, 0xa0, 0xa0, - - // 'o' (0x6f) 8x4, offset 349-353, at +0/-4 - 0x96, 0x06, 0x00, 0x00, - // in regular row-major format -// 0x40, 0xa0, 0xa0, 0x40, - - // 'p' (0x70) 8x5, offset 353-358, at +0/-4 - 0x3f, 0x19, 0x00, 0x00, 0x00, - // in regular row-major format -// 0xc0, 0xa0, 0xa0, 0xc0, 0x80, - - // 'q' (0x71) 8x5, offset 358-363, at +0/-4 - 0x26, 0x7d, 0x00, 0x00, 0x00, - // in regular row-major format -// 0x60, 0xa0, 0xa0, 0x60, 0x20, - - // 'r' (0x72) 8x4, offset 363-367, at +0/-4 - 0x1e, 0x01, 0x00, 0x00, - // in regular row-major format -// 0x60, 0x80, 0x80, 0x80, - - // 's' (0x73) 8x4, offset 367-371, at +0/-4 - 0xfa, 0x05, 0x00, 0x00, - // in regular row-major format -// 0x60, 0xc0, 0x60, 0xc0, - - // 't' (0x74) 8x5, offset 371-376, at +0/-5 - 0xe2, 0x4b, 0x00, 0x00, 0x00, - // in regular row-major format -// 0x40, 0xe0, 0x40, 0x40, 0x60, - - // 'u' (0x75) 8x4, offset 376-380, at +0/-4 - 0x87, 0x0f, 0x00, 0x00, - // in regular row-major format -// 0xa0, 0xa0, 0xa0, 0x60, - - // 'v' (0x76) 8x4, offset 380-384, at +0/-4 - 0xc7, 0x07, 0x00, 0x00, - // in regular row-major format -// 0xa0, 0xa0, 0xe0, 0x40, - - // 'w' (0x77) 8x4, offset 384-388, at +0/-4 - 0xef, 0x0f, 0x00, 0x00, - // in regular row-major format -// 0xa0, 0xe0, 0xe0, 0xe0, - - // 'x' (0x78) 8x4, offset 388-392, at +0/-4 - 0x69, 0x09, 0x00, 0x00, - // in regular row-major format -// 0xa0, 0x40, 0x40, 0xa0, - - // 'y' (0x79) 8x5, offset 392-397, at +0/-4 - 0x83, 0x3e, 0x00, 0x00, 0x00, - // in regular row-major format -// 0xa0, 0xa0, 0x60, 0x20, 0x40, - - // 'z' (0x7a) 8x4, offset 397-401, at +0/-4 - 0xfd, 0x0b, 0x00, 0x00, - // in regular row-major format -// 0xe0, 0x60, 0xc0, 0xe0, - - // '{' (0x7b) 8x5, offset 401-406, at +0/-5 - 0x64, 0x47, 0x00, 0x00, 0x00, - // in regular row-major format -// 0x60, 0x40, 0x80, 0x40, 0x60, - - // '|' (0x7c) 8x5, offset 406-411, at +0/-5 - 0x1b, 0x00, 0x00, 0x00, 0x00, - // in regular row-major format -// 0x80, 0x80, 0x00, 0x80, 0x80, - - // '}' (0x7d) 8x5, offset 411-416, at +0/-5 - 0x71, 0x13, 0x00, 0x00, 0x00, - // in regular row-major format -// 0xc0, 0x40, 0x20, 0x40, 0xc0, -}; - -static const uint8_t Org_01_BCM[] = { - - // ' ' (0x20) 0x0, offset 0-0, at +0/+1 - // in regular row-major format - - // '!' (0x21) 1x5, offset 0-1, at +0/-4 - 0x17, - // in regular row-major format -// 0xe8, - - // '"' (0x22) 3x1, offset 1-2, at +0/-4 - 0x05, - // in regular row-major format -// 0xa0, - - // '#' (0x23) 5x5, offset 2-6, at +0/-4 - 0xea, 0xab, 0xaf, 0x00, - // in regular row-major format -// 0x57, 0xd5, 0xf5, 0x00, - - // '$' (0x24) 5x5, offset 6-10, at +0/-4 - 0xb7, 0xfe, 0xda, 0x01, - // in regular row-major format -// 0xfd, 0x3e, 0x5f, 0x80, - - // '%' (0x25) 5x5, offset 10-14, at +0/-4 - 0x11, 0x11, 0x11, 0x01, - // in regular row-major format -// 0x88, 0x88, 0x88, 0x80, - - // '&' (0x26) 5x5, offset 14-18, at +0/-4 - 0xbf, 0xd6, 0x47, 0x01, - // in regular row-major format -// 0xf4, 0xbf, 0x2e, 0x80, - - // ''' (0x27) 1x1, offset 18-19, at +0/-4 - 0x01, - // in regular row-major format -// 0x80, - - // '(' (0x28) 2x5, offset 19-21, at +0/-4 - 0x2e, 0x02, - // in regular row-major format -// 0x6a, 0x40, - - // ')' (0x29) 2x5, offset 21-23, at +0/-4 - 0xd1, 0x01, - // in regular row-major format -// 0x95, 0x80, - - // '*' (0x2a) 3x3, offset 23-25, at +0/-3 - 0x55, 0x01, - // in regular row-major format -// 0xaa, 0x80, - - // '+' (0x2b) 3x3, offset 25-27, at +0/-3 - 0xba, 0x00, - // in regular row-major format -// 0x5d, 0x00, - - // ',' (0x2c) 1x2, offset 27-28, at +0/+0 - 0x03, - // in regular row-major format -// 0xc0, - - // '-' (0x2d) 4x1, offset 28-29, at +0/-2 - 0x0f, - // in regular row-major format -// 0xf0, - - // '.' (0x2e) 1x1, offset 29-30, at +0/+0 - 0x01, - // in regular row-major format -// 0x80, - - // '/' (0x2f) 5x5, offset 30-34, at +0/-4 - 0x10, 0x11, 0x11, 0x00, - // in regular row-major format -// 0x08, 0x88, 0x88, 0x00, - - // '0' (0x30) 5x5, offset 34-38, at +0/-4 - 0x3f, 0xc6, 0xf8, 0x01, - // in regular row-major format -// 0xfc, 0x63, 0x1f, 0x80, - - // '1' (0x31) 1x5, offset 38-39, at +0/-4 - 0x1f, - // in regular row-major format -// 0xf8, - - // '2' (0x32) 5x5, offset 39-43, at +0/-4 - 0xbd, 0xd6, 0x7a, 0x01, - // in regular row-major format -// 0xf8, 0x7f, 0x0f, 0x80, - - // '3' (0x33) 5x5, offset 43-47, at +0/-4 - 0xb5, 0xd6, 0xfa, 0x01, - // in regular row-major format -// 0xf8, 0x7e, 0x1f, 0x80, - - // '4' (0x34) 5x5, offset 47-51, at +0/-4 - 0x87, 0x10, 0xf2, 0x01, - // in regular row-major format -// 0x8c, 0x7e, 0x10, 0x80, - - // '5' (0x35) 5x5, offset 51-55, at +0/-4 - 0xb7, 0xd6, 0xda, 0x01, - // in regular row-major format -// 0xfc, 0x3e, 0x1f, 0x80, - - // '6' (0x36) 5x5, offset 55-59, at +0/-4 - 0xbf, 0xd6, 0xda, 0x01, - // in regular row-major format -// 0xfc, 0x3f, 0x1f, 0x80, - - // '7' (0x37) 5x5, offset 59-63, at +0/-4 - 0x21, 0x84, 0xf0, 0x01, - // in regular row-major format -// 0xf8, 0x42, 0x10, 0x80, - - // '8' (0x38) 5x5, offset 63-67, at +0/-4 - 0xbf, 0xd6, 0xfa, 0x01, - // in regular row-major format -// 0xfc, 0x7f, 0x1f, 0x80, - - // '9' (0x39) 5x5, offset 67-71, at +0/-4 - 0xb7, 0xd6, 0xfa, 0x01, - // in regular row-major format -// 0xfc, 0x7e, 0x1f, 0x80, - - // ':' (0x3a) 1x4, offset 71-72, at +0/-3 - 0x09, - // in regular row-major format -// 0x90, - - // ';' (0x3b) 1x4, offset 72-73, at +0/-3 - 0x0d, - // in regular row-major format -// 0xb0, - - // '<' (0x3c) 3x5, offset 73-75, at +0/-4 - 0x44, 0x45, - // in regular row-major format -// 0x2a, 0x22, - - // '=' (0x3d) 4x3, offset 75-77, at +0/-3 - 0x6d, 0x0b, - // in regular row-major format -// 0xf0, 0xf0, - - // '>' (0x3e) 3x5, offset 77-79, at +0/-4 - 0x51, 0x11, - // in regular row-major format -// 0x88, 0xa8, - - // '?' (0x3f) 5x5, offset 79-83, at +0/-4 - 0x21, 0xd4, 0x72, 0x00, - // in regular row-major format -// 0xf8, 0x4e, 0x02, 0x00, - - // '@' (0x40) 5x5, offset 83-87, at +0/-4 - 0x3f, 0xde, 0x7a, 0x01, - // in regular row-major format -// 0xfd, 0x6f, 0x0f, 0x80, - - // 'A' (0x41) 5x5, offset 87-91, at +0/-4 - 0xbf, 0x94, 0xf2, 0x01, - // in regular row-major format -// 0xfc, 0x7f, 0x18, 0x80, - - // 'B' (0x42) 5x5, offset 91-95, at +0/-4 - 0xbf, 0xd6, 0xaa, 0x00, - // in regular row-major format -// 0xf4, 0x7d, 0x1f, 0x00, - - // 'C' (0x43) 5x5, offset 95-99, at +0/-4 - 0x3f, 0xc6, 0x18, 0x01, - // in regular row-major format -// 0xfc, 0x21, 0x0f, 0x80, - - // 'D' (0x44) 5x5, offset 99-103, at +0/-4 - 0x3f, 0xc6, 0xe8, 0x00, - // in regular row-major format -// 0xf4, 0x63, 0x1f, 0x00, - - // 'E' (0x45) 5x5, offset 103-107, at +0/-4 - 0xbf, 0xd6, 0x5a, 0x01, - // in regular row-major format -// 0xfc, 0x3f, 0x0f, 0x80, - - // 'F' (0x46) 5x5, offset 107-111, at +0/-4 - 0xbf, 0x94, 0x52, 0x00, - // in regular row-major format -// 0xfc, 0x3f, 0x08, 0x00, - - // 'G' (0x47) 5x5, offset 111-115, at +0/-4 - 0x3f, 0xd6, 0xda, 0x01, - // in regular row-major format -// 0xfc, 0x2f, 0x1f, 0x80, - - // 'H' (0x48) 5x5, offset 115-119, at +0/-4 - 0x9f, 0x10, 0xf2, 0x01, - // in regular row-major format -// 0x8c, 0x7f, 0x18, 0x80, - - // 'I' (0x49) 5x5, offset 119-123, at +0/-4 - 0x31, 0xfe, 0x18, 0x01, - // in regular row-major format -// 0xf9, 0x08, 0x4f, 0x80, - - // 'J' (0x4a) 5x5, offset 123-127, at +0/-4 - 0x38, 0xc6, 0x1f, 0x01, - // in regular row-major format -// 0x78, 0x85, 0x2f, 0x80, - - // 'K' (0x4b) 5x5, offset 127-131, at +0/-4 - 0x9f, 0x28, 0x15, 0x01, - // in regular row-major format -// 0x8d, 0xb1, 0x68, 0x80, - - // 'L' (0x4c) 5x5, offset 131-135, at +0/-4 - 0x1f, 0x42, 0x08, 0x01, - // in regular row-major format -// 0x84, 0x21, 0x0f, 0x80, - - // 'M' (0x4d) 5x5, offset 135-139, at +0/-4 - 0x3f, 0xfc, 0xf0, 0x01, - // in regular row-major format -// 0xfd, 0x6b, 0x5a, 0x80, - - // 'N' (0x4e) 5x5, offset 139-143, at +0/-4 - 0x3f, 0x84, 0xf0, 0x01, - // in regular row-major format -// 0xfc, 0x63, 0x18, 0x80, - - // 'O' (0x4f) 5x5, offset 143-147, at +0/-4 - 0x3f, 0xc6, 0xf8, 0x01, - // in regular row-major format -// 0xfc, 0x63, 0x1f, 0x80, - - // 'P' (0x50) 5x5, offset 147-151, at +0/-4 - 0xbf, 0x94, 0x72, 0x00, - // in regular row-major format -// 0xfc, 0x7f, 0x08, 0x00, - - // 'Q' (0x51) 5x5, offset 151-155, at +0/-4 - 0x3f, 0xc6, 0xfc, 0x01, - // in regular row-major format -// 0xfc, 0x63, 0x3f, 0x80, - - // 'R' (0x52) 5x5, offset 155-159, at +0/-4 - 0xbf, 0x94, 0x7e, 0x00, - // in regular row-major format -// 0xfc, 0x7f, 0x29, 0x00, - - // 'S' (0x53) 5x5, offset 159-163, at +0/-4 - 0xb7, 0xd6, 0xda, 0x01, - // in regular row-major format -// 0xfc, 0x3e, 0x1f, 0x80, - - // 'T' (0x54) 5x5, offset 163-167, at +0/-4 - 0x21, 0xfc, 0x10, 0x00, - // in regular row-major format -// 0xf9, 0x08, 0x42, 0x00, - - // 'U' (0x55) 5x5, offset 167-171, at +0/-4 - 0x1f, 0x42, 0xf8, 0x01, - // in regular row-major format -// 0x8c, 0x63, 0x1f, 0x80, - - // 'V' (0x56) 5x5, offset 171-175, at +0/-4 - 0x07, 0x41, 0x74, 0x00, - // in regular row-major format -// 0x8c, 0x62, 0xa2, 0x00, - - // 'W' (0x57) 5x5, offset 175-179, at +0/-4 - 0x1f, 0x7e, 0xf8, 0x01, - // in regular row-major format -// 0xad, 0x6b, 0x5f, 0x80, - - // 'X' (0x58) 5x5, offset 179-183, at +0/-4 - 0x51, 0x11, 0x15, 0x01, - // in regular row-major format -// 0x8a, 0x88, 0xa8, 0x80, - - // 'Y' (0x59) 5x5, offset 183-187, at +0/-4 - 0x83, 0x60, 0x32, 0x00, - // in regular row-major format -// 0x8c, 0x54, 0x42, 0x00, - - // 'Z' (0x5a) 5x5, offset 187-191, at +0/-4 - 0xbd, 0xd6, 0x7a, 0x01, - // in regular row-major format -// 0xf8, 0x7f, 0x0f, 0x80, - - // '[' (0x5b) 2x5, offset 191-193, at +0/-4 - 0x3f, 0x02, - // in regular row-major format -// 0xea, 0xc0, - - // '\' (0x5c) 5x5, offset 193-197, at +0/-4 - 0x41, 0x10, 0x04, 0x01, - // in regular row-major format -// 0x82, 0x08, 0x20, 0x80, - - // ']' (0x5d) 2x5, offset 197-199, at +0/-4 - 0xf1, 0x03, - // in regular row-major format -// 0xd5, 0xc0, - - // '^' (0x5e) 3x2, offset 199-200, at +0/-4 - 0x26, - // in regular row-major format -// 0x54, - - // '_' (0x5f) 5x1, offset 200-201, at +0/+1 - 0x1f, - // in regular row-major format -// 0xf8, - - // '`' (0x60) 1x1, offset 201-202, at +0/-4 - 0x01, - // in regular row-major format -// 0x80, - - // 'a' (0x61) 4x4, offset 202-204, at +0/-3 - 0xdd, 0xfd, - // in regular row-major format -// 0xf1, 0xff, - - // 'b' (0x62) 4x5, offset 204-207, at +0/-4 - 0x5f, 0x4a, 0x0f, - // in regular row-major format -// 0x8f, 0x99, 0xf0, - - // 'c' (0x63) 4x4, offset 207-209, at +0/-3 - 0x9f, 0x99, - // in regular row-major format -// 0xf8, 0x8f, - - // 'd' (0x64) 4x5, offset 209-212, at +0/-4 - 0x5e, 0xca, 0x0f, - // in regular row-major format -// 0x1f, 0x99, 0xf0, - - // 'e' (0x65) 4x4, offset 212-214, at +0/-3 - 0xbf, 0xbb, - // in regular row-major format -// 0xff, 0x8f, - - // 'f' (0x66) 3x5, offset 214-216, at +0/-4 - 0xe4, 0x17, - // in regular row-major format -// 0x6b, 0xa4, - - // 'g' (0x67) 4x5, offset 216-219, at +0/-3 - 0x2f, 0xa5, 0x0f, - // in regular row-major format -// 0xf9, 0x9f, 0x10, - - // 'h' (0x68) 4x5, offset 219-222, at +0/-4 - 0x5f, 0x08, 0x0f, - // in regular row-major format -// 0x8f, 0x99, 0x90, - - // 'i' (0x69) 1x4, offset 222-223, at +0/-3 - 0x0f, - // in regular row-major format -// 0xf0, - - // 'j' (0x6a) 2x5, offset 223-225, at +0/-3 - 0xf0, 0x03, - // in regular row-major format -// 0x55, 0xc0, - - // 'k' (0x6b) 4x5, offset 225-228, at +0/-4 - 0x9f, 0x18, 0x0e, - // in regular row-major format -// 0x8a, 0xf9, 0x90, - - // 'l' (0x6c) 1x5, offset 228-229, at +0/-4 - 0x1f, - // in regular row-major format -// 0xf8, - - // 'm' (0x6d) 5x4, offset 229-232, at +0/-3 - 0x1f, 0x13, 0x0f, - // in regular row-major format -// 0xfd, 0x63, 0x10, - - // 'n' (0x6e) 4x4, offset 232-234, at +0/-3 - 0x1f, 0xf1, - // in regular row-major format -// 0xf9, 0x99, - - // 'o' (0x6f) 4x4, offset 234-236, at +0/-3 - 0x9f, 0xf9, - // in regular row-major format -// 0xf9, 0x9f, - - // 'p' (0x70) 4x5, offset 236-239, at +0/-3 - 0x3f, 0xa5, 0x07, - // in regular row-major format -// 0xf9, 0x9f, 0x80, - - // 'q' (0x71) 4x5, offset 239-242, at +0/-3 - 0x2f, 0xe5, 0x07, - // in regular row-major format -// 0xf9, 0x9f, 0x20, - - // 'r' (0x72) 4x4, offset 242-244, at +0/-3 - 0x1f, 0x11, - // in regular row-major format -// 0xf8, 0x88, - - // 's' (0x73) 4x4, offset 244-246, at +0/-3 - 0xb8, 0xea, - // in regular row-major format -// 0x47, 0x1f, - - // 't' (0x74) 5x5, offset 246-250, at +0/-4 - 0x42, 0x7c, 0x21, 0x00, - // in regular row-major format -// 0x27, 0xc8, 0x42, 0x00, - - // 'u' (0x75) 4x4, offset 250-252, at +0/-3 - 0x8f, 0xf8, - // in regular row-major format -// 0x99, 0x9f, - - // 'v' (0x76) 4x4, offset 252-254, at +0/-3 - 0x87, 0xf8, - // in regular row-major format -// 0x99, 0x97, - - // 'w' (0x77) 5x4, offset 254-257, at +0/-3 - 0x8f, 0x8c, 0x0f, - // in regular row-major format -// 0x8c, 0x6b, 0xf0, - - // 'x' (0x78) 4x4, offset 257-259, at +0/-3 - 0x69, 0x96, - // in regular row-major format -// 0x96, 0x69, - - // 'y' (0x79) 4x5, offset 259-262, at +0/-3 - 0x0f, 0xa1, 0x0f, - // in regular row-major format -// 0x99, 0x9f, 0x10, - - // 'z' (0x7a) 4x4, offset 262-264, at +0/-3 - 0xae, 0x8b, - // in regular row-major format -// 0x2e, 0x8f, - - // '{' (0x7b) 3x5, offset 264-266, at +0/-4 - 0xc4, 0x45, - // in regular row-major format -// 0x2b, 0x22, - - // '|' (0x7c) 1x5, offset 266-267, at +0/-4 - 0x1f, - // in regular row-major format -// 0xf8, - - // '}' (0x7d) 3x5, offset 267-269, at +0/-4 - 0xd1, 0x11, - // in regular row-major format -// 0x89, 0xa8, -}; - -static const uint8_t OpenSansLight10_BCM[] = { - - // ' ' (0x20) 1x1, offset 0-1, at +0/+0 - 0x00, - // in regular row-major format -// 0x00, - - // '!' (0x21) 3x7, offset 1-4, at +0/-7 - 0x80, 0x27, 0x00, - // in regular row-major format -// 0x49, 0x20, 0x10, - - // '"' (0x22) 3x3, offset 4-6, at +1/-7 - 0x1b, 0x00, - // in regular row-major format -// 0xd8, 0x00, - - // '#' (0x23) 7x7, offset 6-13, at +0/-7 - 0x10, 0xfe, 0x85, 0xfe, 0x21, 0x00, 0x00, - // in regular row-major format -// 0x28, 0x51, 0xf2, 0x4f, 0x8a, 0x14, 0x00, - - // '$' (0x24) 5x9, offset 13-19, at +1/-8 - 0x8c, 0xfc, 0x49, 0x12, 0x03, 0x00, - // in regular row-major format -// 0x03, 0xb1, 0x86, 0x29, 0x5c, 0x00, - - // '%' (0x25) 7x7, offset 19-26, at +1/-7 - 0x8f, 0xb4, 0x87, 0xb6, 0xc4, 0x03, 0x00, - // in regular row-major format -// 0xc9, 0x52, 0xc7, 0x63, 0x4a, 0x93, 0x00, - - // '&' (0x26) 7x7, offset 26-33, at +1/-7 - 0xf6, 0x64, 0x55, 0x0c, 0x06, 0x00, 0x00, - // in regular row-major format -// 0x61, 0x22, 0x82, 0x0a, 0x13, 0x3e, 0x00, - - // ''' (0x27) 3x3, offset 33-35, at +0/-7 - 0x03, 0x00, - // in regular row-major format -// 0x90, 0x00, - - // '(' (0x28) 4x9, offset 35-40, at +0/-7 - 0x7c, 0x06, 0x03, 0x00, 0x00, - // in regular row-major format -// 0x44, 0x88, 0x88, 0x84, 0x40, - - // ')' (0x29) 4x9, offset 40-45, at +0/-7 - 0x00, 0x06, 0xf3, 0x01, 0x00, - // in regular row-major format -// 0x44, 0x22, 0x22, 0x24, 0x40, - - // '*' (0x2a) 5x4, offset 45-48, at +1/-7 - 0x78, 0x84, 0x00, - // in regular row-major format -// 0x42, 0x19, 0x20, - - // '+' (0x2b) 5x5, offset 48-52, at +1/-6 - 0xc4, 0x11, 0x02, 0x00, - // in regular row-major format -// 0x02, 0x3c, 0x80, 0x00, - - // ',' (0x2c) 2x2, offset 52-53, at +0/-1 - 0x03, - // in regular row-major format -// 0xa0, - - // '-' (0x2d) 4x1, offset 53-54, at +0/-3 - 0x07, - // in regular row-major format -// 0xe0, - - // '.' (0x2e) 3x1, offset 54-55, at +0/-1 - 0x02, - // in regular row-major format -// 0x40, - - // '/' (0x2f) 4x7, offset 55-59, at +0/-7 - 0x60, 0xce, 0x00, 0x00, - // in regular row-major format -// 0x22, 0x44, 0x48, 0x80, - - // '0' (0x30) 5x7, offset 59-64, at +1/-7 - 0xbe, 0x60, 0xd0, 0x07, 0x00, - // in regular row-major format -// 0x64, 0xa5, 0x29, 0x49, 0x80, - - // '1' (0x31) 3x7, offset 64-67, at +1/-7 - 0x82, 0x1f, 0x00, - // in regular row-major format -// 0x59, 0x24, 0x80, - - // '2' (0x32) 5x7, offset 67-72, at +1/-7 - 0xe1, 0x68, 0xd2, 0x08, 0x00, - // in regular row-major format -// 0xe0, 0x84, 0x44, 0x43, 0xc0, - - // '3' (0x33) 6x7, offset 72-78, at +0/-7 - 0x80, 0x60, 0x32, 0x79, 0x07, 0x00, - // in regular row-major format -// 0x78, 0x20, 0x8c, 0x08, 0x27, 0x80, - - // '4' (0x34) 7x7, offset 78-85, at +0/-7 - 0x10, 0x8e, 0x24, 0xf2, 0x87, 0x00, 0x00, - // in regular row-major format -// 0x18, 0x51, 0x22, 0x4f, 0xc1, 0x02, 0x00, - - // '5' (0x35) 5x7, offset 85-90, at +1/-7 - 0xcf, 0x64, 0x32, 0x0f, 0x00, - // in regular row-major format -// 0xf4, 0x21, 0xe1, 0x0b, 0xc0, - - // '6' (0x36) 5x7, offset 90-95, at +1/-7 - 0xbe, 0x62, 0xb1, 0x0f, 0x00, - // in regular row-major format -// 0x74, 0x3d, 0x29, 0x49, 0xc0, - - // '7' (0x37) 5x7, offset 95-100, at +1/-7 - 0x81, 0x70, 0xe6, 0x00, 0x00, - // in regular row-major format -// 0xf0, 0x84, 0x42, 0x21, 0x00, - - // '8' (0x38) 5x7, offset 100-105, at +1/-7 - 0xf7, 0x64, 0xf2, 0x0e, 0x00, - // in regular row-major format -// 0xf4, 0xa4, 0xc9, 0x4b, 0xc0, - - // '9' (0x39) 5x7, offset 105-110, at +1/-7 - 0xdf, 0x68, 0xd4, 0x07, 0x00, - // in regular row-major format -// 0xe4, 0xa5, 0x2f, 0x0b, 0x80, - - // ':' (0x3a) 3x5, offset 110-112, at +0/-5 - 0x20, 0x02, - // in regular row-major format -// 0x40, 0x04, - - // ';' (0x3b) 2x6, offset 112-114, at +0/-5 - 0x21, 0x00, - // in regular row-major format -// 0x80, 0x20, - - // '<' (0x3c) 5x5, offset 114-118, at +1/-6 - 0x44, 0xa9, 0x08, 0x00, - // in regular row-major format -// 0x13, 0x20, 0xc1, 0x00, - - // '=' (0x3d) 5x3, offset 118-120, at +1/-5 - 0x6d, 0x0b, - // in regular row-major format -// 0xf0, 0x3c, - - // '>' (0x3e) 5x5, offset 120-124, at +1/-6 - 0x51, 0x29, 0x02, 0x00, - // in regular row-major format -// 0x83, 0x04, 0xc8, 0x00, - - // '?' (0x3f) 5x7, offset 124-129, at +0/-7 - 0x80, 0x68, 0xc2, 0x00, 0x00, - // in regular row-major format -// 0x60, 0x84, 0x44, 0x01, 0x00, - - // '@' (0x40) 8x8, offset 129-137, at +1/-7 - 0x7e, 0x99, 0xa5, 0xa5, 0xbd, 0x21, 0x3e, 0x00, - // in regular row-major format -// 0x7c, 0x82, 0xba, 0xca, 0xca, 0xbe, 0x80, 0x78, - - // 'A' (0x41) 7x7, offset 137-144, at +0/-7 - 0x60, 0x8c, 0xe5, 0x82, 0x01, 0x03, 0x00, - // in regular row-major format -// 0x10, 0x60, 0xc2, 0x47, 0x90, 0xa1, 0x00, - - // 'B' (0x42) 5x7, offset 144-149, at +1/-7 - 0xff, 0x64, 0xf2, 0x0e, 0x00, - // in regular row-major format -// 0xf4, 0xa5, 0xc9, 0x4b, 0xc0, - - // 'C' (0x43) 6x7, offset 149-155, at +1/-7 - 0xbe, 0x60, 0x30, 0x08, 0x00, 0x00, - // in regular row-major format -// 0x72, 0x08, 0x20, 0x82, 0x07, 0x00, - - // 'D' (0x44) 6x7, offset 155-161, at +1/-7 - 0xff, 0x60, 0x30, 0xe8, 0x03, 0x00, - // in regular row-major format -// 0xf2, 0x28, 0xa2, 0x8a, 0x2f, 0x00, - - // 'E' (0x45) 5x7, offset 161-166, at +1/-7 - 0xff, 0x64, 0x32, 0x09, 0x00, - // in regular row-major format -// 0xf4, 0x21, 0xe8, 0x43, 0xc0, - - // 'F' (0x46) 5x7, offset 166-171, at +1/-7 - 0xff, 0x44, 0x22, 0x01, 0x00, - // in regular row-major format -// 0xf4, 0x21, 0xe8, 0x42, 0x00, - - // 'G' (0x47) 6x7, offset 171-177, at +1/-7 - 0xbe, 0x60, 0x30, 0x99, 0x07, 0x00, - // in regular row-major format -// 0x7a, 0x08, 0x26, 0x8a, 0x27, 0x80, - - // 'H' (0x48) 6x7, offset 177-183, at +1/-7 - 0x7f, 0x04, 0x02, 0xf1, 0x07, 0x00, - // in regular row-major format -// 0x8a, 0x28, 0xbe, 0x8a, 0x28, 0x80, - - // 'I' (0x49) 2x7, offset 183-185, at +1/-7 - 0x7f, 0x00, - // in regular row-major format -// 0xaa, 0xa8, - - // 'J' (0x4a) 3x9, offset 185-189, at -1/-7 - 0x00, 0xff, 0x03, 0x00, - // in regular row-major format -// 0x49, 0x24, 0x92, 0xc0, - - // 'K' (0x4b) 6x7, offset 189-195, at +1/-7 - 0x7f, 0x04, 0x47, 0x14, 0x04, 0x00, - // in regular row-major format -// 0x8a, 0x4a, 0x38, 0xa2, 0x48, 0x80, - - // 'L' (0x4c) 5x7, offset 195-200, at +1/-7 - 0x7f, 0x20, 0x10, 0x08, 0x00, - // in regular row-major format -// 0x84, 0x21, 0x08, 0x43, 0xc0, - - // 'M' (0x4d) 8x7, offset 200-207, at +1/-7 - 0x7f, 0x02, 0x0e, 0x88, 0x23, 0xfc, 0x01, - // in regular row-major format -// 0x82, 0x82, 0xc6, 0xaa, 0xaa, 0xaa, 0x92, - - // 'N' (0x4e) 6x7, offset 207-213, at +1/-7 - 0x3f, 0x02, 0x02, 0xe6, 0x07, 0x00, - // in regular row-major format -// 0x82, 0x2c, 0xaa, 0x9a, 0x60, 0x80, - - // 'O' (0x4f) 7x7, offset 213-220, at +1/-7 - 0xbe, 0x60, 0x30, 0x18, 0xf4, 0x01, 0x00, - // in regular row-major format -// 0x79, 0x0a, 0x14, 0x28, 0x50, 0x9e, 0x00, - - // 'P' (0x50) 5x7, offset 220-225, at +1/-7 - 0xff, 0x48, 0xe4, 0x03, 0x00, - // in regular row-major format -// 0xf4, 0xa5, 0x2f, 0x42, 0x00, - - // 'Q' (0x51) 7x9, offset 225-233, at +1/-7 - 0x3e, 0x82, 0x04, 0x09, 0x12, 0xdc, 0x07, 0x00, - // in regular row-major format -// 0x79, 0x0a, 0x14, 0x28, 0x50, 0x9e, 0x04, 0x08, - - // 'R' (0x52) 6x7, offset 233-239, at +1/-7 - 0xff, 0x44, 0xe6, 0x05, 0x04, 0x00, - // in regular row-major format -// 0xf2, 0x49, 0x3c, 0xa2, 0x48, 0x80, - - // 'S' (0x53) 5x7, offset 239-244, at +1/-7 - 0xc7, 0x64, 0x12, 0x06, 0x00, - // in regular row-major format -// 0xe4, 0x20, 0xc1, 0x0b, 0x80, - - // 'T' (0x54) 6x7, offset 244-250, at +0/-7 - 0x81, 0xc0, 0x3f, 0x10, 0x00, 0x00, - // in regular row-major format -// 0xf8, 0x82, 0x08, 0x20, 0x82, 0x00, - - // 'U' (0x55) 6x7, offset 250-256, at +1/-7 - 0x3f, 0x20, 0x10, 0xf8, 0x03, 0x00, - // in regular row-major format -// 0x8a, 0x28, 0xa2, 0x8a, 0x27, 0x00, - - // 'V' (0x56) 7x7, offset 256-263, at +0/-7 - 0x03, 0x06, 0x1c, 0xc6, 0x18, 0x00, 0x00, - // in regular row-major format -// 0x85, 0x09, 0x22, 0x43, 0x06, 0x08, 0x00, - - // 'W' (0x57) 10x7, offset 263-272, at +0/-7 - 0x03, 0x0e, 0xd8, 0x33, 0xe0, 0x80, 0x39, 0x03, - 0x00, - // in regular row-major format -// 0x88, 0xa6, 0x25, 0x51, 0x54, 0x55, 0x08, 0x82, -// 0x20, - - // 'X' (0x58) 6x7, offset 272-278, at +0/-7 - 0x41, 0x1b, 0xc2, 0x16, 0x04, 0x00, - // in regular row-major format -// 0x89, 0x45, 0x08, 0x51, 0x48, 0x80, - - // 'Y' (0x59) 6x7, offset 278-284, at +0/-7 - 0x01, 0x03, 0xde, 0x10, 0x00, 0x00, - // in regular row-major format -// 0x89, 0x45, 0x08, 0x20, 0x82, 0x00, - - // 'Z' (0x5a) 7x7, offset 284-291, at +0/-7 - 0xc0, 0x70, 0xb6, 0x38, 0x04, 0x02, 0x00, - // in regular row-major format -// 0x78, 0x10, 0x41, 0x02, 0x08, 0x3f, 0x00, - - // '[' (0x5b) 3x9, offset 291-295, at +1/-7 - 0xff, 0x01, 0x00, 0x00, - // in regular row-major format -// 0x92, 0x49, 0x24, 0x80, - - // '\' (0x5c) 4x7, offset 295-299, at +0/-7 - 0x03, 0x0e, 0x18, 0x00, - // in regular row-major format -// 0x88, 0x44, 0x42, 0x20, - - // ']' (0x5d) 3x9, offset 299-303, at +0/-7 - 0x00, 0xfe, 0x03, 0x00, - // in regular row-major format -// 0x49, 0x24, 0x92, 0x40, - - // '^' (0x5e) 7x4, offset 303-307, at +0/-7 - 0x40, 0x32, 0x04, 0x00, - // in regular row-major format -// 0x10, 0x61, 0x20, 0x00, - - // '_' (0x5f) 5x1, offset 307-308, at +0/+1 - 0x0f, - // in regular row-major format -// 0xf0, - - // '`' (0x60) 3x2, offset 308-309, at +2/-8 - 0x09, - // in regular row-major format -// 0x88, - - // 'a' (0x61) 5x5, offset 309-313, at +0/-5 - 0xa8, 0xd6, 0x07, 0x00, - // in regular row-major format -// 0x70, 0x9d, 0x26, 0x00, - - // 'b' (0x62) 5x7, offset 313-318, at +1/-7 - 0x3e, 0x22, 0x91, 0x0f, 0x00, - // in regular row-major format -// 0x04, 0x3d, 0x29, 0x49, 0xc0, - - // 'c' (0x63) 5x5, offset 318-322, at +1/-5 - 0x3e, 0xc6, 0x08, 0x00, - // in regular row-major format -// 0x74, 0x21, 0x0f, 0x00, - - // 'd' (0x64) 5x7, offset 322-327, at +1/-7 - 0x7c, 0x22, 0xd1, 0x07, 0x00, - // in regular row-major format -// 0x00, 0xbd, 0x29, 0x4b, 0x80, - - // 'e' (0x65) 4x5, offset 327-330, at +1/-5 - 0xbf, 0x5e, 0x00, - // in regular row-major format -// 0xea, 0xe8, 0xe0, - - // 'f' (0x66) 5x7, offset 330-335, at +0/-7 - 0x84, 0x7f, 0x21, 0x00, 0x00, - // in regular row-major format -// 0x72, 0x38, 0x84, 0x21, 0x00, - - // 'g' (0x67) 6x7, offset 335-341, at +0/-5 - 0xa2, 0x6e, 0xf5, 0x1a, 0x02, 0x00, - // in regular row-major format -// 0x7a, 0x47, 0x10, 0x72, 0x27, 0x00, - - // 'h' (0x68) 5x7, offset 341-346, at +1/-7 - 0x3e, 0x02, 0x81, 0x07, 0x00, - // in regular row-major format -// 0x04, 0x3d, 0x29, 0x48, 0x00, - - // 'i' (0x69) 3x7, offset 346-349, at +0/-7 - 0x80, 0x1c, 0x00, - // in regular row-major format -// 0x40, 0x24, 0x80, - - // 'j' (0x6a) 3x9, offset 349-353, at -1/-7 - 0x00, 0xf3, 0x03, 0x00, - // in regular row-major format -// 0x40, 0x24, 0x92, 0xc0, - - // 'k' (0x6b) 5x7, offset 353-358, at +1/-7 - 0x3e, 0x08, 0x8a, 0x08, 0x00, - // in regular row-major format -// 0x04, 0x25, 0x4c, 0x50, 0x40, - - // 'l' (0x6c) 3x7, offset 358-361, at +0/-7 - 0x00, 0x1f, 0x00, - // in regular row-major format -// 0x09, 0x24, 0x80, - - // 'm' (0x6d) 8x5, offset 361-366, at +1/-5 - 0x2e, 0x04, 0x1f, 0xc2, 0x03, - // in regular row-major format -// 0x6e, 0x92, 0x92, 0x92, 0x10, - - // 'n' (0x6e) 5x5, offset 366-370, at +1/-5 - 0x2e, 0x84, 0x07, 0x00, - // in regular row-major format -// 0x74, 0xa5, 0x20, 0x00, - - // 'o' (0x6f) 5x5, offset 370-374, at +1/-5 - 0x3f, 0xc6, 0x0f, 0x00, - // in regular row-major format -// 0xf4, 0xa5, 0x2f, 0x00, - - // 'p' (0x70) 5x7, offset 374-379, at +1/-5 - 0xbe, 0x48, 0xe4, 0x03, 0x00, - // in regular row-major format -// 0x74, 0xa5, 0x2f, 0x40, 0x00, - - // 'q' (0x71) 5x7, offset 379-384, at +1/-5 - 0x9f, 0x48, 0xc4, 0x07, 0x00, - // in regular row-major format -// 0xe4, 0xa5, 0x2f, 0x08, 0x00, - - // 'r' (0x72) 4x5, offset 384-387, at +1/-5 - 0x2e, 0x04, 0x00, - // in regular row-major format -// 0x68, 0x88, 0x00, - - // 's' (0x73) 5x5, offset 387-391, at +0/-5 - 0xa2, 0xd6, 0x0c, 0x00, - // in regular row-major format -// 0x74, 0x18, 0x27, 0x00, - - // 't' (0x74) 4x6, offset 391-394, at +0/-6 - 0x82, 0x2f, 0x02, - // in regular row-major format -// 0x0e, 0x44, 0x46, - - // 'u' (0x75) 5x5, offset 394-398, at +1/-5 - 0x1e, 0x42, 0x07, 0x00, - // in regular row-major format -// 0x04, 0xa5, 0x2e, 0x00, - - // 'v' (0x76) 6x5, offset 398-402, at +0/-5 - 0x83, 0x41, 0x36, 0x00, - // in regular row-major format -// 0x8a, 0x25, 0x14, 0x20, - - // 'w' (0x77) 8x5, offset 402-407, at +0/-5 - 0x83, 0xb3, 0xc1, 0xf8, 0x00, - // in regular row-major format -// 0x92, 0x92, 0x6c, 0x6c, 0x44, - - // 'x' (0x78) 6x5, offset 407-411, at +0/-5 - 0x70, 0x91, 0x05, 0x01, - // in regular row-major format -// 0x51, 0x42, 0x14, 0x88, - - // 'y' (0x79) 6x7, offset 411-417, at +0/-5 - 0x43, 0x26, 0x8c, 0x31, 0x00, 0x00, - // in regular row-major format -// 0x8a, 0x25, 0x14, 0x20, 0x8c, 0x00, - - // 'z' (0x7a) 6x5, offset 417-421, at +0/-5 - 0x30, 0xd7, 0x19, 0x01, - // in regular row-major format -// 0x78, 0x42, 0x10, 0xf8, - - // '{' (0x7b) 5x9, offset 421-427, at +0/-7 - 0x00, 0xfc, 0x05, 0x04, 0x00, 0x00, - // in regular row-major format -// 0x22, 0x10, 0x84, 0x21, 0x08, 0x20, - - // '|' (0x7c) 2x9, offset 427-430, at +2/-7 - 0xff, 0x01, 0x00, - // in regular row-major format -// 0xaa, 0xaa, 0x80, -}; - -static const uint8_t OpenSansLight12_BCM[] = { - - // ' ' (0x20) 1x1, offset 0-1, at +0/+0 - 0x00, - // in regular row-major format -// 0x00, - - // '!' (0x21) 2x9, offset 1-4, at +1/-9 - 0x7f, 0x01, 0x00, - // in regular row-major format -// 0xaa, 0xa8, 0x80, - - // '"' (0x22) 3x3, offset 4-6, at +1/-9 - 0x1b, 0x00, - // in regular row-major format -// 0xd8, 0x00, - - // '#' (0x23) 9x9, offset 6-17, at +0/-9 - 0x20, 0x48, 0xf2, 0x3b, 0x41, 0xde, 0x47, 0x09, - 0x02, 0x00, 0x00, - // in regular row-major format -// 0x12, 0x0a, 0x1f, 0xc4, 0x82, 0x47, 0xf0, 0xa0, -// 0x50, 0x48, 0x00, - - // '$' (0x24) 6x10, offset 17-25, at +1/-9 - 0x0c, 0x49, 0xf4, 0xbf, 0x44, 0xe0, 0x00, 0x00, - // in regular row-major format -// 0x21, 0xca, 0x28, 0x70, 0xa2, 0x8a, 0xf0, 0x80, - - // '%' (0x25) 9x9, offset 25-36, at +1/-9 - 0x3f, 0x42, 0xfa, 0x83, 0x81, 0xc0, 0x5f, 0x42, - 0xfc, 0x00, 0x00, - // in regular row-major format -// 0xc2, 0x52, 0x29, 0x15, 0xeb, 0x57, 0xa8, 0x94, -// 0x4a, 0x43, 0x00, - - // '&' (0x26) 9x9, offset 36-47, at +1/-9 - 0xe0, 0x3e, 0x46, 0x4c, 0x69, 0x14, 0x10, 0x58, - 0x00, 0x00, 0x00, - // in regular row-major format -// 0x70, 0x24, 0x12, 0x0a, 0x06, 0x04, 0x92, 0x29, -// 0x08, 0x7a, 0x00, - - // ''' (0x27) 3x3, offset 47-49, at +0/-9 - 0x18, 0x00, - // in regular row-major format -// 0x48, 0x00, - - // '(' (0x28) 4x11, offset 49-55, at +0/-9 - 0xf8, 0x30, 0x58, 0x00, 0x01, 0x00, - // in regular row-major format -// 0x24, 0x48, 0x88, 0x88, 0x44, 0x20, - - // ')' (0x29) 4x11, offset 55-61, at +0/-9 - 0x01, 0x34, 0x18, 0x3e, 0x00, 0x00, - // in regular row-major format -// 0x84, 0x42, 0x22, 0x22, 0x44, 0x80, - - // '*' (0x2a) 6x5, offset 61-65, at +1/-9 - 0x84, 0x1f, 0x4e, 0x00, - // in regular row-major format -// 0x20, 0x8f, 0x94, 0x50, - - // '+' (0x2b) 6x7, offset 65-71, at +1/-8 - 0x08, 0xc4, 0x1f, 0x81, 0x00, 0x00, - // in regular row-major format -// 0x20, 0x82, 0x3e, 0x20, 0x82, 0x00, - - // ',' (0x2c) 3x3, offset 71-73, at +0/-1 - 0x1c, 0x00, - // in regular row-major format -// 0x4a, 0x00, - - // '-' (0x2d) 3x1, offset 73-74, at +1/-3 - 0x03, - // in regular row-major format -// 0xc0, - - // '.' (0x2e) 2x1, offset 74-75, at +1/-1 - 0x01, - // in regular row-major format -// 0x80, - - // '/' (0x2f) 5x9, offset 75-81, at +0/-9 - 0x80, 0xe1, 0x30, 0x18, 0x00, 0x00, - // in regular row-major format -// 0x10, 0x88, 0x44, 0x21, 0x10, 0x80, - - // '0' (0x30) 6x9, offset 81-88, at +1/-9 - 0xfe, 0x02, 0x06, 0x0c, 0xe8, 0x0f, 0x00, - // in regular row-major format -// 0x72, 0x28, 0xa2, 0x8a, 0x28, 0xa2, 0x70, - - // '1' (0x31) 4x9, offset 88-93, at +1/-9 - 0x00, 0x04, 0xfc, 0x07, 0x00, - // in regular row-major format -// 0x26, 0x22, 0x22, 0x22, 0x20, - - // '2' (0x32) 6x9, offset 93-100, at +1/-9 - 0x82, 0x83, 0x86, 0x8c, 0xe8, 0x10, 0x00, - // in regular row-major format -// 0x72, 0x20, 0x82, 0x10, 0x84, 0x20, 0xf8, - - // '3' (0x33) 6x9, offset 100-107, at +1/-9 - 0x02, 0x23, 0x46, 0x8c, 0xe8, 0x0e, 0x00, - // in regular row-major format -// 0x72, 0x20, 0x82, 0x70, 0x20, 0x82, 0xf0, - - // '4' (0x34) 8x9, offset 107-116, at +0/-9 - 0x40, 0xe0, 0x20, 0x31, 0x12, 0xc4, 0x3f, 0x10, - 0x00, - // in regular row-major format -// 0x08, 0x14, 0x14, 0x24, 0x44, 0x44, 0xfe, 0x04, -// 0x04, - - // '5' (0x35) 6x9, offset 116-123, at +1/-9 - 0x1f, 0x23, 0x46, 0x8c, 0x18, 0x0e, 0x00, - // in regular row-major format -// 0xfa, 0x08, 0x20, 0xf0, 0x20, 0x82, 0xf0, - - // '6' (0x36) 6x9, offset 123-130, at +1/-9 - 0xfc, 0x14, 0x26, 0x4c, 0x18, 0x0f, 0x00, - // in regular row-major format -// 0x39, 0x08, 0x3c, 0x8a, 0x28, 0xa2, 0x70, - - // '7' (0x37) 6x9, offset 130-137, at +1/-9 - 0x01, 0x02, 0x86, 0xcb, 0x70, 0x00, 0x00, - // in regular row-major format -// 0xf8, 0x20, 0x84, 0x10, 0x82, 0x08, 0x40, - - // '8' (0x38) 6x9, offset 137-144, at +1/-9 - 0xee, 0x22, 0x46, 0x8c, 0xe8, 0x0e, 0x00, - // in regular row-major format -// 0x72, 0x28, 0xa2, 0x72, 0x28, 0xa2, 0x70, - - // '9' (0x39) 6x9, offset 144-151, at +1/-9 - 0x1e, 0x43, 0x86, 0x0c, 0xe5, 0x07, 0x00, - // in regular row-major format -// 0x72, 0x28, 0xa2, 0x89, 0xe0, 0x84, 0xe0, - - // ':' (0x3a) 2x6, offset 151-153, at +1/-6 - 0x21, 0x00, - // in regular row-major format -// 0x80, 0x20, - - // ';' (0x3b) 3x8, offset 153-156, at +0/-6 - 0x00, 0x61, 0x00, - // in regular row-major format -// 0x40, 0x00, 0x90, - - // '<' (0x3c) 6x6, offset 156-161, at +1/-8 - 0x08, 0x23, 0x49, 0x21, 0x00, - // in regular row-major format -// 0x08, 0xc4, 0x30, 0x30, 0x20, - - // '=' (0x3d) 6x3, offset 161-164, at +1/-6 - 0x6d, 0x5b, 0x00, - // in regular row-major format -// 0xf8, 0x0f, 0x80, - - // '>' (0x3e) 6x6, offset 164-169, at +1/-8 - 0xa1, 0x24, 0x31, 0x08, 0x00, - // in regular row-major format -// 0x81, 0x81, 0x06, 0x62, 0x00, - - // '?' (0x3f) 6x9, offset 169-176, at +0/-9 - 0x00, 0x02, 0x86, 0x88, 0xe0, 0x00, 0x00, - // in regular row-major format -// 0x70, 0x20, 0x82, 0x10, 0x80, 0x00, 0x40, - - // '@' (0x40) 10x10, offset 176-189, at +1/-9 - 0xfc, 0x09, 0x94, 0x67, 0xa1, 0x85, 0x16, 0xda, - 0xaf, 0x20, 0x7c, 0x00, 0x00, - // in regular row-major format -// 0x3e, 0x10, 0x49, 0xea, 0x8a, 0xa2, 0xa8, 0xaa, -// 0x2a, 0x7c, 0xc0, 0x0f, 0x80, - - // 'A' (0x41) 8x9, offset 189-198, at +0/-9 - 0x80, 0xe1, 0xb0, 0x18, 0xc1, 0x02, 0x0e, 0x60, - 0x00, - // in regular row-major format -// 0x10, 0x10, 0x28, 0x28, 0x44, 0x7c, 0x44, 0x82, -// 0x82, - - // 'B' (0x42) 7x9, offset 198-206, at +1/-9 - 0xff, 0x23, 0x46, 0x8c, 0x18, 0xd1, 0x1d, 0x00, - // in regular row-major format -// 0xf9, 0x0a, 0x14, 0x2f, 0x90, 0xa1, 0x42, 0xf8, - - // 'C' (0x43) 7x9, offset 206-214, at +1/-9 - 0xfc, 0x04, 0x07, 0x0c, 0x18, 0x10, 0x00, 0x00, - // in regular row-major format -// 0x38, 0x82, 0x04, 0x08, 0x10, 0x20, 0x60, 0x78, - - // 'D' (0x44) 7x9, offset 214-222, at +1/-9 - 0xff, 0x03, 0x06, 0x0c, 0x28, 0xc8, 0x0f, 0x00, - // in regular row-major format -// 0xf1, 0x1a, 0x14, 0x28, 0x50, 0xa1, 0x44, 0xf0, - - // 'E' (0x45) 6x9, offset 222-229, at +1/-9 - 0xff, 0x23, 0x46, 0x8c, 0x18, 0x11, 0x00, - // in regular row-major format -// 0xfa, 0x08, 0x20, 0xfa, 0x08, 0x20, 0xf8, - - // 'F' (0x46) 6x9, offset 229-236, at +1/-9 - 0xff, 0x23, 0x44, 0x88, 0x10, 0x01, 0x00, - // in regular row-major format -// 0xfa, 0x08, 0x20, 0xfa, 0x08, 0x20, 0x80, - - // 'G' (0x47) 8x9, offset 236-245, at +1/-9 - 0x7c, 0x04, 0x05, 0x0c, 0x18, 0x31, 0x22, 0x7c, - 0x00, - // in regular row-major format -// 0x3c, 0x40, 0x80, 0x80, 0x8e, 0x82, 0x82, 0x42, -// 0x3e, - - // 'H' (0x48) 8x9, offset 245-254, at +1/-9 - 0xff, 0x21, 0x40, 0x80, 0x00, 0x01, 0xc2, 0x7f, - 0x00, - // in regular row-major format -// 0x82, 0x82, 0x82, 0x82, 0xfe, 0x82, 0x82, 0x82, -// 0x82, - - // 'I' (0x49) 2x9, offset 254-257, at +1/-9 - 0xff, 0x01, 0x00, - // in regular row-major format -// 0xaa, 0xaa, 0x80, - - // 'J' (0x4a) 4x11, offset 257-263, at -1/-9 - 0x00, 0x04, 0xe0, 0xff, 0x00, 0x00, - // in regular row-major format -// 0x22, 0x22, 0x22, 0x22, 0x22, 0xc0, - - // 'K' (0x4b) 7x9, offset 263-271, at +1/-9 - 0xff, 0x21, 0x60, 0x20, 0x23, 0x28, 0x20, 0x00, - // in regular row-major format -// 0x85, 0x12, 0x45, 0x0e, 0x12, 0x24, 0x44, 0x84, - - // 'L' (0x4c) 6x9, offset 271-278, at +1/-9 - 0xff, 0x01, 0x02, 0x04, 0x08, 0x10, 0x00, - // in regular row-major format -// 0x82, 0x08, 0x20, 0x82, 0x08, 0x20, 0xf8, - - // 'M' (0x4d) 9x9, offset 278-289, at +1/-9 - 0xff, 0x0d, 0xe0, 0x00, 0x0e, 0x0c, 0x87, 0x81, - 0xff, 0x00, 0x00, - // in regular row-major format -// 0x81, 0x61, 0xb0, 0xd4, 0xaa, 0x55, 0x2a, 0x65, -// 0x32, 0x91, 0x00, - - // 'N' (0x4e) 8x9, offset 289-298, at +1/-9 - 0xff, 0x05, 0x30, 0x80, 0x00, 0x06, 0xd0, 0x7f, - 0x00, - // in regular row-major format -// 0x82, 0xc2, 0xa2, 0xa2, 0x92, 0x8a, 0x8a, 0x86, -// 0x82, - - // 'O' (0x4f) 8x9, offset 298-307, at +1/-9 - 0x7c, 0x04, 0x05, 0x0c, 0x18, 0x50, 0x10, 0x1f, - 0x00, - // in regular row-major format -// 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0x82, 0x44, -// 0x38, - - // 'P' (0x50) 6x9, offset 307-314, at +1/-9 - 0xff, 0x43, 0x84, 0x08, 0xe1, 0x01, 0x00, - // in regular row-major format -// 0xf2, 0x28, 0xa2, 0x8b, 0xc8, 0x20, 0x80, - - // 'Q' (0x51) 8x11, offset 314-325, at +1/-9 - 0x7c, 0x10, 0x44, 0x40, 0x02, 0x12, 0x30, 0x41, - 0xf2, 0x01, 0x00, - // in regular row-major format -// 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0x82, 0x44, -// 0x38, 0x08, 0x04, - - // 'R' (0x52) 7x9, offset 325-333, at +1/-9 - 0xff, 0x23, 0x44, 0x88, 0xe1, 0x0c, 0x20, 0x00, - // in regular row-major format -// 0xf1, 0x12, 0x24, 0x4f, 0x12, 0x22, 0x44, 0x84, - - // 'S' (0x53) 6x9, offset 333-340, at +1/-9 - 0x0e, 0x23, 0x46, 0x8c, 0x18, 0x0e, 0x00, - // in regular row-major format -// 0x7a, 0x08, 0x20, 0x70, 0x20, 0x82, 0xf0, - - // 'T' (0x54) 7x9, offset 340-348, at +0/-9 - 0x01, 0x02, 0x04, 0xf8, 0x1f, 0x20, 0x00, 0x00, - // in regular row-major format -// 0xfc, 0x20, 0x40, 0x81, 0x02, 0x04, 0x08, 0x10, - - // 'U' (0x55) 8x9, offset 348-357, at +1/-9 - 0x7f, 0x00, 0x03, 0x04, 0x08, 0x10, 0xd0, 0x1f, - 0x00, - // in regular row-major format -// 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x44, -// 0x78, - - // 'V' (0x56) 8x9, offset 357-366, at +0/-9 - 0x03, 0x38, 0x80, 0x03, 0x08, 0x8e, 0xc3, 0x00, - 0x00, - // in regular row-major format -// 0x82, 0x82, 0x44, 0x44, 0x44, 0x28, 0x28, 0x28, -// 0x10, - - // 'W' (0x57) 12x9, offset 366-380, at +0/-9 - 0x01, 0x3c, 0x80, 0x07, 0xe7, 0x61, 0x00, 0x07, - 0x70, 0xe0, 0x3d, 0x04, 0x00, 0x00, - // in regular row-major format -// 0x84, 0x24, 0xc4, 0x4a, 0x44, 0xa4, 0x4a, 0x43, -// 0x18, 0x31, 0x83, 0x18, 0x20, 0x80, - - // 'X' (0x58) 7x9, offset 380-388, at +0/-9 - 0x01, 0x8d, 0xa1, 0xc0, 0x61, 0x2c, 0x20, 0x00, - // in regular row-major format -// 0x84, 0x91, 0x21, 0x81, 0x06, 0x12, 0x24, 0x84, - - // 'Y' (0x59) 7x9, offset 388-396, at +0/-9 - 0x01, 0x0c, 0x60, 0x80, 0xef, 0x20, 0x00, 0x00, - // in regular row-major format -// 0x84, 0x91, 0x21, 0x43, 0x02, 0x04, 0x08, 0x10, - - // 'Z' (0x5a) 8x9, offset 396-405, at +0/-9 - 0x00, 0x03, 0x87, 0x8d, 0xd8, 0x70, 0x20, 0x40, - 0x00, - // in regular row-major format -// 0x7c, 0x04, 0x08, 0x08, 0x10, 0x20, 0x20, 0x40, -// 0xfe, - - // '[' (0x5b) 4x11, offset 405-411, at +1/-9 - 0xff, 0x0f, 0x60, 0x00, 0x01, 0x00, - // in regular row-major format -// 0xe8, 0x88, 0x88, 0x88, 0x88, 0xe0, - - // '\' (0x5c) 5x9, offset 411-417, at +0/-9 - 0x03, 0x38, 0x80, 0x01, 0x0c, 0x00, - // in regular row-major format -// 0x84, 0x10, 0x84, 0x10, 0x82, 0x10, - - // ']' (0x5d) 4x11, offset 417-423, at +0/-9 - 0x01, 0x0c, 0xe0, 0xff, 0x01, 0x00, - // in regular row-major format -// 0xe2, 0x22, 0x22, 0x22, 0x22, 0xe0, - - // '^' (0x5e) 6x5, offset 423-427, at +1/-9 - 0xd8, 0x04, 0x83, 0x01, - // in regular row-major format -// 0x21, 0x45, 0x22, 0x88, - - // '_' (0x5f) 6x1, offset 427-428, at +0/+1 - 0x1f, - // in regular row-major format -// 0xf8, - - // '`' (0x60) 4x2, offset 428-429, at +2/-9 - 0x0c, - // in regular row-major format -// 0x44, - - // 'a' (0x61) 5x6, offset 429-433, at +1/-6 - 0x7c, 0x59, 0xfe, 0x00, - // in regular row-major format -// 0x70, 0xbd, 0x29, 0x78, - - // 'b' (0x62) 6x9, offset 433-440, at +1/-9 - 0xff, 0x10, 0x22, 0x44, 0x08, 0x0f, 0x00, - // in regular row-major format -// 0x82, 0x08, 0x3c, 0x8a, 0x28, 0xa2, 0x70, - - // 'c' (0x63) 6x6, offset 440-445, at +1/-6 - 0x5e, 0x18, 0x86, 0x00, 0x00, - // in regular row-major format -// 0x72, 0x08, 0x20, 0x81, 0xc0, - - // 'd' (0x64) 6x9, offset 445-452, at +1/-9 - 0xf0, 0x10, 0x22, 0x44, 0xf8, 0x1f, 0x00, - // in regular row-major format -// 0x08, 0x20, 0x9e, 0x8a, 0x28, 0xa2, 0x78, - - // 'e' (0x65) 6x6, offset 452-457, at +1/-6 - 0x5e, 0x59, 0x96, 0x26, 0x00, - // in regular row-major format -// 0x72, 0x2f, 0xa0, 0x81, 0xe0, - - // 'f' (0x66) 5x9, offset 457-463, at +0/-9 - 0x08, 0xfc, 0x27, 0x48, 0x00, 0x00, - // in regular row-major format -// 0x32, 0x11, 0xe4, 0x21, 0x08, 0x40, - - // 'g' (0x67) 7x9, offset 463-471, at +0/-6 - 0xc0, 0x7e, 0xa6, 0x4c, 0x79, 0x32, 0x18, 0x00, - // in regular row-major format -// 0x7c, 0x91, 0x23, 0x84, 0x0f, 0x21, 0x42, 0x78, - - // 'h' (0x68) 6x9, offset 471-478, at +1/-9 - 0xff, 0x11, 0x20, 0x40, 0x00, 0x1f, 0x00, - // in regular row-major format -// 0x82, 0x08, 0x3c, 0x8a, 0x28, 0xa2, 0x88, - - // 'i' (0x69) 2x9, offset 478-481, at +1/-9 - 0xf9, 0x01, 0x00, - // in regular row-major format -// 0x82, 0xaa, 0x80, - - // 'j' (0x6a) 3x12, offset 481-486, at +0/-9 - 0x00, 0x98, 0x7f, 0x00, 0x00, - // in regular row-major format -// 0x40, 0x24, 0x92, 0x49, 0x40, - - // 'k' (0x6b) 6x9, offset 486-493, at +1/-9 - 0xff, 0x41, 0x40, 0x41, 0x04, 0x10, 0x00, - // in regular row-major format -// 0x82, 0x08, 0x24, 0xa3, 0x0a, 0x24, 0x88, - - // 'l' (0x6c) 2x9, offset 493-496, at +1/-9 - 0xff, 0x01, 0x00, - // in regular row-major format -// 0xaa, 0xaa, 0x80, - - // 'm' (0x6d) 10x6, offset 496-504, at +1/-6 - 0x7f, 0x10, 0x04, 0x7e, 0x10, 0x04, 0x3e, 0x00, - // in regular row-major format -// 0xf7, 0x22, 0x28, 0x8a, 0x22, 0x88, 0xa2, 0x20, - - // 'n' (0x6e) 6x6, offset 504-509, at +1/-6 - 0x7f, 0x10, 0x04, 0x3e, 0x00, - // in regular row-major format -// 0xf2, 0x28, 0xa2, 0x8a, 0x20, - - // 'o' (0x6f) 6x6, offset 509-514, at +1/-6 - 0x5e, 0x18, 0x86, 0x1e, 0x00, - // in regular row-major format -// 0x72, 0x28, 0xa2, 0x89, 0xc0, - - // 'p' (0x70) 6x9, offset 514-521, at +1/-6 - 0xff, 0x43, 0x84, 0x08, 0xe1, 0x01, 0x00, - // in regular row-major format -// 0xf2, 0x28, 0xa2, 0x8b, 0xc8, 0x20, 0x80, - - // 'q' (0x71) 6x9, offset 521-528, at +1/-6 - 0x1e, 0x42, 0x84, 0x08, 0xf1, 0x1f, 0x00, - // in regular row-major format -// 0x7a, 0x28, 0xa2, 0x89, 0xe0, 0x82, 0x08, - - // 'r' (0x72) 5x6, offset 528-532, at +1/-6 - 0x7f, 0x10, 0x04, 0x00, - // in regular row-major format -// 0xf4, 0x21, 0x08, 0x40, - - // 's' (0x73) 5x6, offset 532-536, at +1/-6 - 0x67, 0x99, 0xe6, 0x00, - // in regular row-major format -// 0xf4, 0x30, 0x61, 0x78, - - // 't' (0x74) 5x8, offset 536-541, at +0/-8 - 0x04, 0xff, 0x84, 0x84, 0x00, - // in regular row-major format -// 0x42, 0x3c, 0x84, 0x21, 0x0e, - - // 'u' (0x75) 6x6, offset 541-546, at +1/-6 - 0x1f, 0x08, 0x82, 0x3f, 0x00, - // in regular row-major format -// 0x8a, 0x28, 0xa2, 0x89, 0xe0, - - // 'v' (0x76) 7x6, offset 546-552, at +0/-6 - 0x03, 0x03, 0xc3, 0xcc, 0x00, 0x00, - // in regular row-major format -// 0x85, 0x09, 0x22, 0x43, 0x06, 0x00, - - // 'w' (0x77) 10x6, offset 552-560, at +0/-6 - 0x03, 0x07, 0x33, 0x03, 0x03, 0x33, 0x03, 0x00, - // in regular row-major format -// 0x88, 0xa2, 0x25, 0x51, 0x54, 0x62, 0x08, 0x80, - - // 'x' (0x78) 7x6, offset 560-566, at +0/-6 - 0xc0, 0xcc, 0x30, 0x33, 0x00, 0x00, - // in regular row-major format -// 0x48, 0x90, 0xc1, 0x84, 0x89, 0x00, - - // 'y' (0x79) 7x9, offset 566-574, at +0/-6 - 0x03, 0x19, 0xc2, 0x83, 0xc1, 0x60, 0x00, 0x00, - // in regular row-major format -// 0x85, 0x09, 0x22, 0x43, 0x06, 0x08, 0x10, 0xc0, - - // 'z' (0x7a) 5x6, offset 574-578, at +1/-6 - 0x71, 0x5a, 0x8e, 0x00, - // in regular row-major format -// 0xf0, 0x88, 0x88, 0x78, - - // '{' (0x7b) 5x11, offset 578-585, at +0/-9 - 0x00, 0xf0, 0x5f, 0x00, 0x03, 0x08, 0x00, - // in regular row-major format -// 0x32, 0x10, 0x84, 0x21, 0x08, 0x42, 0x0c, - - // '|' (0x7c) 2x12, offset 585-588, at +3/-9 - 0xff, 0x0f, 0x00, - // in regular row-major format -// 0xaa, 0xaa, 0xaa, -}; - -static const uint8_t OpenSansLight14_BCM[] = { - - // ' ' (0x20) 1x1, offset 0-1, at +0/+0 - 0x00, - // in regular row-major format -// 0x00, - - // '!' (0x21) 2x10, offset 1-4, at +1/-10 - 0x7f, 0x02, 0x00, - // in regular row-major format -// 0xaa, 0xa8, 0x20, - - // '"' (0x22) 4x4, offset 4-6, at +1/-10 - 0x0f, 0x0f, - // in regular row-major format -// 0xaa, 0xaa, - - // '#' (0x23) 10x10, offset 6-19, at +0/-10 - 0x40, 0x20, 0x81, 0xfe, 0x17, 0x48, 0xa0, 0xff, - 0x05, 0x12, 0x08, 0x00, 0x00, - // in regular row-major format -// 0x12, 0x04, 0x81, 0x21, 0xfe, 0x12, 0x09, 0x0f, -// 0xf0, 0x90, 0x24, 0x09, 0x00, - - // '$' (0x24) 7x12, offset 19-30, at +1/-11 - 0x1c, 0x20, 0x43, 0xff, 0x2f, 0x42, 0x42, 0x06, - 0x18, 0x00, 0x00, - // in regular row-major format -// 0x20, 0xf2, 0x85, 0x0e, 0x0e, 0x0a, 0x12, 0x24, -// 0x51, 0xe1, 0x00, - - // '%' (0x25) 10x10, offset 30-43, at +1/-10 - 0x3f, 0x84, 0x10, 0xb2, 0x37, 0x30, 0xb0, 0x37, - 0x21, 0x84, 0xf0, 0x03, 0x00, - // in regular row-major format -// 0xe2, 0x24, 0x89, 0x42, 0x50, 0x9b, 0xbb, 0x21, -// 0x48, 0x52, 0x24, 0x88, 0xe0, - - // '&' (0x26) 10x10, offset 43-56, at +1/-10 - 0xc0, 0xb9, 0x18, 0x61, 0x8c, 0x49, 0x1a, 0x06, - 0x18, 0x90, 0x00, 0x00, 0x00, - // in regular row-major format -// 0x38, 0x11, 0x04, 0x41, 0x20, 0x30, 0x14, 0x08, -// 0x92, 0x18, 0x86, 0x1e, 0x40, - - // ''' (0x27) 2x4, offset 56-57, at +1/-10 - 0x0f, - // in regular row-major format -// 0xaa, - - // '(' (0x28) 4x12, offset 57-63, at +1/-10 - 0xfc, 0x33, 0xc0, 0x00, 0x00, 0x00, - // in regular row-major format -// 0x44, 0x88, 0x88, 0x88, 0x88, 0x44, - - // ')' (0x29) 4x12, offset 63-69, at +0/-10 - 0x00, 0x30, 0xc0, 0xfc, 0x03, 0x00, - // in regular row-major format -// 0x44, 0x22, 0x22, 0x22, 0x22, 0x44, - - // '*' (0x2a) 7x6, offset 69-75, at +1/-11 - 0x04, 0xfd, 0x60, 0x24, 0x01, 0x00, - // in regular row-major format -// 0x20, 0x43, 0xb1, 0x85, 0x09, 0x00, - - // '+' (0x2b) 7x7, offset 75-82, at +1/-9 - 0x08, 0x84, 0x0f, 0x81, 0x40, 0x00, 0x00, - // in regular row-major format -// 0x00, 0x40, 0x87, 0xe2, 0x04, 0x00, 0x00, - - // ',' (0x2c) 3x4, offset 82-84, at +0/-2 - 0x78, 0x00, - // in regular row-major format -// 0x49, 0x40, - - // '-' (0x2d) 4x1, offset 84-85, at +1/-4 - 0x07, - // in regular row-major format -// 0xe0, - - // '.' (0x2e) 2x1, offset 85-86, at +1/-1 - 0x01, - // in regular row-major format -// 0x80, - - // '/' (0x2f) 6x10, offset 86-94, at +0/-10 - 0x00, 0x02, 0x07, 0x83, 0x03, 0x01, 0x00, 0x00, - // in regular row-major format -// 0x08, 0x41, 0x04, 0x20, 0x84, 0x10, 0x42, 0x00, - - // '0' (0x30) 7x10, offset 94-103, at +1/-10 - 0xfe, 0x0d, 0x1c, 0x60, 0x80, 0x03, 0xfb, 0x07, - 0x00, - // in regular row-major format -// 0x79, 0x9a, 0x14, 0x28, 0x50, 0xa1, 0x42, 0xcc, -// 0xf0, - - // '1' (0x31) 5x10, offset 103-110, at +1/-10 - 0x00, 0x08, 0x10, 0xc0, 0xff, 0x00, 0x00, - // in regular row-major format -// 0x32, 0x84, 0x21, 0x08, 0x42, 0x10, 0x80, - - // '2' (0x32) 7x10, offset 110-119, at +1/-10 - 0x02, 0x07, 0x1a, 0x64, 0x88, 0x13, 0x32, 0x08, - 0x00, - // in regular row-major format -// 0x79, 0x10, 0x10, 0x20, 0x82, 0x08, 0x20, 0x81, -// 0xf8, - - // '3' (0x33) 7x10, offset 119-128, at +1/-10 - 0x02, 0x46, 0x18, 0x61, 0x84, 0x29, 0x9b, 0x07, - 0x00, - // in regular row-major format -// 0x79, 0x08, 0x10, 0x47, 0x01, 0x81, 0x02, 0x0d, -// 0xf0, - - // '4' (0x34) 9x10, offset 128-140, at +0/-10 - 0x40, 0x80, 0x81, 0x05, 0x11, 0x42, 0xfc, 0x0f, - 0x04, 0x10, 0x00, 0x00, - // in regular row-major format -// 0x04, 0x06, 0x05, 0x04, 0x82, 0x42, 0x23, 0xfc, -// 0x08, 0x04, 0x02, 0x00, - - // '5' (0x35) 7x10, offset 140-149, at +1/-10 - 0x1e, 0x46, 0x18, 0x61, 0x84, 0x11, 0x82, 0x07, - 0x00, - // in regular row-major format -// 0x79, 0x02, 0x04, 0x0f, 0x80, 0x81, 0x02, 0x05, -// 0xf0, - - // '6' (0x36) 7x10, offset 149-158, at +1/-10 - 0xfc, 0x48, 0x1c, 0x61, 0x84, 0x11, 0x82, 0x07, - 0x00, - // in regular row-major format -// 0x38, 0x82, 0x04, 0x0f, 0x90, 0xa1, 0x42, 0x44, -// 0xf0, - - // '7' (0x37) 7x10, offset 158-167, at +1/-10 - 0x01, 0x04, 0x18, 0x58, 0x18, 0x19, 0x1c, 0x00, - 0x00, - // in regular row-major format -// 0xfc, 0x08, 0x10, 0x40, 0x82, 0x04, 0x10, 0x20, -// 0x80, - - // '8' (0x38) 7x10, offset 167-176, at +1/-10 - 0xc6, 0xa5, 0x18, 0x61, 0x84, 0x29, 0x1a, 0x07, - 0x00, - // in regular row-major format -// 0x79, 0x0a, 0x12, 0x43, 0x09, 0x21, 0x42, 0x84, -// 0xf0, - - // '9' (0x39) 7x10, offset 176-185, at +1/-10 - 0x1e, 0x86, 0x18, 0x62, 0x88, 0x23, 0xf1, 0x03, - 0x00, - // in regular row-major format -// 0x79, 0x12, 0x14, 0x28, 0x4f, 0x81, 0x02, 0x09, -// 0xe0, - - // ':' (0x3a) 2x8, offset 185-187, at +1/-8 - 0x81, 0x00, - // in regular row-major format -// 0x80, 0x02, - - // ';' (0x3b) 3x10, offset 187-191, at +0/-8 - 0x00, 0x04, 0x07, 0x00, - // in regular row-major format -// 0x40, 0x00, 0x12, 0x40, - - // '<' (0x3c) 7x7, offset 191-198, at +1/-9 - 0x08, 0x0a, 0x45, 0x24, 0x0a, 0x02, 0x00, - // in regular row-major format -// 0x04, 0x31, 0x84, 0x06, 0x03, 0x01, 0x00, - - // '=' (0x3d) 7x3, offset 198-201, at +1/-7 - 0x6d, 0xdb, 0x02, - // in regular row-major format -// 0xfc, 0x03, 0xf0, - - // '>' (0x3e) 7x7, offset 201-208, at +1/-9 - 0x41, 0x91, 0x88, 0x42, 0x41, 0x00, 0x00, - // in regular row-major format -// 0x80, 0xc0, 0x60, 0x21, 0x8c, 0x20, 0x00, - - // '?' (0x3f) 6x10, offset 208-216, at +0/-10 - 0x00, 0x04, 0x10, 0x66, 0x04, 0x0f, 0x00, 0x00, - // in regular row-major format -// 0x78, 0x20, 0x82, 0x10, 0x82, 0x00, 0x00, 0x80, - - // '@' (0x40) 11x11, offset 216-232, at +1/-10 - 0xf8, 0x31, 0x90, 0x18, 0x23, 0x99, 0xc8, 0x44, - 0xe6, 0x31, 0x10, 0x82, 0xe0, 0x03, 0x00, 0x00, - // in regular row-major format -// 0x1f, 0x0c, 0x11, 0x01, 0x47, 0x29, 0x25, 0x44, -// 0xa8, 0x94, 0xec, 0x80, 0x08, 0x00, 0xf8, 0x00, - - // 'A' (0x41) 9x10, offset 232-244, at +0/-10 - 0x00, 0x03, 0x83, 0x87, 0x11, 0x47, 0xe0, 0x01, - 0x0c, 0xc0, 0x00, 0x00, - // in regular row-major format -// 0x08, 0x0c, 0x06, 0x04, 0x82, 0x41, 0x21, 0xf8, -// 0x84, 0x81, 0x40, 0x80, - - // 'B' (0x42) 8x10, offset 244-254, at +1/-10 - 0xff, 0x47, 0x18, 0x61, 0x84, 0x11, 0xa6, 0xe8, - 0x1e, 0x00, - // in regular row-major format -// 0xfc, 0x82, 0x82, 0x86, 0xf8, 0x86, 0x82, 0x82, -// 0x82, 0xfc, - - // 'C' (0x43) 9x10, offset 254-266, at +1/-10 - 0xfc, 0x08, 0x34, 0x60, 0x80, 0x01, 0x06, 0x18, - 0x20, 0x00, 0x00, 0x00, - // in regular row-major format -// 0x3e, 0x30, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, -// 0x00, 0x40, 0x1f, 0x00, - - // 'D' (0x44) 9x10, offset 266-278, at +1/-10 - 0xff, 0x07, 0x18, 0x60, 0x80, 0x01, 0x06, 0x2c, - 0x10, 0x3f, 0x00, 0x00, - // in regular row-major format -// 0xfc, 0x41, 0x20, 0x50, 0x28, 0x14, 0x0a, 0x05, -// 0x02, 0x86, 0x7e, 0x00, - - // 'E' (0x45) 7x10, offset 278-287, at +1/-10 - 0xff, 0x47, 0x18, 0x61, 0x84, 0x11, 0x46, 0x08, - 0x00, - // in regular row-major format -// 0xfd, 0x02, 0x04, 0x0f, 0xd0, 0x20, 0x40, 0x81, -// 0xf8, - - // 'F' (0x46) 7x10, offset 287-296, at +1/-10 - 0xff, 0x47, 0x10, 0x41, 0x04, 0x11, 0x44, 0x00, - 0x00, - // in regular row-major format -// 0xfd, 0x02, 0x04, 0x0f, 0xd0, 0x20, 0x40, 0x81, -// 0x00, - - // 'G' (0x47) 9x10, offset 296-308, at +1/-10 - 0xfc, 0x08, 0x24, 0x60, 0x80, 0x21, 0x86, 0x18, - 0xa2, 0xf8, 0x00, 0x00, - // in regular row-major format -// 0x1e, 0x30, 0xa0, 0x10, 0x08, 0x04, 0x7a, 0x05, -// 0x02, 0x41, 0x1f, 0x80, - - // 'H' (0x48) 9x10, offset 308-320, at +1/-10 - 0xff, 0x43, 0x00, 0x01, 0x04, 0x10, 0x40, 0x00, - 0xc1, 0xff, 0x00, 0x00, - // in regular row-major format -// 0x81, 0x40, 0xa0, 0x50, 0x2f, 0xf4, 0x0a, 0x05, -// 0x02, 0x81, 0x40, 0x80, - - // 'I' (0x49) 3x10, offset 320-324, at +1/-10 - 0xff, 0x03, 0x00, 0x00, - // in regular row-major format -// 0x92, 0x49, 0x24, 0x90, - - // 'J' (0x4a) 4x13, offset 324-331, at -1/-10 - 0x00, 0x10, 0x00, 0xfe, 0x3f, 0x00, 0x00, - // in regular row-major format -// 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0xc0, - - // 'K' (0x4b) 8x10, offset 331-341, at +1/-10 - 0xff, 0x83, 0x00, 0x01, 0x0a, 0xc4, 0x0c, 0x04, - 0x20, 0x00, - // in regular row-major format -// 0x84, 0x84, 0x88, 0x90, 0xa0, 0xd0, 0x88, 0x88, -// 0x84, 0x82, - - // 'L' (0x4c) 7x10, offset 341-350, at +1/-10 - 0xff, 0x03, 0x08, 0x20, 0x80, 0x00, 0x02, 0x08, - 0x00, - // in regular row-major format -// 0x81, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x81, -// 0xf8, - - // 'M' (0x4d) 11x10, offset 350-364, at +1/-10 - 0xff, 0x0f, 0xc0, 0x01, 0x18, 0x80, 0x03, 0x06, - 0x06, 0x07, 0x03, 0xfc, 0x0f, 0x00, - // in regular row-major format -// 0xc0, 0xd8, 0x1a, 0x85, 0x50, 0xaa, 0x15, 0x24, -// 0xa4, 0x94, 0x62, 0x8c, 0x51, 0x08, - - // 'N' (0x4e) 9x10, offset 364-376, at +1/-10 - 0xff, 0x0b, 0x40, 0x00, 0x06, 0x60, 0x00, 0x02, - 0xd0, 0xff, 0x00, 0x00, - // in regular row-major format -// 0x81, 0x60, 0xa8, 0x52, 0x29, 0x14, 0x4a, 0x25, -// 0x0a, 0x83, 0x40, 0x80, - - // 'O' (0x4f) 10x10, offset 376-389, at +1/-10 - 0xfc, 0x08, 0x14, 0x60, 0x80, 0x01, 0x06, 0x18, - 0xa0, 0x40, 0xfc, 0x00, 0x00, - // in regular row-major format -// 0x3e, 0x10, 0x48, 0x0a, 0x02, 0x80, 0xa0, 0x28, -// 0x0a, 0x02, 0x41, 0x0f, 0x80, - - // 'P' (0x50) 7x10, offset 389-398, at +1/-10 - 0xff, 0x87, 0x10, 0x42, 0x08, 0x21, 0x78, 0x00, - 0x00, - // in regular row-major format -// 0xf9, 0x0a, 0x14, 0x28, 0x5f, 0x20, 0x40, 0x81, -// 0x00, - - // 'Q' (0x51) 10x12, offset 398-413, at +1/-10 - 0xfc, 0x20, 0x10, 0x01, 0x12, 0x20, 0x01, 0x12, - 0x60, 0x01, 0x2a, 0x90, 0xfc, 0x00, 0x00, - // in regular row-major format -// 0x3e, 0x10, 0x48, 0x0a, 0x02, 0x80, 0xa0, 0x28, -// 0x0a, 0x02, 0x41, 0x0f, 0x80, 0x40, 0x0c, - - // 'R' (0x52) 8x10, offset 413-423, at +1/-10 - 0xff, 0x87, 0x10, 0x42, 0x08, 0xe1, 0x78, 0x0c, - 0x00, 0x00, - // in regular row-major format -// 0xf8, 0x84, 0x84, 0x84, 0x84, 0xf8, 0x88, 0x88, -// 0x84, 0x84, - - // 'S' (0x53) 7x10, offset 423-432, at +1/-10 - 0x0e, 0x46, 0x18, 0x61, 0x88, 0x21, 0x02, 0x07, - 0x00, - // in regular row-major format -// 0x79, 0x02, 0x04, 0x06, 0x03, 0x01, 0x02, 0x05, -// 0xf0, - - // 'T' (0x54) 8x10, offset 432-442, at +0/-10 - 0x01, 0x04, 0x10, 0xc0, 0xff, 0x01, 0x04, 0x10, - 0x00, 0x00, - // in regular row-major format -// 0xfe, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, -// 0x10, 0x10, - - // 'U' (0x55) 9x10, offset 442-454, at +1/-10 - 0xff, 0x00, 0x04, 0x20, 0x80, 0x00, 0x02, 0x08, - 0xd0, 0x3f, 0x00, 0x00, - // in regular row-major format -// 0x81, 0x40, 0xa0, 0x50, 0x28, 0x14, 0x0a, 0x05, -// 0x02, 0x42, 0x1e, 0x00, - - // 'V' (0x56) 9x10, offset 454-466, at +0/-10 - 0x03, 0x30, 0x00, 0x07, 0x60, 0x80, 0xc3, 0xc1, - 0xc0, 0x00, 0x00, 0x00, - // in regular row-major format -// 0x81, 0x40, 0x90, 0x88, 0x42, 0x41, 0x20, 0x90, -// 0x30, 0x18, 0x04, 0x00, - - // 'W' (0x57) 13x10, offset 466-483, at +0/-10 - 0x01, 0x78, 0x00, 0x0e, 0xe0, 0x78, 0x1c, 0xe0, - 0x00, 0x1c, 0x80, 0x83, 0xe3, 0x41, 0x00, 0x00, - 0x00, - // in regular row-major format -// 0x84, 0x12, 0x31, 0x11, 0x88, 0x94, 0x44, 0x92, -// 0x14, 0xa0, 0xa5, 0x06, 0x18, 0x10, 0x80, 0x84, -// 0x00, - - // 'X' (0x58) 9x10, offset 483-495, at +0/-10 - 0x00, 0x0e, 0x44, 0x0c, 0x0e, 0x38, 0x10, 0x23, - 0x50, 0x80, 0x00, 0x00, - // in regular row-major format -// 0x41, 0x21, 0x09, 0x03, 0x01, 0x80, 0xc0, 0x90, -// 0x48, 0x42, 0x40, 0x80, - - // 'Y' (0x59) 8x10, offset 495-505, at +0/-10 - 0x01, 0x18, 0x80, 0x01, 0xf8, 0x18, 0x18, 0x10, - 0x00, 0x00, - // in regular row-major format -// 0x82, 0x44, 0x44, 0x28, 0x28, 0x10, 0x10, 0x10, -// 0x10, 0x10, - - // 'Z' (0x5a) 7x10, offset 505-514, at +1/-10 - 0x01, 0x07, 0x1b, 0x62, 0x86, 0x05, 0x0e, 0x08, - 0x00, - // in regular row-major format -// 0xfc, 0x08, 0x20, 0x81, 0x04, 0x10, 0x20, 0x81, -// 0xf8, - - // '[' (0x5b) 4x12, offset 514-520, at +1/-10 - 0xff, 0x1f, 0x80, 0x01, 0x08, 0x00, - // in regular row-major format -// 0xe8, 0x88, 0x88, 0x88, 0x88, 0x8e, - - // '\' (0x5c) 6x10, offset 520-528, at +0/-10 - 0x01, 0x38, 0x00, 0x03, 0x70, 0x00, 0x02, 0x00, - // in regular row-major format -// 0x81, 0x04, 0x10, 0x20, 0x81, 0x04, 0x10, 0x20, - - // ']' (0x5d) 4x12, offset 528-534, at +0/-10 - 0x01, 0x18, 0x80, 0xff, 0x0f, 0x00, - // in regular row-major format -// 0xe2, 0x22, 0x22, 0x22, 0x22, 0x2e, - - // '^' (0x5e) 7x6, offset 534-540, at +1/-10 - 0x30, 0x23, 0x0c, 0x0c, 0x0c, 0x00, - // in regular row-major format -// 0x10, 0x61, 0x22, 0x48, 0x50, 0x80, - - // '_' (0x5f) 7x1, offset 540-541, at +0/+1 - 0x3f, - // in regular row-major format -// 0xfc, - - // '`' (0x60) 3x2, offset 541-542, at +3/-10 - 0x09, - // in regular row-major format -// 0x88, - - // 'a' (0x61) 6x8, offset 542-548, at +1/-8 - 0xf0, 0x89, 0x89, 0x49, 0xfe, 0x00, - // in regular row-major format -// 0x70, 0x20, 0x9e, 0x8a, 0x29, 0xba, - - // 'b' (0x62) 7x11, offset 548-558, at +1/-11 - 0xff, 0x87, 0x10, 0x02, 0x11, 0x88, 0x40, 0xf8, - 0x01, 0x00, - // in regular row-major format -// 0x81, 0x02, 0x05, 0xcc, 0x50, 0xa1, 0x42, 0x85, -// 0x8a, 0xe0, - - // 'c' (0x63) 6x8, offset 558-564, at +1/-8 - 0x7c, 0xc2, 0x81, 0x81, 0x81, 0x00, - // in regular row-major format -// 0x39, 0x08, 0x20, 0x82, 0x0c, 0x1e, - - // 'd' (0x64) 7x11, offset 564-574, at +1/-11 - 0xf0, 0x43, 0x20, 0x02, 0x11, 0x08, 0xa1, 0xff, - 0x03, 0x00, - // in regular row-major format -// 0x04, 0x08, 0x13, 0xa8, 0xd0, 0xa1, 0x42, 0x85, -// 0x19, 0xd0, - - // 'e' (0x65) 7x8, offset 574-581, at +1/-8 - 0x7e, 0xc9, 0x89, 0x89, 0x89, 0x0e, 0x00, - // in regular row-major format -// 0x79, 0x0a, 0x17, 0xe8, 0x10, 0x30, 0x3c, - - // 'f' (0x66) 6x11, offset 581-590, at +0/-11 - 0x08, 0xf0, 0x7f, 0x02, 0x12, 0x10, 0x00, 0x00, - 0x00, - // in regular row-major format -// 0x39, 0x04, 0x3c, 0x41, 0x04, 0x10, 0x41, 0x04, -// 0x00, - - // 'g' (0x67) 8x11, offset 590-601, at +0/-8 - 0x00, 0x73, 0x67, 0x24, 0x23, 0x19, 0xc9, 0x47, - 0x06, 0x0c, 0x00, - // in regular row-major format -// 0x3e, 0x44, 0x44, 0x44, 0x38, 0x40, 0x40, 0x7c, -// 0x82, 0x82, 0x7c, - - // 'h' (0x68) 7x11, offset 601-611, at +1/-11 - 0xff, 0x87, 0x00, 0x02, 0x10, 0x80, 0x00, 0xf8, - 0x03, 0x00, - // in regular row-major format -// 0x81, 0x02, 0x05, 0xcc, 0x50, 0xa1, 0x42, 0x85, -// 0x0a, 0x10, - - // 'i' (0x69) 2x10, offset 611-614, at +1/-10 - 0xfd, 0x03, 0x00, - // in regular row-major format -// 0x8a, 0xaa, 0xa0, - - // 'j' (0x6a) 4x13, offset 614-621, at -1/-10 - 0x00, 0x10, 0x00, 0xf6, 0x3f, 0x00, 0x00, - // in regular row-major format -// 0x20, 0x22, 0x22, 0x22, 0x22, 0x22, 0xc0, - - // 'k' (0x6b) 7x11, offset 621-631, at +1/-11 - 0xff, 0x07, 0x04, 0x10, 0x40, 0x83, 0x21, 0x00, - 0x02, 0x00, - // in regular row-major format -// 0x81, 0x02, 0x04, 0x48, 0x92, 0x28, 0x68, 0x91, -// 0x12, 0x10, - - // 'l' (0x6c) 2x11, offset 631-634, at +1/-11 - 0xff, 0x07, 0x00, - // in regular row-major format -// 0xaa, 0xaa, 0xa8, - - // 'm' (0x6d) 11x8, offset 634-645, at +1/-8 - 0xff, 0x02, 0x01, 0x01, 0x03, 0xfe, 0x01, 0x01, - 0x01, 0xfe, 0x00, - // in regular row-major format -// 0xbb, 0x99, 0x8a, 0x11, 0x42, 0x28, 0x45, 0x08, -// 0xa1, 0x14, 0x22, - - // 'n' (0x6e) 7x8, offset 645-652, at +1/-8 - 0xff, 0x02, 0x01, 0x01, 0x01, 0xfe, 0x00, - // in regular row-major format -// 0xb9, 0x8a, 0x14, 0x28, 0x50, 0xa1, 0x42, - - // 'o' (0x6f) 7x8, offset 652-659, at +1/-8 - 0x7e, 0x81, 0x81, 0x81, 0x81, 0x7e, 0x00, - // in regular row-major format -// 0x79, 0x0a, 0x14, 0x28, 0x50, 0xa1, 0x3c, - - // 'p' (0x70) 7x11, offset 659-669, at +1/-8 - 0xff, 0x17, 0x42, 0x20, 0x02, 0x11, 0x08, 0x3f, - 0x00, 0x00, - // in regular row-major format -// 0xb9, 0x8a, 0x14, 0x28, 0x50, 0xb1, 0x5c, 0x81, -// 0x02, 0x00, - - // 'q' (0x71) 7x11, offset 669-679, at +1/-8 - 0x7e, 0x08, 0x44, 0x20, 0x02, 0x21, 0x84, 0xff, - 0x03, 0x00, - // in regular row-major format -// 0x75, 0x1a, 0x14, 0x28, 0x50, 0xa3, 0x3a, 0x04, -// 0x08, 0x10, - - // 'r' (0x72) 5x8, offset 679-684, at +1/-8 - 0xff, 0x02, 0x01, 0x01, 0x00, - // in regular row-major format -// 0xb6, 0x21, 0x08, 0x42, 0x10, - - // 's' (0x73) 6x8, offset 684-690, at +1/-8 - 0x86, 0x89, 0x89, 0x91, 0x71, 0x00, - // in regular row-major format -// 0x7a, 0x08, 0x18, 0x18, 0x20, 0xbc, - - // 't' (0x74) 6x10, offset 690-698, at +0/-10 - 0x04, 0xf8, 0x47, 0x20, 0x81, 0x00, 0x02, 0x00, - // in regular row-major format -// 0x01, 0x0f, 0x10, 0x41, 0x04, 0x10, 0x40, 0xe0, - - // 'u' (0x75) 7x8, offset 698-705, at +1/-8 - 0x7f, 0x80, 0x80, 0x80, 0x40, 0xff, 0x00, - // in regular row-major format -// 0x85, 0x0a, 0x14, 0x28, 0x50, 0xa3, 0x3a, - - // 'v' (0x76) 7x8, offset 705-712, at +0/-8 - 0x03, 0x1c, 0x60, 0xe0, 0x1c, 0x03, 0x00, - // in regular row-major format -// 0x85, 0x09, 0x22, 0x44, 0x86, 0x0c, 0x08, - - // 'w' (0x77) 11x8, offset 712-723, at +0/-8 - 0x03, 0x3c, 0xc0, 0x30, 0x0e, 0x07, 0x78, 0xc0, - 0x3c, 0x03, 0x00, - // in regular row-major format -// 0x84, 0x51, 0x89, 0x32, 0x25, 0x45, 0x28, 0xa5, -// 0x08, 0xc1, 0x08, - - // 'x' (0x78) 8x8, offset 723-731, at +0/-8 - 0x00, 0xc3, 0x24, 0x18, 0x24, 0xc3, 0x00, 0x00, - // in regular row-major format -// 0x44, 0x44, 0x28, 0x10, 0x10, 0x28, 0x44, 0x44, - - // 'y' (0x79) 7x11, offset 731-741, at +0/-8 - 0x03, 0xe4, 0x20, 0xf8, 0xc0, 0xc0, 0x81, 0x01, - 0x00, 0x00, - // in regular row-major format -// 0x85, 0x09, 0x22, 0x44, 0x86, 0x0c, 0x10, 0x20, -// 0x43, 0x00, - - // 'z' (0x7a) 5x8, offset 741-746, at +1/-8 - 0xc1, 0xb1, 0x8d, 0x83, 0x00, - // in regular row-major format -// 0xf0, 0x88, 0x44, 0x22, 0x1e, - - // '{' (0x7b) 6x12, offset 746-755, at +0/-10 - 0x40, 0x00, 0x04, 0xbe, 0x17, 0x80, 0x01, 0x08, - 0x00, - // in regular row-major format -// 0x18, 0x82, 0x08, 0x20, 0x8c, 0x08, 0x20, 0x82, -// 0x06, - - // '|' (0x7c) 3x14, offset 755-761, at +3/-11 - 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, - // in regular row-major format -// 0x92, 0x49, 0x24, 0x92, 0x49, 0x00, -}; - -static const uint8_t OpenSansLight16_BCM[] = { - - // ' ' (0x20) 1x1, offset 0-1, at +0/+0 - 0x00, - // in regular row-major format -// 0x00, - - // '!' (0x21) 3x12, offset 1-6, at +1/-12 - 0xff, 0x0c, 0xc0, 0x00, 0x00, - // in regular row-major format -// 0x92, 0x49, 0x24, 0x03, 0x60, - - // '"' (0x22) 5x4, offset 6-9, at +1/-12 - 0x0f, 0xf0, 0x00, - // in regular row-major format -// 0x94, 0xa5, 0x20, - - // '#' (0x23) 11x12, offset 9-26, at +0/-12 - 0x80, 0x00, 0x09, 0x90, 0xcf, 0x0f, 0x93, 0x00, - 0xc9, 0xf0, 0xf3, 0x09, 0x90, 0x00, 0x01, 0x00, - 0x00, - // in regular row-major format -// 0x09, 0x01, 0x20, 0x44, 0x08, 0x87, 0xfc, 0x24, -// 0x04, 0x87, 0xfc, 0x22, 0x04, 0x40, 0x90, 0x12, -// 0x00, - - // '$' (0x24) 8x13, offset 26-39, at +1/-12 - 0x18, 0x84, 0x04, 0x09, 0xa1, 0xff, 0x2f, 0x8c, - 0x04, 0x09, 0xc0, 0x00, 0x00, - // in regular row-major format -// 0x10, 0x3c, 0x50, 0x90, 0x90, 0x50, 0x38, 0x1c, -// 0x12, 0x12, 0x94, 0x78, 0x10, - - // '%' (0x25) 12x12, offset 39-57, at +1/-12 - 0x3e, 0x10, 0x04, 0x41, 0x68, 0x63, 0x88, 0x01, - 0x06, 0x18, 0x61, 0x6e, 0x21, 0x08, 0x82, 0xc0, - 0x07, 0x00, - // in regular row-major format -// 0x60, 0x89, 0x10, 0x91, 0x08, 0xa0, 0x92, 0x09, -// 0x5c, 0x65, 0x20, 0x92, 0x0a, 0x21, 0x12, 0x11, -// 0x22, 0x0c, - - // '&' (0x26) 11x12, offset 57-74, at +1/-12 - 0x80, 0xe7, 0xc4, 0x31, 0x18, 0x82, 0x51, 0xe8, - 0x88, 0x00, 0x05, 0x60, 0xc0, 0x09, 0x00, 0x00, - 0x00, - // in regular row-major format -// 0x38, 0x08, 0x81, 0x10, 0x22, 0x02, 0x80, 0x60, -// 0x12, 0x24, 0x24, 0x82, 0x90, 0x23, 0x0c, 0x3e, -// 0x40, - - // ''' (0x27) 2x4, offset 74-75, at +1/-12 - 0x0f, - // in regular row-major format -// 0xaa, - - // '(' (0x28) 4x15, offset 75-83, at +1/-12 - 0xfc, 0x9f, 0x01, 0x30, 0x00, 0x00, 0x00, 0x00, - // in regular row-major format -// 0x44, 0x88, 0x88, 0x88, 0x88, 0x88, 0x84, 0x40, - - // ')' (0x29) 4x15, offset 83-91, at +0/-12 - 0x00, 0x80, 0x01, 0x30, 0xff, 0x07, 0x00, 0x00, - // in regular row-major format -// 0x44, 0x22, 0x22, 0x22, 0x22, 0x22, 0x24, 0x40, - - // '*' (0x2a) 8x7, offset 91-98, at +1/-13 - 0x08, 0x24, 0xee, 0x81, 0x43, 0x12, 0x00, - // in regular row-major format -// 0x10, 0x10, 0x12, 0xfc, 0x28, 0x28, 0x44, - - // '+' (0x2b) 8x7, offset 98-105, at +1/-10 - 0x08, 0x04, 0xe2, 0x8f, 0x40, 0x20, 0x00, - // in regular row-major format -// 0x10, 0x10, 0x10, 0xfe, 0x10, 0x10, 0x10, - - // ',' (0x2c) 3x4, offset 105-107, at +0/-2 - 0x78, 0x00, - // in regular row-major format -// 0x49, 0x40, - - // '-' (0x2d) 4x1, offset 107-108, at +1/-5 - 0x07, - // in regular row-major format -// 0xe0, - - // '.' (0x2e) 3x2, offset 108-109, at +1/-2 - 0x0f, - // in regular row-major format -// 0xd8, - - // '/' (0x2f) 6x12, offset 109-118, at +0/-12 - 0x00, 0x08, 0x70, 0xf0, 0xe0, 0x00, 0x01, 0x00, - 0x00, - // in regular row-major format -// 0x08, 0x41, 0x04, 0x20, 0x82, 0x08, 0x41, 0x04, -// 0x20, - - // '0' (0x30) 8x12, offset 118-130, at +1/-12 - 0xfc, 0x23, 0x40, 0x01, 0x18, 0x80, 0x01, 0x28, - 0x40, 0xfc, 0x03, 0x00, - // in regular row-major format -// 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, -// 0x82, 0x82, 0x44, 0x38, - - // '1' (0x31) 4x12, offset 130-136, at +2/-12 - 0x04, 0x20, 0x00, 0xff, 0x0f, 0x00, - // in regular row-major format -// 0x26, 0xa2, 0x22, 0x22, 0x22, 0x22, - - // '2' (0x32) 8x12, offset 136-148, at +1/-12 - 0x02, 0x1c, 0xa0, 0x01, 0x19, 0x88, 0x41, 0xe8, - 0x83, 0x00, 0x08, 0x00, - // in regular row-major format -// 0x78, 0x84, 0x04, 0x04, 0x04, 0x04, 0x08, 0x10, -// 0x20, 0x40, 0x80, 0xfe, - - // '3' (0x33) 8x12, offset 148-160, at +1/-12 - 0x02, 0x18, 0x82, 0x21, 0x18, 0x82, 0x21, 0x28, - 0x45, 0x8c, 0x03, 0x00, - // in regular row-major format -// 0x78, 0x84, 0x02, 0x02, 0x04, 0x78, 0x04, 0x02, -// 0x02, 0x02, 0x04, 0xf8, - - // '4' (0x34) 10x12, offset 160-175, at +0/-12 - 0x00, 0x01, 0x1c, 0x20, 0x81, 0x11, 0x04, 0x21, - 0x10, 0xff, 0x0f, 0x10, 0x00, 0x01, 0x00, - // in regular row-major format -// 0x02, 0x01, 0x80, 0xa0, 0x48, 0x12, 0x08, 0x84, -// 0x21, 0x08, 0xff, 0x80, 0x80, 0x20, 0x08, - - // '5' (0x35) 8x12, offset 175-187, at +1/-12 - 0x30, 0xf4, 0x82, 0x21, 0x18, 0x82, 0x21, 0x18, - 0x44, 0xc0, 0x03, 0x00, - // in regular row-major format -// 0x7c, 0x40, 0x40, 0x40, 0x80, 0xf8, 0x06, 0x02, -// 0x02, 0x02, 0x84, 0x78, - - // '6' (0x36) 8x12, offset 187-199, at +1/-12 - 0xf8, 0x63, 0x44, 0x22, 0x18, 0x82, 0x21, 0x18, - 0xc2, 0xc0, 0x07, 0x00, - // in regular row-major format -// 0x1c, 0x60, 0x40, 0x80, 0x80, 0xbc, 0xc2, 0x82, -// 0x82, 0x82, 0x46, 0x3c, - - // '7' (0x37) 8x12, offset 199-211, at +1/-12 - 0x01, 0x10, 0x00, 0x01, 0x1c, 0x38, 0x61, 0xd0, - 0x01, 0x03, 0x00, 0x00, - // in regular row-major format -// 0xfe, 0x02, 0x04, 0x04, 0x04, 0x08, 0x08, 0x10, -// 0x10, 0x10, 0x20, 0x20, - - // '8' (0x38) 8x12, offset 211-223, at +1/-12 - 0x8c, 0x27, 0xc5, 0x21, 0x18, 0x82, 0x51, 0x28, - 0xc5, 0x8c, 0x07, 0x00, - // in regular row-major format -// 0x38, 0x44, 0x82, 0x82, 0x4c, 0x30, 0x4c, 0x82, -// 0x82, 0x82, 0xc6, 0x7c, - - // '9' (0x39) 8x12, offset 223-235, at +1/-12 - 0x3e, 0x30, 0x84, 0x41, 0x18, 0x84, 0x41, 0x24, - 0x62, 0xfc, 0x01, 0x00, - // in regular row-major format -// 0x78, 0xc4, 0x82, 0x82, 0x82, 0x86, 0x7a, 0x02, -// 0x02, 0x04, 0x0c, 0x70, - - // ':' (0x3a) 3x9, offset 235-239, at +1/-9 - 0x83, 0x07, 0x03, 0x00, - // in regular row-major format -// 0xd8, 0x00, 0x06, 0xc0, - - // ';' (0x3b) 3x11, offset 239-244, at +1/-9 - 0x83, 0x1f, 0x00, 0x00, 0x00, - // in regular row-major format -// 0xd8, 0x00, 0x04, 0x92, 0x00, - - // '<' (0x3c) 8x7, offset 244-251, at +1/-10 - 0x08, 0x0c, 0x85, 0x24, 0x12, 0x05, 0x01, - // in regular row-major format -// 0x02, 0x0c, 0x30, 0xc0, 0x60, 0x1c, 0x02, - - // '=' (0x3d) 8x4, offset 251-255, at +1/-8 - 0x99, 0x99, 0x99, 0x09, - // in regular row-major format -// 0xfe, 0x00, 0x00, 0xfe, - - // '>' (0x3e) 8x7, offset 255-262, at +1/-10 - 0x41, 0x91, 0x88, 0x44, 0xc1, 0x20, 0x00, - // in regular row-major format -// 0x80, 0x60, 0x18, 0x06, 0x0c, 0x70, 0x80, - - // '?' (0x3f) 7x12, offset 262-273, at +0/-12 - 0x00, 0x10, 0x00, 0x81, 0x1d, 0x04, 0x21, 0xe0, - 0x01, 0x00, 0x00, - // in regular row-major format -// 0x78, 0x08, 0x10, 0x20, 0x41, 0x04, 0x10, 0x20, -// 0x00, 0x81, 0x00, - - // '@' (0x40) 13x14, offset 273-296, at +1/-12 - 0xf0, 0x07, 0x03, 0x22, 0x00, 0x89, 0x87, 0x11, - 0x62, 0x82, 0x98, 0x20, 0x26, 0x84, 0xf9, 0x83, - 0x80, 0x40, 0x20, 0xe0, 0x07, 0x00, 0x00, - // in regular row-major format -// 0x0f, 0x81, 0x82, 0x10, 0x08, 0x8f, 0x28, 0x89, -// 0x48, 0x4a, 0x42, 0x52, 0x12, 0x91, 0x94, 0x77, -// 0x20, 0x00, 0x80, 0x02, 0x00, 0x0f, 0x80, - - // 'A' (0x41) 11x12, offset 296-313, at +0/-12 - 0x00, 0x08, 0x70, 0xc0, 0x80, 0x0b, 0x86, 0x70, - 0x08, 0x98, 0x00, 0x0e, 0x00, 0x07, 0x80, 0x00, - 0x00, - // in regular row-major format -// 0x04, 0x01, 0x80, 0x30, 0x09, 0x01, 0x20, 0x22, -// 0x08, 0x41, 0xf8, 0x40, 0x88, 0x11, 0x02, 0x40, -// 0x20, - - // 'B' (0x42) 8x12, offset 313-325, at +2/-12 - 0xff, 0x1f, 0x82, 0x21, 0x18, 0x82, 0x21, 0x28, - 0x45, 0xce, 0x07, 0x00, - // in regular row-major format -// 0xf8, 0x86, 0x82, 0x82, 0x84, 0xf8, 0x86, 0x82, -// 0x82, 0x82, 0x86, 0xf8, - - // 'C' (0x43) 10x12, offset 325-340, at +1/-12 - 0xf8, 0x41, 0x60, 0x02, 0x14, 0x80, 0x01, 0x18, - 0x80, 0x01, 0x18, 0x80, 0x00, 0x00, 0x00, - // in regular row-major format -// 0x1f, 0x08, 0x04, 0x02, 0x00, 0x80, 0x20, 0x08, -// 0x02, 0x00, 0x80, 0x10, 0x06, 0x00, 0x7c, - - // 'D' (0x44) 9x12, offset 340-354, at +2/-12 - 0xff, 0x1f, 0x80, 0x01, 0x18, 0x80, 0x01, 0x28, - 0x40, 0x06, 0x86, 0x1f, 0x00, 0x00, - // in regular row-major format -// 0xf8, 0x43, 0x20, 0x90, 0x28, 0x14, 0x0a, 0x05, -// 0x02, 0x81, 0x41, 0x21, 0x9f, 0x00, - - // 'E' (0x45) 7x12, offset 354-365, at +2/-12 - 0xff, 0x1f, 0x82, 0x21, 0x18, 0x82, 0x21, 0x18, - 0x82, 0x00, 0x00, - // in regular row-major format -// 0xfd, 0x02, 0x04, 0x08, 0x1f, 0xa0, 0x40, 0x81, -// 0x02, 0x07, 0xe0, - - // 'F' (0x46) 7x12, offset 365-376, at +2/-12 - 0xff, 0x1f, 0x04, 0x41, 0x10, 0x04, 0x41, 0x10, - 0x04, 0x00, 0x00, - // in regular row-major format -// 0xfd, 0x02, 0x04, 0x08, 0x10, 0x3f, 0x40, 0x81, -// 0x02, 0x04, 0x00, - - // 'G' (0x47) 11x12, offset 376-393, at +1/-12 - 0xf8, 0x41, 0x20, 0x02, 0x34, 0x80, 0x01, 0x18, - 0x84, 0x41, 0x18, 0x84, 0x41, 0x08, 0x7c, 0x00, - 0x00, - // in regular row-major format -// 0x1f, 0x86, 0x01, 0x00, 0x40, 0x08, 0x01, 0x00, -// 0x21, 0xf4, 0x02, 0x80, 0x48, 0x08, 0x81, 0x0f, -// 0xc0, - - // 'H' (0x48) 9x12, offset 393-407, at +2/-12 - 0xff, 0x0f, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, - 0x02, 0x20, 0xf0, 0xff, 0x00, 0x00, - // in regular row-major format -// 0x81, 0x40, 0xa0, 0x50, 0x28, 0x17, 0xfa, 0x05, -// 0x02, 0x81, 0x40, 0xa0, 0x50, 0x20, - - // 'I' (0x49) 3x12, offset 407-412, at +1/-12 - 0x00, 0xf0, 0xff, 0x00, 0x00, - // in regular row-major format -// 0x49, 0x24, 0x92, 0x49, 0x20, - - // 'J' (0x4a) 4x15, offset 412-420, at -1/-12 - 0x00, 0x40, 0x00, 0xe0, 0xff, 0x0f, 0x00, 0x00, - // in regular row-major format -// 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0xc0, - - // 'K' (0x4b) 8x12, offset 420-432, at +2/-12 - 0xff, 0x0f, 0x02, 0x70, 0x80, 0x08, 0x04, 0x33, - 0x40, 0x00, 0x08, 0x00, - // in regular row-major format -// 0x84, 0x84, 0x88, 0x90, 0xa0, 0xe0, 0xa0, 0x90, -// 0x88, 0x88, 0x84, 0x82, - - // 'L' (0x4c) 7x12, offset 432-443, at +2/-12 - 0xff, 0x0f, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, - 0x80, 0x00, 0x00, - // in regular row-major format -// 0x81, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x81, -// 0x02, 0x07, 0xe0, - - // 'M' (0x4d) 11x12, offset 443-460, at +2/-12 - 0xff, 0xcf, 0x00, 0x70, 0x00, 0x18, 0x00, 0x0e, - 0x60, 0x80, 0x01, 0x07, 0x0e, 0xf0, 0xff, 0x00, - 0x00, - // in regular row-major format -// 0x80, 0x50, 0x1b, 0x03, 0x60, 0x6a, 0x15, 0x42, -// 0xa8, 0x54, 0x92, 0x92, 0x51, 0x8a, 0x31, 0x44, -// 0x20, - - // 'N' (0x4e) 9x12, offset 460-474, at +2/-12 - 0xff, 0x4f, 0x00, 0x08, 0x00, 0x03, 0xc0, 0x00, - 0x10, 0x00, 0xf6, 0xff, 0x00, 0x00, - // in regular row-major format -// 0x81, 0x40, 0xb0, 0x54, 0x29, 0x14, 0x8a, 0x25, -// 0x12, 0x85, 0x41, 0xa0, 0xd0, 0x20, - - // 'O' (0x4f) 11x12, offset 474-491, at +1/-12 - 0xf8, 0x61, 0x60, 0x02, 0x14, 0x80, 0x01, 0x18, - 0x80, 0x01, 0x28, 0x40, 0x06, 0x86, 0x1f, 0x00, - 0x00, - // in regular row-major format -// 0x1e, 0x0c, 0x31, 0x02, 0x40, 0x28, 0x05, 0x00, -// 0xa0, 0x14, 0x02, 0x80, 0x48, 0x11, 0x86, 0x0f, -// 0x00, - - // 'P' (0x50) 7x12, offset 491-502, at +2/-12 - 0xff, 0x1f, 0x04, 0x41, 0x10, 0x04, 0x23, 0xe0, - 0x03, 0x00, 0x00, - // in regular row-major format -// 0xf9, 0x1a, 0x14, 0x28, 0x51, 0xbc, 0x40, 0x81, -// 0x02, 0x04, 0x00, - - // 'Q' (0x51) 11x15, offset 502-523, at +1/-12 - 0xf8, 0x01, 0x03, 0x83, 0x00, 0x21, 0x00, 0x11, - 0x80, 0x08, 0x40, 0x04, 0x60, 0x04, 0xc8, 0x06, - 0x46, 0xfc, 0x00, 0x00, 0x00, - // in regular row-major format -// 0x1e, 0x0c, 0x31, 0x02, 0x40, 0x28, 0x05, 0x00, -// 0xa0, 0x14, 0x02, 0x80, 0x48, 0x11, 0x86, 0x0f, -// 0x00, 0x20, 0x02, 0x00, 0x60, - - // 'R' (0x52) 9x12, offset 523-537, at +2/-12 - 0xff, 0x1f, 0x04, 0x41, 0x10, 0x04, 0xc1, 0x21, - 0x22, 0x1c, 0x0c, 0x00, 0x00, 0x00, - // in regular row-major format -// 0xf8, 0x42, 0x20, 0x90, 0x48, 0x24, 0x23, 0xe1, -// 0x10, 0x88, 0x42, 0x20, 0x90, 0x40, - - // 'S' (0x53) 8x12, offset 537-549, at +1/-12 - 0x1e, 0x28, 0x81, 0x21, 0x18, 0x82, 0x41, 0x18, - 0xc4, 0x82, 0x07, 0x00, - // in regular row-major format -// 0x3c, 0xc2, 0x80, 0x80, 0xc0, 0x30, 0x0c, 0x02, -// 0x02, 0x02, 0x06, 0xfc, - - // 'T' (0x54) 9x12, offset 549-563, at +0/-12 - 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0xff, 0x1f, - 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, - // in regular row-major format -// 0xff, 0x04, 0x02, 0x01, 0x00, 0x80, 0x40, 0x20, -// 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, - - // 'U' (0x55) 9x12, offset 563-577, at +2/-12 - 0xff, 0x07, 0x40, 0x00, 0x08, 0x80, 0x00, 0x08, - 0x80, 0x00, 0xf4, 0x7f, 0x00, 0x00, - // in regular row-major format -// 0x81, 0x40, 0xa0, 0x50, 0x28, 0x14, 0x0a, 0x05, -// 0x02, 0x81, 0x40, 0xb0, 0xc7, 0x80, - - // 'V' (0x56) 10x12, offset 577-592, at +0/-12 - 0x03, 0xc0, 0x01, 0x60, 0x00, 0x38, 0x00, 0x0c, - 0x30, 0xe0, 0xc0, 0x01, 0x03, 0x00, 0x00, - // in regular row-major format -// 0x80, 0xa0, 0x24, 0x11, 0x04, 0x41, 0x08, 0x82, -// 0x20, 0x48, 0x14, 0x05, 0x00, 0x80, 0x20, - - // 'W' (0x57) 15x12, offset 592-615, at +0/-12 - 0x01, 0xe0, 0x01, 0xe0, 0x01, 0xe0, 0x80, 0x87, - 0x07, 0x07, 0xf0, 0x00, 0x70, 0x00, 0x78, 0x00, - 0x0e, 0x1e, 0x1e, 0x10, 0x00, 0x00, 0x00, - // in regular row-major format -// 0x83, 0x04, 0x86, 0x11, 0x0c, 0x22, 0x28, 0x44, -// 0x48, 0x84, 0x92, 0x09, 0x24, 0x14, 0x28, 0x28, -// 0x50, 0x30, 0xc0, 0x61, 0x80, 0x81, 0x00, - - // 'X' (0x58) 10x12, offset 615-630, at +0/-12 - 0x00, 0x38, 0x40, 0x04, 0x83, 0x0d, 0x20, 0x00, - 0x0d, 0x0c, 0x33, 0x40, 0x00, 0x08, 0x00, - // in regular row-major format -// 0x41, 0x10, 0x42, 0x20, 0x48, 0x14, 0x02, 0x01, -// 0x40, 0x50, 0x22, 0x08, 0x84, 0x12, 0x02, - - // 'Y' (0x59) 9x12, offset 630-644, at +0/-12 - 0x01, 0x60, 0x00, 0x18, 0x00, 0x06, 0xe0, 0x8f, - 0x01, 0x06, 0x10, 0x00, 0x00, 0x00, - // in regular row-major format -// 0x81, 0x21, 0x10, 0x84, 0x82, 0x40, 0xc0, 0x60, -// 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, - - // 'Z' (0x5a) 8x12, offset 644-656, at +1/-12 - 0x01, 0x1c, 0xb0, 0x81, 0x18, 0x86, 0x11, 0xd8, - 0x80, 0x03, 0x08, 0x00, - // in regular row-major format -// 0xfe, 0x02, 0x04, 0x04, 0x08, 0x10, 0x10, 0x20, -// 0x40, 0x40, 0x80, 0xfe, - - // '[' (0x5b) 5x15, offset 656-666, at +1/-12 - 0xff, 0xff, 0x00, 0x60, 0x00, 0x30, 0x00, 0x08, - 0x00, 0x00, - // in regular row-major format -// 0xf4, 0x21, 0x08, 0x42, 0x10, 0x84, 0x21, 0x08, -// 0x43, 0xc0, - - // '\' (0x5c) 6x12, offset 666-675, at +0/-12 - 0x01, 0xe0, 0x00, 0xf0, 0x00, 0x70, 0x00, 0x08, - 0x00, - // in regular row-major format -// 0x81, 0x04, 0x10, 0x20, 0x82, 0x08, 0x10, 0x41, -// 0x02, - - // ']' (0x5d) 5x15, offset 675-685, at +0/-12 - 0x01, 0xc0, 0x00, 0x60, 0x00, 0xf0, 0xff, 0x0f, - 0x00, 0x00, - // in regular row-major format -// 0xf0, 0x84, 0x21, 0x08, 0x42, 0x10, 0x84, 0x21, -// 0x0b, 0xc0, - - // '^' (0x5e) 8x7, offset 685-692, at +1/-12 - 0x60, 0x8c, 0x21, 0x60, 0xc0, 0x80, 0x01, - // in regular row-major format -// 0x10, 0x28, 0x28, 0x44, 0x44, 0x82, 0x82, - - // '_' (0x5f) 8x1, offset 692-693, at +0/+1 - 0x7f, - // in regular row-major format -// 0xfe, - - // '`' (0x60) 4x3, offset 693-695, at +3/-13 - 0x11, 0x01, - // in regular row-major format -// 0x84, 0x20, - - // 'a' (0x61) 7x9, offset 695-703, at +1/-9 - 0xe0, 0x22, 0x46, 0x8c, 0x38, 0xc9, 0x3f, 0x00, - // in regular row-major format -// 0x78, 0x18, 0x10, 0x27, 0xd0, 0xa1, 0x46, 0x74, - - // 'b' (0x62) 8x13, offset 703-716, at +2/-13 - 0x60, 0x0c, 0x02, 0x42, 0x40, 0x08, 0x08, 0x01, - 0x41, 0x10, 0xf0, 0x01, 0x00, - // in regular row-major format -// 0x00, 0x00, 0x00, 0x00, 0x78, 0x84, 0x82, 0x02, -// 0x02, 0x02, 0x82, 0x84, 0x78, - - // 'c' (0x63) 7x9, offset 716-724, at +1/-9 - 0x7c, 0x04, 0x05, 0x0c, 0x18, 0x30, 0x20, 0x00, - // in regular row-major format -// 0x3c, 0x82, 0x04, 0x08, 0x10, 0x20, 0x20, 0x3c, - - // 'd' (0x64) 9x13, offset 724-739, at +1/-13 - 0xc0, 0x07, 0x04, 0x41, 0x40, 0x08, 0x08, 0x01, - 0x21, 0x20, 0x18, 0xfb, 0xff, 0x00, 0x00, - // in regular row-major format -// 0x01, 0x00, 0x80, 0x40, 0x23, 0xd2, 0x1a, 0x0d, -// 0x02, 0x81, 0x40, 0xa0, 0xc8, 0x63, 0xd0, - - // 'e' (0x65) 8x9, offset 739-748, at +1/-9 - 0x7c, 0x24, 0x45, 0x8c, 0x18, 0x51, 0x22, 0x07, - 0x00, - // in regular row-major format -// 0x38, 0x44, 0x82, 0x82, 0xfe, 0x80, 0x80, 0x40, -// 0x3c, - - // 'f' (0x66) 7x13, offset 748-760, at +0/-13 - 0x10, 0x00, 0x02, 0xf8, 0xff, 0x08, 0x10, 0x01, - 0x02, 0x00, 0x00, 0x00, - // in regular row-major format -// 0x1c, 0x40, 0x81, 0x0f, 0x84, 0x08, 0x10, 0x20, -// 0x40, 0x81, 0x02, 0x00, - - // 'g' (0x67) 9x13, offset 760-775, at +0/-9 - 0x00, 0xcc, 0x53, 0x87, 0xc5, 0x90, 0x18, 0x12, - 0x67, 0x62, 0x43, 0x0a, 0x30, 0x00, 0x00, - // in regular row-major format -// 0x3f, 0x22, 0x10, 0x88, 0x44, 0x41, 0xe0, 0x80, -// 0x80, 0x3e, 0x20, 0xa0, 0x58, 0x47, 0xc0, - - // 'h' (0x68) 8x13, offset 775-788, at +1/-13 - 0xff, 0x1f, 0x04, 0x40, 0x00, 0x08, 0x00, 0x01, - 0x60, 0x00, 0xf0, 0x07, 0x00, - // in regular row-major format -// 0x80, 0x80, 0x80, 0x80, 0xbc, 0xc4, 0x82, 0x82, -// 0x82, 0x82, 0x82, 0x82, 0x82, - - // 'i' (0x69) 2x12, offset 788-791, at +1/-12 - 0xfb, 0x0f, 0x00, - // in regular row-major format -// 0xa2, 0xaa, 0xaa, - - // 'j' (0x6a) 4x16, offset 791-799, at -1/-12 - 0x00, 0x80, 0x00, 0x80, 0xfb, 0xff, 0x00, 0x00, - // in regular row-major format -// 0x22, 0x02, 0x22, 0x22, 0x22, 0x22, 0x22, 0x2e, - - // 'k' (0x6b) 8x13, offset 799-812, at +1/-13 - 0xff, 0x1f, 0x40, 0x00, 0x04, 0xe0, 0x01, 0x42, - 0x20, 0x10, 0x00, 0x04, 0x00, - // in regular row-major format -// 0x80, 0x80, 0x80, 0x80, 0x84, 0x88, 0x90, 0x90, -// 0xb0, 0xd0, 0x88, 0x84, 0x82, - - // 'l' (0x6c) 3x13, offset 812-817, at +1/-13 - 0xff, 0x1f, 0x00, 0x00, 0x00, - // in regular row-major format -// 0x92, 0x49, 0x24, 0x92, 0x48, - - // 'm' (0x6d) 13x9, offset 817-832, at +1/-9 - 0xff, 0x05, 0x04, 0x08, 0x10, 0x40, 0x80, 0xff, - 0x00, 0x01, 0x02, 0x0c, 0xe0, 0x0f, 0x00, - // in regular row-major format -// 0xb9, 0xe6, 0x31, 0x20, 0x85, 0x04, 0x28, 0x21, -// 0x41, 0x0a, 0x08, 0x50, 0x42, 0x82, 0x10, - - // 'n' (0x6e) 8x9, offset 832-841, at +1/-9 - 0xff, 0x05, 0x04, 0x08, 0x10, 0x60, 0x00, 0x7f, - 0x00, - // in regular row-major format -// 0xbc, 0xc4, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, -// 0x82, - - // 'o' (0x6f) 8x9, offset 841-850, at +1/-9 - 0x7c, 0x04, 0x05, 0x0c, 0x18, 0x50, 0x10, 0x1f, - 0x00, - // in regular row-major format -// 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0x82, 0x44, -// 0x38, - - // 'p' (0x70) 8x13, offset 850-863, at +2/-9 - 0xc6, 0x20, 0x20, 0x04, 0x84, 0x80, 0x10, 0x10, - 0x04, 0x01, 0x1f, 0x00, 0x00, - // in regular row-major format -// 0x78, 0x84, 0x82, 0x02, 0x02, 0x02, 0x82, 0x84, -// 0x78, 0x00, 0x00, 0x00, 0x00, - - // 'q' (0x71) 9x13, offset 863-878, at +1/-9 - 0x7c, 0x40, 0x10, 0x04, 0x84, 0x80, 0x10, 0x10, - 0x02, 0x82, 0x31, 0xf8, 0xff, 0x00, 0x00, - // in regular row-major format -// 0x3d, 0x21, 0xa0, 0xd0, 0x28, 0x14, 0x0a, 0x0c, -// 0x86, 0x3d, 0x00, 0x80, 0x40, 0x20, 0x10, - - // 'r' (0x72) 6x9, offset 878-885, at +1/-9 - 0xff, 0x05, 0x04, 0x08, 0x10, 0x00, 0x00, - // in regular row-major format -// 0xbb, 0x08, 0x20, 0x82, 0x08, 0x20, 0x80, - - // 's' (0x73) 6x9, offset 885-892, at +1/-9 - 0x0e, 0x13, 0x46, 0x8c, 0x18, 0x0e, 0x00, - // in regular row-major format -// 0x7a, 0x08, 0x30, 0x30, 0x20, 0x82, 0xf0, - - // 't' (0x74) 6x11, offset 892-901, at +0/-11 - 0x04, 0xf8, 0x1f, 0x01, 0x09, 0x08, 0x40, 0x00, - 0x00, - // in regular row-major format -// 0x41, 0x0f, 0x10, 0x41, 0x04, 0x10, 0x41, 0x03, -// 0x80, - - // 'u' (0x75) 8x9, offset 901-910, at +1/-9 - 0x7f, 0x00, 0x03, 0x04, 0x08, 0x10, 0xd0, 0x7f, - 0x00, - // in regular row-major format -// 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x46, -// 0x7a, - - // 'v' (0x76) 8x9, offset 910-919, at +0/-9 - 0x03, 0x38, 0x80, 0x03, 0x08, 0x8e, 0xc3, 0x00, - 0x00, - // in regular row-major format -// 0x82, 0x82, 0x44, 0x44, 0x44, 0x28, 0x28, 0x28, -// 0x10, - - // 'w' (0x77) 13x9, offset 919-934, at +0/-9 - 0x01, 0x3c, 0x80, 0x03, 0x8e, 0xc3, 0xc0, 0x01, - 0x1c, 0xc0, 0xc1, 0x79, 0x08, 0x00, 0x00, - // in regular row-major format -// 0x82, 0x12, 0x31, 0x11, 0x88, 0x92, 0x44, 0x92, -// 0x14, 0xa0, 0xc3, 0x06, 0x18, 0x10, 0x80, - - // 'x' (0x78) 9x9, offset 934-945, at +0/-9 - 0x00, 0x02, 0x1b, 0xc1, 0x81, 0xc3, 0x48, 0x60, - 0x00, 0x00, 0x00, - // in regular row-major format -// 0x42, 0x12, 0x09, 0x03, 0x01, 0x80, 0xc0, 0x90, -// 0x84, 0x42, 0x00, - - // 'y' (0x79) 8x13, offset 945-958, at +0/-9 - 0x03, 0x90, 0x03, 0x82, 0x33, 0x80, 0x01, 0x0e, - 0x38, 0xc0, 0x00, 0x00, 0x00, - // in regular row-major format -// 0x82, 0x82, 0x44, 0x44, 0x44, 0x28, 0x28, 0x28, -// 0x10, 0x10, 0x20, 0x20, 0xc0, - - // 'z' (0x7a) 6x9, offset 958-965, at +1/-9 - 0x81, 0xc3, 0x46, 0x6c, 0x38, 0x10, 0x00, - // in regular row-major format -// 0xf8, 0x21, 0x04, 0x21, 0x04, 0x20, 0xf8, - - // '{' (0x7b) 5x15, offset 965-975, at +1/-12 - 0x80, 0x00, 0xbe, 0xcf, 0x00, 0x38, 0x00, 0x08, - 0x00, 0x00, - // in regular row-major format -// 0x31, 0x10, 0x84, 0x21, 0x10, 0x42, 0x10, 0x84, -// 0x10, 0xc0, - - // '|' (0x7c) 2x17, offset 975-980, at +4/-13 - 0xff, 0xff, 0x01, 0x00, 0x00, - // in regular row-major format -// 0xaa, 0xaa, 0xaa, 0xaa, 0x80, -}; - - -const Font FontsBCM[] = { - { - "Mono9", - (uint8_t *)FreeMono9pt7b_BCM, - (GFXglyph *)FreeMono9pt7bGlyphs, - 0x20, 0x7e, 18 - }, - { - "Mono12", - (uint8_t *)FreeMono12pt7b_BCM, - (GFXglyph *)FreeMono12pt7bGlyphs, - 0x20, 0x7e, 24 - }, - { - "Mono18", - (uint8_t *)FreeMono18pt7b_BCM, - (GFXglyph *)FreeMono18pt7bGlyphs, - 0x20, 0x7e, 35 - }, - { - "Mono24", - (uint8_t *)FreeMono24pt7b_BCM, - (GFXglyph *)FreeMono24pt7bGlyphs, - 0x20, 0x7e, 47 - }, - { - "TomThumb", - (uint8_t *)TomThumb_BCM, - (GFXglyph *)TomThumbGlyphs, - 0x20, 0x7e, 6 - }, - { - "Sans9", - (uint8_t *)FreeSans9pt7b_BCM, - (GFXglyph *)FreeSans9pt7bGlyphs, - 0x20, 0x7e, 22 - }, - { - "Sans12", - (uint8_t *)FreeSans12pt7b_BCM, - (GFXglyph *)FreeSans12pt7bGlyphs, - 0x20, 0x7e, 22 - }, - { - "SansLight10", - (uint8_t *)OpenSansLight10_BCM, - (GFXglyph *)OpenSansLight10Glyphs, - 0x20, 0x7d, 14 - }, - { - "SansLight12", - (uint8_t *)OpenSansLight12_BCM, - (GFXglyph *)OpenSansLight12Glyphs, - 0x20, 0x7d, 17 - }, - { - "SansLight14", - (uint8_t *)OpenSansLight14_BCM, - (GFXglyph *)OpenSansLight14Glyphs, - 0x20, 0x7d, 20 - }, - { - "SansLight16", - (uint8_t *)OpenSansLight16_BCM, - (GFXglyph *)OpenSansLight16Glyphs, - 0x20, 0x7d, 23 - }, - { - "Org01", - (uint8_t *)Org_01_BCM, - (GFXglyph *)Org_01Glyphs, - 0x20, 0x7e, 7 - }, -}; - - -uint8_t NumFontsBCM = sizeof(FontsBCM)/sizeof(FontsBCM[0]); diff --git a/drv/display/fonts_row_major.c b/drv/display/fonts_row_major.c deleted file mode 100644 index 13b046c..0000000 --- a/drv/display/fonts_row_major.c +++ /dev/null @@ -1,5120 +0,0 @@ -#include -#include "font.h" -#include "glyphs.h" - -/* -#include "FreeSans9pt7b.h" -#include "FreeSans12pt7b.h" -#include "FreeMono9pt7b.h" -#include "FreeMono12pt7b.h" -#include "FreeMono18pt7b.h" -#include "FreeMono24pt7b.h" -#include "TomThumb.h" -#include "Org_01.h" -#include "opensanslight-10.h" -#include "opensanslight-12.h" -#include "opensanslight-14.h" -#include "opensanslight-16.h" -*/ - - -static const uint8_t FreeSans9pt7b_generic[] = { - // ' ' (0x20) 0x0, offset 0-0, at +0/+1 - // in regular row-major format - // '!' (0x21) 2x13, offset 0-4, at +2/-12 - // in regular row-major format - 0xff, 0xff, 0xf8, 0xc0, - // '"' (0x22) 5x4, offset 4-7, at +1/-12 - // in regular row-major format - 0xde, 0xf7, 0x20, - // '#' (0x23) 10x12, offset 7-22, at +0/-11 - // in regular row-major format - 0x09, 0x86, 0x41, 0x91, 0xff, 0x13, 0x04, 0xc3, - 0x20, 0xc8, 0xff, 0x89, 0x82, 0x61, 0x90, - // '$' (0x24) 9x16, offset 22-40, at +1/-13 - // in regular row-major format - 0x10, 0x1f, 0x14, 0xda, 0x3d, 0x1e, 0x83, 0x40, - 0x78, 0x17, 0x08, 0xf4, 0x7a, 0x35, 0x33, 0xf0, - 0x40, 0x20, - // '%' (0x25) 16x13, offset 40-66, at +1/-12 - // in regular row-major format - 0x38, 0x10, 0xec, 0x20, 0xc6, 0x20, 0xc6, 0x40, - 0xc6, 0x40, 0x6c, 0x80, 0x39, 0x00, 0x01, 0x3c, - 0x02, 0x77, 0x02, 0x63, 0x04, 0x63, 0x04, 0x77, - 0x08, 0x3c, - // '&' (0x26) 11x13, offset 66-84, at +1/-12 - // in regular row-major format - 0x0e, 0x06, 0x60, 0xcc, 0x19, 0x81, 0xe0, 0x18, - 0x0f, 0x03, 0x36, 0xc2, 0xd8, 0x73, 0x06, 0x31, - 0xe3, 0xc4, - // ''' (0x27) 2x4, offset 84-85, at +1/-12 - // in regular row-major format - 0xfe, - // '(' (0x28) 4x17, offset 85-94, at +1/-12 - // in regular row-major format - 0x13, 0x26, 0x6c, 0xcc, 0xcc, 0xc4, 0x66, 0x23, - 0x10, - // ')' (0x29) 4x17, offset 94-103, at +1/-12 - // in regular row-major format - 0x8c, 0x46, 0x63, 0x33, 0x33, 0x32, 0x66, 0x4c, - 0x80, - // '*' (0x2a) 5x5, offset 103-107, at +1/-12 - // in regular row-major format - 0x25, 0x7e, 0xa5, 0x00, - // '+' (0x2b) 6x8, offset 107-113, at +3/-7 - // in regular row-major format - 0x30, 0xc3, 0x3f, 0x30, 0xc3, 0x0c, - // ',' (0x2c) 2x4, offset 113-114, at +2/+0 - // in regular row-major format - 0xd6, - // '-' (0x2d) 4x1, offset 114-115, at +1/-4 - // in regular row-major format - 0xf0, - // '.' (0x2e) 2x1, offset 115-116, at +1/+0 - // in regular row-major format - 0xc0, - // '/' (0x2f) 5x13, offset 116-125, at +0/-12 - // in regular row-major format - 0x08, 0x44, 0x21, 0x10, 0x84, 0x42, 0x11, 0x08, - 0x00, - // '0' (0x30) 8x13, offset 125-138, at +1/-12 - // in regular row-major format - 0x3c, 0x66, 0x42, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, - 0xc3, 0xc3, 0x42, 0x66, 0x3c, - // '1' (0x31) 4x13, offset 138-145, at +3/-12 - // in regular row-major format - 0x11, 0x3f, 0x33, 0x33, 0x33, 0x33, 0x30, - // '2' (0x32) 9x13, offset 145-160, at +1/-12 - // in regular row-major format - 0x3e, 0x31, 0xb0, 0x78, 0x30, 0x18, 0x1c, 0x1c, - 0x1c, 0x18, 0x18, 0x10, 0x08, 0x07, 0xf8, - // '3' (0x33) 8x13, offset 160-173, at +1/-12 - // in regular row-major format - 0x3c, 0x66, 0xc3, 0xc3, 0x03, 0x06, 0x1c, 0x07, - 0x03, 0xc3, 0xc3, 0x66, 0x3c, - // '4' (0x34) 7x13, offset 173-185, at +2/-12 - // in regular row-major format - 0x0c, 0x18, 0x71, 0x62, 0xc9, 0xa3, 0x46, 0xfe, - 0x18, 0x30, 0x60, 0xc0, - // '5' (0x35) 9x13, offset 185-200, at +1/-12 - // in regular row-major format - 0x7f, 0x20, 0x10, 0x08, 0x08, 0x07, 0xf3, 0x8c, - 0x03, 0x01, 0x80, 0xf0, 0x6c, 0x63, 0xe0, - // '6' (0x36) 9x13, offset 200-215, at +1/-12 - // in regular row-major format - 0x1e, 0x31, 0x98, 0x78, 0x0c, 0x06, 0xf3, 0x8d, - 0x83, 0xc1, 0xe0, 0xd0, 0x6c, 0x63, 0xe0, - // '7' (0x37) 8x13, offset 215-228, at +0/-12 - // in regular row-major format - 0xff, 0x03, 0x02, 0x06, 0x04, 0x0c, 0x08, 0x18, - 0x18, 0x18, 0x10, 0x30, 0x30, - // '8' (0x38) 9x13, offset 228-243, at +1/-12 - // in regular row-major format - 0x3e, 0x31, 0xb0, 0x78, 0x3c, 0x1b, 0x18, 0xf8, - 0xc6, 0xc1, 0xe0, 0xf0, 0x6c, 0x63, 0xe0, - // '9' (0x39) 8x13, offset 243-256, at +1/-12 - // in regular row-major format - 0x3c, 0x66, 0xc2, 0xc3, 0xc3, 0xc3, 0x67, 0x3b, - 0x03, 0x03, 0xc2, 0x66, 0x3c, - // ':' (0x3a) 2x10, offset 256-259, at +1/-9 - // in regular row-major format - 0xc0, 0x00, 0x30, - // ';' (0x3b) 3x12, offset 259-264, at +1/-8 - // in regular row-major format - 0xc0, 0x00, 0x00, 0x64, 0xa0, - // '<' (0x3c) 9x9, offset 264-275, at +1/-8 - // in regular row-major format - 0x00, 0x81, 0xc7, 0x8e, 0x0c, 0x07, 0x80, 0x70, - 0x0e, 0x01, 0x80, - // '=' (0x3d) 9x4, offset 275-280, at +1/-5 - // in regular row-major format - 0xff, 0x80, 0x00, 0x1f, 0xf0, - // '>' (0x3e) 9x9, offset 280-291, at +1/-8 - // in regular row-major format - 0x00, 0x70, 0x0e, 0x01, 0xc0, 0x18, 0x38, 0x71, - 0xc0, 0x80, 0x00, - // '?' (0x3f) 9x13, offset 291-306, at +1/-12 - // in regular row-major format - 0x3e, 0x31, 0xb0, 0x78, 0x30, 0x18, 0x18, 0x38, - 0x18, 0x18, 0x0c, 0x00, 0x00, 0x01, 0x80, - // '@' (0x40) 17x16, offset 306-340, at +1/-12 - // in regular row-major format - 0x03, 0xf0, 0x06, 0x0e, 0x06, 0x01, 0x86, 0x00, - 0x66, 0x1d, 0xbb, 0x31, 0xcf, 0x18, 0xc7, 0x98, - 0x63, 0xcc, 0x31, 0xe6, 0x11, 0xb3, 0x99, 0xcc, - 0xf7, 0x86, 0x00, 0x01, 0x80, 0x00, 0x70, 0x40, - 0x0f, 0xe0, - // 'A' (0x41) 12x13, offset 340-360, at +0/-12 - // in regular row-major format - 0x06, 0x00, 0xf0, 0x0f, 0x00, 0x90, 0x19, 0x81, - 0x98, 0x10, 0x83, 0x0c, 0x3f, 0xc2, 0x04, 0x60, - 0x66, 0x06, 0xc0, 0x30, - // 'B' (0x42) 11x13, offset 360-378, at +1/-12 - // in regular row-major format - 0xff, 0x18, 0x33, 0x03, 0x60, 0x6c, 0x0d, 0x83, - 0x3f, 0xc6, 0x06, 0xc0, 0x78, 0x0f, 0x01, 0xe0, - 0x6f, 0xf8, - // 'C' (0x43) 11x13, offset 378-396, at +1/-12 - // in regular row-major format - 0x1f, 0x86, 0x19, 0x81, 0xa0, 0x3c, 0x01, 0x80, - 0x30, 0x06, 0x00, 0xc0, 0x68, 0x0d, 0x83, 0x18, - 0x61, 0xf0, - // 'D' (0x44) 11x13, offset 396-414, at +1/-12 - // in regular row-major format - 0xff, 0x18, 0x33, 0x03, 0x60, 0x3c, 0x07, 0x80, - 0xf0, 0x1e, 0x03, 0xc0, 0x78, 0x0f, 0x03, 0x60, - 0xcf, 0xf0, - // 'E' (0x45) 9x13, offset 414-429, at +1/-12 - // in regular row-major format - 0xff, 0xe0, 0x30, 0x18, 0x0c, 0x06, 0x03, 0xfd, - 0x80, 0xc0, 0x60, 0x30, 0x18, 0x0f, 0xf8, - // 'F' (0x46) 8x13, offset 429-442, at +1/-12 - // in regular row-major format - 0xff, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xfe, 0xc0, - 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, - // 'G' (0x47) 12x13, offset 442-462, at +1/-12 - // in regular row-major format - 0x0f, 0x83, 0x0e, 0x60, 0x66, 0x03, 0xc0, 0x0c, - 0x00, 0xc1, 0xfc, 0x03, 0xc0, 0x36, 0x03, 0x60, - 0x73, 0x0f, 0x0f, 0x10, - // 'H' (0x48) 11x13, offset 462-480, at +1/-12 - // in regular row-major format - 0xc0, 0x78, 0x0f, 0x01, 0xe0, 0x3c, 0x07, 0x80, - 0xff, 0xfe, 0x03, 0xc0, 0x78, 0x0f, 0x01, 0xe0, - 0x3c, 0x06, - // 'I' (0x49) 2x13, offset 480-484, at +2/-12 - // in regular row-major format - 0xff, 0xff, 0xff, 0xc0, - // 'J' (0x4a) 7x13, offset 484-496, at +1/-12 - // in regular row-major format - 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc1, 0x83, 0x07, - 0x8f, 0x1e, 0x27, 0x80, - // 'K' (0x4b) 11x13, offset 496-514, at +1/-12 - // in regular row-major format - 0xc0, 0xd8, 0x33, 0x0c, 0x63, 0x0c, 0xc1, 0xb8, - 0x3f, 0x07, 0x30, 0xc3, 0x18, 0x63, 0x06, 0x60, - 0x6c, 0x0c, - // 'L' (0x4c) 8x13, offset 514-527, at +1/-12 - // in regular row-major format - 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, - 0xc0, 0xc0, 0xc0, 0xc0, 0xff, - // 'M' (0x4d) 13x13, offset 527-549, at +1/-12 - // in regular row-major format - 0xe0, 0x3f, 0x01, 0xfc, 0x1f, 0xe0, 0xfd, 0x05, - 0xec, 0x6f, 0x63, 0x79, 0x13, 0xcd, 0x9e, 0x6c, - 0xf1, 0x47, 0x8e, 0x3c, 0x71, 0x80, - // 'N' (0x4e) 11x13, offset 549-567, at +1/-12 - // in regular row-major format - 0xe0, 0x7c, 0x0f, 0xc1, 0xe8, 0x3d, 0x87, 0x98, - 0xf1, 0x1e, 0x33, 0xc3, 0x78, 0x6f, 0x07, 0xe0, - 0x7c, 0x0e, - // 'O' (0x4f) 13x13, offset 567-589, at +1/-12 - // in regular row-major format - 0x0f, 0x81, 0x83, 0x18, 0x0c, 0xc0, 0x6c, 0x01, - 0xe0, 0x0f, 0x00, 0x78, 0x03, 0xc0, 0x1b, 0x01, - 0x98, 0x0c, 0x60, 0xc0, 0xf8, 0x00, - // 'P' (0x50) 10x13, offset 589-606, at +1/-12 - // in regular row-major format - 0xff, 0x30, 0x6c, 0x0f, 0x03, 0xc0, 0xf0, 0x6f, - 0xf3, 0x00, 0xc0, 0x30, 0x0c, 0x03, 0x00, 0xc0, - 0x00, - // 'Q' (0x51) 13x14, offset 606-629, at +1/-12 - // in regular row-major format - 0x0f, 0x81, 0x83, 0x18, 0x0c, 0xc0, 0x6c, 0x01, - 0xe0, 0x0f, 0x00, 0x78, 0x03, 0xc0, 0x1b, 0x01, - 0x98, 0x6c, 0x60, 0xc0, 0xfb, 0x00, 0x08, - // 'R' (0x52) 12x13, offset 629-649, at +1/-12 - // in regular row-major format - 0xff, 0x8c, 0x0e, 0xc0, 0x6c, 0x06, 0xc0, 0x6c, - 0x0c, 0xff, 0x8c, 0x0e, 0xc0, 0x6c, 0x06, 0xc0, - 0x6c, 0x06, 0xc0, 0x70, - // 'S' (0x53) 10x13, offset 649-666, at +1/-12 - // in regular row-major format - 0x3f, 0x18, 0x6c, 0x0f, 0x03, 0xc0, 0x1e, 0x01, - 0xf0, 0x0e, 0x00, 0xf0, 0x3c, 0x0d, 0x86, 0x3f, - 0x00, - // 'T' (0x54) 9x13, offset 666-681, at +1/-12 - // in regular row-major format - 0xff, 0x86, 0x03, 0x01, 0x80, 0xc0, 0x60, 0x30, - 0x18, 0x0c, 0x06, 0x03, 0x01, 0x80, 0xc0, - // 'U' (0x55) 11x13, offset 681-699, at +1/-12 - // in regular row-major format - 0xc0, 0x78, 0x0f, 0x01, 0xe0, 0x3c, 0x07, 0x80, - 0xf0, 0x1e, 0x03, 0xc0, 0x78, 0x0f, 0x01, 0xb0, - 0x61, 0xf0, - // 'V' (0x56) 11x13, offset 699-717, at +0/-12 - // in regular row-major format - 0xc0, 0x6c, 0x0d, 0x81, 0x10, 0x63, 0x0c, 0x61, - 0x04, 0x60, 0xcc, 0x19, 0x01, 0x60, 0x3c, 0x07, - 0x00, 0x60, - // 'W' (0x57) 17x13, offset 717-745, at +0/-12 - // in regular row-major format - 0xc1, 0x81, 0x30, 0xe1, 0x98, 0x70, 0xcc, 0x28, - 0x66, 0x26, 0x21, 0x13, 0x30, 0xc8, 0x98, 0x6c, - 0x4c, 0x14, 0x34, 0x0a, 0x1a, 0x07, 0x07, 0x03, - 0x03, 0x80, 0x81, 0x80, - // 'X' (0x58) 12x13, offset 745-765, at +0/-12 - // in regular row-major format - 0x60, 0x63, 0x0c, 0x30, 0xc1, 0x98, 0x0f, 0x00, - 0xe0, 0x06, 0x00, 0xf0, 0x19, 0x01, 0x98, 0x30, - 0xc6, 0x0e, 0x60, 0x60, - // 'Y' (0x59) 12x13, offset 765-785, at +0/-12 - // in regular row-major format - 0xc0, 0x36, 0x06, 0x30, 0xc3, 0x0c, 0x19, 0x81, - 0xd8, 0x0f, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, - 0x00, 0x60, 0x06, 0x00, - // 'Z' (0x5a) 10x13, offset 785-802, at +1/-12 - // in regular row-major format - 0xff, 0xc0, 0x60, 0x30, 0x0c, 0x06, 0x03, 0x01, - 0xc0, 0x60, 0x30, 0x18, 0x06, 0x03, 0x00, 0xff, - 0xc0, - // '[' (0x5b) 3x17, offset 802-809, at +1/-12 - // in regular row-major format - 0xfb, 0x6d, 0xb6, 0xdb, 0x6d, 0xb6, 0xe0, - // '\' (0x5c) 5x13, offset 809-818, at +0/-12 - // in regular row-major format - 0x84, 0x10, 0x84, 0x10, 0x84, 0x10, 0x84, 0x10, - 0x80, - // ']' (0x5d) 3x17, offset 818-825, at +0/-12 - // in regular row-major format - 0xed, 0xb6, 0xdb, 0x6d, 0xb6, 0xdb, 0xe0, - // '^' (0x5e) 7x7, offset 825-832, at +1/-12 - // in regular row-major format - 0x30, 0x60, 0xa2, 0x44, 0xd8, 0xa1, 0x80, - // '_' (0x5f) 10x1, offset 832-834, at +0/+3 - // in regular row-major format - 0xff, 0xc0, - // '`' (0x60) 4x3, offset 834-836, at +0/-12 - // in regular row-major format - 0xc6, 0x30, - // 'a' (0x61) 9x10, offset 836-848, at +1/-9 - // in regular row-major format - 0x7e, 0x71, 0xb0, 0xc0, 0x60, 0xf3, 0xdb, 0x0d, - 0x86, 0xc7, 0x3d, 0xc0, - // 'b' (0x62) 9x13, offset 848-863, at +1/-12 - // in regular row-major format - 0xc0, 0x60, 0x30, 0x1b, 0xce, 0x36, 0x0f, 0x07, - 0x83, 0xc1, 0xe0, 0xf0, 0x7c, 0x6d, 0xe0, - // 'c' (0x63) 8x10, offset 863-873, at +1/-9 - // in regular row-major format - 0x3c, 0x66, 0xc3, 0xc0, 0xc0, 0xc0, 0xc0, 0xc3, - 0x66, 0x3c, - // 'd' (0x64) 8x13, offset 873-886, at +1/-12 - // in regular row-major format - 0x03, 0x03, 0x03, 0x3b, 0x67, 0xc3, 0xc3, 0xc3, - 0xc3, 0xc3, 0xc3, 0x67, 0x3b, - // 'e' (0x65) 8x10, offset 886-896, at +1/-9 - // in regular row-major format - 0x3c, 0x66, 0xc3, 0xc3, 0xff, 0xc0, 0xc0, 0xc3, - 0x66, 0x3c, - // 'f' (0x66) 4x13, offset 896-903, at +1/-12 - // in regular row-major format - 0x36, 0x6f, 0x66, 0x66, 0x66, 0x66, 0x60, - // 'g' (0x67) 8x14, offset 903-917, at +1/-9 - // in regular row-major format - 0x3b, 0x67, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, - 0x67, 0x3b, 0x03, 0x03, 0xc6, 0x7c, - // 'h' (0x68) 8x13, offset 917-930, at +1/-12 - // in regular row-major format - 0xc0, 0xc0, 0xc0, 0xde, 0xe3, 0xc3, 0xc3, 0xc3, - 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, - // 'i' (0x69) 2x13, offset 930-934, at +1/-12 - // in regular row-major format - 0xc3, 0xff, 0xff, 0xc0, - // 'j' (0x6a) 4x17, offset 934-943, at +0/-12 - // in regular row-major format - 0x30, 0x03, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, - 0xe0, - // 'k' (0x6b) 9x13, offset 943-958, at +1/-12 - // in regular row-major format - 0xc0, 0x60, 0x30, 0x18, 0x4c, 0x46, 0x63, 0x61, - 0xf0, 0xec, 0x62, 0x31, 0x98, 0x6c, 0x30, - // 'l' (0x6c) 2x13, offset 958-962, at +1/-12 - // in regular row-major format - 0xff, 0xff, 0xff, 0xc0, - // 'm' (0x6d) 13x10, offset 962-979, at +1/-9 - // in regular row-major format - 0xde, 0xf7, 0x1c, 0xf0, 0xc7, 0x86, 0x3c, 0x31, - 0xe1, 0x8f, 0x0c, 0x78, 0x63, 0xc3, 0x1e, 0x18, - 0xc0, - // 'n' (0x6e) 8x10, offset 979-989, at +1/-9 - // in regular row-major format - 0xde, 0xe3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, - 0xc3, 0xc3, - // 'o' (0x6f) 8x10, offset 989-999, at +1/-9 - // in regular row-major format - 0x3c, 0x66, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, - 0x66, 0x3c, - // 'p' (0x70) 9x13, offset 999-1014, at +1/-9 - // in regular row-major format - 0xde, 0x71, 0xb0, 0x78, 0x3c, 0x1e, 0x0f, 0x07, - 0x83, 0xe3, 0x6f, 0x30, 0x18, 0x0c, 0x00, - // 'q' (0x71) 8x13, offset 1014-1027, at +1/-9 - // in regular row-major format - 0x3b, 0x67, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, - 0x67, 0x3b, 0x03, 0x03, 0x03, - // 'r' (0x72) 5x10, offset 1027-1034, at +1/-9 - // in regular row-major format - 0xdf, 0x31, 0x8c, 0x63, 0x18, 0xc6, 0x00, - // 's' (0x73) 8x10, offset 1034-1044, at +1/-9 - // in regular row-major format - 0x3e, 0xe3, 0xc0, 0xc0, 0xe0, 0x3c, 0x07, 0xc3, - 0xe3, 0x7e, - // 't' (0x74) 4x12, offset 1044-1050, at +1/-11 - // in regular row-major format - 0x66, 0xf6, 0x66, 0x66, 0x66, 0x67, - // 'u' (0x75) 8x10, offset 1050-1060, at +1/-9 - // in regular row-major format - 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, - 0xc7, 0x7b, - // 'v' (0x76) 9x10, offset 1060-1072, at +0/-9 - // in regular row-major format - 0xc1, 0xa0, 0x98, 0xcc, 0x42, 0x21, 0xb0, 0xd0, - 0x28, 0x1c, 0x0c, 0x00, - // 'w' (0x77) 13x10, offset 1072-1089, at +0/-9 - // in regular row-major format - 0xc6, 0x1e, 0x38, 0x91, 0xc4, 0xca, 0x66, 0xd3, - 0x16, 0xd0, 0xa6, 0x87, 0x1c, 0x38, 0xc0, 0xc6, - 0x00, - // 'x' (0x78) 8x10, offset 1089-1099, at +0/-9 - // in regular row-major format - 0x43, 0x62, 0x36, 0x1c, 0x18, 0x1c, 0x3c, 0x26, - 0x62, 0x43, - // 'y' (0x79) 9x14, offset 1099-1115, at +0/-9 - // in regular row-major format - 0xc1, 0x21, 0x98, 0xcc, 0x42, 0x61, 0xb0, 0xd0, - 0x38, 0x1c, 0x0c, 0x06, 0x03, 0x01, 0x03, 0x00, - // 'z' (0x7a) 7x10, offset 1115-1124, at +1/-9 - // in regular row-major format - 0xfe, 0x0c, 0x30, 0xc1, 0x86, 0x18, 0x20, 0xc1, - 0xfc, - // '{' (0x7b) 4x17, offset 1124-1133, at +1/-12 - // in regular row-major format - 0x36, 0x66, 0x66, 0x6e, 0xce, 0x66, 0x66, 0x66, - 0x30, - // '|' (0x7c) 2x17, offset 1133-1138, at +2/-12 - // in regular row-major format - 0xff, 0xff, 0xff, 0xff, 0xc0, - // '}' (0x7d) 4x17, offset 1138-1147, at +1/-12 - // in regular row-major format - 0xc6, 0x66, 0x66, 0x67, 0x37, 0x66, 0x66, 0x66, - 0xc0, -}; - - -static const uint8_t FreeSans12pt7b_generic[] = { - // ' ' (0x20) 0x0, offset 0-0, at +0/+1 - // in regular row-major format - // '!' (0x21) 2x18, offset 0-5, at +3/-17 - // in regular row-major format - 0xff, 0xff, 0xff, 0xf0, 0xf0, - // '"' (0x22) 6x6, offset 5-10, at +1/-16 - // in regular row-major format - 0xcf, 0x3c, 0xf3, 0x8a, 0x20, - // '#' (0x23) 13x16, offset 10-36, at +0/-15 - // in regular row-major format - 0x06, 0x30, 0x31, 0x03, 0x18, 0x18, 0xc7, 0xff, - 0xbf, 0xfc, 0x31, 0x03, 0x18, 0x18, 0xc7, 0xff, - 0xbf, 0xfc, 0x31, 0x01, 0x18, 0x18, 0xc0, 0xc6, - 0x06, 0x30, - // '$' (0x24) 11x20, offset 36-64, at +1/-17 - // in regular row-major format - 0x04, 0x03, 0xe1, 0xff, 0x72, 0x6c, 0x47, 0x88, - 0xf1, 0x07, 0x20, 0x7e, 0x03, 0xf0, 0x17, 0x02, - 0x3c, 0x47, 0x88, 0xf1, 0x1b, 0x26, 0x7f, 0xc3, - 0xe0, 0x10, 0x02, 0x00, - // '%' (0x25) 20x17, offset 64-107, at +1/-16 - // in regular row-major format - 0x00, 0x06, 0x03, 0xc0, 0x40, 0x7e, 0x0c, 0x0e, - 0x70, 0x80, 0xc3, 0x18, 0x0c, 0x31, 0x00, 0xe7, - 0x30, 0x07, 0xe6, 0x00, 0x3c, 0x40, 0x00, 0x0c, - 0x7c, 0x00, 0x8f, 0xe0, 0x19, 0xc7, 0x01, 0x18, - 0x30, 0x31, 0x83, 0x02, 0x1c, 0x70, 0x40, 0xfe, - 0x04, 0x07, 0xc0, - // '&' (0x26) 14x17, offset 107-137, at +1/-16 - // in regular row-major format - 0x0f, 0x00, 0x7e, 0x03, 0x9c, 0x0c, 0x30, 0x30, - 0xc0, 0xe7, 0x01, 0xf8, 0x03, 0x80, 0x3e, 0x01, - 0xcc, 0x6e, 0x19, 0xb0, 0x7c, 0xc0, 0xf3, 0x03, - 0xce, 0x1f, 0x9f, 0xe6, 0x1e, 0x1c, - // ''' (0x27) 2x6, offset 137-139, at +1/-16 - // in regular row-major format - 0xff, 0xa0, - // '(' (0x28) 5x23, offset 139-154, at +2/-17 - // in regular row-major format - 0x08, 0x8c, 0x66, 0x31, 0x98, 0xc6, 0x31, 0x8c, - 0x63, 0x08, 0x63, 0x08, 0x61, 0x0c, 0x20, - // ')' (0x29) 5x23, offset 154-169, at +1/-17 - // in regular row-major format - 0x82, 0x18, 0xc3, 0x18, 0xc3, 0x18, 0xc6, 0x31, - 0x8c, 0x62, 0x31, 0x88, 0xc4, 0x62, 0x00, - // '*' (0x2a) 7x7, offset 169-176, at +1/-17 - // in regular row-major format - 0x10, 0x23, 0x5b, 0xe3, 0x8d, 0x91, 0x00, - // '+' (0x2b) 10x11, offset 176-190, at +2/-10 - // in regular row-major format - 0x0c, 0x03, 0x00, 0xc0, 0x30, 0xff, 0xff, 0xf0, - 0xc0, 0x30, 0x0c, 0x03, 0x00, 0xc0, - // ',' (0x2c) 2x6, offset 190-192, at +2/-1 - // in regular row-major format - 0xf5, 0x60, - // '-' (0x2d) 6x2, offset 192-194, at +1/-7 - // in regular row-major format - 0xff, 0xf0, - // '.' (0x2e) 2x2, offset 194-195, at +2/-1 - // in regular row-major format - 0xf0, - // '/' (0x2f) 7x18, offset 195-211, at +0/-17 - // in regular row-major format - 0x02, 0x0c, 0x10, 0x20, 0xc1, 0x02, 0x0c, 0x10, - 0x20, 0xc1, 0x02, 0x0c, 0x10, 0x20, 0xc1, 0x00, - // '0' (0x30) 11x17, offset 211-235, at +1/-16 - // in regular row-major format - 0x1f, 0x07, 0xf1, 0xc7, 0x30, 0x6e, 0x0f, 0x80, - 0xf0, 0x1e, 0x03, 0xc0, 0x78, 0x0f, 0x01, 0xe0, - 0x3c, 0x0e, 0xc1, 0x9c, 0x71, 0xfc, 0x1f, 0x00, - // '1' (0x31) 5x17, offset 235-246, at +3/-16 - // in regular row-major format - 0x08, 0xcf, 0xff, 0x8c, 0x63, 0x18, 0xc6, 0x31, - 0x8c, 0x63, 0x18, - // '2' (0x32) 11x17, offset 246-270, at +1/-16 - // in regular row-major format - 0x1f, 0x0f, 0xf9, 0x87, 0x60, 0x7c, 0x06, 0x00, - 0xc0, 0x18, 0x07, 0x01, 0xc0, 0xf0, 0x78, 0x1c, - 0x06, 0x00, 0x80, 0x30, 0x07, 0xff, 0xff, 0xe0, - // '3' (0x33) 11x17, offset 270-294, at +1/-16 - // in regular row-major format - 0x3f, 0x0f, 0xf3, 0x87, 0x60, 0x6c, 0x0c, 0x01, - 0x80, 0x70, 0x7c, 0x0f, 0x80, 0x18, 0x01, 0x80, - 0x3c, 0x07, 0x80, 0xd8, 0x73, 0xfc, 0x1f, 0x00, - // '4' (0x34) 11x17, offset 294-318, at +1/-16 - // in regular row-major format - 0x01, 0x80, 0x70, 0x0e, 0x03, 0xc0, 0xd8, 0x1b, - 0x06, 0x61, 0x8c, 0x21, 0x8c, 0x33, 0x06, 0x7f, - 0xff, 0xfe, 0x03, 0x00, 0x60, 0x0c, 0x01, 0x80, - // '5' (0x35) 11x17, offset 318-342, at +1/-16 - // in regular row-major format - 0x3f, 0xcf, 0xf9, 0x80, 0x30, 0x06, 0x00, 0xde, - 0x1f, 0xe7, 0x0e, 0x00, 0xe0, 0x0c, 0x01, 0x80, - 0x30, 0x07, 0x81, 0xf8, 0x73, 0xfc, 0x1f, 0x00, - // '6' (0x36) 11x17, offset 342-366, at +1/-16 - // in regular row-major format - 0x0f, 0x07, 0xf9, 0xc3, 0x30, 0x74, 0x01, 0x80, - 0x33, 0xc7, 0xfe, 0xf0, 0xdc, 0x1f, 0x01, 0xe0, - 0x3c, 0x06, 0xc1, 0xdc, 0x71, 0xfc, 0x1f, 0x00, - // '7' (0x37) 11x17, offset 366-390, at +1/-16 - // in regular row-major format - 0xff, 0xff, 0xfc, 0x01, 0x00, 0x60, 0x18, 0x02, - 0x00, 0xc0, 0x30, 0x06, 0x01, 0x80, 0x30, 0x04, - 0x01, 0x80, 0x30, 0x06, 0x01, 0x80, 0x30, 0x00, - // '8' (0x38) 11x17, offset 390-414, at +1/-16 - // in regular row-major format - 0x1f, 0x07, 0xf1, 0xc7, 0x30, 0x66, 0x0c, 0xc1, - 0x8c, 0x61, 0xfc, 0x3f, 0x8e, 0x3b, 0x01, 0xe0, - 0x3c, 0x07, 0x80, 0xd8, 0x31, 0xfc, 0x1f, 0x00, - // '9' (0x39) 11x17, offset 414-438, at +1/-16 - // in regular row-major format - 0x1f, 0x07, 0xf1, 0xc7, 0x70, 0x6c, 0x07, 0x80, - 0xf0, 0x1e, 0x07, 0x61, 0xef, 0xfc, 0x79, 0x80, - 0x30, 0x05, 0x81, 0x98, 0x73, 0xfc, 0x1e, 0x00, - // ':' (0x3a) 2x13, offset 438-442, at +2/-12 - // in regular row-major format - 0xf0, 0x00, 0x03, 0xc0, - // ';' (0x3b) 2x16, offset 442-446, at +2/-11 - // in regular row-major format - 0xf0, 0x00, 0x0f, 0x56, - // '<' (0x3c) 12x12, offset 446-464, at +1/-11 - // in regular row-major format - 0x00, 0x00, 0x07, 0x01, 0xe0, 0xf8, 0x3c, 0x0f, - 0x00, 0xe0, 0x07, 0xc0, 0x0f, 0x00, 0x3c, 0x00, - 0xf0, 0x01, - // '=' (0x3d) 12x6, offset 464-473, at +1/-8 - // in regular row-major format - 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, - // '>' (0x3e) 12x12, offset 473-491, at +1/-11 - // in regular row-major format - 0x00, 0x0e, 0x00, 0x78, 0x01, 0xf0, 0x07, 0xc0, - 0x0f, 0x00, 0x70, 0x1e, 0x0f, 0x03, 0xc0, 0xf0, - 0x08, 0x00, - // '?' (0x3f) 10x18, offset 491-514, at +2/-17 - // in regular row-major format - 0x1f, 0x1f, 0xee, 0x1b, 0x03, 0xc0, 0xc0, 0x30, - 0x0c, 0x06, 0x03, 0x81, 0xc0, 0xe0, 0x30, 0x0c, - 0x03, 0x00, 0x00, 0x00, 0x0c, 0x03, 0x00, - // '@' (0x40) 22x21, offset 514-572, at +1/-17 - // in regular row-major format - 0x00, 0xfe, 0x00, 0x0f, 0xfe, 0x00, 0xf0, 0x3e, - 0x07, 0x00, 0x3c, 0x38, 0x00, 0x30, 0xc1, 0xe0, - 0x66, 0x0f, 0xd9, 0xd8, 0x61, 0xc3, 0xc3, 0x07, - 0x0f, 0x1c, 0x1c, 0x3c, 0x60, 0x60, 0xf1, 0x81, - 0x83, 0xc6, 0x06, 0x1b, 0x18, 0x38, 0xee, 0x71, - 0xe7, 0x18, 0xfd, 0xf8, 0x71, 0xe7, 0xc0, 0xe0, - 0x00, 0x01, 0xe0, 0x00, 0x01, 0xff, 0xc0, 0x01, - 0xfc, 0x00, - // 'A' (0x41) 16x18, offset 572-608, at +0/-17 - // in regular row-major format - 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0x07, 0xe0, - 0x06, 0x60, 0x06, 0x60, 0x0e, 0x70, 0x0c, 0x30, - 0x0c, 0x30, 0x1c, 0x38, 0x18, 0x18, 0x1f, 0xf8, - 0x3f, 0xfc, 0x30, 0x1c, 0x30, 0x0c, 0x70, 0x0e, - 0x60, 0x06, 0x60, 0x06, - // 'B' (0x42) 13x18, offset 608-638, at +2/-17 - // in regular row-major format - 0xff, 0xc7, 0xff, 0x30, 0x19, 0x80, 0x6c, 0x03, - 0x60, 0x1b, 0x00, 0xd8, 0x0c, 0xff, 0xc7, 0xff, - 0x30, 0x0d, 0x80, 0x3c, 0x01, 0xe0, 0x0f, 0x00, - 0x78, 0x06, 0xff, 0xf7, 0xfe, 0x00, - // 'C' (0x43) 15x18, offset 638-672, at +1/-17 - // in regular row-major format - 0x07, 0xe0, 0x3f, 0xf0, 0xe0, 0x73, 0x80, 0x66, - 0x00, 0x6c, 0x00, 0x30, 0x00, 0x60, 0x00, 0xc0, - 0x01, 0x80, 0x03, 0x00, 0x06, 0x00, 0x06, 0x00, - 0x6c, 0x00, 0xdc, 0x03, 0x1e, 0x0e, 0x1f, 0xf8, - 0x0f, 0xc0, - // 'D' (0x44) 14x18, offset 672-704, at +2/-17 - // in regular row-major format - 0xff, 0x83, 0xff, 0x8c, 0x07, 0x30, 0x0e, 0xc0, - 0x1b, 0x00, 0x7c, 0x00, 0xf0, 0x03, 0xc0, 0x0f, - 0x00, 0x3c, 0x00, 0xf0, 0x03, 0xc0, 0x1f, 0x00, - 0x6c, 0x03, 0xb0, 0x1c, 0xff, 0xe3, 0xff, 0x00, - // 'E' (0x45) 12x18, offset 704-731, at +2/-17 - // in regular row-major format - 0xff, 0xff, 0xff, 0xc0, 0x0c, 0x00, 0xc0, 0x0c, - 0x00, 0xc0, 0x0c, 0x00, 0xff, 0xef, 0xfe, 0xc0, - 0x0c, 0x00, 0xc0, 0x0c, 0x00, 0xc0, 0x0c, 0x00, - 0xff, 0xff, 0xff, - // 'F' (0x46) 11x18, offset 731-756, at +2/-17 - // in regular row-major format - 0xff, 0xff, 0xff, 0x00, 0x60, 0x0c, 0x01, 0x80, - 0x30, 0x06, 0x00, 0xff, 0xdf, 0xfb, 0x00, 0x60, - 0x0c, 0x01, 0x80, 0x30, 0x06, 0x00, 0xc0, 0x18, - 0x00, - // 'G' (0x47) 16x18, offset 756-792, at +1/-17 - // in regular row-major format - 0x07, 0xf0, 0x1f, 0xfc, 0x3c, 0x1e, 0x70, 0x06, - 0x60, 0x03, 0xe0, 0x00, 0xc0, 0x00, 0xc0, 0x00, - 0xc0, 0x7f, 0xc0, 0x7f, 0xc0, 0x03, 0xc0, 0x03, - 0x60, 0x03, 0x60, 0x07, 0x30, 0x0f, 0x3c, 0x1f, - 0x1f, 0xfb, 0x07, 0xe1, - // 'H' (0x48) 13x18, offset 792-822, at +2/-17 - // in regular row-major format - 0xc0, 0x1e, 0x00, 0xf0, 0x07, 0x80, 0x3c, 0x01, - 0xe0, 0x0f, 0x00, 0x78, 0x03, 0xff, 0xff, 0xff, - 0xf0, 0x07, 0x80, 0x3c, 0x01, 0xe0, 0x0f, 0x00, - 0x78, 0x03, 0xc0, 0x1e, 0x00, 0xc0, - // 'I' (0x49) 2x18, offset 822-827, at +2/-17 - // in regular row-major format - 0xff, 0xff, 0xff, 0xff, 0xf0, - // 'J' (0x4a) 9x18, offset 827-848, at +1/-17 - // in regular row-major format - 0x01, 0x80, 0xc0, 0x60, 0x30, 0x18, 0x0c, 0x06, - 0x03, 0x01, 0x80, 0xc0, 0x60, 0x3c, 0x1e, 0x0f, - 0x07, 0xc7, 0x7f, 0x1f, 0x00, - // 'K' (0x4b) 14x18, offset 848-880, at +2/-17 - // in regular row-major format - 0xc0, 0x3b, 0x01, 0xcc, 0x0e, 0x30, 0x70, 0xc3, - 0x83, 0x1c, 0x0c, 0xe0, 0x33, 0x80, 0xde, 0x03, - 0xdc, 0x0e, 0x38, 0x30, 0x60, 0xc1, 0xc3, 0x03, - 0x8c, 0x06, 0x30, 0x1c, 0xc0, 0x3b, 0x00, 0x60, - // 'L' (0x4c) 10x18, offset 880-903, at +2/-17 - // in regular row-major format - 0xc0, 0x30, 0x0c, 0x03, 0x00, 0xc0, 0x30, 0x0c, - 0x03, 0x00, 0xc0, 0x30, 0x0c, 0x03, 0x00, 0xc0, - 0x30, 0x0c, 0x03, 0x00, 0xff, 0xff, 0xf0, - // 'M' (0x4d) 16x18, offset 903-939, at +2/-17 - // in regular row-major format - 0xe0, 0x07, 0xe0, 0x07, 0xf0, 0x0f, 0xf0, 0x0f, - 0xd0, 0x0f, 0xd8, 0x1b, 0xd8, 0x1b, 0xd8, 0x1b, - 0xcc, 0x33, 0xcc, 0x33, 0xcc, 0x33, 0xc6, 0x63, - 0xc6, 0x63, 0xc6, 0x63, 0xc3, 0xc3, 0xc3, 0xc3, - 0xc3, 0xc3, 0xc1, 0x83, - // 'N' (0x4e) 13x18, offset 939-969, at +2/-17 - // in regular row-major format - 0xe0, 0x1f, 0x00, 0xfc, 0x07, 0xe0, 0x3d, 0x81, - 0xee, 0x0f, 0x30, 0x79, 0xc3, 0xc6, 0x1e, 0x18, - 0xf0, 0xe7, 0x83, 0x3c, 0x1d, 0xe0, 0x6f, 0x01, - 0xf8, 0x0f, 0xc0, 0x3e, 0x01, 0xc0, - // 'O' (0x4f) 17x18, offset 969-1008, at +1/-17 - // in regular row-major format - 0x03, 0xe0, 0x0f, 0xfc, 0x0f, 0x07, 0x86, 0x00, - 0xc6, 0x00, 0x33, 0x00, 0x1b, 0x00, 0x07, 0x80, - 0x03, 0xc0, 0x01, 0xe0, 0x00, 0xf0, 0x00, 0x78, - 0x00, 0x36, 0x00, 0x33, 0x00, 0x18, 0xc0, 0x18, - 0x78, 0x3c, 0x1f, 0xfc, 0x03, 0xf8, 0x00, - // 'P' (0x50) 12x18, offset 1008-1035, at +2/-17 - // in regular row-major format - 0xff, 0x8f, 0xfe, 0xc0, 0x6c, 0x03, 0xc0, 0x3c, - 0x03, 0xc0, 0x3c, 0x07, 0xff, 0xef, 0xfc, 0xc0, - 0x0c, 0x00, 0xc0, 0x0c, 0x00, 0xc0, 0x0c, 0x00, - 0xc0, 0x0c, 0x00, - // 'Q' (0x51) 17x19, offset 1035-1076, at +1/-17 - // in regular row-major format - 0x03, 0xe0, 0x0f, 0xfc, 0x0f, 0x07, 0x86, 0x00, - 0xc6, 0x00, 0x33, 0x00, 0x1b, 0x00, 0x07, 0x80, - 0x03, 0xc0, 0x01, 0xe0, 0x00, 0xf0, 0x00, 0x78, - 0x00, 0x36, 0x00, 0x33, 0x01, 0x98, 0xc0, 0xfc, - 0x78, 0x3c, 0x1f, 0xff, 0x03, 0xf9, 0x80, 0x00, - 0x40, - // 'R' (0x52) 14x18, offset 1076-1108, at +2/-17 - // in regular row-major format - 0xff, 0xc3, 0xff, 0xcc, 0x03, 0xb0, 0x06, 0xc0, - 0x1b, 0x00, 0x6c, 0x01, 0xb0, 0x0c, 0xff, 0xe3, - 0xff, 0xcc, 0x03, 0xb0, 0x06, 0xc0, 0x1b, 0x00, - 0x6c, 0x01, 0xb0, 0x06, 0xc0, 0x1b, 0x00, 0x70, - // 'S' (0x53) 14x18, offset 1108-1140, at +1/-17 - // in regular row-major format - 0x0f, 0xe0, 0x7f, 0xc3, 0x83, 0x9c, 0x07, 0x60, - 0x0d, 0x80, 0x06, 0x00, 0x1e, 0x00, 0x3f, 0x80, - 0x3f, 0xc0, 0x0f, 0x80, 0x07, 0xc0, 0x0f, 0x00, - 0x3e, 0x00, 0xde, 0x0e, 0x3f, 0xf0, 0x3f, 0x80, - // 'T' (0x54) 12x18, offset 1140-1167, at +1/-17 - // in regular row-major format - 0xff, 0xff, 0xff, 0x06, 0x00, 0x60, 0x06, 0x00, - 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, - 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, - 0x06, 0x00, 0x60, - // 'U' (0x55) 13x18, offset 1167-1197, at +2/-17 - // in regular row-major format - 0xc0, 0x1e, 0x00, 0xf0, 0x07, 0x80, 0x3c, 0x01, - 0xe0, 0x0f, 0x00, 0x78, 0x03, 0xc0, 0x1e, 0x00, - 0xf0, 0x07, 0x80, 0x3c, 0x01, 0xe0, 0x0f, 0x80, - 0xee, 0x0e, 0x3f, 0xe0, 0x7c, 0x00, - // 'V' (0x56) 15x18, offset 1197-1231, at +0/-17 - // in regular row-major format - 0x60, 0x06, 0xc0, 0x1d, 0xc0, 0x31, 0x80, 0x63, - 0x01, 0xc7, 0x03, 0x06, 0x06, 0x0c, 0x1c, 0x1c, - 0x30, 0x18, 0x60, 0x31, 0xc0, 0x73, 0x00, 0x66, - 0x00, 0xdc, 0x01, 0xf0, 0x01, 0xe0, 0x03, 0xc0, - 0x07, 0x00, - // 'W' (0x57) 22x18, offset 1231-1281, at +0/-17 - // in regular row-major format - 0xe0, 0x30, 0x1d, 0x80, 0xe0, 0x76, 0x07, 0x81, - 0xd8, 0x1e, 0x06, 0x70, 0x7c, 0x18, 0xc1, 0xb0, - 0xe3, 0x0c, 0xc3, 0x8c, 0x33, 0x0c, 0x38, 0xc6, - 0x30, 0x67, 0x18, 0xc1, 0x98, 0x67, 0x06, 0x61, - 0xd8, 0x1d, 0x83, 0x60, 0x3c, 0x0d, 0x80, 0xf0, - 0x3e, 0x03, 0xc0, 0x70, 0x0f, 0x01, 0xc0, 0x18, - 0x07, 0x00, - // 'X' (0x58) 15x18, offset 1281-1315, at +0/-17 - // in regular row-major format - 0x70, 0x0e, 0x60, 0x38, 0xe0, 0x60, 0xe1, 0xc0, - 0xc3, 0x01, 0xcc, 0x01, 0xf8, 0x01, 0xe0, 0x03, - 0x80, 0x07, 0x80, 0x1f, 0x00, 0x33, 0x00, 0xe7, - 0x03, 0x86, 0x06, 0x0e, 0x1c, 0x0e, 0x70, 0x0c, - 0xc0, 0x1c, - // 'Y' (0x59) 16x18, offset 1315-1351, at +0/-17 - // in regular row-major format - 0x60, 0x06, 0x70, 0x0e, 0x30, 0x1c, 0x38, 0x18, - 0x1c, 0x38, 0x0c, 0x30, 0x0e, 0x70, 0x06, 0x60, - 0x03, 0xc0, 0x03, 0xc0, 0x01, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x01, 0x80, - // 'Z' (0x5a) 13x18, offset 1351-1381, at +1/-17 - // in regular row-major format - 0xff, 0xff, 0xff, 0xc0, 0x0e, 0x00, 0xe0, 0x0e, - 0x00, 0x60, 0x07, 0x00, 0x70, 0x07, 0x00, 0x30, - 0x03, 0x80, 0x38, 0x03, 0x80, 0x18, 0x01, 0xc0, - 0x1c, 0x00, 0xff, 0xff, 0xff, 0xc0, - // '[' (0x5b) 4x23, offset 1381-1393, at +2/-17 - // in regular row-major format - 0xff, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, - 0xcc, 0xcc, 0xcf, 0xf0, - // '\' (0x5c) 7x18, offset 1393-1409, at +0/-17 - // in regular row-major format - 0x81, 0x81, 0x02, 0x06, 0x04, 0x08, 0x18, 0x10, - 0x20, 0x60, 0x40, 0x81, 0x81, 0x02, 0x06, 0x04, - // ']' (0x5d) 4x23, offset 1409-1421, at +1/-17 - // in regular row-major format - 0xff, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, - 0x33, 0x33, 0x3f, 0xf0, - // '^' (0x5e) 9x9, offset 1421-1432, at +1/-16 - // in regular row-major format - 0x0c, 0x0e, 0x05, 0x86, 0xc3, 0x21, 0x19, 0x8c, - 0x83, 0xc1, 0x80, - // '_' (0x5f) 15x1, offset 1432-1434, at -1/+4 - // in regular row-major format - 0xff, 0xfe, - // '`' (0x60) 5x4, offset 1434-1437, at +1/-17 - // in regular row-major format - 0xe3, 0x8c, 0x30, - // 'a' (0x61) 12x13, offset 1437-1457, at +1/-12 - // in regular row-major format - 0x3f, 0x07, 0xf8, 0xe1, 0xcc, 0x0c, 0x00, 0xc0, - 0x1c, 0x3f, 0xcf, 0x8c, 0xc0, 0xcc, 0x0c, 0xe3, - 0xc7, 0xef, 0x3c, 0x70, - // 'b' (0x62) 12x18, offset 1457-1484, at +1/-17 - // in regular row-major format - 0xc0, 0x0c, 0x00, 0xc0, 0x0c, 0x00, 0xc0, 0x0c, - 0xf8, 0xdf, 0xcf, 0x0e, 0xe0, 0x7c, 0x03, 0xc0, - 0x3c, 0x03, 0xc0, 0x3c, 0x03, 0xe0, 0x6f, 0x0e, - 0xdf, 0xcc, 0xf8, - // 'c' (0x63) 10x13, offset 1484-1501, at +1/-12 - // in regular row-major format - 0x1f, 0x0f, 0xe7, 0x1b, 0x83, 0xc0, 0x30, 0x0c, - 0x03, 0x00, 0xc0, 0x38, 0x37, 0x1c, 0xfe, 0x1f, - 0x00, - // 'd' (0x64) 11x18, offset 1501-1526, at +1/-17 - // in regular row-major format - 0x00, 0x60, 0x0c, 0x01, 0x80, 0x30, 0x06, 0x3c, - 0xcf, 0xfb, 0x8f, 0xe0, 0xf8, 0x0f, 0x01, 0xe0, - 0x3c, 0x07, 0x80, 0xf8, 0x3b, 0x8f, 0x3f, 0x63, - 0xcc, - // 'e' (0x65) 11x13, offset 1526-1544, at +1/-12 - // in regular row-major format - 0x1f, 0x07, 0xf1, 0xc7, 0x70, 0x3c, 0x07, 0xff, - 0xff, 0xfe, 0x00, 0xc0, 0x1c, 0x0d, 0xc3, 0x1f, - 0xe1, 0xf0, - // 'f' (0x66) 5x18, offset 1544-1556, at +1/-17 - // in regular row-major format - 0x3b, 0xd8, 0xc6, 0x7f, 0xec, 0x63, 0x18, 0xc6, - 0x31, 0x8c, 0x63, 0x00, - // 'g' (0x67) 11x18, offset 1556-1581, at +1/-12 - // in regular row-major format - 0x1e, 0x67, 0xfd, 0xc7, 0xf0, 0x7c, 0x07, 0x80, - 0xf0, 0x1e, 0x03, 0xc0, 0x7c, 0x1d, 0xc7, 0x9f, - 0xb1, 0xe6, 0x00, 0xc0, 0x3e, 0x0e, 0x7f, 0xc7, - 0xe0, - // 'h' (0x68) 10x18, offset 1581-1604, at +1/-17 - // in regular row-major format - 0xc0, 0x30, 0x0c, 0x03, 0x00, 0xc0, 0x33, 0xcd, - 0xfb, 0xc7, 0xe0, 0xf0, 0x3c, 0x0f, 0x03, 0xc0, - 0xf0, 0x3c, 0x0f, 0x03, 0xc0, 0xf0, 0x30, - // 'i' (0x69) 2x18, offset 1604-1609, at +2/-17 - // in regular row-major format - 0xf0, 0x3f, 0xff, 0xff, 0xf0, - // 'j' (0x6a) 4x23, offset 1609-1621, at +0/-17 - // in regular row-major format - 0x33, 0x00, 0x03, 0x33, 0x33, 0x33, 0x33, 0x33, - 0x33, 0x33, 0x3f, 0xe0, - // 'k' (0x6b) 11x18, offset 1621-1646, at +1/-17 - // in regular row-major format - 0xc0, 0x18, 0x03, 0x00, 0x60, 0x0c, 0x01, 0x83, - 0x30, 0xc6, 0x30, 0xcc, 0x1b, 0x83, 0xf0, 0x77, - 0x0c, 0x61, 0x8e, 0x30, 0xe6, 0x0c, 0xc1, 0xd8, - 0x18, - // 'l' (0x6c) 2x18, offset 1646-1651, at +1/-17 - // in regular row-major format - 0xff, 0xff, 0xff, 0xff, 0xf0, - // 'm' (0x6d) 17x13, offset 1651-1679, at +1/-12 - // in regular row-major format - 0xcf, 0x1f, 0x6f, 0xdf, 0xfc, 0x78, 0xfc, 0x18, - 0x3c, 0x0c, 0x1e, 0x06, 0x0f, 0x03, 0x07, 0x81, - 0x83, 0xc0, 0xc1, 0xe0, 0x60, 0xf0, 0x30, 0x78, - 0x18, 0x3c, 0x0c, 0x18, - // 'n' (0x6e) 10x13, offset 1679-1696, at +1/-12 - // in regular row-major format - 0xcf, 0x37, 0xef, 0x1f, 0x83, 0xc0, 0xf0, 0x3c, - 0x0f, 0x03, 0xc0, 0xf0, 0x3c, 0x0f, 0x03, 0xc0, - 0xc0, - // 'o' (0x6f) 11x13, offset 1696-1714, at +1/-12 - // in regular row-major format - 0x1f, 0x07, 0xf1, 0xc7, 0x70, 0x7c, 0x07, 0x80, - 0xf0, 0x1e, 0x03, 0xc0, 0x7c, 0x1d, 0xc7, 0x1f, - 0xc1, 0xf0, - // 'p' (0x70) 12x17, offset 1714-1740, at +1/-12 - // in regular row-major format - 0xcf, 0x8d, 0xfc, 0xf0, 0xee, 0x06, 0xc0, 0x3c, - 0x03, 0xc0, 0x3c, 0x03, 0xc0, 0x3e, 0x07, 0xf0, - 0xef, 0xfc, 0xcf, 0x8c, 0x00, 0xc0, 0x0c, 0x00, - 0xc0, 0x00, - // 'q' (0x71) 11x17, offset 1740-1764, at +1/-12 - // in regular row-major format - 0x1e, 0x67, 0xfd, 0xc7, 0xf0, 0x7c, 0x07, 0x80, - 0xf0, 0x1e, 0x03, 0xc0, 0x7c, 0x1d, 0xc7, 0x9f, - 0xf1, 0xe6, 0x00, 0xc0, 0x18, 0x03, 0x00, 0x60, - // 'r' (0x72) 6x13, offset 1764-1774, at +1/-12 - // in regular row-major format - 0xcf, 0x7f, 0x38, 0xc3, 0x0c, 0x30, 0xc3, 0x0c, - 0x30, 0xc0, - // 's' (0x73) 10x13, offset 1774-1791, at +1/-12 - // in regular row-major format - 0x3e, 0x1f, 0xee, 0x1b, 0x00, 0xc0, 0x3c, 0x07, - 0xf0, 0x3e, 0x01, 0xf0, 0x3e, 0x1d, 0xfe, 0x3e, - 0x00, - // 't' (0x74) 5x16, offset 1791-1801, at +1/-15 - // in regular row-major format - 0x63, 0x19, 0xff, 0xb1, 0x8c, 0x63, 0x18, 0xc6, - 0x31, 0xe7, - // 'u' (0x75) 10x13, offset 1801-1818, at +1/-12 - // in regular row-major format - 0xc0, 0xf0, 0x3c, 0x0f, 0x03, 0xc0, 0xf0, 0x3c, - 0x0f, 0x03, 0xc0, 0xf0, 0x7e, 0x3d, 0xfb, 0x3c, - 0xc0, - // 'v' (0x76) 12x13, offset 1818-1838, at +0/-12 - // in regular row-major format - 0xe0, 0x66, 0x06, 0x60, 0x67, 0x0c, 0x30, 0xc3, - 0x0c, 0x39, 0x81, 0x98, 0x19, 0x81, 0xf0, 0x0f, - 0x00, 0xe0, 0x0e, 0x00, - // 'w' (0x77) 17x13, offset 1838-1866, at +0/-12 - // in regular row-major format - 0xc1, 0xc1, 0xb0, 0xe1, 0xd8, 0x70, 0xcc, 0x2c, - 0x66, 0x36, 0x31, 0x9b, 0x18, 0xcd, 0x98, 0x64, - 0x6c, 0x16, 0x36, 0x0f, 0x1a, 0x07, 0x8f, 0x03, - 0x83, 0x80, 0xc1, 0xc0, - // 'x' (0x78) 11x13, offset 1866-1884, at +0/-12 - // in regular row-major format - 0x60, 0xee, 0x18, 0xc6, 0x0c, 0xc1, 0xf0, 0x1c, - 0x01, 0x80, 0x78, 0x1b, 0x03, 0x30, 0xc7, 0x30, - 0x66, 0x06, - // 'y' (0x79) 11x18, offset 1884-1909, at +0/-12 - // in regular row-major format - 0xe0, 0x6c, 0x0d, 0x83, 0x38, 0x63, 0x0c, 0x63, - 0x0e, 0x60, 0xcc, 0x1b, 0x03, 0x60, 0x3c, 0x07, - 0x00, 0xe0, 0x18, 0x03, 0x00, 0xe0, 0x78, 0x0e, - 0x00, - // 'z' (0x7a) 10x13, offset 1909-1926, at +1/-12 - // in regular row-major format - 0xff, 0xff, 0xf0, 0x18, 0x0c, 0x07, 0x03, 0x81, - 0xc0, 0x60, 0x30, 0x18, 0x0e, 0x03, 0xff, 0xff, - 0xc0, - // '{' (0x7b) 5x23, offset 1926-1941, at +1/-17 - // in regular row-major format - 0x19, 0xcc, 0x63, 0x18, 0xc6, 0x31, 0x99, 0x86, - 0x18, 0xc6, 0x31, 0x8c, 0x63, 0x1c, 0x60, - // '|' (0x7c) 2x23, offset 1941-1947, at +2/-17 - // in regular row-major format - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - // '}' (0x7d) 5x23, offset 1947-1962, at +2/-17 - // in regular row-major format - 0xc7, 0x18, 0xc6, 0x31, 0x8c, 0x63, 0x0c, 0x33, - 0x31, 0x8c, 0x63, 0x18, 0xc6, 0x73, 0x00, -}; - - -static const uint8_t FreeMono9pt7b_generic[] = { - // ' ' (0x20) 0x0, offset 0-0, at +0/+1 - // in regular row-major format - // '!' (0x21) 2x11, offset 0-3, at +4/-10 - // in regular row-major format - 0xaa, 0xa8, 0x0c, - // '"' (0x22) 6x5, offset 3-7, at +2/-10 - // in regular row-major format - 0xed, 0x24, 0x92, 0x48, - // '#' (0x23) 7x12, offset 7-18, at +2/-10 - // in regular row-major format - 0x24, 0x48, 0x91, 0x2f, 0xe4, 0x89, 0x7f, 0x28, - 0x51, 0x22, 0x40, - // '$' (0x24) 8x12, offset 18-30, at +1/-10 - // in regular row-major format - 0x08, 0x3e, 0x62, 0x40, 0x30, 0x0e, 0x01, 0x81, - 0xc3, 0xbe, 0x08, 0x08, - // '%' (0x25) 7x11, offset 30-40, at +2/-10 - // in regular row-major format - 0x71, 0x12, 0x23, 0x80, 0x23, 0xb8, 0x0e, 0x22, - 0x44, 0x70, - // '&' (0x26) 7x10, offset 40-49, at +2/-9 - // in regular row-major format - 0x38, 0x81, 0x02, 0x06, 0x1a, 0x65, 0x46, 0xc8, - 0xec, - // ''' (0x27) 3x5, offset 49-51, at +4/-10 - // in regular row-major format - 0xe9, 0x24, - // '(' (0x28) 2x13, offset 51-55, at +5/-10 - // in regular row-major format - 0x5a, 0xaa, 0xa9, 0x40, - // ')' (0x29) 2x13, offset 55-59, at +4/-10 - // in regular row-major format - 0xa9, 0x55, 0x5a, 0x80, - // '*' (0x2a) 7x7, offset 59-66, at +2/-10 - // in regular row-major format - 0x10, 0x22, 0x4b, 0xe3, 0x05, 0x11, 0x00, - // '+' (0x2b) 7x7, offset 66-73, at +2/-8 - // in regular row-major format - 0x10, 0x20, 0x47, 0xf1, 0x02, 0x04, 0x00, - // ',' (0x2c) 3x5, offset 73-75, at +2/-1 - // in regular row-major format - 0x6b, 0x48, - // '-' (0x2d) 9x1, offset 75-77, at +1/-5 - // in regular row-major format - 0xff, 0x00, - // '.' (0x2e) 2x2, offset 77-78, at +4/-1 - // in regular row-major format - 0xf0, - // '/' (0x2f) 7x13, offset 78-90, at +2/-11 - // in regular row-major format - 0x02, 0x08, 0x10, 0x60, 0x81, 0x04, 0x08, 0x20, - 0x41, 0x02, 0x08, 0x00, - // '0' (0x30) 7x11, offset 90-100, at +2/-10 - // in regular row-major format - 0x38, 0x8a, 0x0c, 0x18, 0x30, 0x60, 0xc1, 0x82, - 0x88, 0xe0, - // '1' (0x31) 5x11, offset 100-107, at +3/-10 - // in regular row-major format - 0x27, 0x28, 0x42, 0x10, 0x84, 0x21, 0x3e, - // '2' (0x32) 7x11, offset 107-117, at +2/-10 - // in regular row-major format - 0x38, 0x8a, 0x08, 0x10, 0x20, 0x82, 0x08, 0x61, - 0x03, 0xf8, - // '3' (0x33) 8x11, offset 117-128, at +1/-10 - // in regular row-major format - 0x7c, 0x06, 0x02, 0x02, 0x1c, 0x06, 0x01, 0x01, - 0x01, 0x42, 0x3c, - // '4' (0x34) 6x11, offset 128-137, at +3/-10 - // in regular row-major format - 0x18, 0xa2, 0x92, 0x8a, 0x28, 0xbf, 0x08, 0x21, - 0xc0, - // '5' (0x35) 7x11, offset 137-147, at +2/-10 - // in regular row-major format - 0x7c, 0x81, 0x03, 0xe4, 0x40, 0x40, 0x81, 0x03, - 0x88, 0xe0, - // '6' (0x36) 7x11, offset 147-157, at +2/-10 - // in regular row-major format - 0x1e, 0x41, 0x04, 0x0b, 0x98, 0xb0, 0xc1, 0xc2, - 0x88, 0xe0, - // '7' (0x37) 7x11, offset 157-167, at +2/-10 - // in regular row-major format - 0xfe, 0x04, 0x08, 0x20, 0x40, 0x82, 0x04, 0x08, - 0x20, 0x40, - // '8' (0x38) 7x11, offset 167-177, at +2/-10 - // in regular row-major format - 0x38, 0x8a, 0x0c, 0x14, 0x47, 0x11, 0x41, 0x83, - 0x8c, 0xe0, - // '9' (0x39) 7x11, offset 177-187, at +2/-10 - // in regular row-major format - 0x38, 0x8a, 0x1c, 0x18, 0x68, 0xce, 0x81, 0x04, - 0x13, 0xc0, - // ':' (0x3a) 2x8, offset 187-189, at +4/-7 - // in regular row-major format - 0xf0, 0x0f, - // ';' (0x3b) 3x11, offset 189-194, at +3/-7 - // in regular row-major format - 0x6c, 0x00, 0xd2, 0xd2, 0x00, - // '<' (0x3c) 8x8, offset 194-202, at +1/-8 - // in regular row-major format - 0x03, 0x04, 0x18, 0x60, 0x60, 0x18, 0x04, 0x03, - // '=' (0x3d) 9x4, offset 202-207, at +1/-6 - // in regular row-major format - 0xff, 0x80, 0x00, 0x1f, 0xf0, - // '>' (0x3e) 9x8, offset 207-216, at +1/-8 - // in regular row-major format - 0x40, 0x18, 0x03, 0x00, 0x60, 0x20, 0x60, 0xc0, - 0x80, - // '?' (0x3f) 7x10, offset 216-225, at +2/-9 - // in regular row-major format - 0x3d, 0x84, 0x08, 0x30, 0xc2, 0x00, 0x00, 0x00, - 0x30, - // '@' (0x40) 8x12, offset 225-237, at +2/-10 - // in regular row-major format - 0x3c, 0x46, 0x82, 0x8e, 0xb2, 0xa2, 0xa2, 0x9f, - 0x80, 0x80, 0x40, 0x3c, - // 'A' (0x41) 11x10, offset 237-251, at +0/-9 - // in regular row-major format - 0x3c, 0x01, 0x40, 0x28, 0x09, 0x01, 0x10, 0x42, - 0x0f, 0xc1, 0x04, 0x40, 0x9e, 0x3c, - // 'B' (0x42) 9x10, offset 251-263, at +1/-9 - // in regular row-major format - 0xfe, 0x21, 0x90, 0x48, 0x67, 0xe2, 0x09, 0x02, - 0x81, 0x41, 0xff, 0x80, - // 'C' (0x43) 9x10, offset 263-275, at +1/-9 - // in regular row-major format - 0x3e, 0xb0, 0xf0, 0x30, 0x08, 0x04, 0x02, 0x00, - 0x80, 0x60, 0x8f, 0x80, - // 'D' (0x44) 9x10, offset 275-287, at +1/-9 - // in regular row-major format - 0xfe, 0x21, 0x90, 0x68, 0x14, 0x0a, 0x05, 0x02, - 0x83, 0x43, 0x7f, 0x00, - // 'E' (0x45) 9x10, offset 287-299, at +1/-9 - // in regular row-major format - 0xff, 0x20, 0x90, 0x08, 0x87, 0xc2, 0x21, 0x00, - 0x81, 0x40, 0xff, 0xc0, - // 'F' (0x46) 9x10, offset 299-311, at +1/-9 - // in regular row-major format - 0xff, 0xa0, 0x50, 0x08, 0x87, 0xc2, 0x21, 0x00, - 0x80, 0x40, 0x78, 0x00, - // 'G' (0x47) 10x10, offset 311-324, at +1/-9 - // in regular row-major format - 0x1e, 0x98, 0x6c, 0x0a, 0x00, 0x80, 0x20, 0xf8, - 0x0b, 0x02, 0x60, 0x87, 0xc0, - // 'H' (0x48) 9x10, offset 324-336, at +1/-9 - // in regular row-major format - 0xe3, 0xa0, 0x90, 0x48, 0x27, 0xf2, 0x09, 0x04, - 0x82, 0x41, 0x71, 0xc0, - // 'I' (0x49) 5x10, offset 336-343, at +3/-9 - // in regular row-major format - 0xf9, 0x08, 0x42, 0x10, 0x84, 0x27, 0xc0, - // 'J' (0x4a) 8x10, offset 343-353, at +2/-9 - // in regular row-major format - 0x1f, 0x02, 0x02, 0x02, 0x02, 0x02, 0x82, 0x82, - 0xc6, 0x78, - // 'K' (0x4b) 9x10, offset 353-365, at +1/-9 - // in regular row-major format - 0xe3, 0xa1, 0x11, 0x09, 0x05, 0x83, 0x21, 0x08, - 0x84, 0x41, 0x70, 0xc0, - // 'L' (0x4c) 8x10, offset 365-375, at +2/-9 - // in regular row-major format - 0xe0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x41, 0x41, - 0x41, 0xff, - // 'M' (0x4d) 11x10, offset 375-389, at +0/-9 - // in regular row-major format - 0xe0, 0xec, 0x19, 0x45, 0x28, 0xa4, 0xa4, 0x94, - 0x91, 0x12, 0x02, 0x40, 0x5c, 0x1c, - // 'N' (0x4e) 9x10, offset 389-401, at +1/-9 - // in regular row-major format - 0xc3, 0xb0, 0x94, 0x4a, 0x24, 0x92, 0x49, 0x14, - 0x8a, 0x43, 0x70, 0x80, - // 'O' (0x4f) 9x10, offset 401-413, at +1/-9 - // in regular row-major format - 0x1e, 0x31, 0x90, 0x50, 0x18, 0x0c, 0x06, 0x02, - 0x82, 0x63, 0x0f, 0x00, - // 'P' (0x50) 8x10, offset 413-423, at +1/-9 - // in regular row-major format - 0xfe, 0x43, 0x41, 0x41, 0x42, 0x7c, 0x40, 0x40, - 0x40, 0xf0, - // 'Q' (0x51) 9x13, offset 423-438, at +1/-9 - // in regular row-major format - 0x1c, 0x31, 0x90, 0x50, 0x18, 0x0c, 0x06, 0x02, - 0x82, 0x63, 0x1f, 0x04, 0x07, 0x92, 0x30, - // 'R' (0x52) 9x10, offset 438-450, at +1/-9 - // in regular row-major format - 0xfe, 0x21, 0x90, 0x48, 0x24, 0x23, 0xe1, 0x10, - 0x84, 0x41, 0x70, 0xc0, - // 'S' (0x53) 7x10, offset 450-459, at +2/-9 - // in regular row-major format - 0x3a, 0xcd, 0x0a, 0x03, 0x01, 0x80, 0xc1, 0xc7, - 0x78, - // 'T' (0x54) 9x10, offset 459-471, at +1/-9 - // in regular row-major format - 0xff, 0xc4, 0x62, 0x21, 0x00, 0x80, 0x40, 0x20, - 0x10, 0x08, 0x1f, 0x00, - // 'U' (0x55) 9x10, offset 471-483, at +1/-9 - // in regular row-major format - 0xe3, 0xa0, 0x90, 0x48, 0x24, 0x12, 0x09, 0x04, - 0x82, 0x22, 0x0e, 0x00, - // 'V' (0x56) 11x10, offset 483-497, at +0/-9 - // in regular row-major format - 0xf1, 0xe8, 0x10, 0x82, 0x10, 0x42, 0x10, 0x22, - 0x04, 0x80, 0x50, 0x0c, 0x00, 0x80, - // 'W' (0x57) 11x10, offset 497-511, at +0/-9 - // in regular row-major format - 0xf1, 0xe8, 0x09, 0x11, 0x25, 0x44, 0xa8, 0x55, - 0x0c, 0xa1, 0x8c, 0x31, 0x84, 0x30, - // 'X' (0x58) 9x10, offset 511-523, at +1/-9 - // in regular row-major format - 0xe3, 0xa0, 0x88, 0x82, 0x80, 0x80, 0xc0, 0x90, - 0x44, 0x41, 0x71, 0xc0, - // 'Y' (0x59) 9x10, offset 523-535, at +1/-9 - // in regular row-major format - 0xe3, 0xa0, 0x88, 0x82, 0x81, 0x40, 0x40, 0x20, - 0x10, 0x08, 0x1f, 0x00, - // 'Z' (0x5a) 7x10, offset 535-544, at +2/-9 - // in regular row-major format - 0xfd, 0x0a, 0x20, 0x81, 0x04, 0x10, 0x21, 0x83, - 0xfc, - // '[' (0x5b) 2x13, offset 544-548, at +5/-10 - // in regular row-major format - 0xea, 0xaa, 0xaa, 0xc0, - // '\' (0x5c) 7x13, offset 548-560, at +2/-11 - // in regular row-major format - 0x80, 0x81, 0x03, 0x02, 0x04, 0x04, 0x08, 0x08, - 0x10, 0x10, 0x20, 0x20, - // ']' (0x5d) 2x13, offset 560-564, at +4/-10 - // in regular row-major format - 0xd5, 0x55, 0x55, 0xc0, - // '^' (0x5e) 7x5, offset 564-569, at +2/-10 - // in regular row-major format - 0x10, 0x51, 0x22, 0x28, 0x20, - // '_' (0x5f) 11x1, offset 569-571, at +0/+2 - // in regular row-major format - 0xff, 0xe0, - // '`' (0x60) 3x3, offset 571-573, at +3/-11 - // in regular row-major format - 0x88, 0x80, - // 'a' (0x61) 9x8, offset 573-582, at +1/-7 - // in regular row-major format - 0x7e, 0x00, 0x80, 0x47, 0xec, 0x14, 0x0a, 0x0c, - 0xfb, - // 'b' (0x62) 9x11, offset 582-595, at +1/-10 - // in regular row-major format - 0xc0, 0x20, 0x10, 0x0b, 0xc6, 0x12, 0x05, 0x02, - 0x81, 0x40, 0xb0, 0xb7, 0x80, - // 'c' (0x63) 7x8, offset 595-602, at +2/-7 - // in regular row-major format - 0x3a, 0x8e, 0x0c, 0x08, 0x10, 0x10, 0x9e, - // 'd' (0x64) 9x11, offset 602-615, at +1/-10 - // in regular row-major format - 0x03, 0x00, 0x80, 0x47, 0xa4, 0x34, 0x0a, 0x05, - 0x02, 0x81, 0x21, 0x8f, 0x60, - // 'e' (0x65) 8x8, offset 615-623, at +1/-7 - // in regular row-major format - 0x3c, 0x43, 0x81, 0xff, 0x80, 0x80, 0x61, 0x3e, - // 'f' (0x66) 6x11, offset 623-632, at +3/-10 - // in regular row-major format - 0x3d, 0x04, 0x3e, 0x41, 0x04, 0x10, 0x41, 0x0f, - 0x80, - // 'g' (0x67) 9x11, offset 632-645, at +1/-7 - // in regular row-major format - 0x3d, 0xa1, 0xa0, 0x50, 0x28, 0x14, 0x09, 0x0c, - 0x7a, 0x01, 0x01, 0x87, 0x80, - // 'h' (0x68) 9x11, offset 645-658, at +1/-10 - // in regular row-major format - 0xc0, 0x20, 0x10, 0x0b, 0xc6, 0x32, 0x09, 0x04, - 0x82, 0x41, 0x20, 0xb8, 0xe0, - // 'i' (0x69) 7x10, offset 658-667, at +2/-9 - // in regular row-major format - 0x10, 0x01, 0xc0, 0x81, 0x02, 0x04, 0x08, 0x11, - 0xfc, - // 'j' (0x6a) 5x13, offset 667-676, at +3/-9 - // in regular row-major format - 0x10, 0x3e, 0x10, 0x84, 0x21, 0x08, 0x42, 0x3f, - 0x00, - // 'k' (0x6b) 8x11, offset 676-687, at +2/-10 - // in regular row-major format - 0xc0, 0x40, 0x40, 0x4f, 0x44, 0x58, 0x70, 0x48, - 0x44, 0x42, 0xc7, - // 'l' (0x6c) 7x11, offset 687-697, at +2/-10 - // in regular row-major format - 0x70, 0x20, 0x40, 0x81, 0x02, 0x04, 0x08, 0x10, - 0x23, 0xf8, - // 'm' (0x6d) 9x8, offset 697-706, at +1/-7 - // in regular row-major format - 0xb7, 0x64, 0x62, 0x31, 0x18, 0x8c, 0x46, 0x23, - 0x91, - // 'n' (0x6e) 9x8, offset 706-715, at +1/-7 - // in regular row-major format - 0x5e, 0x31, 0x90, 0x48, 0x24, 0x12, 0x09, 0x05, - 0xc7, - // 'o' (0x6f) 9x8, offset 715-724, at +1/-7 - // in regular row-major format - 0x3e, 0x31, 0xa0, 0x30, 0x18, 0x0c, 0x05, 0x8c, - 0x7c, - // 'p' (0x70) 9x11, offset 724-737, at +1/-7 - // in regular row-major format - 0xde, 0x30, 0x90, 0x28, 0x14, 0x0a, 0x05, 0x84, - 0xbc, 0x40, 0x20, 0x38, 0x00, - // 'q' (0x71) 9x11, offset 737-750, at +1/-7 - // in regular row-major format - 0x3d, 0xa1, 0xa0, 0x50, 0x28, 0x14, 0x09, 0x0c, - 0x7a, 0x01, 0x00, 0x80, 0xe0, - // 'r' (0x72) 7x8, offset 750-757, at +3/-7 - // in regular row-major format - 0xce, 0xa1, 0x82, 0x04, 0x08, 0x10, 0x7c, - // 's' (0x73) 7x8, offset 757-764, at +2/-7 - // in regular row-major format - 0x3a, 0x8d, 0x0b, 0x80, 0xf0, 0x70, 0xde, - // 't' (0x74) 8x10, offset 764-774, at +2/-9 - // in regular row-major format - 0x40, 0x40, 0xfc, 0x40, 0x40, 0x40, 0x40, 0x40, - 0x41, 0x3e, - // 'u' (0x75) 8x8, offset 774-782, at +1/-7 - // in regular row-major format - 0xc3, 0x41, 0x41, 0x41, 0x41, 0x41, 0x43, 0x3d, - // 'v' (0x76) 9x8, offset 782-791, at +1/-7 - // in regular row-major format - 0xe3, 0xa0, 0x90, 0x84, 0x42, 0x20, 0xa0, 0x50, - 0x10, - // 'w' (0x77) 9x8, offset 791-800, at +1/-7 - // in regular row-major format - 0xe3, 0xc0, 0x92, 0x4b, 0x25, 0x92, 0xa9, 0x98, - 0x44, - // 'x' (0x78) 9x8, offset 800-809, at +1/-7 - // in regular row-major format - 0xe3, 0x31, 0x05, 0x01, 0x01, 0x41, 0x11, 0x05, - 0xc7, - // 'y' (0x79) 9x11, offset 809-822, at +1/-7 - // in regular row-major format - 0xe3, 0xa0, 0x90, 0x84, 0x42, 0x40, 0xa0, 0x60, - 0x10, 0x10, 0x08, 0x3e, 0x00, - // 'z' (0x7a) 7x8, offset 822-829, at +2/-7 - // in regular row-major format - 0xfd, 0x08, 0x20, 0x82, 0x08, 0x10, 0xbf, - // '{' (0x7b) 3x13, offset 829-834, at +4/-10 - // in regular row-major format - 0x29, 0x24, 0xa2, 0x49, 0x26, - // '|' (0x7c) 1x13, offset 834-836, at +5/-10 - // in regular row-major format - 0xff, 0xf8, - // '}' (0x7d) 3x13, offset 836-841, at +4/-10 - // in regular row-major format - 0x89, 0x24, 0x8a, 0x49, 0x2c, -}; - - -static const uint8_t FreeMono12pt7b_generic[] = { - // ' ' (0x20) 0x0, offset 0-0, at +0/+1 - // in regular row-major format - // '!' (0x21) 3x15, offset 0-6, at +6/-14 - // in regular row-major format - 0x49, 0x24, 0x92, 0x48, 0x01, 0xf8, - // '"' (0x22) 8x7, offset 6-13, at +3/-14 - // in regular row-major format - 0xe7, 0xe7, 0x67, 0x42, 0x42, 0x42, 0x42, - // '#' (0x23) 10x16, offset 13-33, at +2/-14 - // in regular row-major format - 0x09, 0x02, 0x41, 0x10, 0x44, 0x11, 0x1f, 0xf1, - 0x10, 0x4c, 0x12, 0x3f, 0xe1, 0x20, 0x48, 0x12, - 0x04, 0x81, 0x20, 0x48, - // '$' (0x24) 10x17, offset 33-55, at +2/-14 - // in regular row-major format - 0x04, 0x07, 0xa2, 0x19, 0x02, 0x40, 0x10, 0x03, - 0x00, 0x3c, 0x00, 0x80, 0x10, 0x06, 0x01, 0xe0, - 0xa7, 0xc0, 0x40, 0x10, 0x04, 0x00, - // '%' (0x25) 10x15, offset 55-74, at +2/-14 - // in regular row-major format - 0x3c, 0x19, 0x84, 0x21, 0x08, 0x66, 0x0f, 0x00, - 0x0c, 0x1c, 0x78, 0x01, 0xe0, 0xcc, 0x21, 0x08, - 0x43, 0x30, 0x78, - // '&' (0x26) 9x12, offset 74-88, at +3/-11 - // in regular row-major format - 0x3e, 0x30, 0x10, 0x08, 0x02, 0x03, 0x03, 0x47, - 0x14, 0x8a, 0x43, 0x11, 0x8f, 0x60, - // ''' (0x27) 3x7, offset 88-91, at +5/-14 - // in regular row-major format - 0xfd, 0xa4, 0x90, - // '(' (0x28) 3x18, offset 91-98, at +7/-14 - // in regular row-major format - 0x05, 0x25, 0x24, 0x92, 0x48, 0x92, 0x24, - // ')' (0x29) 3x18, offset 98-105, at +4/-14 - // in regular row-major format - 0x11, 0x24, 0x89, 0x24, 0x92, 0x92, 0x90, - // '*' (0x2a) 9x9, offset 105-116, at +3/-14 - // in regular row-major format - 0x00, 0x04, 0x02, 0x11, 0x07, 0xf0, 0xc0, 0x50, - 0x48, 0x42, 0x00, - // '+' (0x2b) 9x11, offset 116-129, at +3/-11 - // in regular row-major format - 0x08, 0x04, 0x02, 0x01, 0x00, 0x87, 0xfc, 0x20, - 0x10, 0x08, 0x04, 0x02, 0x00, - // ',' (0x2c) 5x7, offset 129-134, at +3/-3 - // in regular row-major format - 0x3b, 0x9c, 0xce, 0x62, 0x00, - // '-' (0x2d) 11x1, offset 134-136, at +2/-6 - // in regular row-major format - 0xff, 0xe0, - // '.' (0x2e) 3x3, offset 136-138, at +5/-2 - // in regular row-major format - 0xff, 0x80, - // '/' (0x2f) 9x18, offset 138-159, at +3/-15 - // in regular row-major format - 0x00, 0x80, 0xc0, 0x40, 0x20, 0x20, 0x10, 0x10, - 0x08, 0x08, 0x04, 0x04, 0x02, 0x02, 0x01, 0x01, - 0x00, 0x80, 0x80, 0x40, 0x00, - // '0' (0x30) 9x15, offset 159-176, at +3/-14 - // in regular row-major format - 0x1c, 0x31, 0x90, 0x58, 0x38, 0x0c, 0x06, 0x03, - 0x01, 0x80, 0xc0, 0x60, 0x30, 0x34, 0x13, 0x18, - 0x70, - // '1' (0x31) 7x14, offset 176-189, at +4/-13 - // in regular row-major format - 0x30, 0xe1, 0x44, 0x81, 0x02, 0x04, 0x08, 0x10, - 0x20, 0x40, 0x81, 0x1f, 0xc0, - // '2' (0x32) 9x15, offset 189-206, at +2/-14 - // in regular row-major format - 0x1e, 0x10, 0x90, 0x68, 0x10, 0x08, 0x0c, 0x04, - 0x04, 0x04, 0x06, 0x06, 0x06, 0x06, 0x0e, 0x07, - 0xfe, - // '3' (0x33) 10x15, offset 206-225, at +2/-14 - // in regular row-major format - 0x3e, 0x10, 0x40, 0x08, 0x02, 0x00, 0x80, 0x40, - 0xe0, 0x04, 0x00, 0x80, 0x10, 0x04, 0x01, 0x00, - 0xd8, 0x63, 0xe0, - // '4' (0x34) 8x15, offset 225-240, at +3/-14 - // in regular row-major format - 0x06, 0x0a, 0x0a, 0x12, 0x22, 0x22, 0x42, 0x42, - 0x82, 0x82, 0xff, 0x02, 0x02, 0x02, 0x0f, - // '5' (0x35) 9x15, offset 240-257, at +3/-14 - // in regular row-major format - 0x7f, 0x20, 0x10, 0x08, 0x04, 0x02, 0xf1, 0x8c, - 0x03, 0x00, 0x80, 0x40, 0x20, 0x18, 0x16, 0x18, - 0xf0, - // '6' (0x36) 9x15, offset 257-274, at +3/-14 - // in regular row-major format - 0x0f, 0x8c, 0x08, 0x08, 0x04, 0x04, 0x02, 0x79, - 0x46, 0xc1, 0xe0, 0x60, 0x28, 0x14, 0x19, 0x08, - 0x78, - // '7' (0x37) 8x15, offset 274-289, at +3/-14 - // in regular row-major format - 0xff, 0x81, 0x81, 0x02, 0x02, 0x02, 0x02, 0x04, - 0x04, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, - // '8' (0x38) 9x15, offset 289-306, at +3/-14 - // in regular row-major format - 0x3e, 0x31, 0xb0, 0x70, 0x18, 0x0c, 0x05, 0x8c, - 0x38, 0x63, 0x40, 0x60, 0x30, 0x18, 0x1b, 0x18, - 0xf8, - // '9' (0x39) 9x15, offset 306-323, at +3/-14 - // in regular row-major format - 0x3c, 0x31, 0x30, 0x50, 0x28, 0x0c, 0x0f, 0x06, - 0x85, 0x3c, 0x80, 0x40, 0x40, 0x20, 0x20, 0x63, - 0xe0, - // ':' (0x3a) 3x10, offset 323-327, at +5/-9 - // in regular row-major format - 0xff, 0x80, 0x07, 0xfc, - // ';' (0x3b) 5x13, offset 327-336, at +3/-9 - // in regular row-major format - 0x39, 0xce, 0x00, 0x00, 0x06, 0x33, 0x98, 0xc4, - 0x00, - // '<' (0x3c) 11x11, offset 336-352, at +2/-11 - // in regular row-major format - 0x00, 0xc0, 0x60, 0x18, 0x0c, 0x06, 0x01, 0x80, - 0x0c, 0x00, 0x60, 0x03, 0x00, 0x30, 0x01, 0x00, - // '=' (0x3d) 12x4, offset 352-358, at +1/-8 - // in regular row-major format - 0xff, 0xf0, 0x00, 0x00, 0x0f, 0xff, - // '>' (0x3e) 11x11, offset 358-374, at +2/-11 - // in regular row-major format - 0xc0, 0x06, 0x00, 0x30, 0x01, 0x80, 0x18, 0x01, - 0x80, 0xc0, 0x30, 0x18, 0x0c, 0x02, 0x00, 0x00, - // '?' (0x3f) 9x14, offset 374-390, at +3/-13 - // in regular row-major format - 0x3e, 0x60, 0xa0, 0x20, 0x10, 0x08, 0x08, 0x18, - 0x10, 0x08, 0x00, 0x00, 0x00, 0x01, 0xc0, 0xe0, - // '@' (0x40) 9x16, offset 390-408, at +3/-14 - // in regular row-major format - 0x1c, 0x31, 0x10, 0x50, 0x28, 0x14, 0x3a, 0x25, - 0x22, 0x91, 0x4c, 0xa3, 0xf0, 0x08, 0x02, 0x01, - 0x80, 0x7c, - // 'A' (0x41) 14x14, offset 408-433, at +0/-13 - // in regular row-major format - 0x3f, 0x00, 0x0c, 0x00, 0x48, 0x01, 0x20, 0x04, - 0x40, 0x21, 0x00, 0x84, 0x04, 0x08, 0x1f, 0xe0, - 0x40, 0x82, 0x01, 0x08, 0x04, 0x20, 0x13, 0xe1, - 0xf0, - // 'B' (0x42) 11x14, offset 433-453, at +2/-13 - // in regular row-major format - 0xff, 0x08, 0x11, 0x01, 0x20, 0x24, 0x04, 0x81, - 0x1f, 0xc2, 0x06, 0x40, 0x68, 0x05, 0x00, 0xa0, - 0x14, 0x05, 0xff, 0x00, - // 'C' (0x43) 10x14, offset 453-471, at +2/-13 - // in regular row-major format - 0x1e, 0x48, 0x74, 0x05, 0x01, 0x80, 0x20, 0x08, - 0x02, 0x00, 0x80, 0x20, 0x04, 0x01, 0x01, 0x30, - 0x87, 0xc0, - // 'D' (0x44) 10x14, offset 471-489, at +2/-13 - // in regular row-major format - 0xfe, 0x10, 0x44, 0x09, 0x02, 0x40, 0x50, 0x14, - 0x05, 0x01, 0x40, 0x50, 0x14, 0x0d, 0x02, 0x41, - 0x3f, 0x80, - // 'E' (0x45) 11x14, offset 489-509, at +2/-13 - // in regular row-major format - 0xff, 0xc8, 0x09, 0x01, 0x20, 0x04, 0x00, 0x88, - 0x1f, 0x02, 0x20, 0x40, 0x08, 0x01, 0x00, 0xa0, - 0x14, 0x03, 0xff, 0xc0, - // 'F' (0x46) 11x14, offset 509-529, at +2/-13 - // in regular row-major format - 0xff, 0xe8, 0x05, 0x00, 0xa0, 0x04, 0x00, 0x88, - 0x1f, 0x02, 0x20, 0x40, 0x08, 0x01, 0x00, 0x20, - 0x04, 0x01, 0xf0, 0x00, - // 'G' (0x47) 11x14, offset 529-549, at +2/-13 - // in regular row-major format - 0x1f, 0x46, 0x19, 0x01, 0x60, 0x28, 0x01, 0x00, - 0x20, 0x04, 0x00, 0x83, 0xf0, 0x0b, 0x01, 0x20, - 0x23, 0x0c, 0x3e, 0x00, - // 'H' (0x48) 10x14, offset 549-567, at +2/-13 - // in regular row-major format - 0xe1, 0xd0, 0x24, 0x09, 0x02, 0x40, 0x90, 0x27, - 0xf9, 0x02, 0x40, 0x90, 0x24, 0x09, 0x02, 0x40, - 0xb8, 0x70, - // 'I' (0x49) 7x14, offset 567-580, at +4/-13 - // in regular row-major format - 0xfe, 0x20, 0x40, 0x81, 0x02, 0x04, 0x08, 0x10, - 0x20, 0x40, 0x81, 0x1f, 0xc0, - // 'J' (0x4a) 11x14, offset 580-600, at +2/-13 - // in regular row-major format - 0x0f, 0xe0, 0x10, 0x02, 0x00, 0x40, 0x08, 0x01, - 0x00, 0x20, 0x04, 0x80, 0x90, 0x12, 0x02, 0x40, - 0xc6, 0x30, 0x7c, 0x00, - // 'K' (0x4b) 12x14, offset 600-621, at +2/-13 - // in regular row-major format - 0xf1, 0xe4, 0x0c, 0x41, 0x04, 0x20, 0x44, 0x04, - 0x80, 0x5c, 0x06, 0x60, 0x43, 0x04, 0x10, 0x40, - 0x84, 0x08, 0x40, 0xcf, 0x07, - // 'L' (0x4c) 11x14, offset 621-641, at +2/-13 - // in regular row-major format - 0xf8, 0x04, 0x00, 0x80, 0x10, 0x02, 0x00, 0x40, - 0x08, 0x01, 0x00, 0x20, 0x04, 0x04, 0x80, 0x90, - 0x12, 0x03, 0xff, 0xc0, - // 'M' (0x4d) 13x14, offset 641-664, at +1/-13 - // in regular row-major format - 0xe0, 0x3b, 0x01, 0x94, 0x14, 0xa0, 0xa4, 0x89, - 0x24, 0x49, 0x14, 0x48, 0xa2, 0x45, 0x12, 0x10, - 0x90, 0x04, 0x80, 0x24, 0x01, 0x78, 0x3c, - // 'N' (0x4e) 12x14, offset 664-685, at +1/-13 - // in regular row-major format - 0xe0, 0xf6, 0x02, 0x50, 0x25, 0x02, 0x48, 0x24, - 0xc2, 0x44, 0x24, 0x22, 0x43, 0x24, 0x12, 0x40, - 0xa4, 0x0a, 0x40, 0x6f, 0x06, - // 'O' (0x4f) 12x14, offset 685-706, at +1/-13 - // in regular row-major format - 0x0f, 0x03, 0x0c, 0x60, 0x64, 0x02, 0x80, 0x18, - 0x01, 0x80, 0x18, 0x01, 0x80, 0x18, 0x01, 0x40, - 0x26, 0x06, 0x30, 0xc0, 0xf0, - // 'P' (0x50) 10x14, offset 706-724, at +2/-13 - // in regular row-major format - 0xff, 0x10, 0x64, 0x05, 0x01, 0x40, 0x50, 0x34, - 0x19, 0xfc, 0x40, 0x10, 0x04, 0x01, 0x00, 0x40, - 0x3e, 0x00, - // 'Q' (0x51) 12x17, offset 724-750, at +1/-13 - // in regular row-major format - 0x0f, 0x03, 0x0c, 0x60, 0x64, 0x02, 0x80, 0x18, - 0x01, 0x80, 0x18, 0x01, 0x80, 0x18, 0x01, 0x40, - 0x26, 0x06, 0x30, 0xc1, 0xf0, 0x0c, 0x01, 0xf1, - 0x30, 0xe0, - // 'R' (0x52) 12x14, offset 750-771, at +2/-13 - // in regular row-major format - 0xff, 0x04, 0x18, 0x40, 0xc4, 0x04, 0x40, 0x44, - 0x0c, 0x41, 0x87, 0xe0, 0x43, 0x04, 0x10, 0x40, - 0x84, 0x04, 0x40, 0x4f, 0x03, - // 'S' (0x53) 10x14, offset 771-789, at +2/-13 - // in regular row-major format - 0x1f, 0x48, 0x34, 0x05, 0x01, 0x40, 0x08, 0x01, - 0xc0, 0x0e, 0x00, 0x40, 0x18, 0x06, 0x01, 0xe1, - 0xa7, 0xc0, - // 'T' (0x54) 11x14, offset 789-809, at +2/-13 - // in regular row-major format - 0xff, 0xf0, 0x86, 0x10, 0x82, 0x00, 0x40, 0x08, - 0x01, 0x00, 0x20, 0x04, 0x00, 0x80, 0x10, 0x02, - 0x00, 0x40, 0x7f, 0x00, - // 'U' (0x55) 12x14, offset 809-830, at +1/-13 - // in regular row-major format - 0xf0, 0xf4, 0x02, 0x40, 0x24, 0x02, 0x40, 0x24, - 0x02, 0x40, 0x24, 0x02, 0x40, 0x24, 0x02, 0x40, - 0x22, 0x04, 0x30, 0xc0, 0xf0, - // 'V' (0x56) 14x14, offset 830-855, at +0/-13 - // in regular row-major format - 0xf8, 0x7c, 0x80, 0x22, 0x01, 0x04, 0x04, 0x10, - 0x20, 0x40, 0x80, 0x82, 0x02, 0x10, 0x08, 0x40, - 0x11, 0x00, 0x48, 0x01, 0xa0, 0x03, 0x00, 0x0c, - 0x00, - // 'W' (0x57) 14x14, offset 855-880, at +0/-13 - // in regular row-major format - 0xf8, 0x7c, 0x80, 0x22, 0x00, 0x88, 0xc2, 0x23, - 0x10, 0x8e, 0x42, 0x29, 0x09, 0x24, 0x24, 0x90, - 0x91, 0x41, 0x85, 0x06, 0x14, 0x18, 0x70, 0x60, - 0x80, - // 'X' (0x58) 12x14, offset 880-901, at +1/-13 - // in regular row-major format - 0xf0, 0xf2, 0x06, 0x30, 0x41, 0x08, 0x09, 0x80, - 0x50, 0x06, 0x00, 0x60, 0x0d, 0x00, 0x88, 0x10, - 0xc2, 0x04, 0x60, 0x2f, 0x0f, - // 'Y' (0x59) 12x14, offset 901-922, at +1/-13 - // in regular row-major format - 0xf0, 0xf2, 0x02, 0x10, 0x41, 0x04, 0x08, 0x80, - 0x50, 0x05, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, - 0x00, 0x20, 0x02, 0x01, 0xfc, - // 'Z' (0x5a) 9x14, offset 922-938, at +3/-13 - // in regular row-major format - 0xff, 0x40, 0xa0, 0x90, 0x40, 0x40, 0x40, 0x20, - 0x20, 0x20, 0x10, 0x50, 0x30, 0x18, 0x0f, 0xfc, - // '[' (0x5b) 3x18, offset 938-945, at +7/-14 - // in regular row-major format - 0xf2, 0x49, 0x24, 0x92, 0x49, 0x24, 0x9c, - // '\' (0x5c) 9x18, offset 945-966, at +3/-15 - // in regular row-major format - 0x80, 0x60, 0x10, 0x08, 0x02, 0x01, 0x00, 0x40, - 0x20, 0x08, 0x04, 0x01, 0x00, 0x80, 0x20, 0x10, - 0x04, 0x02, 0x00, 0x80, 0x40, - // ']' (0x5d) 3x18, offset 966-973, at +5/-14 - // in regular row-major format - 0xe4, 0x92, 0x49, 0x24, 0x92, 0x49, 0x3c, - // '^' (0x5e) 9x6, offset 973-980, at +3/-14 - // in regular row-major format - 0x08, 0x0c, 0x09, 0x0c, 0x4c, 0x14, 0x04, - // '_' (0x5f) 14x1, offset 980-982, at +0/+3 - // in regular row-major format - 0xff, 0xfc, - // '`' (0x60) 4x4, offset 982-984, at +4/-15 - // in regular row-major format - 0x84, 0x21, - // 'a' (0x61) 10x10, offset 984-997, at +2/-9 - // in regular row-major format - 0x3e, 0x00, 0x60, 0x08, 0x02, 0x3f, 0x98, 0x28, - 0x0a, 0x02, 0xc3, 0x9f, 0x30, - // 'b' (0x62) 13x15, offset 997-1022, at +0/-14 - // in regular row-major format - 0xe0, 0x01, 0x00, 0x08, 0x00, 0x40, 0x02, 0x00, - 0x13, 0xe0, 0xa0, 0x86, 0x02, 0x20, 0x09, 0x00, - 0x48, 0x02, 0x40, 0x13, 0x01, 0x14, 0x1b, 0x9f, - 0x00, - // 'c' (0x63) 11x10, offset 1022-1036, at +2/-9 - // in regular row-major format - 0x1f, 0x4c, 0x19, 0x01, 0x40, 0x28, 0x01, 0x00, - 0x20, 0x02, 0x00, 0x60, 0x43, 0xf0, - // 'd' (0x64) 11x15, offset 1036-1057, at +2/-14 - // in regular row-major format - 0x00, 0xc0, 0x08, 0x01, 0x00, 0x20, 0x04, 0x3c, - 0x98, 0x52, 0x06, 0x80, 0x50, 0x0a, 0x01, 0x40, - 0x24, 0x0c, 0xc2, 0x87, 0x98, - // 'e' (0x65) 10x10, offset 1057-1070, at +2/-9 - // in regular row-major format - 0x3f, 0x18, 0x68, 0x06, 0x01, 0xff, 0xe0, 0x08, - 0x03, 0x00, 0x60, 0xc7, 0xc0, - // 'f' (0x66) 9x15, offset 1070-1087, at +4/-14 - // in regular row-major format - 0x0f, 0x98, 0x08, 0x04, 0x02, 0x07, 0xf8, 0x80, - 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x03, - 0xf8, - // 'g' (0x67) 11x14, offset 1087-1107, at +2/-9 - // in regular row-major format - 0x1e, 0x6c, 0x39, 0x03, 0x40, 0x28, 0x05, 0x00, - 0xa0, 0x12, 0x06, 0x61, 0x43, 0xc8, 0x01, 0x00, - 0x20, 0x08, 0x3e, 0x00, - // 'h' (0x68) 10x15, offset 1107-1126, at +2/-14 - // in regular row-major format - 0xc0, 0x10, 0x04, 0x01, 0x00, 0x40, 0x13, 0x87, - 0x11, 0x82, 0x40, 0x90, 0x24, 0x09, 0x02, 0x40, - 0x90, 0x2e, 0x1c, - // 'i' (0x69) 9x15, offset 1126-1143, at +3/-14 - // in regular row-major format - 0x08, 0x04, 0x02, 0x00, 0x00, 0x03, 0xc0, 0x20, - 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0x80, 0x43, - 0xfe, - // 'j' (0x6a) 7x19, offset 1143-1160, at +3/-14 - // in regular row-major format - 0x04, 0x08, 0x10, 0x00, 0x1f, 0xc0, 0x81, 0x02, - 0x04, 0x08, 0x10, 0x20, 0x40, 0x81, 0x02, 0x0b, - 0xe0, - // 'k' (0x6b) 12x15, offset 1160-1183, at +1/-14 - // in regular row-major format - 0xe0, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, - 0x3c, 0x21, 0x02, 0x60, 0x2c, 0x03, 0x80, 0x24, - 0x02, 0x20, 0x21, 0x02, 0x08, 0xe1, 0xf0, - // 'l' (0x6c) 9x15, offset 1183-1200, at +3/-14 - // in regular row-major format - 0x78, 0x04, 0x02, 0x01, 0x00, 0x80, 0x40, 0x20, - 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0x80, 0x43, - 0xfe, - // 'm' (0x6d) 13x10, offset 1200-1217, at +1/-9 - // in regular row-major format - 0xdc, 0xe3, 0x19, 0x90, 0x84, 0x84, 0x24, 0x21, - 0x21, 0x09, 0x08, 0x48, 0x42, 0x42, 0x17, 0x18, - 0xc0, - // 'n' (0x6e) 12x10, offset 1217-1232, at +1/-9 - // in regular row-major format - 0x67, 0x83, 0x84, 0x20, 0x22, 0x02, 0x20, 0x22, - 0x02, 0x20, 0x22, 0x02, 0x20, 0x2f, 0x07, - // 'o' (0x6f) 11x10, offset 1232-1246, at +2/-9 - // in regular row-major format - 0x1f, 0x04, 0x11, 0x01, 0x40, 0x18, 0x03, 0x00, - 0x60, 0x0a, 0x02, 0x20, 0x83, 0xe0, - // 'p' (0x70) 12x14, offset 1246-1267, at +1/-9 - // in regular row-major format - 0xcf, 0x85, 0x06, 0x60, 0x24, 0x01, 0x40, 0x14, - 0x01, 0x40, 0x16, 0x02, 0x50, 0x44, 0xf8, 0x40, - 0x04, 0x00, 0x40, 0x0f, 0x00, - // 'q' (0x71) 11x14, offset 1267-1287, at +2/-9 - // in regular row-major format - 0x1e, 0x6c, 0x3b, 0x03, 0x40, 0x28, 0x05, 0x00, - 0xa0, 0x12, 0x06, 0x61, 0x43, 0xc8, 0x01, 0x00, - 0x20, 0x04, 0x03, 0xc0, - // 'r' (0x72) 10x10, offset 1287-1300, at +3/-9 - // in regular row-major format - 0xe3, 0x8b, 0x13, 0x80, 0x80, 0x20, 0x08, 0x02, - 0x00, 0x80, 0x20, 0x3f, 0x80, - // 's' (0x73) 10x10, offset 1300-1313, at +2/-9 - // in regular row-major format - 0x1f, 0x58, 0x34, 0x05, 0x80, 0x1e, 0x00, 0x60, - 0x06, 0x01, 0xc0, 0xaf, 0xc0, - // 't' (0x74) 11x14, offset 1313-1333, at +1/-13 - // in regular row-major format - 0x20, 0x04, 0x00, 0x80, 0x10, 0x0f, 0xf0, 0x40, - 0x08, 0x01, 0x00, 0x20, 0x04, 0x00, 0x80, 0x10, - 0x03, 0x04, 0x3f, 0x00, - // 'u' (0x75) 11x10, offset 1333-1347, at +2/-9 - // in regular row-major format - 0xc1, 0xc8, 0x09, 0x01, 0x20, 0x24, 0x04, 0x80, - 0x90, 0x12, 0x02, 0x61, 0xc7, 0xcc, - // 'v' (0x76) 13x10, offset 1347-1364, at +1/-9 - // in regular row-major format - 0xf8, 0xf9, 0x01, 0x08, 0x10, 0x60, 0x81, 0x08, - 0x08, 0x40, 0x22, 0x01, 0x20, 0x05, 0x00, 0x30, - 0x00, - // 'w' (0x77) 13x10, offset 1364-1381, at +1/-9 - // in regular row-major format - 0xf0, 0x7a, 0x01, 0x10, 0x08, 0x8c, 0x42, 0x62, - 0x12, 0x90, 0xa5, 0x05, 0x18, 0x28, 0xc0, 0x86, - 0x00, - // 'x' (0x78) 12x10, offset 1381-1396, at +1/-9 - // in regular row-major format - 0x78, 0xf3, 0x04, 0x18, 0x80, 0xd0, 0x06, 0x00, - 0x70, 0x09, 0x81, 0x0c, 0x20, 0x6f, 0x8f, - // 'y' (0x79) 12x14, offset 1396-1417, at +1/-9 - // in regular row-major format - 0xf0, 0xf2, 0x02, 0x20, 0x41, 0x04, 0x10, 0x80, - 0x88, 0x09, 0x00, 0x50, 0x06, 0x00, 0x20, 0x04, - 0x00, 0x40, 0x08, 0x0f, 0xe0, - // 'z' (0x7a) 9x10, offset 1417-1429, at +3/-9 - // in regular row-major format - 0xff, 0x41, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x40, 0xbf, 0xc0, - // '{' (0x7b) 5x18, offset 1429-1441, at +5/-14 - // in regular row-major format - 0x19, 0x08, 0x42, 0x10, 0x84, 0x64, 0x18, 0x42, - 0x10, 0x84, 0x20, 0xc0, - // '|' (0x7c) 1x18, offset 1441-1444, at +7/-14 - // in regular row-major format - 0xff, 0xff, 0xc0, - // '}' (0x7d) 5x18, offset 1444-1456, at +5/-14 - // in regular row-major format - 0xc1, 0x08, 0x42, 0x10, 0x84, 0x10, 0x4c, 0x42, - 0x10, 0x84, 0x26, 0x00, -}; - - -static const uint8_t FreeMono18pt7b_generic[] = { - // ' ' (0x20) 0x0, offset 0-0, at +0/+1 - // in regular row-major format - // '!' (0x21) 4x22, offset 0-11, at +8/-21 - // in regular row-major format - 0x27, 0x77, 0x77, 0x77, 0x77, 0x22, 0x22, 0x20, - 0x00, 0x6f, 0xf6, - // '"' (0x22) 11x10, offset 11-25, at +5/-20 - // in regular row-major format - 0xf1, 0xfe, 0x3f, 0xc7, 0xf8, 0xff, 0x1e, 0xc3, - 0x98, 0x33, 0x06, 0x60, 0xcc, 0x18, - // '#' (0x23) 14x24, offset 25-67, at +3/-21 - // in regular row-major format - 0x04, 0x20, 0x10, 0x80, 0x42, 0x01, 0x08, 0x04, - 0x20, 0x10, 0x80, 0x42, 0x01, 0x10, 0x04, 0x41, - 0xff, 0xf0, 0x44, 0x02, 0x10, 0x08, 0x40, 0x21, - 0x0f, 0xff, 0xc2, 0x10, 0x08, 0x40, 0x21, 0x00, - 0x84, 0x02, 0x10, 0x08, 0x40, 0x23, 0x00, 0x88, - 0x02, 0x20, - // '$' (0x24) 13x26, offset 67-110, at +4/-22 - // in regular row-major format - 0x02, 0x00, 0x10, 0x00, 0x80, 0x1f, 0xa3, 0x07, - 0x10, 0x09, 0x00, 0x48, 0x00, 0x40, 0x03, 0x00, - 0x0c, 0x00, 0x3c, 0x00, 0x1e, 0x00, 0x18, 0x00, - 0x20, 0x01, 0x80, 0x0c, 0x00, 0x70, 0x05, 0xe0, - 0xc9, 0xf8, 0x01, 0x00, 0x08, 0x00, 0x40, 0x02, - 0x00, 0x10, 0x00, - // '%' (0x25) 15x21, offset 110-150, at +3/-20 - // in regular row-major format - 0x1e, 0x00, 0x42, 0x01, 0x02, 0x02, 0x04, 0x04, - 0x08, 0x08, 0x10, 0x08, 0x40, 0x0f, 0x00, 0x00, - 0x1e, 0x01, 0xf0, 0x1f, 0x01, 0xe0, 0x0e, 0x00, - 0x00, 0x3c, 0x00, 0x86, 0x02, 0x06, 0x04, 0x04, - 0x08, 0x08, 0x10, 0x30, 0x10, 0xc0, 0x1e, 0x00, - // '&' (0x26) 12x18, offset 150-177, at +4/-17 - // in regular row-major format - 0x0f, 0xc1, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, - 0x00, 0x10, 0x01, 0x00, 0x08, 0x03, 0xc0, 0x6c, - 0x3c, 0x62, 0x82, 0x68, 0x34, 0x81, 0xcc, 0x08, - 0x61, 0xc3, 0xe7, - // ''' (0x27) 4x10, offset 177-182, at +8/-20 - // in regular row-major format - 0xff, 0xff, 0xf6, 0x66, 0x66, - // '(' (0x28) 5x25, offset 182-198, at +10/-20 - // in regular row-major format - 0x08, 0xc4, 0x62, 0x31, 0x8c, 0xc6, 0x31, 0x8c, - 0x63, 0x18, 0xc3, 0x18, 0xc2, 0x18, 0xc3, 0x18, - // ')' (0x29) 5x25, offset 198-214, at +6/-20 - // in regular row-major format - 0x86, 0x10, 0xc2, 0x18, 0xc6, 0x10, 0xc6, 0x31, - 0x8c, 0x63, 0x18, 0x8c, 0x62, 0x31, 0x98, 0x80, - // '*' (0x2a) 13x12, offset 214-234, at +4/-20 - // in regular row-major format - 0x02, 0x00, 0x10, 0x00, 0x80, 0x04, 0x0c, 0x21, - 0x9d, 0x70, 0x1c, 0x00, 0xa0, 0x0d, 0x80, 0xc6, - 0x04, 0x10, 0x40, 0x80, - // '+' (0x2b) 15x17, offset 234-266, at +3/-17 - // in regular row-major format - 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, - 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0xff, - 0xfe, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, - 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x01, 0x00, - // ',' (0x2c) 7x10, offset 266-275, at +5/-4 - // in regular row-major format - 0x3e, 0x78, 0xf3, 0xc7, 0x8e, 0x18, 0x70, 0xc1, - 0x80, - // '-' (0x2d) 15x1, offset 275-277, at +3/-9 - // in regular row-major format - 0xff, 0xfe, - // '.' (0x2e) 5x5, offset 277-281, at +8/-4 - // in regular row-major format - 0x77, 0xff, 0xf7, 0x00, - // '/' (0x2f) 13x26, offset 281-324, at +4/-22 - // in regular row-major format - 0x00, 0x08, 0x00, 0xc0, 0x04, 0x00, 0x60, 0x02, - 0x00, 0x30, 0x01, 0x00, 0x18, 0x00, 0x80, 0x0c, - 0x00, 0x40, 0x02, 0x00, 0x20, 0x01, 0x00, 0x10, - 0x00, 0x80, 0x08, 0x00, 0x40, 0x04, 0x00, 0x20, - 0x02, 0x00, 0x10, 0x01, 0x00, 0x08, 0x00, 0x80, - 0x04, 0x00, 0x00, - // '0' (0x30) 13x21, offset 324-359, at +4/-20 - // in regular row-major format - 0x0f, 0x81, 0x82, 0x08, 0x08, 0x80, 0x24, 0x01, - 0x60, 0x0e, 0x00, 0x30, 0x01, 0x80, 0x0c, 0x00, - 0x60, 0x03, 0x00, 0x18, 0x00, 0xc0, 0x06, 0x00, - 0x30, 0x03, 0x40, 0x12, 0x00, 0x88, 0x08, 0x60, - 0xc0, 0xf8, 0x00, - // '1' (0x31) 13x21, offset 359-394, at +4/-20 - // in regular row-major format - 0x06, 0x00, 0x70, 0x06, 0x80, 0x64, 0x06, 0x20, - 0x31, 0x00, 0x08, 0x00, 0x40, 0x02, 0x00, 0x10, - 0x00, 0x80, 0x04, 0x00, 0x20, 0x01, 0x00, 0x08, - 0x00, 0x40, 0x02, 0x00, 0x10, 0x00, 0x80, 0x04, - 0x0f, 0xff, 0x80, - // '2' (0x32) 13x21, offset 394-429, at +3/-20 - // in regular row-major format - 0x0f, 0x80, 0xc3, 0x08, 0x04, 0x80, 0x24, 0x00, - 0x80, 0x04, 0x00, 0x20, 0x02, 0x00, 0x10, 0x01, - 0x00, 0x10, 0x01, 0x80, 0x18, 0x01, 0x80, 0x18, - 0x01, 0x80, 0x18, 0x01, 0x80, 0x58, 0x03, 0x80, - 0x1f, 0xff, 0x80, - // '3' (0x33) 14x21, offset 429-466, at +3/-20 - // in regular row-major format - 0x0f, 0xc0, 0xc0, 0x86, 0x01, 0x00, 0x02, 0x00, - 0x08, 0x00, 0x20, 0x00, 0x80, 0x04, 0x00, 0x20, - 0x0f, 0x00, 0x06, 0x00, 0x04, 0x00, 0x08, 0x00, - 0x10, 0x00, 0x40, 0x01, 0x00, 0x04, 0x00, 0x2c, - 0x01, 0x9c, 0x0c, 0x0f, 0xc0, - // '4' (0x34) 12x21, offset 466-498, at +4/-20 - // in regular row-major format - 0x01, 0xc0, 0x14, 0x02, 0x40, 0x64, 0x04, 0x40, - 0xc4, 0x08, 0x41, 0x84, 0x10, 0x42, 0x04, 0x20, - 0x44, 0x04, 0x40, 0x48, 0x04, 0xff, 0xf0, 0x04, - 0x00, 0x40, 0x04, 0x00, 0x40, 0x04, 0x07, 0xf0, - // '5' (0x35) 14x21, offset 498-535, at +3/-20 - // in regular row-major format - 0x3f, 0xf0, 0x80, 0x02, 0x00, 0x08, 0x00, 0x20, - 0x00, 0x80, 0x02, 0x00, 0x0b, 0xf0, 0x30, 0x30, - 0x00, 0x60, 0x00, 0x80, 0x01, 0x00, 0x04, 0x00, - 0x10, 0x00, 0x40, 0x01, 0x00, 0x0e, 0x00, 0x2c, - 0x01, 0x0c, 0x18, 0x0f, 0xc0, - // '6' (0x36) 12x21, offset 535-567, at +5/-20 - // in regular row-major format - 0x01, 0xf0, 0x60, 0x18, 0x03, 0x00, 0x20, 0x04, - 0x00, 0x40, 0x0c, 0x00, 0x80, 0x08, 0xf8, 0x98, - 0x4a, 0x02, 0xe0, 0x3c, 0x01, 0x80, 0x14, 0x01, - 0x40, 0x14, 0x03, 0x20, 0x21, 0x0c, 0x0f, 0x80, - // '7' (0x37) 12x21, offset 567-599, at +4/-20 - // in regular row-major format - 0xff, 0xf8, 0x01, 0x80, 0x18, 0x03, 0x00, 0x20, - 0x02, 0x00, 0x20, 0x04, 0x00, 0x40, 0x04, 0x00, - 0xc0, 0x08, 0x00, 0x80, 0x18, 0x01, 0x00, 0x10, - 0x01, 0x00, 0x30, 0x02, 0x00, 0x20, 0x02, 0x00, - // '8' (0x38) 13x21, offset 599-634, at +4/-20 - // in regular row-major format - 0x0f, 0x81, 0x83, 0x10, 0x05, 0x80, 0x38, 0x00, - 0xc0, 0x06, 0x00, 0x30, 0x03, 0x40, 0x11, 0x83, - 0x07, 0xf0, 0x60, 0xc4, 0x01, 0x60, 0x0e, 0x00, - 0x30, 0x01, 0x80, 0x0e, 0x00, 0xd0, 0x04, 0x60, - 0xc1, 0xfc, 0x00, - // '9' (0x39) 12x21, offset 634-666, at +5/-20 - // in regular row-major format - 0x1f, 0x03, 0x08, 0x40, 0x4c, 0x02, 0x80, 0x28, - 0x02, 0x80, 0x18, 0x03, 0xc0, 0x74, 0x05, 0x21, - 0x91, 0xf1, 0x00, 0x10, 0x03, 0x00, 0x20, 0x02, - 0x00, 0x40, 0x0c, 0x01, 0x80, 0x60, 0xf8, 0x00, - // ':' (0x3a) 5x15, offset 666-676, at +8/-14 - // in regular row-major format - 0x77, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x1d, 0xff, - 0xfd, 0xc0, - // ';' (0x3b) 7x20, offset 676-694, at +5/-14 - // in regular row-major format - 0x1c, 0x7c, 0xf9, 0xf1, 0xc0, 0x00, 0x00, 0x00, - 0x00, 0xf1, 0xe3, 0x8f, 0x1c, 0x38, 0xe1, 0xc3, - 0x06, 0x00, - // '<' (0x3c) 15x16, offset 694-724, at +3/-17 - // in regular row-major format - 0x00, 0x06, 0x00, 0x18, 0x00, 0xe0, 0x07, 0x00, - 0x38, 0x01, 0xc0, 0x06, 0x00, 0x38, 0x00, 0xe0, - 0x00, 0x70, 0x00, 0x38, 0x00, 0x18, 0x00, 0x1c, - 0x00, 0x0e, 0x00, 0x07, 0x00, 0x03, - // '=' (0x3d) 17x6, offset 724-737, at +2/-12 - // in regular row-major format - 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x07, 0xff, 0xfc, - // '>' (0x3e) 15x16, offset 737-767, at +3/-17 - // in regular row-major format - 0xc0, 0x00, 0xc0, 0x00, 0xe0, 0x00, 0x70, 0x00, - 0x38, 0x00, 0x1c, 0x00, 0x0c, 0x00, 0x0e, 0x00, - 0x0e, 0x00, 0x70, 0x03, 0x80, 0x0c, 0x00, 0x70, - 0x03, 0x80, 0x1c, 0x00, 0x60, 0x00, - // '?' (0x3f) 12x20, offset 767-797, at +5/-19 - // in regular row-major format - 0x3f, 0x8e, 0x0c, 0x80, 0x28, 0x01, 0x80, 0x10, - 0x01, 0x00, 0x10, 0x02, 0x00, 0xc0, 0x38, 0x06, - 0x00, 0x40, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0e, 0x01, 0xf0, 0x1f, 0x00, 0xe0, - // '@' (0x40) 13x23, offset 797-835, at +4/-20 - // in regular row-major format - 0x0f, 0x01, 0x86, 0x08, 0x08, 0x80, 0x24, 0x01, - 0x40, 0x0a, 0x00, 0x50, 0x1e, 0x83, 0x14, 0x20, - 0xa2, 0x05, 0x10, 0x28, 0x81, 0x46, 0x0a, 0x18, - 0x50, 0x3f, 0x80, 0x04, 0x00, 0x10, 0x00, 0x80, - 0x02, 0x00, 0x18, 0x18, 0x3f, 0x00, - // 'A' (0x41) 21x20, offset 835-888, at +0/-19 - // in regular row-major format - 0x1f, 0xf0, 0x00, 0x06, 0x80, 0x00, 0x34, 0x00, - 0x01, 0x30, 0x00, 0x18, 0x80, 0x00, 0x86, 0x00, - 0x04, 0x30, 0x00, 0x60, 0x80, 0x02, 0x06, 0x00, - 0x10, 0x10, 0x01, 0x80, 0x80, 0x08, 0x06, 0x00, - 0x7f, 0xf0, 0x06, 0x00, 0x80, 0x20, 0x06, 0x01, - 0x00, 0x10, 0x18, 0x00, 0xc0, 0x80, 0x06, 0x04, - 0x00, 0x11, 0xfc, 0x0f, 0xf0, - // 'B' (0x42) 18x20, offset 888-933, at +1/-19 - // in regular row-major format - 0xff, 0xf8, 0x04, 0x01, 0x01, 0x00, 0x20, 0x40, - 0x04, 0x10, 0x01, 0x04, 0x00, 0x41, 0x00, 0x10, - 0x40, 0x08, 0x10, 0x0c, 0x07, 0xff, 0x01, 0x00, - 0x70, 0x40, 0x06, 0x10, 0x00, 0x84, 0x00, 0x11, - 0x00, 0x04, 0x40, 0x01, 0x10, 0x00, 0x44, 0x00, - 0x21, 0x00, 0x33, 0xff, 0xf8, - // 'C' (0x43) 17x20, offset 933-976, at +2/-19 - // in regular row-major format - 0x03, 0xf1, 0x06, 0x0e, 0x8c, 0x01, 0xc4, 0x00, - 0x64, 0x00, 0x12, 0x00, 0x0a, 0x00, 0x01, 0x00, - 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, - 0x00, 0x08, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, - 0x80, 0x00, 0x20, 0x01, 0x88, 0x01, 0x83, 0x03, - 0x80, 0x7e, 0x00, - // 'D' (0x44) 16x20, offset 976-1016, at +2/-19 - // in regular row-major format - 0xff, 0xe0, 0x20, 0x18, 0x20, 0x0c, 0x20, 0x04, - 0x20, 0x02, 0x20, 0x02, 0x20, 0x01, 0x20, 0x01, - 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, - 0x20, 0x01, 0x20, 0x01, 0x20, 0x02, 0x20, 0x02, - 0x20, 0x04, 0x20, 0x0c, 0x20, 0x18, 0xff, 0xe0, - // 'E' (0x45) 17x20, offset 1016-1059, at +1/-19 - // in regular row-major format - 0xff, 0xff, 0x08, 0x00, 0x84, 0x00, 0x42, 0x00, - 0x21, 0x00, 0x10, 0x80, 0x00, 0x40, 0x00, 0x20, - 0x40, 0x10, 0x20, 0x0f, 0xf0, 0x04, 0x08, 0x02, - 0x04, 0x01, 0x00, 0x00, 0x80, 0x00, 0x40, 0x02, - 0x20, 0x01, 0x10, 0x00, 0x88, 0x00, 0x44, 0x00, - 0x3f, 0xff, 0xf0, - // 'F' (0x46) 17x20, offset 1059-1102, at +1/-19 - // in regular row-major format - 0xff, 0xff, 0x88, 0x00, 0x44, 0x00, 0x22, 0x00, - 0x11, 0x00, 0x08, 0x80, 0x00, 0x40, 0x00, 0x20, - 0x40, 0x10, 0x20, 0x0f, 0xf0, 0x04, 0x08, 0x02, - 0x04, 0x01, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, - 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, - 0x1f, 0xf8, 0x00, - // 'G' (0x47) 17x20, offset 1102-1145, at +2/-19 - // in regular row-major format - 0x03, 0xf9, 0x06, 0x07, 0x84, 0x00, 0xc4, 0x00, - 0x24, 0x00, 0x12, 0x00, 0x02, 0x00, 0x01, 0x00, - 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, - 0x0f, 0xf8, 0x00, 0x14, 0x00, 0x09, 0x00, 0x04, - 0x80, 0x02, 0x20, 0x01, 0x18, 0x00, 0x83, 0x01, - 0xc0, 0x7f, 0x00, - // 'H' (0x48) 16x20, offset 1145-1185, at +2/-19 - // in regular row-major format - 0xfc, 0x3f, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, - 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, - 0x20, 0x04, 0x3f, 0xfc, 0x20, 0x04, 0x20, 0x04, - 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, - 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0xfc, 0x3f, - // 'I' (0x49) 13x20, offset 1185-1218, at +4/-19 - // in regular row-major format - 0xff, 0xf8, 0x10, 0x00, 0x80, 0x04, 0x00, 0x20, - 0x01, 0x00, 0x08, 0x00, 0x40, 0x02, 0x00, 0x10, - 0x00, 0x80, 0x04, 0x00, 0x20, 0x01, 0x00, 0x08, - 0x00, 0x40, 0x02, 0x00, 0x10, 0x00, 0x81, 0xff, - 0xf0, - // 'J' (0x4a) 17x20, offset 1218-1261, at +3/-19 - // in regular row-major format - 0x03, 0xff, 0x80, 0x04, 0x00, 0x02, 0x00, 0x01, - 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, - 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x10, - 0x01, 0x08, 0x00, 0x84, 0x00, 0x42, 0x00, 0x21, - 0x00, 0x10, 0x80, 0x10, 0x20, 0x18, 0x0c, 0x18, - 0x01, 0xf0, 0x00, - // 'K' (0x4b) 18x20, offset 1261-1306, at +1/-19 - // in regular row-major format - 0xff, 0x1f, 0x84, 0x01, 0x81, 0x00, 0xc0, 0x40, - 0x60, 0x10, 0x30, 0x04, 0x18, 0x01, 0x0c, 0x00, - 0x46, 0x00, 0x13, 0x00, 0x05, 0xf0, 0x01, 0xc6, - 0x00, 0x60, 0xc0, 0x10, 0x18, 0x04, 0x06, 0x01, - 0x00, 0xc0, 0x40, 0x30, 0x10, 0x04, 0x04, 0x01, - 0x81, 0x00, 0x23, 0xfc, 0x0f, - // 'L' (0x4c) 15x20, offset 1306-1344, at +3/-19 - // in regular row-major format - 0xff, 0x80, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, - 0x80, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, - 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, - 0x01, 0x00, 0x42, 0x00, 0x84, 0x01, 0x08, 0x02, - 0x10, 0x04, 0x20, 0x0f, 0xff, 0xf0, - // 'M' (0x4d) 19x20, offset 1344-1392, at +1/-19 - // in regular row-major format - 0xf0, 0x01, 0xe7, 0x00, 0x70, 0xa0, 0x0a, 0x16, - 0x03, 0x42, 0x40, 0x48, 0x4c, 0x19, 0x08, 0x82, - 0x21, 0x10, 0x44, 0x23, 0x18, 0x84, 0x22, 0x10, - 0x86, 0xc2, 0x10, 0x50, 0x42, 0x0e, 0x08, 0x41, - 0xc1, 0x08, 0x00, 0x21, 0x00, 0x04, 0x20, 0x00, - 0x84, 0x00, 0x10, 0x80, 0x02, 0x7f, 0x03, 0xf0, - // 'N' (0x4e) 18x20, offset 1392-1437, at +1/-19 - // in regular row-major format - 0xf8, 0x1f, 0xc6, 0x00, 0x41, 0xc0, 0x10, 0x50, - 0x04, 0x12, 0x01, 0x04, 0xc0, 0x41, 0x10, 0x10, - 0x46, 0x04, 0x10, 0x81, 0x04, 0x10, 0x41, 0x04, - 0x10, 0x40, 0x84, 0x10, 0x31, 0x04, 0x04, 0x41, - 0x01, 0x90, 0x40, 0x24, 0x10, 0x05, 0x04, 0x01, - 0xc1, 0x00, 0x31, 0xfc, 0x0c, - // 'O' (0x4f) 17x20, offset 1437-1480, at +2/-19 - // in regular row-major format - 0x03, 0xe0, 0x06, 0x0c, 0x04, 0x01, 0x04, 0x00, - 0x46, 0x00, 0x32, 0x00, 0x0b, 0x00, 0x05, 0x00, - 0x01, 0x80, 0x00, 0xc0, 0x00, 0x60, 0x00, 0x30, - 0x00, 0x18, 0x00, 0x0e, 0x00, 0x0d, 0x00, 0x04, - 0xc0, 0x06, 0x20, 0x02, 0x08, 0x02, 0x03, 0x06, - 0x00, 0x7c, 0x00, - // 'P' (0x50) 16x20, offset 1480-1520, at +1/-19 - // in regular row-major format - 0xff, 0xf0, 0x10, 0x0c, 0x10, 0x02, 0x10, 0x03, - 0x10, 0x01, 0x10, 0x01, 0x10, 0x01, 0x10, 0x03, - 0x10, 0x06, 0x10, 0x0c, 0x1f, 0xf0, 0x10, 0x00, - 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, - 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0xff, 0xc0, - // 'Q' (0x51) 17x24, offset 1520-1571, at +2/-19 - // in regular row-major format - 0x03, 0xe0, 0x06, 0x0c, 0x04, 0x01, 0x04, 0x00, - 0x46, 0x00, 0x32, 0x00, 0x0b, 0x00, 0x07, 0x00, - 0x01, 0x80, 0x00, 0xc0, 0x00, 0x60, 0x00, 0x30, - 0x00, 0x18, 0x00, 0x0e, 0x00, 0x0d, 0x00, 0x04, - 0xc0, 0x06, 0x20, 0x02, 0x08, 0x02, 0x03, 0x06, - 0x00, 0xfc, 0x00, 0x30, 0x00, 0x30, 0x00, 0x7f, - 0xc6, 0x38, 0x1e, - // 'R' (0x52) 19x20, offset 1571-1619, at +1/-19 - // in regular row-major format - 0xff, 0xf0, 0x02, 0x01, 0x80, 0x40, 0x08, 0x08, - 0x01, 0x81, 0x00, 0x10, 0x20, 0x02, 0x04, 0x00, - 0x40, 0x80, 0x18, 0x10, 0x06, 0x02, 0x03, 0x80, - 0x7f, 0xc0, 0x08, 0x18, 0x01, 0x01, 0x80, 0x20, - 0x18, 0x04, 0x01, 0x80, 0x80, 0x10, 0x10, 0x03, - 0x02, 0x00, 0x20, 0x40, 0x06, 0x7f, 0x80, 0x70, - // 'S' (0x53) 14x20, offset 1619-1654, at +3/-19 - // in regular row-major format - 0x0f, 0xc8, 0x61, 0xe2, 0x01, 0x90, 0x02, 0x40, - 0x09, 0x00, 0x04, 0x00, 0x08, 0x00, 0x38, 0x00, - 0x3e, 0x00, 0x0f, 0x00, 0x06, 0x00, 0x0c, 0x00, - 0x18, 0x00, 0x60, 0x01, 0x80, 0x0f, 0x00, 0x2b, - 0x03, 0x23, 0xf0, - // 'T' (0x54) 15x20, offset 1654-1692, at +3/-19 - // in regular row-major format - 0xff, 0xff, 0x02, 0x06, 0x04, 0x0c, 0x08, 0x18, - 0x10, 0x20, 0x20, 0x00, 0x40, 0x00, 0x80, 0x01, - 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, - 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x01, 0x00, - 0x02, 0x00, 0x04, 0x01, 0xff, 0xc0, - // 'U' (0x55) 17x20, offset 1692-1735, at +2/-19 - // in regular row-major format - 0xfc, 0x1f, 0x90, 0x01, 0x08, 0x00, 0x84, 0x00, - 0x42, 0x00, 0x21, 0x00, 0x10, 0x80, 0x08, 0x40, - 0x04, 0x20, 0x02, 0x10, 0x01, 0x08, 0x00, 0x84, - 0x00, 0x42, 0x00, 0x21, 0x00, 0x10, 0x80, 0x08, - 0x40, 0x04, 0x10, 0x04, 0x0c, 0x06, 0x03, 0x06, - 0x00, 0x7c, 0x00, - // 'V' (0x56) 21x20, offset 1735-1788, at +0/-19 - // in regular row-major format - 0xfe, 0x03, 0xf8, 0x80, 0x02, 0x04, 0x00, 0x10, - 0x30, 0x01, 0x80, 0x80, 0x08, 0x06, 0x00, 0xc0, - 0x30, 0x06, 0x00, 0x80, 0x20, 0x06, 0x03, 0x00, - 0x30, 0x10, 0x00, 0x80, 0x80, 0x06, 0x0c, 0x00, - 0x10, 0x40, 0x00, 0x86, 0x00, 0x06, 0x20, 0x00, - 0x11, 0x00, 0x00, 0xd8, 0x00, 0x06, 0x80, 0x00, - 0x1c, 0x00, 0x00, 0xe0, 0x00, - // 'W' (0x57) 19x20, offset 1788-1836, at +1/-19 - // in regular row-major format - 0xfc, 0x0f, 0xe8, 0x00, 0x19, 0x00, 0x03, 0x10, - 0x00, 0x62, 0x00, 0x08, 0x41, 0x81, 0x08, 0x28, - 0x21, 0x05, 0x04, 0x21, 0xa0, 0x84, 0x36, 0x30, - 0x84, 0x46, 0x08, 0x88, 0xc1, 0x31, 0x18, 0x24, - 0x12, 0x04, 0x82, 0x40, 0xb0, 0x48, 0x14, 0x09, - 0x02, 0x80, 0xa0, 0x30, 0x1c, 0x06, 0x03, 0x80, - // 'X' (0x58) 19x20, offset 1836-1884, at +1/-19 - // in regular row-major format - 0x7e, 0x0f, 0xc2, 0x00, 0x60, 0x60, 0x0c, 0x06, - 0x03, 0x00, 0x60, 0xc0, 0x0c, 0x10, 0x00, 0xc6, - 0x00, 0x0d, 0x80, 0x00, 0xa0, 0x00, 0x1c, 0x00, - 0x03, 0x80, 0x00, 0xd8, 0x00, 0x11, 0x00, 0x06, - 0x30, 0x01, 0x83, 0x00, 0x60, 0x30, 0x08, 0x06, - 0x03, 0x00, 0x60, 0xc0, 0x06, 0x7f, 0x07, 0xf0, - // 'Y' (0x59) 17x20, offset 1884-1927, at +2/-19 - // in regular row-major format - 0xfc, 0x1f, 0x98, 0x03, 0x04, 0x01, 0x03, 0x01, - 0x80, 0xc1, 0x80, 0x20, 0x80, 0x18, 0xc0, 0x04, - 0x40, 0x03, 0x60, 0x00, 0xe0, 0x00, 0x20, 0x00, - 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, - 0x03, 0xff, 0x80, - // 'Z' (0x5a) 13x20, offset 1927-1960, at +4/-19 - // in regular row-major format - 0xff, 0xf4, 0x00, 0xa0, 0x09, 0x00, 0x48, 0x04, - 0x40, 0x40, 0x02, 0x00, 0x20, 0x02, 0x00, 0x10, - 0x01, 0x00, 0x10, 0x00, 0x80, 0x08, 0x04, 0x80, - 0x24, 0x01, 0x40, 0x0c, 0x00, 0x60, 0x03, 0xff, - 0xf0, - // '[' (0x5b) 5x25, offset 1960-1976, at +10/-20 - // in regular row-major format - 0xfc, 0x21, 0x08, 0x42, 0x10, 0x84, 0x21, 0x08, - 0x42, 0x10, 0x84, 0x21, 0x08, 0x42, 0x10, 0xf8, - // '\' (0x5c) 13x26, offset 1976-2019, at +4/-22 - // in regular row-major format - 0x80, 0x02, 0x00, 0x10, 0x00, 0xc0, 0x02, 0x00, - 0x18, 0x00, 0x40, 0x03, 0x00, 0x08, 0x00, 0x40, - 0x01, 0x00, 0x08, 0x00, 0x20, 0x01, 0x00, 0x04, - 0x00, 0x20, 0x00, 0x80, 0x04, 0x00, 0x10, 0x00, - 0x80, 0x02, 0x00, 0x10, 0x00, 0x40, 0x02, 0x00, - 0x08, 0x00, 0x40, - // ']' (0x5d) 5x25, offset 2019-2035, at +6/-20 - // in regular row-major format - 0xf8, 0x42, 0x10, 0x84, 0x21, 0x08, 0x42, 0x10, - 0x84, 0x21, 0x08, 0x42, 0x10, 0x84, 0x21, 0xf8, - // '^' (0x5e) 13x9, offset 2035-2050, at +4/-20 - // in regular row-major format - 0x02, 0x00, 0x38, 0x03, 0x60, 0x11, 0x01, 0x8c, - 0x18, 0x31, 0x80, 0xd8, 0x03, 0x80, 0x08, - // '_' (0x5f) 21x1, offset 2050-2053, at +0/+4 - // in regular row-major format - 0xff, 0xff, 0xf8, - // '`' (0x60) 6x5, offset 2053-2057, at +5/-21 - // in regular row-major format - 0xc1, 0x83, 0x06, 0x0c, - // 'a' (0x61) 16x15, offset 2057-2087, at +3/-14 - // in regular row-major format - 0x0f, 0xc0, 0x70, 0x30, 0x00, 0x10, 0x00, 0x08, - 0x00, 0x08, 0x00, 0x08, 0x0f, 0xf8, 0x30, 0x08, - 0x40, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, - 0x80, 0x38, 0x60, 0xe8, 0x3f, 0x8f, - // 'b' (0x62) 18x21, offset 2087-2135, at +1/-20 - // in regular row-major format - 0xf0, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x40, - 0x00, 0x10, 0x00, 0x04, 0x00, 0x01, 0x0f, 0x80, - 0x4c, 0x18, 0x14, 0x01, 0x06, 0x00, 0x21, 0x80, - 0x08, 0x40, 0x01, 0x10, 0x00, 0x44, 0x00, 0x11, - 0x00, 0x04, 0x40, 0x01, 0x18, 0x00, 0x86, 0x00, - 0x21, 0xc0, 0x10, 0x5c, 0x18, 0xf1, 0xf8, 0x00, - // 'c' (0x63) 15x15, offset 2135-2164, at +3/-14 - // in regular row-major format - 0x07, 0xe4, 0x30, 0x78, 0x80, 0x32, 0x00, 0x24, - 0x00, 0x50, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, - 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x12, 0x00, - 0xc3, 0x07, 0x01, 0xf8, 0x00, - // 'd' (0x64) 18x21, offset 2164-2212, at +2/-20 - // in regular row-major format - 0x00, 0x1e, 0x00, 0x00, 0x80, 0x00, 0x20, 0x00, - 0x08, 0x00, 0x02, 0x00, 0x00, 0x80, 0x7c, 0x20, - 0x60, 0xc8, 0x20, 0x0a, 0x10, 0x01, 0x84, 0x00, - 0x62, 0x00, 0x08, 0x80, 0x02, 0x20, 0x00, 0x88, - 0x00, 0x22, 0x00, 0x08, 0xc0, 0x06, 0x10, 0x01, - 0x82, 0x00, 0xe0, 0x60, 0xe8, 0x0f, 0xe3, 0xc0, - // 'e' (0x65) 16x15, offset 2212-2242, at +2/-14 - // in regular row-major format - 0x07, 0xe0, 0x1c, 0x18, 0x30, 0x0c, 0x60, 0x06, - 0x40, 0x03, 0xc0, 0x03, 0xc0, 0x01, 0xff, 0xff, - 0xc0, 0x00, 0xc0, 0x00, 0x40, 0x00, 0x60, 0x00, - 0x30, 0x03, 0x0c, 0x0e, 0x03, 0xf0, - // 'f' (0x66) 14x21, offset 2242-2279, at +4/-20 - // in regular row-major format - 0x03, 0xfc, 0x18, 0x00, 0x80, 0x02, 0x00, 0x08, - 0x00, 0x20, 0x0f, 0xff, 0x82, 0x00, 0x08, 0x00, - 0x20, 0x00, 0x80, 0x02, 0x00, 0x08, 0x00, 0x20, - 0x00, 0x80, 0x02, 0x00, 0x08, 0x00, 0x20, 0x00, - 0x80, 0x02, 0x00, 0xff, 0xf0, - // 'g' (0x67) 17x22, offset 2279-2326, at +2/-14 - // in regular row-major format - 0x0f, 0xc7, 0x9c, 0x3a, 0x18, 0x07, 0x08, 0x01, - 0x8c, 0x00, 0xc4, 0x00, 0x22, 0x00, 0x11, 0x00, - 0x08, 0x80, 0x04, 0x40, 0x02, 0x10, 0x03, 0x08, - 0x01, 0x82, 0x01, 0x40, 0xc3, 0x20, 0x3f, 0x10, - 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, - 0x00, 0x01, 0x00, 0x01, 0x00, 0x7f, 0x00, - // 'h' (0x68) 17x21, offset 2326-2371, at +1/-20 - // in regular row-major format - 0xf0, 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x00, 0x80, 0x00, 0x47, 0xc0, 0x2c, - 0x18, 0x1c, 0x04, 0x0c, 0x01, 0x04, 0x00, 0x82, - 0x00, 0x41, 0x00, 0x20, 0x80, 0x10, 0x40, 0x08, - 0x20, 0x04, 0x10, 0x02, 0x08, 0x01, 0x04, 0x00, - 0x82, 0x00, 0x47, 0xc0, 0xf8, - // 'i' (0x69) 14x22, offset 2371-2410, at +4/-21 - // in regular row-major format - 0x06, 0x00, 0x18, 0x00, 0x60, 0x01, 0x80, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x02, 0x00, - 0x08, 0x00, 0x20, 0x00, 0x80, 0x02, 0x00, 0x08, - 0x00, 0x20, 0x00, 0x80, 0x02, 0x00, 0x08, 0x00, - 0x20, 0x00, 0x80, 0x02, 0x03, 0xff, 0xf0, - // 'j' (0x6a) 10x29, offset 2410-2447, at +5/-21 - // in regular row-major format - 0x03, 0x00, 0xc0, 0x30, 0x0c, 0x00, 0x00, 0x00, - 0x03, 0xff, 0x00, 0x40, 0x10, 0x04, 0x01, 0x00, - 0x40, 0x10, 0x04, 0x01, 0x00, 0x40, 0x10, 0x04, - 0x01, 0x00, 0x40, 0x10, 0x04, 0x01, 0x00, 0x40, - 0x10, 0x08, 0x06, 0xfe, 0x00, - // 'k' (0x6b) 16x21, offset 2447-2489, at +2/-20 - // in regular row-major format - 0xf0, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, - 0x10, 0x00, 0x10, 0x00, 0x10, 0xfe, 0x10, 0x30, - 0x10, 0xe0, 0x11, 0xc0, 0x13, 0x00, 0x16, 0x00, - 0x1e, 0x00, 0x1b, 0x00, 0x11, 0x80, 0x10, 0xc0, - 0x10, 0x60, 0x10, 0x30, 0x10, 0x18, 0x10, 0x1c, - 0xf0, 0x3f, - // 'l' (0x6c) 14x21, offset 2489-2526, at +4/-20 - // in regular row-major format - 0x7e, 0x00, 0x08, 0x00, 0x20, 0x00, 0x80, 0x02, - 0x00, 0x08, 0x00, 0x20, 0x00, 0x80, 0x02, 0x00, - 0x08, 0x00, 0x20, 0x00, 0x80, 0x02, 0x00, 0x08, - 0x00, 0x20, 0x00, 0x80, 0x02, 0x00, 0x08, 0x00, - 0x20, 0x00, 0x80, 0xff, 0xfc, - // 'm' (0x6d) 19x15, offset 2526-2562, at +1/-14 - // in regular row-major format - 0xef, 0x9e, 0x07, 0x1e, 0x20, 0xc1, 0x82, 0x10, - 0x20, 0x42, 0x04, 0x08, 0x40, 0x81, 0x08, 0x10, - 0x21, 0x02, 0x04, 0x20, 0x40, 0x84, 0x08, 0x10, - 0x81, 0x02, 0x10, 0x20, 0x42, 0x04, 0x08, 0x40, - 0x81, 0x3e, 0x1c, 0x38, - // 'n' (0x6e) 17x15, offset 2562-2594, at +1/-14 - // in regular row-major format - 0x71, 0xf0, 0x0b, 0x06, 0x07, 0x01, 0x03, 0x00, - 0x41, 0x00, 0x20, 0x80, 0x10, 0x40, 0x08, 0x20, - 0x04, 0x10, 0x02, 0x08, 0x01, 0x04, 0x00, 0x82, - 0x00, 0x41, 0x00, 0x20, 0x80, 0x13, 0xf0, 0x3e, - // 'o' (0x6f) 15x15, offset 2594-2623, at +3/-14 - // in regular row-major format - 0x07, 0xc0, 0x30, 0x60, 0x80, 0x22, 0x00, 0x24, - 0x00, 0x50, 0x00, 0x60, 0x00, 0xc0, 0x01, 0x80, - 0x03, 0x00, 0x05, 0x00, 0x12, 0x00, 0x22, 0x00, - 0x83, 0x06, 0x01, 0xf0, 0x00, - // 'p' (0x70) 18x22, offset 2623-2673, at +1/-14 - // in regular row-major format - 0xf1, 0xfc, 0x05, 0xc1, 0x81, 0xc0, 0x10, 0x60, - 0x02, 0x18, 0x00, 0xc4, 0x00, 0x11, 0x00, 0x04, - 0x40, 0x01, 0x10, 0x00, 0x44, 0x00, 0x11, 0x80, - 0x08, 0x60, 0x02, 0x14, 0x01, 0x04, 0xc1, 0x81, - 0x0f, 0x80, 0x40, 0x00, 0x10, 0x00, 0x04, 0x00, - 0x01, 0x00, 0x00, 0x40, 0x00, 0x10, 0x00, 0x3f, - 0xc0, 0x00, - // 'q' (0x71) 18x22, offset 2673-2723, at +2/-14 - // in regular row-major format - 0x0f, 0xe3, 0xc6, 0x0e, 0x86, 0x00, 0xe1, 0x00, - 0x18, 0xc0, 0x06, 0x20, 0x00, 0x88, 0x00, 0x22, - 0x00, 0x08, 0x80, 0x02, 0x20, 0x00, 0x84, 0x00, - 0x61, 0x00, 0x18, 0x20, 0x0a, 0x06, 0x0c, 0x80, - 0x7c, 0x20, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, - 0x80, 0x00, 0x20, 0x00, 0x08, 0x00, 0x02, 0x00, - 0x0f, 0xf0, - // 'r' (0x72) 15x15, offset 2723-2752, at +3/-14 - // in regular row-major format - 0xf8, 0x7c, 0x11, 0x8c, 0x2c, 0x00, 0x70, 0x00, - 0xc0, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, - 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, - 0x01, 0x00, 0x3f, 0xfc, 0x00, - // 's' (0x73) 13x15, offset 2752-2777, at +4/-14 - // in regular row-major format - 0x0f, 0xd1, 0x83, 0x98, 0x04, 0x80, 0x24, 0x00, - 0x30, 0x00, 0xf0, 0x00, 0xfc, 0x00, 0x30, 0x00, - 0xe0, 0x03, 0x00, 0x1c, 0x01, 0xf0, 0x1a, 0x7f, - 0x00, - // 't' (0x74) 16x20, offset 2777-2817, at +1/-19 - // in regular row-major format - 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, - 0x08, 0x00, 0xff, 0xfc, 0x08, 0x00, 0x08, 0x00, - 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, - 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, - 0x08, 0x00, 0x08, 0x01, 0x06, 0x0f, 0x03, 0xf8, - // 'u' (0x75) 17x15, offset 2817-2849, at +1/-14 - // in regular row-major format - 0xf0, 0x3e, 0x08, 0x01, 0x04, 0x00, 0x82, 0x00, - 0x41, 0x00, 0x20, 0x80, 0x10, 0x40, 0x08, 0x20, - 0x04, 0x10, 0x02, 0x08, 0x01, 0x04, 0x00, 0x82, - 0x00, 0x41, 0x00, 0xe0, 0x41, 0xd0, 0x1f, 0x8e, - // 'v' (0x76) 19x15, offset 2849-2885, at +1/-14 - // in regular row-major format - 0xfe, 0x0f, 0xe2, 0x00, 0x20, 0x60, 0x0c, 0x0c, - 0x01, 0x80, 0x80, 0x20, 0x18, 0x0c, 0x01, 0x01, - 0x00, 0x30, 0x60, 0x02, 0x08, 0x00, 0x41, 0x00, - 0x0c, 0x60, 0x00, 0x88, 0x00, 0x19, 0x00, 0x01, - 0x40, 0x00, 0x38, 0x00, - // 'w' (0x77) 19x15, offset 2885-2921, at +1/-14 - // in regular row-major format - 0xfc, 0x07, 0xe4, 0x00, 0x10, 0x80, 0x02, 0x18, - 0x20, 0xc3, 0x0e, 0x18, 0x21, 0x42, 0x04, 0x28, - 0x40, 0x8d, 0x88, 0x19, 0x93, 0x03, 0x22, 0x60, - 0x2c, 0x68, 0x05, 0x85, 0x00, 0xa0, 0xa0, 0x1c, - 0x1c, 0x01, 0x81, 0x80, - // 'x' (0x78) 17x15, offset 2921-2953, at +2/-14 - // in regular row-major format - 0x7c, 0x1f, 0x18, 0x03, 0x06, 0x03, 0x01, 0x83, - 0x00, 0x63, 0x00, 0x1b, 0x00, 0x07, 0x00, 0x03, - 0x80, 0x03, 0x60, 0x03, 0x18, 0x03, 0x06, 0x03, - 0x01, 0x83, 0x00, 0x61, 0x00, 0x33, 0xf0, 0x7e, - // 'y' (0x79) 17x22, offset 2953-3000, at +2/-14 - // in regular row-major format - 0xfc, 0x1f, 0x90, 0x01, 0x8c, 0x00, 0x86, 0x00, - 0xc1, 0x80, 0x40, 0xc0, 0x60, 0x20, 0x20, 0x18, - 0x30, 0x04, 0x10, 0x03, 0x08, 0x00, 0x8c, 0x00, - 0x64, 0x00, 0x16, 0x00, 0x0e, 0x00, 0x07, 0x00, - 0x01, 0x00, 0x01, 0x80, 0x00, 0x80, 0x00, 0xc0, - 0x00, 0x60, 0x00, 0x20, 0x07, 0xfe, 0x00, - // 'z' (0x7a) 13x15, offset 3000-3025, at +4/-14 - // in regular row-major format - 0xff, 0xf4, 0x01, 0x20, 0x09, 0x00, 0x80, 0x08, - 0x00, 0x80, 0x08, 0x00, 0xc0, 0x04, 0x00, 0x40, - 0x04, 0x00, 0x40, 0x14, 0x00, 0xa0, 0x07, 0xff, - 0xe0, - // '{' (0x7b) 8x25, offset 3025-3050, at +6/-20 - // in regular row-major format - 0x07, 0x0c, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x30, 0xc0, 0x30, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x0c, - 0x07, - // '|' (0x7c) 1x25, offset 3050-3054, at +10/-20 - // in regular row-major format - 0xff, 0xff, 0xff, 0x80, - // '}' (0x7d) 8x25, offset 3054-3079, at +7/-20 - // in regular row-major format - 0xe0, 0x30, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x08, 0x07, 0x0c, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x30, - 0xe0, -}; - - -static const uint8_t FreeMono24pt7b_generic[] = { - // ' ' (0x20) 0x0, offset 0-0, at +0/+1 - // in regular row-major format - // '!' (0x21) 5x30, offset 0-19, at +11/-28 - // in regular row-major format - 0x73, 0x9c, 0xe7, 0x39, 0xce, 0x73, 0x9c, 0xe7, - 0x10, 0x84, 0x21, 0x08, 0x00, 0x00, 0x00, 0x03, - 0xbf, 0xff, 0xb8, - // '"' (0x22) 16x14, offset 19-47, at +6/-28 - // in regular row-major format - 0xfe, 0x7f, 0x7c, 0x3e, 0x7c, 0x3e, 0x7c, 0x3e, - 0x7c, 0x3e, 0x7c, 0x3e, 0x7c, 0x3e, 0x7c, 0x3e, - 0x3c, 0x3e, 0x38, 0x1c, 0x38, 0x1c, 0x38, 0x1c, - 0x38, 0x1c, 0x38, 0x1c, - // '#' (0x23) 19x32, offset 47-123, at +4/-29 - // in regular row-major format - 0x01, 0x86, 0x00, 0x30, 0xc0, 0x06, 0x18, 0x00, - 0xc3, 0x00, 0x18, 0x60, 0x03, 0x0c, 0x00, 0x61, - 0x80, 0x0c, 0x70, 0x01, 0x8c, 0x00, 0x61, 0x80, - 0x0c, 0x30, 0x3f, 0xff, 0xf7, 0xff, 0xfe, 0x06, - 0x18, 0x00, 0xc3, 0x00, 0x18, 0x60, 0x03, 0x0c, - 0x00, 0x61, 0x80, 0x0c, 0x30, 0x7f, 0xff, 0xef, - 0xff, 0xfc, 0x06, 0x18, 0x00, 0xc7, 0x00, 0x38, - 0xc0, 0x06, 0x18, 0x00, 0xc3, 0x00, 0x18, 0x60, - 0x03, 0x0c, 0x00, 0x61, 0x80, 0x0c, 0x30, 0x01, - 0x86, 0x00, 0x30, 0xc0, - // '$' (0x24) 18x33, offset 123-198, at +5/-29 - // in regular row-major format - 0x00, 0xc0, 0x00, 0x30, 0x00, 0x0c, 0x00, 0x0f, - 0xc0, 0x0f, 0xfd, 0x87, 0x03, 0xe3, 0x80, 0x39, - 0xc0, 0x06, 0x60, 0x01, 0x98, 0x00, 0x06, 0x00, - 0x01, 0xc0, 0x00, 0x38, 0x00, 0x07, 0xc0, 0x00, - 0x7f, 0x80, 0x03, 0xf8, 0x00, 0x0f, 0x80, 0x00, - 0x60, 0x00, 0x1c, 0x00, 0x03, 0x80, 0x00, 0xf0, - 0x00, 0x3c, 0x00, 0x1f, 0x80, 0x0e, 0xfc, 0x0f, - 0x37, 0xff, 0x80, 0x7f, 0x80, 0x03, 0x00, 0x00, - 0xc0, 0x00, 0x30, 0x00, 0x0c, 0x00, 0x03, 0x00, - 0x00, 0xc0, 0x00, - // '%' (0x25) 20x29, offset 198-271, at +4/-27 - // in regular row-major format - 0x07, 0x80, 0x01, 0xfe, 0x00, 0x38, 0x70, 0x03, - 0x03, 0x00, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, - 0x18, 0x06, 0x01, 0x80, 0x30, 0x30, 0x03, 0x87, - 0x00, 0x1f, 0xe0, 0x30, 0x78, 0x1f, 0x00, 0x1f, - 0x80, 0x0f, 0xc0, 0x07, 0xe0, 0x03, 0xf0, 0x00, - 0xf8, 0x00, 0x0c, 0x01, 0xe0, 0x00, 0x7f, 0x80, - 0x0e, 0x1c, 0x00, 0xc0, 0xc0, 0x18, 0x06, 0x01, - 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x0c, - 0x0e, 0x00, 0xe1, 0xc0, 0x07, 0xf8, 0x00, 0x1e, - 0x00, - // '&' (0x26) 18x25, offset 271-328, at +5/-23 - // in regular row-major format - 0x03, 0xec, 0x01, 0xff, 0x00, 0xe1, 0x00, 0x70, - 0x00, 0x18, 0x00, 0x06, 0x00, 0x01, 0x80, 0x00, - 0x30, 0x00, 0x0c, 0x00, 0x01, 0x80, 0x00, 0x60, - 0x00, 0x7c, 0x00, 0x3b, 0x83, 0xd8, 0x60, 0xfe, - 0x0c, 0x33, 0x03, 0x98, 0xc0, 0x66, 0x30, 0x0d, - 0x8c, 0x03, 0xc3, 0x00, 0x70, 0x60, 0x1c, 0x1c, - 0x0f, 0x03, 0x87, 0x7c, 0x7f, 0x9f, 0x07, 0x80, - 0x00, - // ''' (0x27) 7x14, offset 328-341, at +11/-28 - // in regular row-major format - 0xfe, 0xf9, 0xf3, 0xe7, 0xcf, 0x9f, 0x3e, 0x3c, - 0x70, 0xe1, 0xc3, 0x87, 0x00, - // '(' (0x28) 7x34, offset 341-371, at +14/-27 - // in regular row-major format - 0x06, 0x1c, 0x30, 0xe1, 0x87, 0x0e, 0x18, 0x70, - 0xe1, 0xc3, 0x0e, 0x1c, 0x38, 0x70, 0xe1, 0xc3, - 0x87, 0x0e, 0x0c, 0x1c, 0x38, 0x70, 0x60, 0xe1, - 0xc1, 0x83, 0x83, 0x06, 0x06, 0x04, - // ')' (0x29) 7x34, offset 371-401, at +8/-27 - // in regular row-major format - 0xc1, 0xc1, 0x83, 0x83, 0x07, 0x0e, 0x0c, 0x1c, - 0x38, 0x70, 0xe0, 0xe1, 0xc3, 0x87, 0x0e, 0x1c, - 0x38, 0x70, 0xe1, 0x87, 0x0e, 0x1c, 0x30, 0x61, - 0xc3, 0x0e, 0x18, 0x70, 0xc1, 0x00, - // '*' (0x2a) 18x16, offset 401-437, at +5/-27 - // in regular row-major format - 0x00, 0xc0, 0x00, 0x30, 0x00, 0x0c, 0x00, 0x03, - 0x00, 0x00, 0xc0, 0x10, 0x30, 0x3f, 0x8c, 0x7c, - 0xff, 0xfc, 0x07, 0xf8, 0x00, 0x78, 0x00, 0x1f, - 0x00, 0x0c, 0xc0, 0x06, 0x18, 0x03, 0x87, 0x00, - 0xc0, 0xc0, 0x60, 0x18, - // '+' (0x2b) 20x22, offset 437-492, at +4/-23 - // in regular row-major format - 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x60, 0x00, - 0x06, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, - 0x60, 0x00, 0x06, 0x00, 0x00, 0x60, 0x00, 0x06, - 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x60, - 0x00, 0x06, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, - 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x60, 0x00, - 0x06, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, - // ',' (0x2c) 9x14, offset 492-508, at +6/-6 - // in regular row-major format - 0x1f, 0x8f, 0x87, 0xc7, 0xc3, 0xe1, 0xe1, 0xf0, - 0xf0, 0x78, 0x38, 0x3c, 0x1c, 0x0e, 0x06, 0x00, - // '-' (0x2d) 22x2, offset 508-514, at +3/-13 - // in regular row-major format - 0x7f, 0xff, 0xfd, 0xff, 0xff, 0xf0, - // '.' (0x2e) 7x6, offset 514-520, at +11/-4 - // in regular row-major format - 0x7d, 0xff, 0xff, 0xff, 0xef, 0x80, - // '/' (0x2f) 18x35, offset 520-599, at +5/-30 - // in regular row-major format - 0x00, 0x00, 0xc0, 0x00, 0x70, 0x00, 0x18, 0x00, - 0x06, 0x00, 0x03, 0x00, 0x00, 0xc0, 0x00, 0x60, - 0x00, 0x18, 0x00, 0x0c, 0x00, 0x03, 0x00, 0x01, - 0x80, 0x00, 0x60, 0x00, 0x30, 0x00, 0x0c, 0x00, - 0x06, 0x00, 0x01, 0x80, 0x00, 0xc0, 0x00, 0x30, - 0x00, 0x18, 0x00, 0x06, 0x00, 0x03, 0x80, 0x00, - 0xc0, 0x00, 0x70, 0x00, 0x18, 0x00, 0x0e, 0x00, - 0x03, 0x00, 0x01, 0xc0, 0x00, 0x60, 0x00, 0x38, - 0x00, 0x0c, 0x00, 0x07, 0x00, 0x01, 0x80, 0x00, - 0x60, 0x00, 0x30, 0x00, 0x0c, 0x00, 0x00, - // '0' (0x30) 18x30, offset 599-667, at +5/-28 - // in regular row-major format - 0x03, 0xf0, 0x03, 0xff, 0x01, 0xe1, 0xe0, 0xe0, - 0x18, 0x30, 0x03, 0x1c, 0x00, 0xe6, 0x00, 0x19, - 0x80, 0x06, 0xe0, 0x01, 0xf0, 0x00, 0x3c, 0x00, - 0x0f, 0x00, 0x03, 0xc0, 0x00, 0xf0, 0x00, 0x3c, - 0x00, 0x0f, 0x00, 0x03, 0xc0, 0x00, 0xf0, 0x00, - 0x3c, 0x00, 0x0f, 0x00, 0x03, 0xc0, 0x00, 0xf8, - 0x00, 0x76, 0x00, 0x19, 0x80, 0x06, 0x70, 0x03, - 0x8c, 0x00, 0xc3, 0x80, 0x60, 0x78, 0x78, 0x0f, - 0xfc, 0x00, 0xfc, 0x00, - // '1' (0x31) 16x29, offset 667-725, at +6/-28 - // in regular row-major format - 0x03, 0x80, 0x07, 0x80, 0x0f, 0x80, 0x1d, 0x80, - 0x39, 0x80, 0x71, 0x80, 0xe1, 0x80, 0xc1, 0x80, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0xff, 0xff, - 0xff, 0xff, - // '2' (0x32) 18x29, offset 725-791, at +5/-28 - // in regular row-major format - 0x03, 0xf0, 0x03, 0xff, 0x01, 0xc0, 0xe0, 0xc0, - 0x1c, 0x60, 0x03, 0xb8, 0x00, 0x6c, 0x00, 0x0f, - 0x00, 0x03, 0x00, 0x00, 0xc0, 0x00, 0x30, 0x00, - 0x18, 0x00, 0x06, 0x00, 0x03, 0x00, 0x01, 0x80, - 0x00, 0xc0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x18, - 0x00, 0x0c, 0x00, 0x06, 0x00, 0x03, 0x00, 0x01, - 0x80, 0x00, 0xc0, 0x00, 0x60, 0x00, 0x30, 0x00, - 0xd0, 0x00, 0x38, 0x00, 0x0f, 0xff, 0xff, 0xff, - 0xff, 0xc0, - // '3' (0x33) 19x30, offset 791-863, at +5/-28 - // in regular row-major format - 0x03, 0xf8, 0x01, 0xff, 0xc0, 0x70, 0x3c, 0x18, - 0x01, 0xc6, 0x00, 0x18, 0x00, 0x01, 0x80, 0x00, - 0x30, 0x00, 0x06, 0x00, 0x00, 0xc0, 0x00, 0x18, - 0x00, 0x06, 0x00, 0x01, 0xc0, 0x00, 0x70, 0x01, - 0xfc, 0x00, 0x3f, 0x00, 0x00, 0x78, 0x00, 0x03, - 0x80, 0x00, 0x38, 0x00, 0x03, 0x00, 0x00, 0x30, - 0x00, 0x06, 0x00, 0x00, 0xc0, 0x00, 0x18, 0x00, - 0x03, 0x00, 0x00, 0xd8, 0x00, 0x3b, 0x80, 0x0e, - 0x3e, 0x07, 0x81, 0xff, 0xe0, 0x07, 0xe0, 0x00, - // '4' (0x34) 16x28, offset 863-919, at +6/-27 - // in regular row-major format - 0x00, 0x3c, 0x00, 0x7c, 0x00, 0x6c, 0x00, 0xcc, - 0x00, 0x8c, 0x01, 0x8c, 0x03, 0x0c, 0x03, 0x0c, - 0x06, 0x0c, 0x04, 0x0c, 0x0c, 0x0c, 0x08, 0x0c, - 0x10, 0x0c, 0x30, 0x0c, 0x20, 0x0c, 0x60, 0x0c, - 0x40, 0x0c, 0x80, 0x0c, 0xff, 0xff, 0xff, 0xff, - 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x0c, - 0x00, 0x0c, 0x00, 0x0c, 0x00, 0xff, 0x00, 0xff, - // '5' (0x35) 19x29, offset 919-988, at +5/-27 - // in regular row-major format - 0x3f, 0xff, 0x07, 0xff, 0xe0, 0xc0, 0x00, 0x18, - 0x00, 0x03, 0x00, 0x00, 0x60, 0x00, 0x0c, 0x00, - 0x01, 0x80, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00, - 0xc7, 0xe0, 0x1f, 0xff, 0x03, 0x80, 0x70, 0x00, - 0x03, 0x00, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00, - 0x60, 0x00, 0x0c, 0x00, 0x01, 0x80, 0x00, 0x30, - 0x00, 0x06, 0x00, 0x00, 0xc0, 0x00, 0x30, 0x00, - 0x06, 0xc0, 0x01, 0xdc, 0x00, 0x71, 0xf0, 0x3c, - 0x0f, 0xff, 0x00, 0x3f, 0x00, - // '6' (0x36) 18x30, offset 988-1056, at +6/-28 - // in regular row-major format - 0x00, 0x3f, 0x80, 0x3f, 0xf0, 0x3e, 0x00, 0x1e, - 0x00, 0x0e, 0x00, 0x07, 0x00, 0x03, 0x80, 0x00, - 0xc0, 0x00, 0x70, 0x00, 0x18, 0x00, 0x06, 0x00, - 0x03, 0x80, 0x00, 0xc1, 0xf8, 0x31, 0xff, 0x0c, - 0xf0, 0xf3, 0x70, 0x0c, 0xd8, 0x01, 0xbc, 0x00, - 0x6e, 0x00, 0x0f, 0x80, 0x03, 0xc0, 0x00, 0xd8, - 0x00, 0x36, 0x00, 0x0d, 0x80, 0x03, 0x30, 0x01, - 0x8e, 0x00, 0x61, 0xc0, 0x30, 0x38, 0x38, 0x07, - 0xfc, 0x00, 0x7c, 0x00, - // '7' (0x37) 18x28, offset 1056-1119, at +5/-27 - // in regular row-major format - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x0f, 0x00, - 0x03, 0xc0, 0x01, 0xc0, 0x00, 0x60, 0x00, 0x18, - 0x00, 0x0e, 0x00, 0x03, 0x00, 0x00, 0xc0, 0x00, - 0x30, 0x00, 0x18, 0x00, 0x06, 0x00, 0x01, 0x80, - 0x00, 0xc0, 0x00, 0x30, 0x00, 0x0c, 0x00, 0x06, - 0x00, 0x01, 0x80, 0x00, 0x60, 0x00, 0x30, 0x00, - 0x0c, 0x00, 0x03, 0x00, 0x01, 0x80, 0x00, 0x60, - 0x00, 0x18, 0x00, 0x0c, 0x00, 0x03, 0x00, - // '8' (0x38) 18x30, offset 1119-1187, at +5/-28 - // in regular row-major format - 0x03, 0xf0, 0x03, 0xff, 0x03, 0xc0, 0xf1, 0xc0, - 0x0e, 0x60, 0x01, 0xb8, 0x00, 0x7c, 0x00, 0x0f, - 0x00, 0x03, 0xc0, 0x00, 0xf0, 0x00, 0x36, 0x00, - 0x18, 0xc0, 0x0c, 0x1c, 0x0e, 0x03, 0xff, 0x00, - 0xff, 0xc0, 0x70, 0x38, 0x30, 0x03, 0x18, 0x00, - 0x66, 0x00, 0x1b, 0x00, 0x03, 0xc0, 0x00, 0xf0, - 0x00, 0x3c, 0x00, 0x0f, 0x00, 0x03, 0x60, 0x01, - 0x98, 0x00, 0xe3, 0x00, 0x70, 0x70, 0x38, 0x0f, - 0xfc, 0x00, 0xfc, 0x00, - // '9' (0x39) 18x30, offset 1187-1255, at +6/-28 - // in regular row-major format - 0x07, 0xe0, 0x03, 0xfe, 0x01, 0xc1, 0xc0, 0xc0, - 0x38, 0x60, 0x07, 0x18, 0x00, 0xcc, 0x00, 0x1b, - 0x00, 0x06, 0xc0, 0x01, 0xb0, 0x00, 0x3c, 0x00, - 0x1f, 0x00, 0x07, 0x60, 0x03, 0xd8, 0x01, 0xb3, - 0x00, 0xcc, 0xf0, 0xf3, 0x0f, 0xf8, 0xc1, 0xf8, - 0x30, 0x00, 0x1c, 0x00, 0x06, 0x00, 0x01, 0x80, - 0x00, 0xe0, 0x00, 0x30, 0x00, 0x1c, 0x00, 0x0e, - 0x00, 0x07, 0x00, 0x07, 0x80, 0x07, 0xc0, 0xff, - 0xc0, 0x1f, 0xc0, 0x00, - // ':' (0x3a) 7x21, offset 1255-1274, at +11/-19 - // in regular row-major format - 0x7d, 0xff, 0xff, 0xff, 0xef, 0x80, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0xff, 0xff, - 0xff, 0xf7, 0xc0, - // ';' (0x3b) 10x27, offset 1274-1308, at +7/-19 - // in regular row-major format - 0x0f, 0x87, 0xf1, 0xfc, 0x7f, 0x1f, 0xc3, 0xe0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x07, 0xf1, 0xf8, 0x7c, 0x3f, 0x0f, 0x83, 0xe0, - 0xf0, 0x7c, 0x1e, 0x07, 0x81, 0xc0, 0xf0, 0x38, - 0x04, 0x00, - // '<' (0x3c) 22x22, offset 1308-1369, at +3/-23 - // in regular row-major format - 0x00, 0x00, 0x18, 0x00, 0x01, 0xe0, 0x00, 0x1e, - 0x00, 0x00, 0xe0, 0x00, 0x0f, 0x00, 0x00, 0xf0, - 0x00, 0x0f, 0x00, 0x00, 0xf0, 0x00, 0x07, 0x00, - 0x00, 0x78, 0x00, 0x07, 0x80, 0x00, 0x0f, 0x00, - 0x00, 0x1e, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x1e, - 0x00, 0x00, 0x1e, 0x00, 0x00, 0x1e, 0x00, 0x00, - 0x3c, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x3c, 0x00, - 0x00, 0x38, 0x00, 0x00, 0x20, - // '=' (0x3d) 24x9, offset 1369-1396, at +2/-17 - // in regular row-major format - 0x7f, 0xff, 0xff, 0x7f, 0xff, 0xff, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, - 0x7f, 0xff, 0xff, - // '>' (0x3e) 21x22, offset 1396-1454, at +4/-23 - // in regular row-major format - 0xc0, 0x00, 0x07, 0x80, 0x00, 0x0f, 0x00, 0x00, - 0x1e, 0x00, 0x00, 0x38, 0x00, 0x00, 0xf0, 0x00, - 0x01, 0xe0, 0x00, 0x03, 0xc0, 0x00, 0x07, 0x80, - 0x00, 0x0e, 0x00, 0x00, 0x3c, 0x00, 0x01, 0xe0, - 0x00, 0x3c, 0x00, 0x07, 0x80, 0x00, 0xf0, 0x00, - 0x1e, 0x00, 0x01, 0xe0, 0x00, 0x3c, 0x00, 0x07, - 0x80, 0x00, 0xf0, 0x00, 0x0e, 0x00, 0x00, 0x60, - 0x00, 0x00, - // '?' (0x3f) 17x28, offset 1454-1514, at +6/-26 - // in regular row-major format - 0x07, 0xf0, 0x1f, 0xfe, 0x3e, 0x07, 0x98, 0x00, - 0xec, 0x00, 0x36, 0x00, 0x0f, 0x00, 0x06, 0x00, - 0x03, 0x00, 0x01, 0x80, 0x01, 0xc0, 0x00, 0xc0, - 0x01, 0xc0, 0x03, 0xc0, 0x07, 0xc0, 0x07, 0x00, - 0x03, 0x00, 0x01, 0x80, 0x00, 0xc0, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x07, 0x80, 0x07, 0xe0, 0x03, 0xf0, 0x01, - 0xf8, 0x00, 0x78, 0x00, - // '@' (0x40) 18x32, offset 1514-1586, at +5/-28 - // in regular row-major format - 0x03, 0xf0, 0x03, 0xff, 0x01, 0xe0, 0xe0, 0xe0, - 0x1c, 0x30, 0x03, 0x1c, 0x00, 0x66, 0x00, 0x19, - 0x80, 0x06, 0xc0, 0x01, 0xb0, 0x07, 0xec, 0x07, - 0xfb, 0x03, 0xc6, 0xc1, 0xc1, 0xb0, 0xe0, 0x6c, - 0x30, 0x1b, 0x0c, 0x06, 0xc3, 0x01, 0xb0, 0xc0, - 0x6c, 0x18, 0x1b, 0x07, 0x86, 0xc0, 0xff, 0xf0, - 0x0f, 0xfc, 0x00, 0x03, 0x00, 0x00, 0x60, 0x00, - 0x18, 0x00, 0x07, 0x00, 0x00, 0xc0, 0x00, 0x38, - 0x00, 0x07, 0x80, 0xc0, 0xff, 0xf0, 0x0f, 0xe0, - // 'A' (0x41) 28x26, offset 1586-1677, at +0/-25 - // in regular row-major format - 0x07, 0xff, 0x00, 0x00, 0x7f, 0xf0, 0x00, 0x00, - 0x1b, 0x00, 0x00, 0x01, 0x98, 0x00, 0x00, 0x11, - 0x80, 0x00, 0x03, 0x0c, 0x00, 0x00, 0x30, 0xc0, - 0x00, 0x06, 0x0c, 0x00, 0x00, 0x60, 0x60, 0x00, - 0x06, 0x06, 0x00, 0x00, 0xc0, 0x30, 0x00, 0x0c, - 0x03, 0x00, 0x00, 0x80, 0x30, 0x00, 0x18, 0x01, - 0x80, 0x01, 0x80, 0x18, 0x00, 0x3f, 0xff, 0x80, - 0x03, 0xff, 0xfc, 0x00, 0x20, 0x00, 0xc0, 0x06, - 0x00, 0x06, 0x00, 0x60, 0x00, 0x60, 0x0c, 0x00, - 0x06, 0x00, 0xc0, 0x00, 0x30, 0x0c, 0x00, 0x03, - 0x01, 0x80, 0x00, 0x18, 0x7f, 0xc0, 0x3f, 0xf7, - 0xfc, 0x03, 0xff, - // 'B' (0x42) 22x26, offset 1677-1749, at +3/-25 - // in regular row-major format - 0xff, 0xff, 0x03, 0xff, 0xff, 0x01, 0x80, 0x0e, - 0x06, 0x00, 0x1c, 0x18, 0x00, 0x38, 0x60, 0x00, - 0x61, 0x80, 0x01, 0x86, 0x00, 0x06, 0x18, 0x00, - 0x38, 0x60, 0x01, 0xc1, 0x80, 0x1e, 0x07, 0xff, - 0xe0, 0x1f, 0xff, 0xc0, 0x60, 0x03, 0xc1, 0x80, - 0x03, 0x86, 0x00, 0x06, 0x18, 0x00, 0x1c, 0x60, - 0x00, 0x31, 0x80, 0x00, 0xc6, 0x00, 0x03, 0x18, - 0x00, 0x0c, 0x60, 0x00, 0x61, 0x80, 0x03, 0x86, - 0x00, 0x1c, 0xff, 0xff, 0xe3, 0xff, 0xfe, 0x00, - // 'C' (0x43) 22x28, offset 1749-1826, at +3/-26 - // in regular row-major format - 0x00, 0xfc, 0x00, 0x0f, 0xfe, 0x60, 0xf0, 0x3d, - 0x87, 0x00, 0x3e, 0x38, 0x00, 0x38, 0xc0, 0x00, - 0xe7, 0x00, 0x01, 0x98, 0x00, 0x06, 0x60, 0x00, - 0x03, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x30, 0x00, - 0x00, 0xc0, 0x00, 0x03, 0x00, 0x00, 0x0c, 0x00, - 0x00, 0x30, 0x00, 0x00, 0xc0, 0x00, 0x03, 0x00, - 0x00, 0x0c, 0x00, 0x00, 0x18, 0x00, 0x00, 0x60, - 0x00, 0x01, 0xc0, 0x00, 0x03, 0x80, 0x00, 0xc7, - 0x00, 0x06, 0x0e, 0x00, 0x70, 0x1e, 0x07, 0x80, - 0x3f, 0xfc, 0x00, 0x1f, 0x80, - // 'D' (0x44) 22x26, offset 1826-1898, at +3/-25 - // in regular row-major format - 0xff, 0xfe, 0x03, 0xff, 0xfe, 0x03, 0x00, 0x3c, - 0x0c, 0x00, 0x38, 0x30, 0x00, 0x70, 0xc0, 0x00, - 0xc3, 0x00, 0x03, 0x8c, 0x00, 0x06, 0x30, 0x00, - 0x1c, 0xc0, 0x00, 0x33, 0x00, 0x00, 0xcc, 0x00, - 0x03, 0x30, 0x00, 0x0c, 0xc0, 0x00, 0x33, 0x00, - 0x00, 0xcc, 0x00, 0x03, 0x30, 0x00, 0x0c, 0xc0, - 0x00, 0x33, 0x00, 0x01, 0x8c, 0x00, 0x06, 0x30, - 0x00, 0x30, 0xc0, 0x01, 0xc3, 0x00, 0x0e, 0x0c, - 0x00, 0xf0, 0xff, 0xff, 0x83, 0xff, 0xf8, 0x00, - // 'E' (0x45) 22x26, offset 1898-1970, at +3/-25 - // in regular row-major format - 0xff, 0xff, 0xfb, 0xff, 0xff, 0xe1, 0x80, 0x01, - 0x86, 0x00, 0x06, 0x18, 0x00, 0x18, 0x60, 0x00, - 0x61, 0x80, 0x01, 0x86, 0x00, 0x00, 0x18, 0x0c, - 0x00, 0x60, 0x30, 0x01, 0x80, 0xc0, 0x07, 0xff, - 0x00, 0x1f, 0xfc, 0x00, 0x60, 0x30, 0x01, 0x80, - 0xc0, 0x06, 0x03, 0x00, 0x18, 0x00, 0x00, 0x60, - 0x00, 0x01, 0x80, 0x00, 0xc6, 0x00, 0x03, 0x18, - 0x00, 0x0c, 0x60, 0x00, 0x31, 0x80, 0x00, 0xc6, - 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - // 'F' (0x46) 22x26, offset 1970-2042, at +3/-25 - // in regular row-major format - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x80, 0x00, - 0xc6, 0x00, 0x03, 0x18, 0x00, 0x0c, 0x60, 0x00, - 0x31, 0x80, 0x00, 0xc6, 0x00, 0x00, 0x18, 0x0c, - 0x00, 0x60, 0x30, 0x01, 0x80, 0xc0, 0x07, 0xff, - 0x00, 0x1f, 0xfc, 0x00, 0x60, 0x30, 0x01, 0x80, - 0xc0, 0x06, 0x03, 0x00, 0x18, 0x00, 0x00, 0x60, - 0x00, 0x01, 0x80, 0x00, 0x06, 0x00, 0x00, 0x18, - 0x00, 0x00, 0x60, 0x00, 0x01, 0x80, 0x00, 0x06, - 0x00, 0x00, 0xff, 0xf0, 0x03, 0xff, 0xc0, 0x00, - // 'G' (0x47) 23x28, offset 2042-2123, at +3/-26 - // in regular row-major format - 0x00, 0xff, 0x00, 0x07, 0xff, 0x98, 0x1e, 0x03, - 0xf0, 0x70, 0x01, 0xe1, 0x80, 0x01, 0xc6, 0x00, - 0x01, 0x9c, 0x00, 0x03, 0x30, 0x00, 0x00, 0x60, - 0x00, 0x01, 0xc0, 0x00, 0x03, 0x00, 0x00, 0x06, - 0x00, 0x00, 0x0c, 0x00, 0x00, 0x18, 0x00, 0x00, - 0x30, 0x00, 0x00, 0x60, 0x03, 0xff, 0xc0, 0x07, - 0xff, 0x80, 0x00, 0x1b, 0x00, 0x00, 0x37, 0x00, - 0x00, 0x66, 0x00, 0x00, 0xcc, 0x00, 0x01, 0x8c, - 0x00, 0x03, 0x1c, 0x00, 0x06, 0x1e, 0x00, 0x0c, - 0x0f, 0x00, 0xf8, 0x0f, 0xff, 0xc0, 0x03, 0xfc, - 0x00, - // 'H' (0x48) 23x26, offset 2123-2198, at +3/-25 - // in regular row-major format - 0x7f, 0x01, 0xfc, 0xfe, 0x03, 0xf8, 0x60, 0x00, - 0xc0, 0xc0, 0x01, 0x81, 0x80, 0x03, 0x03, 0x00, - 0x06, 0x06, 0x00, 0x0c, 0x0c, 0x00, 0x18, 0x18, - 0x00, 0x30, 0x30, 0x00, 0x60, 0x60, 0x00, 0xc0, - 0xff, 0xff, 0x81, 0xff, 0xff, 0x03, 0x00, 0x06, - 0x06, 0x00, 0x0c, 0x0c, 0x00, 0x18, 0x18, 0x00, - 0x30, 0x30, 0x00, 0x60, 0x60, 0x00, 0xc0, 0xc0, - 0x01, 0x81, 0x80, 0x03, 0x03, 0x00, 0x06, 0x06, - 0x00, 0x0c, 0x0c, 0x00, 0x18, 0xff, 0x01, 0xff, - 0xfe, 0x03, 0xfc, - // 'I' (0x49) 16x26, offset 2198-2250, at +6/-25 - // in regular row-major format - 0xff, 0xff, 0xff, 0xff, 0x01, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, - 0xff, 0xff, 0xff, 0xff, - // 'J' (0x4a) 23x27, offset 2250-2328, at +4/-25 - // in regular row-major format - 0x00, 0xff, 0xfe, 0x01, 0xff, 0xfc, 0x00, 0x03, - 0x00, 0x00, 0x06, 0x00, 0x00, 0x0c, 0x00, 0x00, - 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, 0x00, - 0x00, 0xc0, 0x00, 0x01, 0x80, 0x00, 0x03, 0x00, - 0x00, 0x06, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x18, - 0x00, 0x00, 0x30, 0x60, 0x00, 0x60, 0xc0, 0x00, - 0xc1, 0x80, 0x01, 0x83, 0x00, 0x03, 0x06, 0x00, - 0x06, 0x0c, 0x00, 0x0c, 0x18, 0x00, 0x30, 0x38, - 0x00, 0x60, 0x38, 0x01, 0x80, 0x3c, 0x0e, 0x00, - 0x3f, 0xf8, 0x00, 0x0f, 0xc0, 0x00, - // 'K' (0x4b) 24x26, offset 2328-2406, at +3/-25 - // in regular row-major format - 0xff, 0x81, 0xfe, 0xff, 0x81, 0xfe, 0x18, 0x00, - 0x30, 0x18, 0x00, 0xe0, 0x18, 0x01, 0xc0, 0x18, - 0x03, 0x80, 0x18, 0x07, 0x00, 0x18, 0x0e, 0x00, - 0x18, 0x18, 0x00, 0x18, 0x70, 0x00, 0x18, 0xe0, - 0x00, 0x19, 0xe0, 0x00, 0x1b, 0xf8, 0x00, 0x1f, - 0x1c, 0x00, 0x1c, 0x06, 0x00, 0x18, 0x03, 0x00, - 0x18, 0x03, 0x80, 0x18, 0x01, 0x80, 0x18, 0x00, - 0xc0, 0x18, 0x00, 0xc0, 0x18, 0x00, 0x60, 0x18, - 0x00, 0x60, 0x18, 0x00, 0x70, 0x18, 0x00, 0x30, - 0xff, 0x80, 0x3f, 0xff, 0x80, 0x1f, - // 'L' (0x4c) 21x26, offset 2406-2475, at +4/-25 - // in regular row-major format - 0xff, 0xf0, 0x07, 0xff, 0x80, 0x01, 0x80, 0x00, - 0x0c, 0x00, 0x00, 0x60, 0x00, 0x03, 0x00, 0x00, - 0x18, 0x00, 0x00, 0xc0, 0x00, 0x06, 0x00, 0x00, - 0x30, 0x00, 0x01, 0x80, 0x00, 0x0c, 0x00, 0x00, - 0x60, 0x00, 0x03, 0x00, 0x00, 0x18, 0x00, 0x00, - 0xc0, 0x00, 0x06, 0x00, 0x18, 0x30, 0x00, 0xc1, - 0x80, 0x06, 0x0c, 0x00, 0x30, 0x60, 0x01, 0x83, - 0x00, 0x0c, 0x18, 0x00, 0x60, 0xc0, 0x03, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc0, - // 'M' (0x4d) 26x26, offset 2475-2560, at +1/-25 - // in regular row-major format - 0xfc, 0x00, 0x0f, 0xff, 0x00, 0x03, 0xf3, 0x60, - 0x01, 0xb0, 0xd8, 0x00, 0x6c, 0x33, 0x00, 0x33, - 0x0c, 0xc0, 0x0c, 0xc3, 0x38, 0x07, 0x30, 0xc6, - 0x01, 0x8c, 0x31, 0xc0, 0xe3, 0x0c, 0x30, 0x30, - 0xc3, 0x0c, 0x0c, 0x30, 0xc1, 0x86, 0x0c, 0x30, - 0x61, 0x83, 0x0c, 0x0c, 0xc0, 0xc3, 0x03, 0x30, - 0x30, 0xc0, 0x78, 0x0c, 0x30, 0x1e, 0x03, 0x0c, - 0x03, 0x00, 0xc3, 0x00, 0x00, 0x30, 0xc0, 0x00, - 0x0c, 0x30, 0x00, 0x03, 0x0c, 0x00, 0x00, 0xc3, - 0x00, 0x00, 0x30, 0xc0, 0x00, 0x0c, 0xff, 0x00, - 0x3f, 0xff, 0xc0, 0x0f, 0xf0, - // 'N' (0x4e) 24x26, offset 2560-2638, at +2/-25 - // in regular row-major format - 0xfc, 0x00, 0xff, 0xfc, 0x00, 0xff, 0x1e, 0x00, - 0x0c, 0x1f, 0x00, 0x0c, 0x1b, 0x00, 0x0c, 0x19, - 0x80, 0x0c, 0x19, 0xc0, 0x0c, 0x18, 0xc0, 0x0c, - 0x18, 0x60, 0x0c, 0x18, 0x60, 0x0c, 0x18, 0x30, - 0x0c, 0x18, 0x38, 0x0c, 0x18, 0x18, 0x0c, 0x18, - 0x0c, 0x0c, 0x18, 0x0e, 0x0c, 0x18, 0x06, 0x0c, - 0x18, 0x03, 0x0c, 0x18, 0x03, 0x0c, 0x18, 0x01, - 0x8c, 0x18, 0x01, 0xcc, 0x18, 0x00, 0xcc, 0x18, - 0x00, 0x6c, 0x18, 0x00, 0x7c, 0x18, 0x00, 0x3c, - 0x7f, 0x80, 0x1c, 0x7f, 0x80, 0x1c, - // 'O' (0x4f) 24x28, offset 2638-2722, at +2/-26 - // in regular row-major format - 0x00, 0x7e, 0x00, 0x01, 0xff, 0xc0, 0x07, 0x81, - 0xe0, 0x0e, 0x00, 0x70, 0x1c, 0x00, 0x38, 0x38, - 0x00, 0x1c, 0x30, 0x00, 0x0c, 0x70, 0x00, 0x0e, - 0x60, 0x00, 0x06, 0x60, 0x00, 0x06, 0xc0, 0x00, - 0x03, 0xc0, 0x00, 0x03, 0xc0, 0x00, 0x03, 0xc0, - 0x00, 0x03, 0xc0, 0x00, 0x03, 0xc0, 0x00, 0x03, - 0xc0, 0x00, 0x03, 0xc0, 0x00, 0x03, 0x60, 0x00, - 0x06, 0x60, 0x00, 0x06, 0x70, 0x00, 0x0e, 0x30, - 0x00, 0x0c, 0x38, 0x00, 0x1c, 0x1c, 0x00, 0x38, - 0x0e, 0x00, 0x70, 0x07, 0x81, 0xe0, 0x03, 0xff, - 0xc0, 0x00, 0x7e, 0x00, - // 'P' (0x50) 21x26, offset 2722-2791, at +3/-25 - // in regular row-major format - 0xff, 0xff, 0x07, 0xff, 0xfe, 0x06, 0x00, 0x78, - 0x30, 0x00, 0xe1, 0x80, 0x03, 0x0c, 0x00, 0x0c, - 0x60, 0x00, 0x63, 0x00, 0x03, 0x18, 0x00, 0x18, - 0xc0, 0x01, 0xc6, 0x00, 0x0c, 0x30, 0x00, 0xc1, - 0x80, 0x1e, 0x0f, 0xff, 0xc0, 0x7f, 0xf8, 0x03, - 0x00, 0x00, 0x18, 0x00, 0x00, 0xc0, 0x00, 0x06, - 0x00, 0x00, 0x30, 0x00, 0x01, 0x80, 0x00, 0x0c, - 0x00, 0x00, 0x60, 0x00, 0x03, 0x00, 0x00, 0xff, - 0xf0, 0x07, 0xff, 0x80, 0x00, - // 'Q' (0x51) 24x32, offset 2791-2887, at +2/-26 - // in regular row-major format - 0x00, 0x7e, 0x00, 0x01, 0xff, 0x80, 0x07, 0x81, - 0xe0, 0x0e, 0x00, 0x70, 0x1c, 0x00, 0x38, 0x38, - 0x00, 0x1c, 0x30, 0x00, 0x0c, 0x70, 0x00, 0x0e, - 0x60, 0x00, 0x06, 0x60, 0x00, 0x06, 0xc0, 0x00, - 0x03, 0xc0, 0x00, 0x03, 0xc0, 0x00, 0x03, 0xc0, - 0x00, 0x03, 0xc0, 0x00, 0x03, 0xc0, 0x00, 0x03, - 0xc0, 0x00, 0x03, 0xc0, 0x00, 0x03, 0x60, 0x00, - 0x06, 0x60, 0x00, 0x06, 0x70, 0x00, 0x0e, 0x30, - 0x00, 0x0c, 0x18, 0x00, 0x1c, 0x0c, 0x00, 0x38, - 0x06, 0x00, 0x70, 0x03, 0x81, 0xe0, 0x00, 0xff, - 0xc0, 0x00, 0x7e, 0x00, 0x00, 0xe0, 0x00, 0x03, - 0xff, 0x87, 0x07, 0xff, 0xfe, 0x07, 0x00, 0xf8, - // 'R' (0x52) 24x26, offset 2887-2965, at +3/-25 - // in regular row-major format - 0xff, 0xfe, 0x00, 0xff, 0xff, 0x80, 0x18, 0x03, - 0xc0, 0x18, 0x00, 0xe0, 0x18, 0x00, 0x60, 0x18, - 0x00, 0x30, 0x18, 0x00, 0x30, 0x18, 0x00, 0x30, - 0x18, 0x00, 0x30, 0x18, 0x00, 0x70, 0x18, 0x00, - 0x60, 0x18, 0x01, 0xc0, 0x18, 0x07, 0x80, 0x1f, - 0xff, 0x00, 0x1f, 0xfc, 0x00, 0x18, 0x0e, 0x00, - 0x18, 0x07, 0x00, 0x18, 0x03, 0x80, 0x18, 0x01, - 0xc0, 0x18, 0x00, 0xe0, 0x18, 0x00, 0x60, 0x18, - 0x00, 0x30, 0x18, 0x00, 0x30, 0x18, 0x00, 0x18, - 0xff, 0x80, 0x1f, 0xff, 0x80, 0x0f, - // 'S' (0x53) 20x28, offset 2965-3035, at +4/-26 - // in regular row-major format - 0x03, 0xf8, 0x00, 0xff, 0xe6, 0x1e, 0x07, 0xe3, - 0x80, 0x1e, 0x30, 0x00, 0xe6, 0x00, 0x06, 0x60, - 0x00, 0x66, 0x00, 0x06, 0x60, 0x00, 0x07, 0x00, - 0x00, 0x30, 0x00, 0x01, 0xc0, 0x00, 0x0f, 0xc0, - 0x00, 0x3f, 0xc0, 0x00, 0x3f, 0x80, 0x00, 0x1c, - 0x00, 0x00, 0xe0, 0x00, 0x07, 0x00, 0x00, 0x30, - 0x00, 0x03, 0xc0, 0x00, 0x3c, 0x00, 0x03, 0xe0, - 0x00, 0x7e, 0x00, 0x06, 0xf8, 0x01, 0xed, 0xe0, - 0x7c, 0xcf, 0xff, 0x00, 0x3f, 0xc0, - // 'T' (0x54) 22x26, offset 3035-3107, at +3/-25 - // in regular row-major format - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x03, 0x00, - 0xf0, 0x0c, 0x03, 0xc0, 0x30, 0x0f, 0x00, 0xc0, - 0x3c, 0x03, 0x00, 0xc0, 0x0c, 0x00, 0x00, 0x30, - 0x00, 0x00, 0xc0, 0x00, 0x03, 0x00, 0x00, 0x0c, - 0x00, 0x00, 0x30, 0x00, 0x00, 0xc0, 0x00, 0x03, - 0x00, 0x00, 0x0c, 0x00, 0x00, 0x30, 0x00, 0x00, - 0xc0, 0x00, 0x03, 0x00, 0x00, 0x0c, 0x00, 0x00, - 0x30, 0x00, 0x00, 0xc0, 0x00, 0x03, 0x00, 0x00, - 0x0c, 0x00, 0x0f, 0xff, 0xc0, 0x3f, 0xff, 0x00, - // 'U' (0x55) 23x27, offset 3107-3185, at +3/-25 - // in regular row-major format - 0xff, 0x01, 0xff, 0xfe, 0x03, 0xfc, 0xc0, 0x00, - 0x61, 0x80, 0x00, 0xc3, 0x00, 0x01, 0x86, 0x00, - 0x03, 0x0c, 0x00, 0x06, 0x18, 0x00, 0x0c, 0x30, - 0x00, 0x18, 0x60, 0x00, 0x30, 0xc0, 0x00, 0x61, - 0x80, 0x00, 0xc3, 0x00, 0x01, 0x86, 0x00, 0x03, - 0x0c, 0x00, 0x06, 0x18, 0x00, 0x0c, 0x30, 0x00, - 0x18, 0x60, 0x00, 0x30, 0xc0, 0x00, 0x61, 0x80, - 0x00, 0xc3, 0x80, 0x03, 0x83, 0x00, 0x06, 0x07, - 0x00, 0x1c, 0x07, 0x00, 0x70, 0x07, 0x83, 0xc0, - 0x07, 0xff, 0x00, 0x03, 0xf8, 0x00, - // 'V' (0x56) 28x26, offset 3185-3276, at +0/-25 - // in regular row-major format - 0x7f, 0xc0, 0x3f, 0xf7, 0xfc, 0x03, 0xff, 0x18, - 0x00, 0x01, 0x80, 0xc0, 0x00, 0x30, 0x0c, 0x00, - 0x03, 0x00, 0x60, 0x00, 0x30, 0x06, 0x00, 0x06, - 0x00, 0x60, 0x00, 0x60, 0x03, 0x00, 0x0c, 0x00, - 0x30, 0x00, 0xc0, 0x03, 0x80, 0x0c, 0x00, 0x18, - 0x01, 0x80, 0x01, 0x80, 0x18, 0x00, 0x0c, 0x03, - 0x00, 0x00, 0xc0, 0x30, 0x00, 0x0e, 0x03, 0x00, - 0x00, 0x60, 0x60, 0x00, 0x06, 0x06, 0x00, 0x00, - 0x30, 0xc0, 0x00, 0x03, 0x0c, 0x00, 0x00, 0x30, - 0x80, 0x00, 0x01, 0x98, 0x00, 0x00, 0x19, 0x80, - 0x00, 0x00, 0xf0, 0x00, 0x00, 0x0f, 0x00, 0x00, - 0x00, 0xe0, 0x00, - // 'W' (0x57) 26x26, offset 3276-3361, at +1/-25 - // in regular row-major format - 0xff, 0x80, 0x7f, 0xff, 0xe0, 0x1f, 0xf3, 0x00, - 0x00, 0x30, 0xc0, 0x00, 0x0c, 0x30, 0x00, 0x03, - 0x0c, 0x03, 0x80, 0xc3, 0x01, 0xe0, 0x30, 0x60, - 0x78, 0x0c, 0x18, 0x1f, 0x02, 0x06, 0x04, 0xc0, - 0x81, 0x83, 0x30, 0x60, 0x60, 0xcc, 0x18, 0x18, - 0x31, 0x86, 0x06, 0x18, 0x61, 0x81, 0x86, 0x18, - 0x60, 0x71, 0x87, 0x18, 0x0c, 0x40, 0xc6, 0x03, - 0x30, 0x31, 0x00, 0xcc, 0x0c, 0xc0, 0x33, 0x01, - 0xb0, 0x0d, 0x80, 0x6c, 0x03, 0x60, 0x1b, 0x00, - 0xd8, 0x06, 0xc0, 0x34, 0x00, 0xf0, 0x07, 0x00, - 0x3c, 0x01, 0xc0, 0x0e, 0x00, - // 'X' (0x58) 24x26, offset 3361-3439, at +2/-25 - // in regular row-major format - 0x7f, 0x00, 0xff, 0x7f, 0x00, 0xff, 0x18, 0x00, - 0x18, 0x0c, 0x00, 0x38, 0x0e, 0x00, 0x70, 0x07, - 0x00, 0x60, 0x03, 0x00, 0xc0, 0x01, 0x81, 0x80, - 0x01, 0xc3, 0x80, 0x00, 0xe7, 0x00, 0x00, 0x76, - 0x00, 0x00, 0x3c, 0x00, 0x00, 0x18, 0x00, 0x00, - 0x3c, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x66, 0x00, - 0x00, 0xc3, 0x00, 0x01, 0x81, 0x80, 0x03, 0x81, - 0xc0, 0x07, 0x00, 0xe0, 0x06, 0x00, 0x60, 0x0c, - 0x00, 0x30, 0x18, 0x00, 0x18, 0x38, 0x00, 0x1c, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, - // 'Y' (0x59) 24x26, offset 3439-3517, at +2/-25 - // in regular row-major format - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x18, 0x00, - 0x18, 0x0c, 0x00, 0x30, 0x0e, 0x00, 0x70, 0x06, - 0x00, 0x60, 0x03, 0x00, 0xc0, 0x03, 0x81, 0xc0, - 0x01, 0x81, 0x80, 0x00, 0xc3, 0x00, 0x00, 0xe7, - 0x00, 0x00, 0x66, 0x00, 0x00, 0x3c, 0x00, 0x00, - 0x3c, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, - 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, - 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, - 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, - 0x07, 0xff, 0xe0, 0x07, 0xff, 0xe0, - // 'Z' (0x5a) 18x26, offset 3517-3576, at +5/-25 - // in regular row-major format - 0x7f, 0xff, 0x9f, 0xff, 0xe6, 0x00, 0x19, 0x80, - 0x0c, 0x60, 0x07, 0x18, 0x03, 0x86, 0x00, 0xc1, - 0x80, 0x70, 0x00, 0x38, 0x00, 0x0c, 0x00, 0x07, - 0x00, 0x03, 0x80, 0x00, 0xc0, 0x00, 0x60, 0x00, - 0x38, 0x00, 0x1c, 0x00, 0x06, 0x00, 0x03, 0x80, - 0x31, 0xc0, 0x0c, 0x60, 0x03, 0x30, 0x00, 0xdc, - 0x00, 0x3e, 0x00, 0x0f, 0x00, 0x03, 0xff, 0xff, - 0xff, 0xff, 0xf0, - // '[' (0x5b) 7x34, offset 3576-3606, at +13/-27 - // in regular row-major format - 0xff, 0xff, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc1, - 0x83, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc1, 0x83, - 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc1, 0x83, 0x06, - 0x0c, 0x18, 0x30, 0x60, 0xff, 0xfc, - // '\' (0x5c) 18x35, offset 3606-3685, at +5/-30 - // in regular row-major format - 0xc0, 0x00, 0x30, 0x00, 0x06, 0x00, 0x01, 0x80, - 0x00, 0x30, 0x00, 0x0c, 0x00, 0x01, 0x80, 0x00, - 0x60, 0x00, 0x0c, 0x00, 0x03, 0x00, 0x00, 0x60, - 0x00, 0x18, 0x00, 0x03, 0x00, 0x00, 0xc0, 0x00, - 0x18, 0x00, 0x06, 0x00, 0x00, 0xc0, 0x00, 0x30, - 0x00, 0x06, 0x00, 0x01, 0x80, 0x00, 0x30, 0x00, - 0x0c, 0x00, 0x03, 0x80, 0x00, 0x60, 0x00, 0x1c, - 0x00, 0x03, 0x00, 0x00, 0xe0, 0x00, 0x18, 0x00, - 0x07, 0x00, 0x00, 0xc0, 0x00, 0x30, 0x00, 0x06, - 0x00, 0x01, 0x80, 0x00, 0x30, 0x00, 0x0c, - // ']' (0x5d) 7x34, offset 3685-3715, at +8/-27 - // in regular row-major format - 0xff, 0xfc, 0x18, 0x30, 0x60, 0xc1, 0x83, 0x06, - 0x0c, 0x18, 0x30, 0x60, 0xc1, 0x83, 0x06, 0x0c, - 0x18, 0x30, 0x60, 0xc1, 0x83, 0x06, 0x0c, 0x18, - 0x30, 0x60, 0xc1, 0x83, 0xff, 0xfc, - // '^' (0x5e) 18x12, offset 3715-3742, at +5/-28 - // in regular row-major format - 0x00, 0x40, 0x00, 0x30, 0x00, 0x1e, 0x00, 0x0e, - 0xc0, 0x07, 0x38, 0x01, 0x87, 0x00, 0xc0, 0xc0, - 0x60, 0x18, 0x38, 0x03, 0x1c, 0x00, 0xe6, 0x00, - 0x1f, 0x00, 0x03, - // '_' (0x5f) 28x2, offset 3742-3749, at +0/+5 - // in regular row-major format - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - // '`' (0x60) 8x7, offset 3749-3756, at +7/-29 - // in regular row-major format - 0xc0, 0xe0, 0x70, 0x3c, 0x0e, 0x07, 0x03, - // 'a' (0x61) 22x22, offset 3756-3817, at +3/-20 - // in regular row-major format - 0x01, 0xfc, 0x00, 0x7f, 0xfc, 0x01, 0xc0, 0x3c, - 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, 0x00, 0x01, - 0x80, 0x00, 0x06, 0x00, 0x00, 0x18, 0x00, 0x00, - 0x60, 0x0f, 0xf9, 0x81, 0xff, 0xfe, 0x0f, 0x80, - 0x38, 0x70, 0x00, 0x63, 0x80, 0x01, 0x8c, 0x00, - 0x06, 0x30, 0x00, 0x18, 0xc0, 0x00, 0xe3, 0x00, - 0x07, 0x86, 0x00, 0x76, 0x1e, 0x07, 0x9f, 0x3f, - 0xf8, 0x7c, 0x3f, 0x80, 0x00, - // 'b' (0x62) 23x29, offset 3817-3901, at +2/-27 - // in regular row-major format - 0xf8, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x60, 0x00, - 0x00, 0xc0, 0x00, 0x01, 0x80, 0x00, 0x03, 0x00, - 0x00, 0x06, 0x00, 0x00, 0x0c, 0x1f, 0x80, 0x18, - 0xff, 0xc0, 0x33, 0x81, 0xc0, 0x6e, 0x01, 0xc0, - 0xf0, 0x00, 0xc1, 0xe0, 0x01, 0xc3, 0x80, 0x01, - 0x87, 0x00, 0x03, 0x8c, 0x00, 0x03, 0x18, 0x00, - 0x06, 0x30, 0x00, 0x0c, 0x60, 0x00, 0x18, 0xc0, - 0x00, 0x31, 0x80, 0x00, 0x63, 0x80, 0x01, 0x87, - 0x00, 0x03, 0x0f, 0x00, 0x0e, 0x1f, 0x00, 0x38, - 0x37, 0x00, 0xe3, 0xe7, 0x03, 0x87, 0xc7, 0xfe, - 0x00, 0x03, 0xf0, 0x00, - // 'c' (0x63) 21x22, offset 3901-3959, at +4/-20 - // in regular row-major format - 0x01, 0xfc, 0x00, 0x3f, 0xf9, 0x83, 0xc0, 0xfc, - 0x38, 0x01, 0xe3, 0x00, 0x07, 0x38, 0x00, 0x19, - 0x80, 0x00, 0xdc, 0x00, 0x06, 0xc0, 0x00, 0x06, - 0x00, 0x00, 0x30, 0x00, 0x01, 0x80, 0x00, 0x0c, - 0x00, 0x00, 0x60, 0x00, 0x03, 0x80, 0x00, 0x0c, - 0x00, 0x00, 0x70, 0x00, 0x01, 0x80, 0x00, 0xc7, - 0x00, 0x1e, 0x1e, 0x03, 0xc0, 0x7f, 0xfc, 0x00, - 0xff, 0x00, - // 'd' (0x64) 24x29, offset 3959-4046, at +3/-27 - // in regular row-major format - 0x00, 0x00, 0xf8, 0x00, 0x00, 0xf8, 0x00, 0x00, - 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, - 0x00, 0x18, 0x00, 0x00, 0x18, 0x01, 0xf8, 0x18, - 0x07, 0xfe, 0x18, 0x0f, 0x07, 0x98, 0x1c, 0x01, - 0xd8, 0x38, 0x00, 0xf8, 0x70, 0x00, 0x78, 0x60, - 0x00, 0x38, 0xe0, 0x00, 0x38, 0xc0, 0x00, 0x18, - 0xc0, 0x00, 0x18, 0xc0, 0x00, 0x18, 0xc0, 0x00, - 0x18, 0xc0, 0x00, 0x18, 0xc0, 0x00, 0x18, 0x60, - 0x00, 0x38, 0x60, 0x00, 0x38, 0x70, 0x00, 0x78, - 0x38, 0x00, 0xd8, 0x1c, 0x01, 0xd8, 0x0f, 0x07, - 0x9f, 0x07, 0xfe, 0x1f, 0x01, 0xf8, 0x00, - // 'e' (0x65) 21x22, offset 4046-4104, at +3/-20 - // in regular row-major format - 0x01, 0xfc, 0x00, 0x3f, 0xf8, 0x07, 0x80, 0xf0, - 0x70, 0x01, 0xc3, 0x00, 0x07, 0x30, 0x00, 0x19, - 0x80, 0x00, 0x78, 0x00, 0x03, 0xc0, 0x00, 0x1f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x0c, - 0x00, 0x00, 0x60, 0x00, 0x01, 0x80, 0x00, 0x0c, - 0x00, 0x00, 0x30, 0x00, 0x01, 0xc0, 0x00, 0xc7, - 0x00, 0x0e, 0x1e, 0x03, 0xe0, 0x3f, 0xfc, 0x00, - 0x7f, 0x00, - // 'f' (0x66) 19x28, offset 4104-4171, at +6/-27 - // in regular row-major format - 0x00, 0x7f, 0xc0, 0x3f, 0xfc, 0x0e, 0x00, 0x03, - 0x80, 0x00, 0x60, 0x00, 0x0c, 0x00, 0x01, 0x80, - 0x00, 0x30, 0x00, 0xff, 0xff, 0x9f, 0xff, 0xf0, - 0x18, 0x00, 0x03, 0x00, 0x00, 0x60, 0x00, 0x0c, - 0x00, 0x01, 0x80, 0x00, 0x30, 0x00, 0x06, 0x00, - 0x00, 0xc0, 0x00, 0x18, 0x00, 0x03, 0x00, 0x00, - 0x60, 0x00, 0x0c, 0x00, 0x01, 0x80, 0x00, 0x30, - 0x00, 0x06, 0x00, 0x00, 0xc0, 0x03, 0xff, 0xfc, - 0x7f, 0xff, 0x80, - // 'g' (0x67) 23x30, offset 4171-4258, at +3/-20 - // in regular row-major format - 0x01, 0xf8, 0x00, 0x0f, 0xfc, 0x7c, 0x38, 0x1c, - 0xf8, 0xe0, 0x0d, 0x83, 0x00, 0x0f, 0x0e, 0x00, - 0x1e, 0x18, 0x00, 0x1c, 0x70, 0x00, 0x38, 0xc0, - 0x00, 0x31, 0x80, 0x00, 0x63, 0x00, 0x00, 0xc6, - 0x00, 0x01, 0x8c, 0x00, 0x03, 0x18, 0x00, 0x06, - 0x18, 0x00, 0x1c, 0x30, 0x00, 0x38, 0x30, 0x00, - 0xf0, 0x70, 0x03, 0x60, 0x78, 0x1c, 0xc0, 0x3f, - 0xf1, 0x80, 0x1f, 0x83, 0x00, 0x00, 0x06, 0x00, - 0x00, 0x0c, 0x00, 0x00, 0x18, 0x00, 0x00, 0x30, - 0x00, 0x00, 0xc0, 0x00, 0x03, 0x80, 0x00, 0x0e, - 0x00, 0x3f, 0xf8, 0x00, 0x7f, 0xc0, 0x00, - // 'h' (0x68) 23x28, offset 4258-4339, at +3/-27 - // in regular row-major format - 0xf8, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x60, 0x00, - 0x00, 0xc0, 0x00, 0x01, 0x80, 0x00, 0x03, 0x00, - 0x00, 0x06, 0x00, 0x00, 0x0c, 0x3f, 0x00, 0x18, - 0xff, 0x80, 0x37, 0x03, 0x80, 0x7c, 0x03, 0x80, - 0xf0, 0x03, 0x81, 0xc0, 0x03, 0x03, 0x00, 0x06, - 0x06, 0x00, 0x0c, 0x0c, 0x00, 0x18, 0x18, 0x00, - 0x30, 0x30, 0x00, 0x60, 0x60, 0x00, 0xc0, 0xc0, - 0x01, 0x81, 0x80, 0x03, 0x03, 0x00, 0x06, 0x06, - 0x00, 0x0c, 0x0c, 0x00, 0x18, 0x18, 0x00, 0x30, - 0x30, 0x00, 0x63, 0xfc, 0x07, 0xff, 0xf8, 0x0f, - 0xf0, - // 'i' (0x69) 18x29, offset 4339-4405, at +5/-28 - // in regular row-major format - 0x01, 0xc0, 0x00, 0x70, 0x00, 0x1c, 0x00, 0x07, - 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x03, 0xfc, - 0x00, 0x03, 0x00, 0x00, 0xc0, 0x00, 0x30, 0x00, - 0x0c, 0x00, 0x03, 0x00, 0x00, 0xc0, 0x00, 0x30, - 0x00, 0x0c, 0x00, 0x03, 0x00, 0x00, 0xc0, 0x00, - 0x30, 0x00, 0x0c, 0x00, 0x03, 0x00, 0x00, 0xc0, - 0x00, 0x30, 0x00, 0x0c, 0x03, 0xff, 0xff, 0xff, - 0xff, 0xc0, - // 'j' (0x6a) 14x38, offset 4405-4472, at +6/-28 - // in regular row-major format - 0x00, 0x70, 0x01, 0xc0, 0x07, 0x00, 0x1c, 0x00, - 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, - 0xff, 0xff, 0xff, 0xc0, 0x03, 0x00, 0x0c, 0x00, - 0x30, 0x00, 0xc0, 0x03, 0x00, 0x0c, 0x00, 0x30, - 0x00, 0xc0, 0x03, 0x00, 0x0c, 0x00, 0x30, 0x00, - 0xc0, 0x03, 0x00, 0x0c, 0x00, 0x30, 0x00, 0xc0, - 0x03, 0x00, 0x0c, 0x00, 0x30, 0x00, 0xc0, 0x03, - 0x00, 0x0c, 0x00, 0x70, 0x03, 0x80, 0x1c, 0xff, - 0xe3, 0xff, 0x00, - // 'k' (0x6b) 22x28, offset 4472-4549, at +4/-27 - // in regular row-major format - 0xf8, 0x00, 0x03, 0xe0, 0x00, 0x01, 0x80, 0x00, - 0x06, 0x00, 0x00, 0x18, 0x00, 0x00, 0x60, 0x00, - 0x01, 0x80, 0x00, 0x06, 0x00, 0x00, 0x18, 0x1f, - 0xe0, 0x60, 0x7f, 0x81, 0x80, 0x60, 0x06, 0x07, - 0x00, 0x18, 0x38, 0x00, 0x61, 0xc0, 0x01, 0x8e, - 0x00, 0x06, 0x70, 0x00, 0x1b, 0x80, 0x00, 0x7f, - 0x00, 0x01, 0xce, 0x00, 0x06, 0x1c, 0x00, 0x18, - 0x38, 0x00, 0x60, 0x70, 0x01, 0x80, 0xe0, 0x06, - 0x01, 0xc0, 0x18, 0x03, 0x80, 0x60, 0x07, 0x0f, - 0x80, 0x7f, 0xfe, 0x01, 0xff, - // 'l' (0x6c) 18x28, offset 4549-4612, at +5/-27 - // in regular row-major format - 0x3f, 0xc0, 0x0f, 0xf0, 0x00, 0x0c, 0x00, 0x03, - 0x00, 0x00, 0xc0, 0x00, 0x30, 0x00, 0x0c, 0x00, - 0x03, 0x00, 0x00, 0xc0, 0x00, 0x30, 0x00, 0x0c, - 0x00, 0x03, 0x00, 0x00, 0xc0, 0x00, 0x30, 0x00, - 0x0c, 0x00, 0x03, 0x00, 0x00, 0xc0, 0x00, 0x30, - 0x00, 0x0c, 0x00, 0x03, 0x00, 0x00, 0xc0, 0x00, - 0x30, 0x00, 0x0c, 0x00, 0x03, 0x00, 0x00, 0xc0, - 0x00, 0x30, 0x0f, 0xff, 0xff, 0xff, 0xff, - // 'm' (0x6d) 28x21, offset 4612-4686, at +0/-20 - // in regular row-major format - 0x00, 0xf0, 0x3c, 0x0f, 0x9f, 0x87, 0xe0, 0xfb, - 0x1c, 0xc7, 0x01, 0xe0, 0xd8, 0x38, 0x1c, 0x07, - 0x01, 0x81, 0x80, 0x60, 0x18, 0x18, 0x06, 0x01, - 0x81, 0x80, 0x60, 0x18, 0x18, 0x06, 0x01, 0x81, - 0x80, 0x60, 0x18, 0x18, 0x06, 0x01, 0x81, 0x80, - 0x60, 0x18, 0x18, 0x06, 0x01, 0x81, 0x80, 0x60, - 0x18, 0x18, 0x06, 0x01, 0x81, 0x80, 0x60, 0x18, - 0x18, 0x06, 0x01, 0x81, 0x80, 0x60, 0x18, 0x18, - 0x06, 0x01, 0x8f, 0xe0, 0x7c, 0x1f, 0xfe, 0x07, - 0xc1, 0xf0, - // 'n' (0x6e) 23x21, offset 4686-4747, at +2/-20 - // in regular row-major format - 0x00, 0x1f, 0x00, 0xf8, 0xff, 0x81, 0xf3, 0x83, - 0x80, 0x6c, 0x03, 0x80, 0xf0, 0x03, 0x81, 0xc0, - 0x03, 0x03, 0x00, 0x06, 0x06, 0x00, 0x0c, 0x0c, - 0x00, 0x18, 0x18, 0x00, 0x30, 0x30, 0x00, 0x60, - 0x60, 0x00, 0xc0, 0xc0, 0x01, 0x81, 0x80, 0x03, - 0x03, 0x00, 0x06, 0x06, 0x00, 0x0c, 0x0c, 0x00, - 0x18, 0x18, 0x00, 0x30, 0x30, 0x00, 0x67, 0xfc, - 0x03, 0xff, 0xf8, 0x07, 0xe0, - // 'o' (0x6f) 22x22, offset 4747-4808, at +3/-20 - // in regular row-major format - 0x00, 0xfc, 0x00, 0x1f, 0xfe, 0x00, 0xf0, 0x3c, - 0x07, 0x00, 0x38, 0x38, 0x00, 0x71, 0xc0, 0x00, - 0xe6, 0x00, 0x01, 0x98, 0x00, 0x06, 0xc0, 0x00, - 0x0f, 0x00, 0x00, 0x3c, 0x00, 0x00, 0xf0, 0x00, - 0x03, 0xc0, 0x00, 0x0f, 0x00, 0x00, 0x36, 0x00, - 0x01, 0x98, 0x00, 0x06, 0x70, 0x00, 0x38, 0xe0, - 0x01, 0xc1, 0xc0, 0x0e, 0x03, 0xc0, 0xf0, 0x07, - 0xff, 0x80, 0x03, 0xf0, 0x00, - // 'p' (0x70) 23x30, offset 4808-4895, at +2/-20 - // in regular row-major format - 0x00, 0x3f, 0x01, 0xf1, 0xff, 0x83, 0xe7, 0x03, - 0x80, 0xd8, 0x01, 0x81, 0xe0, 0x01, 0x83, 0xc0, - 0x03, 0x87, 0x00, 0x03, 0x0e, 0x00, 0x07, 0x18, - 0x00, 0x06, 0x30, 0x00, 0x0c, 0x60, 0x00, 0x18, - 0xc0, 0x00, 0x31, 0x80, 0x00, 0x63, 0x00, 0x00, - 0xc7, 0x00, 0x03, 0x0e, 0x00, 0x06, 0x1e, 0x00, - 0x18, 0x36, 0x00, 0x70, 0x67, 0x03, 0xc0, 0xc7, - 0xfe, 0x01, 0x83, 0xf0, 0x03, 0x00, 0x00, 0x06, - 0x00, 0x00, 0x0c, 0x00, 0x00, 0x18, 0x00, 0x00, - 0x30, 0x00, 0x00, 0x60, 0x00, 0x00, 0xc0, 0x00, - 0x0f, 0xfc, 0x00, 0x1f, 0xf8, 0x00, 0x00, - // 'q' (0x71) 24x30, offset 4895-4985, at +3/-20 - // in regular row-major format - 0x01, 0xf8, 0x00, 0x07, 0xff, 0x1f, 0x0f, 0x07, - 0x9f, 0x1c, 0x01, 0xd8, 0x38, 0x00, 0x78, 0x70, - 0x00, 0x78, 0x60, 0x00, 0x38, 0xe0, 0x00, 0x38, - 0xc0, 0x00, 0x18, 0xc0, 0x00, 0x18, 0xc0, 0x00, - 0x18, 0xc0, 0x00, 0x18, 0xc0, 0x00, 0x18, 0xc0, - 0x00, 0x18, 0x60, 0x00, 0x38, 0x70, 0x00, 0x78, - 0x30, 0x00, 0x78, 0x1c, 0x01, 0xd8, 0x0f, 0x07, - 0x98, 0x07, 0xff, 0x18, 0x01, 0xfc, 0x18, 0x00, - 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, - 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, - 0x18, 0x00, 0x00, 0x18, 0x00, 0x03, 0xff, 0x00, - 0x03, 0xff, - // 'r' (0x72) 21x20, offset 4985-5038, at +5/-19 - // in regular row-major format - 0x7e, 0x03, 0xc3, 0xf0, 0x7f, 0x81, 0x8f, 0x0e, - 0x0c, 0xe0, 0x00, 0x7e, 0x00, 0x03, 0xc0, 0x00, - 0x1c, 0x00, 0x00, 0xc0, 0x00, 0x06, 0x00, 0x00, - 0x30, 0x00, 0x01, 0x80, 0x00, 0x0c, 0x00, 0x00, - 0x60, 0x00, 0x03, 0x00, 0x00, 0x18, 0x00, 0x00, - 0xc0, 0x00, 0x06, 0x00, 0x00, 0x30, 0x00, 0x3f, - 0xff, 0xc1, 0xff, 0xfe, 0x00, - // 's' (0x73) 18x22, offset 5038-5088, at +5/-20 - // in regular row-major format - 0x07, 0xf0, 0x07, 0xff, 0x63, 0xc0, 0xf9, 0xc0, - 0x0e, 0x60, 0x01, 0x98, 0x00, 0x66, 0x00, 0x19, - 0xc0, 0x00, 0x38, 0x00, 0x07, 0xc0, 0x00, 0x7f, - 0xc0, 0x00, 0x7c, 0x00, 0x03, 0x80, 0x00, 0x70, - 0x00, 0x0f, 0x00, 0x03, 0xc0, 0x00, 0xf8, 0x00, - 0x7f, 0x00, 0x3b, 0xf0, 0x3c, 0xdf, 0xfe, 0x00, - 0xfe, 0x00, - // 't' (0x74) 21x27, offset 5088-5159, at +3/-25 - // in regular row-major format - 0x0c, 0x00, 0x00, 0x60, 0x00, 0x03, 0x00, 0x00, - 0x18, 0x00, 0x00, 0xc0, 0x00, 0x06, 0x00, 0x03, - 0xff, 0xfe, 0x1f, 0xff, 0xf0, 0x0c, 0x00, 0x00, - 0x60, 0x00, 0x03, 0x00, 0x00, 0x18, 0x00, 0x00, - 0xc0, 0x00, 0x06, 0x00, 0x00, 0x30, 0x00, 0x01, - 0x80, 0x00, 0x0c, 0x00, 0x00, 0x60, 0x00, 0x03, - 0x00, 0x00, 0x18, 0x00, 0x00, 0xc0, 0x00, 0x06, - 0x00, 0x00, 0x30, 0x00, 0x00, 0xc0, 0x07, 0x07, - 0x01, 0xf0, 0x1f, 0xff, 0x00, 0x3f, 0x80, - // 'u' (0x75) 23x21, offset 5159-5220, at +3/-19 - // in regular row-major format - 0xf8, 0x03, 0xf1, 0xf0, 0x07, 0xe0, 0x60, 0x00, - 0xc0, 0xc0, 0x01, 0x81, 0x80, 0x03, 0x03, 0x00, - 0x06, 0x06, 0x00, 0x0c, 0x0c, 0x00, 0x18, 0x18, - 0x00, 0x30, 0x30, 0x00, 0x60, 0x60, 0x00, 0xc0, - 0xc0, 0x01, 0x81, 0x80, 0x03, 0x03, 0x00, 0x06, - 0x06, 0x00, 0x0c, 0x0c, 0x00, 0x38, 0x18, 0x00, - 0xf0, 0x18, 0x03, 0x60, 0x38, 0x3c, 0xf8, 0x3f, - 0xf1, 0xf0, 0x1f, 0x00, 0x00, - // 'v' (0x76) 26x20, offset 5220-5285, at +1/-19 - // in regular row-major format - 0x7f, 0xc0, 0xff, 0xdf, 0xf0, 0x3f, 0xf0, 0xc0, - 0x00, 0xc0, 0x30, 0x00, 0x30, 0x06, 0x00, 0x1c, - 0x01, 0x80, 0x06, 0x00, 0x30, 0x01, 0x80, 0x0c, - 0x00, 0xc0, 0x03, 0x80, 0x30, 0x00, 0x60, 0x18, - 0x00, 0x18, 0x06, 0x00, 0x03, 0x03, 0x00, 0x00, - 0xc0, 0xc0, 0x00, 0x18, 0x30, 0x00, 0x06, 0x18, - 0x00, 0x00, 0xc6, 0x00, 0x00, 0x33, 0x00, 0x00, - 0x0e, 0xc0, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x78, - 0x00, - // 'w' (0x77) 26x20, offset 5285-5350, at +1/-19 - // in regular row-major format - 0x7f, 0x00, 0x3f, 0xdf, 0xc0, 0x0f, 0xf1, 0x80, - 0x00, 0x20, 0x60, 0x00, 0x18, 0x18, 0x00, 0x06, - 0x06, 0x03, 0x01, 0x80, 0x81, 0xe0, 0x60, 0x30, - 0x78, 0x10, 0x0c, 0x1e, 0x0c, 0x03, 0x0c, 0xc3, - 0x00, 0xc3, 0x30, 0xc0, 0x10, 0xcc, 0x30, 0x06, - 0x61, 0x98, 0x01, 0x98, 0x66, 0x00, 0x66, 0x19, - 0x80, 0x0b, 0x03, 0x60, 0x03, 0xc0, 0xd0, 0x00, - 0xf0, 0x1c, 0x00, 0x38, 0x07, 0x00, 0x0e, 0x01, - 0xc0, - // 'x' (0x78) 24x20, offset 5350-5410, at +2/-19 - // in regular row-major format - 0x3f, 0x81, 0xfe, 0x3f, 0x81, 0xfe, 0x0c, 0x00, - 0x38, 0x06, 0x00, 0x70, 0x03, 0x00, 0xe0, 0x01, - 0x81, 0xc0, 0x00, 0xc3, 0x80, 0x00, 0x67, 0x00, - 0x00, 0x3c, 0x00, 0x00, 0x18, 0x00, 0x00, 0x3c, - 0x00, 0x00, 0x67, 0x00, 0x00, 0xc3, 0x80, 0x01, - 0x81, 0xc0, 0x03, 0x00, 0xe0, 0x06, 0x00, 0x70, - 0x0c, 0x00, 0x38, 0x18, 0x00, 0x1c, 0x7f, 0x81, - 0xff, 0x7f, 0x81, 0xff, - // 'y' (0x79) 24x29, offset 5410-5497, at +2/-19 - // in regular row-major format - 0x7f, 0x00, 0xff, 0x7f, 0x00, 0xff, 0x18, 0x00, - 0x0c, 0x18, 0x00, 0x18, 0x0c, 0x00, 0x18, 0x0c, - 0x00, 0x30, 0x06, 0x00, 0x30, 0x06, 0x00, 0x60, - 0x03, 0x00, 0x60, 0x03, 0x00, 0xc0, 0x01, 0x80, - 0xc0, 0x01, 0x81, 0x80, 0x00, 0xc1, 0x80, 0x00, - 0xc3, 0x00, 0x00, 0x63, 0x00, 0x00, 0x66, 0x00, - 0x00, 0x36, 0x00, 0x00, 0x34, 0x00, 0x00, 0x3c, - 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, - 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0xc0, - 0x00, 0x7f, 0xfc, 0x00, 0x7f, 0xfc, 0x00, - // 'z' (0x7a) 17x20, offset 5497-5540, at +6/-19 - // in regular row-major format - 0xff, 0xff, 0x7f, 0xff, 0xb0, 0x01, 0x98, 0x01, - 0xcc, 0x01, 0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00, - 0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xe0, 0x00, - 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, - 0x60, 0x03, 0x70, 0x01, 0xb0, 0x00, 0xff, 0xff, - 0xff, 0xff, 0xf0, - // '{' (0x7b) 11x34, offset 5540-5587, at +8/-27 - // in regular row-major format - 0x00, 0xe0, 0x7c, 0x0c, 0x03, 0x00, 0x60, 0x0c, - 0x01, 0x80, 0x30, 0x06, 0x00, 0xc0, 0x18, 0x03, - 0x00, 0x60, 0x0c, 0x03, 0x00, 0xe0, 0xf0, 0x1e, - 0x00, 0x70, 0x06, 0x00, 0x60, 0x0c, 0x01, 0x80, - 0x30, 0x06, 0x00, 0xc0, 0x18, 0x03, 0x00, 0x60, - 0x0c, 0x01, 0x80, 0x18, 0x03, 0xe0, 0x1c, - // '|' (0x7c) 2x34, offset 5587-5596, at +13/-27 - // in regular row-major format - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, - // '}' (0x7d) 11x34, offset 5596-5643, at +9/-27 - // in regular row-major format - 0xe0, 0x1f, 0x00, 0x60, 0x06, 0x00, 0xc0, 0x18, - 0x03, 0x00, 0x60, 0x0c, 0x01, 0x80, 0x30, 0x06, - 0x00, 0xc0, 0x18, 0x01, 0x80, 0x38, 0x01, 0xe0, - 0x3c, 0x1c, 0x03, 0x00, 0xc0, 0x18, 0x03, 0x00, - 0x60, 0x0c, 0x01, 0x80, 0x30, 0x06, 0x00, 0xc0, - 0x18, 0x03, 0x00, 0xc0, 0xf8, 0x1c, 0x00, -}; - - -static const uint8_t TomThumb_generic[] = { - // ' ' (0x20) 8x1, offset 0-1, at +0/-5 - // in regular row-major format - 0x00, - // '!' (0x21) 8x5, offset 1-6, at +0/-5 - // in regular row-major format - 0x80, 0x80, 0x80, 0x00, 0x80, - // '"' (0x22) 8x2, offset 6-8, at +0/-5 - // in regular row-major format - 0xa0, 0xa0, - // '#' (0x23) 8x5, offset 8-13, at +0/-5 - // in regular row-major format - 0xa0, 0xe0, 0xa0, 0xe0, 0xa0, - // '$' (0x24) 8x5, offset 13-18, at +0/-5 - // in regular row-major format - 0x60, 0xc0, 0x60, 0xc0, 0x40, - // '%' (0x25) 8x5, offset 18-23, at +0/-5 - // in regular row-major format - 0x80, 0x20, 0x40, 0x80, 0x20, - // '&' (0x26) 8x5, offset 23-28, at +0/-5 - // in regular row-major format - 0xc0, 0xc0, 0xe0, 0xa0, 0x60, - // ''' (0x27) 8x2, offset 28-30, at +0/-5 - // in regular row-major format - 0x80, 0x80, - // '(' (0x28) 8x5, offset 30-35, at +0/-5 - // in regular row-major format - 0x40, 0x80, 0x80, 0x80, 0x40, - // ')' (0x29) 8x5, offset 35-40, at +0/-5 - // in regular row-major format - 0x80, 0x40, 0x40, 0x40, 0x80, - // '*' (0x2a) 8x3, offset 40-43, at +0/-5 - // in regular row-major format - 0xa0, 0x40, 0xa0, - // '+' (0x2b) 8x3, offset 43-46, at +0/-4 - // in regular row-major format - 0x40, 0xe0, 0x40, - // ',' (0x2c) 8x2, offset 46-48, at +0/-2 - // in regular row-major format - 0x40, 0x80, - // '-' (0x2d) 8x1, offset 48-49, at +0/-3 - // in regular row-major format - 0xe0, - // '.' (0x2e) 8x1, offset 49-50, at +0/-1 - // in regular row-major format - 0x80, - // '/' (0x2f) 8x5, offset 50-55, at +0/-5 - // in regular row-major format - 0x20, 0x20, 0x40, 0x80, 0x80, - // '0' (0x30) 8x5, offset 55-60, at +0/-5 - // in regular row-major format - 0x60, 0xa0, 0xa0, 0xa0, 0xc0, - // '1' (0x31) 8x5, offset 60-65, at +0/-5 - // in regular row-major format - 0x40, 0xc0, 0x40, 0x40, 0x40, - // '2' (0x32) 8x5, offset 65-70, at +0/-5 - // in regular row-major format - 0xc0, 0x20, 0x40, 0x80, 0xe0, - // '3' (0x33) 8x5, offset 70-75, at +0/-5 - // in regular row-major format - 0xc0, 0x20, 0x40, 0x20, 0xc0, - // '4' (0x34) 8x5, offset 75-80, at +0/-5 - // in regular row-major format - 0xa0, 0xa0, 0xe0, 0x20, 0x20, - // '5' (0x35) 8x5, offset 80-85, at +0/-5 - // in regular row-major format - 0xe0, 0x80, 0xc0, 0x20, 0xc0, - // '6' (0x36) 8x5, offset 85-90, at +0/-5 - // in regular row-major format - 0x60, 0x80, 0xe0, 0xa0, 0xe0, - // '7' (0x37) 8x5, offset 90-95, at +0/-5 - // in regular row-major format - 0xe0, 0x20, 0x40, 0x80, 0x80, - // '8' (0x38) 8x5, offset 95-100, at +0/-5 - // in regular row-major format - 0xe0, 0xa0, 0xe0, 0xa0, 0xe0, - // '9' (0x39) 8x5, offset 100-105, at +0/-5 - // in regular row-major format - 0xe0, 0xa0, 0xe0, 0x20, 0xc0, - // ':' (0x3a) 8x3, offset 105-108, at +0/-4 - // in regular row-major format - 0x80, 0x00, 0x80, - // ';' (0x3b) 8x4, offset 108-112, at +0/-4 - // in regular row-major format - 0x40, 0x00, 0x40, 0x80, - // '<' (0x3c) 8x5, offset 112-117, at +0/-5 - // in regular row-major format - 0x20, 0x40, 0x80, 0x40, 0x20, - // '=' (0x3d) 8x3, offset 117-120, at +0/-4 - // in regular row-major format - 0xe0, 0x00, 0xe0, - // '>' (0x3e) 8x5, offset 120-125, at +0/-5 - // in regular row-major format - 0x80, 0x40, 0x20, 0x40, 0x80, - // '?' (0x3f) 8x5, offset 125-130, at +0/-5 - // in regular row-major format - 0xe0, 0x20, 0x40, 0x00, 0x40, - // '@' (0x40) 8x5, offset 130-135, at +0/-5 - // in regular row-major format - 0x40, 0xa0, 0xe0, 0x80, 0x60, - // 'A' (0x41) 8x5, offset 135-140, at +0/-5 - // in regular row-major format - 0x40, 0xa0, 0xe0, 0xa0, 0xa0, - // 'B' (0x42) 8x5, offset 140-145, at +0/-5 - // in regular row-major format - 0xc0, 0xa0, 0xc0, 0xa0, 0xc0, - // 'C' (0x43) 8x5, offset 145-150, at +0/-5 - // in regular row-major format - 0x60, 0x80, 0x80, 0x80, 0x60, - // 'D' (0x44) 8x5, offset 150-155, at +0/-5 - // in regular row-major format - 0xc0, 0xa0, 0xa0, 0xa0, 0xc0, - // 'E' (0x45) 8x5, offset 155-160, at +0/-5 - // in regular row-major format - 0xe0, 0x80, 0xe0, 0x80, 0xe0, - // 'F' (0x46) 8x5, offset 160-165, at +0/-5 - // in regular row-major format - 0xe0, 0x80, 0xe0, 0x80, 0x80, - // 'G' (0x47) 8x5, offset 165-170, at +0/-5 - // in regular row-major format - 0x60, 0x80, 0xe0, 0xa0, 0x60, - // 'H' (0x48) 8x5, offset 170-175, at +0/-5 - // in regular row-major format - 0xa0, 0xa0, 0xe0, 0xa0, 0xa0, - // 'I' (0x49) 8x5, offset 175-180, at +0/-5 - // in regular row-major format - 0xe0, 0x40, 0x40, 0x40, 0xe0, - // 'J' (0x4a) 8x5, offset 180-185, at +0/-5 - // in regular row-major format - 0x20, 0x20, 0x20, 0xa0, 0x40, - // 'K' (0x4b) 8x5, offset 185-190, at +0/-5 - // in regular row-major format - 0xa0, 0xa0, 0xc0, 0xa0, 0xa0, - // 'L' (0x4c) 8x5, offset 190-195, at +0/-5 - // in regular row-major format - 0x80, 0x80, 0x80, 0x80, 0xe0, - // 'M' (0x4d) 8x5, offset 195-200, at +0/-5 - // in regular row-major format - 0xa0, 0xe0, 0xe0, 0xa0, 0xa0, - // 'N' (0x4e) 8x5, offset 200-205, at +0/-5 - // in regular row-major format - 0xa0, 0xe0, 0xe0, 0xe0, 0xa0, - // 'O' (0x4f) 8x5, offset 205-210, at +0/-5 - // in regular row-major format - 0x40, 0xa0, 0xa0, 0xa0, 0x40, - // 'P' (0x50) 8x5, offset 210-215, at +0/-5 - // in regular row-major format - 0xc0, 0xa0, 0xc0, 0x80, 0x80, - // 'Q' (0x51) 8x5, offset 215-220, at +0/-5 - // in regular row-major format - 0x40, 0xa0, 0xa0, 0xe0, 0x60, - // 'R' (0x52) 8x5, offset 220-225, at +0/-5 - // in regular row-major format - 0xc0, 0xa0, 0xe0, 0xc0, 0xa0, - // 'S' (0x53) 8x5, offset 225-230, at +0/-5 - // in regular row-major format - 0x60, 0x80, 0x40, 0x20, 0xc0, - // 'T' (0x54) 8x5, offset 230-235, at +0/-5 - // in regular row-major format - 0xe0, 0x40, 0x40, 0x40, 0x40, - // 'U' (0x55) 8x5, offset 235-240, at +0/-5 - // in regular row-major format - 0xa0, 0xa0, 0xa0, 0xa0, 0x60, - // 'V' (0x56) 8x5, offset 240-245, at +0/-5 - // in regular row-major format - 0xa0, 0xa0, 0xa0, 0x40, 0x40, - // 'W' (0x57) 8x5, offset 245-250, at +0/-5 - // in regular row-major format - 0xa0, 0xa0, 0xe0, 0xe0, 0xa0, - // 'X' (0x58) 8x5, offset 250-255, at +0/-5 - // in regular row-major format - 0xa0, 0xa0, 0x40, 0xa0, 0xa0, - // 'Y' (0x59) 8x5, offset 255-260, at +0/-5 - // in regular row-major format - 0xa0, 0xa0, 0x40, 0x40, 0x40, - // 'Z' (0x5a) 8x5, offset 260-265, at +0/-5 - // in regular row-major format - 0xe0, 0x20, 0x40, 0x80, 0xe0, - // '[' (0x5b) 8x5, offset 265-270, at +0/-5 - // in regular row-major format - 0xe0, 0x80, 0x80, 0x80, 0xe0, - // '\' (0x5c) 8x3, offset 270-273, at +0/-4 - // in regular row-major format - 0x80, 0x40, 0x20, - // ']' (0x5d) 8x5, offset 273-278, at +0/-5 - // in regular row-major format - 0xe0, 0x20, 0x20, 0x20, 0xe0, - // '^' (0x5e) 8x2, offset 278-280, at +0/-5 - // in regular row-major format - 0x40, 0xa0, - // '_' (0x5f) 8x1, offset 280-281, at +0/-1 - // in regular row-major format - 0xe0, - // '`' (0x60) 8x2, offset 281-283, at +0/-5 - // in regular row-major format - 0x80, 0x40, - // 'a' (0x61) 8x4, offset 283-287, at +0/-4 - // in regular row-major format - 0xc0, 0x60, 0xa0, 0xe0, - // 'b' (0x62) 8x5, offset 287-292, at +0/-5 - // in regular row-major format - 0x80, 0xc0, 0xa0, 0xa0, 0xc0, - // 'c' (0x63) 8x4, offset 292-296, at +0/-4 - // in regular row-major format - 0x60, 0x80, 0x80, 0x60, - // 'd' (0x64) 8x5, offset 296-301, at +0/-5 - // in regular row-major format - 0x20, 0x60, 0xa0, 0xa0, 0x60, - // 'e' (0x65) 8x4, offset 301-305, at +0/-4 - // in regular row-major format - 0x60, 0xa0, 0xc0, 0x60, - // 'f' (0x66) 8x5, offset 305-310, at +0/-5 - // in regular row-major format - 0x20, 0x40, 0xe0, 0x40, 0x40, - // 'g' (0x67) 8x5, offset 310-315, at +0/-4 - // in regular row-major format - 0x60, 0xa0, 0xe0, 0x20, 0x40, - // 'h' (0x68) 8x5, offset 315-320, at +0/-5 - // in regular row-major format - 0x80, 0xc0, 0xa0, 0xa0, 0xa0, - // 'i' (0x69) 8x5, offset 320-325, at +0/-5 - // in regular row-major format - 0x80, 0x00, 0x80, 0x80, 0x80, - // 'j' (0x6a) 8x6, offset 325-331, at +0/-5 - // in regular row-major format - 0x20, 0x00, 0x20, 0x20, 0xa0, 0x40, - // 'k' (0x6b) 8x5, offset 331-336, at +0/-5 - // in regular row-major format - 0x80, 0xa0, 0xc0, 0xc0, 0xa0, - // 'l' (0x6c) 8x5, offset 336-341, at +0/-5 - // in regular row-major format - 0xc0, 0x40, 0x40, 0x40, 0xe0, - // 'm' (0x6d) 8x4, offset 341-345, at +0/-4 - // in regular row-major format - 0xe0, 0xe0, 0xe0, 0xa0, - // 'n' (0x6e) 8x4, offset 345-349, at +0/-4 - // in regular row-major format - 0xc0, 0xa0, 0xa0, 0xa0, - // 'o' (0x6f) 8x4, offset 349-353, at +0/-4 - // in regular row-major format - 0x40, 0xa0, 0xa0, 0x40, - // 'p' (0x70) 8x5, offset 353-358, at +0/-4 - // in regular row-major format - 0xc0, 0xa0, 0xa0, 0xc0, 0x80, - // 'q' (0x71) 8x5, offset 358-363, at +0/-4 - // in regular row-major format - 0x60, 0xa0, 0xa0, 0x60, 0x20, - // 'r' (0x72) 8x4, offset 363-367, at +0/-4 - // in regular row-major format - 0x60, 0x80, 0x80, 0x80, - // 's' (0x73) 8x4, offset 367-371, at +0/-4 - // in regular row-major format - 0x60, 0xc0, 0x60, 0xc0, - // 't' (0x74) 8x5, offset 371-376, at +0/-5 - // in regular row-major format - 0x40, 0xe0, 0x40, 0x40, 0x60, - // 'u' (0x75) 8x4, offset 376-380, at +0/-4 - // in regular row-major format - 0xa0, 0xa0, 0xa0, 0x60, - // 'v' (0x76) 8x4, offset 380-384, at +0/-4 - // in regular row-major format - 0xa0, 0xa0, 0xe0, 0x40, - // 'w' (0x77) 8x4, offset 384-388, at +0/-4 - // in regular row-major format - 0xa0, 0xe0, 0xe0, 0xe0, - // 'x' (0x78) 8x4, offset 388-392, at +0/-4 - // in regular row-major format - 0xa0, 0x40, 0x40, 0xa0, - // 'y' (0x79) 8x5, offset 392-397, at +0/-4 - // in regular row-major format - 0xa0, 0xa0, 0x60, 0x20, 0x40, - // 'z' (0x7a) 8x4, offset 397-401, at +0/-4 - // in regular row-major format - 0xe0, 0x60, 0xc0, 0xe0, - // '{' (0x7b) 8x5, offset 401-406, at +0/-5 - // in regular row-major format - 0x60, 0x40, 0x80, 0x40, 0x60, - // '|' (0x7c) 8x5, offset 406-411, at +0/-5 - // in regular row-major format - 0x80, 0x80, 0x00, 0x80, 0x80, - // '}' (0x7d) 8x5, offset 411-416, at +0/-5 - // in regular row-major format - 0xc0, 0x40, 0x20, 0x40, 0xc0, -}; - - -static const uint8_t Org_01_generic[] = { - // ' ' (0x20) 0x0, offset 0-0, at +0/+1 - // in regular row-major format - // '!' (0x21) 1x5, offset 0-1, at +0/-4 - // in regular row-major format - 0xe8, - // '"' (0x22) 3x1, offset 1-2, at +0/-4 - // in regular row-major format - 0xa0, - // '#' (0x23) 5x5, offset 2-6, at +0/-4 - // in regular row-major format - 0x57, 0xd5, 0xf5, 0x00, - // '$' (0x24) 5x5, offset 6-10, at +0/-4 - // in regular row-major format - 0xfd, 0x3e, 0x5f, 0x80, - // '%' (0x25) 5x5, offset 10-14, at +0/-4 - // in regular row-major format - 0x88, 0x88, 0x88, 0x80, - // '&' (0x26) 5x5, offset 14-18, at +0/-4 - // in regular row-major format - 0xf4, 0xbf, 0x2e, 0x80, - // ''' (0x27) 1x1, offset 18-19, at +0/-4 - // in regular row-major format - 0x80, - // '(' (0x28) 2x5, offset 19-21, at +0/-4 - // in regular row-major format - 0x6a, 0x40, - // ')' (0x29) 2x5, offset 21-23, at +0/-4 - // in regular row-major format - 0x95, 0x80, - // '*' (0x2a) 3x3, offset 23-25, at +0/-3 - // in regular row-major format - 0xaa, 0x80, - // '+' (0x2b) 3x3, offset 25-27, at +0/-3 - // in regular row-major format - 0x5d, 0x00, - // ',' (0x2c) 1x2, offset 27-28, at +0/+0 - // in regular row-major format - 0xc0, - // '-' (0x2d) 4x1, offset 28-29, at +0/-2 - // in regular row-major format - 0xf0, - // '.' (0x2e) 1x1, offset 29-30, at +0/+0 - // in regular row-major format - 0x80, - // '/' (0x2f) 5x5, offset 30-34, at +0/-4 - // in regular row-major format - 0x08, 0x88, 0x88, 0x00, - // '0' (0x30) 5x5, offset 34-38, at +0/-4 - // in regular row-major format - 0xfc, 0x63, 0x1f, 0x80, - // '1' (0x31) 1x5, offset 38-39, at +0/-4 - // in regular row-major format - 0xf8, - // '2' (0x32) 5x5, offset 39-43, at +0/-4 - // in regular row-major format - 0xf8, 0x7f, 0x0f, 0x80, - // '3' (0x33) 5x5, offset 43-47, at +0/-4 - // in regular row-major format - 0xf8, 0x7e, 0x1f, 0x80, - // '4' (0x34) 5x5, offset 47-51, at +0/-4 - // in regular row-major format - 0x8c, 0x7e, 0x10, 0x80, - // '5' (0x35) 5x5, offset 51-55, at +0/-4 - // in regular row-major format - 0xfc, 0x3e, 0x1f, 0x80, - // '6' (0x36) 5x5, offset 55-59, at +0/-4 - // in regular row-major format - 0xfc, 0x3f, 0x1f, 0x80, - // '7' (0x37) 5x5, offset 59-63, at +0/-4 - // in regular row-major format - 0xf8, 0x42, 0x10, 0x80, - // '8' (0x38) 5x5, offset 63-67, at +0/-4 - // in regular row-major format - 0xfc, 0x7f, 0x1f, 0x80, - // '9' (0x39) 5x5, offset 67-71, at +0/-4 - // in regular row-major format - 0xfc, 0x7e, 0x1f, 0x80, - // ':' (0x3a) 1x4, offset 71-72, at +0/-3 - // in regular row-major format - 0x90, - // ';' (0x3b) 1x4, offset 72-73, at +0/-3 - // in regular row-major format - 0xb0, - // '<' (0x3c) 3x5, offset 73-75, at +0/-4 - // in regular row-major format - 0x2a, 0x22, - // '=' (0x3d) 4x3, offset 75-77, at +0/-3 - // in regular row-major format - 0xf0, 0xf0, - // '>' (0x3e) 3x5, offset 77-79, at +0/-4 - // in regular row-major format - 0x88, 0xa8, - // '?' (0x3f) 5x5, offset 79-83, at +0/-4 - // in regular row-major format - 0xf8, 0x4e, 0x02, 0x00, - // '@' (0x40) 5x5, offset 83-87, at +0/-4 - // in regular row-major format - 0xfd, 0x6f, 0x0f, 0x80, - // 'A' (0x41) 5x5, offset 87-91, at +0/-4 - // in regular row-major format - 0xfc, 0x7f, 0x18, 0x80, - // 'B' (0x42) 5x5, offset 91-95, at +0/-4 - // in regular row-major format - 0xf4, 0x7d, 0x1f, 0x00, - // 'C' (0x43) 5x5, offset 95-99, at +0/-4 - // in regular row-major format - 0xfc, 0x21, 0x0f, 0x80, - // 'D' (0x44) 5x5, offset 99-103, at +0/-4 - // in regular row-major format - 0xf4, 0x63, 0x1f, 0x00, - // 'E' (0x45) 5x5, offset 103-107, at +0/-4 - // in regular row-major format - 0xfc, 0x3f, 0x0f, 0x80, - // 'F' (0x46) 5x5, offset 107-111, at +0/-4 - // in regular row-major format - 0xfc, 0x3f, 0x08, 0x00, - // 'G' (0x47) 5x5, offset 111-115, at +0/-4 - // in regular row-major format - 0xfc, 0x2f, 0x1f, 0x80, - // 'H' (0x48) 5x5, offset 115-119, at +0/-4 - // in regular row-major format - 0x8c, 0x7f, 0x18, 0x80, - // 'I' (0x49) 5x5, offset 119-123, at +0/-4 - // in regular row-major format - 0xf9, 0x08, 0x4f, 0x80, - // 'J' (0x4a) 5x5, offset 123-127, at +0/-4 - // in regular row-major format - 0x78, 0x85, 0x2f, 0x80, - // 'K' (0x4b) 5x5, offset 127-131, at +0/-4 - // in regular row-major format - 0x8d, 0xb1, 0x68, 0x80, - // 'L' (0x4c) 5x5, offset 131-135, at +0/-4 - // in regular row-major format - 0x84, 0x21, 0x0f, 0x80, - // 'M' (0x4d) 5x5, offset 135-139, at +0/-4 - // in regular row-major format - 0xfd, 0x6b, 0x5a, 0x80, - // 'N' (0x4e) 5x5, offset 139-143, at +0/-4 - // in regular row-major format - 0xfc, 0x63, 0x18, 0x80, - // 'O' (0x4f) 5x5, offset 143-147, at +0/-4 - // in regular row-major format - 0xfc, 0x63, 0x1f, 0x80, - // 'P' (0x50) 5x5, offset 147-151, at +0/-4 - // in regular row-major format - 0xfc, 0x7f, 0x08, 0x00, - // 'Q' (0x51) 5x5, offset 151-155, at +0/-4 - // in regular row-major format - 0xfc, 0x63, 0x3f, 0x80, - // 'R' (0x52) 5x5, offset 155-159, at +0/-4 - // in regular row-major format - 0xfc, 0x7f, 0x29, 0x00, - // 'S' (0x53) 5x5, offset 159-163, at +0/-4 - // in regular row-major format - 0xfc, 0x3e, 0x1f, 0x80, - // 'T' (0x54) 5x5, offset 163-167, at +0/-4 - // in regular row-major format - 0xf9, 0x08, 0x42, 0x00, - // 'U' (0x55) 5x5, offset 167-171, at +0/-4 - // in regular row-major format - 0x8c, 0x63, 0x1f, 0x80, - // 'V' (0x56) 5x5, offset 171-175, at +0/-4 - // in regular row-major format - 0x8c, 0x62, 0xa2, 0x00, - // 'W' (0x57) 5x5, offset 175-179, at +0/-4 - // in regular row-major format - 0xad, 0x6b, 0x5f, 0x80, - // 'X' (0x58) 5x5, offset 179-183, at +0/-4 - // in regular row-major format - 0x8a, 0x88, 0xa8, 0x80, - // 'Y' (0x59) 5x5, offset 183-187, at +0/-4 - // in regular row-major format - 0x8c, 0x54, 0x42, 0x00, - // 'Z' (0x5a) 5x5, offset 187-191, at +0/-4 - // in regular row-major format - 0xf8, 0x7f, 0x0f, 0x80, - // '[' (0x5b) 2x5, offset 191-193, at +0/-4 - // in regular row-major format - 0xea, 0xc0, - // '\' (0x5c) 5x5, offset 193-197, at +0/-4 - // in regular row-major format - 0x82, 0x08, 0x20, 0x80, - // ']' (0x5d) 2x5, offset 197-199, at +0/-4 - // in regular row-major format - 0xd5, 0xc0, - // '^' (0x5e) 3x2, offset 199-200, at +0/-4 - // in regular row-major format - 0x54, - // '_' (0x5f) 5x1, offset 200-201, at +0/+1 - // in regular row-major format - 0xf8, - // '`' (0x60) 1x1, offset 201-202, at +0/-4 - // in regular row-major format - 0x80, - // 'a' (0x61) 4x4, offset 202-204, at +0/-3 - // in regular row-major format - 0xf1, 0xff, - // 'b' (0x62) 4x5, offset 204-207, at +0/-4 - // in regular row-major format - 0x8f, 0x99, 0xf0, - // 'c' (0x63) 4x4, offset 207-209, at +0/-3 - // in regular row-major format - 0xf8, 0x8f, - // 'd' (0x64) 4x5, offset 209-212, at +0/-4 - // in regular row-major format - 0x1f, 0x99, 0xf0, - // 'e' (0x65) 4x4, offset 212-214, at +0/-3 - // in regular row-major format - 0xff, 0x8f, - // 'f' (0x66) 3x5, offset 214-216, at +0/-4 - // in regular row-major format - 0x6b, 0xa4, - // 'g' (0x67) 4x5, offset 216-219, at +0/-3 - // in regular row-major format - 0xf9, 0x9f, 0x10, - // 'h' (0x68) 4x5, offset 219-222, at +0/-4 - // in regular row-major format - 0x8f, 0x99, 0x90, - // 'i' (0x69) 1x4, offset 222-223, at +0/-3 - // in regular row-major format - 0xf0, - // 'j' (0x6a) 2x5, offset 223-225, at +0/-3 - // in regular row-major format - 0x55, 0xc0, - // 'k' (0x6b) 4x5, offset 225-228, at +0/-4 - // in regular row-major format - 0x8a, 0xf9, 0x90, - // 'l' (0x6c) 1x5, offset 228-229, at +0/-4 - // in regular row-major format - 0xf8, - // 'm' (0x6d) 5x4, offset 229-232, at +0/-3 - // in regular row-major format - 0xfd, 0x63, 0x10, - // 'n' (0x6e) 4x4, offset 232-234, at +0/-3 - // in regular row-major format - 0xf9, 0x99, - // 'o' (0x6f) 4x4, offset 234-236, at +0/-3 - // in regular row-major format - 0xf9, 0x9f, - // 'p' (0x70) 4x5, offset 236-239, at +0/-3 - // in regular row-major format - 0xf9, 0x9f, 0x80, - // 'q' (0x71) 4x5, offset 239-242, at +0/-3 - // in regular row-major format - 0xf9, 0x9f, 0x20, - // 'r' (0x72) 4x4, offset 242-244, at +0/-3 - // in regular row-major format - 0xf8, 0x88, - // 's' (0x73) 4x4, offset 244-246, at +0/-3 - // in regular row-major format - 0x47, 0x1f, - // 't' (0x74) 5x5, offset 246-250, at +0/-4 - // in regular row-major format - 0x27, 0xc8, 0x42, 0x00, - // 'u' (0x75) 4x4, offset 250-252, at +0/-3 - // in regular row-major format - 0x99, 0x9f, - // 'v' (0x76) 4x4, offset 252-254, at +0/-3 - // in regular row-major format - 0x99, 0x97, - // 'w' (0x77) 5x4, offset 254-257, at +0/-3 - // in regular row-major format - 0x8c, 0x6b, 0xf0, - // 'x' (0x78) 4x4, offset 257-259, at +0/-3 - // in regular row-major format - 0x96, 0x69, - // 'y' (0x79) 4x5, offset 259-262, at +0/-3 - // in regular row-major format - 0x99, 0x9f, 0x10, - // 'z' (0x7a) 4x4, offset 262-264, at +0/-3 - // in regular row-major format - 0x2e, 0x8f, - // '{' (0x7b) 3x5, offset 264-266, at +0/-4 - // in regular row-major format - 0x2b, 0x22, - // '|' (0x7c) 1x5, offset 266-267, at +0/-4 - // in regular row-major format - 0xf8, - // '}' (0x7d) 3x5, offset 267-269, at +0/-4 - // in regular row-major format - 0x89, 0xa8, -}; - - -static const uint8_t OpenSansLight10_generic[] = { - // ' ' (0x20) 1x1, offset 0-1, at +0/+0 - // in regular row-major format - 0x00, - // '!' (0x21) 3x7, offset 1-4, at +0/-7 - // in regular row-major format - 0x49, 0x20, 0x10, - // '"' (0x22) 3x3, offset 4-6, at +1/-7 - // in regular row-major format - 0xd8, 0x00, - // '#' (0x23) 7x7, offset 6-13, at +0/-7 - // in regular row-major format - 0x28, 0x51, 0xf2, 0x4f, 0x8a, 0x14, 0x00, - // '$' (0x24) 5x9, offset 13-19, at +1/-8 - // in regular row-major format - 0x03, 0xb1, 0x86, 0x29, 0x5c, 0x00, - // '%' (0x25) 7x7, offset 19-26, at +1/-7 - // in regular row-major format - 0xc9, 0x52, 0xc7, 0x63, 0x4a, 0x93, 0x00, - // '&' (0x26) 7x7, offset 26-33, at +1/-7 - // in regular row-major format - 0x61, 0x22, 0x82, 0x0a, 0x13, 0x3e, 0x00, - // ''' (0x27) 3x3, offset 33-35, at +0/-7 - // in regular row-major format - 0x90, 0x00, - // '(' (0x28) 4x9, offset 35-40, at +0/-7 - // in regular row-major format - 0x44, 0x88, 0x88, 0x84, 0x40, - // ')' (0x29) 4x9, offset 40-45, at +0/-7 - // in regular row-major format - 0x44, 0x22, 0x22, 0x24, 0x40, - // '*' (0x2a) 5x4, offset 45-48, at +1/-7 - // in regular row-major format - 0x42, 0x19, 0x20, - // '+' (0x2b) 5x5, offset 48-52, at +1/-6 - // in regular row-major format - 0x02, 0x3c, 0x80, 0x00, - // ',' (0x2c) 2x2, offset 52-53, at +0/-1 - // in regular row-major format - 0xa0, - // '-' (0x2d) 4x1, offset 53-54, at +0/-3 - // in regular row-major format - 0xe0, - // '.' (0x2e) 3x1, offset 54-55, at +0/-1 - // in regular row-major format - 0x40, - // '/' (0x2f) 4x7, offset 55-59, at +0/-7 - // in regular row-major format - 0x22, 0x44, 0x48, 0x80, - // '0' (0x30) 5x7, offset 59-64, at +1/-7 - // in regular row-major format - 0x64, 0xa5, 0x29, 0x49, 0x80, - // '1' (0x31) 3x7, offset 64-67, at +1/-7 - // in regular row-major format - 0x59, 0x24, 0x80, - // '2' (0x32) 5x7, offset 67-72, at +1/-7 - // in regular row-major format - 0xe0, 0x84, 0x44, 0x43, 0xc0, - // '3' (0x33) 6x7, offset 72-78, at +0/-7 - // in regular row-major format - 0x78, 0x20, 0x8c, 0x08, 0x27, 0x80, - // '4' (0x34) 7x7, offset 78-85, at +0/-7 - // in regular row-major format - 0x18, 0x51, 0x22, 0x4f, 0xc1, 0x02, 0x00, - // '5' (0x35) 5x7, offset 85-90, at +1/-7 - // in regular row-major format - 0xf4, 0x21, 0xe1, 0x0b, 0xc0, - // '6' (0x36) 5x7, offset 90-95, at +1/-7 - // in regular row-major format - 0x74, 0x3d, 0x29, 0x49, 0xc0, - // '7' (0x37) 5x7, offset 95-100, at +1/-7 - // in regular row-major format - 0xf0, 0x84, 0x42, 0x21, 0x00, - // '8' (0x38) 5x7, offset 100-105, at +1/-7 - // in regular row-major format - 0xf4, 0xa4, 0xc9, 0x4b, 0xc0, - // '9' (0x39) 5x7, offset 105-110, at +1/-7 - // in regular row-major format - 0xe4, 0xa5, 0x2f, 0x0b, 0x80, - // ':' (0x3a) 3x5, offset 110-112, at +0/-5 - // in regular row-major format - 0x40, 0x04, - // ';' (0x3b) 2x6, offset 112-114, at +0/-5 - // in regular row-major format - 0x80, 0x20, - // '<' (0x3c) 5x5, offset 114-118, at +1/-6 - // in regular row-major format - 0x13, 0x20, 0xc1, 0x00, - // '=' (0x3d) 5x3, offset 118-120, at +1/-5 - // in regular row-major format - 0xf0, 0x3c, - // '>' (0x3e) 5x5, offset 120-124, at +1/-6 - // in regular row-major format - 0x83, 0x04, 0xc8, 0x00, - // '?' (0x3f) 5x7, offset 124-129, at +0/-7 - // in regular row-major format - 0x60, 0x84, 0x44, 0x01, 0x00, - // '@' (0x40) 8x8, offset 129-137, at +1/-7 - // in regular row-major format - 0x7c, 0x82, 0xba, 0xca, 0xca, 0xbe, 0x80, 0x78, - // 'A' (0x41) 7x7, offset 137-144, at +0/-7 - // in regular row-major format - 0x10, 0x60, 0xc2, 0x47, 0x90, 0xa1, 0x00, - // 'B' (0x42) 5x7, offset 144-149, at +1/-7 - // in regular row-major format - 0xf4, 0xa5, 0xc9, 0x4b, 0xc0, - // 'C' (0x43) 6x7, offset 149-155, at +1/-7 - // in regular row-major format - 0x72, 0x08, 0x20, 0x82, 0x07, 0x00, - // 'D' (0x44) 6x7, offset 155-161, at +1/-7 - // in regular row-major format - 0xf2, 0x28, 0xa2, 0x8a, 0x2f, 0x00, - // 'E' (0x45) 5x7, offset 161-166, at +1/-7 - // in regular row-major format - 0xf4, 0x21, 0xe8, 0x43, 0xc0, - // 'F' (0x46) 5x7, offset 166-171, at +1/-7 - // in regular row-major format - 0xf4, 0x21, 0xe8, 0x42, 0x00, - // 'G' (0x47) 6x7, offset 171-177, at +1/-7 - // in regular row-major format - 0x7a, 0x08, 0x26, 0x8a, 0x27, 0x80, - // 'H' (0x48) 6x7, offset 177-183, at +1/-7 - // in regular row-major format - 0x8a, 0x28, 0xbe, 0x8a, 0x28, 0x80, - // 'I' (0x49) 2x7, offset 183-185, at +1/-7 - // in regular row-major format - 0xaa, 0xa8, - // 'J' (0x4a) 3x9, offset 185-189, at -1/-7 - // in regular row-major format - 0x49, 0x24, 0x92, 0xc0, - // 'K' (0x4b) 6x7, offset 189-195, at +1/-7 - // in regular row-major format - 0x8a, 0x4a, 0x38, 0xa2, 0x48, 0x80, - // 'L' (0x4c) 5x7, offset 195-200, at +1/-7 - // in regular row-major format - 0x84, 0x21, 0x08, 0x43, 0xc0, - // 'M' (0x4d) 8x7, offset 200-207, at +1/-7 - // in regular row-major format - 0x82, 0x82, 0xc6, 0xaa, 0xaa, 0xaa, 0x92, - // 'N' (0x4e) 6x7, offset 207-213, at +1/-7 - // in regular row-major format - 0x82, 0x2c, 0xaa, 0x9a, 0x60, 0x80, - // 'O' (0x4f) 7x7, offset 213-220, at +1/-7 - // in regular row-major format - 0x79, 0x0a, 0x14, 0x28, 0x50, 0x9e, 0x00, - // 'P' (0x50) 5x7, offset 220-225, at +1/-7 - // in regular row-major format - 0xf4, 0xa5, 0x2f, 0x42, 0x00, - // 'Q' (0x51) 7x9, offset 225-233, at +1/-7 - // in regular row-major format - 0x79, 0x0a, 0x14, 0x28, 0x50, 0x9e, 0x04, 0x08, - // 'R' (0x52) 6x7, offset 233-239, at +1/-7 - // in regular row-major format - 0xf2, 0x49, 0x3c, 0xa2, 0x48, 0x80, - // 'S' (0x53) 5x7, offset 239-244, at +1/-7 - // in regular row-major format - 0xe4, 0x20, 0xc1, 0x0b, 0x80, - // 'T' (0x54) 6x7, offset 244-250, at +0/-7 - // in regular row-major format - 0xf8, 0x82, 0x08, 0x20, 0x82, 0x00, - // 'U' (0x55) 6x7, offset 250-256, at +1/-7 - // in regular row-major format - 0x8a, 0x28, 0xa2, 0x8a, 0x27, 0x00, - // 'V' (0x56) 7x7, offset 256-263, at +0/-7 - // in regular row-major format - 0x85, 0x09, 0x22, 0x43, 0x06, 0x08, 0x00, - // 'W' (0x57) 10x7, offset 263-272, at +0/-7 - // in regular row-major format - 0x88, 0xa6, 0x25, 0x51, 0x54, 0x55, 0x08, 0x82, - 0x20, - // 'X' (0x58) 6x7, offset 272-278, at +0/-7 - // in regular row-major format - 0x89, 0x45, 0x08, 0x51, 0x48, 0x80, - // 'Y' (0x59) 6x7, offset 278-284, at +0/-7 - // in regular row-major format - 0x89, 0x45, 0x08, 0x20, 0x82, 0x00, - // 'Z' (0x5a) 7x7, offset 284-291, at +0/-7 - // in regular row-major format - 0x78, 0x10, 0x41, 0x02, 0x08, 0x3f, 0x00, - // '[' (0x5b) 3x9, offset 291-295, at +1/-7 - // in regular row-major format - 0x92, 0x49, 0x24, 0x80, - // '\' (0x5c) 4x7, offset 295-299, at +0/-7 - // in regular row-major format - 0x88, 0x44, 0x42, 0x20, - // ']' (0x5d) 3x9, offset 299-303, at +0/-7 - // in regular row-major format - 0x49, 0x24, 0x92, 0x40, - // '^' (0x5e) 7x4, offset 303-307, at +0/-7 - // in regular row-major format - 0x10, 0x61, 0x20, 0x00, - // '_' (0x5f) 5x1, offset 307-308, at +0/+1 - // in regular row-major format - 0xf0, - // '`' (0x60) 3x2, offset 308-309, at +2/-8 - // in regular row-major format - 0x88, - // 'a' (0x61) 5x5, offset 309-313, at +0/-5 - // in regular row-major format - 0x70, 0x9d, 0x26, 0x00, - // 'b' (0x62) 5x7, offset 313-318, at +1/-7 - // in regular row-major format - 0x04, 0x3d, 0x29, 0x49, 0xc0, - // 'c' (0x63) 5x5, offset 318-322, at +1/-5 - // in regular row-major format - 0x74, 0x21, 0x0f, 0x00, - // 'd' (0x64) 5x7, offset 322-327, at +1/-7 - // in regular row-major format - 0x00, 0xbd, 0x29, 0x4b, 0x80, - // 'e' (0x65) 4x5, offset 327-330, at +1/-5 - // in regular row-major format - 0xea, 0xe8, 0xe0, - // 'f' (0x66) 5x7, offset 330-335, at +0/-7 - // in regular row-major format - 0x72, 0x38, 0x84, 0x21, 0x00, - // 'g' (0x67) 6x7, offset 335-341, at +0/-5 - // in regular row-major format - 0x7a, 0x47, 0x10, 0x72, 0x27, 0x00, - // 'h' (0x68) 5x7, offset 341-346, at +1/-7 - // in regular row-major format - 0x04, 0x3d, 0x29, 0x48, 0x00, - // 'i' (0x69) 3x7, offset 346-349, at +0/-7 - // in regular row-major format - 0x40, 0x24, 0x80, - // 'j' (0x6a) 3x9, offset 349-353, at -1/-7 - // in regular row-major format - 0x40, 0x24, 0x92, 0xc0, - // 'k' (0x6b) 5x7, offset 353-358, at +1/-7 - // in regular row-major format - 0x04, 0x25, 0x4c, 0x50, 0x40, - // 'l' (0x6c) 3x7, offset 358-361, at +0/-7 - // in regular row-major format - 0x09, 0x24, 0x80, - // 'm' (0x6d) 8x5, offset 361-366, at +1/-5 - // in regular row-major format - 0x6e, 0x92, 0x92, 0x92, 0x10, - // 'n' (0x6e) 5x5, offset 366-370, at +1/-5 - // in regular row-major format - 0x74, 0xa5, 0x20, 0x00, - // 'o' (0x6f) 5x5, offset 370-374, at +1/-5 - // in regular row-major format - 0xf4, 0xa5, 0x2f, 0x00, - // 'p' (0x70) 5x7, offset 374-379, at +1/-5 - // in regular row-major format - 0x74, 0xa5, 0x2f, 0x40, 0x00, - // 'q' (0x71) 5x7, offset 379-384, at +1/-5 - // in regular row-major format - 0xe4, 0xa5, 0x2f, 0x08, 0x00, - // 'r' (0x72) 4x5, offset 384-387, at +1/-5 - // in regular row-major format - 0x68, 0x88, 0x00, - // 's' (0x73) 5x5, offset 387-391, at +0/-5 - // in regular row-major format - 0x74, 0x18, 0x27, 0x00, - // 't' (0x74) 4x6, offset 391-394, at +0/-6 - // in regular row-major format - 0x0e, 0x44, 0x46, - // 'u' (0x75) 5x5, offset 394-398, at +1/-5 - // in regular row-major format - 0x04, 0xa5, 0x2e, 0x00, - // 'v' (0x76) 6x5, offset 398-402, at +0/-5 - // in regular row-major format - 0x8a, 0x25, 0x14, 0x20, - // 'w' (0x77) 8x5, offset 402-407, at +0/-5 - // in regular row-major format - 0x92, 0x92, 0x6c, 0x6c, 0x44, - // 'x' (0x78) 6x5, offset 407-411, at +0/-5 - // in regular row-major format - 0x51, 0x42, 0x14, 0x88, - // 'y' (0x79) 6x7, offset 411-417, at +0/-5 - // in regular row-major format - 0x8a, 0x25, 0x14, 0x20, 0x8c, 0x00, - // 'z' (0x7a) 6x5, offset 417-421, at +0/-5 - // in regular row-major format - 0x78, 0x42, 0x10, 0xf8, - // '{' (0x7b) 5x9, offset 421-427, at +0/-7 - // in regular row-major format - 0x22, 0x10, 0x84, 0x21, 0x08, 0x20, - // '|' (0x7c) 2x9, offset 427-430, at +2/-7 - // in regular row-major format - 0xaa, 0xaa, 0x80, -}; - - -static const uint8_t OpenSansLight12_generic[] = { - // ' ' (0x20) 1x1, offset 0-1, at +0/+0 - // in regular row-major format - 0x00, - // '!' (0x21) 2x9, offset 1-4, at +1/-9 - // in regular row-major format - 0xaa, 0xa8, 0x80, - // '"' (0x22) 3x3, offset 4-6, at +1/-9 - // in regular row-major format - 0xd8, 0x00, - // '#' (0x23) 9x9, offset 6-17, at +0/-9 - // in regular row-major format - 0x12, 0x0a, 0x1f, 0xc4, 0x82, 0x47, 0xf0, 0xa0, - 0x50, 0x48, 0x00, - // '$' (0x24) 6x10, offset 17-25, at +1/-9 - // in regular row-major format - 0x21, 0xca, 0x28, 0x70, 0xa2, 0x8a, 0xf0, 0x80, - // '%' (0x25) 9x9, offset 25-36, at +1/-9 - // in regular row-major format - 0xc2, 0x52, 0x29, 0x15, 0xeb, 0x57, 0xa8, 0x94, - 0x4a, 0x43, 0x00, - // '&' (0x26) 9x9, offset 36-47, at +1/-9 - // in regular row-major format - 0x70, 0x24, 0x12, 0x0a, 0x06, 0x04, 0x92, 0x29, - 0x08, 0x7a, 0x00, - // ''' (0x27) 3x3, offset 47-49, at +0/-9 - // in regular row-major format - 0x48, 0x00, - // '(' (0x28) 4x11, offset 49-55, at +0/-9 - // in regular row-major format - 0x24, 0x48, 0x88, 0x88, 0x44, 0x20, - // ')' (0x29) 4x11, offset 55-61, at +0/-9 - // in regular row-major format - 0x84, 0x42, 0x22, 0x22, 0x44, 0x80, - // '*' (0x2a) 6x5, offset 61-65, at +1/-9 - // in regular row-major format - 0x20, 0x8f, 0x94, 0x50, - // '+' (0x2b) 6x7, offset 65-71, at +1/-8 - // in regular row-major format - 0x20, 0x82, 0x3e, 0x20, 0x82, 0x00, - // ',' (0x2c) 3x3, offset 71-73, at +0/-1 - // in regular row-major format - 0x4a, 0x00, - // '-' (0x2d) 3x1, offset 73-74, at +1/-3 - // in regular row-major format - 0xc0, - // '.' (0x2e) 2x1, offset 74-75, at +1/-1 - // in regular row-major format - 0x80, - // '/' (0x2f) 5x9, offset 75-81, at +0/-9 - // in regular row-major format - 0x10, 0x88, 0x44, 0x21, 0x10, 0x80, - // '0' (0x30) 6x9, offset 81-88, at +1/-9 - // in regular row-major format - 0x72, 0x28, 0xa2, 0x8a, 0x28, 0xa2, 0x70, - // '1' (0x31) 4x9, offset 88-93, at +1/-9 - // in regular row-major format - 0x26, 0x22, 0x22, 0x22, 0x20, - // '2' (0x32) 6x9, offset 93-100, at +1/-9 - // in regular row-major format - 0x72, 0x20, 0x82, 0x10, 0x84, 0x20, 0xf8, - // '3' (0x33) 6x9, offset 100-107, at +1/-9 - // in regular row-major format - 0x72, 0x20, 0x82, 0x70, 0x20, 0x82, 0xf0, - // '4' (0x34) 8x9, offset 107-116, at +0/-9 - // in regular row-major format - 0x08, 0x14, 0x14, 0x24, 0x44, 0x44, 0xfe, 0x04, - 0x04, - // '5' (0x35) 6x9, offset 116-123, at +1/-9 - // in regular row-major format - 0xfa, 0x08, 0x20, 0xf0, 0x20, 0x82, 0xf0, - // '6' (0x36) 6x9, offset 123-130, at +1/-9 - // in regular row-major format - 0x39, 0x08, 0x3c, 0x8a, 0x28, 0xa2, 0x70, - // '7' (0x37) 6x9, offset 130-137, at +1/-9 - // in regular row-major format - 0xf8, 0x20, 0x84, 0x10, 0x82, 0x08, 0x40, - // '8' (0x38) 6x9, offset 137-144, at +1/-9 - // in regular row-major format - 0x72, 0x28, 0xa2, 0x72, 0x28, 0xa2, 0x70, - // '9' (0x39) 6x9, offset 144-151, at +1/-9 - // in regular row-major format - 0x72, 0x28, 0xa2, 0x89, 0xe0, 0x84, 0xe0, - // ':' (0x3a) 2x6, offset 151-153, at +1/-6 - // in regular row-major format - 0x80, 0x20, - // ';' (0x3b) 3x8, offset 153-156, at +0/-6 - // in regular row-major format - 0x40, 0x00, 0x90, - // '<' (0x3c) 6x6, offset 156-161, at +1/-8 - // in regular row-major format - 0x08, 0xc4, 0x30, 0x30, 0x20, - // '=' (0x3d) 6x3, offset 161-164, at +1/-6 - // in regular row-major format - 0xf8, 0x0f, 0x80, - // '>' (0x3e) 6x6, offset 164-169, at +1/-8 - // in regular row-major format - 0x81, 0x81, 0x06, 0x62, 0x00, - // '?' (0x3f) 6x9, offset 169-176, at +0/-9 - // in regular row-major format - 0x70, 0x20, 0x82, 0x10, 0x80, 0x00, 0x40, - // '@' (0x40) 10x10, offset 176-189, at +1/-9 - // in regular row-major format - 0x3e, 0x10, 0x49, 0xea, 0x8a, 0xa2, 0xa8, 0xaa, - 0x2a, 0x7c, 0xc0, 0x0f, 0x80, - // 'A' (0x41) 8x9, offset 189-198, at +0/-9 - // in regular row-major format - 0x10, 0x10, 0x28, 0x28, 0x44, 0x7c, 0x44, 0x82, - 0x82, - // 'B' (0x42) 7x9, offset 198-206, at +1/-9 - // in regular row-major format - 0xf9, 0x0a, 0x14, 0x2f, 0x90, 0xa1, 0x42, 0xf8, - // 'C' (0x43) 7x9, offset 206-214, at +1/-9 - // in regular row-major format - 0x38, 0x82, 0x04, 0x08, 0x10, 0x20, 0x60, 0x78, - // 'D' (0x44) 7x9, offset 214-222, at +1/-9 - // in regular row-major format - 0xf1, 0x1a, 0x14, 0x28, 0x50, 0xa1, 0x44, 0xf0, - // 'E' (0x45) 6x9, offset 222-229, at +1/-9 - // in regular row-major format - 0xfa, 0x08, 0x20, 0xfa, 0x08, 0x20, 0xf8, - // 'F' (0x46) 6x9, offset 229-236, at +1/-9 - // in regular row-major format - 0xfa, 0x08, 0x20, 0xfa, 0x08, 0x20, 0x80, - // 'G' (0x47) 8x9, offset 236-245, at +1/-9 - // in regular row-major format - 0x3c, 0x40, 0x80, 0x80, 0x8e, 0x82, 0x82, 0x42, - 0x3e, - // 'H' (0x48) 8x9, offset 245-254, at +1/-9 - // in regular row-major format - 0x82, 0x82, 0x82, 0x82, 0xfe, 0x82, 0x82, 0x82, - 0x82, - // 'I' (0x49) 2x9, offset 254-257, at +1/-9 - // in regular row-major format - 0xaa, 0xaa, 0x80, - // 'J' (0x4a) 4x11, offset 257-263, at -1/-9 - // in regular row-major format - 0x22, 0x22, 0x22, 0x22, 0x22, 0xc0, - // 'K' (0x4b) 7x9, offset 263-271, at +1/-9 - // in regular row-major format - 0x85, 0x12, 0x45, 0x0e, 0x12, 0x24, 0x44, 0x84, - // 'L' (0x4c) 6x9, offset 271-278, at +1/-9 - // in regular row-major format - 0x82, 0x08, 0x20, 0x82, 0x08, 0x20, 0xf8, - // 'M' (0x4d) 9x9, offset 278-289, at +1/-9 - // in regular row-major format - 0x81, 0x61, 0xb0, 0xd4, 0xaa, 0x55, 0x2a, 0x65, - 0x32, 0x91, 0x00, - // 'N' (0x4e) 8x9, offset 289-298, at +1/-9 - // in regular row-major format - 0x82, 0xc2, 0xa2, 0xa2, 0x92, 0x8a, 0x8a, 0x86, - 0x82, - // 'O' (0x4f) 8x9, offset 298-307, at +1/-9 - // in regular row-major format - 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0x82, 0x44, - 0x38, - // 'P' (0x50) 6x9, offset 307-314, at +1/-9 - // in regular row-major format - 0xf2, 0x28, 0xa2, 0x8b, 0xc8, 0x20, 0x80, - // 'Q' (0x51) 8x11, offset 314-325, at +1/-9 - // in regular row-major format - 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0x82, 0x44, - 0x38, 0x08, 0x04, - // 'R' (0x52) 7x9, offset 325-333, at +1/-9 - // in regular row-major format - 0xf1, 0x12, 0x24, 0x4f, 0x12, 0x22, 0x44, 0x84, - // 'S' (0x53) 6x9, offset 333-340, at +1/-9 - // in regular row-major format - 0x7a, 0x08, 0x20, 0x70, 0x20, 0x82, 0xf0, - // 'T' (0x54) 7x9, offset 340-348, at +0/-9 - // in regular row-major format - 0xfc, 0x20, 0x40, 0x81, 0x02, 0x04, 0x08, 0x10, - // 'U' (0x55) 8x9, offset 348-357, at +1/-9 - // in regular row-major format - 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x44, - 0x78, - // 'V' (0x56) 8x9, offset 357-366, at +0/-9 - // in regular row-major format - 0x82, 0x82, 0x44, 0x44, 0x44, 0x28, 0x28, 0x28, - 0x10, - // 'W' (0x57) 12x9, offset 366-380, at +0/-9 - // in regular row-major format - 0x84, 0x24, 0xc4, 0x4a, 0x44, 0xa4, 0x4a, 0x43, - 0x18, 0x31, 0x83, 0x18, 0x20, 0x80, - // 'X' (0x58) 7x9, offset 380-388, at +0/-9 - // in regular row-major format - 0x84, 0x91, 0x21, 0x81, 0x06, 0x12, 0x24, 0x84, - // 'Y' (0x59) 7x9, offset 388-396, at +0/-9 - // in regular row-major format - 0x84, 0x91, 0x21, 0x43, 0x02, 0x04, 0x08, 0x10, - // 'Z' (0x5a) 8x9, offset 396-405, at +0/-9 - // in regular row-major format - 0x7c, 0x04, 0x08, 0x08, 0x10, 0x20, 0x20, 0x40, - 0xfe, - // '[' (0x5b) 4x11, offset 405-411, at +1/-9 - // in regular row-major format - 0xe8, 0x88, 0x88, 0x88, 0x88, 0xe0, - // '\' (0x5c) 5x9, offset 411-417, at +0/-9 - // in regular row-major format - 0x84, 0x10, 0x84, 0x10, 0x82, 0x10, - // ']' (0x5d) 4x11, offset 417-423, at +0/-9 - // in regular row-major format - 0xe2, 0x22, 0x22, 0x22, 0x22, 0xe0, - // '^' (0x5e) 6x5, offset 423-427, at +1/-9 - // in regular row-major format - 0x21, 0x45, 0x22, 0x88, - // '_' (0x5f) 6x1, offset 427-428, at +0/+1 - // in regular row-major format - 0xf8, - // '`' (0x60) 4x2, offset 428-429, at +2/-9 - // in regular row-major format - 0x44, - // 'a' (0x61) 5x6, offset 429-433, at +1/-6 - // in regular row-major format - 0x70, 0xbd, 0x29, 0x78, - // 'b' (0x62) 6x9, offset 433-440, at +1/-9 - // in regular row-major format - 0x82, 0x08, 0x3c, 0x8a, 0x28, 0xa2, 0x70, - // 'c' (0x63) 6x6, offset 440-445, at +1/-6 - // in regular row-major format - 0x72, 0x08, 0x20, 0x81, 0xc0, - // 'd' (0x64) 6x9, offset 445-452, at +1/-9 - // in regular row-major format - 0x08, 0x20, 0x9e, 0x8a, 0x28, 0xa2, 0x78, - // 'e' (0x65) 6x6, offset 452-457, at +1/-6 - // in regular row-major format - 0x72, 0x2f, 0xa0, 0x81, 0xe0, - // 'f' (0x66) 5x9, offset 457-463, at +0/-9 - // in regular row-major format - 0x32, 0x11, 0xe4, 0x21, 0x08, 0x40, - // 'g' (0x67) 7x9, offset 463-471, at +0/-6 - // in regular row-major format - 0x7c, 0x91, 0x23, 0x84, 0x0f, 0x21, 0x42, 0x78, - // 'h' (0x68) 6x9, offset 471-478, at +1/-9 - // in regular row-major format - 0x82, 0x08, 0x3c, 0x8a, 0x28, 0xa2, 0x88, - // 'i' (0x69) 2x9, offset 478-481, at +1/-9 - // in regular row-major format - 0x82, 0xaa, 0x80, - // 'j' (0x6a) 3x12, offset 481-486, at +0/-9 - // in regular row-major format - 0x40, 0x24, 0x92, 0x49, 0x40, - // 'k' (0x6b) 6x9, offset 486-493, at +1/-9 - // in regular row-major format - 0x82, 0x08, 0x24, 0xa3, 0x0a, 0x24, 0x88, - // 'l' (0x6c) 2x9, offset 493-496, at +1/-9 - // in regular row-major format - 0xaa, 0xaa, 0x80, - // 'm' (0x6d) 10x6, offset 496-504, at +1/-6 - // in regular row-major format - 0xf7, 0x22, 0x28, 0x8a, 0x22, 0x88, 0xa2, 0x20, - // 'n' (0x6e) 6x6, offset 504-509, at +1/-6 - // in regular row-major format - 0xf2, 0x28, 0xa2, 0x8a, 0x20, - // 'o' (0x6f) 6x6, offset 509-514, at +1/-6 - // in regular row-major format - 0x72, 0x28, 0xa2, 0x89, 0xc0, - // 'p' (0x70) 6x9, offset 514-521, at +1/-6 - // in regular row-major format - 0xf2, 0x28, 0xa2, 0x8b, 0xc8, 0x20, 0x80, - // 'q' (0x71) 6x9, offset 521-528, at +1/-6 - // in regular row-major format - 0x7a, 0x28, 0xa2, 0x89, 0xe0, 0x82, 0x08, - // 'r' (0x72) 5x6, offset 528-532, at +1/-6 - // in regular row-major format - 0xf4, 0x21, 0x08, 0x40, - // 's' (0x73) 5x6, offset 532-536, at +1/-6 - // in regular row-major format - 0xf4, 0x30, 0x61, 0x78, - // 't' (0x74) 5x8, offset 536-541, at +0/-8 - // in regular row-major format - 0x42, 0x3c, 0x84, 0x21, 0x0e, - // 'u' (0x75) 6x6, offset 541-546, at +1/-6 - // in regular row-major format - 0x8a, 0x28, 0xa2, 0x89, 0xe0, - // 'v' (0x76) 7x6, offset 546-552, at +0/-6 - // in regular row-major format - 0x85, 0x09, 0x22, 0x43, 0x06, 0x00, - // 'w' (0x77) 10x6, offset 552-560, at +0/-6 - // in regular row-major format - 0x88, 0xa2, 0x25, 0x51, 0x54, 0x62, 0x08, 0x80, - // 'x' (0x78) 7x6, offset 560-566, at +0/-6 - // in regular row-major format - 0x48, 0x90, 0xc1, 0x84, 0x89, 0x00, - // 'y' (0x79) 7x9, offset 566-574, at +0/-6 - // in regular row-major format - 0x85, 0x09, 0x22, 0x43, 0x06, 0x08, 0x10, 0xc0, - // 'z' (0x7a) 5x6, offset 574-578, at +1/-6 - // in regular row-major format - 0xf0, 0x88, 0x88, 0x78, - // '{' (0x7b) 5x11, offset 578-585, at +0/-9 - // in regular row-major format - 0x32, 0x10, 0x84, 0x21, 0x08, 0x42, 0x0c, - // '|' (0x7c) 2x12, offset 585-588, at +3/-9 - // in regular row-major format - 0xaa, 0xaa, 0xaa, -}; - - -static const uint8_t OpenSansLight14_generic[] = { - // ' ' (0x20) 1x1, offset 0-1, at +0/+0 - // in regular row-major format - 0x00, - // '!' (0x21) 2x10, offset 1-4, at +1/-10 - // in regular row-major format - 0xaa, 0xa8, 0x20, - // '"' (0x22) 4x4, offset 4-6, at +1/-10 - // in regular row-major format - 0xaa, 0xaa, - // '#' (0x23) 10x10, offset 6-19, at +0/-10 - // in regular row-major format - 0x12, 0x04, 0x81, 0x21, 0xfe, 0x12, 0x09, 0x0f, - 0xf0, 0x90, 0x24, 0x09, 0x00, - // '$' (0x24) 7x12, offset 19-30, at +1/-11 - // in regular row-major format - 0x20, 0xf2, 0x85, 0x0e, 0x0e, 0x0a, 0x12, 0x24, - 0x51, 0xe1, 0x00, - // '%' (0x25) 10x10, offset 30-43, at +1/-10 - // in regular row-major format - 0xe2, 0x24, 0x89, 0x42, 0x50, 0x9b, 0xbb, 0x21, - 0x48, 0x52, 0x24, 0x88, 0xe0, - // '&' (0x26) 10x10, offset 43-56, at +1/-10 - // in regular row-major format - 0x38, 0x11, 0x04, 0x41, 0x20, 0x30, 0x14, 0x08, - 0x92, 0x18, 0x86, 0x1e, 0x40, - // ''' (0x27) 2x4, offset 56-57, at +1/-10 - // in regular row-major format - 0xaa, - // '(' (0x28) 4x12, offset 57-63, at +1/-10 - // in regular row-major format - 0x44, 0x88, 0x88, 0x88, 0x88, 0x44, - // ')' (0x29) 4x12, offset 63-69, at +0/-10 - // in regular row-major format - 0x44, 0x22, 0x22, 0x22, 0x22, 0x44, - // '*' (0x2a) 7x6, offset 69-75, at +1/-11 - // in regular row-major format - 0x20, 0x43, 0xb1, 0x85, 0x09, 0x00, - // '+' (0x2b) 7x7, offset 75-82, at +1/-9 - // in regular row-major format - 0x00, 0x40, 0x87, 0xe2, 0x04, 0x00, 0x00, - // ',' (0x2c) 3x4, offset 82-84, at +0/-2 - // in regular row-major format - 0x49, 0x40, - // '-' (0x2d) 4x1, offset 84-85, at +1/-4 - // in regular row-major format - 0xe0, - // '.' (0x2e) 2x1, offset 85-86, at +1/-1 - // in regular row-major format - 0x80, - // '/' (0x2f) 6x10, offset 86-94, at +0/-10 - // in regular row-major format - 0x08, 0x41, 0x04, 0x20, 0x84, 0x10, 0x42, 0x00, - // '0' (0x30) 7x10, offset 94-103, at +1/-10 - // in regular row-major format - 0x79, 0x9a, 0x14, 0x28, 0x50, 0xa1, 0x42, 0xcc, - 0xf0, - // '1' (0x31) 5x10, offset 103-110, at +1/-10 - // in regular row-major format - 0x32, 0x84, 0x21, 0x08, 0x42, 0x10, 0x80, - // '2' (0x32) 7x10, offset 110-119, at +1/-10 - // in regular row-major format - 0x79, 0x10, 0x10, 0x20, 0x82, 0x08, 0x20, 0x81, - 0xf8, - // '3' (0x33) 7x10, offset 119-128, at +1/-10 - // in regular row-major format - 0x79, 0x08, 0x10, 0x47, 0x01, 0x81, 0x02, 0x0d, - 0xf0, - // '4' (0x34) 9x10, offset 128-140, at +0/-10 - // in regular row-major format - 0x04, 0x06, 0x05, 0x04, 0x82, 0x42, 0x23, 0xfc, - 0x08, 0x04, 0x02, 0x00, - // '5' (0x35) 7x10, offset 140-149, at +1/-10 - // in regular row-major format - 0x79, 0x02, 0x04, 0x0f, 0x80, 0x81, 0x02, 0x05, - 0xf0, - // '6' (0x36) 7x10, offset 149-158, at +1/-10 - // in regular row-major format - 0x38, 0x82, 0x04, 0x0f, 0x90, 0xa1, 0x42, 0x44, - 0xf0, - // '7' (0x37) 7x10, offset 158-167, at +1/-10 - // in regular row-major format - 0xfc, 0x08, 0x10, 0x40, 0x82, 0x04, 0x10, 0x20, - 0x80, - // '8' (0x38) 7x10, offset 167-176, at +1/-10 - // in regular row-major format - 0x79, 0x0a, 0x12, 0x43, 0x09, 0x21, 0x42, 0x84, - 0xf0, - // '9' (0x39) 7x10, offset 176-185, at +1/-10 - // in regular row-major format - 0x79, 0x12, 0x14, 0x28, 0x4f, 0x81, 0x02, 0x09, - 0xe0, - // ':' (0x3a) 2x8, offset 185-187, at +1/-8 - // in regular row-major format - 0x80, 0x02, - // ';' (0x3b) 3x10, offset 187-191, at +0/-8 - // in regular row-major format - 0x40, 0x00, 0x12, 0x40, - // '<' (0x3c) 7x7, offset 191-198, at +1/-9 - // in regular row-major format - 0x04, 0x31, 0x84, 0x06, 0x03, 0x01, 0x00, - // '=' (0x3d) 7x3, offset 198-201, at +1/-7 - // in regular row-major format - 0xfc, 0x03, 0xf0, - // '>' (0x3e) 7x7, offset 201-208, at +1/-9 - // in regular row-major format - 0x80, 0xc0, 0x60, 0x21, 0x8c, 0x20, 0x00, - // '?' (0x3f) 6x10, offset 208-216, at +0/-10 - // in regular row-major format - 0x78, 0x20, 0x82, 0x10, 0x82, 0x00, 0x00, 0x80, - // '@' (0x40) 11x11, offset 216-232, at +1/-10 - // in regular row-major format - 0x1f, 0x0c, 0x11, 0x01, 0x47, 0x29, 0x25, 0x44, - 0xa8, 0x94, 0xec, 0x80, 0x08, 0x00, 0xf8, 0x00, - // 'A' (0x41) 9x10, offset 232-244, at +0/-10 - // in regular row-major format - 0x08, 0x0c, 0x06, 0x04, 0x82, 0x41, 0x21, 0xf8, - 0x84, 0x81, 0x40, 0x80, - // 'B' (0x42) 8x10, offset 244-254, at +1/-10 - // in regular row-major format - 0xfc, 0x82, 0x82, 0x86, 0xf8, 0x86, 0x82, 0x82, - 0x82, 0xfc, - // 'C' (0x43) 9x10, offset 254-266, at +1/-10 - // in regular row-major format - 0x3e, 0x30, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, - 0x00, 0x40, 0x1f, 0x00, - // 'D' (0x44) 9x10, offset 266-278, at +1/-10 - // in regular row-major format - 0xfc, 0x41, 0x20, 0x50, 0x28, 0x14, 0x0a, 0x05, - 0x02, 0x86, 0x7e, 0x00, - // 'E' (0x45) 7x10, offset 278-287, at +1/-10 - // in regular row-major format - 0xfd, 0x02, 0x04, 0x0f, 0xd0, 0x20, 0x40, 0x81, - 0xf8, - // 'F' (0x46) 7x10, offset 287-296, at +1/-10 - // in regular row-major format - 0xfd, 0x02, 0x04, 0x0f, 0xd0, 0x20, 0x40, 0x81, - 0x00, - // 'G' (0x47) 9x10, offset 296-308, at +1/-10 - // in regular row-major format - 0x1e, 0x30, 0xa0, 0x10, 0x08, 0x04, 0x7a, 0x05, - 0x02, 0x41, 0x1f, 0x80, - // 'H' (0x48) 9x10, offset 308-320, at +1/-10 - // in regular row-major format - 0x81, 0x40, 0xa0, 0x50, 0x2f, 0xf4, 0x0a, 0x05, - 0x02, 0x81, 0x40, 0x80, - // 'I' (0x49) 3x10, offset 320-324, at +1/-10 - // in regular row-major format - 0x92, 0x49, 0x24, 0x90, - // 'J' (0x4a) 4x13, offset 324-331, at -1/-10 - // in regular row-major format - 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0xc0, - // 'K' (0x4b) 8x10, offset 331-341, at +1/-10 - // in regular row-major format - 0x84, 0x84, 0x88, 0x90, 0xa0, 0xd0, 0x88, 0x88, - 0x84, 0x82, - // 'L' (0x4c) 7x10, offset 341-350, at +1/-10 - // in regular row-major format - 0x81, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x81, - 0xf8, - // 'M' (0x4d) 11x10, offset 350-364, at +1/-10 - // in regular row-major format - 0xc0, 0xd8, 0x1a, 0x85, 0x50, 0xaa, 0x15, 0x24, - 0xa4, 0x94, 0x62, 0x8c, 0x51, 0x08, - // 'N' (0x4e) 9x10, offset 364-376, at +1/-10 - // in regular row-major format - 0x81, 0x60, 0xa8, 0x52, 0x29, 0x14, 0x4a, 0x25, - 0x0a, 0x83, 0x40, 0x80, - // 'O' (0x4f) 10x10, offset 376-389, at +1/-10 - // in regular row-major format - 0x3e, 0x10, 0x48, 0x0a, 0x02, 0x80, 0xa0, 0x28, - 0x0a, 0x02, 0x41, 0x0f, 0x80, - // 'P' (0x50) 7x10, offset 389-398, at +1/-10 - // in regular row-major format - 0xf9, 0x0a, 0x14, 0x28, 0x5f, 0x20, 0x40, 0x81, - 0x00, - // 'Q' (0x51) 10x12, offset 398-413, at +1/-10 - // in regular row-major format - 0x3e, 0x10, 0x48, 0x0a, 0x02, 0x80, 0xa0, 0x28, - 0x0a, 0x02, 0x41, 0x0f, 0x80, 0x40, 0x0c, - // 'R' (0x52) 8x10, offset 413-423, at +1/-10 - // in regular row-major format - 0xf8, 0x84, 0x84, 0x84, 0x84, 0xf8, 0x88, 0x88, - 0x84, 0x84, - // 'S' (0x53) 7x10, offset 423-432, at +1/-10 - // in regular row-major format - 0x79, 0x02, 0x04, 0x06, 0x03, 0x01, 0x02, 0x05, - 0xf0, - // 'T' (0x54) 8x10, offset 432-442, at +0/-10 - // in regular row-major format - 0xfe, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, - // 'U' (0x55) 9x10, offset 442-454, at +1/-10 - // in regular row-major format - 0x81, 0x40, 0xa0, 0x50, 0x28, 0x14, 0x0a, 0x05, - 0x02, 0x42, 0x1e, 0x00, - // 'V' (0x56) 9x10, offset 454-466, at +0/-10 - // in regular row-major format - 0x81, 0x40, 0x90, 0x88, 0x42, 0x41, 0x20, 0x90, - 0x30, 0x18, 0x04, 0x00, - // 'W' (0x57) 13x10, offset 466-483, at +0/-10 - // in regular row-major format - 0x84, 0x12, 0x31, 0x11, 0x88, 0x94, 0x44, 0x92, - 0x14, 0xa0, 0xa5, 0x06, 0x18, 0x10, 0x80, 0x84, - 0x00, - // 'X' (0x58) 9x10, offset 483-495, at +0/-10 - // in regular row-major format - 0x41, 0x21, 0x09, 0x03, 0x01, 0x80, 0xc0, 0x90, - 0x48, 0x42, 0x40, 0x80, - // 'Y' (0x59) 8x10, offset 495-505, at +0/-10 - // in regular row-major format - 0x82, 0x44, 0x44, 0x28, 0x28, 0x10, 0x10, 0x10, - 0x10, 0x10, - // 'Z' (0x5a) 7x10, offset 505-514, at +1/-10 - // in regular row-major format - 0xfc, 0x08, 0x20, 0x81, 0x04, 0x10, 0x20, 0x81, - 0xf8, - // '[' (0x5b) 4x12, offset 514-520, at +1/-10 - // in regular row-major format - 0xe8, 0x88, 0x88, 0x88, 0x88, 0x8e, - // '\' (0x5c) 6x10, offset 520-528, at +0/-10 - // in regular row-major format - 0x81, 0x04, 0x10, 0x20, 0x81, 0x04, 0x10, 0x20, - // ']' (0x5d) 4x12, offset 528-534, at +0/-10 - // in regular row-major format - 0xe2, 0x22, 0x22, 0x22, 0x22, 0x2e, - // '^' (0x5e) 7x6, offset 534-540, at +1/-10 - // in regular row-major format - 0x10, 0x61, 0x22, 0x48, 0x50, 0x80, - // '_' (0x5f) 7x1, offset 540-541, at +0/+1 - // in regular row-major format - 0xfc, - // '`' (0x60) 3x2, offset 541-542, at +3/-10 - // in regular row-major format - 0x88, - // 'a' (0x61) 6x8, offset 542-548, at +1/-8 - // in regular row-major format - 0x70, 0x20, 0x9e, 0x8a, 0x29, 0xba, - // 'b' (0x62) 7x11, offset 548-558, at +1/-11 - // in regular row-major format - 0x81, 0x02, 0x05, 0xcc, 0x50, 0xa1, 0x42, 0x85, - 0x8a, 0xe0, - // 'c' (0x63) 6x8, offset 558-564, at +1/-8 - // in regular row-major format - 0x39, 0x08, 0x20, 0x82, 0x0c, 0x1e, - // 'd' (0x64) 7x11, offset 564-574, at +1/-11 - // in regular row-major format - 0x04, 0x08, 0x13, 0xa8, 0xd0, 0xa1, 0x42, 0x85, - 0x19, 0xd0, - // 'e' (0x65) 7x8, offset 574-581, at +1/-8 - // in regular row-major format - 0x79, 0x0a, 0x17, 0xe8, 0x10, 0x30, 0x3c, - // 'f' (0x66) 6x11, offset 581-590, at +0/-11 - // in regular row-major format - 0x39, 0x04, 0x3c, 0x41, 0x04, 0x10, 0x41, 0x04, - 0x00, - // 'g' (0x67) 8x11, offset 590-601, at +0/-8 - // in regular row-major format - 0x3e, 0x44, 0x44, 0x44, 0x38, 0x40, 0x40, 0x7c, - 0x82, 0x82, 0x7c, - // 'h' (0x68) 7x11, offset 601-611, at +1/-11 - // in regular row-major format - 0x81, 0x02, 0x05, 0xcc, 0x50, 0xa1, 0x42, 0x85, - 0x0a, 0x10, - // 'i' (0x69) 2x10, offset 611-614, at +1/-10 - // in regular row-major format - 0x8a, 0xaa, 0xa0, - // 'j' (0x6a) 4x13, offset 614-621, at -1/-10 - // in regular row-major format - 0x20, 0x22, 0x22, 0x22, 0x22, 0x22, 0xc0, - // 'k' (0x6b) 7x11, offset 621-631, at +1/-11 - // in regular row-major format - 0x81, 0x02, 0x04, 0x48, 0x92, 0x28, 0x68, 0x91, - 0x12, 0x10, - // 'l' (0x6c) 2x11, offset 631-634, at +1/-11 - // in regular row-major format - 0xaa, 0xaa, 0xa8, - // 'm' (0x6d) 11x8, offset 634-645, at +1/-8 - // in regular row-major format - 0xbb, 0x99, 0x8a, 0x11, 0x42, 0x28, 0x45, 0x08, - 0xa1, 0x14, 0x22, - // 'n' (0x6e) 7x8, offset 645-652, at +1/-8 - // in regular row-major format - 0xb9, 0x8a, 0x14, 0x28, 0x50, 0xa1, 0x42, - // 'o' (0x6f) 7x8, offset 652-659, at +1/-8 - // in regular row-major format - 0x79, 0x0a, 0x14, 0x28, 0x50, 0xa1, 0x3c, - // 'p' (0x70) 7x11, offset 659-669, at +1/-8 - // in regular row-major format - 0xb9, 0x8a, 0x14, 0x28, 0x50, 0xb1, 0x5c, 0x81, - 0x02, 0x00, - // 'q' (0x71) 7x11, offset 669-679, at +1/-8 - // in regular row-major format - 0x75, 0x1a, 0x14, 0x28, 0x50, 0xa3, 0x3a, 0x04, - 0x08, 0x10, - // 'r' (0x72) 5x8, offset 679-684, at +1/-8 - // in regular row-major format - 0xb6, 0x21, 0x08, 0x42, 0x10, - // 's' (0x73) 6x8, offset 684-690, at +1/-8 - // in regular row-major format - 0x7a, 0x08, 0x18, 0x18, 0x20, 0xbc, - // 't' (0x74) 6x10, offset 690-698, at +0/-10 - // in regular row-major format - 0x01, 0x0f, 0x10, 0x41, 0x04, 0x10, 0x40, 0xe0, - // 'u' (0x75) 7x8, offset 698-705, at +1/-8 - // in regular row-major format - 0x85, 0x0a, 0x14, 0x28, 0x50, 0xa3, 0x3a, - // 'v' (0x76) 7x8, offset 705-712, at +0/-8 - // in regular row-major format - 0x85, 0x09, 0x22, 0x44, 0x86, 0x0c, 0x08, - // 'w' (0x77) 11x8, offset 712-723, at +0/-8 - // in regular row-major format - 0x84, 0x51, 0x89, 0x32, 0x25, 0x45, 0x28, 0xa5, - 0x08, 0xc1, 0x08, - // 'x' (0x78) 8x8, offset 723-731, at +0/-8 - // in regular row-major format - 0x44, 0x44, 0x28, 0x10, 0x10, 0x28, 0x44, 0x44, - // 'y' (0x79) 7x11, offset 731-741, at +0/-8 - // in regular row-major format - 0x85, 0x09, 0x22, 0x44, 0x86, 0x0c, 0x10, 0x20, - 0x43, 0x00, - // 'z' (0x7a) 5x8, offset 741-746, at +1/-8 - // in regular row-major format - 0xf0, 0x88, 0x44, 0x22, 0x1e, - // '{' (0x7b) 6x12, offset 746-755, at +0/-10 - // in regular row-major format - 0x18, 0x82, 0x08, 0x20, 0x8c, 0x08, 0x20, 0x82, - 0x06, - // '|' (0x7c) 3x14, offset 755-761, at +3/-11 - // in regular row-major format - 0x92, 0x49, 0x24, 0x92, 0x49, 0x00, -}; - - -static const uint8_t OpenSansLight16_generic[] = { - // ' ' (0x20) 1x1, offset 0-1, at +0/+0 - // in regular row-major format - 0x00, - // '!' (0x21) 3x12, offset 1-6, at +1/-12 - // in regular row-major format - 0x92, 0x49, 0x24, 0x03, 0x60, - // '"' (0x22) 5x4, offset 6-9, at +1/-12 - // in regular row-major format - 0x94, 0xa5, 0x20, - // '#' (0x23) 11x12, offset 9-26, at +0/-12 - // in regular row-major format - 0x09, 0x01, 0x20, 0x44, 0x08, 0x87, 0xfc, 0x24, - 0x04, 0x87, 0xfc, 0x22, 0x04, 0x40, 0x90, 0x12, - 0x00, - // '$' (0x24) 8x13, offset 26-39, at +1/-12 - // in regular row-major format - 0x10, 0x3c, 0x50, 0x90, 0x90, 0x50, 0x38, 0x1c, - 0x12, 0x12, 0x94, 0x78, 0x10, - // '%' (0x25) 12x12, offset 39-57, at +1/-12 - // in regular row-major format - 0x60, 0x89, 0x10, 0x91, 0x08, 0xa0, 0x92, 0x09, - 0x5c, 0x65, 0x20, 0x92, 0x0a, 0x21, 0x12, 0x11, - 0x22, 0x0c, - // '&' (0x26) 11x12, offset 57-74, at +1/-12 - // in regular row-major format - 0x38, 0x08, 0x81, 0x10, 0x22, 0x02, 0x80, 0x60, - 0x12, 0x24, 0x24, 0x82, 0x90, 0x23, 0x0c, 0x3e, - 0x40, - // ''' (0x27) 2x4, offset 74-75, at +1/-12 - // in regular row-major format - 0xaa, - // '(' (0x28) 4x15, offset 75-83, at +1/-12 - // in regular row-major format - 0x44, 0x88, 0x88, 0x88, 0x88, 0x88, 0x84, 0x40, - // ')' (0x29) 4x15, offset 83-91, at +0/-12 - // in regular row-major format - 0x44, 0x22, 0x22, 0x22, 0x22, 0x22, 0x24, 0x40, - // '*' (0x2a) 8x7, offset 91-98, at +1/-13 - // in regular row-major format - 0x10, 0x10, 0x12, 0xfc, 0x28, 0x28, 0x44, - // '+' (0x2b) 8x7, offset 98-105, at +1/-10 - // in regular row-major format - 0x10, 0x10, 0x10, 0xfe, 0x10, 0x10, 0x10, - // ',' (0x2c) 3x4, offset 105-107, at +0/-2 - // in regular row-major format - 0x49, 0x40, - // '-' (0x2d) 4x1, offset 107-108, at +1/-5 - // in regular row-major format - 0xe0, - // '.' (0x2e) 3x2, offset 108-109, at +1/-2 - // in regular row-major format - 0xd8, - // '/' (0x2f) 6x12, offset 109-118, at +0/-12 - // in regular row-major format - 0x08, 0x41, 0x04, 0x20, 0x82, 0x08, 0x41, 0x04, - 0x20, - // '0' (0x30) 8x12, offset 118-130, at +1/-12 - // in regular row-major format - 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, - 0x82, 0x82, 0x44, 0x38, - // '1' (0x31) 4x12, offset 130-136, at +2/-12 - // in regular row-major format - 0x26, 0xa2, 0x22, 0x22, 0x22, 0x22, - // '2' (0x32) 8x12, offset 136-148, at +1/-12 - // in regular row-major format - 0x78, 0x84, 0x04, 0x04, 0x04, 0x04, 0x08, 0x10, - 0x20, 0x40, 0x80, 0xfe, - // '3' (0x33) 8x12, offset 148-160, at +1/-12 - // in regular row-major format - 0x78, 0x84, 0x02, 0x02, 0x04, 0x78, 0x04, 0x02, - 0x02, 0x02, 0x04, 0xf8, - // '4' (0x34) 10x12, offset 160-175, at +0/-12 - // in regular row-major format - 0x02, 0x01, 0x80, 0xa0, 0x48, 0x12, 0x08, 0x84, - 0x21, 0x08, 0xff, 0x80, 0x80, 0x20, 0x08, - // '5' (0x35) 8x12, offset 175-187, at +1/-12 - // in regular row-major format - 0x7c, 0x40, 0x40, 0x40, 0x80, 0xf8, 0x06, 0x02, - 0x02, 0x02, 0x84, 0x78, - // '6' (0x36) 8x12, offset 187-199, at +1/-12 - // in regular row-major format - 0x1c, 0x60, 0x40, 0x80, 0x80, 0xbc, 0xc2, 0x82, - 0x82, 0x82, 0x46, 0x3c, - // '7' (0x37) 8x12, offset 199-211, at +1/-12 - // in regular row-major format - 0xfe, 0x02, 0x04, 0x04, 0x04, 0x08, 0x08, 0x10, - 0x10, 0x10, 0x20, 0x20, - // '8' (0x38) 8x12, offset 211-223, at +1/-12 - // in regular row-major format - 0x38, 0x44, 0x82, 0x82, 0x4c, 0x30, 0x4c, 0x82, - 0x82, 0x82, 0xc6, 0x7c, - // '9' (0x39) 8x12, offset 223-235, at +1/-12 - // in regular row-major format - 0x78, 0xc4, 0x82, 0x82, 0x82, 0x86, 0x7a, 0x02, - 0x02, 0x04, 0x0c, 0x70, - // ':' (0x3a) 3x9, offset 235-239, at +1/-9 - // in regular row-major format - 0xd8, 0x00, 0x06, 0xc0, - // ';' (0x3b) 3x11, offset 239-244, at +1/-9 - // in regular row-major format - 0xd8, 0x00, 0x04, 0x92, 0x00, - // '<' (0x3c) 8x7, offset 244-251, at +1/-10 - // in regular row-major format - 0x02, 0x0c, 0x30, 0xc0, 0x60, 0x1c, 0x02, - // '=' (0x3d) 8x4, offset 251-255, at +1/-8 - // in regular row-major format - 0xfe, 0x00, 0x00, 0xfe, - // '>' (0x3e) 8x7, offset 255-262, at +1/-10 - // in regular row-major format - 0x80, 0x60, 0x18, 0x06, 0x0c, 0x70, 0x80, - // '?' (0x3f) 7x12, offset 262-273, at +0/-12 - // in regular row-major format - 0x78, 0x08, 0x10, 0x20, 0x41, 0x04, 0x10, 0x20, - 0x00, 0x81, 0x00, - // '@' (0x40) 13x14, offset 273-296, at +1/-12 - // in regular row-major format - 0x0f, 0x81, 0x82, 0x10, 0x08, 0x8f, 0x28, 0x89, - 0x48, 0x4a, 0x42, 0x52, 0x12, 0x91, 0x94, 0x77, - 0x20, 0x00, 0x80, 0x02, 0x00, 0x0f, 0x80, - // 'A' (0x41) 11x12, offset 296-313, at +0/-12 - // in regular row-major format - 0x04, 0x01, 0x80, 0x30, 0x09, 0x01, 0x20, 0x22, - 0x08, 0x41, 0xf8, 0x40, 0x88, 0x11, 0x02, 0x40, - 0x20, - // 'B' (0x42) 8x12, offset 313-325, at +2/-12 - // in regular row-major format - 0xf8, 0x86, 0x82, 0x82, 0x84, 0xf8, 0x86, 0x82, - 0x82, 0x82, 0x86, 0xf8, - // 'C' (0x43) 10x12, offset 325-340, at +1/-12 - // in regular row-major format - 0x1f, 0x08, 0x04, 0x02, 0x00, 0x80, 0x20, 0x08, - 0x02, 0x00, 0x80, 0x10, 0x06, 0x00, 0x7c, - // 'D' (0x44) 9x12, offset 340-354, at +2/-12 - // in regular row-major format - 0xf8, 0x43, 0x20, 0x90, 0x28, 0x14, 0x0a, 0x05, - 0x02, 0x81, 0x41, 0x21, 0x9f, 0x00, - // 'E' (0x45) 7x12, offset 354-365, at +2/-12 - // in regular row-major format - 0xfd, 0x02, 0x04, 0x08, 0x1f, 0xa0, 0x40, 0x81, - 0x02, 0x07, 0xe0, - // 'F' (0x46) 7x12, offset 365-376, at +2/-12 - // in regular row-major format - 0xfd, 0x02, 0x04, 0x08, 0x10, 0x3f, 0x40, 0x81, - 0x02, 0x04, 0x00, - // 'G' (0x47) 11x12, offset 376-393, at +1/-12 - // in regular row-major format - 0x1f, 0x86, 0x01, 0x00, 0x40, 0x08, 0x01, 0x00, - 0x21, 0xf4, 0x02, 0x80, 0x48, 0x08, 0x81, 0x0f, - 0xc0, - // 'H' (0x48) 9x12, offset 393-407, at +2/-12 - // in regular row-major format - 0x81, 0x40, 0xa0, 0x50, 0x28, 0x17, 0xfa, 0x05, - 0x02, 0x81, 0x40, 0xa0, 0x50, 0x20, - // 'I' (0x49) 3x12, offset 407-412, at +1/-12 - // in regular row-major format - 0x49, 0x24, 0x92, 0x49, 0x20, - // 'J' (0x4a) 4x15, offset 412-420, at -1/-12 - // in regular row-major format - 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0xc0, - // 'K' (0x4b) 8x12, offset 420-432, at +2/-12 - // in regular row-major format - 0x84, 0x84, 0x88, 0x90, 0xa0, 0xe0, 0xa0, 0x90, - 0x88, 0x88, 0x84, 0x82, - // 'L' (0x4c) 7x12, offset 432-443, at +2/-12 - // in regular row-major format - 0x81, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x81, - 0x02, 0x07, 0xe0, - // 'M' (0x4d) 11x12, offset 443-460, at +2/-12 - // in regular row-major format - 0x80, 0x50, 0x1b, 0x03, 0x60, 0x6a, 0x15, 0x42, - 0xa8, 0x54, 0x92, 0x92, 0x51, 0x8a, 0x31, 0x44, - 0x20, - // 'N' (0x4e) 9x12, offset 460-474, at +2/-12 - // in regular row-major format - 0x81, 0x40, 0xb0, 0x54, 0x29, 0x14, 0x8a, 0x25, - 0x12, 0x85, 0x41, 0xa0, 0xd0, 0x20, - // 'O' (0x4f) 11x12, offset 474-491, at +1/-12 - // in regular row-major format - 0x1e, 0x0c, 0x31, 0x02, 0x40, 0x28, 0x05, 0x00, - 0xa0, 0x14, 0x02, 0x80, 0x48, 0x11, 0x86, 0x0f, - 0x00, - // 'P' (0x50) 7x12, offset 491-502, at +2/-12 - // in regular row-major format - 0xf9, 0x1a, 0x14, 0x28, 0x51, 0xbc, 0x40, 0x81, - 0x02, 0x04, 0x00, - // 'Q' (0x51) 11x15, offset 502-523, at +1/-12 - // in regular row-major format - 0x1e, 0x0c, 0x31, 0x02, 0x40, 0x28, 0x05, 0x00, - 0xa0, 0x14, 0x02, 0x80, 0x48, 0x11, 0x86, 0x0f, - 0x00, 0x20, 0x02, 0x00, 0x60, - // 'R' (0x52) 9x12, offset 523-537, at +2/-12 - // in regular row-major format - 0xf8, 0x42, 0x20, 0x90, 0x48, 0x24, 0x23, 0xe1, - 0x10, 0x88, 0x42, 0x20, 0x90, 0x40, - // 'S' (0x53) 8x12, offset 537-549, at +1/-12 - // in regular row-major format - 0x3c, 0xc2, 0x80, 0x80, 0xc0, 0x30, 0x0c, 0x02, - 0x02, 0x02, 0x06, 0xfc, - // 'T' (0x54) 9x12, offset 549-563, at +0/-12 - // in regular row-major format - 0xff, 0x04, 0x02, 0x01, 0x00, 0x80, 0x40, 0x20, - 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, - // 'U' (0x55) 9x12, offset 563-577, at +2/-12 - // in regular row-major format - 0x81, 0x40, 0xa0, 0x50, 0x28, 0x14, 0x0a, 0x05, - 0x02, 0x81, 0x40, 0xb0, 0xc7, 0x80, - // 'V' (0x56) 10x12, offset 577-592, at +0/-12 - // in regular row-major format - 0x80, 0xa0, 0x24, 0x11, 0x04, 0x41, 0x08, 0x82, - 0x20, 0x48, 0x14, 0x05, 0x00, 0x80, 0x20, - // 'W' (0x57) 15x12, offset 592-615, at +0/-12 - // in regular row-major format - 0x83, 0x04, 0x86, 0x11, 0x0c, 0x22, 0x28, 0x44, - 0x48, 0x84, 0x92, 0x09, 0x24, 0x14, 0x28, 0x28, - 0x50, 0x30, 0xc0, 0x61, 0x80, 0x81, 0x00, - // 'X' (0x58) 10x12, offset 615-630, at +0/-12 - // in regular row-major format - 0x41, 0x10, 0x42, 0x20, 0x48, 0x14, 0x02, 0x01, - 0x40, 0x50, 0x22, 0x08, 0x84, 0x12, 0x02, - // 'Y' (0x59) 9x12, offset 630-644, at +0/-12 - // in regular row-major format - 0x81, 0x21, 0x10, 0x84, 0x82, 0x40, 0xc0, 0x60, - 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, - // 'Z' (0x5a) 8x12, offset 644-656, at +1/-12 - // in regular row-major format - 0xfe, 0x02, 0x04, 0x04, 0x08, 0x10, 0x10, 0x20, - 0x40, 0x40, 0x80, 0xfe, - // '[' (0x5b) 5x15, offset 656-666, at +1/-12 - // in regular row-major format - 0xf4, 0x21, 0x08, 0x42, 0x10, 0x84, 0x21, 0x08, - 0x43, 0xc0, - // '\' (0x5c) 6x12, offset 666-675, at +0/-12 - // in regular row-major format - 0x81, 0x04, 0x10, 0x20, 0x82, 0x08, 0x10, 0x41, - 0x02, - // ']' (0x5d) 5x15, offset 675-685, at +0/-12 - // in regular row-major format - 0xf0, 0x84, 0x21, 0x08, 0x42, 0x10, 0x84, 0x21, - 0x0b, 0xc0, - // '^' (0x5e) 8x7, offset 685-692, at +1/-12 - // in regular row-major format - 0x10, 0x28, 0x28, 0x44, 0x44, 0x82, 0x82, - // '_' (0x5f) 8x1, offset 692-693, at +0/+1 - // in regular row-major format - 0xfe, - // '`' (0x60) 4x3, offset 693-695, at +3/-13 - // in regular row-major format - 0x84, 0x20, - // 'a' (0x61) 7x9, offset 695-703, at +1/-9 - // in regular row-major format - 0x78, 0x18, 0x10, 0x27, 0xd0, 0xa1, 0x46, 0x74, - // 'b' (0x62) 8x13, offset 703-716, at +2/-13 - // in regular row-major format - 0x00, 0x00, 0x00, 0x00, 0x78, 0x84, 0x82, 0x02, - 0x02, 0x02, 0x82, 0x84, 0x78, - // 'c' (0x63) 7x9, offset 716-724, at +1/-9 - // in regular row-major format - 0x3c, 0x82, 0x04, 0x08, 0x10, 0x20, 0x20, 0x3c, - // 'd' (0x64) 9x13, offset 724-739, at +1/-13 - // in regular row-major format - 0x01, 0x00, 0x80, 0x40, 0x23, 0xd2, 0x1a, 0x0d, - 0x02, 0x81, 0x40, 0xa0, 0xc8, 0x63, 0xd0, - // 'e' (0x65) 8x9, offset 739-748, at +1/-9 - // in regular row-major format - 0x38, 0x44, 0x82, 0x82, 0xfe, 0x80, 0x80, 0x40, - 0x3c, - // 'f' (0x66) 7x13, offset 748-760, at +0/-13 - // in regular row-major format - 0x1c, 0x40, 0x81, 0x0f, 0x84, 0x08, 0x10, 0x20, - 0x40, 0x81, 0x02, 0x00, - // 'g' (0x67) 9x13, offset 760-775, at +0/-9 - // in regular row-major format - 0x3f, 0x22, 0x10, 0x88, 0x44, 0x41, 0xe0, 0x80, - 0x80, 0x3e, 0x20, 0xa0, 0x58, 0x47, 0xc0, - // 'h' (0x68) 8x13, offset 775-788, at +1/-13 - // in regular row-major format - 0x80, 0x80, 0x80, 0x80, 0xbc, 0xc4, 0x82, 0x82, - 0x82, 0x82, 0x82, 0x82, 0x82, - // 'i' (0x69) 2x12, offset 788-791, at +1/-12 - // in regular row-major format - 0xa2, 0xaa, 0xaa, - // 'j' (0x6a) 4x16, offset 791-799, at -1/-12 - // in regular row-major format - 0x22, 0x02, 0x22, 0x22, 0x22, 0x22, 0x22, 0x2e, - // 'k' (0x6b) 8x13, offset 799-812, at +1/-13 - // in regular row-major format - 0x80, 0x80, 0x80, 0x80, 0x84, 0x88, 0x90, 0x90, - 0xb0, 0xd0, 0x88, 0x84, 0x82, - // 'l' (0x6c) 3x13, offset 812-817, at +1/-13 - // in regular row-major format - 0x92, 0x49, 0x24, 0x92, 0x48, - // 'm' (0x6d) 13x9, offset 817-832, at +1/-9 - // in regular row-major format - 0xb9, 0xe6, 0x31, 0x20, 0x85, 0x04, 0x28, 0x21, - 0x41, 0x0a, 0x08, 0x50, 0x42, 0x82, 0x10, - // 'n' (0x6e) 8x9, offset 832-841, at +1/-9 - // in regular row-major format - 0xbc, 0xc4, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, - 0x82, - // 'o' (0x6f) 8x9, offset 841-850, at +1/-9 - // in regular row-major format - 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0x82, 0x44, - 0x38, - // 'p' (0x70) 8x13, offset 850-863, at +2/-9 - // in regular row-major format - 0x78, 0x84, 0x82, 0x02, 0x02, 0x02, 0x82, 0x84, - 0x78, 0x00, 0x00, 0x00, 0x00, - // 'q' (0x71) 9x13, offset 863-878, at +1/-9 - // in regular row-major format - 0x3d, 0x21, 0xa0, 0xd0, 0x28, 0x14, 0x0a, 0x0c, - 0x86, 0x3d, 0x00, 0x80, 0x40, 0x20, 0x10, - // 'r' (0x72) 6x9, offset 878-885, at +1/-9 - // in regular row-major format - 0xbb, 0x08, 0x20, 0x82, 0x08, 0x20, 0x80, - // 's' (0x73) 6x9, offset 885-892, at +1/-9 - // in regular row-major format - 0x7a, 0x08, 0x30, 0x30, 0x20, 0x82, 0xf0, - // 't' (0x74) 6x11, offset 892-901, at +0/-11 - // in regular row-major format - 0x41, 0x0f, 0x10, 0x41, 0x04, 0x10, 0x41, 0x03, - 0x80, - // 'u' (0x75) 8x9, offset 901-910, at +1/-9 - // in regular row-major format - 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x46, - 0x7a, - // 'v' (0x76) 8x9, offset 910-919, at +0/-9 - // in regular row-major format - 0x82, 0x82, 0x44, 0x44, 0x44, 0x28, 0x28, 0x28, - 0x10, - // 'w' (0x77) 13x9, offset 919-934, at +0/-9 - // in regular row-major format - 0x82, 0x12, 0x31, 0x11, 0x88, 0x92, 0x44, 0x92, - 0x14, 0xa0, 0xc3, 0x06, 0x18, 0x10, 0x80, - // 'x' (0x78) 9x9, offset 934-945, at +0/-9 - // in regular row-major format - 0x42, 0x12, 0x09, 0x03, 0x01, 0x80, 0xc0, 0x90, - 0x84, 0x42, 0x00, - // 'y' (0x79) 8x13, offset 945-958, at +0/-9 - // in regular row-major format - 0x82, 0x82, 0x44, 0x44, 0x44, 0x28, 0x28, 0x28, - 0x10, 0x10, 0x20, 0x20, 0xc0, - // 'z' (0x7a) 6x9, offset 958-965, at +1/-9 - // in regular row-major format - 0xf8, 0x21, 0x04, 0x21, 0x04, 0x20, 0xf8, - // '{' (0x7b) 5x15, offset 965-975, at +1/-12 - // in regular row-major format - 0x31, 0x10, 0x84, 0x21, 0x10, 0x42, 0x10, 0x84, - 0x10, 0xc0, - // '|' (0x7c) 2x17, offset 975-980, at +4/-13 - // in regular row-major format - 0xaa, 0xaa, 0xaa, 0xaa, 0x80, -}; - - -const Font FontsRM[] = { - { - "Mono9", - (uint8_t *)FreeMono9pt7b_generic, - (GFXglyph *)FreeMono9pt7bGlyphs, - 0x20, 0x7e, 18 - }, - { - "Mono12", - (uint8_t *)FreeMono12pt7b_generic, - (GFXglyph *)FreeMono12pt7bGlyphs, - 0x20, 0x7e, 24 - }, - { - "Mono18", - (uint8_t *)FreeMono18pt7b_generic, - (GFXglyph *)FreeMono18pt7bGlyphs, - 0x20, 0x7e, 35 - }, - { - "Mono24", - (uint8_t *)FreeMono24pt7b_generic, - (GFXglyph *)FreeMono24pt7bGlyphs, - 0x20, 0x7e, 47 - }, - { - "TomThumb", - (uint8_t *)TomThumb_generic, - (GFXglyph *)TomThumbGlyphs, - 0x20, 0x7e, 6 - }, - { - "Sans9", - (uint8_t *)FreeSans9pt7b_generic, - (GFXglyph *)FreeSans9pt7bGlyphs, - 0x20, 0x7e, 22 - }, - { - "Sans12", - (uint8_t *)FreeSans12pt7b_generic, - (GFXglyph *)FreeSans12pt7bGlyphs, - 0x20, 0x7e, 22 - }, - { - "SansLight10", - (uint8_t *)OpenSansLight10_generic, - (GFXglyph *)OpenSansLight10Glyphs, - 0x20, 0x7d, 14 - }, - { - "SansLight12", - (uint8_t *)OpenSansLight12_generic, - (GFXglyph *)OpenSansLight12Glyphs, - 0x20, 0x7d, 17 - }, - { - "SansLight14", - (uint8_t *)OpenSansLight14_generic, - (GFXglyph *)OpenSansLight14Glyphs, - 0x20, 0x7d, 20 - }, - { - "SansLight16", - (uint8_t *)OpenSansLight16_generic, - (GFXglyph *)OpenSansLight16Glyphs, - 0x20, 0x7d, 23 - }, - { - "Org01", - (uint8_t *)Org_01_generic, - (GFXglyph *)Org_01Glyphs, - 0x20, 0x7e, 7 - }, -}; - - -uint8_t NumFontsRM = sizeof(FontsRM)/sizeof(FontsRM[0]); diff --git a/drv/display/glyphs.c b/drv/display/glyphs.c deleted file mode 100644 index 69b3708..0000000 --- a/drv/display/glyphs.c +++ /dev/null @@ -1,1290 +0,0 @@ -#include "font.h" - -const GFXglyph FreeMono12pt7bGlyphs[] = { - {0, 0, 0, 14, 0, 1}, // 0x20 ' ' - {0, 3, 15, 14, 6, -14}, // 0x21 '!' - {6, 8, 7, 14, 3, -14}, // 0x22 '"' - {13, 10, 16, 14, 2, -14}, // 0x23 '#' - {33, 10, 17, 14, 2, -14}, // 0x24 '$' - {55, 10, 15, 14, 2, -14}, // 0x25 '%' - {74, 9, 12, 14, 3, -11}, // 0x26 '&' - {88, 3, 7, 14, 5, -14}, // 0x27 ''' - {91, 3, 18, 14, 7, -14}, // 0x28 '(' - {98, 3, 18, 14, 4, -14}, // 0x29 ')' - {105, 9, 9, 14, 3, -14}, // 0x2A '*' - {116, 9, 11, 14, 3, -11}, // 0x2B '+' - {129, 5, 7, 14, 3, -3}, // 0x2C ',' - {134, 11, 1, 14, 2, -6}, // 0x2D '-' - {136, 3, 3, 14, 5, -2}, // 0x2E '.' - {138, 9, 18, 14, 3, -15}, // 0x2F '/' - {159, 9, 15, 14, 3, -14}, // 0x30 '0' - {176, 7, 14, 14, 4, -13}, // 0x31 '1' - {189, 9, 15, 14, 2, -14}, // 0x32 '2' - {206, 10, 15, 14, 2, -14}, // 0x33 '3' - {225, 8, 15, 14, 3, -14}, // 0x34 '4' - {240, 9, 15, 14, 3, -14}, // 0x35 '5' - {257, 9, 15, 14, 3, -14}, // 0x36 '6' - {274, 8, 15, 14, 3, -14}, // 0x37 '7' - {289, 9, 15, 14, 3, -14}, // 0x38 '8' - {306, 9, 15, 14, 3, -14}, // 0x39 '9' - {323, 3, 10, 14, 5, -9}, // 0x3A ':' - {327, 5, 13, 14, 3, -9}, // 0x3B ';' - {336, 11, 11, 14, 2, -11}, // 0x3C '<' - {352, 12, 4, 14, 1, -8}, // 0x3D '=' - {358, 11, 11, 14, 2, -11}, // 0x3E '>' - {374, 9, 14, 14, 3, -13}, // 0x3F '?' - {390, 9, 16, 14, 3, -14}, // 0x40 '@' - {408, 14, 14, 14, 0, -13}, // 0x41 'A' - {433, 11, 14, 14, 2, -13}, // 0x42 'B' - {453, 10, 14, 14, 2, -13}, // 0x43 'C' - {471, 10, 14, 14, 2, -13}, // 0x44 'D' - {489, 11, 14, 14, 2, -13}, // 0x45 'E' - {509, 11, 14, 14, 2, -13}, // 0x46 'F' - {529, 11, 14, 14, 2, -13}, // 0x47 'G' - {549, 10, 14, 14, 2, -13}, // 0x48 'H' - {567, 7, 14, 14, 4, -13}, // 0x49 'I' - {580, 11, 14, 14, 2, -13}, // 0x4A 'J' - {600, 12, 14, 14, 2, -13}, // 0x4B 'K' - {621, 11, 14, 14, 2, -13}, // 0x4C 'L' - {641, 13, 14, 14, 1, -13}, // 0x4D 'M' - {664, 12, 14, 14, 1, -13}, // 0x4E 'N' - {685, 12, 14, 14, 1, -13}, // 0x4F 'O' - {706, 10, 14, 14, 2, -13}, // 0x50 'P' - {724, 12, 17, 14, 1, -13}, // 0x51 'Q' - {750, 12, 14, 14, 2, -13}, // 0x52 'R' - {771, 10, 14, 14, 2, -13}, // 0x53 'S' - {789, 11, 14, 14, 2, -13}, // 0x54 'T' - {809, 12, 14, 14, 1, -13}, // 0x55 'U' - {830, 14, 14, 14, 0, -13}, // 0x56 'V' - {855, 14, 14, 14, 0, -13}, // 0x57 'W' - {880, 12, 14, 14, 1, -13}, // 0x58 'X' - {901, 12, 14, 14, 1, -13}, // 0x59 'Y' - {922, 9, 14, 14, 3, -13}, // 0x5A 'Z' - {938, 3, 18, 14, 7, -14}, // 0x5B '[' - {945, 9, 18, 14, 3, -15}, // 0x5C '\' - {966, 3, 18, 14, 5, -14}, // 0x5D ']' - {973, 9, 6, 14, 3, -14}, // 0x5E '^' - {980, 14, 1, 14, 0, 3}, // 0x5F '_' - {982, 4, 4, 14, 4, -15}, // 0x60 '`' - {984, 10, 10, 14, 2, -9}, // 0x61 'a' - {997, 13, 15, 14, 0, -14}, // 0x62 'b' - {1022, 11, 10, 14, 2, -9}, // 0x63 'c' - {1036, 11, 15, 14, 2, -14}, // 0x64 'd' - {1057, 10, 10, 14, 2, -9}, // 0x65 'e' - {1070, 9, 15, 14, 4, -14}, // 0x66 'f' - {1087, 11, 14, 14, 2, -9}, // 0x67 'g' - {1107, 10, 15, 14, 2, -14}, // 0x68 'h' - {1126, 9, 15, 14, 3, -14}, // 0x69 'i' - {1143, 7, 19, 14, 3, -14}, // 0x6A 'j' - {1160, 12, 15, 14, 1, -14}, // 0x6B 'k' - {1183, 9, 15, 14, 3, -14}, // 0x6C 'l' - {1200, 13, 10, 14, 1, -9}, // 0x6D 'm' - {1217, 12, 10, 14, 1, -9}, // 0x6E 'n' - {1232, 11, 10, 14, 2, -9}, // 0x6F 'o' - {1246, 12, 14, 14, 1, -9}, // 0x70 'p' - {1267, 11, 14, 14, 2, -9}, // 0x71 'q' - {1287, 10, 10, 14, 3, -9}, // 0x72 'r' - {1300, 10, 10, 14, 2, -9}, // 0x73 's' - {1313, 11, 14, 14, 1, -13}, // 0x74 't' - {1333, 11, 10, 14, 2, -9}, // 0x75 'u' - {1347, 13, 10, 14, 1, -9}, // 0x76 'v' - {1364, 13, 10, 14, 1, -9}, // 0x77 'w' - {1381, 12, 10, 14, 1, -9}, // 0x78 'x' - {1396, 12, 14, 14, 1, -9}, // 0x79 'y' - {1417, 9, 10, 14, 3, -9}, // 0x7A 'z' - {1429, 5, 18, 14, 5, -14}, // 0x7B '{' - {1441, 1, 18, 14, 7, -14}, // 0x7C '|' - {1444, 5, 18, 14, 5, -14}, // 0x7D '}' - {1456, 10, 3, 14, 2, -7}}; // 0x7E '~' - - -const GFXglyph FreeMono18pt7bGlyphs[] = { - {0, 0, 0, 21, 0, 1}, // 0x20 ' ' - {0, 4, 22, 21, 8, -21}, // 0x21 '!' - {11, 11, 10, 21, 5, -20}, // 0x22 '"' - {25, 14, 24, 21, 3, -21}, // 0x23 '#' - {67, 13, 26, 21, 4, -22}, // 0x24 '$' - {110, 15, 21, 21, 3, -20}, // 0x25 '%' - {150, 12, 18, 21, 4, -17}, // 0x26 '&' - {177, 4, 10, 21, 8, -20}, // 0x27 ''' - {182, 5, 25, 21, 10, -20}, // 0x28 '(' - {198, 5, 25, 21, 6, -20}, // 0x29 ')' - {214, 13, 12, 21, 4, -20}, // 0x2A '*' - {234, 15, 17, 21, 3, -17}, // 0x2B '+' - {266, 7, 10, 21, 5, -4}, // 0x2C ',' - {275, 15, 1, 21, 3, -9}, // 0x2D '-' - {277, 5, 5, 21, 8, -4}, // 0x2E '.' - {281, 13, 26, 21, 4, -22}, // 0x2F '/' - {324, 13, 21, 21, 4, -20}, // 0x30 '0' - {359, 13, 21, 21, 4, -20}, // 0x31 '1' - {394, 13, 21, 21, 3, -20}, // 0x32 '2' - {429, 14, 21, 21, 3, -20}, // 0x33 '3' - {466, 12, 21, 21, 4, -20}, // 0x34 '4' - {498, 14, 21, 21, 3, -20}, // 0x35 '5' - {535, 12, 21, 21, 5, -20}, // 0x36 '6' - {567, 12, 21, 21, 4, -20}, // 0x37 '7' - {599, 13, 21, 21, 4, -20}, // 0x38 '8' - {634, 12, 21, 21, 5, -20}, // 0x39 '9' - {666, 5, 15, 21, 8, -14}, // 0x3A ':' - {676, 7, 20, 21, 5, -14}, // 0x3B ';' - {694, 15, 16, 21, 3, -17}, // 0x3C '<' - {724, 17, 6, 21, 2, -12}, // 0x3D '=' - {737, 15, 16, 21, 3, -17}, // 0x3E '>' - {767, 12, 20, 21, 5, -19}, // 0x3F '?' - {797, 13, 23, 21, 4, -20}, // 0x40 '@' - {835, 21, 20, 21, 0, -19}, // 0x41 'A' - {888, 18, 20, 21, 1, -19}, // 0x42 'B' - {933, 17, 20, 21, 2, -19}, // 0x43 'C' - {976, 16, 20, 21, 2, -19}, // 0x44 'D' - {1016, 17, 20, 21, 1, -19}, // 0x45 'E' - {1059, 17, 20, 21, 1, -19}, // 0x46 'F' - {1102, 17, 20, 21, 2, -19}, // 0x47 'G' - {1145, 16, 20, 21, 2, -19}, // 0x48 'H' - {1185, 13, 20, 21, 4, -19}, // 0x49 'I' - {1218, 17, 20, 21, 3, -19}, // 0x4A 'J' - {1261, 18, 20, 21, 1, -19}, // 0x4B 'K' - {1306, 15, 20, 21, 3, -19}, // 0x4C 'L' - {1344, 19, 20, 21, 1, -19}, // 0x4D 'M' - {1392, 18, 20, 21, 1, -19}, // 0x4E 'N' - {1437, 17, 20, 21, 2, -19}, // 0x4F 'O' - {1480, 16, 20, 21, 1, -19}, // 0x50 'P' - {1520, 17, 24, 21, 2, -19}, // 0x51 'Q' - {1571, 19, 20, 21, 1, -19}, // 0x52 'R' - {1619, 14, 20, 21, 3, -19}, // 0x53 'S' - {1654, 15, 20, 21, 3, -19}, // 0x54 'T' - {1692, 17, 20, 21, 2, -19}, // 0x55 'U' - {1735, 21, 20, 21, 0, -19}, // 0x56 'V' - {1788, 19, 20, 21, 1, -19}, // 0x57 'W' - {1836, 19, 20, 21, 1, -19}, // 0x58 'X' - {1884, 17, 20, 21, 2, -19}, // 0x59 'Y' - {1927, 13, 20, 21, 4, -19}, // 0x5A 'Z' - {1960, 5, 25, 21, 10, -20}, // 0x5B '[' - {1976, 13, 26, 21, 4, -22}, // 0x5C '\' - {2019, 5, 25, 21, 6, -20}, // 0x5D ']' - {2035, 13, 9, 21, 4, -20}, // 0x5E '^' - {2050, 21, 1, 21, 0, 4}, // 0x5F '_' - {2053, 6, 5, 21, 5, -21}, // 0x60 '`' - {2057, 16, 15, 21, 3, -14}, // 0x61 'a' - {2087, 18, 21, 21, 1, -20}, // 0x62 'b' - {2135, 15, 15, 21, 3, -14}, // 0x63 'c' - {2164, 18, 21, 21, 2, -20}, // 0x64 'd' - {2212, 16, 15, 21, 2, -14}, // 0x65 'e' - {2242, 14, 21, 21, 4, -20}, // 0x66 'f' - {2279, 17, 22, 21, 2, -14}, // 0x67 'g' - {2326, 17, 21, 21, 1, -20}, // 0x68 'h' - {2371, 14, 22, 21, 4, -21}, // 0x69 'i' - {2410, 10, 29, 21, 5, -21}, // 0x6A 'j' - {2447, 16, 21, 21, 2, -20}, // 0x6B 'k' - {2489, 14, 21, 21, 4, -20}, // 0x6C 'l' - {2526, 19, 15, 21, 1, -14}, // 0x6D 'm' - {2562, 17, 15, 21, 1, -14}, // 0x6E 'n' - {2594, 15, 15, 21, 3, -14}, // 0x6F 'o' - {2623, 18, 22, 21, 1, -14}, // 0x70 'p' - {2673, 18, 22, 21, 2, -14}, // 0x71 'q' - {2723, 15, 15, 21, 3, -14}, // 0x72 'r' - {2752, 13, 15, 21, 4, -14}, // 0x73 's' - {2777, 16, 20, 21, 1, -19}, // 0x74 't' - {2817, 17, 15, 21, 1, -14}, // 0x75 'u' - {2849, 19, 15, 21, 1, -14}, // 0x76 'v' - {2885, 19, 15, 21, 1, -14}, // 0x77 'w' - {2921, 17, 15, 21, 2, -14}, // 0x78 'x' - {2953, 17, 22, 21, 2, -14}, // 0x79 'y' - {3000, 13, 15, 21, 4, -14}, // 0x7A 'z' - {3025, 8, 25, 21, 6, -20}, // 0x7B '{' - {3050, 1, 25, 21, 10, -20}, // 0x7C '|' - {3054, 8, 25, 21, 7, -20}, // 0x7D '}' - {3079, 15, 5, 21, 3, -11}}; // 0x7E '~' - - -const GFXglyph FreeMono24pt7bGlyphs[] = { - {0, 0, 0, 28, 0, 1}, // 0x20 ' ' - {0, 5, 30, 28, 11, -28}, // 0x21 '!' - {19, 16, 14, 28, 6, -28}, // 0x22 '"' - {47, 19, 32, 28, 4, -29}, // 0x23 '#' - {123, 18, 33, 28, 5, -29}, // 0x24 '$' - {198, 20, 29, 28, 4, -27}, // 0x25 '%' - {271, 18, 25, 28, 5, -23}, // 0x26 '&' - {328, 7, 14, 28, 11, -28}, // 0x27 ''' - {341, 7, 34, 28, 14, -27}, // 0x28 '(' - {371, 7, 34, 28, 8, -27}, // 0x29 ')' - {401, 18, 16, 28, 5, -27}, // 0x2A '*' - {437, 20, 22, 28, 4, -23}, // 0x2B '+' - {492, 9, 14, 28, 6, -6}, // 0x2C ',' - {508, 22, 2, 28, 3, -13}, // 0x2D '-' - {514, 7, 6, 28, 11, -4}, // 0x2E '.' - {520, 18, 35, 28, 5, -30}, // 0x2F '/' - {599, 18, 30, 28, 5, -28}, // 0x30 '0' - {667, 16, 29, 28, 6, -28}, // 0x31 '1' - {725, 18, 29, 28, 5, -28}, // 0x32 '2' - {791, 19, 30, 28, 5, -28}, // 0x33 '3' - {863, 16, 28, 28, 6, -27}, // 0x34 '4' - {919, 19, 29, 28, 5, -27}, // 0x35 '5' - {988, 18, 30, 28, 6, -28}, // 0x36 '6' - {1056, 18, 28, 28, 5, -27}, // 0x37 '7' - {1119, 18, 30, 28, 5, -28}, // 0x38 '8' - {1187, 18, 30, 28, 6, -28}, // 0x39 '9' - {1255, 7, 21, 28, 11, -19}, // 0x3A ':' - {1274, 10, 27, 28, 7, -19}, // 0x3B ';' - {1308, 22, 22, 28, 3, -23}, // 0x3C '<' - {1369, 24, 9, 28, 2, -17}, // 0x3D '=' - {1396, 21, 22, 28, 4, -23}, // 0x3E '>' - {1454, 17, 28, 28, 6, -26}, // 0x3F '?' - {1514, 18, 32, 28, 5, -28}, // 0x40 '@' - {1586, 28, 26, 28, 0, -25}, // 0x41 'A' - {1677, 22, 26, 28, 3, -25}, // 0x42 'B' - {1749, 22, 28, 28, 3, -26}, // 0x43 'C' - {1826, 22, 26, 28, 3, -25}, // 0x44 'D' - {1898, 22, 26, 28, 3, -25}, // 0x45 'E' - {1970, 22, 26, 28, 3, -25}, // 0x46 'F' - {2042, 23, 28, 28, 3, -26}, // 0x47 'G' - {2123, 23, 26, 28, 3, -25}, // 0x48 'H' - {2198, 16, 26, 28, 6, -25}, // 0x49 'I' - {2250, 23, 27, 28, 4, -25}, // 0x4A 'J' - {2328, 24, 26, 28, 3, -25}, // 0x4B 'K' - {2406, 21, 26, 28, 4, -25}, // 0x4C 'L' - {2475, 26, 26, 28, 1, -25}, // 0x4D 'M' - {2560, 24, 26, 28, 2, -25}, // 0x4E 'N' - {2638, 24, 28, 28, 2, -26}, // 0x4F 'O' - {2722, 21, 26, 28, 3, -25}, // 0x50 'P' - {2791, 24, 32, 28, 2, -26}, // 0x51 'Q' - {2887, 24, 26, 28, 3, -25}, // 0x52 'R' - {2965, 20, 28, 28, 4, -26}, // 0x53 'S' - {3035, 22, 26, 28, 3, -25}, // 0x54 'T' - {3107, 23, 27, 28, 3, -25}, // 0x55 'U' - {3185, 28, 26, 28, 0, -25}, // 0x56 'V' - {3276, 26, 26, 28, 1, -25}, // 0x57 'W' - {3361, 24, 26, 28, 2, -25}, // 0x58 'X' - {3439, 24, 26, 28, 2, -25}, // 0x59 'Y' - {3517, 18, 26, 28, 5, -25}, // 0x5A 'Z' - {3576, 7, 34, 28, 13, -27}, // 0x5B '[' - {3606, 18, 35, 28, 5, -30}, // 0x5C '\' - {3685, 7, 34, 28, 8, -27}, // 0x5D ']' - {3715, 18, 12, 28, 5, -28}, // 0x5E '^' - {3742, 28, 2, 28, 0, 5}, // 0x5F '_' - {3749, 8, 7, 28, 7, -29}, // 0x60 '`' - {3756, 22, 22, 28, 3, -20}, // 0x61 'a' - {3817, 23, 29, 28, 2, -27}, // 0x62 'b' - {3901, 21, 22, 28, 4, -20}, // 0x63 'c' - {3959, 24, 29, 28, 3, -27}, // 0x64 'd' - {4046, 21, 22, 28, 3, -20}, // 0x65 'e' - {4104, 19, 28, 28, 6, -27}, // 0x66 'f' - {4171, 23, 30, 28, 3, -20}, // 0x67 'g' - {4258, 23, 28, 28, 3, -27}, // 0x68 'h' - {4339, 18, 29, 28, 5, -28}, // 0x69 'i' - {4405, 14, 38, 28, 6, -28}, // 0x6A 'j' - {4472, 22, 28, 28, 4, -27}, // 0x6B 'k' - {4549, 18, 28, 28, 5, -27}, // 0x6C 'l' - {4612, 28, 21, 28, 0, -20}, // 0x6D 'm' - {4686, 23, 21, 28, 2, -20}, // 0x6E 'n' - {4747, 22, 22, 28, 3, -20}, // 0x6F 'o' - {4808, 23, 30, 28, 2, -20}, // 0x70 'p' - {4895, 24, 30, 28, 3, -20}, // 0x71 'q' - {4985, 21, 20, 28, 5, -19}, // 0x72 'r' - {5038, 18, 22, 28, 5, -20}, // 0x73 's' - {5088, 21, 27, 28, 3, -25}, // 0x74 't' - {5159, 23, 21, 28, 3, -19}, // 0x75 'u' - {5220, 26, 20, 28, 1, -19}, // 0x76 'v' - {5285, 26, 20, 28, 1, -19}, // 0x77 'w' - {5350, 24, 20, 28, 2, -19}, // 0x78 'x' - {5410, 24, 29, 28, 2, -19}, // 0x79 'y' - {5497, 17, 20, 28, 6, -19}, // 0x7A 'z' - {5540, 11, 34, 28, 8, -27}, // 0x7B '{' - {5587, 2, 34, 28, 13, -27}, // 0x7C '|' - {5596, 11, 34, 28, 9, -27}, // 0x7D '}' - {5643, 20, 6, 28, 4, -15}}; // 0x7E '~' - - -const GFXglyph FreeMono9pt7bGlyphs[] = { - {0, 0, 0, 11, 0, 1}, // 0x20 ' ' - {0, 2, 11, 11, 4, -10}, // 0x21 '!' - {3, 6, 5, 11, 2, -10}, // 0x22 '"' - {7, 7, 12, 11, 2, -10}, // 0x23 '#' - {18, 8, 12, 11, 1, -10}, // 0x24 '$' - {30, 7, 11, 11, 2, -10}, // 0x25 '%' - {40, 7, 10, 11, 2, -9}, // 0x26 '&' - {49, 3, 5, 11, 4, -10}, // 0x27 ''' - {51, 2, 13, 11, 5, -10}, // 0x28 '(' - {55, 2, 13, 11, 4, -10}, // 0x29 ')' - {59, 7, 7, 11, 2, -10}, // 0x2A '*' - {66, 7, 7, 11, 2, -8}, // 0x2B '+' - {73, 3, 5, 11, 2, -1}, // 0x2C ',' - {75, 9, 1, 11, 1, -5}, // 0x2D '-' - {77, 2, 2, 11, 4, -1}, // 0x2E '.' - {78, 7, 13, 11, 2, -11}, // 0x2F '/' - {90, 7, 11, 11, 2, -10}, // 0x30 '0' - {100, 5, 11, 11, 3, -10}, // 0x31 '1' - {107, 7, 11, 11, 2, -10}, // 0x32 '2' - {117, 8, 11, 11, 1, -10}, // 0x33 '3' - {128, 6, 11, 11, 3, -10}, // 0x34 '4' - {137, 7, 11, 11, 2, -10}, // 0x35 '5' - {147, 7, 11, 11, 2, -10}, // 0x36 '6' - {157, 7, 11, 11, 2, -10}, // 0x37 '7' - {167, 7, 11, 11, 2, -10}, // 0x38 '8' - {177, 7, 11, 11, 2, -10}, // 0x39 '9' - {187, 2, 8, 11, 4, -7}, // 0x3A ':' - {189, 3, 11, 11, 3, -7}, // 0x3B ';' - {194, 8, 8, 11, 1, -8}, // 0x3C '<' - {202, 9, 4, 11, 1, -6}, // 0x3D '=' - {207, 9, 8, 11, 1, -8}, // 0x3E '>' - {216, 7, 10, 11, 2, -9}, // 0x3F '?' - {225, 8, 12, 11, 2, -10}, // 0x40 '@' - {237, 11, 10, 11, 0, -9}, // 0x41 'A' - {251, 9, 10, 11, 1, -9}, // 0x42 'B' - {263, 9, 10, 11, 1, -9}, // 0x43 'C' - {275, 9, 10, 11, 1, -9}, // 0x44 'D' - {287, 9, 10, 11, 1, -9}, // 0x45 'E' - {299, 9, 10, 11, 1, -9}, // 0x46 'F' - {311, 10, 10, 11, 1, -9}, // 0x47 'G' - {324, 9, 10, 11, 1, -9}, // 0x48 'H' - {336, 5, 10, 11, 3, -9}, // 0x49 'I' - {343, 8, 10, 11, 2, -9}, // 0x4A 'J' - {353, 9, 10, 11, 1, -9}, // 0x4B 'K' - {365, 8, 10, 11, 2, -9}, // 0x4C 'L' - {375, 11, 10, 11, 0, -9}, // 0x4D 'M' - {389, 9, 10, 11, 1, -9}, // 0x4E 'N' - {401, 9, 10, 11, 1, -9}, // 0x4F 'O' - {413, 8, 10, 11, 1, -9}, // 0x50 'P' - {423, 9, 13, 11, 1, -9}, // 0x51 'Q' - {438, 9, 10, 11, 1, -9}, // 0x52 'R' - {450, 7, 10, 11, 2, -9}, // 0x53 'S' - {459, 9, 10, 11, 1, -9}, // 0x54 'T' - {471, 9, 10, 11, 1, -9}, // 0x55 'U' - {483, 11, 10, 11, 0, -9}, // 0x56 'V' - {497, 11, 10, 11, 0, -9}, // 0x57 'W' - {511, 9, 10, 11, 1, -9}, // 0x58 'X' - {523, 9, 10, 11, 1, -9}, // 0x59 'Y' - {535, 7, 10, 11, 2, -9}, // 0x5A 'Z' - {544, 2, 13, 11, 5, -10}, // 0x5B '[' - {548, 7, 13, 11, 2, -11}, // 0x5C '\' - {560, 2, 13, 11, 4, -10}, // 0x5D ']' - {564, 7, 5, 11, 2, -10}, // 0x5E '^' - {569, 11, 1, 11, 0, 2}, // 0x5F '_' - {571, 3, 3, 11, 3, -11}, // 0x60 '`' - {573, 9, 8, 11, 1, -7}, // 0x61 'a' - {582, 9, 11, 11, 1, -10}, // 0x62 'b' - {595, 7, 8, 11, 2, -7}, // 0x63 'c' - {602, 9, 11, 11, 1, -10}, // 0x64 'd' - {615, 8, 8, 11, 1, -7}, // 0x65 'e' - {623, 6, 11, 11, 3, -10}, // 0x66 'f' - {632, 9, 11, 11, 1, -7}, // 0x67 'g' - {645, 9, 11, 11, 1, -10}, // 0x68 'h' - {658, 7, 10, 11, 2, -9}, // 0x69 'i' - {667, 5, 13, 11, 3, -9}, // 0x6A 'j' - {676, 8, 11, 11, 2, -10}, // 0x6B 'k' - {687, 7, 11, 11, 2, -10}, // 0x6C 'l' - {697, 9, 8, 11, 1, -7}, // 0x6D 'm' - {706, 9, 8, 11, 1, -7}, // 0x6E 'n' - {715, 9, 8, 11, 1, -7}, // 0x6F 'o' - {724, 9, 11, 11, 1, -7}, // 0x70 'p' - {737, 9, 11, 11, 1, -7}, // 0x71 'q' - {750, 7, 8, 11, 3, -7}, // 0x72 'r' - {757, 7, 8, 11, 2, -7}, // 0x73 's' - {764, 8, 10, 11, 2, -9}, // 0x74 't' - {774, 8, 8, 11, 1, -7}, // 0x75 'u' - {782, 9, 8, 11, 1, -7}, // 0x76 'v' - {791, 9, 8, 11, 1, -7}, // 0x77 'w' - {800, 9, 8, 11, 1, -7}, // 0x78 'x' - {809, 9, 11, 11, 1, -7}, // 0x79 'y' - {822, 7, 8, 11, 2, -7}, // 0x7A 'z' - {829, 3, 13, 11, 4, -10}, // 0x7B '{' - {834, 1, 13, 11, 5, -10}, // 0x7C '|' - {836, 3, 13, 11, 4, -10}, // 0x7D '}' - {841, 7, 3, 11, 2, -6}}; // 0x7E '~' - - -const GFXglyph FreeSans12pt7bGlyphs[] = { - {0, 0, 0, 6, 0, 1}, // 0x20 ' ' - {0, 2, 18, 8, 3, -17}, // 0x21 '!' - {5, 6, 6, 8, 1, -16}, // 0x22 '"' - {10, 13, 16, 13, 0, -15}, // 0x23 '#' - {36, 11, 20, 13, 1, -17}, // 0x24 '$' - {64, 20, 17, 21, 1, -16}, // 0x25 '%' - {107, 14, 17, 16, 1, -16}, // 0x26 '&' - {137, 2, 6, 5, 1, -16}, // 0x27 ''' - {139, 5, 23, 8, 2, -17}, // 0x28 '(' - {154, 5, 23, 8, 1, -17}, // 0x29 ')' - {169, 7, 7, 9, 1, -17}, // 0x2A '*' - {176, 10, 11, 14, 2, -10}, // 0x2B '+' - {190, 2, 6, 7, 2, -1}, // 0x2C ',' - {192, 6, 2, 8, 1, -7}, // 0x2D '-' - {194, 2, 2, 6, 2, -1}, // 0x2E '.' - {195, 7, 18, 7, 0, -17}, // 0x2F '/' - {211, 11, 17, 13, 1, -16}, // 0x30 '0' - {235, 5, 17, 13, 3, -16}, // 0x31 '1' - {246, 11, 17, 13, 1, -16}, // 0x32 '2' - {270, 11, 17, 13, 1, -16}, // 0x33 '3' - {294, 11, 17, 13, 1, -16}, // 0x34 '4' - {318, 11, 17, 13, 1, -16}, // 0x35 '5' - {342, 11, 17, 13, 1, -16}, // 0x36 '6' - {366, 11, 17, 13, 1, -16}, // 0x37 '7' - {390, 11, 17, 13, 1, -16}, // 0x38 '8' - {414, 11, 17, 13, 1, -16}, // 0x39 '9' - {438, 2, 13, 6, 2, -12}, // 0x3A ':' - {442, 2, 16, 6, 2, -11}, // 0x3B ';' - {446, 12, 12, 14, 1, -11}, // 0x3C '<' - {464, 12, 6, 14, 1, -8}, // 0x3D '=' - {473, 12, 12, 14, 1, -11}, // 0x3E '>' - {491, 10, 18, 13, 2, -17}, // 0x3F '?' - {514, 22, 21, 24, 1, -17}, // 0x40 '@' - {572, 16, 18, 16, 0, -17}, // 0x41 'A' - {608, 13, 18, 16, 2, -17}, // 0x42 'B' - {638, 15, 18, 17, 1, -17}, // 0x43 'C' - {672, 14, 18, 17, 2, -17}, // 0x44 'D' - {704, 12, 18, 15, 2, -17}, // 0x45 'E' - {731, 11, 18, 14, 2, -17}, // 0x46 'F' - {756, 16, 18, 18, 1, -17}, // 0x47 'G' - {792, 13, 18, 17, 2, -17}, // 0x48 'H' - {822, 2, 18, 7, 2, -17}, // 0x49 'I' - {827, 9, 18, 13, 1, -17}, // 0x4A 'J' - {848, 14, 18, 16, 2, -17}, // 0x4B 'K' - {880, 10, 18, 14, 2, -17}, // 0x4C 'L' - {903, 16, 18, 20, 2, -17}, // 0x4D 'M' - {939, 13, 18, 18, 2, -17}, // 0x4E 'N' - {969, 17, 18, 19, 1, -17}, // 0x4F 'O' - {1008, 12, 18, 16, 2, -17}, // 0x50 'P' - {1035, 17, 19, 19, 1, -17}, // 0x51 'Q' - {1076, 14, 18, 17, 2, -17}, // 0x52 'R' - {1108, 14, 18, 16, 1, -17}, // 0x53 'S' - {1140, 12, 18, 15, 1, -17}, // 0x54 'T' - {1167, 13, 18, 17, 2, -17}, // 0x55 'U' - {1197, 15, 18, 15, 0, -17}, // 0x56 'V' - {1231, 22, 18, 22, 0, -17}, // 0x57 'W' - {1281, 15, 18, 16, 0, -17}, // 0x58 'X' - {1315, 16, 18, 16, 0, -17}, // 0x59 'Y' - {1351, 13, 18, 15, 1, -17}, // 0x5A 'Z' - {1381, 4, 23, 7, 2, -17}, // 0x5B '[' - {1393, 7, 18, 7, 0, -17}, // 0x5C '\' - {1409, 4, 23, 7, 1, -17}, // 0x5D ']' - {1421, 9, 9, 11, 1, -16}, // 0x5E '^' - {1432, 15, 1, 13, -1, 4}, // 0x5F '_' - {1434, 5, 4, 6, 1, -17}, // 0x60 '`' - {1437, 12, 13, 13, 1, -12}, // 0x61 'a' - {1457, 12, 18, 13, 1, -17}, // 0x62 'b' - {1484, 10, 13, 12, 1, -12}, // 0x63 'c' - {1501, 11, 18, 13, 1, -17}, // 0x64 'd' - {1526, 11, 13, 13, 1, -12}, // 0x65 'e' - {1544, 5, 18, 7, 1, -17}, // 0x66 'f' - {1556, 11, 18, 13, 1, -12}, // 0x67 'g' - {1581, 10, 18, 13, 1, -17}, // 0x68 'h' - {1604, 2, 18, 5, 2, -17}, // 0x69 'i' - {1609, 4, 23, 6, 0, -17}, // 0x6A 'j' - {1621, 11, 18, 12, 1, -17}, // 0x6B 'k' - {1646, 2, 18, 5, 1, -17}, // 0x6C 'l' - {1651, 17, 13, 19, 1, -12}, // 0x6D 'm' - {1679, 10, 13, 13, 1, -12}, // 0x6E 'n' - {1696, 11, 13, 13, 1, -12}, // 0x6F 'o' - {1714, 12, 17, 13, 1, -12}, // 0x70 'p' - {1740, 11, 17, 13, 1, -12}, // 0x71 'q' - {1764, 6, 13, 8, 1, -12}, // 0x72 'r' - {1774, 10, 13, 12, 1, -12}, // 0x73 's' - {1791, 5, 16, 7, 1, -15}, // 0x74 't' - {1801, 10, 13, 13, 1, -12}, // 0x75 'u' - {1818, 12, 13, 12, 0, -12}, // 0x76 'v' - {1838, 17, 13, 17, 0, -12}, // 0x77 'w' - {1866, 11, 13, 11, 0, -12}, // 0x78 'x' - {1884, 11, 18, 11, 0, -12}, // 0x79 'y' - {1909, 10, 13, 12, 1, -12}, // 0x7A 'z' - {1926, 5, 23, 8, 1, -17}, // 0x7B '{' - {1941, 2, 23, 6, 2, -17}, // 0x7C '|' - {1947, 5, 23, 8, 2, -17}, // 0x7D '}' - {1962, 10, 5, 12, 1, -10}}; // 0x7E '~' - - -const GFXglyph FreeSans9pt7bGlyphs[] = { - {0, 0, 0, 5, 0, 1}, // 0x20 ' ' - {0, 2, 13, 6, 2, -12}, // 0x21 '!' - {4, 5, 4, 6, 1, -12}, // 0x22 '"' - {7, 10, 12, 10, 0, -11}, // 0x23 '#' - {22, 9, 16, 10, 1, -13}, // 0x24 '$' - {40, 16, 13, 16, 1, -12}, // 0x25 '%' - {66, 11, 13, 12, 1, -12}, // 0x26 '&' - {84, 2, 4, 4, 1, -12}, // 0x27 ''' - {85, 4, 17, 6, 1, -12}, // 0x28 '(' - {94, 4, 17, 6, 1, -12}, // 0x29 ')' - {103, 5, 5, 7, 1, -12}, // 0x2A '*' - {107, 6, 8, 11, 3, -7}, // 0x2B '+' - {113, 2, 4, 5, 2, 0}, // 0x2C ',' - {114, 4, 1, 6, 1, -4}, // 0x2D '-' - {115, 2, 1, 5, 1, 0}, // 0x2E '.' - {116, 5, 13, 5, 0, -12}, // 0x2F '/' - {125, 8, 13, 10, 1, -12}, // 0x30 '0' - {138, 4, 13, 10, 3, -12}, // 0x31 '1' - {145, 9, 13, 10, 1, -12}, // 0x32 '2' - {160, 8, 13, 10, 1, -12}, // 0x33 '3' - {173, 7, 13, 10, 2, -12}, // 0x34 '4' - {185, 9, 13, 10, 1, -12}, // 0x35 '5' - {200, 9, 13, 10, 1, -12}, // 0x36 '6' - {215, 8, 13, 10, 0, -12}, // 0x37 '7' - {228, 9, 13, 10, 1, -12}, // 0x38 '8' - {243, 8, 13, 10, 1, -12}, // 0x39 '9' - {256, 2, 10, 5, 1, -9}, // 0x3A ':' - {259, 3, 12, 5, 1, -8}, // 0x3B ';' - {264, 9, 9, 11, 1, -8}, // 0x3C '<' - {275, 9, 4, 11, 1, -5}, // 0x3D '=' - {280, 9, 9, 11, 1, -8}, // 0x3E '>' - {291, 9, 13, 10, 1, -12}, // 0x3F '?' - {306, 17, 16, 18, 1, -12}, // 0x40 '@' - {340, 12, 13, 12, 0, -12}, // 0x41 'A' - {360, 11, 13, 12, 1, -12}, // 0x42 'B' - {378, 11, 13, 13, 1, -12}, // 0x43 'C' - {396, 11, 13, 13, 1, -12}, // 0x44 'D' - {414, 9, 13, 11, 1, -12}, // 0x45 'E' - {429, 8, 13, 11, 1, -12}, // 0x46 'F' - {442, 12, 13, 14, 1, -12}, // 0x47 'G' - {462, 11, 13, 13, 1, -12}, // 0x48 'H' - {480, 2, 13, 5, 2, -12}, // 0x49 'I' - {484, 7, 13, 10, 1, -12}, // 0x4A 'J' - {496, 11, 13, 12, 1, -12}, // 0x4B 'K' - {514, 8, 13, 10, 1, -12}, // 0x4C 'L' - {527, 13, 13, 15, 1, -12}, // 0x4D 'M' - {549, 11, 13, 13, 1, -12}, // 0x4E 'N' - {567, 13, 13, 14, 1, -12}, // 0x4F 'O' - {589, 10, 13, 12, 1, -12}, // 0x50 'P' - {606, 13, 14, 14, 1, -12}, // 0x51 'Q' - {629, 12, 13, 13, 1, -12}, // 0x52 'R' - {649, 10, 13, 12, 1, -12}, // 0x53 'S' - {666, 9, 13, 11, 1, -12}, // 0x54 'T' - {681, 11, 13, 13, 1, -12}, // 0x55 'U' - {699, 11, 13, 12, 0, -12}, // 0x56 'V' - {717, 17, 13, 17, 0, -12}, // 0x57 'W' - {745, 12, 13, 12, 0, -12}, // 0x58 'X' - {765, 12, 13, 12, 0, -12}, // 0x59 'Y' - {785, 10, 13, 11, 1, -12}, // 0x5A 'Z' - {802, 3, 17, 5, 1, -12}, // 0x5B '[' - {809, 5, 13, 5, 0, -12}, // 0x5C '\' - {818, 3, 17, 5, 0, -12}, // 0x5D ']' - {825, 7, 7, 8, 1, -12}, // 0x5E '^' - {832, 10, 1, 10, 0, 3}, // 0x5F '_' - {834, 4, 3, 5, 0, -12}, // 0x60 '`' - {836, 9, 10, 10, 1, -9}, // 0x61 'a' - {848, 9, 13, 10, 1, -12}, // 0x62 'b' - {863, 8, 10, 9, 1, -9}, // 0x63 'c' - {873, 8, 13, 10, 1, -12}, // 0x64 'd' - {886, 8, 10, 10, 1, -9}, // 0x65 'e' - {896, 4, 13, 5, 1, -12}, // 0x66 'f' - {903, 8, 14, 10, 1, -9}, // 0x67 'g' - {917, 8, 13, 10, 1, -12}, // 0x68 'h' - {930, 2, 13, 4, 1, -12}, // 0x69 'i' - {934, 4, 17, 4, 0, -12}, // 0x6A 'j' - {943, 9, 13, 9, 1, -12}, // 0x6B 'k' - {958, 2, 13, 4, 1, -12}, // 0x6C 'l' - {962, 13, 10, 15, 1, -9}, // 0x6D 'm' - {979, 8, 10, 10, 1, -9}, // 0x6E 'n' - {989, 8, 10, 10, 1, -9}, // 0x6F 'o' - {999, 9, 13, 10, 1, -9}, // 0x70 'p' - {1014, 8, 13, 10, 1, -9}, // 0x71 'q' - {1027, 5, 10, 6, 1, -9}, // 0x72 'r' - {1034, 8, 10, 9, 1, -9}, // 0x73 's' - {1044, 4, 12, 5, 1, -11}, // 0x74 't' - {1050, 8, 10, 10, 1, -9}, // 0x75 'u' - {1060, 9, 10, 9, 0, -9}, // 0x76 'v' - {1072, 13, 10, 13, 0, -9}, // 0x77 'w' - {1089, 8, 10, 9, 0, -9}, // 0x78 'x' - {1099, 9, 14, 9, 0, -9}, // 0x79 'y' - {1115, 7, 10, 9, 1, -9}, // 0x7A 'z' - {1124, 4, 17, 6, 1, -12}, // 0x7B '{' - {1133, 2, 17, 4, 2, -12}, // 0x7C '|' - {1138, 4, 17, 6, 1, -12}, // 0x7D '}' - {1147, 7, 3, 9, 1, -7}}; // 0x7E '~' - -const GFXglyph OpenSansLight10Glyphs[] = { -// bitmapOffset, width, height, xAdvance, xOffset, yOffset - { 0, 1, 1, 4, 0, 0 }, // ' ' - { 1, 3, 7, 3, 0, -7 }, // '!' - { 4, 3, 3, 5, 1, -7 }, // '"' - { 6, 7, 7, 7, 0, -7 }, // '#' - { 13, 5, 9, 7, 1, -8 }, // '$' - { 19, 7, 7, 9, 1, -7 }, // '%' - { 26, 7, 7, 8, 1, -7 }, // '&' - { 33, 3, 3, 3, 0, -7 }, // ''' - { 35, 4, 9, 4, 0, -7 }, // '(' - { 40, 4, 9, 4, 0, -7 }, // ')' - { 45, 5, 4, 7, 1, -7 }, // '*' - { 48, 5, 5, 7, 1, -6 }, // '+' - { 52, 2, 2, 3, 0, -1 }, // ',' - { 53, 4, 1, 4, 0, -3 }, // '-' - { 54, 3, 1, 3, 0, -1 }, // '.' - { 55, 4, 7, 4, 0, -7 }, // '/' - { 59, 5, 7, 7, 1, -7 }, // '0' - { 64, 3, 7, 7, 1, -7 }, // '1' - { 67, 5, 7, 7, 1, -7 }, // '2' - { 72, 6, 7, 7, 0, -7 }, // '3' - { 78, 7, 7, 7, 0, -7 }, // '4' - { 85, 5, 7, 7, 1, -7 }, // '5' - { 90, 5, 7, 7, 1, -7 }, // '6' - { 95, 5, 7, 7, 1, -7 }, // '7' - { 100, 5, 7, 7, 1, -7 }, // '8' - { 105, 5, 7, 7, 1, -7 }, // '9' - { 110, 3, 5, 3, 0, -5 }, // ':' - { 112, 2, 6, 3, 0, -5 }, // ';' - { 114, 5, 5, 7, 1, -6 }, // '<' - { 118, 5, 3, 7, 1, -5 }, // '=' - { 120, 5, 5, 7, 1, -6 }, // '>' - { 124, 5, 7, 5, 0, -7 }, // '?' - { 129, 8, 8, 10, 1, -7 }, // '@' - { 137, 7, 7, 7, 0, -7 }, // 'A' - { 144, 5, 7, 7, 1, -7 }, // 'B' - { 149, 6, 7, 7, 1, -7 }, // 'C' - { 155, 6, 7, 8, 1, -7 }, // 'D' - { 161, 5, 7, 7, 1, -7 }, // 'E' - { 166, 5, 7, 6, 1, -7 }, // 'F' - { 171, 6, 7, 8, 1, -7 }, // 'G' - { 177, 6, 7, 8, 1, -7 }, // 'H' - { 183, 2, 7, 4, 1, -7 }, // 'I' - { 185, 3, 9, 3, -1, -7 }, // 'J' - { 189, 6, 7, 7, 1, -7 }, // 'K' - { 195, 5, 7, 6, 1, -7 }, // 'L' - { 200, 8, 7, 10, 1, -7 }, // 'M' - { 207, 6, 7, 8, 1, -7 }, // 'N' - { 213, 7, 7, 9, 1, -7 }, // 'O' - { 220, 5, 7, 7, 1, -7 }, // 'P' - { 225, 7, 9, 9, 1, -7 }, // 'Q' - { 233, 6, 7, 7, 1, -7 }, // 'R' - { 239, 5, 7, 6, 1, -7 }, // 'S' - { 244, 6, 7, 6, 0, -7 }, // 'T' - { 250, 6, 7, 8, 1, -7 }, // 'U' - { 256, 7, 7, 7, 0, -7 }, // 'V' - { 263, 10, 7, 10, 0, -7 }, // 'W' - { 272, 6, 7, 6, 0, -7 }, // 'X' - { 278, 6, 7, 6, 0, -7 }, // 'Y' - { 284, 7, 7, 7, 0, -7 }, // 'Z' - { 291, 3, 9, 4, 1, -7 }, // '[' - { 295, 4, 7, 4, 0, -7 }, // '\' - { 299, 3, 9, 4, 0, -7 }, // ']' - { 303, 7, 4, 7, 0, -7 }, // '^' - { 307, 5, 1, 5, 0, 1 }, // '_' - { 308, 3, 2, 7, 2, -8 }, // '`' - { 309, 5, 5, 6, 0, -5 }, // 'a' - { 313, 5, 7, 7, 1, -7 }, // 'b' - { 318, 5, 5, 6, 1, -5 }, // 'c' - { 322, 5, 7, 7, 1, -7 }, // 'd' - { 327, 4, 5, 6, 1, -5 }, // 'e' - { 330, 5, 7, 4, 0, -7 }, // 'f' - { 335, 6, 7, 6, 0, -5 }, // 'g' - { 341, 5, 7, 7, 1, -7 }, // 'h' - { 346, 3, 7, 3, 0, -7 }, // 'i' - { 349, 3, 9, 3, -1, -7 }, // 'j' - { 353, 5, 7, 6, 1, -7 }, // 'k' - { 358, 3, 7, 3, 0, -7 }, // 'l' - { 361, 8, 5, 10, 1, -5 }, // 'm' - { 366, 5, 5, 7, 1, -5 }, // 'n' - { 370, 5, 5, 7, 1, -5 }, // 'o' - { 374, 5, 7, 7, 1, -5 }, // 'p' - { 379, 5, 7, 7, 1, -5 }, // 'q' - { 384, 4, 5, 5, 1, -5 }, // 'r' - { 387, 5, 5, 6, 0, -5 }, // 's' - { 391, 4, 6, 4, 0, -6 }, // 't' - { 394, 5, 5, 7, 1, -5 }, // 'u' - { 398, 6, 5, 6, 0, -5 }, // 'v' - { 402, 8, 5, 8, 0, -5 }, // 'w' - { 407, 6, 5, 6, 0, -5 }, // 'x' - { 411, 6, 7, 6, 0, -5 }, // 'y' - { 417, 6, 5, 6, 0, -5 }, // 'z' - { 421, 5, 9, 5, 0, -7 }, // '{' - { 427, 2, 9, 6, 2, -7 }, // '|' - { 430, 5, 9, 5, 0, -7 } // '}' -}; - -const GFXglyph OpenSansLight12Glyphs[] = { -// bitmapOffset, width, height, xAdvance, xOffset, yOffset - { 0, 1, 1, 4, 0, 0 }, // ' ' - { 1, 2, 9, 4, 1, -9 }, // '!' - { 4, 3, 3, 5, 1, -9 }, // '"' - { 6, 9, 9, 9, 0, -9 }, // '#' - { 17, 6, 10, 8, 1, -9 }, // '$' - { 25, 9, 9, 11, 1, -9 }, // '%' - { 36, 9, 9, 10, 1, -9 }, // '&' - { 47, 3, 3, 3, 0, -9 }, // ''' - { 49, 4, 11, 4, 0, -9 }, // '(' - { 55, 4, 11, 4, 0, -9 }, // ')' - { 61, 6, 5, 8, 1, -9 }, // '*' - { 65, 6, 7, 8, 1, -8 }, // '+' - { 71, 3, 3, 4, 0, -1 }, // ',' - { 73, 3, 1, 5, 1, -3 }, // '-' - { 74, 2, 1, 4, 1, -1 }, // '.' - { 75, 5, 9, 5, 0, -9 }, // '/' - { 81, 6, 9, 8, 1, -9 }, // '0' - { 88, 4, 9, 8, 1, -9 }, // '1' - { 93, 6, 9, 8, 1, -9 }, // '2' - { 100, 6, 9, 8, 1, -9 }, // '3' - { 107, 8, 9, 8, 0, -9 }, // '4' - { 116, 6, 9, 8, 1, -9 }, // '5' - { 123, 6, 9, 8, 1, -9 }, // '6' - { 130, 6, 9, 8, 1, -9 }, // '7' - { 137, 6, 9, 8, 1, -9 }, // '8' - { 144, 6, 9, 8, 1, -9 }, // '9' - { 151, 2, 6, 4, 1, -6 }, // ':' - { 153, 3, 8, 4, 0, -6 }, // ';' - { 156, 6, 6, 8, 1, -8 }, // '<' - { 161, 6, 3, 8, 1, -6 }, // '=' - { 164, 6, 6, 8, 1, -8 }, // '>' - { 169, 6, 9, 6, 0, -9 }, // '?' - { 176, 10, 10, 12, 1, -9 }, // '@' - { 189, 8, 9, 8, 0, -9 }, // 'A' - { 198, 7, 9, 9, 1, -9 }, // 'B' - { 206, 7, 9, 8, 1, -9 }, // 'C' - { 214, 7, 9, 9, 1, -9 }, // 'D' - { 222, 6, 9, 8, 1, -9 }, // 'E' - { 229, 6, 9, 7, 1, -9 }, // 'F' - { 236, 8, 9, 10, 1, -9 }, // 'G' - { 245, 8, 9, 10, 1, -9 }, // 'H' - { 254, 2, 9, 4, 1, -9 }, // 'I' - { 257, 4, 11, 4, -1, -9 }, // 'J' - { 263, 7, 9, 8, 1, -9 }, // 'K' - { 271, 6, 9, 7, 1, -9 }, // 'L' - { 278, 9, 9, 11, 1, -9 }, // 'M' - { 289, 8, 9, 10, 1, -9 }, // 'N' - { 298, 8, 9, 10, 1, -9 }, // 'O' - { 307, 6, 9, 8, 1, -9 }, // 'P' - { 314, 8, 11, 10, 1, -9 }, // 'Q' - { 325, 7, 9, 8, 1, -9 }, // 'R' - { 333, 6, 9, 8, 1, -9 }, // 'S' - { 340, 7, 9, 7, 0, -9 }, // 'T' - { 348, 8, 9, 10, 1, -9 }, // 'U' - { 357, 8, 9, 8, 0, -9 }, // 'V' - { 366, 12, 9, 12, 0, -9 }, // 'W' - { 380, 7, 9, 7, 0, -9 }, // 'X' - { 388, 7, 9, 7, 0, -9 }, // 'Y' - { 396, 8, 9, 8, 0, -9 }, // 'Z' - { 405, 4, 11, 5, 1, -9 }, // '[' - { 411, 5, 9, 5, 0, -9 }, // '\' - { 417, 4, 11, 5, 0, -9 }, // ']' - { 423, 6, 5, 8, 1, -9 }, // '^' - { 427, 6, 1, 6, 0, 1 }, // '_' - { 428, 4, 2, 8, 2, -9 }, // '`' - { 429, 5, 6, 7, 1, -6 }, // 'a' - { 433, 6, 9, 8, 1, -9 }, // 'b' - { 440, 6, 6, 7, 1, -6 }, // 'c' - { 445, 6, 9, 8, 1, -9 }, // 'd' - { 452, 6, 6, 8, 1, -6 }, // 'e' - { 457, 5, 9, 5, 0, -9 }, // 'f' - { 463, 7, 9, 7, 0, -6 }, // 'g' - { 471, 6, 9, 8, 1, -9 }, // 'h' - { 478, 2, 9, 4, 1, -9 }, // 'i' - { 481, 3, 12, 4, 0, -9 }, // 'j' - { 486, 6, 9, 7, 1, -9 }, // 'k' - { 493, 2, 9, 4, 1, -9 }, // 'l' - { 496, 10, 6, 12, 1, -6 }, // 'm' - { 504, 6, 6, 8, 1, -6 }, // 'n' - { 509, 6, 6, 8, 1, -6 }, // 'o' - { 514, 6, 9, 8, 1, -6 }, // 'p' - { 521, 6, 9, 8, 1, -6 }, // 'q' - { 528, 5, 6, 6, 1, -6 }, // 'r' - { 532, 5, 6, 7, 1, -6 }, // 's' - { 536, 5, 8, 5, 0, -8 }, // 't' - { 541, 6, 6, 8, 1, -6 }, // 'u' - { 546, 7, 6, 7, 0, -6 }, // 'v' - { 552, 10, 6, 10, 0, -6 }, // 'w' - { 560, 7, 6, 7, 0, -6 }, // 'x' - { 566, 7, 9, 7, 0, -6 }, // 'y' - { 574, 5, 6, 7, 1, -6 }, // 'z' - { 578, 5, 11, 5, 0, -9 }, // '{' - { 585, 2, 12, 8, 3, -9 }, // '|' - { 588, 5, 11, 5, 0, -9 } // '}' -}; - -const GFXglyph OpenSansLight14Glyphs[] = { -// bitmapOffset, width, height, xAdvance, xOffset, yOffset - { 0, 1, 1, 5, 0, 0 }, // ' ' - { 1, 2, 10, 4, 1, -10 }, // '!' - { 4, 4, 4, 6, 1, -10 }, // '"' - { 6, 10, 10, 10, 0, -10 }, // '#' - { 19, 7, 12, 9, 1, -11 }, // '$' - { 30, 10, 10, 12, 1, -10 }, // '%' - { 43, 10, 10, 11, 1, -10 }, // '&' - { 56, 2, 4, 4, 1, -10 }, // ''' - { 57, 4, 12, 5, 1, -10 }, // '(' - { 63, 4, 12, 5, 0, -10 }, // ')' - { 69, 7, 6, 9, 1, -11 }, // '*' - { 75, 7, 7, 9, 1, -9 }, // '+' - { 82, 3, 4, 4, 0, -2 }, // ',' - { 84, 4, 1, 6, 1, -4 }, // '-' - { 85, 2, 1, 4, 1, -1 }, // '.' - { 86, 6, 10, 6, 0, -10 }, // '/' - { 94, 7, 10, 9, 1, -10 }, // '0' - { 103, 5, 10, 9, 1, -10 }, // '1' - { 110, 7, 10, 9, 1, -10 }, // '2' - { 119, 7, 10, 9, 1, -10 }, // '3' - { 128, 9, 10, 9, 0, -10 }, // '4' - { 140, 7, 10, 9, 1, -10 }, // '5' - { 149, 7, 10, 9, 1, -10 }, // '6' - { 158, 7, 10, 9, 1, -10 }, // '7' - { 167, 7, 10, 9, 1, -10 }, // '8' - { 176, 7, 10, 9, 1, -10 }, // '9' - { 185, 2, 8, 4, 1, -8 }, // ':' - { 187, 3, 10, 4, 0, -8 }, // ';' - { 191, 7, 7, 9, 1, -9 }, // '<' - { 198, 7, 3, 9, 1, -7 }, // '=' - { 201, 7, 7, 9, 1, -9 }, // '>' - { 208, 6, 10, 7, 0, -10 }, // '?' - { 216, 11, 11, 13, 1, -10 }, // '@' - { 232, 9, 10, 9, 0, -10 }, // 'A' - { 244, 8, 10, 10, 1, -10 }, // 'B' - { 254, 9, 10, 10, 1, -10 }, // 'C' - { 266, 9, 10, 11, 1, -10 }, // 'D' - { 278, 7, 10, 9, 1, -10 }, // 'E' - { 287, 7, 10, 8, 1, -10 }, // 'F' - { 296, 9, 10, 11, 1, -10 }, // 'G' - { 308, 9, 10, 11, 1, -10 }, // 'H' - { 320, 3, 10, 5, 1, -10 }, // 'I' - { 324, 4, 13, 4, -1, -10 }, // 'J' - { 331, 8, 10, 9, 1, -10 }, // 'K' - { 341, 7, 10, 8, 1, -10 }, // 'L' - { 350, 11, 10, 13, 1, -10 }, // 'M' - { 364, 9, 10, 11, 1, -10 }, // 'N' - { 376, 10, 10, 12, 1, -10 }, // 'O' - { 389, 7, 10, 9, 1, -10 }, // 'P' - { 398, 10, 12, 12, 1, -10 }, // 'Q' - { 413, 8, 10, 9, 1, -10 }, // 'R' - { 423, 7, 10, 9, 1, -10 }, // 'S' - { 432, 8, 10, 8, 0, -10 }, // 'T' - { 442, 9, 10, 11, 1, -10 }, // 'U' - { 454, 9, 10, 9, 0, -10 }, // 'V' - { 466, 13, 10, 13, 0, -10 }, // 'W' - { 483, 9, 10, 9, 0, -10 }, // 'X' - { 495, 8, 10, 8, 0, -10 }, // 'Y' - { 505, 7, 10, 9, 1, -10 }, // 'Z' - { 514, 4, 12, 5, 1, -10 }, // '[' - { 520, 6, 10, 6, 0, -10 }, // '\' - { 528, 4, 12, 5, 0, -10 }, // ']' - { 534, 7, 6, 9, 1, -10 }, // '^' - { 540, 7, 1, 7, 0, 1 }, // '_' - { 541, 3, 2, 9, 3, -10 }, // '`' - { 542, 6, 8, 8, 1, -8 }, // 'a' - { 548, 7, 11, 9, 1, -11 }, // 'b' - { 558, 6, 8, 8, 1, -8 }, // 'c' - { 564, 7, 11, 9, 1, -11 }, // 'd' - { 574, 7, 8, 9, 1, -8 }, // 'e' - { 581, 6, 11, 5, 0, -11 }, // 'f' - { 590, 8, 11, 8, 0, -8 }, // 'g' - { 601, 7, 11, 9, 1, -11 }, // 'h' - { 611, 2, 10, 4, 1, -10 }, // 'i' - { 614, 4, 13, 4, -1, -10 }, // 'j' - { 621, 7, 11, 8, 1, -11 }, // 'k' - { 631, 2, 11, 4, 1, -11 }, // 'l' - { 634, 11, 8, 13, 1, -8 }, // 'm' - { 645, 7, 8, 9, 1, -8 }, // 'n' - { 652, 7, 8, 9, 1, -8 }, // 'o' - { 659, 7, 11, 9, 1, -8 }, // 'p' - { 669, 7, 11, 9, 1, -8 }, // 'q' - { 679, 5, 8, 6, 1, -8 }, // 'r' - { 684, 6, 8, 8, 1, -8 }, // 's' - { 690, 6, 10, 6, 0, -10 }, // 't' - { 698, 7, 8, 9, 1, -8 }, // 'u' - { 705, 7, 8, 7, 0, -8 }, // 'v' - { 712, 11, 8, 11, 0, -8 }, // 'w' - { 723, 8, 8, 8, 0, -8 }, // 'x' - { 731, 7, 11, 7, 0, -8 }, // 'y' - { 741, 5, 8, 7, 1, -8 }, // 'z' - { 746, 6, 12, 6, 0, -10 }, // '{' - { 755, 3, 14, 9, 3, -11 }, // '|' - { 761, 5, 12, 6, 1, -10 } // '}' -}; - - -const GFXglyph OpenSansLight16Glyphs[] = { -// bitmapOffset, width, height, xAdvance, xOffset, yOffset - { 0, 1, 1, 5, 0, 0 }, // ' ' - { 1, 3, 12, 5, 1, -12 }, // '!' - { 6, 5, 4, 7, 1, -12 }, // '"' - { 9, 11, 12, 11, 0, -12 }, // '#' - { 26, 8, 13, 10, 1, -12 }, // '$' - { 39, 12, 12, 14, 1, -12 }, // '%' - { 57, 11, 12, 12, 1, -12 }, // '&' - { 74, 2, 4, 4, 1, -12 }, // ''' - { 75, 4, 15, 5, 1, -12 }, // '(' - { 83, 4, 15, 5, 0, -12 }, // ')' - { 91, 8, 7, 10, 1, -13 }, // '*' - { 98, 8, 7, 10, 1, -10 }, // '+' - { 105, 3, 4, 4, 0, -2 }, // ',' - { 107, 4, 1, 6, 1, -5 }, // '-' - { 108, 3, 2, 5, 1, -2 }, // '.' - { 109, 6, 12, 6, 0, -12 }, // '/' - { 118, 8, 12, 10, 1, -12 }, // '0' - { 130, 4, 12, 10, 2, -12 }, // '1' - { 136, 8, 12, 10, 1, -12 }, // '2' - { 148, 8, 12, 10, 1, -12 }, // '3' - { 160, 10, 12, 10, 0, -12 }, // '4' - { 175, 8, 12, 10, 1, -12 }, // '5' - { 187, 8, 12, 10, 1, -12 }, // '6' - { 199, 8, 12, 10, 1, -12 }, // '7' - { 211, 8, 12, 10, 1, -12 }, // '8' - { 223, 8, 12, 10, 1, -12 }, // '9' - { 235, 3, 9, 5, 1, -9 }, // ':' - { 239, 3, 11, 5, 1, -9 }, // ';' - { 244, 8, 7, 10, 1, -10 }, // '<' - { 251, 8, 4, 10, 1, -8 }, // '=' - { 255, 8, 7, 10, 1, -10 }, // '>' - { 262, 7, 12, 8, 0, -12 }, // '?' - { 273, 13, 14, 15, 1, -12 }, // '@' - { 296, 11, 12, 11, 0, -12 }, // 'A' - { 313, 8, 12, 11, 2, -12 }, // 'B' - { 325, 10, 12, 11, 1, -12 }, // 'C' - { 340, 9, 12, 12, 2, -12 }, // 'D' - { 354, 7, 12, 10, 2, -12 }, // 'E' - { 365, 7, 12, 9, 2, -12 }, // 'F' - { 376, 11, 12, 13, 1, -12 }, // 'G' - { 393, 9, 12, 13, 2, -12 }, // 'H' - { 407, 3, 12, 5, 1, -12 }, // 'I' - { 412, 4, 15, 5, -1, -12 }, // 'J' - { 420, 8, 12, 10, 2, -12 }, // 'K' - { 432, 7, 12, 9, 2, -12 }, // 'L' - { 443, 11, 12, 15, 2, -12 }, // 'M' - { 460, 9, 12, 13, 2, -12 }, // 'N' - { 474, 11, 12, 13, 1, -12 }, // 'O' - { 491, 7, 12, 10, 2, -12 }, // 'P' - { 502, 11, 15, 13, 1, -12 }, // 'Q' - { 523, 9, 12, 11, 2, -12 }, // 'R' - { 537, 8, 12, 10, 1, -12 }, // 'S' - { 549, 9, 12, 9, 0, -12 }, // 'T' - { 563, 9, 12, 13, 2, -12 }, // 'U' - { 577, 10, 12, 10, 0, -12 }, // 'V' - { 592, 15, 12, 15, 0, -12 }, // 'W' - { 615, 10, 12, 10, 0, -12 }, // 'X' - { 630, 9, 12, 9, 0, -12 }, // 'Y' - { 644, 8, 12, 10, 1, -12 }, // 'Z' - { 656, 5, 15, 6, 1, -12 }, // '[' - { 666, 6, 12, 6, 0, -12 }, // '\' - { 675, 5, 15, 6, 0, -12 }, // ']' - { 685, 8, 7, 10, 1, -12 }, // '^' - { 692, 8, 1, 8, 0, 1 }, // '_' - { 693, 4, 3, 10, 3, -13 }, // '`' - { 695, 7, 9, 9, 1, -9 }, // 'a' - { 703, 8, 13, 11, 2, -13 }, // 'b' - { 716, 7, 9, 9, 1, -9 }, // 'c' - { 724, 9, 13, 11, 1, -13 }, // 'd' - { 739, 8, 9, 10, 1, -9 }, // 'e' - { 748, 7, 13, 6, 0, -13 }, // 'f' - { 760, 9, 13, 9, 0, -9 }, // 'g' - { 775, 8, 13, 10, 1, -13 }, // 'h' - { 788, 2, 12, 5, 1, -12 }, // 'i' - { 791, 4, 16, 5, -1, -12 }, // 'j' - { 799, 8, 13, 9, 1, -13 }, // 'k' - { 812, 3, 13, 5, 1, -13 }, // 'l' - { 817, 13, 9, 15, 1, -9 }, // 'm' - { 832, 8, 9, 10, 1, -9 }, // 'n' - { 841, 8, 9, 10, 1, -9 }, // 'o' - { 850, 8, 13, 11, 2, -9 }, // 'p' - { 863, 9, 13, 11, 1, -9 }, // 'q' - { 878, 6, 9, 7, 1, -9 }, // 'r' - { 885, 6, 9, 8, 1, -9 }, // 's' - { 892, 6, 11, 6, 0, -11 }, // 't' - { 901, 8, 9, 10, 1, -9 }, // 'u' - { 910, 8, 9, 8, 0, -9 }, // 'v' - { 919, 13, 9, 13, 0, -9 }, // 'w' - { 934, 9, 9, 9, 0, -9 }, // 'x' - { 945, 8, 13, 8, 0, -9 }, // 'y' - { 958, 6, 9, 8, 1, -9 }, // 'z' - { 965, 5, 15, 7, 1, -12 }, // '{' - { 975, 2, 17, 10, 4, -13 }, // '|' - { 980, 6, 15, 7, 1, -12 } // '}' -}; - -const GFXglyph Org_01Glyphs[] = { - {0, 0, 0, 6, 0, 1}, // 0x20 ' ' - {0, 1, 5, 2, 0, -4}, // 0x21 '!' - {1, 3, 1, 4, 0, -4}, // 0x22 '"' - {2, 5, 5, 6, 0, -4}, // 0x23 '#' - {6, 5, 5, 6, 0, -4}, // 0x24 '$' - {10, 5, 5, 6, 0, -4}, // 0x25 '%' - {14, 5, 5, 6, 0, -4}, // 0x26 '&' - {18, 1, 1, 2, 0, -4}, // 0x27 ''' - {19, 2, 5, 3, 0, -4}, // 0x28 '(' - {21, 2, 5, 3, 0, -4}, // 0x29 ')' - {23, 3, 3, 4, 0, -3}, // 0x2A '*' - {25, 3, 3, 4, 0, -3}, // 0x2B '+' - {27, 1, 2, 2, 0, 0}, // 0x2C ',' - {28, 4, 1, 5, 0, -2}, // 0x2D '-' - {29, 1, 1, 2, 0, 0}, // 0x2E '.' - {30, 5, 5, 6, 0, -4}, // 0x2F '/' - {34, 5, 5, 6, 0, -4}, // 0x30 '0' - {38, 1, 5, 2, 0, -4}, // 0x31 '1' - {39, 5, 5, 6, 0, -4}, // 0x32 '2' - {43, 5, 5, 6, 0, -4}, // 0x33 '3' - {47, 5, 5, 6, 0, -4}, // 0x34 '4' - {51, 5, 5, 6, 0, -4}, // 0x35 '5' - {55, 5, 5, 6, 0, -4}, // 0x36 '6' - {59, 5, 5, 6, 0, -4}, // 0x37 '7' - {63, 5, 5, 6, 0, -4}, // 0x38 '8' - {67, 5, 5, 6, 0, -4}, // 0x39 '9' - {71, 1, 4, 2, 0, -3}, // 0x3A ':' - {72, 1, 4, 2, 0, -3}, // 0x3B ';' - {73, 3, 5, 4, 0, -4}, // 0x3C '<' - {75, 4, 3, 5, 0, -3}, // 0x3D '=' - {77, 3, 5, 4, 0, -4}, // 0x3E '>' - {79, 5, 5, 6, 0, -4}, // 0x3F '?' - {83, 5, 5, 6, 0, -4}, // 0x40 '@' - {87, 5, 5, 6, 0, -4}, // 0x41 'A' - {91, 5, 5, 6, 0, -4}, // 0x42 'B' - {95, 5, 5, 6, 0, -4}, // 0x43 'C' - {99, 5, 5, 6, 0, -4}, // 0x44 'D' - {103, 5, 5, 6, 0, -4}, // 0x45 'E' - {107, 5, 5, 6, 0, -4}, // 0x46 'F' - {111, 5, 5, 6, 0, -4}, // 0x47 'G' - {115, 5, 5, 6, 0, -4}, // 0x48 'H' - {119, 5, 5, 6, 0, -4}, // 0x49 'I' - {123, 5, 5, 6, 0, -4}, // 0x4A 'J' - {127, 5, 5, 6, 0, -4}, // 0x4B 'K' - {131, 5, 5, 6, 0, -4}, // 0x4C 'L' - {135, 5, 5, 6, 0, -4}, // 0x4D 'M' - {139, 5, 5, 6, 0, -4}, // 0x4E 'N' - {143, 5, 5, 6, 0, -4}, // 0x4F 'O' - {147, 5, 5, 6, 0, -4}, // 0x50 'P' - {151, 5, 5, 6, 0, -4}, // 0x51 'Q' - {155, 5, 5, 6, 0, -4}, // 0x52 'R' - {159, 5, 5, 6, 0, -4}, // 0x53 'S' - {163, 5, 5, 6, 0, -4}, // 0x54 'T' - {167, 5, 5, 6, 0, -4}, // 0x55 'U' - {171, 5, 5, 6, 0, -4}, // 0x56 'V' - {175, 5, 5, 6, 0, -4}, // 0x57 'W' - {179, 5, 5, 6, 0, -4}, // 0x58 'X' - {183, 5, 5, 6, 0, -4}, // 0x59 'Y' - {187, 5, 5, 6, 0, -4}, // 0x5A 'Z' - {191, 2, 5, 3, 0, -4}, // 0x5B '[' - {193, 5, 5, 6, 0, -4}, // 0x5C '\' - {197, 2, 5, 3, 0, -4}, // 0x5D ']' - {199, 3, 2, 4, 0, -4}, // 0x5E '^' - {200, 5, 1, 6, 0, 1}, // 0x5F '_' - {201, 1, 1, 2, 0, -4}, // 0x60 '`' - {202, 4, 4, 5, 0, -3}, // 0x61 'a' - {204, 4, 5, 5, 0, -4}, // 0x62 'b' - {207, 4, 4, 5, 0, -3}, // 0x63 'c' - {209, 4, 5, 5, 0, -4}, // 0x64 'd' - {212, 4, 4, 5, 0, -3}, // 0x65 'e' - {214, 3, 5, 4, 0, -4}, // 0x66 'f' - {216, 4, 5, 5, 0, -3}, // 0x67 'g' - {219, 4, 5, 5, 0, -4}, // 0x68 'h' - {222, 1, 4, 2, 0, -3}, // 0x69 'i' - {223, 2, 5, 3, 0, -3}, // 0x6A 'j' - {225, 4, 5, 5, 0, -4}, // 0x6B 'k' - {228, 1, 5, 2, 0, -4}, // 0x6C 'l' - {229, 5, 4, 6, 0, -3}, // 0x6D 'm' - {232, 4, 4, 5, 0, -3}, // 0x6E 'n' - {234, 4, 4, 5, 0, -3}, // 0x6F 'o' - {236, 4, 5, 5, 0, -3}, // 0x70 'p' - {239, 4, 5, 5, 0, -3}, // 0x71 'q' - {242, 4, 4, 5, 0, -3}, // 0x72 'r' - {244, 4, 4, 5, 0, -3}, // 0x73 's' - {246, 5, 5, 6, 0, -4}, // 0x74 't' - {250, 4, 4, 5, 0, -3}, // 0x75 'u' - {252, 4, 4, 5, 0, -3}, // 0x76 'v' - {254, 5, 4, 6, 0, -3}, // 0x77 'w' - {257, 4, 4, 5, 0, -3}, // 0x78 'x' - {259, 4, 5, 5, 0, -3}, // 0x79 'y' - {262, 4, 4, 5, 0, -3}, // 0x7A 'z' - {264, 3, 5, 4, 0, -4}, // 0x7B '{' - {266, 1, 5, 2, 0, -4}, // 0x7C '|' - {267, 3, 5, 4, 0, -4}, // 0x7D '}' - {269, 5, 3, 6, 0, -3}}; // 0x7E '~' - - -/* {offset, width, height, advance cursor, x offset, y offset} */ -const GFXglyph TomThumbGlyphs[] = { - {0, 8, 1, 2, 0, -5}, /* 0x20 space */ - {1, 8, 5, 2, 0, -5}, /* 0x21 exclam */ - {6, 8, 2, 4, 0, -5}, /* 0x22 quotedbl */ - {8, 8, 5, 4, 0, -5}, /* 0x23 numbersign */ - {13, 8, 5, 4, 0, -5}, /* 0x24 dollar */ - {18, 8, 5, 4, 0, -5}, /* 0x25 percent */ - {23, 8, 5, 4, 0, -5}, /* 0x26 ampersand */ - {28, 8, 2, 2, 0, -5}, /* 0x27 quotesingle */ - {30, 8, 5, 3, 0, -5}, /* 0x28 parenleft */ - {35, 8, 5, 3, 0, -5}, /* 0x29 parenright */ - {40, 8, 3, 4, 0, -5}, /* 0x2A asterisk */ - {43, 8, 3, 4, 0, -4}, /* 0x2B plus */ - {46, 8, 2, 3, 0, -2}, /* 0x2C comma */ - {48, 8, 1, 4, 0, -3}, /* 0x2D hyphen */ - {49, 8, 1, 2, 0, -1}, /* 0x2E period */ - {50, 8, 5, 4, 0, -5}, /* 0x2F slash */ - {55, 8, 5, 4, 0, -5}, /* 0x30 zero */ - {60, 8, 5, 3, 0, -5}, /* 0x31 one */ - {65, 8, 5, 4, 0, -5}, /* 0x32 two */ - {70, 8, 5, 4, 0, -5}, /* 0x33 three */ - {75, 8, 5, 4, 0, -5}, /* 0x34 four */ - {80, 8, 5, 4, 0, -5}, /* 0x35 five */ - {85, 8, 5, 4, 0, -5}, /* 0x36 six */ - {90, 8, 5, 4, 0, -5}, /* 0x37 seven */ - {95, 8, 5, 4, 0, -5}, /* 0x38 eight */ - {100, 8, 5, 4, 0, -5}, /* 0x39 nine */ - {105, 8, 3, 2, 0, -4}, /* 0x3A colon */ - {108, 8, 4, 3, 0, -4}, /* 0x3B semicolon */ - {112, 8, 5, 4, 0, -5}, /* 0x3C less */ - {117, 8, 3, 4, 0, -4}, /* 0x3D equal */ - {120, 8, 5, 4, 0, -5}, /* 0x3E greater */ - {125, 8, 5, 4, 0, -5}, /* 0x3F question */ - {130, 8, 5, 4, 0, -5}, /* 0x40 at */ - {135, 8, 5, 4, 0, -5}, /* 0x41 A */ - {140, 8, 5, 4, 0, -5}, /* 0x42 B */ - {145, 8, 5, 4, 0, -5}, /* 0x43 C */ - {150, 8, 5, 4, 0, -5}, /* 0x44 D */ - {155, 8, 5, 4, 0, -5}, /* 0x45 E */ - {160, 8, 5, 4, 0, -5}, /* 0x46 F */ - {165, 8, 5, 4, 0, -5}, /* 0x47 G */ - {170, 8, 5, 4, 0, -5}, /* 0x48 H */ - {175, 8, 5, 4, 0, -5}, /* 0x49 I */ - {180, 8, 5, 4, 0, -5}, /* 0x4A J */ - {185, 8, 5, 4, 0, -5}, /* 0x4B K */ - {190, 8, 5, 4, 0, -5}, /* 0x4C L */ - {195, 8, 5, 4, 0, -5}, /* 0x4D M */ - {200, 8, 5, 4, 0, -5}, /* 0x4E N */ - {205, 8, 5, 4, 0, -5}, /* 0x4F O */ - {210, 8, 5, 4, 0, -5}, /* 0x50 P */ - {215, 8, 5, 4, 0, -5}, /* 0x51 Q */ - {220, 8, 5, 4, 0, -5}, /* 0x52 R */ - {225, 8, 5, 4, 0, -5}, /* 0x53 S */ - {230, 8, 5, 4, 0, -5}, /* 0x54 T */ - {235, 8, 5, 4, 0, -5}, /* 0x55 U */ - {240, 8, 5, 4, 0, -5}, /* 0x56 V */ - {245, 8, 5, 4, 0, -5}, /* 0x57 W */ - {250, 8, 5, 4, 0, -5}, /* 0x58 X */ - {255, 8, 5, 4, 0, -5}, /* 0x59 Y */ - {260, 8, 5, 4, 0, -5}, /* 0x5A Z */ - {265, 8, 5, 4, 0, -5}, /* 0x5B bracketleft */ - {270, 8, 3, 4, 0, -4}, /* 0x5C backslash */ - {273, 8, 5, 4, 0, -5}, /* 0x5D bracketright */ - {278, 8, 2, 4, 0, -5}, /* 0x5E asciicircum */ - {280, 8, 1, 4, 0, -1}, /* 0x5F underscore */ - {281, 8, 2, 3, 0, -5}, /* 0x60 grave */ - {283, 8, 4, 4, 0, -4}, /* 0x61 a */ - {287, 8, 5, 4, 0, -5}, /* 0x62 b */ - {292, 8, 4, 4, 0, -4}, /* 0x63 c */ - {296, 8, 5, 4, 0, -5}, /* 0x64 d */ - {301, 8, 4, 4, 0, -4}, /* 0x65 e */ - {305, 8, 5, 4, 0, -5}, /* 0x66 f */ - {310, 8, 5, 4, 0, -4}, /* 0x67 g */ - {315, 8, 5, 4, 0, -5}, /* 0x68 h */ - {320, 8, 5, 2, 0, -5}, /* 0x69 i */ - {325, 8, 6, 4, 0, -5}, /* 0x6A j */ - {331, 8, 5, 4, 0, -5}, /* 0x6B k */ - {336, 8, 5, 4, 0, -5}, /* 0x6C l */ - {341, 8, 4, 4, 0, -4}, /* 0x6D m */ - {345, 8, 4, 4, 0, -4}, /* 0x6E n */ - {349, 8, 4, 4, 0, -4}, /* 0x6F o */ - {353, 8, 5, 4, 0, -4}, /* 0x70 p */ - {358, 8, 5, 4, 0, -4}, /* 0x71 q */ - {363, 8, 4, 4, 0, -4}, /* 0x72 r */ - {367, 8, 4, 4, 0, -4}, /* 0x73 s */ - {371, 8, 5, 4, 0, -5}, /* 0x74 t */ - {376, 8, 4, 4, 0, -4}, /* 0x75 u */ - {380, 8, 4, 4, 0, -4}, /* 0x76 v */ - {384, 8, 4, 4, 0, -4}, /* 0x77 w */ - {388, 8, 4, 4, 0, -4}, /* 0x78 x */ - {392, 8, 5, 4, 0, -4}, /* 0x79 y */ - {397, 8, 4, 4, 0, -4}, /* 0x7A z */ - {401, 8, 5, 4, 0, -5}, /* 0x7B braceleft */ - {406, 8, 5, 2, 0, -5}, /* 0x7C bar */ - {411, 8, 5, 4, 0, -5}, /* 0x7D braceright */ - {416, 8, 2, 4, 0, -5}, /* 0x7E asciitilde */ -#if 0 //(TOMTHUMB_USE_EXTENDED) - {418, 8, 5, 2, 0, -5}, /* 0xA1 exclamdown */ - {423, 8, 5, 4, 0, -5}, /* 0xA2 cent */ - {428, 8, 5, 4, 0, -5}, /* 0xA3 sterling */ - {433, 8, 5, 4, 0, -5}, /* 0xA4 currency */ - {438, 8, 5, 4, 0, -5}, /* 0xA5 yen */ - {443, 8, 5, 2, 0, -5}, /* 0xA6 brokenbar */ - {448, 8, 5, 4, 0, -5}, /* 0xA7 section */ - {453, 8, 1, 4, 0, -5}, /* 0xA8 dieresis */ - {454, 8, 3, 4, 0, -5}, /* 0xA9 copyright */ - {457, 8, 5, 4, 0, -5}, /* 0xAA ordfeminine */ - {462, 8, 3, 3, 0, -5}, /* 0xAB guillemotleft */ - {465, 8, 2, 4, 0, -4}, /* 0xAC logicalnot */ - {467, 8, 1, 3, 0, -3}, /* 0xAD softhyphen */ - {468, 8, 3, 4, 0, -5}, /* 0xAE registered */ - {471, 8, 1, 4, 0, -5}, /* 0xAF macron */ - {472, 8, 3, 4, 0, -5}, /* 0xB0 degree */ - {475, 8, 5, 4, 0, -5}, /* 0xB1 plusminus */ - {480, 8, 3, 4, 0, -5}, /* 0xB2 twosuperior */ - {483, 8, 3, 4, 0, -5}, /* 0xB3 threesuperior */ - {486, 8, 2, 3, 0, -5}, /* 0xB4 acute */ - {488, 8, 5, 4, 0, -5}, /* 0xB5 mu */ - {493, 8, 5, 4, 0, -5}, /* 0xB6 paragraph */ - {498, 8, 3, 4, 0, -4}, /* 0xB7 periodcentered */ - {501, 8, 3, 4, 0, -3}, /* 0xB8 cedilla */ - {504, 8, 3, 2, 0, -5}, /* 0xB9 onesuperior */ - {507, 8, 5, 4, 0, -5}, /* 0xBA ordmasculine */ - {512, 8, 3, 3, 0, -5}, /* 0xBB guillemotright */ - {515, 8, 5, 4, 0, -5}, /* 0xBC onequarter */ - {520, 8, 5, 4, 0, -5}, /* 0xBD onehalf */ - {525, 8, 5, 4, 0, -5}, /* 0xBE threequarters */ - {530, 8, 5, 4, 0, -5}, /* 0xBF questiondown */ - {535, 8, 5, 4, 0, -5}, /* 0xC0 Agrave */ - {540, 8, 5, 4, 0, -5}, /* 0xC1 Aacute */ - {545, 8, 5, 4, 0, -5}, /* 0xC2 Acircumflex */ - {550, 8, 5, 4, 0, -5}, /* 0xC3 Atilde */ - {555, 8, 5, 4, 0, -5}, /* 0xC4 Adieresis */ - {560, 8, 5, 4, 0, -5}, /* 0xC5 Aring */ - {565, 8, 5, 4, 0, -5}, /* 0xC6 AE */ - {570, 8, 6, 4, 0, -5}, /* 0xC7 Ccedilla */ - {576, 8, 5, 4, 0, -5}, /* 0xC8 Egrave */ - {581, 8, 5, 4, 0, -5}, /* 0xC9 Eacute */ - {586, 8, 5, 4, 0, -5}, /* 0xCA Ecircumflex */ - {591, 8, 5, 4, 0, -5}, /* 0xCB Edieresis */ - {596, 8, 5, 4, 0, -5}, /* 0xCC Igrave */ - {601, 8, 5, 4, 0, -5}, /* 0xCD Iacute */ - {606, 8, 5, 4, 0, -5}, /* 0xCE Icircumflex */ - {611, 8, 5, 4, 0, -5}, /* 0xCF Idieresis */ - {616, 8, 5, 4, 0, -5}, /* 0xD0 Eth */ - {621, 8, 5, 4, 0, -5}, /* 0xD1 Ntilde */ - {626, 8, 5, 4, 0, -5}, /* 0xD2 Ograve */ - {631, 8, 5, 4, 0, -5}, /* 0xD3 Oacute */ - {636, 8, 5, 4, 0, -5}, /* 0xD4 Ocircumflex */ - {641, 8, 5, 4, 0, -5}, /* 0xD5 Otilde */ - {646, 8, 5, 4, 0, -5}, /* 0xD6 Odieresis */ - {651, 8, 3, 4, 0, -4}, /* 0xD7 multiply */ - {654, 8, 5, 4, 0, -5}, /* 0xD8 Oslash */ - {659, 8, 5, 4, 0, -5}, /* 0xD9 Ugrave */ - {664, 8, 5, 4, 0, -5}, /* 0xDA Uacute */ - {669, 8, 5, 4, 0, -5}, /* 0xDB Ucircumflex */ - {674, 8, 5, 4, 0, -5}, /* 0xDC Udieresis */ - {679, 8, 5, 4, 0, -5}, /* 0xDD Yacute */ - {684, 8, 5, 4, 0, -5}, /* 0xDE Thorn */ - {689, 8, 6, 4, 0, -5}, /* 0xDF germandbls */ - {695, 8, 5, 4, 0, -5}, /* 0xE0 agrave */ - {700, 8, 5, 4, 0, -5}, /* 0xE1 aacute */ - {705, 8, 5, 4, 0, -5}, /* 0xE2 acircumflex */ - {710, 8, 5, 4, 0, -5}, /* 0xE3 atilde */ - {715, 8, 5, 4, 0, -5}, /* 0xE4 adieresis */ - {720, 8, 5, 4, 0, -5}, /* 0xE5 aring */ - {725, 8, 4, 4, 0, -4}, /* 0xE6 ae */ - {729, 8, 5, 4, 0, -4}, /* 0xE7 ccedilla */ - {734, 8, 5, 4, 0, -5}, /* 0xE8 egrave */ - {739, 8, 5, 4, 0, -5}, /* 0xE9 eacute */ - {744, 8, 5, 4, 0, -5}, /* 0xEA ecircumflex */ - {749, 8, 5, 4, 0, -5}, /* 0xEB edieresis */ - {754, 8, 5, 3, 0, -5}, /* 0xEC igrave */ - {759, 8, 5, 3, 0, -5}, /* 0xED iacute */ - {764, 8, 5, 4, 0, -5}, /* 0xEE icircumflex */ - {769, 8, 5, 4, 0, -5}, /* 0xEF idieresis */ - {774, 8, 5, 4, 0, -5}, /* 0xF0 eth */ - {779, 8, 5, 4, 0, -5}, /* 0xF1 ntilde */ - {784, 8, 5, 4, 0, -5}, /* 0xF2 ograve */ - {789, 8, 5, 4, 0, -5}, /* 0xF3 oacute */ - {794, 8, 5, 4, 0, -5}, /* 0xF4 ocircumflex */ - {799, 8, 5, 4, 0, -5}, /* 0xF5 otilde */ - {804, 8, 5, 4, 0, -5}, /* 0xF6 odieresis */ - {809, 8, 5, 4, 0, -5}, /* 0xF7 divide */ - {814, 8, 4, 4, 0, -4}, /* 0xF8 oslash */ - {818, 8, 5, 4, 0, -5}, /* 0xF9 ugrave */ - {823, 8, 5, 4, 0, -5}, /* 0xFA uacute */ - {828, 8, 5, 4, 0, -5}, /* 0xFB ucircumflex */ - {833, 8, 5, 4, 0, -5}, /* 0xFC udieresis */ - {838, 8, 6, 4, 0, -5}, /* 0xFD yacute */ - {844, 8, 5, 4, 0, -4}, /* 0xFE thorn */ - {849, 8, 6, 4, 0, -5}, /* 0xFF ydieresis */ - {855, 8, 1, 2, 0, -1}, /* 0x11D gcircumflex */ - {856, 8, 5, 4, 0, -5}, /* 0x152 OE */ - {861, 8, 4, 4, 0, -4}, /* 0x153 oe */ - {865, 8, 5, 4, 0, -5}, /* 0x160 Scaron */ - {870, 8, 5, 4, 0, -5}, /* 0x161 scaron */ - {875, 8, 5, 4, 0, -5}, /* 0x178 Ydieresis */ - {880, 8, 5, 4, 0, -5}, /* 0x17D Zcaron */ - {885, 8, 5, 4, 0, -5}, /* 0x17E zcaron */ - {890, 8, 1, 2, 0, -1}, /* 0xEA4 uni0EA4 */ - {891, 8, 1, 2, 0, -1}, /* 0x13A0 uni13A0 */ - {892, 8, 1, 2, 0, -3}, /* 0x2022 bullet */ - {893, 8, 1, 4, 0, -1}, /* 0x2026 ellipsis */ - {894, 8, 5, 4, 0, -5}, /* 0x20AC Euro */ - {899, 8, 5, 4, 0, -5}, /* 0xFFFD uniFFFD */ -#endif -}; - diff --git a/drv/display/glyphs.h b/drv/display/glyphs.h index 88a3377..ad0d255 100644 --- a/drv/display/glyphs.h +++ b/drv/display/glyphs.h @@ -1,17 +1,25 @@ #ifndef GLYPHS_H #define GLYPHS_H -extern const GFXglyph FreeMono12pt7bGlyphs[]; -extern const GFXglyph FreeMono18pt7bGlyphs[]; -extern const GFXglyph FreeMono24pt7bGlyphs[]; -extern const GFXglyph FreeMono9pt7bGlyphs[]; -extern const GFXglyph FreeSans12pt7bGlyphs[]; -extern const GFXglyph FreeSans9pt7bGlyphs[]; -extern const GFXglyph OpenSansLight10Glyphs[]; -extern const GFXglyph OpenSansLight12Glyphs[]; -extern const GFXglyph OpenSansLight14Glyphs[]; -extern const GFXglyph OpenSansLight16Glyphs[]; -extern const GFXglyph Org_01Glyphs[]; +#ifdef __cplusplus +extern "C" { +#endif + +extern const GFXglyph FreeMono12Glyphs[]; +extern const GFXglyph FreeMono18Glyphs[]; +extern const GFXglyph FreeMono24Glyphs[]; +extern const GFXglyph FreeMono9Glyphs[]; +extern const GFXglyph FreeSans12Glyphs[]; +extern const GFXglyph FreeSans9Glyphs[]; +extern const GFXglyph SansLight10Glyphs[]; +extern const GFXglyph SansLight12Glyphs[]; +extern const GFXglyph SansLight14Glyphs[]; +extern const GFXglyph SansLight16Glyphs[]; +extern const GFXglyph Org01Glyphs[]; extern const GFXglyph TomThumbGlyphs[]; +#ifdef __cplusplus +} +#endif + #endif diff --git a/drv/display/opensanslight-10.h b/drv/display/opensanslight-10.h index 1da7b0e..f1b2cb9 100644 --- a/drv/display/opensanslight-10.h +++ b/drv/display/opensanslight-10.h @@ -1,6 +1,6 @@ // Created by http://oleddisplay.squix.ch/ Consider a donation // In case of problems make sure that you are using the font file with the correct version! -const uint8_t OpenSansLight10Bitmaps[] = { +const uint8_t SansLight10Bitmaps[] = { // Bitmap Data: 0x00, // ' ' @@ -98,7 +98,7 @@ const uint8_t OpenSansLight10Bitmaps[] = { 0xAA,0xAA,0x80, // '|' 0x41,0x08,0x42,0x10,0x84,0x40 // '}' }; -const GFXglyph OpenSansLight10Glyphs[] = { +const GFXglyph SansLight10Glyphs[] = { // bitmapOffset, width, height, xAdvance, xOffset, yOffset { 0, 1, 1, 4, 0, 0 }, // ' ' { 1, 3, 7, 3, 0, -7 }, // '!' @@ -195,5 +195,5 @@ const GFXglyph OpenSansLight10Glyphs[] = { { 427, 2, 9, 6, 2, -7 }, // '|' { 430, 5, 9, 5, 0, -7 } // '}' }; -//const Font OpenSansLight10 = { -//(uint8_t *)OpenSansLight10Bitmaps,(GFXglyph *)OpenSansLight10Glyphs,0x20, 0x7d, 14}; +GFXfont SansLight10 = {"SansLight10", +(uint8_t *)SansLight10Bitmaps,(GFXglyph *)SansLight10Glyphs,0x20, 0x7d, 14}; diff --git a/drv/display/opensanslight-12.h b/drv/display/opensanslight-12.h index b3faa6c..362668b 100644 --- a/drv/display/opensanslight-12.h +++ b/drv/display/opensanslight-12.h @@ -1,6 +1,6 @@ // Created by http://oleddisplay.squix.ch/ Consider a donation // In case of problems make sure that you are using the font file with the correct version! -const uint8_t OpenSansLight12Bitmaps[] = { +const uint8_t SansLight12Bitmaps[] = { // Bitmap Data: 0x00, // ' ' @@ -98,7 +98,7 @@ const uint8_t OpenSansLight12Bitmaps[] = { 0xAA,0xAA,0xAA, // '|' 0xC1,0x08,0x42,0x10,0x84,0x21,0x30 // '}' }; -const GFXglyph OpenSansLight12Glyphs[] = { +const GFXglyph SansLight12Glyphs[] = { // bitmapOffset, width, height, xAdvance, xOffset, yOffset { 0, 1, 1, 4, 0, 0 }, // ' ' { 1, 2, 9, 4, 1, -9 }, // '!' @@ -195,5 +195,5 @@ const GFXglyph OpenSansLight12Glyphs[] = { { 585, 2, 12, 8, 3, -9 }, // '|' { 588, 5, 11, 5, 0, -9 } // '}' }; -//const Font OpenSansLight12 = { -//(uint8_t *)OpenSansLight12Bitmaps,(GFXglyph *)OpenSansLight12Glyphs,0x20, 0x7d, 17}; +GFXfont SansLight12 = {"SansLight12", +(uint8_t *)SansLight12Bitmaps,(GFXglyph *)SansLight12Glyphs,0x20, 0x7d, 17}; diff --git a/drv/display/opensanslight-14.h b/drv/display/opensanslight-14.h index 255890e..f6dc39c 100644 --- a/drv/display/opensanslight-14.h +++ b/drv/display/opensanslight-14.h @@ -1,6 +1,6 @@ // Created by http://oleddisplay.squix.ch/ Consider a donation // In case of problems make sure that you are using the font file with the correct version! -const uint8_t OpenSansLight14Bitmaps[] = { +const uint8_t SansLight14Bitmaps[] = { // Bitmap Data: 0x00, // ' ' @@ -98,7 +98,7 @@ const uint8_t OpenSansLight14Bitmaps[] = { 0x92,0x49,0x24,0x92,0x49,0x00, // '|' 0x82,0x10,0x84,0x20,0xC8,0x42,0x11,0x00 // '}' }; -const GFXglyph OpenSansLight14Glyphs[] = { +const GFXglyph SansLight14Glyphs[] = { // bitmapOffset, width, height, xAdvance, xOffset, yOffset { 0, 1, 1, 5, 0, 0 }, // ' ' { 1, 2, 10, 4, 1, -10 }, // '!' @@ -195,5 +195,5 @@ const GFXglyph OpenSansLight14Glyphs[] = { { 755, 3, 14, 9, 3, -11 }, // '|' { 761, 5, 12, 6, 1, -10 } // '}' }; -//const Font OpenSansLight14 = { -//(uint8_t *)OpenSansLight14Bitmaps,(GFXglyph *)OpenSansLight14Glyphs,0x20, 0x7D, 20}; +GFXfont SansLight14 = {"SansLight14", +(uint8_t *)SansLight14Bitmaps,(GFXglyph *)SansLight14Glyphs,0x20, 0x7D, 20}; diff --git a/drv/display/opensanslight-16.h b/drv/display/opensanslight-16.h index f5081f8..2212ee2 100644 --- a/drv/display/opensanslight-16.h +++ b/drv/display/opensanslight-16.h @@ -1,6 +1,6 @@ // Created by http://oleddisplay.squix.ch/ Consider a donation // In case of problems make sure that you are using the font file with the correct version! -const uint8_t OpenSansLight16Bitmaps[] = { +const uint8_t SansLight16Bitmaps[] = { // Bitmap Data: 0x00, // ' ' @@ -69,7 +69,8 @@ const uint8_t OpenSansLight16Bitmaps[] = { 0xFE, // '_' 0x84,0x20, // '`' 0x78,0x18,0x10,0x27,0xD0,0xA1,0x46,0x74, // 'a' - 0x00,0x00,0x00,0x00,0x78,0x84,0x82,0x02,0x02,0x02,0x82,0x84,0x78, // 'b' +// 0x00,0x00,0x00,0x00,0x78,0x84,0x82,0x02,0x02,0x02,0x82,0x84,0x78, // 'b' + 0x80,0x80,0x80,0x80,0xf8,0x84,0x82,0x82,0x82,0x82,0x82,0x84,0xf8, // 'b' 0x3C,0x82,0x04,0x08,0x10,0x20,0x20,0x3C, // 'c' 0x01,0x00,0x80,0x40,0x23,0xD2,0x1A,0x0D,0x02,0x81,0x40,0xA0,0xC8,0x63,0xD0, // 'd' 0x38,0x44,0x82,0x82,0xFE,0x80,0x80,0x40,0x3C, // 'e' @@ -83,7 +84,8 @@ const uint8_t OpenSansLight16Bitmaps[] = { 0xB9,0xE6,0x31,0x20,0x85,0x04,0x28,0x21,0x41,0x0A,0x08,0x50,0x42,0x82,0x10, // 'm' 0xBC,0xC4,0x82,0x82,0x82,0x82,0x82,0x82,0x82, // 'n' 0x38,0x44,0x82,0x82,0x82,0x82,0x82,0x44,0x38, // 'o' - 0x78,0x84,0x82,0x02,0x02,0x02,0x82,0x84,0x78,0x00,0x00,0x00,0x00, // 'p' +// 0x78,0x84,0x82,0x02,0x02,0x02,0x82,0x84,0x78,0x00,0x00,0x00,0x00, // 'p' + 0xf8,0x84,0x82,0x82,0x82,0x82,0x82,0x84,0xf8,0x80,0x80,0x80,0x80, // 'p' 0x3D,0x21,0xA0,0xD0,0x28,0x14,0x0A,0x0C,0x86,0x3D,0x00,0x80,0x40,0x20,0x10, // 'q' 0xBB,0x08,0x20,0x82,0x08,0x20,0x80, // 'r' 0x7A,0x08,0x30,0x30,0x20,0x82,0xF0, // 's' @@ -96,9 +98,12 @@ const uint8_t OpenSansLight16Bitmaps[] = { 0xF8,0x21,0x04,0x21,0x04,0x20,0xF8, // 'z' 0x31,0x10,0x84,0x21,0x10,0x42,0x10,0x84,0x10,0xC0, // '{' 0xAA,0xAA,0xAA,0xAA,0x80, // '|' - 0xC1,0x02,0x08,0x20,0x82,0x06,0x20,0x82,0x08,0x21,0x0C,0x00 // '}' + 0xC1,0x02,0x08,0x20,0x82,0x06,0x20,0x82,0x08,0x21,0x0C,0x00, // '}' + 0x71,0x8e, // '~' + 0x18,0x24,0x24,0x18 // degree }; -const GFXglyph OpenSansLight16Glyphs[] = { + +const GFXglyph SansLight16Glyphs[] = { // bitmapOffset, width, height, xAdvance, xOffset, yOffset { 0, 1, 1, 5, 0, 0 }, // ' ' { 1, 3, 12, 5, 1, -12 }, // '!' @@ -193,7 +198,10 @@ const GFXglyph OpenSansLight16Glyphs[] = { { 958, 6, 9, 8, 1, -9 }, // 'z' { 965, 5, 15, 7, 1, -12 }, // '{' { 975, 2, 17, 10, 4, -13 }, // '|' - { 980, 6, 15, 7, 1, -12 } // '}' + { 980, 6, 15, 7, 1, -12 }, // '}' + { 992, 8, 2, 10, 0, -7 }, // ~ + { 994, 8, 4, 8, 2, -13 }, // degree }; -//const Font OpenSansLight16 = { -//(uint8_t *)OpenSansLight16Bitmaps,(GFXglyph *)OpenSansLight16Glyphs,0x20, 0x7D, 23}; + +GFXfont SansLight16 = {"SansLight16", +(uint8_t *)SansLight16Bitmaps,(GFXglyph *)SansLight16Glyphs,0x20, 0x7F, 23}; diff --git a/drv/display/ssd130x.cpp b/drv/display/ssd130x.cpp index 8997218..9fa4b6b 100644 --- a/drv/display/ssd130x.cpp +++ b/drv/display/ssd130x.cpp @@ -41,6 +41,12 @@ #define TAG MODULE_SSD130X +#if 0 +#define log_devel log_dbug +#else +#define log_devel(...) +#endif + /* static Font NativeFont = { @@ -83,7 +89,7 @@ void SSD130X::clear() } -void SSD130X::fillRect(uint16_t x, uint16_t y, uint16_t w, uint16_t h, int32_t col) +void SSD130X::fillRect(uint16_t x, uint16_t y, uint16_t w, uint16_t h, int32_t c) { log_dbug(TAG,"fillRect(%u,%u,%u,%u)",x,y,w,h); if ((x > m_width) || (y >= m_height)) @@ -92,16 +98,17 @@ void SSD130X::fillRect(uint16_t x, uint16_t y, uint16_t w, uint16_t h, int32_t c w = m_width - x; if ((y+h) > m_height) h = m_height - y; + uint8_t col = c ? 0xff : 0; for (int i = x; i < x+w; ++i) { uint16_t y0 = y; uint16_t h0 = h; do { if (((y & 7) == 0) && (h0 >= 8)) { - drawByte(i,y0,0xff); + drawByte(i,y0,col); y0 += 8; h0 -= 8; } else { - setPixel(i,y0); + setPixel(i,y0,c); ++y0; --h0; } @@ -110,55 +117,24 @@ void SSD130X::fillRect(uint16_t x, uint16_t y, uint16_t w, uint16_t h, int32_t c } -uint16_t SSD130X::fontHeight() const +int32_t SSD130X::getColor(color_t c) const { - /* - switch (m_font) { - case -1: return 8; - case -2: return 16; + switch (c) { + case WHITE: + return 1; + case BLACK: + return 0; default: - return Fonts[m_font].yAdvance; + return 0; } - */ - return m_font->yAdvance; -} - - -uint16_t SSD130X::charsPerLine() const -{ - /* - if (m_font == font_nativedbl) - return m_width/CHAR_WIDTH<<1; - */ - return m_width/CHAR_WIDTH; } uint16_t SSD130X::numLines() const { - return m_height/fontHeight(); -} - - -int SSD130X::setFont(const char *fn) -{ - /* - if (0 == strcasecmp(fn,"native")) { - m_font = (fontid_t)-1; - return 0; - } - if (0 == strcasecmp(fn,"nativedbl")) { - m_font = (fontid_t)-2; - return 0; - } - */ - for (int i = 0; i < NumFontsBCM; ++i) { - if (0 == strcasecmp(FontsBCM[i].name,fn)) { - m_font = FontsBCM+i; - return 0; - } - } - return -1; + if (m_font) + return m_height/fontHeight(); + return m_height>>3; } @@ -200,19 +176,19 @@ int SSD130X::drawMasked(uint8_t x, uint8_t y, uint8_t b, uint8_t m) /* static uint16_t scaleDouble(uint8_t byte) { - uint16_t r = 0; - uint16_t m = 1; - for (uint8_t b = 0; b < 8; ++b) { - if (byte & (1<> 3; unsigned off = pg * m_width + x; uint8_t shl = y & 7; @@ -283,10 +259,12 @@ int SSD130X::drawByte(uint8_t x, uint8_t y, uint8_t b) m_dirty |= 1<first; - const uint8_t *off = m_font->bitmap + m_font->glyph[ch].bitmapOffset; + const uint8_t *off = m_font->BCMbitmap + m_font->glyph[ch].bitmapOffset; uint8_t w = m_font->glyph[ch].width; uint8_t h = m_font->glyph[ch].height; int8_t dx = m_font->glyph[ch].xOffset; @@ -385,7 +363,34 @@ unsigned SSD130X::drawChar(uint16_t x, uint16_t y, char c, int32_t fg, int32_t b log_dbug(TAG,"drawChar(%u,%u,'%c') with %ux%u",x,y,c,w,h); // log_info(TAG,"%d/%d %+d/%+d, adv %u len %u",(int)w,(int)h,(int)dx,(int)dy,a,l); clearRect(x,y,a,m_font->yAdvance); - drawBitmapNative(x+dx,y+dy+m_font->yAdvance-1,w,h,off); + drawBitmapNative(x+dx,y+dy,w,h,off); + return a; +} +#endif + + +unsigned SSD130X::drawChar(uint16_t x, uint16_t y, char c, int32_t fg, int32_t bg) +{ + PROFILE_FUNCTION(); + c = charToGlyph(c); + if ((c < m_font->first) || (c > m_font->last)) + return 0; + if (fg == -1) + fg = m_colfg; + if (bg == -1) + bg = m_colbg; + uint8_t ch = c - m_font->first; + const uint8_t *data = m_font->BCMbitmap + m_font->glyph[ch].bitmapOffset; + uint8_t w = m_font->glyph[ch].width; + uint8_t h = m_font->glyph[ch].height; + int8_t dx = m_font->glyph[ch].xOffset; + int8_t dy = m_font->glyph[ch].yOffset; + uint8_t a = m_font->glyph[ch].xAdvance; + log_dbug(TAG,"drawChar(%d,%d,'%c',%d,%d) = %u",x,y,c,fg,bg,a); +// log_info(TAG,"%d/%d %+d/%+d, adv %u char '%c'",(int)w,(int)h,(int)dx,(int)dy,a,c); + if (bg != -2) + fillRect(x,y,a,m_font->yAdvance,bg); + drawBitmap(x+dx,y+dy,w,h,data,fg,bg); return a; } @@ -461,14 +466,15 @@ static inline uint8_t getBits(const uint8_t *data, unsigned off, uint8_t numb) } -void SSD130X::drawBitmapNative(uint16_t x, uint16_t y, uint16_t w, uint16_t h, const uint8_t *data) +void SSD130X::drawBitmap(uint16_t x, uint16_t y, uint16_t w, uint16_t h, const uint8_t *data, int32_t fg, int32_t bg) { PROFILE_FUNCTION(); static const uint8_t masks[] = {0x1,0x3,0x7,0xf,0x1f,0x3f,0x7f}; unsigned len = w*h; uint16_t bitoff = 0; log_dbug(TAG,"drawBitmapNative(%u,%u,%u,%u) %u/%u",x,y,w,h,len,len/8); - for (uint8_t x0 = x; x0 < x+w; ++x0) { + for (uint16_t x0 = x; x0 < x+w; ++x0) { + assert(x0 >= x); uint8_t yoff = y; uint8_t numb = h; while (numb) { @@ -486,6 +492,7 @@ void SSD130X::drawBitmapNative(uint16_t x, uint16_t y, uint16_t w, uint16_t h, c if (byte) { // drawBits(x0,yoff,byte,numb); uint8_t pg = yoff >> 3; + m_dirty |= 1< xio_config(intr,cfg)) { log_warn(TAG,"config interrupt error"); - } else if (esp_err_t e = xio_set_intr(intr,intr_handler,this)) { + } else if (esp_err_t e = xio_set_intr(intr,intrHandler,this)) { log_warn(TAG,"error attaching interrupt: %s",esp_err_to_name(e)); } else { log_info(TAG,"BMP388@%u,0x%x: interrupt on GPIO%u",m_bus,m_addr,intr); @@ -173,7 +174,7 @@ void BMP388::attach(EnvObject *root) } -void BMP388::intr_handler(void *arg) +void BMP388::intrHandler(void *arg) { BMP388 *drv = (BMP388 *) arg; event_isr_trigger(drv->m_irqev); @@ -202,7 +203,14 @@ const char *BMP388::exeCmd(Terminal &term, int argc, const char **args) static const uint8_t coef[] = {0,1,3,7,15,31,63,127}; if (argc == 1) { - if (0 == strcmp(args[0],"iir")) { + if (0 == strcmp(args[0],"-h")) { + term.println( + "iir []: set IIR value\n" + "osr : read over-sampling rates\n" + "osrt : set over-sampling rate for temperature\n" + "osrp : set over-sampling rate for pressure\n" + ); + } else if (0 == strcmp(args[0],"iir")) { uint8_t iir; if (esp_err_t e = i2c_w1rd(m_bus,m_addr,REG_CONFIG,&iir,sizeof(iir))) return esp_err_to_name(e); @@ -309,17 +317,10 @@ void BMP388::handle_error() void BMP388::calc_tfine(uint32_t uncomp_temp) { -#if 1 + log_dbug(TAG,"T1=%g, T2=%g, T3=%g",D[T1],D[T2],D[T3]); float partial_data1 = (float)(uncomp_temp - D[T1]); float partial_data2 = (float)(partial_data1 * D[T2]); m_temp.set(partial_data2 + (partial_data1 * partial_data1) * D[T3]); -#else - uint64_t partial_data1 = (float)(uncomp_temp - D[T1]); - uint64_t partial_data2 = (float)(partial_data1 * D[T2]); - uint64_t comp_temp = partial_data2 + (partial_data1 * partial_data1) * D[T3]; - m_temp.set((float)comp_temp/100); - -#endif } @@ -358,18 +359,26 @@ int BMP388::read() uint8_t data[8]; if (int r = i2c_w1rd(m_bus,m_addr,REG_BASE,data,sizeof(data))) return r; + log_hex(TAG,data,sizeof(data),"data read:"); + if (data[0]) { + log_warn(TAG,"device error %x",data[0]); + return 1; + } + if ((data[1] & (BIT_ST_PRDY|BIT_ST_TRDY)) != (BIT_ST_PRDY|BIT_ST_TRDY)) { + log_warn(TAG,"data not ready"); + return 1; + } log_dbug(TAG,"status: temp %s, press %s, conf %s, cmd %s, %s" ,data[1]&0x40?"ready":"busy" ,data[1]&0x20?"ready":"busy" ,data[0]&0x4?"err":"ok" ,data[0]&0x2?"err":"ok" ,data[0]&0x1?"fatal":"ok" - ); - log_hex(TAG,data,sizeof(data),"data read:"); - uint32_t tempraw = (data[7]<<16) | (data[6]<<8) | data[5]; + ); + uint32_t tempraw = ((uint32_t)data[7]<<16) | ((uint32_t)data[6]<<8) | (uint32_t)data[5]; log_dbug(TAG,"tempraw = %u",tempraw); calc_tfine(tempraw); - uint32_t pressraw = (data[4]<<16) | (data[3]<<8) | data[2]; + uint32_t pressraw = ((uint32_t)data[4]<<16) | ((uint32_t)data[3]<<8) | (uint32_t)data[2]; calc_press(pressraw); #ifdef CONFIG_NEWLIB_LIBRARY_LEVEL_FLOAT_NANO log_dbug(TAG,"t=%G, p=%G",m_temp.get(),m_press.get()); @@ -407,6 +416,7 @@ int BMP388::init() { if (esp_err_t r = i2c_write2(m_bus, m_addr, REG_CMD, CMD_RESET)) log_warn(TAG,"failed to reset BMP388@%u,0x%x: %s",m_bus,m_addr,esp_err_to_name(r)); + vTaskDelay(10); uint8_t calib[21]; if (esp_err_t r = i2c_w1rd(m_bus,m_addr,CALIB_DATA,calib,sizeof(calib))) { @@ -415,15 +425,18 @@ int BMP388::init() } log_hex(TAG,calib,sizeof(calib),"calib:"); uint16_t t1 = ((uint16_t)calib[1] << 8) | calib[0]; - D[T1] = (float)t1 / powf(2,-8); +// D[T1] = (float)t1 / powf(2,-8); + D[T1] = (float)t1 / 0.003909625f; log_dbug(TAG,"t1 = %d, T1 = %g",t1,D[T1]); uint16_t t2 = ((uint16_t)calib[3] << 8) | calib[2]; - D[T2] = (float)t2 / powf(2,30); +// D[T2] = (float)t2 / powf(2,30); + D[T2] = (float)t2 / 1073741824.0; log_dbug(TAG,"t2 = %d, T2 = %g",t2,D[T2]); int8_t t3 = (int8_t)calib[4]; - D[T3] = (float)t3 / powf(2,48); +// D[T3] = (float)t3 / powf(2,48); + D[T3] = (float)t3 / 281474976710656.0; log_dbug(TAG,"t3 = %d, T3 = %g",t3,D[T3]); int16_t p1 = (calib[6] << 8) | calib[5]; diff --git a/drv/i2c/bmp388.h b/drv/i2c/bmp388.h index a3bdf63..fbc0182 100644 --- a/drv/i2c/bmp388.h +++ b/drv/i2c/bmp388.h @@ -44,7 +44,7 @@ struct BMP388 : public I2CDevice void calc_press(uint32_t); int flush_fifo(); static void trigger(void *); - static void intr_handler(void *); + static void intrHandler(void *); bool status(); virtual int sample(); virtual int read(); @@ -54,7 +54,7 @@ struct BMP388 : public I2CDevice int get_status(); EnvNumber m_temp, m_press; - float D[14]; + double D[14]; event_t m_irqev = 0; typedef enum { st_idle, st_sample, st_measure, st_read } state_t; state_t m_state = st_idle; diff --git a/drv/i2c/bmx.cpp b/drv/i2c/bmx.cpp index 65e08ed..f34a067 100644 --- a/drv/i2c/bmx.cpp +++ b/drv/i2c/bmx.cpp @@ -40,6 +40,7 @@ #include #include +// address 0x76,0x77 #define BME_ADDR_MIN 0xec #define BME_ADDR_MAX 0xee diff --git a/drv/i2c/bmx.h b/drv/i2c/bmx.h index ebd8072..deaf47b 100644 --- a/drv/i2c/bmx.h +++ b/drv/i2c/bmx.h @@ -29,11 +29,11 @@ struct BMP280 : public I2CDevice { BMP280(uint8_t port, uint8_t addr, const char *n = 0); - const char *drvName() const + const char *drvName() const override { return "bmp280"; } - int init(); - void attach(class EnvObject *); + int init() override; + void attach(class EnvObject *) override; #ifdef CONFIG_I2C_XCMD const char *exeCmd(struct Terminal &, int argc, const char **argv) override; #endif diff --git a/drv/i2c/bq25601d.cpp b/drv/i2c/bq25601d.cpp new file mode 100644 index 0000000..74f734c --- /dev/null +++ b/drv/i2c/bq25601d.cpp @@ -0,0 +1,633 @@ +/* + * Copyright (C) 2023, Thomas Maier-Komor + * Atrium Firmware Package for ESP + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include + +#ifdef CONFIG_BQ25601D + +#include "actions.h" +#include "bq25601d.h" +#include "cyclic.h" +#include "env.h" +#include "event.h" +#include "i2cdrv.h" +#include "log.h" +#include "stream.h" +#include "terminal.h" +#include "xio.h" + +#define TAG MODULE_BQ25 + +#define DEV_ADDR (0x6b<<1) +#define DEV_ID 0x2 +#define NUM_REGS 12 + + +static const char *topoff_str[] = { "disabled", "15min", "30min", "45min" }; +static const char *charge_str[] = { "off", "pre", "fast", "term" }; +static const char *chargeflt_str[] = { "ok", "input-fault", "thermal shutdown", "safety timeout" }; +static const char *vbus_str[] = { "none", "SDP/500mA", "CDP/1.5A", "DCP/2.4A", "500mA", "other", "OTG" }; +static const char *jeita_str[] = { "normal", "undef1", "warm", "cool", "undef4", "cold", "hot", "undef7" }; +static uint8_t SysMin[] = {26,28,30,32,34,35,36,37}; // deciVolt + +BQ25601D *Bq25Instance = 0; + + +BQ25601D::BQ25601D(uint8_t port, uint8_t addr, const char *n) +: I2CDevice(port,addr,n ? n : drvName()) +, m_pg("power-good",false) +, m_charge("charge","") +, m_vbus("Vbus","") +, m_onev(event_register(m_name,"`buson")) +, m_offev(event_register(m_name,"`busoff")) +{ + Bq25Instance = this; + action_add(concat(m_name,"!off"),powerDown,this,"enter HiZ mode"); +} + + +void BQ25601D::addIntr(uint8_t intr) +{ + /* + m_irqev = event_register(m_name,"`irq"); + log_info(TAG,"irqev %d",m_irqev); + Action *a = action_add(concat(m_name,"!isr"),processIntr,this,0); + event_callback(m_irqev,a); + xio_cfg_t cfg = XIOCFG_INIT; + cfg.cfg_io = xio_cfg_io_in; + cfg.cfg_pull = xio_cfg_pull_none; + cfg.cfg_intr = xio_cfg_intr_fall; + if (0 > xio_config(intr,cfg)) { + log_warn(TAG,"config interrupt error"); + } else if (esp_err_t e = xio_set_intr(intr,intrHandler,this)) { + log_warn(TAG,"error attaching interrupt: %s",esp_err_to_name(e)); + } else { + log_info(TAG,"BQ25601D@%u,0x%x: interrupt on GPIO%u",m_bus,m_addr,intr); + } + */ +} + + +void BQ25601D::attach(EnvObject *root) +{ + uint8_t regs[3]; + if (0 == i2c_w1rd(m_bus,DEV_ADDR,0x8,regs,sizeof(regs))) { + m_vbus.set(vbus_str[regs[0]>>5]); + m_pg.set(regs[0]&0x4); + if (uint8_t flt = (regs[1]>>4)&0x3) + m_charge.set(chargeflt_str[flt]); + else + m_charge.set(charge_str[(regs[0]>>3)&0x3]); + } + cyclic_add_task(m_name,cyclic,this,0); + root->add(&m_vbus); + root->add(&m_charge); + root->add(&m_pg); +} + + +unsigned BQ25601D::cyclic(void *arg) +{ + BQ25601D *dev = (BQ25601D *)arg; + return dev->cyclic(); +} + + +unsigned BQ25601D::cyclic() +{ + uint8_t regs[3]; + if (esp_err_t e = i2c_w1rd(m_bus,DEV_ADDR,0x8,regs,sizeof(regs))) { + log_warn(TAG,"i2c error: %s",esp_err_to_name(e)); + return 1000; + } +// log_hex(TAG,regs,sizeof(regs),"cyclic"); + if (uint8_t reg08c = regs[0] ^ m_regs[0x8]) { + log_dbug(TAG,"reg08 changed: 0x%02x",regs[0]); + if (reg08c & 0xe0) { + log_dbug(TAG,"vbus status: %s",vbus_str[regs[0]>>5]); + event_trigger(((regs[0]>>5) != 0) ? m_onev : m_offev); + m_vbus.set(vbus_str[regs[0]>>5]); + } + if (reg08c & 0x18) { + const char *crg = charge_str[(regs[0]>>3)&0x3]; + log_dbug(TAG,"charge status: %s",crg); + m_charge.set(crg); + } + if (reg08c & 0x4) { + bool pg = regs[0]&0x4; + log_dbug(TAG,"power %s",pg ? "good" : "fault"); + m_pg.set(pg); + } + if (reg08c & 0x2) + log_dbug(TAG,"thermal regulation %sactive",regs[0]&0x2 ? "" : "in"); + if (reg08c & 0x1) + log_dbug(TAG,"Vsysmin regulation %sactive",regs[0]&0x1 ? "" : "in"); + m_regs[0x8] = regs[0]; + } + if (uint8_t reg09c = regs[1] ^ m_regs[0x9]) { + log_dbug(TAG,"reg09 changed: 0x%02x",regs[1]); + if (reg09c & 0x80) + log_dbug(TAG,"watchdog %s",regs[1]&0x80?"expired":"ok"); + if (reg09c & 0x40) + log_dbug(TAG,"boost %s",regs[1]&0x40?"fault":"ok"); + if (reg09c & 0x30) { + uint8_t flt = (regs[1]>>4)&0x3; + log_dbug(TAG,"charge %s",chargeflt_str[flt]); + if (flt) + m_charge.set(chargeflt_str[flt]); + } + if (reg09c & 0x8) + log_dbug(TAG,"BAT %s",regs[1]&0x8?"OVP":"ok"); + if (reg09c & 0x7) + log_dbug(TAG,"JEITA %s",jeita_str[regs[1]&0x7]); + m_regs[0x9] = regs[1]; + } + if (uint8_t reg0ac = regs[2] ^ m_regs[0xa]) { + log_dbug(TAG,"reg0a changed: 0x%02x",regs[2]); + if (reg0ac & 0x80) + log_dbug(TAG,"Vbus %s",regs[2]&0x80?"attached":"off"); + if (reg0ac & 0x40) + log_dbug(TAG,"VinDPM %s",regs[2]&0x40?"active":"off"); + if (reg0ac & 0x20) + log_dbug(TAG,"IinDPM %s",regs[2]&0x20?"active":"off"); + if (reg0ac & 0x8) + log_dbug(TAG,"top-off %s",regs[2]&0x8?"counting":"expired"); + m_regs[0xa] = regs[2]; + } + return 100; +} + + +void BQ25601D::powerDown(void *arg) +{ + BQ25601D *dev = (BQ25601D *) arg; + uint8_t reg00; + if (i2c_w1rd(dev->m_bus,DEV_ADDR,0x00,®00,sizeof(reg00))) + log_warn(TAG,"I2C error"); + reg00 |= (1<<7); + if (i2c_write2(dev->m_bus,DEV_ADDR,0x00,reg00)) + log_warn(TAG,"I2C error"); + uint8_t reg07; + if (i2c_w1rd(dev->m_bus,DEV_ADDR,0x07,®07,sizeof(reg07))) { + log_warn(TAG,"I2C error"); + } else { + reg07 |= (1<<5); + if (i2c_write2(dev->m_bus,DEV_ADDR,0x07,reg07)) + log_warn(TAG,"I2C error"); + } +} + + +#ifdef CONFIG_I2C_XCMD +const char *BQ25601D::exeCmd(Terminal &term, int argc, const char **args) +{ + if (argc == 0) { + if (i2c_w1rd(m_bus,DEV_ADDR,0x0,m_regs,sizeof(m_regs))) + return "I2C error."; + uint8_t reg08 = m_regs[8]; + term.printf( + "VBus: %s\n" + "HiZ: %s\n" + "charging: %s\n" + "power: %s\n" + "thermal: %s regulation\n" + "Vbat %c Vsys\n" + , vbus_str[reg08>>5] + , m_regs[0] & 0x80 ? "on" : "off" + , charge_str[(reg08 >> 2) & 3] + , reg08 & 4 ? "good" : "unstable" + , reg08 & 2 ? "in" : "no" + , reg08 & 1 ? '>' : '<' + ); + uint8_t reg09 = m_regs[9]; + term.printf( + "WD %s, VBUS %s, charge %s, BAT %s, JEITA %s\n" + , reg09 & 0x80 ? "expired" : "OK" + , reg09 & 0x40 ? "fault" : "OK" + , chargeflt_str[(reg09>>4) & 0x3] + , reg09 & 0x8 ? "ok" : "OVP" + , jeita_str[reg09 & 0x7] + ); + uint8_t reg0a = m_regs[0xa]; + term.printf( + "VBus %sattached\n" + "%sin VINDPM\n" + "%sin IINDPM\n" + "top-off %sactive\n" + "%sin ACOV\n" + , reg0a&0x80 ?"":"not " + , reg0a&0x40 ?"":"not " + , reg0a&0x20 ?"":"not " + , reg0a&0x8 ?"":"not " + , reg0a&0x4 ?"":"not " + ); + term.printf("Ipre %4umA\n",(m_regs[3]>>4)*60+60); + term.printf("Ichg %4umA\n",(m_regs[2]&0x3f)*60); + term.printf("Iterm %4umA\n",(m_regs[3]&0xf)*60+60); + term.printf("Imax %4umA\n",(m_regs[0]&0x1f)*100); + } else { + if (0 == strcmp(args[0],"-h")) { + term.println( + "hiz [] : hi-Z mode\n" + "pfm [] : PFM mode\n" + "q1on [] : Q1 full-on mode\n" + "batfet [] : BATFET mode\n" + "vreg [] : Vreg voltage in mV\n" + "boostv [] : boost voltage in mV\n" + "vsysmin [] : minimum system voltage in mV\n" + "iterm [] : termination current in mA\n" + "ipre [] : pre-charge current in mA\n" + "ichg [] : charge current in mA\n" + ); + } else if (0 == strcmp(args[0],"vreg")) { + uint8_t reg04; + if (i2c_w1rd(m_bus,DEV_ADDR,0x04,®04,sizeof(reg04))) + return "I2C error."; + if (argc == 1) { + unsigned vreg = 3847; + vreg += (reg04 & 0xf8) << 2; + unsigned topoff = (reg04 >> 1) & 3; + term.printf("vreg %umV, topoff %s, recharge %u00mV\n",vreg,topoff_str[topoff],(reg04&1)+1); + } else { + char *e; + long l = strtol(args[1],&e,0); + if (*e || (l < 3847) || (l > 4650)) + return "Invalid argument #1."; + l -= 3847; + l >>= 2; + l &= 0xf1; + l |= reg04 & 7; + if (i2c_write2(m_bus,DEV_ADDR,0x04,(uint8_t)l)) + return "I2C error."; + m_regs[0x04] = reg04; + } + } else if (0 == strcmp(args[0],"batfet")) { + uint8_t reg07; + if (i2c_w1rd(m_bus,DEV_ADDR,0x07,®07,sizeof(reg07))) + return "I2C error."; + if (argc == 1) { + term.printf("batfet %sabled\n",(reg07>>5)&1 ? "dis" : "en"); + } else { + bool b; + if (arg_bool(args[1],&b)) + return "Invalid argument #2."; + if (b) + reg07 &= ~(1<<5); + else + reg07 |= (1<<5); + if (i2c_write2(m_bus,DEV_ADDR,0x07,reg07)) + return "I2C error."; + m_regs[0x07] = reg07; + } + } else if (0 == strcmp(args[0],"hiz")) { + uint8_t reg00; + if (i2c_w1rd(m_bus,DEV_ADDR,0x00,®00,sizeof(reg00))) + return "I2C error."; + if (argc == 1) { + term.printf("HiZ %sabled\n",(reg00>>7)&1 ? "en" : "dis"); + } else { + bool b; + if (arg_bool(args[1],&b)) + return "Invalid argument #2."; + if (b) + reg00 |= (1<<7); + else + reg00 &= ~(1<<7); + if (i2c_write2(m_bus,DEV_ADDR,0x00,reg00)) + return "I2C error."; + m_regs[0x0] = reg00; + } + } else if (0 == strcmp(args[0],"pfm")) { + uint8_t reg01; + if (i2c_w1rd(m_bus,DEV_ADDR,0x01,®01,sizeof(reg01))) + return "I2C error."; + if (argc == 1) { + term.printf("PFM %sabled\n",(reg01>>7)&1 ? "dis" : "en"); + } else { + bool b; + if (arg_bool(args[1],&b)) + return "Invalid argument #2."; + if (b) + reg01 &= ~(1<<7); + else + reg01 |= (1<<7); + if (i2c_write2(m_bus,DEV_ADDR,0x01,reg01)) + return "I2C error."; + m_regs[0x01] = reg01; + } + } else if (0 == strcmp(args[0],"boostv")) { + uint8_t reg06; + if (i2c_w1rd(m_bus,DEV_ADDR,0x06,®06,sizeof(reg06))) + return "I2C error."; + if (argc == 1) { + term.printf("boostv %umV\n",((reg06>>4)&3)*150+4850); + } else { + char *e; + long l = strtol(args[1],&e,0); + if (*e || (l < 4850) || (l > 5300)) + return "Invalid argument #2."; + l -= 4850; + l /= 150; + reg06 &= 0xcf; + reg06 |= (l & 0x3) << 4; +// term.printf("reg06: 0x%x\n",reg06); + if (i2c_write2(m_bus,DEV_ADDR,0x06,reg06)) + return "I2C error."; + m_regs[0x06] = reg06; + } + } else if (0 == strcmp(args[0],"imax")) { + uint8_t reg00; + if (i2c_w1rd(m_bus,DEV_ADDR,0x00,®00,sizeof(reg00))) + return "I2C error."; + if (argc == 1) { + term.printf("Imax %umA\n",(reg00&0x1f)*100); + } else { + char *e; + long l = strtol(args[1],&e,0); + if (*e || (l < 100) || (l > 3200)) + return "Invalid argument #2."; + l /= 100; + reg00 &= 0xe0; + reg00 |= l & 0x1f; + if (i2c_write2(m_bus,DEV_ADDR,0x00,reg00)) + return "I2C error."; + m_regs[0x0] = reg00; + } + } else if (0 == strcmp(args[0],"iterm")) { + uint8_t reg03; + if (i2c_w1rd(m_bus,DEV_ADDR,0x03,®03,sizeof(reg03))) + return "I2C error."; + if (argc == 1) { + term.printf("Iterm %umA\n",(reg03&0xf)*60+60); + } else { + char *e; + long l = strtol(args[1],&e,0); + if (*e || (l < 60) || (l > 960)) + return "Invalid argument #2."; + l -= 60; + l /= 60; + reg03 &= 0xf0; + reg03 |= l & 0xf; + if (i2c_write2(m_bus,DEV_ADDR,0x03,reg03)) + return "I2C error."; + m_regs[0x3] = reg03; + } + } else if (0 == strcmp(args[0],"ipre")) { + uint8_t reg03; + if (i2c_w1rd(m_bus,DEV_ADDR,0x03,®03,sizeof(reg03))) + return "I2C error."; + if (argc == 1) { + term.printf("Ipre %umA\n",(reg03>>4)*60+60); + } else { + char *e; + long l = strtol(args[1],&e,0); + if (*e || (l < 60) || (l > 780)) + return "Invalid argument #2."; + l -= 60; + l /= 60; + reg03 &= 0xf; + reg03 |= (l & 0xf)<<4; + if (i2c_write2(m_bus,DEV_ADDR,0x03,reg03)) + return "I2C error."; + m_regs[0x3] = reg03; + } + } else if (0 == strcmp(args[0],"ichg")) { + uint8_t reg02; + if (i2c_w1rd(m_bus,DEV_ADDR,0x02,®02,sizeof(reg02))) + return "I2C error."; + if (argc == 1) { + term.printf("Ichg %umA\n",(reg02&0x3f)*60); + } else { + char *e; + long l = strtol(args[1],&e,0); + if (*e || (l < 0) || (l > 3000)) + return "Invalid argument #2."; + l /= 60; + reg02 &= 0xc0; + reg02 |= l & 0x3f; + if (i2c_write2(m_bus,DEV_ADDR,0x02,reg02)) + return "I2C error."; + m_regs[0x2] = reg02; + } + } else if (0 == strcmp(args[0],"vsysmin")) { + uint8_t reg01; + if (i2c_w1rd(m_bus,DEV_ADDR,0x01,®01,sizeof(reg01))) + return "I2C error."; + if (argc == 1) { + term.printf("Vsysmin %umV\n",SysMin[reg01>>1&0x7]*100); + } else { + char *e; + long l = strtol(args[1],&e,0); + if (*e || (l < 2600) || (l > 3700)) + return "Invalid argument #2."; + l /= 100; + uint8_t v = 0; + while (SysMin[v] < l) + ++v; + reg01 &= 0xf1; + reg01 |= v << 1; + if (i2c_write2(m_bus,DEV_ADDR,0x01,reg01)) + return "I2C error."; + m_regs[0x1] = reg01; + } + } else if (0 == strcmp(args[0],"vindpm")) { + uint8_t reg06; + if (i2c_w1rd(m_bus,DEV_ADDR,0x06,®06,sizeof(reg06))) + return "I2C error."; + term.printf("vindpm %umV\n",((reg06)&0xf)*100+3900); + } else if (0 == strcmp(args[0],"q1on")) { + // Q1On is only relevant when boost is disabled + uint8_t reg02; + if (i2c_w1rd(m_bus,DEV_ADDR,0x02,®02,sizeof(reg02))) + return "I2C error."; + if (argc == 1) { + term.printf("Q1 %s\n",reg02 & 0x40 ? "fullon" : "auto"); + } else { + bool on; + if (arg_bool(args[1],&on)) + return "Invalid argument #2."; + if (on) + reg02 |= 0x40; + else + reg02 &= ~0x40; + if (i2c_write2(m_bus,DEV_ADDR,0x02,reg02)) + return "I2C error."; + m_regs[0x2] = reg02; + } + } else if (0 == strcmp(args[0],"regs")) { + if (i2c_w1rd(m_bus,DEV_ADDR,0x00,m_regs,sizeof(m_regs))) + return "I2C error."; + term.print_hex(m_regs,sizeof(m_regs)); + /* + } else if (0 == strcmp(args[0],"topoff")) { + uint8_t reg04; + if (i2c_w1rd(m_bus,DEV_ADDR,0x04,®04,sizeof(reg04))) + return "I2C error."; + if (argc == 1) { + unsigned topoff = (reg04 >> 1) & 3; + term.printf("topoff %s\n",topoff_str[topoff]); + } + */ + } else { + return "Invalid argument #1."; + } + } + return 0; +} +#endif + + +void IRAM_ATTR BQ25601D::intrHandler(void *arg) +{ + BQ25601D *drv = (BQ25601D *) arg; + if (drv != 0) { + ++drv->m_irqcnt; + event_isr_trigger(drv->m_irqev); + } +} + + +inline void BQ25601D::processIntr() +{ + // read status registers 0x8..0xa + uint8_t oldreg09, newreg09; + if (esp_err_t e = i2c_w1rd(m_bus,DEV_ADDR,0x9,&oldreg09,sizeof(oldreg09))) { + log_warn(TAG,"i2c error: %s",esp_err_to_name(e)); + return; + } + if (oldreg09 != m_regs[0x9]) + log_warn(TAG,"missed flags update"); + if (esp_err_t e = i2c_w1rd(m_bus,DEV_ADDR,0x9,&newreg09,sizeof(newreg09))) { + log_warn(TAG,"i2c error: %s",esp_err_to_name(e)); + return; + } + uint8_t regs[3]; + if (esp_err_t e = i2c_w1rd(m_bus,DEV_ADDR,0x8,regs,sizeof(regs))) { + log_warn(TAG,"i2c error: %s",esp_err_to_name(e)); + return; + } + if (newreg09 != m_regs[0x9]) + log_warn(TAG,"unexpected flags update"); + log_hex(TAG,regs,sizeof(regs),"interrupt"); + log_hex(TAG,m_regs+8,sizeof(regs),"old"); + if (uint8_t reg08c = regs[0] ^ m_regs[0x8]) { + if (reg08c & 0xe0) { + log_info(TAG,"vbus status: %s",vbus_str[regs[0]>>5]); + event_trigger((regs[0]>>5) != 0 ? m_onev : m_offev); + } + if (reg08c & 0x18) + log_info(TAG,"charge status: %s",charge_str[(regs[0]>>3)&0x3]); + if (reg08c & 0x4) + log_info(TAG,"power %s",regs[0]&0x4 ? "good" : "fault"); + if (reg08c & 0x2) + log_info(TAG,"thermal regulation %sactive",regs[0]&0x2 ? "" : "in"); + if (reg08c & 0x1) + log_info(TAG,"Vsysmin regulation %sactive",regs[0]&0x1 ? "" : "in"); + m_regs[0x8] = regs[0]; + } + if (uint8_t reg09c = regs[1] ^ m_regs[0x9]) { + if (reg09c & 0x80) + log_info(TAG,"watchdog %s",regs[1]&0x80?"expired":"ok"); + if (reg09c & 0x40) + log_info(TAG,"boost %s",regs[1]&0x40?"fault":"ok"); + if (reg09c & 0x30) + log_info(TAG,"charge %s",chargeflt_str[(regs[1]>>4)&0x3]); + if (reg09c & 0x8) + log_info(TAG,"BAT %s",regs[1]&0x8?"OVP":"ok"); + if (reg09c & 0x7) + log_info(TAG,"JEITA %s",jeita_str[regs[1]&0x7]); + m_regs[0x9] = regs[1]; + } + if (uint8_t reg0ac = regs[2] ^ m_regs[0xa]) { + if (reg0ac & 0x80) + log_info(TAG,"Vbus %s",regs[2]&0x80?"attached":"off"); + if (reg0ac & 0x40) + log_info(TAG,"VinDPM %s",regs[2]&0x40?"active":"off"); + if (reg0ac & 0x20) + log_info(TAG,"IinDPM %s",regs[2]&0x20?"active":"off"); + if (reg0ac & 0x8) + log_info(TAG,"top-off %s",regs[2]&0x8?"counting":"expired"); + m_regs[0xa] = regs[2]; + } +} + + +void BQ25601D::processIntr(void *arg) +{ + BQ25601D *dev = (BQ25601D *) arg; + dev->processIntr(); +} + + +BQ25601D *BQ25601D::scan(uint8_t bus) +{ + log_dbug(TAG,"scan bq25601d"); + uint8_t data[NUM_REGS]; + if (esp_err_t e = i2c_w1rd(bus,DEV_ADDR,0x0,data,sizeof(data))) { + log_dbug(TAG,"device scan failed: %s",esp_err_to_name(e)); + return 0; + } + + uint8_t reg0b = data[11]; + log_hex(TAG,data,sizeof(data),"registers"); + uint8_t id = (reg0b >> 3) & 0xf; + if (id != DEV_ID) { + log_dbug(TAG,"unsupported device id 0x%x",id); + return 0; + } + log_dbug(TAG,"revision %d",id&3); + return new BQ25601D(bus,DEV_ADDR); +} + + +int BQ25601D::setImax(unsigned imax) +{ + /* reg02 Ichg + uint8_t reg02 = m_regs[0x2]; + if (imax > 3000) + imax = 3000; + imax /= 60; + reg02 &= 0xc0; + reg02 |= imax & 0x3f; + if (i2c_write2(m_bus,DEV_ADDR,0x02,reg02)) + return -1; + m_regs[0x2] = reg02; + return (reg02&0x3f)*60; + */ + uint8_t reg00 = m_regs[0]; + if (imax > 3200) + imax = 3200; + imax /= 100; + reg00 &= 0xe0; + reg00 |= imax & 0x1f; + if (i2c_write2(m_bus,DEV_ADDR,0x00,reg00)) + return -1; + return imax * 100; +} + + +int BQ25601D::getImax() +{ + uint8_t reg00; + if (i2c_w1rd(m_bus,DEV_ADDR,0x02,®00,sizeof(reg00))) + return -1; + m_regs[0] = reg00; + return (reg00&0x1f)*100; +} + +#endif diff --git a/drv/i2c/bq25601d.h b/drv/i2c/bq25601d.h new file mode 100644 index 0000000..cdbde18 --- /dev/null +++ b/drv/i2c/bq25601d.h @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2023, Thomas Maier-Komor + * Atrium Firmware Package for ESP + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef BQ25601D_H +#define BQ25601D_H + +#include +#include "charger.h" +#include "i2cdrv.h" +#include "env.h" +#include "event.h" + + +struct BQ25601D : public I2CDevice +#ifdef CONFIG_ESP_PHY_ENABLE_USB + , public Charger +#endif +{ + BQ25601D(uint8_t port, uint8_t addr, const char *n = 0); + + void addIntr(uint8_t gpio) override; + void attach(class EnvObject *) override; + + const char *drvName() const override + { return "bq25601d"; } + + static BQ25601D *scan(uint8_t); + +#ifdef CONFIG_I2C_XCMD + const char *exeCmd(struct Terminal &, int argc, const char **argv) override; +#endif + int getImax(); + int setImax(unsigned imax); + + protected: + static void intrHandler(void *arg); + static void processIntr(void *arg); + static void powerDown(void *arg); + void processIntr(); + static unsigned cyclic(void *); + unsigned cyclic(); + EnvBool m_pg; + EnvString m_charge, m_vbus; + unsigned m_irqcnt = 0; + uint8_t m_regs[0xb]; + event_t m_irqev = 0, m_onev = 0, m_offev = 0; +}; + + +#endif diff --git a/drv/i2c/ccs811b.cpp b/drv/i2c/ccs811b.cpp index a78e33f..1e2493a 100644 --- a/drv/i2c/ccs811b.cpp +++ b/drv/i2c/ccs811b.cpp @@ -195,11 +195,11 @@ unsigned CCS811B::read() uint8_t data[6]; if (i2c_w1rd(m_bus,m_addr,REG_DATA,data,sizeof(data))) { log_warn(TAG,"I2C error"); - return 0; + return 5000; } if ((data[4] & STATUS_FLAG_ERROR) != 0) { log_dbug(TAG,"error 0x%x",data[5]); - return 0; + return 5000; } if ((data[4] & STATUS_DATA_READY) == 0) { ++m_cnt; return 10; @@ -269,8 +269,9 @@ unsigned ccs811b_scan(uint8_t bus) uint8_t hwid; if (i2c_read(bus,addr,&hwid,1)) continue; - if (hwid != CCS811B_HWID) - continue; + log_dbug(TAG,"device hwid 0x%02x",hwid); +// if (hwid != CCS811B_HWID) +// continue; uint8_t hwver; if (i2c_w1rd(bus,addr,REG_HW_VER,&hwver,sizeof(hwver))) continue; diff --git a/drv/i2c/i2cdrv.cpp b/drv/i2c/i2cdrv.cpp index 6b72dc9..35bd815 100644 --- a/drv/i2c/i2cdrv.cpp +++ b/drv/i2c/i2cdrv.cpp @@ -22,6 +22,7 @@ #include "bmx.h" #include "bmp388.h" +#include "bq25601d.h" #include "i2cdrv.h" #include "log.h" @@ -50,6 +51,31 @@ I2CDevice *I2CDevice::m_first = 0; static uint8_t Ports = 0; static SemaphoreHandle_t Mtx = 0; +#ifdef CONFIG_ESP_PHY_ENABLE_USB +static Charger *ChargerInstance; + +Charger::Charger() +{ + ChargerInstance = this; +} + +Charger *Charger::getInstance() +{ return ChargerInstance; } +#else +Charger::Charger() +{ +} + +Charger *Charger::getInstance() +{ return 0; } +#endif + +int Charger::setImax(unsigned mA) +{ return -1; } + +int Charger::getImax() +{ return -1; } + I2CDevice::I2CDevice(uint8_t bus, uint8_t addr, const char *name) : m_bus(bus), m_addr(addr) @@ -466,6 +492,9 @@ int i2c_init(uint8_t port, uint8_t sda, uint8_t scl, unsigned freq, uint8_t xpul #ifdef CONFIG_APDS9930 log_info(TAG,"search apds9930"); n += apds9930_scan(port); +#endif +#ifdef CONFIG_BQ25601D + BQ25601D::scan(port); #endif n += ti_scan(port); /* diff --git a/drv/i2c/ina2xx.cpp b/drv/i2c/ina2xx.cpp index 05bf014..cb7980c 100644 --- a/drv/i2c/ina2xx.cpp +++ b/drv/i2c/ina2xx.cpp @@ -95,8 +95,20 @@ INA219 *INA219::create(uint8_t bus, uint8_t addr) addr <<= 1; log_info(TAG,"checking for INA219 at %d/0x%x",bus,addr); uint8_t v[2]; - if (i2c_w1rd(bus,addr,INA_REG_CONF,v,sizeof(v))) - return 0; + if (addr) { + if (i2c_w1rd(bus,addr,INA_REG_CONF,v,sizeof(v))) + return 0; + } else { + esp_err_t err; + for (addr = 0x40; addr < 0x50; ++addr) { + err = i2c_w1rd(bus,addr<<1,INA_REG_CONF,v,sizeof(v)); + if (err == 0) + break; + } + if (err) + return 0; + addr <<= 1; + } uint16_t rv = (v[0] << 8) | v[1]; log_dbug(TAG,"config = 0x%x",rv); if (rv != INA_CONF_RESET_VALUE) { @@ -107,7 +119,7 @@ INA219 *INA219::create(uint8_t bus, uint8_t addr) return 0; rv = (v[0] << 8) | v[1]; if (rv != INA_CONF_RESET_VALUE) - return 0; + log_warn(TAG,"unexpected config %04x",rv); } char nvsn[32]; sprintf(nvsn,"ina219@%u,%x.cfg",bus,addr); diff --git a/drv/i2c/opt3001.cpp b/drv/i2c/opt3001.cpp index 521a021..1002a41 100644 --- a/drv/i2c/opt3001.cpp +++ b/drv/i2c/opt3001.cpp @@ -56,6 +56,10 @@ #define TAG MODULE_OPT3001 +#if 0 +// normally not needed, pure polling +#define ISR_SUPPORT +#endif static const float Ranges[] = { 40.95, 81.90, 163.8, 327.6, 655.2, 1310.4, 2620.8 @@ -73,6 +77,7 @@ OPT3001::OPT3001(unsigned bus, unsigned addr) void OPT3001::addIntr(uint8_t gpio) { +#ifdef ISR_SUPPORT m_isrev = event_register(m_name,"`isr"); xio_cfg_t cfg = XIOCFG_INIT; cfg.cfg_io = xio_cfg_io_in; @@ -83,6 +88,7 @@ void OPT3001::addIntr(uint8_t gpio) } else if (xio_set_intr(gpio,intrHandler,this)) { log_warn(TAG,"add handler for gpio %u interrupt failed",gpio); } +#endif } void OPT3001::attach(EnvObject *root) @@ -121,8 +127,7 @@ OPT3001 *OPT3001::create(unsigned bus, unsigned addr) #ifdef CONFIG_I2C_XCMD const char *OPT3001::exeCmd(Terminal &term, int argc, const char **args) { - // TODO - return 0; + return "Not implimented."; } #endif @@ -142,8 +147,10 @@ int OPT3001::init() void OPT3001::intrHandler(void *arg) { +#ifdef ISR_SUPPORT OPT3001 *dev = (OPT3001 *) arg; event_isr_trigger(dev->m_isrev); +#endif } @@ -155,7 +162,7 @@ int OPT3001::read() m_lum.set(NAN); return r; } - log_dbug(TAG,"status: %s%s%s" + log_dbug(TAG,"status:%s%s%s" , data[1]&0x80?" CRF":"" , data[1]&0x40?" FH":"" , data[1]&0x20?" FL":"" diff --git a/drv/i2c/sgp30.cpp b/drv/i2c/sgp30.cpp index 6a8021b..4699c4a 100644 --- a/drv/i2c/sgp30.cpp +++ b/drv/i2c/sgp30.cpp @@ -55,7 +55,7 @@ static const char *States[] = { "bist", "get-serial", "get-version", - "read-bist" + "read-bist", "read-data", "read-serial", "read-version", @@ -157,7 +157,7 @@ unsigned SGP30::cyclic() e = selftest_start(); if (0 == e) { m_state = st_readb; - return 220; + return 250; } break; case st_gets: @@ -370,6 +370,7 @@ int SGP30::selftest_finish() if (e) { log_warn(TAG,"selftest read failed: %s",esp_err_to_name(e)); } else { + log_hex(TAG,selftest,sizeof(selftest),"selftest"); if ((selftest[0] != 0xd4) || (selftest[1] != 0)) { log_warn(TAG,"selftest failure %x",(((unsigned)selftest[1])<<8)|((unsigned)selftest[0])); e = ESP_ERR_INVALID_RESPONSE; @@ -486,6 +487,16 @@ unsigned sgp30_scan(uint8_t bus) uint8_t vercmd[] = { SGP30_ADDR, REG_BASE, REG_GET_VERS }; if (0 != i2c_write(bus,vercmd,sizeof(vercmd),false,true)) return 0; + vTaskDelay(5); + uint8_t version[3]; + if (0 != i2c_read(bus,SGP30_ADDR,version,sizeof(version))) + return 0; + uint8_t crc = crc8_0x31(version,2); + if (crc != version[2]) { + log_dbug(TAG,"version CRC mismatch"); + return 0; + } + log_info(TAG,"SGP30 %02x %02x",version[0],version[1]); return SGP30::create(bus) != 0; } diff --git a/drv/i2c/sgp30.h b/drv/i2c/sgp30.h index 92839f4..c3d7127 100644 --- a/drv/i2c/sgp30.h +++ b/drv/i2c/sgp30.h @@ -58,7 +58,7 @@ struct SGP30 : public I2CDevice int read_serial(); int read_version(); - typedef enum { st_none, st_init, st_bist, st_gets, st_getv, st_readb, st_readd + typedef enum { st_none = 0, st_init, st_bist, st_gets, st_getv, st_readb, st_readd , st_reads, st_readv, st_iaq, st_idle, st_update, st_measure, st_error } state_t; enum { f_ver = 1, f_ser = 2, f_bist = 4, f_iaq = 8 }; diff --git a/drv/i2c/sh1106.cpp b/drv/i2c/sh1106.cpp index 5785999..d4a77a0 100644 --- a/drv/i2c/sh1106.cpp +++ b/drv/i2c/sh1106.cpp @@ -43,6 +43,9 @@ #define SH1106_ADDR1 0x3d #define CMD_NOP 0xe3 +#define CMD_DISP_OFF 0xae +#define CMD_DISP_ON 0xaf +#define CMD_OUTPUT_RAM 0xa4 #define TAG MODULE_SSD130X @@ -55,7 +58,7 @@ SH1106::SH1106(uint8_t bus, uint8_t addr) : I2CDevice(bus,addr,drvName()) { Instance = this; - log_info(TAG,"ssd1306 at %u,0x%x",bus,addr); + log_info(TAG,"sh1106 at %u,0x%x",bus,addr); } @@ -95,8 +98,8 @@ int SH1106::init(uint8_t maxx, uint8_t maxy, uint8_t hwcfg) if (i2c_write(m_bus,setup,sizeof(setup),1,1)) return 1; */ - xmitCmd(0xae); - xmitCmd(0xa4); + xmitCmd(CMD_DISP_OFF); + xmitCmd(CMD_OUTPUT_RAM); vTaskDelay(100); clear(); flush(); @@ -165,6 +168,7 @@ void SH1106::flush() uint8_t numpg = m_height / 8 + ((m_height & 7) != 0); unsigned pgs = m_width; if (m_dirty) { + log_dbug(TAG,"dirty 0x%x",m_dirty); for (uint8_t p = 0; p < numpg; p++) { if (m_dirty & (1<= m_width) || (y >= m_height)) { - log_dbug(TAG,"off display %u,%u",x,y); - return 1; - } - uint8_t shift = y & 7; - uint8_t pg = y >> 3; - uint16_t idx = pg * m_width + x; - uint8_t b0 = m_disp[idx]; - if (shift) { - b0 >>= shift; - idx += m_width; - if (idx < (m_width*m_height)) { - uint8_t b1 = m_disp[idx]; - b1 <<= (8-shift); - b0 |= b1; - } - } - *b = b0; - return 0; -} - - -int SH1106::drawMasked(uint8_t x, uint8_t y, uint8_t b, uint8_t m) -{ - uint8_t o; - if (readByte(x,y,&o)) - return 1; - o &= ~m; - o |= (b & m); - return drawByte(x,y,o); -} - - -/* -static uint16_t scaleDouble(uint8_t byte) -{ - uint16_t r = 0; - uint16_t m = 1; - for (uint8_t b = 0; b < 8; ++b) { - if (byte & (1<> 3; - unsigned off = pg * m_width + x; - uint8_t shl = y & 7; - uint16_t b0 = (uint16_t)b << shl; - uint8_t b1 = (uint8_t)(b0 >> 8); - if (b1) - m_disp[off+m_width] |= b1; - m_disp[off] |= (uint8_t)(b0&0xff); -// log_dbug(TAG,"drawBits %x at %u",b0,off); - return 0; -} - - -int SH1106::drawByte(uint8_t x, uint8_t y, uint8_t b) -{ - uint8_t pg = y >> 3; - uint16_t idx = pg * m_width + x; - if ((x >= m_width) || (y >= m_height)) { - log_dbug(TAG,"off display %u,%u=%u pg=%u",(unsigned)x,(unsigned)y,(unsigned)idx,(unsigned)pg); - return 1; - } - uint8_t shift = y & 7; - if (shift != 0) { - uint16_t idx2 = idx + m_width; - if (idx2 >= (m_width*m_height)) - return 1; - m_dirty |= 1<<(pg+1); - uint16_t w = (uint16_t) b << shift; - uint16_t m = 0xff << shift; - m = ~m; - uint8_t b0 = (m_disp[idx] & m) | (w & 0xFF); - if (b0 != m_disp[idx]) { - m_disp[idx] = b0; - m_dirty |= 1<> 8)) | (w >> 8); - idx = idx2; - } - if (m_disp[idx] != b) { - m_dirty |= 1<> 3; - uint8_t byte = data[b]; - unsigned bitst = off & 7; - uint8_t got = 8-bitst; - byte >>= bitst; - if (got < numb) - byte |= data[b+1] << got; -// log_dbug(TAG,"getBits(%u,%u): %x",off,numb,byte); - return byte; -} - - -void SH1106::drawBitmap(uint16_t x, uint16_t y, uint16_t w, uint16_t h, const uint8_t *data, int32_t fg, int32_t bg) -{ - static const uint8_t masks[] = {0x1,0x3,0x7,0xf,0x1f,0x3f,0x7f}; - unsigned len = w*h; - uint16_t bitoff = 0; - log_dbug(TAG,"SH1106::drawBitmap(%u,%u,%u,%u) %u/%u",x,y,w,h,len,len/8); - for (uint8_t x0 = x; x0 < x+w; ++x0) { - uint8_t yoff = y; - uint8_t numb = h; - while (numb) { -// log_dbug(TAG,"numb=%u",numb); - uint8_t byte = getBits(data,bitoff,numb); - if (numb >= 8) { -// log_dbug(TAG,"byte %x at %u/%u",byte,x0,y+yoff); - if (byte) - drawByte(x0,yoff,byte); - numb -= 8; - yoff += 8; - bitoff += 8; - } else { - byte &= masks[numb-1]; - if (byte) { -// drawBits(x0,yoff,byte,numb); - uint8_t pg = yoff >> 3; - unsigned off = pg * m_width + x0; - uint8_t shl = yoff & 7; - uint16_t b0 = (uint16_t)byte << shl; - m_disp[off] |= (uint8_t)(b0&0xff); - uint8_t b1 = (uint8_t)(b0 >> 8); - if (b1) - m_disp[off+m_width] |= b1; - } - bitoff += numb; - break; - } - } - } -} - - - SH1106 *SH1106::create(uint8_t bus, uint8_t addr) { addr <<= 1; diff --git a/drv/i2c/sh1106.h b/drv/i2c/sh1106.h index 8ba10b9..b510f34 100644 --- a/drv/i2c/sh1106.h +++ b/drv/i2c/sh1106.h @@ -35,7 +35,6 @@ class SH1106 : public SSD130X, public I2CDevice static SH1106 *create(uint8_t bus, uint8_t addr); int init(uint8_t maxx, uint8_t maxy, uint8_t options); - void drawBitmap(uint16_t x, uint16_t y, uint16_t w, uint16_t h, const uint8_t *data, int32_t fg, int32_t bg) override; void flush() override; int setBrightness(uint8_t contrast) override; @@ -52,11 +51,6 @@ class SH1106 : public SSD130X, public I2CDevice { return 255; } private: - int drawByte(uint8_t x, uint8_t y, uint8_t b); - int drawBits(uint8_t x, uint8_t y, uint8_t b, uint8_t n); - int drawChar(char c); - int readByte(uint8_t x, uint8_t y, uint8_t *b); - int drawMasked(uint8_t x, uint8_t y, uint8_t b, uint8_t m); int xmitCmd(uint8_t cmd); void xmitCmds(uint8_t *cmd, unsigned n); diff --git a/drv/i2c/si7021.cpp b/drv/i2c/si7021.cpp index 8e2ac46..7476341 100644 --- a/drv/i2c/si7021.cpp +++ b/drv/i2c/si7021.cpp @@ -28,6 +28,9 @@ #include "si7021.h" #include "terminal.h" +#include +#include + #define TAG MODULE_SI7021 #define SI7021_ADDR (0x40 << 1) @@ -58,6 +61,7 @@ static const uint8_t MeasureTime[] = { 23, 8, 12, 10 }; #define CMD_RD_UR1 0xe7 #define CMD_WR_HCR 0x51 #define CMD_RD_HCR 0x11 +#define CMD_RESET 0xfe #define VDDS_BIT (1<<6) #define HEATER_BIT (1<<2) @@ -308,6 +312,11 @@ void SI7021::triggert(void *arg) SI7021 *SI7021::create(uint8_t bus, uint8_t addr) { + if (i2c_write1(bus,SI7021_ADDR,CMD_RESET)) { + log_dbug(TAG,"reset failed"); + return 0; + } + vTaskDelay(20); uint8_t data[] = { SI7021_ADDR, 0xfa, 0x0f }; if (esp_err_t e = i2c_write(bus,data,sizeof(data),0,1)) { log_dbug(TAG,"no response: %s",esp_err_to_name(e)); @@ -352,6 +361,7 @@ SI7021 *SI7021::create(uint8_t bus, uint8_t addr) case 0x14: typ = "si7020"; break; + case 0x00: case 0x32: typ = "htu21"; combined = false; diff --git a/drv/i2c/ssd1306.cpp b/drv/i2c/ssd1306.cpp index 21fd5d0..e7f84b8 100644 --- a/drv/i2c/ssd1306.cpp +++ b/drv/i2c/ssd1306.cpp @@ -24,7 +24,6 @@ #include "log.h" #include "profiling.h" -//#include "fonts.h" #include #include @@ -150,14 +149,21 @@ void SSD1306::flush() } } if (m_dirty) { - for (uint8_t p = 0; p < numpg; p++) { - if (m_dirty & (1<= 0) { + if (bg >= 0) { // bg == -2 is keep content, bg == -1 => bg = m_bgcol wchar_t f = bg; wmemset((wchar_t*)m_os,f,w*h); if ((w*h) & 1) @@ -509,7 +510,7 @@ void ILI9341::drawBitmap(uint16_t x, uint16_t y, uint16_t w, uint16_t h, const u if ((x + w) > m_width) w = m_width - x; if ((y + h) > m_height) - h = m_height - x; + h = m_height - y; if ((w == 0) || (h == 0)) return; uint16_t fgc = fg >= 0 ? (uint16_t)(fg & 0xffff) : m_colfg; @@ -708,6 +709,7 @@ unsigned ILI9341::drawChars(const char *at, const char *e, int32_t fg, int32_t b return x; } +#if 0 unsigned ILI9341::drawText(uint16_t x, uint16_t y, const char *txt, int n, int32_t fg, int32_t bg) { log_dbug(TAG,"drawText(%d,%d,'%s')",x,y,txt); @@ -722,6 +724,14 @@ unsigned ILI9341::drawText(uint16_t x, uint16_t y, const char *txt, int n, int32 x = 0; y += h; ++at; + /* + } else if (c == 0xc2) { + ++at; + // first byte of a 2-byte utf-8 + // used for degree symbol \u00b0 i.e. + // 0xc2 0xb0 + continue; + */ } if (c == 0) return a; @@ -745,12 +755,12 @@ unsigned ILI9341::drawText(uint16_t x, uint16_t y, const char *txt, int n, int32 // too big for off-screen rendering break; } - if (!m_fos) - setupOffScreen(x+a,y,da,h,bg == -1 ? m_colbg : bg); +// if (!m_fos) +// setupOffScreen(x+a,y,da,h,bg == -1 ? m_colbg : bg); drawChars(st,at,fg,bg); a += da; - if (!m_fos) - commitOffScreen(); +// if (!m_fos) +// commitOffScreen(); } if (at != e) log_dbug(TAG,"drawText on screen"); @@ -767,6 +777,7 @@ unsigned ILI9341::drawText(uint16_t x, uint16_t y, const char *txt, int n, int32 } return a; } +#endif int ILI9341::writeCmd(uint8_t v) diff --git a/drv/spi/ili9341.h b/drv/spi/ili9341.h index 7118fc9..02b5e70 100644 --- a/drv/spi/ili9341.h +++ b/drv/spi/ili9341.h @@ -71,7 +71,9 @@ class ILI9341 : public MatrixDisplay, public SpiDevice void drawHLine(uint16_t x, uint16_t y, uint16_t n, int32_t col = -1) override; void drawVLine(uint16_t x, uint16_t y, uint16_t n, int32_t col = -1) override; - unsigned drawText(uint16_t x, uint16_t y, const char *txt, int n, int32_t fg, int32_t bg) override; +// unsigned drawText(uint16_t x, uint16_t y, const char *txt, int n, int32_t fg, int32_t bg) override; + int setupOffScreen(uint16_t x, uint16_t y, uint16_t w, uint16_t h, int32_t bg) override; + void commitOffScreen() override; private: ILI9341(uint8_t cs, uint8_t cd, int8_t r, SemaphoreHandle_t sem, spi_device_handle_t hdl); @@ -95,8 +97,6 @@ class ILI9341 : public MatrixDisplay, public SpiDevice void checkPowerMode(); unsigned drawChars(const char *at, const char *e, int32_t fg, int32_t bg); void drawBitmapOffScr(uint16_t x, uint16_t y, uint16_t w, uint16_t h, const uint8_t *data, int32_t fg, int32_t bg); - int setupOffScreen(uint16_t x, uint16_t y, uint16_t w, uint16_t h, int32_t bg); - void commitOffScreen(); static int readRegs(spi_device_handle_t hdl, uint8_t reg, uint8_t num, uint8_t *data, SemaphoreHandle_t); spi_transaction_t *getTransaction(preop_t); diff --git a/drv/spi/ssd1309.cpp b/drv/spi/ssd1309.cpp index a16a193..63382b8 100644 --- a/drv/spi/ssd1309.cpp +++ b/drv/spi/ssd1309.cpp @@ -124,7 +124,8 @@ SSD1309 *SSD1309::create(spi_host_device_t host, spi_device_interface_config_t & cfg.command_bits = 0; cfg.address_bits = 0; cfg.cs_ena_pretrans = 0; - cfg.clock_speed_hz = SPI_MASTER_FREQ_8M; + if (cfg.clock_speed_hz == 0) + cfg.clock_speed_hz = SPI_MASTER_FREQ_8M; cfg.queue_size = 8; cfg.pre_cb = ssd1309_preop; cfg.post_cb = ssd1309_postop; @@ -159,7 +160,7 @@ int SSD1309::init(uint16_t maxx, uint16_t maxy, uint8_t hwcfg) } m_width = maxx; m_height = maxy; - uint32_t dsize = maxx * maxy; + uint32_t dsize = maxx * (maxy>>3); m_disp = (uint8_t *) malloc(dsize); // two dimensional array of n pages each of n columns. if (m_disp == 0) { log_error(TAG,"Out of memory."); @@ -176,7 +177,7 @@ int SSD1309::init(uint16_t maxx, uint16_t maxy, uint8_t hwcfg) 0xd5, 0x80, // oszi freq (default), clock div=1 (optional) 0xd9, 0x22, // default pre-charge (optional) 0xda, 0x12, // COM hardware config - // (uint8_t) ((hwcfg&(hwc_rlmap|hwc_altm))|0x2), + (uint8_t) ((hwcfg&(hwc_rlmap|hwc_altm))|0x2), 0xa4, // output RAM 0xaf, // display on diff --git a/drv/spi/sx1276.cpp b/drv/spi/sx1276.cpp index 97b81a9..0d88fe5 100644 --- a/drv/spi/sx1276.cpp +++ b/drv/spi/sx1276.cpp @@ -287,7 +287,8 @@ SX1276::SX1276(spi_host_device_t host, spi_device_interface_config_t &cfg, int8_ cfg.command_bits = 1; cfg.address_bits = 7; cfg.cs_ena_pretrans = 0; - cfg.clock_speed_hz = SPI_MASTER_FREQ_10M; + if (0 == cfg.clock_speed_hz) + cfg.clock_speed_hz = SPI_MASTER_FREQ_10M; cfg.queue_size = 1; cfg.post_cb = postCallback; cfg.flags = ESP_INTR_FLAG_IRAM; diff --git a/drv/spi/xpt2046.cpp b/drv/spi/xpt2046.cpp index 6eb15fb..9a1e88d 100644 --- a/drv/spi/xpt2046.cpp +++ b/drv/spi/xpt2046.cpp @@ -103,7 +103,8 @@ void XPT2046::attach(EnvObject *root) XPT2046 *XPT2046::create(spi_host_device_t host, spi_device_interface_config_t &cfg, int8_t intr) { - cfg.clock_speed_hz = SPI_MASTER_FREQ_8M; // maximum: ???MHz + if (cfg.clock_speed_hz == 0) + cfg.clock_speed_hz = SPI_MASTER_FREQ_8M; // maximum: ???MHz cfg.post_cb = spidrv_post_cb_relsem; cfg.queue_size = 1; spi_device_handle_t hdl; @@ -225,7 +226,7 @@ void XPT2046::readRegs() log_warn(TAG,"error queuing read: %s",esp_err_to_name(e)); } else { if (pdTRUE != xSemaphoreTake(m_sem,MUTEX_ABORT_TIMEOUT)) - abort_on_mutex(m_sem,"ili9341"); + abort_on_mutex(m_sem,"xpt2046"); // log_hex(TAG,rxbuf,sizeof(rxbuf),"read regs"); } x += (rxbuf[1] << 4) | (rxbuf[2] >> 4); @@ -235,6 +236,7 @@ void XPT2046::readRegs() x >>= 3; y >>= 3; z >>= 3; + log_dbug(TAG,"x=%u, y=%u, z=%u",x,y,z); if (z > m_uz) { if ((m_lx == 0) || (x < m_lx)) m_lx = x; @@ -249,12 +251,29 @@ void XPT2046::readRegs() m_p.set(true); event_trigger(m_evp); } - float a0 = ((float)(x-m_lx))/((float)(m_ux-m_lx))*100.0; + float a0 = 0, a1 = 0; + if (m_lx != m_ux) + a0 = ((float)(x-m_lx))/((float)(m_ux-m_lx))*100.0; m_a0.set(a0); - assert(a0 <= 100); - float a1 = ((float)(y-m_ly))/((float)(m_uy-m_ly))*100.0; - assert(a1 <= 100); + if (m_lx != m_ux) + a1 = ((float)(y-m_ly))/((float)(m_uy-m_ly))*100.0; m_a1.set(a1); + log_dbug(TAG,"a0 %g, a1 %g",a0,a1); + if (a0 < 0) { + log_warn(TAG,"a0 = %g",a0); + a0 = 0; + } else if (a0 > 1000) { + log_warn(TAG,"a0 = %g",a0); + a0 = 100; + } + if (a1 < 0) { + log_warn(TAG,"a1 = %g",a1); + a1 = 0; + } else if (a1 > 100) { + log_warn(TAG,"a1 = %g",a1); + a1 = 100; + } +// assert((a0 >= 0) && (a1 >= 0) && (a0 <= 100) && (a1 <= 100)); } else if (z < m_lz) { if (m_pressed) { m_pressed = false; diff --git a/drv/xio/CMakeLists.txt b/drv/xio/CMakeLists.txt index e451035..7dfa973 100644 --- a/drv/xio/CMakeLists.txt +++ b/drv/xio/CMakeLists.txt @@ -1,4 +1,4 @@ -set(COMPONENT_SRCS "esp32_io.cpp esp32-c3_io.cpp esp8266_io.cpp xio.cpp") +set(COMPONENT_SRCS "buzzer.cpp esp32_io.cpp esp32-c3_io.cpp esp8266_io.cpp xio.cpp") set(COMPONENT_REQUIRES event logging) set(COMPONENT_ADD_INCLUDEDIRS .) register_component() diff --git a/drv/xio/buzzer.cpp b/drv/xio/buzzer.cpp new file mode 100644 index 0000000..91b162d --- /dev/null +++ b/drv/xio/buzzer.cpp @@ -0,0 +1,274 @@ +/* + * Copyright (C) 2023, Thomas Maier-Komor + * Atrium Firmware Package for ESP + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include + + +#ifdef CONFIG_BUZZER + +#define TAG MODULE_BUZZER + +#include "actions.h" +#include "buzzer.h" +#include "event.h" +#include "globals.h" +#include "hwcfg.h" +#include "log.h" +#include "timefuse.h" +#include "terminal.h" + +#include + +#ifdef CONFIG_LUA +#include "luaext.h" +extern "C" { +#include "lua.h" +#include "lualib.h" +#include "lauxlib.h" +} +#endif + +// Buzzer is on LEDC_TIMER_1 + +/* +struct Tone +{ + uint16_t freq, duration; +}; + +struct Melody +{ + uint16_t num_tones; + Tone tones[1]; +}; +*/ + +static timefuse_t Timer = 0; +static gpio_num_t BuzGpio; +static ledc_channel_t Channel; +static const Melody *Playing = 0; +static unsigned NextTone = 0; + + +void buzzer_start(unsigned freq, unsigned time) +{ + if (time == 0) + return; + log_dbug(TAG,"play tone %uHz, %ums",freq,time); + if (freq > 0) { + ledc_timer_config_t tm; + bzero(&tm,sizeof(tm)); + tm.duty_resolution = LEDC_TIMER_8_BIT; + tm.freq_hz = freq; + tm.speed_mode = LEDC_LOW_SPEED_MODE; + tm.timer_num = LEDC_TIMER_1; + tm.clk_cfg = LEDC_AUTO_CLK; + if (esp_err_t e = ledc_timer_config(&tm)) + log_warn(TAG,"buzzer timer config %x",e); + else if (ledc_set_duty(LEDC_LOW_SPEED_MODE,Channel,128)) + log_warn(TAG,"set duty %x",e); + else if (ledc_update_duty(LEDC_LOW_SPEED_MODE,Channel)) + log_warn(TAG,"update duty %x",e); + } else { + ledc_set_duty(LEDC_LOW_SPEED_MODE,Channel,0); + ledc_update_duty(LEDC_LOW_SPEED_MODE,Channel); + } + timefuse_interval_set(Timer,time); + if (timefuse_start(Timer)) + log_warn(TAG,"start timer failed"); +} + + +static void buzzer_timeout(void *arg) +{ + if (Playing) { + if (NextTone+2 <= Playing->tones_size()) { + uint16_t freq = Playing->tones(NextTone++); + uint16_t dur = Playing->tones(NextTone++); + buzzer_start(freq,dur); + return; + } + Playing = 0; + NextTone = 0; + } + ledc_set_duty(LEDC_LOW_SPEED_MODE,Channel,0); + ledc_update_duty(LEDC_LOW_SPEED_MODE,Channel); +} + + +static void buzzer_stop(void *arg) +{ + ledc_set_duty(LEDC_LOW_SPEED_MODE,Channel,0); + ledc_update_duty(LEDC_LOW_SPEED_MODE,Channel); + Playing = 0; + NextTone = 0; +} + + +static void start_melody(const Melody &m) +{ + const auto &tones = m.tones(); + size_t nt = tones.size(); + if (nt < 2) + return; + if (nt >= 4) { + Playing = &m; + NextTone = 2; + } + buzzer_start(tones[0],tones[1]); +} + + +static const char *play_melody(const char *name) +{ + for (const auto &m : HWConf.buzzer().melodies()) { + if (!strcmp(name,m.name().c_str())) { + start_melody(m); + return 0; + } + } + return "Unknown melody."; +} + + +static void play_melody_action(void *arg) +{ + play_melody((const char *)arg); +} + + +const char *buzzer(Terminal &t, int argc, const char *args[]) +{ + if (argc == 1) { + for (const auto &m : HWConf.buzzer().melodies()) { + t.printf("melody %s:\n ",m.name().c_str()); + const auto &tones = m.tones(); + unsigned n = tones.size(); + unsigned i = 0; + while (i+2 <= n) { + t.printf(" [%ums @ %uHz]",tones[i+1],tones[i]); + i += 2; + } + t.println(); + } + } else if (argc == 2) { + if (!strcmp("stop",args[1])) { + buzzer_stop(0); + } else { + return "Invalid argument #1."; + } + } else if (argc == 3) { + if (!strcmp(args[1],"-p")) { + return play_melody(args[2]); + } else { + char *e; + long a1 = strtol(args[1],&e,0); + if (*e) + return "Invalid argument #1."; + long a2 = strtol(args[2],&e,0); + if (*e) + return "Invalid argument #2."; + buzzer_start(a1,a2); + } + } else if (!strcmp(args[1],"-a")) { + if ((argc < 5) || ((argc & 1) == 0)) + return "Invalid number of arguments."; + Melody *m = HWConf.mutable_buzzer()->add_melodies(); + m->set_name(args[2]); + int n = 3; + while (n + 1 < argc) { + char *e; + long t = strtol(args[n],&e,0); + if (*e) + return "Invalid frequency - incomplete melody."; + long f = strtol(args[++n],&e,0); + if (*e) + return "Invalid time - incomplete melody."; + m->add_tones(f); + m->add_tones(t); + ++n; + } + } else { + return "Invalid argument #1."; + } + return 0; +} + + +#ifdef CONFIG_LUA +static int luax_buzzer_tone(lua_State *L) +{ + int f = luaL_checkinteger(L,1); // freq in Hz + int t = luaL_checkinteger(L,2); // time in ms + buzzer_start(f,t); + return 0; +} + + +static int luax_buzzer_play(lua_State *L) +{ + const char *n = luaL_checkstring(L,1); + play_melody(n); + return 0; +} + + +static int luax_buzzer_stop(lua_State *L) +{ + buzzer_stop(0); + return 0; +} + + +static LuaFn Functions[] = { + { "buzzer_tone", luax_buzzer_tone, "play buzzer with freq a0 Hz, and time a1 ms" }, + { "buzzer_play", luax_buzzer_play, "play buzzer melody a0" }, + { "buzzer_stop", luax_buzzer_stop, "stop buzzer" }, + { 0, 0, 0 } +}; +#endif + + +void buzzer_setup() +{ + if (!HWConf.has_buzzer() || !HWConf.buzzer().has_gpio()) + return; + BuzGpio = (gpio_num_t)HWConf.buzzer().gpio(); + Timer = timefuse_create("buztmr",1000,false); + Channel = (ledc_channel_t)(LEDC_CHANNEL_MAX-1); +// dim->channel = (ledc_channel_t) conf.pwm_ch(); + ledc_channel_config_t ch; + bzero(&ch,sizeof(ch)); + ch.gpio_num = BuzGpio; + ch.channel = Channel; + ch.duty = 0; + ch.speed_mode = LEDC_LOW_SPEED_MODE; + ch.timer_sel = LEDC_TIMER_1; + ch.hpoint = 0; + ch.intr_type = LEDC_INTR_DISABLE; + if (esp_err_t e = ledc_channel_config(&ch)) + log_warn(TAG,"channel config %x",e); + action_add("buzzer!play",play_melody_action,0,"play melody with buzzer"); + action_add("buzzer!stop",buzzer_stop,0,"stop buzzer"); + Action *a = action_add("buzzer!nexttone",buzzer_timeout,0,0); + event_callback(timefuse_timeout_event(Timer),a); + xlua_add_funcs("buzzer",Functions); +} + + +#endif // BUZZER diff --git a/drv/xio/buzzer.h b/drv/xio/buzzer.h new file mode 100644 index 0000000..8055c8e --- /dev/null +++ b/drv/xio/buzzer.h @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2023, Thomas Maier-Komor + * Atrium Firmware Package for ESP + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef BUZZER_DRV_H +#define BUZZER_DRV_H + +#include "xio.h" + +struct Buzzer +{ + explicit Buzzer(xio_t xio); + + private: + static Buzzer *m_first; + Buzzer *m_next = 0; + const char *m_name; + xio_t m_gpio; + unsigned m_freq = 0, m_dur = 0; +}; + +#endif diff --git a/drv/xio/charger.h b/drv/xio/charger.h new file mode 100644 index 0000000..8c9da1d --- /dev/null +++ b/drv/xio/charger.h @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2023, Thomas Maier-Komor + * Atrium Firmware Package for ESP + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef CHARGER_DRV_H +#define CHARGER_DRV_H + + +struct Charger +{ + Charger(); + + virtual int setImax(unsigned mA); + + virtual int getImax(); + + static Charger *getInstance(); +}; + + +#endif diff --git a/drv/xio/esp32-c3_io.cpp b/drv/xio/esp32-c3_io.cpp index 148b182..c8f17eb 100644 --- a/drv/xio/esp32-c3_io.cpp +++ b/drv/xio/esp32-c3_io.cpp @@ -35,8 +35,10 @@ struct CoreIO : public XioCluster { int get_dir(uint8_t num) const override; int get_lvl(uint8_t io) override; + int get_out(uint8_t io) override; int setm(uint32_t,uint32_t) override; int set_hi(uint8_t io) override; + int set_hiz(uint8_t io) override; int set_lo(uint8_t io) override; int set_intr(uint8_t,xio_intrhdlr_t,void*) override; // int intr_enable(uint8_t) override; @@ -124,14 +126,14 @@ int CoreIO::config(uint8_t num, xio_cfg_t cfg) log_dbug(TAG,"input %u",num); } else if (cfg.cfg_io == xio_cfg_io_out) { gpio_pad_select_gpio(num); - PIN_INPUT_DISABLE(GPIO_PIN_MUX_REG[num]); +// PIN_INPUT_DISABLE(GPIO_PIN_MUX_REG[num]); GPIO.enable_w1ts.val = (1 << num); gpio_matrix_out(num, SIG_GPIO_OUT_IDX, false, false); GPIO.pin[num].pad_driver = 0; log_dbug(TAG,"output %u",num); } else if (cfg.cfg_io == xio_cfg_io_od) { gpio_pad_select_gpio(num); - PIN_INPUT_ENABLE(GPIO_PIN_MUX_REG[num]); +// PIN_INPUT_ENABLE(GPIO_PIN_MUX_REG[num]); GPIO.enable_w1ts.val = (1 << num); gpio_matrix_out(num, SIG_GPIO_OUT_IDX, false, false); GPIO.pin[num].pad_driver = 1; @@ -195,6 +197,14 @@ int CoreIO::config(uint8_t num, xio_cfg_t cfg) return -EINVAL; } #endif + if (cfg.cfg_initlvl == xio_cfg_initlvl_keep) { + } else if (cfg.cfg_initlvl == xio_cfg_initlvl_low) { + set_lo(num); + } else if (cfg.cfg_initlvl == xio_cfg_initlvl_high) { + set_hi(num); + } else { + return -EINVAL; + } return 0x1ff; } @@ -223,10 +233,35 @@ int CoreIO::get_lvl(uint8_t num) } +int CoreIO::get_out(uint8_t num) +{ + if (num < 22) { + if (((GPIO.enable.val >> num) & 1) == 0) + return xio_lvl_hiz; + return (GPIO.out.val >> num) & 1; + } + return -EINVAL; +} + + int CoreIO::set_hi(uint8_t num) { - if (uint32_t b = 1 << num) { + if (num < 22) { + uint32_t b = 1 << num; GPIO.out_w1ts.val = b; + GPIO.enable_w1ts.val = b; + return 0; + } + return -EINVAL; +} + + +int CoreIO::set_hiz(uint8_t num) +{ + if (num < 22) { + uint32_t b = 1 << num; + GPIO.out_w1tc.val = b; + GPIO.enable_w1tc.val = b; return 0; } return -EINVAL; @@ -235,8 +270,10 @@ int CoreIO::set_hi(uint8_t num) int CoreIO::set_lo(uint8_t num) { - if (uint32_t b = 1 << num) { + if (num < 22) { + uint32_t b = 1 << num; GPIO.out_w1tc.val = b; + GPIO.enable_w1ts.val = b; return 0; } return -EINVAL; @@ -245,7 +282,8 @@ int CoreIO::set_lo(uint8_t num) int CoreIO::set_lvl(uint8_t num, xio_lvl_t l) { - if (uint32_t b = 1 << num) { + if (num < 22) { + uint32_t b = 1 << num; if (l == xio_lvl_0) { GPIO.out_w1tc.val = b; GPIO.enable_w1ts.val = b; diff --git a/drv/xio/esp32_io.cpp b/drv/xio/esp32_io.cpp index f3d4ff9..71fd190 100644 --- a/drv/xio/esp32_io.cpp +++ b/drv/xio/esp32_io.cpp @@ -39,8 +39,10 @@ struct CoreIO0 : public XioCluster { int get_dir(uint8_t num) const override; int get_lvl(uint8_t io) override; + int get_out(uint8_t io) override; int setm(uint32_t,uint32_t) override; int set_hi(uint8_t io) override; + int set_hiz(uint8_t io) override; int set_lo(uint8_t io) override; int set_intr(uint8_t,xio_intrhdlr_t,void*) override; // int intr_enable(uint8_t) override; @@ -56,8 +58,10 @@ struct CoreIO1 : public XioCluster { int get_dir(uint8_t num) const override; int get_lvl(uint8_t io) override; + int get_out(uint8_t io) override; int setm(uint32_t,uint32_t) override; int set_hi(uint8_t io) override; + int set_hiz(uint8_t io) override; int set_lo(uint8_t io) override; int set_intr(uint8_t,xio_intrhdlr_t,void*) override; // int intr_enable(uint8_t) override; @@ -242,6 +246,14 @@ int CoreIO0::config(uint8_t num, xio_cfg_t cfg) return -EINVAL; } #endif + if (cfg.cfg_initlvl == xio_cfg_initlvl_keep) { + } else if (cfg.cfg_initlvl == xio_cfg_initlvl_low) { + set_lo(num); + } else if (cfg.cfg_initlvl == xio_cfg_initlvl_high) { + set_hi(num); + } else { + return -EINVAL; + } return 0x1ff; } @@ -340,6 +352,14 @@ int CoreIO1::config(uint8_t num, xio_cfg_t cfg) return -EINVAL; } + if (cfg.cfg_initlvl == xio_cfg_initlvl_keep) { + } else if (cfg.cfg_initlvl == xio_cfg_initlvl_low) { + set_lo(num); + } else if (cfg.cfg_initlvl == xio_cfg_initlvl_high) { + set_hi(num); + } else { + return -EINVAL; + } return r; } @@ -379,22 +399,38 @@ int CoreIO1::get_dir(uint8_t num) const int CoreIO0::get_lvl(uint8_t num) { if (num < COREIO0_NUMIO) { - if (GPIO.enable & (1 << num)) - return (GPIO.out >> num) & 0x1; - else - return (GPIO.in >> num) & 0x1; + return (GPIO.in >> num) & 0x1; } return -EINVAL; } int CoreIO1::get_lvl(uint8_t num) +{ + if (num < COREIO1_NUMIO) { + return (GPIO.in1.data >> num) & 0x1; + } + return -EINVAL; +} + + +int CoreIO0::get_out(uint8_t num) { if (num < COREIO0_NUMIO) { - if (GPIO.enable1.data & (1 << num)) - return (GPIO.out >> num) & 0x1; - else - return (GPIO.in1.data >> num) & 0x1; + if (((GPIO.enable >> num) & 1) == 0) + return xio_lvl_hiz; + return (GPIO.out >> num) & 1; + } + return -EINVAL; +} + + +int CoreIO1::get_out(uint8_t num) +{ + if (num < COREIO1_NUMIO) { + if (((GPIO.enable1.val >> num) & 1) == 0) + return xio_lvl_hiz; + return (GPIO.out1.val >> num) & 1; } return -EINVAL; } @@ -404,6 +440,7 @@ int CoreIO0::set_hi(uint8_t num) { if (uint32_t b = 1 << num) { GPIO.out_w1ts = b; + GPIO.enable_w1ts = b; return 0; } return -EINVAL; @@ -412,8 +449,33 @@ int CoreIO0::set_hi(uint8_t num) int CoreIO1::set_hi(uint8_t num) { - if (uint32_t b = 1 << num) { + if (num < COREIO1_NUMIO) { + uint32_t b = 1 << num; GPIO.out1_w1ts.data = b; + GPIO.enable1_w1ts.data = b; + return 0; + } + return -EINVAL; +} + + +int CoreIO0::set_hiz(uint8_t num) +{ + if (uint32_t b = 1 << num) { + GPIO.out_w1tc = b; + GPIO.enable_w1tc = b; + return 0; + } + return -EINVAL; +} + + +int CoreIO1::set_hiz(uint8_t num) +{ + if (num < COREIO1_NUMIO) { + uint32_t b = 1 << num; + GPIO.out1_w1tc.data = b; + GPIO.enable1_w1tc.data = b; return 0; } return -EINVAL; @@ -424,6 +486,7 @@ int CoreIO0::set_lo(uint8_t num) { if (uint32_t b = 1 << num) { GPIO.out_w1tc = b; + GPIO.enable_w1ts = b; return 0; } return -EINVAL; @@ -432,8 +495,10 @@ int CoreIO0::set_lo(uint8_t num) int CoreIO1::set_lo(uint8_t num) { - if (uint32_t b = 1 << num) { + if (num < COREIO1_NUMIO) { + uint32_t b = 1 << num; GPIO.out1_w1tc.data = b; + GPIO.enable1_w1ts.data = b; return 0; } return -EINVAL; @@ -452,7 +517,7 @@ int CoreIO0::set_lvl(uint8_t num, xio_lvl_t l) GPIO.enable_w1ts = b; return 0; } else if (l == xio_lvl_hiz) { - GPIO.out_w1tc= b; + GPIO.out_w1tc = b; GPIO.enable_w1tc = b; return 0; } @@ -463,7 +528,8 @@ int CoreIO0::set_lvl(uint8_t num, xio_lvl_t l) int CoreIO1::set_lvl(uint8_t num, xio_lvl_t l) { - if (uint32_t b = 1 << num) { + if (num < COREIO1_NUMIO) { + uint32_t b = 1 << num; if (l == xio_lvl_0) { GPIO.out1_w1tc.data = b; GPIO.enable1_w1ts.data = b; diff --git a/drv/xio/esp8266_io.cpp b/drv/xio/esp8266_io.cpp index 55a64d0..5d54c67 100644 --- a/drv/xio/esp8266_io.cpp +++ b/drv/xio/esp8266_io.cpp @@ -40,8 +40,10 @@ struct CoreIO : public XioCluster { CoreIO(); int get_lvl(uint8_t io) override; + int get_out(uint8_t io) override; int setm(uint32_t,uint32_t) override; int set_hi(uint8_t io) override; + int set_hiz(uint8_t io) override; int set_lo(uint8_t io) override; int set_intr(uint8_t,xio_intrhdlr_t,void*) override; int config(uint8_t io, xio_cfg_t) override; @@ -207,10 +209,30 @@ int CoreIO::get_lvl(uint8_t num) } +int CoreIO::get_out(uint8_t num) +{ + if (num < 16) + return (GPIO.out >> num) & 1; + return -EINVAL; +} + + int CoreIO::set_hi(uint8_t num) { if (uint16_t b = 1 << num) { GPIO.out_w1ts |= b; + GPIO.enable_w1ts |= b; + return 0; + } + return -EINVAL; +} + + +int CoreIO::set_hiz(uint8_t num) +{ + if (uint16_t b = 1 << num) { + GPIO.out_w1tc |= b; + GPIO.enable_w1tc |= b; return 0; } return -EINVAL; @@ -221,6 +243,7 @@ int CoreIO::set_lo(uint8_t num) { if (uint16_t b = 1 << num) { GPIO.out_w1tc |= b; + GPIO.enable_w1ts |= b; return 0; } return -EINVAL; diff --git a/drv/xio/xio.cpp b/drv/xio/xio.cpp index 13c4452..55e3fd2 100644 --- a/drv/xio/xio.cpp +++ b/drv/xio/xio.cpp @@ -188,7 +188,8 @@ int xio_set_lo(xio_t x) int xio_set_lvl(xio_t x, xio_lvl_t l) { - log_dbug(TAG,"set_lvl %u,%u",x,l); +// log_dbug here causes problem in timing critical functions like onewire xmitBit +// log_dbug(TAG,"set_lvl %u,%u",x,l); if (XioCluster *c = XioCluster::getCluster(x)) return c->set_lvl(x-c->getBase(),l); log_warn(TAG,"set_lvl: invalid io %u",x); diff --git a/drv/xio/xio.h b/drv/xio/xio.h index 46bcaf2..64bbdc0 100644 --- a/drv/xio/xio.h +++ b/drv/xio/xio.h @@ -144,7 +144,7 @@ struct XioCluster { return -1; } virtual int get_out(uint8_t io) - { return -1; } + { return get_lvl(io); } virtual int setm(uint32_t values,uint32_t mask) { return -1; } @@ -152,6 +152,9 @@ struct XioCluster virtual int set_hi(uint8_t io) { return set_lvl(io,xio_lvl_1); } + virtual int set_hiz(uint8_t io) + { return set_lvl(io,xio_lvl_hiz); } + virtual int set_lo(uint8_t io) { return set_lvl(io,xio_lvl_0); } diff --git a/hwcfg.wfc b/hwcfg.wfc index 2ab7eee..6494010 100644 --- a/hwcfg.wfc +++ b/hwcfg.wfc @@ -104,6 +104,12 @@ message SystemConfig string model_number = 8; bool usb_diag = 9 [ unset = true, ifdef=CONFIG_USB_DIAGLOG ]; bool usb_con = 10 [ unset = true, ifdef=CONFIG_USB_CONSOLE ]; + + // CC1/CC2 must be GPIO ports with ADC channel. + // Related driver provides cable orientation, plug state, + // and max. current delivered. + sint8 cc1_gpio = 11 [ unset = -1, ifdef=CONFIG_ESP_PHY_ENABLE_USB ]; + sint8 cc2_gpio = 12 [ unset = -1, ifdef=CONFIG_ESP_PHY_ENABLE_USB ]; } @@ -278,6 +284,7 @@ bitset ledcfg_t { bool active_high : 0; bool open_drain : 1; + bool init_high : 2; } @@ -365,7 +372,8 @@ bitset gpiocfg_t bool initlvl : 6; bool pullup : 7; bool pulldown : 8; - bool cap_freq_r2r : 9; // determine frequence rise-to-rise +// TODO: +// bool cap_freq_r2r : 9; // determine frequence rise-to-rise } @@ -446,6 +454,7 @@ message SpiDeviceConfig sint8 intr = 3 [ unset = -1 ]; // interrupt sint8 reset = 4 [ unset = -1 ]; // reset sint8 cd = 5 [ unset = -1 ]; // command/data + unsigned freq = 6 [ unset = 0 ]; // frequency in kHz, 0=use default } @@ -493,6 +502,27 @@ message SX1276Config } +message Tone +{ + unsigned freq = 1; // given in Hz + unsigned duration = 2; // given in ms +} + + +message Melody +{ + string name = 1; + repeated fixed16 tones = 2; // sequence of freq [Hz], time [ms] pairs +} + + +message BuzzerConfig +{ + sint8 gpio = 1 [ unset = -1 ]; + repeated Melody melodies = 2; +} + + message HardwareConfig { fixed32 magic = 0; // should always be set to 0xAE54EDCB @@ -509,6 +539,7 @@ message HardwareConfig repeated ButtonConfig button = 16 [ ifdef=CONFIG_BUTTON ]; repeated RelayConfig relay = 17 [ ifdef=CONFIG_RELAY ]; repeated LedConfig led = 18 [ ifdef=CONFIG_LEDS ]; + BuzzerConfig buzzer = 19 [ ifdef=CONFIG_BUZZER ]; // direct attached devices Hlw8012Config hlw8012 = 20 [ ifdef=CONFIG_HLW8012 ]; diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index 7a3683f..a4b0dba 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -44,6 +44,7 @@ idf_component_register( touchpads.cpp uarts.cpp udpctrl.cpp + usb.cpp webcam.cpp wfccore.cpp wifi.cpp diff --git a/main/Kconfig b/main/Kconfig index e5e4386..e7db213 100644 --- a/main/Kconfig +++ b/main/Kconfig @@ -224,14 +224,14 @@ endmenu # filesystem menu "hardware support" config USB_DIAGLOG - depends on ESP_CONSOLE_USB_SERIAL_JTAG + depends on SOC_USB_SERIAL_JTAG_SUPPORTED bool "diag output to USB serial" default true help output diagnostic log to USB serial connections config USB_CONSOLE - depends on ESP_CONSOLE_USB_SERIAL_JTAG || ESP_CONSOLE_SECONDARY_USB_SERIAL_JTAG || TINYUSB_CDC_ENABLED + depends on SOC_USB_SERIAL_JTAG_SUPPORTED bool "console on USB serial" default true help @@ -278,6 +278,13 @@ config ROTARYENCODER help support rotary encoders +config BUZZER + depends on !IDF_TARGET_ESP8266 + bool "buzzer support" + default true + help + driver for PWM driven buzzer + config RELAY bool "relay" default true @@ -351,55 +358,6 @@ config I2C help I2C bus infrastructure -config I2C_XCMD - bool "extended command support for I2C devices" - depends on I2C - default true - help - provide extended commands for configuring I2C devices - -config I2C_XDEV - bool "explicit I2C device configuration" - depends on I2C - default true - help - support for configuring devices that cannot be detected automatically - -config PCA9685 - depends on I2C_XDEV - bool "pca9685" - default true - help - 16 channel, 12bit PWM I2C driver - -config PCF8574 - depends on I2C_XDEV - bool "pcf8574" - default true - help - I2C driver for PCF8574 (GPIO expander), used as bridge for HD44780U - -config TCA9555 - depends on I2C_XDEV - bool "tca9555" - default true - help - I2C driver for TCA9555 (GPIO expander) - -config MCP2300X - depends on I2C_XDEV - bool "mcp2300x" - default true - help - I2C driver for MCP2300x devices (8-port GPIO expander) - -config MCP2301X - depends on I2C_XDEV - bool "mcp2301x" - default true - help - I2C driver for MCP2301x devices (16-port GPIO expander) - config OPT3001 depends on I2C bool "opt3001" @@ -407,20 +365,6 @@ config OPT3001 help I2C driver for OPT3001 (light intensity sensor) -config INA2XX - bool "ina219" - depends on I2C_XDEV - default true - help - I2C driver for INA219 (current/voltage sensor) - -config SI7021 - depends on I2C_XDEV - bool "SI7021" - default true - help - I2C driver for HTU21/SI7021/SI7020/SI7013 (temperature,humidity) - config BMX280 depends on I2C bool "BMx280" @@ -429,7 +373,7 @@ config BMX280 I2C driver for BME280 and BMP280 air sensor (temperature, humidity, pressure) config BMP388 - depends on I2C && DEVEL + depends on I2C bool "BMP388" default false help @@ -442,6 +386,13 @@ config BME680 help I2C driver for BME680 air sensor (temperature, humidity, pressure, electric resistance) +config BQ25601D + depends on I2C + bool "BQ25601D" + default false + help + I2C driver for BQ25601D charging controller + config HDC1000 depends on I2C bool "HDC1000" @@ -477,6 +428,69 @@ config BH1750 help I2C driver for BH1750 (illuminance sensor) +config I2C_XCMD + bool "extended command support for I2C devices" + depends on I2C + default true + help + provide extended commands for configuring I2C devices + +config I2C_XDEV + bool "explicit I2C device configuration" + depends on I2C + default true + help + support for configuring devices that cannot be detected automatically + +config INA2XX + bool "ina219" + depends on I2C_XDEV + default true + help + I2C driver for INA219 (current/voltage sensor) + +config SI7021 + depends on I2C_XDEV + bool "SI7021" + default true + help + I2C driver for HTU21/SI7021/SI7020/SI7013 (temperature,humidity) + +config PCA9685 + depends on I2C_XDEV + bool "pca9685" + default true + help + 16 channel, 12bit PWM I2C driver + +config PCF8574 + depends on I2C_XDEV + bool "pcf8574" + default true + help + I2C driver for PCF8574 (GPIO expander), used as bridge for HD44780U + +config TCA9555 + depends on I2C_XDEV + bool "tca9555" + default true + help + I2C driver for TCA9555 (GPIO expander) + +config MCP2300X + depends on I2C_XDEV + bool "mcp2300x" + default true + help + I2C driver for MCP2300x devices (8-port GPIO expander) + +config MCP2301X + depends on I2C_XDEV + bool "mcp2301x" + default true + help + I2C driver for MCP2301x devices (16-port GPIO expander) + config SPI bool "SPI" depends on !IDF_TARGET_ESP8266 @@ -494,7 +508,6 @@ config SX1276 config SSD1309 bool "SSD1309" - depends on DEVEL default false depends on SPI help diff --git a/main/adc.cpp b/main/adc.cpp index ac54799..28e5acd 100644 --- a/main/adc.cpp +++ b/main/adc.cpp @@ -18,6 +18,7 @@ #include +#include "adc.h" #include "actions.h" #include "cyclic.h" #include "env.h" @@ -73,6 +74,7 @@ extern "C" { #endif #endif +static adc_oneshot_unit_handle_t AdcHdl1 = 0, AdcHdl2 = 0; struct AdcSignal : public EnvObject { @@ -135,31 +137,31 @@ struct AdcSignal : public EnvObject log_warn(TAG,"converting ADC%u,%u: %s",unit,channel,esp_err_to_name(e)); else v = voltage; + } else +#endif + { + switch (atten) { + case ADC_ATTEN_DB_0: + // v = x * 950.0 / 4095.0; + v = x * 750.0 / 4095.0; + break; + case ADC_ATTEN_DB_2_5: + // v = x * 1250.0 / 4095.0; + v = x * 1050.0 / 4095.0; + break; + case ADC_ATTEN_DB_6: + // v = x * 1750.0 / 4095.0; + v = x * 1300.0 / 4095.0; + break; + case ADC_ATTEN_DB_11: + // v = x * 2450.0 / 4095.0; + v = x * 2500.0 / 4095.0; + break; + default: + break; + } } volt.set(v); -#else - switch (atten) { - case ADC_ATTEN_DB_0: -// v = x * 950.0 / 4095.0; - v = x * 750.0 / 4095.0; - break; - case ADC_ATTEN_DB_2_5: -// v = x * 1250.0 / 4095.0; - v = x * 1050.0 / 4095.0; - break; - case ADC_ATTEN_DB_6: -// v = x * 1750.0 / 4095.0; - v = x * 1300.0 / 4095.0; - break; - case ADC_ATTEN_DB_11: -// v = x * 2450.0 / 4095.0; - v = x * 2500.0 / 4095.0; - break; - default: - break; - } - volt.set(v); -#endif phys.set(v*scale+offset); } @@ -466,6 +468,53 @@ static const char *adc_sample(Terminal &t, const char *arg) } +#if IDF_VERSION >= 50 +adc_oneshot_unit_handle_t adc_get_handle(uint8_t unit) +{ + adc_unit_t u; + if (unit == 1) { + if (AdcHdl1 != 0) + return AdcHdl1; + u = ADC_UNIT_1; + } else if (unit == 2) { + if (AdcHdl2 != 0) + return AdcHdl2; + u = ADC_UNIT_2; + } else { + return 0; + } + return adc_get_unit_handle(u); +} + + +adc_oneshot_unit_handle_t adc_get_unit_handle(adc_unit_t unit) +{ + adc_oneshot_unit_handle_t *hdlptr; + adc_oneshot_unit_init_cfg_t ucfg; + if (unit == ADC_UNIT_1) { + if (AdcHdl1 != 0) + return AdcHdl1; + ucfg.unit_id = ADC_UNIT_1; + hdlptr = &AdcHdl1; + } else if (unit == ADC_UNIT_2) { + if (AdcHdl2 != 0) + return AdcHdl2; + ucfg.unit_id = ADC_UNIT_2; + hdlptr = &AdcHdl2; + } else { + return 0; + } +// ucfg.clk_src = ADC_DEFAULT_CLOCK; + ucfg.clk_src = (adc_oneshot_clk_src_t)0; + ucfg.ulp_mode = ADC_ULP_MODE_DISABLE; + if (esp_err_t e = adc_oneshot_new_unit(&ucfg,hdlptr)) { + log_warn(TAG,"ADC unit %d: %s",unit+1,esp_err_to_name(e)); + } + return *hdlptr; +} +#endif + + void adc_setup() { #ifdef CONFIG_CORETEMP @@ -479,9 +528,9 @@ void adc_setup() adc_bitwidth_t w2 = ADC_BITWIDTH_DEFAULT; #if IDF_VERSION >= 50 if (conf.has_adc1_bits()) - w1 = (adc_bitwidth_t) conf.adc1_bits(); + w1 = (adc_bitwidth_t) (ADC_BITWIDTH_9 + conf.adc1_bits()); if (conf.has_adc2_bits()) - w2 = (adc_bitwidth_t) conf.adc2_bits(); + w2 = (adc_bitwidth_t) (ADC_BITWIDTH_9 + conf.adc2_bits()); #else if (conf.adc1_bits()) { if (esp_err_t e = adc_set_data_width(ADC_UNIT_1,(adc_bits_width_t)conf.adc1_bits())) @@ -503,19 +552,25 @@ void adc_setup() log_info(TAG,"%u channels",NumAdc); Adcs = (AdcSignal **) malloc(sizeof(AdcSignal*)*NumAdc); bzero(Adcs,sizeof(AdcSignal*)*NumAdc); - adc_oneshot_unit_handle_t hdl1 = 0, hdl2 = 0; for (const AdcChannel &c : conf.channels()) { unsigned u = c.unit(); - if ((u < 1) || (u > 2)) { + adc_unit_t unit; + switch (u) { + case 1: + unit = ADC_UNIT_1; + break; + case 2: + unit = ADC_UNIT_2; + break; + default: log_warn(TAG,"invalid unit %u",u); continue; } - adc_unit_t unit = u == 1 ? ADC_UNIT_1 : ADC_UNIT_2; int ch = c.ch(); #if IDF_VERSION >= 50 if (ch >= SOC_ADC_CHANNEL_NUM(unit)) { #else - if (((u == 1) && (ch >= ADC1_CHANNEL_MAX)) || ((u == 2) && (ch >= ADC2_CHANNEL_MAX))) { + if (((unit == ADC_UNIT_1) && (ch >= ADC1_CHANNEL_MAX)) || ((unit == ADC_UNIT_2) && (ch >= ADC2_CHANNEL_MAX))) { #endif log_warn(TAG,"invalid channel %u",ch); continue; @@ -532,36 +587,16 @@ void adc_setup() adc_oneshot_channel_to_io(unit,(adc_channel_t)ch,&gpio); log_info(TAG,"init %s on ADC%u.%u at GPIO%u, atten %u",n,u,ch,gpio,atten); #if IDF_VERSION >= 50 - adc_oneshot_unit_handle_t hdl = 0; - adc_oneshot_unit_init_cfg_t ucfg; - ucfg.unit_id = unit; -// ucfg.clk_src = ADC_DEFAULT_CLOCK; - ucfg.clk_src = (adc_oneshot_clk_src_t)0; - ucfg.ulp_mode = ADC_ULP_MODE_DISABLE; - if (u == 1) { - if (hdl1 == 0) { - if (esp_err_t e = adc_oneshot_new_unit(&ucfg,&hdl1)) { - log_warn(TAG,"ADC unit %d: %s",u,esp_err_to_name(e)); - continue; - } - } - hdl = hdl1; - } else if (u == 2) { - if (hdl2 == 0) { - if (esp_err_t e = adc_oneshot_new_unit(&ucfg,&hdl2)) { - log_warn(TAG,"ADC unit %d: %s",u,esp_err_to_name(e)); - continue; - } - } - hdl = hdl2; - } else { - abort(); + adc_oneshot_unit_handle_t hdl = adc_get_unit_handle(unit); + if (hdl == 0) { + log_warn(TAG,"failed to get ADC unit handle for unit %d",u); + continue; } adc_oneshot_chan_cfg_t cc; cc.atten = atten; - cc.bitwidth = u == 1 ? w1 : w2; + cc.bitwidth = unit == ADC_UNIT_1 ? w1 : w2; adc_oneshot_config_channel(hdl,(adc_channel_t)ch,&cc); - Adcs[num] = new AdcSignal(n,hdl,(adc_unit_t)u,(adc_channel_t)ch,atten,c.window()); + Adcs[num] = new AdcSignal(n,hdl,unit,(adc_channel_t)ch,atten,c.window()); #else if (u == 1) { if (esp_err_t e = adc1_config_channel_atten((adc1_channel_t)ch,atten)) { @@ -578,7 +613,7 @@ void adc_setup() continue; } } - Adcs[num] = new AdcSignal(n,(adc_unit_t)u,(adc_channel_t)ch,c.window()); + Adcs[num] = new AdcSignal(n,unit,(adc_channel_t)ch,c.window()); #endif Adcs[num]->atten = atten; if (c.has_scale() || c.has_offset() || c.has_dim()) { diff --git a/main/adc.h b/main/adc.h new file mode 100644 index 0000000..cc3183a --- /dev/null +++ b/main/adc.h @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2020-2023, Thomas Maier-Komor + * Atrium Firmware Package for ESP + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef ADC_H +#define ADC_H + + +#if IDF_VERSION >= 50 +#include + +adc_oneshot_unit_handle_t adc_get_handle(uint8_t unit); +adc_oneshot_unit_handle_t adc_get_unit_handle(adc_unit_t unit); + +#endif // IDF_VERSION >= 50 + +#endif diff --git a/main/console.cpp b/main/console.cpp index 2f9dab2..6482994 100644 --- a/main/console.cpp +++ b/main/console.cpp @@ -21,9 +21,7 @@ #include #include -#include "log.h" #include - #include #include "globals.h" @@ -35,6 +33,7 @@ using namespace std; + #define TAG MODULE_CON #ifndef CONFIG_CONSOLE_STACK_SIZE @@ -77,7 +76,7 @@ static inline void uart_console_setup(void) #endif // CONFIG_UART_CONSOLE -#if defined CONFIG_USB_CONSOLE && (defined CONFIG_IDF_TARGET_ESP32C3 || defined CONFIG_IDF_TARGET_ESP32S3) +#if defined CONFIG_USB_CONSOLE #include "jtag_terminal.h" static inline void jtag_console_setup(void) @@ -115,8 +114,18 @@ static inline void cdc_console_setup(void) #endif +#ifdef CONFIG_USB_DIAGLOG +extern "C" { + extern uint8_t UsbDiag; +} +#endif + void console_setup() { +#ifdef CONFIG_USB_DIAGLOG + if (!HWConf.system().usb_diag()) + UsbDiag = 0; +#endif uart_console_setup(); jtag_console_setup(); cdc_console_setup(); diff --git a/main/dimmer.cpp b/main/dimmer.cpp index 38067bc..60f86da 100644 --- a/main/dimmer.cpp +++ b/main/dimmer.cpp @@ -427,18 +427,20 @@ void dimmer_setup() unsigned nch = 0; uint32_t pins[nleds]; uint32_t duties[nleds]; -#elif defined CONFIG_IDF_TARGET_ESP32 +#elif defined ESP32 ledc_timer_config_t tm; bzero(&tm,sizeof(tm)); tm.duty_resolution = LEDC_TIMER_10_BIT; tm.freq_hz = freq; tm.speed_mode = SPEED_MODE; tm.timer_num = LEDC_TIMER_0; - tm.clk_cfg = LEDC_AUTO_CLK; + tm.clk_cfg = LEDC_AUTO_CLK; if (esp_err_t e = ledc_timer_config(&tm)) { log_error(TAG,"timer config %x",e); return; } +#else +#error unknown target #endif for (auto &conf : HWConf.led()) { if ((conf.pwm_ch() == -1) || (conf.gpio() == -1)) @@ -469,7 +471,6 @@ void dimmer_setup() ch.gpio_num = dim->gpio; ch.channel = dim->channel; ch.duty = 0; - ch.gpio_num = dim->gpio; ch.speed_mode = SPEED_MODE; ch.timer_sel = LEDC_TIMER_0; ch.hpoint = 0; diff --git a/main/ftpd.cpp b/main/ftpd.cpp index aef2422..8383fb2 100644 --- a/main/ftpd.cpp +++ b/main/ftpd.cpp @@ -128,8 +128,6 @@ static void answer(ftpctx_t *ctx, const char *fmt, ...) buf[n] = 0; log_dbug(TAG,"answer %.*s",n-2,b); int r = ctx->con->write(b,n); - if (b != buf) - free(b); if (-1 == r) { log_error(TAG,"failed to send answer: %s",ctx->con->error()); ctx->con->close(); diff --git a/main/gpios.cpp b/main/gpios.cpp index 533617b..ba611c0 100644 --- a/main/gpios.cpp +++ b/main/gpios.cpp @@ -203,6 +203,7 @@ void Gpio::action_set0(void *arg) { Gpio *gpio = (Gpio *)arg; xio_set_lo(gpio->m_gpio); + gpio->m_env.set(false); log_dbug(TAG,"%s <= 0",gpio->name()); } @@ -211,6 +212,7 @@ void Gpio::action_set1(void *arg) { Gpio *gpio = (Gpio *)arg; xio_set_hi(gpio->m_gpio); + gpio->m_env.set(true); log_dbug(TAG,"%s <= 1",gpio->name()); } @@ -220,6 +222,7 @@ void Gpio::action_toggle(void *arg) Gpio *gpio = (Gpio *)arg; unsigned lvl = xio_get_lvl(gpio->m_gpio)^1; xio_set_lvl(gpio->m_gpio,(xio_lvl_t)lvl); + gpio->m_env.set(lvl); log_dbug(TAG,"%s <= %d",gpio->name(),lvl); } @@ -255,9 +258,10 @@ void Gpio::init(unsigned config) else if (config & (1<<8)) cfg.cfg_pull = xio_cfg_pull_down; if (config & (1<<5)) { // set-init? - bool inithi = config & (1 << 6); + bool inithi = (config >> 6) & 1; cfg.cfg_initlvl = inithi ? xio_cfg_initlvl_high : xio_cfg_initlvl_low; - log_dbug(TAG,"init %s",inithi ? "high" : "low"); + log_dbug(TAG,"init %s %s",m_env.name(),inithi ? "high" : "low"); + m_env.set(inithi); } if (0 > xio_config(m_gpio,cfg)) { log_warn(TAG,"config gpio %u failed",m_gpio); @@ -357,8 +361,8 @@ const char *gpio(Terminal &term, int argc, const char *args[]) { #ifdef CONFIG_IOEXTENDERS if (argc == 1) { - const char *dir[] = {"in: 0","in: 1","out","od"}; - const char *out[] = {"","out: lo","out: hi"}; + const char *dir[] = {"in","out","od"}; + const char out[] = {'0','1','Z'}; XioCluster **cl = XioCluster::getClusters(); uint8_t num = XioCluster::numClusters(); term.printf("%u io clusters\n",num); @@ -372,15 +376,11 @@ const char *gpio(Terminal &term, int argc, const char *args[]) term.printf("cluster %s: %u IOs\n",n,num); for (int i = 0; i < num; ++i) { int d = c->get_dir(i); - int o = d == 2 ? c->get_out(i) : -1; - ++o; if (d != -1) { - if (d) - ++d; - else - d = c->get_lvl(i); - assert(dir[d]); - term.printf("%2u (%s/%d): %s%s\n",gpio,n,i,dir[d],out[o]); + int o = d ? c->get_out(i) : c->get_lvl(i); + assert((d >= 0) && (d < sizeof(dir)/sizeof(dir[0]))); + assert((o >= 0) && (o < sizeof(out)/sizeof(out[0]))); + term.printf("%2u (%s/%d): %s %c\n",gpio,n,i,dir[d],out[o]); } ++gpio; } diff --git a/main/leds.cpp b/main/leds.cpp index 2d4b76a..9002349 100644 --- a/main/leds.cpp +++ b/main/leds.cpp @@ -549,8 +549,10 @@ int leds_setup() continue; const auto &n = c.name(); const char *name = n.c_str(); + bool initlvl = c.config_init_high(); xio_cfg_t cfg = XIOCFG_INIT; cfg.cfg_io = c.config_open_drain() ? xio_cfg_io_od : xio_cfg_io_out; + cfg.cfg_initlvl = initlvl ? xio_cfg_initlvl_high : xio_cfg_initlvl_low; xio_t gpio = (xio_t) c.gpio(); if (0 > xio_config(gpio,cfg)) { log_warn(TAG,"failed to configure xio%u",gpio); @@ -577,7 +579,7 @@ int leds_setup() BusyOn = on; #endif } else { - ctx = new LedMode(name,ledmode_off,gpio,on); + ctx = new LedMode(name,initlvl?ledmode_on:ledmode_off,gpio,on); action_add(concat(name,"!on"), led_set_on, (void*)ctx, "led on"); action_add(concat(name,"!off"), led_set_off, (void*)ctx, "led off"); action_add(concat(name,"!toggle"), led_toggle, (void*)ctx, "toggle led"); diff --git a/main/luaext.cpp b/main/luaext.cpp index 772fab0..3609f4f 100644 --- a/main/luaext.cpp +++ b/main/luaext.cpp @@ -725,6 +725,7 @@ unsigned xlua_render(Screen *ctx) lua_gc(LS,LUA_GCCOLLECT); } else { ctx->mode = (clockmode_t) (ctx->mode + 1); + ctx->modech = true; } return d; } diff --git a/main/mqtt.cpp b/main/mqtt.cpp index 5e1fe03..41e5c0c 100644 --- a/main/mqtt.cpp +++ b/main/mqtt.cpp @@ -288,7 +288,7 @@ static const LuaFn Functions[] = { MqttClient::MqttClient() : pcb(0) -, mtx(xSemaphoreCreateMutex()) +, mtx(xSemaphoreCreateRecursiveMutex()) , sem(xSemaphoreCreateBinary()) , state(offline) , upev(event_id("mqtt`update")) @@ -741,7 +741,7 @@ static void mqtt_ping() if ((Client == 0) || (Client->state != running)) return; log_dbug(TAG,"ping"); - Lock lock(Client->mtx,__FUNCTION__); + RLock lock(Client->mtx,__FUNCTION__); #if LWIP_TCPIP_CORE_LOCKING == 1 uint8_t request[] = { PINGREQ, 0 }; LWIP_LOCK(); @@ -947,36 +947,36 @@ static void mqtt_tcpout_fn(void *) static void mqtt_pub_rtdata(void *) { + RLock lock(Client->mtx,__FUNCTION__); if ((Client == 0) || (Client->state != running)) { if ((StationMode == station_connected) && (Config.mqtt().enable() && ((Client == 0) || (Client->state == offline)))) mqtt_start(); - return; - } - if (Client->pcb == 0) - return; - mqtt_pub_uptime(); - rtd_lock(); - for (EnvElement *e : RTData->getChilds()) { - const char *n = e->name(); - if (!strcmp(n,"node") || !strcmp(n,"mqtt")) { - // skip - } else if (EnvObject *o = e->toObject()) { + } else if (Client->pcb != 0) { + mqtt_pub_uptime(); + rtd_lock(); + for (EnvElement *e : RTData->getChilds()) { const char *n = e->name(); - for (auto c : o->getChilds()) { - pub_element(c,n); + if (!strcmp(n,"node") || !strcmp(n,"mqtt")) { + // skip + } else if (EnvObject *o = e->toObject()) { + const char *n = e->name(); + for (auto c : o->getChilds()) { + pub_element(c,n); + } + } else { + pub_element(e); } - } else { - pub_element(e); } - } - rtd_unlock(); + rtd_unlock(); #if LWIP_TCPIP_CORE_LOCKING == 1 - LWIP_LOCK(); - tcp_output(Client->pcb); - LWIP_UNLOCK(); + LWIP_LOCK(); + if (Client->pcb) + tcp_output(Client->pcb); + LWIP_UNLOCK(); #else - tcpip_send_msg_wait_sem(mqtt_tcpout_fn,0,&LwipSem); + tcpip_send_msg_wait_sem(mqtt_tcpout_fn,0,&LwipSem); #endif + } } @@ -997,7 +997,7 @@ int MqttClient::subscribe(const char *topic, void (*callback)(const char *,const { Subscription s; s.callback = callback; - Lock lock(mtx,__FUNCTION__); + RLock lock(mtx,__FUNCTION__); subscriptions.insert(make_pair((estring)topic,s)); EnvString *str = signals->add(topic,""); values.insert(make_pair((estring)topic,str)); @@ -1030,7 +1030,7 @@ void mqtt_stop(void *arg) if (Client == 0) return; log_dbug(TAG,"stop"); - Lock lock(Client->mtx,__FUNCTION__); + RLock lock(Client->mtx,__FUNCTION__); if (Client->pcb != 0) { #if LWIP_TCPIP_CORE_LOCKING == 1 uint8_t request[] { DISCONNECT, 0 }; @@ -1060,7 +1060,7 @@ void mqtt_stop(void *arg) static void mqtt_connect(const char *hn, const ip_addr_t *addr, void *arg) { // called as callback from tcpip_task - Lock lock(Client->mtx,__FUNCTION__); + RLock lock(Client->mtx,__FUNCTION__); if ((Client->state != connecting) && (Client->state != running) && (addr != 0)) { uint16_t port = (uint16_t)(unsigned)arg; if (Client->pcb) { diff --git a/main/screen.cpp b/main/screen.cpp index 4bd9189..052cd78 100644 --- a/main/screen.cpp +++ b/main/screen.cpp @@ -89,7 +89,7 @@ static void switch_mode(void *arg) EnvElement *e = RTData->getElement(x); while (e) { const char *name = e->name(); - if ((0 == strcmp(name,"version")) || (0 == strcmp(name,"ltime")) || (0 == strcmp(name,"uptime"))) { + if ((0 == strcmp(name,"ltime")) || (0 == strcmp(name,"uptime"))) { ++x; e = RTData->getElement(x); continue; @@ -131,6 +131,7 @@ static void switch_mode(void *arg) Ctx->modech = true; } + static void bright_set(void *arg) { if (arg) { @@ -159,27 +160,24 @@ void Screen::display_time() { uint8_t h=0,m=0,s=0; unsigned y=0; + const char *str; if (get_time_of_day(&h,&m,&s,0,0,0,&y)) { - disp->write("--:--:--"); + str = "--:--:--"; } else { - char str[12]; - sprintf(str,"%02u:%02u:%02u",h,m,s); - disp->write(str); + char *buf = (char *) alloca(16); + sprintf(buf,"%02u:%02u:%02u",h,m,s); + str = buf; + } + if (strcmp(str,prev.c_str())) { + if (MatrixDisplay *dm = disp->toMatrixDisplay()) { + dm->setupOffScreen(5,24,100,40,0); + dm->drawText(5,24,str,0xffff,-2); + dm->commitOffScreen(); + } else { + disp->write(str); + } + prev = str; } - /* - disp->writeHex(h/10); - disp->writeHex(h%10,!colon); - if (colon) - disp->write(":"); - disp->writeHex(m/10); - disp->writeHex(m%10,digits>=6?!colon:false); - if ((colon && (digits >= 8)) || (digits >= 6)) { - if (colon) - disp->write(":"); - disp->writeHex(s/10); - disp->writeHex(s%10); - } - */ } @@ -187,71 +185,106 @@ void Screen::display_date() { uint8_t wd=0,day=0,mon=0; unsigned year=0; + const char *str; if (get_time_of_day(0,0,0,&wd,&day,&mon,&year)) { - disp->write("--.--.----"); - return; + str = "--.--.----"; + } else { + char *buf = (char *) alloca(16); + sprintf(buf,"%u.%u.%u",day,mon,year); + str = buf; } - char str[12]; - sprintf(str,"%u.%u.%u",day,mon,year); - disp->write(str); - /* - disp->writeHex(day/10); - disp->writeHex(day%10,true); - disp->writeHex(mon/10); - disp->writeHex(mon%10,true); - if (digits >= 8) { - disp->writeHex(year/1000); - disp->writeHex((year%1000)/100); + if (strcmp(str,prev.c_str())) { + if (MatrixDisplay *dm = disp->toMatrixDisplay()) + dm->setPos(5,24); + disp->write(str); + prev = str; + } +} + + +void Screen::display_env() +{ + EnvElement *e = RTData->getElement(Ctx->mode-CLOCK_MODE_MAX); + if (e == 0) + return; + const char *str = 0; + if (EnvNumber *n = e->toNumber()) { + char *buf = (char *)alloca(128); + size_t a; + const char *fmt = n->getFormat(); + double v = n->get(); + if (!isnan(v) && (fmt != 0)) { + a = snprintf(buf,128,fmt,v); + str = buf; + } else { + if (Ctx->disp->hasAlpha()) + str = "NaN"; + else + str = "---"; + a = 3; + } + if (const char *dim = e->getDimension()) { + buf[a++] = ' '; + strcpy(buf+a,dim); + } + } else if (EnvBool *b = e->toBool()) { + str = b->get() ? "on" : "off"; + } else if (EnvString *s = e->toString()) { + str = s->get(); } - if (digits >= 6) { - year %= 100; - disp->writeHex(year/10); - disp->writeHex(year%10); + if ((str != 0) && (strcmp(prev.c_str(),str))) { + if (MatrixDisplay *dm = disp->toMatrixDisplay()) { + unsigned fh = dm->fontHeight(); + dm->setupOffScreen(5,24,dm->maxX()-10,fh,0); + dm->drawText(5,24,str,-1,0xffff,-2); + dm->commitOffScreen(); + } else { + disp->write(str); + } + prev = str; } - */ } void Screen::display_version() { + const char *sp = strchr(Version,' '); if (MatrixDisplay *dm = disp->toMatrixDisplay()) { assert(dm->maxX()); dm->drawRect(4,1,dm->maxX()-5,dm->maxY()-3); + if (dm->setupOffScreen(10,8,100,50,0)) + log_warn(TAG,"off screen too large"); dm->setFont(font_sanslight16); - dm->setPos(10,3); - dm->write("Atrium"); + dm->drawText(10,8,"Atrium",6,-1,-2); dm->setFont(font_sanslight12); - dm->setPos(10,26); - const char *sp = strchr(Version,' '); - dm->write(Version,sp-Version); - if (dm->maxY() >= 48) { - dm->setPos(10,48); + dm->drawText(10,28,Version,sp-Version); + if (dm->maxY() >= 50) { dm->setFont(font_tomthumb); - dm->write("(C) 2021-2023, T.Maier-Komor"); + dm->drawText(10,45,"(C) 2021-2023, T.Maier-Komor",28,0xffff,-2); } - return; - } - const char *sp = strchr(Version,' '); - disp->setPos(0,0); - unsigned cpl = disp->charsPerLine(); - unsigned nl = disp->numLines(); - if (disp->hasAlpha() && (cpl > 6) && (nl > 1)) { - disp->write("Atrium "); - if (cpl < 12) - disp->setPos(0,1); - disp->write(Version,sp-Version); - if (cpl < 12) - return; - disp->setPos(0,1); - if (cpl >= 20) - disp->write("(C) 2023 Maier-Komor"); - else - disp->write("(C) Maier-Komor"); - if (nl > 2) - disp->write(sp+1); - disp->setPos(0,nl+1); + dm->commitOffScreen(); } else { - disp->write(Version+1,sp-Version-1); + disp->setPos(0,0); + unsigned cpl = disp->charsPerLine(); + unsigned nl = disp->numLines(); + if (disp->hasAlpha() && (cpl > 6) && (nl > 1)) { + disp->write("Atrium "); + if (cpl < 12) + disp->setPos(0,1); + disp->write(Version,sp-Version); + if (cpl < 12) + return; + disp->setPos(0,1); + if (cpl >= 20) + disp->write("(C) 2023 Maier-Komor"); + else + disp->write("(C) Maier-Komor"); + if (nl > 2) + disp->write(sp+1); + disp->setPos(0,nl+1); + } else { + disp->write(Version+1,sp-Version-1); + } } } @@ -295,8 +328,19 @@ void Screen::display_sw() } else { sprintf(str,"%02u.%u%u",s,dsec,hsec); } - disp->write(str); - disp->clrEol(); + if (strcmp(str,prev.c_str())) { + if (MatrixDisplay *dm = disp->toMatrixDisplay()) { + // monospace font - i.e. all glyphs have same width + unsigned cw = dm->getFont()->glyph[0].xAdvance; + dm->setupOffScreen(5,24,12*cw,dm->fontHeight(),0); + dm->drawText(5,24,str); + dm->commitOffScreen(); + } else { + Ctx->disp->write("\r"); + disp->write(str); + } + prev = str; + } } @@ -308,9 +352,10 @@ static unsigned clock_iter(void *arg) if (Ctx->modech) { Ctx->disp->clear(); Ctx->modech = false; + Ctx->prev.clear(); if (alpha) { const char *text = 0; - uint8_t nextFont = font_sans12; + uint8_t nextFont = font_sanslight16; switch (Ctx->mode) { case cm_time: text = "local time"; @@ -326,6 +371,8 @@ static unsigned clock_iter(void *arg) text = "stop-watch"; nextFont = font_mono9; break; + case cm_lua: + break; default: if (EnvElement *e = RTData->getElement(Ctx->mode-CLOCK_MODE_MAX)) { text = e->name(); @@ -345,11 +392,14 @@ static unsigned clock_iter(void *arg) log_dbug(TAG,"mode %s",text); if (dm) { dm->setFont(font_sanslight12); - dm->setPos(3,4); + dm->setupOffScreen(5,4,100,20,0); + dm->drawText(5,4,text); + dm->commitOffScreen(); + } else { Ctx->disp->setPos(0,0); + Ctx->disp->write(text); } - Ctx->disp->write(text); if (dm) { dm->setFont(nextFont); } @@ -367,25 +417,13 @@ static unsigned clock_iter(void *arg) return 50; unsigned d = 100; // Ctx->disp->setPos(0,Ctx->disp->numLines() > 1 ? 1 : 0); - if (dm) { - dm->setPos(5,22); - } else { + if (0 == dm) { Ctx->disp->write("\r"); - Ctx->disp->clrEol(); } - double v = 0; - const char *fmt = 0, *dim = 0; switch (Ctx->mode) { case cm_date: - if ((uptime() - Ctx->modestart) < 5000) { - Ctx->display_date(); - d = 500; - break; - } - log_dbug(TAG,"auto date->clock"); - Ctx->mode = cm_time; - Ctx->modech = true; - d = 20; + Ctx->display_date(); + d = 100; break; case cm_time: Ctx->display_time(); @@ -411,44 +449,11 @@ static unsigned clock_iter(void *arg) d = xlua_render(Ctx); #else Ctx->mode = (clockmode_t)((int)Ctx->mode + 1); + Ctx->modech = true; #endif break; default: - if (EnvElement *e = RTData->getElement(Ctx->mode-CLOCK_MODE_MAX)) { - dim = e->getDimension(); - fmt = ""; - if (EnvNumber *n = e->toNumber()) { - fmt = n->getFormat(); - v = n->get(); - if (isnan(v)) - fmt = "---"; - } else if (EnvBool *b = e->toBool()) { - fmt = b->get() ? "on" : "off"; - } else if (EnvString *s = e->toString()) { - fmt = s->get(); - } -// log_dbug(TAG,"%s %s",e->name(),fmt); - } - } - if (fmt) { - if (isnan(v)) { - if (Ctx->disp->hasAlpha()) - Ctx->disp->write("n/a"); - else - Ctx->disp->write("----"); - } else { - char buf[9]; - snprintf(buf,sizeof(buf),fmt,v); -// log_dbug(TAG,"write %s",buf); - Ctx->disp->write(buf); - if (dim) { - if (Ctx->disp->charsPerLine() > 6) - Ctx->disp->write(" "); - Ctx->disp->write(dim); - } else { - Ctx->disp->clrEol(); - } - } + Ctx->display_env(); } Ctx->disp->flush(); return d; @@ -771,8 +776,8 @@ void screen_setup() if (d->maxBrightness() > 1) { action_add("display!set_bright",bright_set,0,"set brightness to argument value"); } - action_add("display!off",shutdown,Ctx,"clock: turn off"); - action_add("display!on",poweron,Ctx,"clock: turn on"); + action_add("display!off",shutdown,Ctx,"turn display off"); + action_add("display!on",poweron,Ctx,"turn display on"); action_add("sw!startstop",sw_startstop,Ctx,"stopwatch start/stop"); action_add("sw!reset",sw_clear,Ctx,"stopwatch reset"); action_add("sw!pause",sw_pause,Ctx,"stopwatch pause/resume"); @@ -784,9 +789,9 @@ void screen_setup() d->clear(); cyclic_add_task("display", clock_iter, Ctx); #ifdef CONFIG_LUA - xlua_add_funcs("screen",Functions); // TODO display mode Lua is missing + xlua_add_funcs("screen",Functions); if (Ctx->disp->toMatrixDisplay()) - xlua_add_funcs("fb",FbFunctions); // TODO display mode Lua is missing + xlua_add_funcs("fb",FbFunctions); #endif log_info(TAG,"ready"); } diff --git a/main/screen.h b/main/screen.h index 11f9ed8..29afdef 100644 --- a/main/screen.h +++ b/main/screen.h @@ -20,6 +20,7 @@ #define SCREEN_H #include +#include "estring.h" typedef enum clockmode { @@ -39,7 +40,9 @@ struct Screen uint8_t digits; clockmode_t mode = cm_time; bool modech = false; + estring prev; + void display_env(); void display_time(); void display_date(); void display_data(); diff --git a/main/settings.cpp b/main/settings.cpp index 7ed4aad..62d67b9 100644 --- a/main/settings.cpp +++ b/main/settings.cpp @@ -269,6 +269,7 @@ static int set_mqtt_enable(Terminal &t, const char *value) { return set_bool_option(t,Config.mutable_mqtt()->mutable_enable(),value,false); } +#endif int set_timezone(Terminal &t, const char *value) @@ -277,7 +278,6 @@ int set_timezone(Terminal &t, const char *value) setenv("TZ",Config.timezone().c_str(),1); return r; } -#endif static int set_domainname(Terminal &t, const char *value) @@ -296,8 +296,8 @@ static int set_password(Terminal &t, const char *p) pair SetFns[] = { {"password", set_password}, {"domainname", set_domainname}, -#if 0 {"timezone", set_timezone}, +#if 0 {"cpu_freq", set_cpu_freq}, {"ap_activate", set_ap_activate}, {"ap_pass", set_ap_pass}, @@ -509,6 +509,7 @@ void cfg_init_defaults() Config.mutable_softap()->set_activate(true); initNodename(); Config.mutable_softap()->set_ssid(Config.nodename().c_str()); + setenv("TZ","C",1); } @@ -680,6 +681,8 @@ void cfg_activate() PROFILE_FUNCTION(); log_info(TAG,"activate config"); + if (Config.has_timezone()) + setenv("TZ",Config.timezone().c_str(),1); if (!Config.has_nodename()) initNodename(); if (Config.has_domainname()) { diff --git a/main/shell.cpp b/main/shell.cpp index bb3b154..7c92bf6 100644 --- a/main/shell.cpp +++ b/main/shell.cpp @@ -695,43 +695,6 @@ static const char *shell_cp(Terminal &term, int argc, const char *args[]) #endif -void print_hex(Terminal &term, const uint8_t *b, size_t s, size_t off) -{ - const uint8_t *a = b, *e = b + s; - while (a != e) { - char tmp[64], *t = tmp; - t += sprintf(t,"%04x: ",a-b+off); - int i = 0; - while ((a < e) && (i < 16)) { - *t++ = ' '; - if (i == 8) - *t++ = ' '; -#if 0 - uint8_t d = *a; - uint8_t h = d >> 4; - if (h > 9) - *t = 'a' - 10 + h; - else - *t = '0' + h; - ++t; - uint8_t l = d & 0xf; - if (l > 9) - *t = 'a' - 10 + l; - else - *t = '0' + l; - ++t; -#else - t += sprintf(t,"%02x",*a); -#endif - ++i; - ++a; - } - *t = 0; - term.println(tmp); - } -} - - #ifdef HAVE_FS static const char *shell_touch(Terminal &term, int argc, const char *args[]) { @@ -784,7 +747,7 @@ static const char *shell_xxd(Terminal &term, int argc, const char *args[]) int n = read(fd,buf,sizeof(buf)); size_t off = 0; while (n > 0) { - print_hex(term,buf,n,off); + term.print_hex(buf,n,off); n = read(fd,buf,sizeof(buf)); off += n; } @@ -1131,7 +1094,7 @@ static const char *hwconf(Terminal &term, int argc, const char *args[]) size_t s = HWConf.calcSize(); uint8_t *buf = (uint8_t *) malloc(s); HWConf.toMemory(buf,s); - print_hex(term,buf,s); + term.print_hex(buf,s); free(buf); } else if ((!strcmp("show",args[1])) || !strcmp("print",args[1])) { if (argc == 2) @@ -1173,7 +1136,7 @@ static const char *hwconf(Terminal &term, int argc, const char *args[]) if (int e = nvm_read_blob("hw.cfg",&buf,&s)) { return esp_err_to_name(e); } - print_hex(term,buf,s); + term.print_hex(buf,s); free(buf); } else if (!strcmp("parsexxd",args[1])) { if (parse_xxd(term,hwcfgbuf)) @@ -1191,7 +1154,7 @@ static const char *hwconf(Terminal &term, int argc, const char *args[]) } else if (!strcmp("clearbuf",args[1])) { hwcfgbuf.clear(); } else if (!strcmp("xxdbuf",args[1])) { - print_hex(term,hwcfgbuf.data(),hwcfgbuf.size()); + term.print_hex(hwcfgbuf.data(),hwcfgbuf.size()); } else if (!strcmp(args[1],"read")) { return cfg_read_hwcfg() ? "Failed." : 0; } else if (!strcmp(args[1],"backup")) { @@ -1205,32 +1168,11 @@ static const char *hwconf(Terminal &term, int argc, const char *args[]) } -static const char *OnStr[] = { "true","on","yes" }; -static const char *OffStr[] = { "false","off","no" }; - - -static int arg_bool(const char *v, bool &b) -{ - for (const char *on : OnStr) { - if (0 == strcasecmp(on,v)) { - b = true; - return 0; - } - } - for (const char *off : OffStr) { - if (0 == strcasecmp(off,v)) { - b = false; - return 0; - } - } - return 1; -} - static bool parse_bool(int argc, const char *args[], int a, bool d) { bool r; - if ((a >= argc) || arg_bool(args[a],r)) + if ((a >= argc) || arg_bool(args[a],&r)) return d; return r; } @@ -1334,7 +1276,7 @@ static const char *timefuse(Terminal &term, int argc, const char *args[]) if ('r' == optchr) { const char *r = 0; bool rep; - if (arg_bool(args[3],rep)) + if (arg_bool(args[3],&rep)) r = "Invalid argument #3."; #ifdef ESP32 else if (timefuse_repeat_set(args[2],rep)) @@ -1693,7 +1635,7 @@ static const char *dumpcore(Terminal &term, const char *fn) } const char *ret = 0; if (fn == 0) { - print_hex(term,data,size); + term.print_hex(data,size); } else { const char *f = fn; if (fn[0] != '/') { @@ -1847,7 +1789,7 @@ static const char *xxdSettings(Terminal &t) if (buf == 0) return "Out of memory."; Config.toMemory(buf,s); - print_hex(t,buf,s); + t.print_hex(buf,s); free(buf); return 0; } @@ -1955,7 +1897,7 @@ static const char *config(Terminal &term, int argc, const char *args[]) } else if (!strcmp("clearbuf",args[1])) { rtcfgbuf.clear(); } else if (!strcmp("xxdbuf",args[1])) { - print_hex(term,rtcfgbuf.data(),rtcfgbuf.size()); + term.print_hex(rtcfgbuf.data(),rtcfgbuf.size()); } else if (!strcmp(args[1],"xxd")) { return xxdSettings(term); } else if (!strcmp(args[1],"nvxxd")) { @@ -1963,7 +1905,7 @@ static const char *config(Terminal &term, int argc, const char *args[]) uint8_t *buf = 0; if (int e = nvm_read_blob("node.cfg",&buf,&s)) return e ? "Failed." : 0; - print_hex(term,buf,s); + term.print_hex(buf,s); free(buf); } else { return "Invalid argument #1."; @@ -2310,7 +2252,7 @@ static const char *thresholds(Terminal &term, int argc, const char *args[]) return "Invalid argument #1."; n->setThresholds(lo,hi); bool updated = false; - for (auto t : *Config.mutable_thresholds()) { + for (ThresholdConfig &t : *Config.mutable_thresholds()) { if (t.name() == args[1]) { t.set_low(lo); t.set_high(hi); @@ -2496,6 +2438,7 @@ static const char *version(Terminal &term, int argc, const char *args[]) extern const char *adc(Terminal &term, int argc, const char *args[]); extern const char *at(Terminal &term, int argc, const char *args[]); extern const char *bme(Terminal &term, int argc, const char *args[]); +extern const char *buzzer(Terminal &t, int argc, const char *args[]); extern const char *dht(Terminal &term, int argc, const char *args[]); extern const char *dim(Terminal &term, int argc, const char *args[]); extern const char *distance(Terminal &term, int argc, const char *args[]); @@ -2544,6 +2487,9 @@ ExeName ExeNames[] = { #endif #ifdef CONFIG_OTA {"boot",0,boot,"get/set boot partition",boot_man}, +#endif +#ifdef CONFIG_BUZZER + {"buzzer",0,buzzer,"buzzer with frequency and time",0}, #endif {"cat",0,shell_cat,"cat file",0}, #if defined CONFIG_FATFS || defined CONFIG_ROMFS_VFS diff --git a/main/shell.h b/main/shell.h index 7acc84e..0870655 100644 --- a/main/shell.h +++ b/main/shell.h @@ -28,7 +28,7 @@ int exe_flags(char *cmd); const char *shellexe(Terminal &, char *cmd); void shell(Terminal &term, bool prompt = true); const char *help_cmd(Terminal &term, const char *arg); -void print_hex(Terminal &term, const uint8_t *b, size_t s, size_t off = 0); +int arg_bool(const char *v, bool *b); extern "C" #endif diff --git a/main/spi.cpp b/main/spi.cpp index af033ed..aa2fad5 100644 --- a/main/spi.cpp +++ b/main/spi.cpp @@ -132,11 +132,12 @@ SDCard *SDCard::create(spi_host_device_t host, spi_device_interface_config_t &cf } #endif -static void spi_init_device(spi_host_device_t host, spidrv_t drv, int8_t cs, int8_t intr, int8_t reset, int8_t cd) +static void spi_init_device(spi_host_device_t host, spidrv_t drv, int8_t cs, int8_t intr, int8_t reset, int8_t cd, unsigned freq) { spi_device_interface_config_t cfg; bzero(&cfg,sizeof(cfg)); cfg.spics_io_num = cs; + cfg.clock_speed_hz = freq * 1000; switch (drv) { case spidrv_invalid: break; @@ -271,7 +272,7 @@ void spi_setup() } log_info(TAG,"initialized SPI%u",host); for (auto &d : c.devices()) { - spi_init_device(hdev,d.drv(),d.cs(),d.intr(),d.reset(),d.cd()); + spi_init_device(hdev,d.drv(),d.cs(),d.intr(),d.reset(),d.cd(),d.freq()); } } SpiDevice *d = SpiDevice::getFirst(); diff --git a/main/startup.cpp b/main/startup.cpp index 3031743..cd0ed69 100644 --- a/main/startup.cpp +++ b/main/startup.cpp @@ -94,6 +94,7 @@ void action_setup(); void adc_setup(); void alarms_setup(); void button_setup(); +void buzzer_setup(); void console_setup(); void cyclic_setup(); void dht_setup(); @@ -120,6 +121,7 @@ void timefuse_setup(); void tlc5947_setup(); int touchpads_setup(); void udns_setup(); +void usb_setup(); void xlua_setup(); void udpctrl_setup(); int webcam_setup(); @@ -304,10 +306,16 @@ void app_main() #ifdef CONFIG_I2C i2c_setup(); // must be before xio_setup to provide io-cluster #endif +#ifdef CONFIG_ESP_PHY_ENABLE_USB + usb_setup(); +#endif #ifdef CONFIG_SPI spi_setup(); // must be before xio_setup to provide io-cluster #endif xio_setup(); +#ifdef CONFIG_BUZZER + buzzer_setup(); +#endif verify_heap(); adc_setup(); #ifdef CONFIG_IDF_TARGET_ESP32 @@ -396,14 +404,15 @@ void app_main() #ifdef CONFIG_LUA xlua_setup(); #endif -#ifdef CONFIG_STATEMACHINES - sm_setup(); -#endif #ifdef CONFIG_DISPLAY display_setup(); screen_setup(); #endif // CONFIG_DISPLAY +#ifdef CONFIG_STATEMACHINES + sm_setup(); +#endif + // activate actions after all events and actions are setup // otherwise this step will fail //cfg_activate_actions(); -- removed diff --git a/main/statemach.cpp b/main/statemach.cpp index 98ef0be..e7745d9 100644 --- a/main/statemach.cpp +++ b/main/statemach.cpp @@ -253,7 +253,8 @@ StateMachine::StateMachine(const StateMachineConfig &cfg) uint8_t x = cfg.ini_st(); if (x >= numst) x = 0; - x = nvm_read_u8(m_name.c_str(),x); + if (m_persistent) + x = nvm_read_u8(m_name.c_str(),x); if (x < cfg.states_size()) switch_state(cfg.states(x).name().c_str()); } diff --git a/main/usb.cpp b/main/usb.cpp index 268098e..09b3f8c 100644 --- a/main/usb.cpp +++ b/main/usb.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2022, Thomas Maier-Komor + * Copyright (C) 2022-2023, Thomas Maier-Komor * Atrium Firmware Package for ESP * * This program is free software: you can redistribute it and/or modify @@ -19,18 +19,176 @@ #include -#ifdef CONFIG_USB +#ifdef CONFIG_ESP_PHY_ENABLE_USB +#include "adc.h" +#include "charger.h" #include "cyclic.h" #include "event.h" +#include "env.h" +#include "globals.h" +#include "hwcfg.h" #include "log.h" - -#include -#include +#include "shell.h" +#include "swcfg.h" +#include "terminal.h" #define TAG MODULE_USB +struct UsbCcMonitor +{ + EnvString cable, status; + EnvNumber imax, cc1, cc2; + adc_oneshot_unit_handle_t cc1h, cc2h; + adc_channel_t cc1c, cc2c; + adc_cali_handle_t cali1 = 0, cali2 = 0; + + UsbCcMonitor(adc_oneshot_unit_handle_t h1, adc_oneshot_unit_handle_t h2, adc_channel_t c1, adc_channel_t c2, adc_cali_handle_t ca1, adc_cali_handle_t ca2); + + unsigned cyclic(); +}; + + +UsbCcMonitor::UsbCcMonitor(adc_oneshot_unit_handle_t h1, adc_oneshot_unit_handle_t h2, adc_channel_t ch1, adc_channel_t ch2, adc_cali_handle_t ca1, adc_cali_handle_t ca2) +: cable("cable","unknown") +, status("status","invalid") +, imax("Imax",500,"mA") +, cc1("CC1",NAN,"mV") +, cc2("CC2",NAN,"mV") +, cc1h(h1), cc2h(h2) +, cc1c(ch1), cc2c(ch2) +, cali1(ca1), cali2(ca2) +{ +} + + +unsigned usb_cc_cyclic(void *arg) +{ + UsbCcMonitor *drv = (UsbCcMonitor*)arg; + int raw1, raw2, v1, v2; + const char *errstr = "failed"; + const char *cbl = "unknown"; + double imax = 200; + + if (0 != adc_oneshot_read(drv->cc1h, drv->cc1c, &raw1)) { + errstr = "read-cc1"; + } else if (0 != adc_oneshot_read(drv->cc2h, drv->cc2c, &raw2)) { + errstr = "read-cc2"; + } else { + if (adc_cali_raw_to_voltage(drv->cali1, raw1, &v1)) { + errstr = "conv-cc1"; + } else if (adc_cali_raw_to_voltage(drv->cali2, raw2, &v2)) { + errstr = "conv-cc2"; + } else { + // 0.4V : 500mA + // 0.9V : 1500mA + // 1.6V : 3000mA + if ((v1 > 1400) && (v2 < 100)) { + imax = 3000; + cbl = "connected"; + } else if ((v1 < 100) && (v2 > 1400)) { + imax = 3000; + cbl = "flipped"; + } else if ((v1 > 800) && (v2 < 100)) { + imax = 1500; + cbl = "connected"; + } else if ((v1 < 100) && (v2 > 800)) { + imax = 1500; + cbl = "flipped"; + } else if ((v1 > 400) && (v2 < 100)) { + imax = 500; + cbl = "connected"; + } else if ((v1 < 100) && (v2 > 400)) { + imax = 500; + cbl = "flipped"; + } else if ((v1 > 300) && (v2 > 300)) { + cbl = "connected"; + imax = 500; + } else if ((v1 < 200) && (v2 < 200)) { + cbl = "disconnected"; + } else { + cbl = "unknown"; + imax = 500; + } + errstr= "ok"; + if (Charger *c = Charger::getInstance()) + c->setImax(imax); + } + } + drv->cable.set(cbl); + drv->imax.set(imax); + drv->status.set(errstr); + drv->cc1.set((float)v1); + drv->cc2.set((float)v2); + return 100; +} + + +void usb_setup() +{ + const auto &sys = HWConf.system(); + int8_t cc1 = sys.cc1_gpio(); + int8_t cc2 = sys.cc2_gpio(); + log_dbug(TAG,"cc1 = %d, cc2 = %d",(int)cc1,(int)cc2); + if ((-1 != cc1) && (-1 != cc2)) { + adc_unit_t cc1u,cc2u; + adc_channel_t cc1c,cc2c; + if (esp_err_t e = adc_oneshot_io_to_channel(cc1,&cc1u,&cc1c)) { + log_warn(TAG,"invalid GPIO%d for CC1: %s",cc1,esp_err_to_name(e)); + } else if (esp_err_t e = adc_oneshot_io_to_channel(cc2,&cc2u,&cc2c)) { + log_warn(TAG,"invalid GPIO%d for CC2: %s",cc2,esp_err_to_name(e)); + } else { + adc_oneshot_unit_handle_t cc1h = adc_get_unit_handle(cc1u); + adc_oneshot_unit_handle_t cc2h = adc_get_unit_handle(cc2u); + EnvObject *usbenv = RTData->add("usb"); + adc_cali_handle_t cali1 = 0, cali2 = 0; +#if ADC_CALI_SCHEME_CURVE_FITTING_SUPPORTED + adc_cali_curve_fitting_config_t cali_config = { + .unit_id = cc1u, + .chan = cc1c, + .atten = ADC_ATTEN_DB_0, + .bitwidth = ADC_BITWIDTH_DEFAULT, + }; + if (esp_err_t ret = adc_cali_create_scheme_curve_fitting(&cali_config, &cali1)) + log_warn(TAG,"calibration failure: %s",esp_err_to_name(ret)); + cali_config.unit_id = cc2u; + cali_config.chan = cc2c; + if (esp_err_t ret = adc_cali_create_scheme_curve_fitting(&cali_config, &cali2)) + log_warn(TAG,"calibration failure: %s",esp_err_to_name(ret)); +#elif ADC_CALI_SCHEME_LINE_FITTING_SUPPORTED + adc_cali_line_fitting_config_t cali_config = { + .unit_id = cc1u, + .atten = ADC_ATTEN_DB_0, + .bitwidth = ADC_BITWIDTH_DEFAULT, + }; + if (esp_err_t ret = adc_cali_create_scheme_line_fitting(&cali_config, &cali1)) + log_warn(TAG,"calibration failure: %s",esp_err_to_name(ret)); + cali_config.unit_id = cc2u; + if (esp_err_t ret = adc_cali_create_scheme_line_fitting(&cali_config, &cali2)) + log_warn(TAG,"calibration failure: %s",esp_err_to_name(ret)); +#else +#error no known adc cali scheme +#endif + UsbCcMonitor *m = new UsbCcMonitor(cc1h,cc2h,cc1c,cc2c,cali1,cali2); + usbenv->add(&m->cable); + usbenv->add(&m->status); + usbenv->add(&m->imax); + usbenv->add(&m->cc1); + usbenv->add(&m->cc2); + cyclic_add_task("usb",usb_cc_cyclic,m,0); + } + } +} + +#endif // CONFIG_ESP_PHY_ENABLE_USB + + +#if 0 // defined CONFIG_USB_CONSOLE && defined CONFIG_TINYUSB_CDC_ENABLED + +#include +#include + struct UsbConsole { size_t size = 0; @@ -81,3 +239,6 @@ void usb_setup() #endif // CONFIG_USB + + + diff --git a/patches/idf-esp8266-v3.3.diff b/patches/idf-esp8266-v3.3.diff index ec56af2..cfbaed1 100644 --- a/patches/idf-esp8266-v3.3.diff +++ b/patches/idf-esp8266-v3.3.diff @@ -98,3 +98,17 @@ index e59795cc..4c408848 100644 return ESP_ERR_INVALID_ARG; } } +diff --git a/tools/idf_tools.py b/tools/idf_tools.py +index 7cdd1823..739dccdc 100755 +--- a/tools/idf_tools.py ++++ b/tools/idf_tools.py +@@ -1066,7 +1066,7 @@ def action_install_python_env(args): + subprocess.check_call([sys.executable, '-m', 'pip', 'install', '--user', 'virtualenv'], + stdout=sys.stdout, stderr=sys.stderr) + +- subprocess.check_call([sys.executable, '-m', 'virtualenv', '--no-site-packages', idf_python_env_path], ++ subprocess.check_call([sys.executable, '-m', 'virtualenv', idf_python_env_path], + stdout=sys.stdout, stderr=sys.stderr) + run_args = [virtualenv_python, '-m', 'pip', 'install', '--no-warn-script-location'] + requirements_txt = os.path.join(global_idf_path, 'requirements.txt') + diff --git a/projects/esp32-c3_4m b/projects/esp32-c3_4m index d002409..1cd4540 100644 --- a/projects/esp32-c3_4m +++ b/projects/esp32-c3_4m @@ -994,7 +994,7 @@ CONFIG_FREERTOS_QUEUE_REGISTRY_SIZE=0 CONFIG_FREERTOS_TASK_NOTIFICATION_ARRAY_ENTRIES=1 CONFIG_FREERTOS_USE_TRACE_FACILITY=y CONFIG_FREERTOS_USE_STATS_FORMATTING_FUNCTIONS=y -# CONFIG_FREERTOS_VTASKLIST_INCLUDE_COREID is not set +CONFIG_FREERTOS_VTASKLIST_INCLUDE_COREID=y CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS=y # end of Kernel @@ -1646,6 +1646,7 @@ CONFIG_IOEXTENDERS=y CONFIG_LEDS=y CONFIG_BUTTON=y CONFIG_ROTARYENCODER=y +CONFIG_BUZZER=y CONFIG_RELAY=y CONFIG_ONEWIRE=y CONFIG_DISPLAY=y @@ -1655,24 +1656,27 @@ CONFIG_SSD1306=y CONFIG_SH1106=y CONFIG_DHT=y CONFIG_I2C=y -CONFIG_I2C_XCMD=y -CONFIG_I2C_XDEV=y -CONFIG_PCA9685=y -CONFIG_PCF8574=y -CONFIG_TCA9555=y -CONFIG_MCP2300X=y -CONFIG_MCP2301X=y CONFIG_OPT3001=y -CONFIG_INA2XX=y -CONFIG_SI7021=y CONFIG_BMX280=y +CONFIG_BMP388=y CONFIG_BME680=y +CONFIG_BQ25601D=y CONFIG_HDC1000=y CONFIG_APDS9930=y CONFIG_SGP30=y CONFIG_CCS811B=y CONFIG_BH1750=y +CONFIG_I2C_XCMD=y +CONFIG_I2C_XDEV=y +CONFIG_INA2XX=y +CONFIG_SI7021=y +CONFIG_PCA9685=y +CONFIG_PCF8574=y +CONFIG_TCA9555=y +CONFIG_MCP2300X=y +CONFIG_MCP2301X=y CONFIG_SPI=y +CONFIG_SSD1309=y CONFIG_ILI9341=y CONFIG_SDCARD=y CONFIG_XPT2046=y diff --git a/projects/esp32-c3_4m_dev b/projects/esp32-c3_4m_dev index 6573322..df88ea2 100644 --- a/projects/esp32-c3_4m_dev +++ b/projects/esp32-c3_4m_dev @@ -994,7 +994,7 @@ CONFIG_FREERTOS_QUEUE_REGISTRY_SIZE=0 CONFIG_FREERTOS_TASK_NOTIFICATION_ARRAY_ENTRIES=1 CONFIG_FREERTOS_USE_TRACE_FACILITY=y CONFIG_FREERTOS_USE_STATS_FORMATTING_FUNCTIONS=y -# CONFIG_FREERTOS_VTASKLIST_INCLUDE_COREID is not set +CONFIG_FREERTOS_VTASKLIST_INCLUDE_COREID=y CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS=y # end of Kernel @@ -1647,6 +1647,7 @@ CONFIG_IOEXTENDERS=y CONFIG_LEDS=y CONFIG_BUTTON=y CONFIG_ROTARYENCODER=y +CONFIG_BUZZER=y CONFIG_RELAY=y CONFIG_ONEWIRE=y CONFIG_DISPLAY=y @@ -1657,24 +1658,25 @@ CONFIG_SH1106=y CONFIG_DHT=y CONFIG_HLW8012=y CONFIG_I2C=y -CONFIG_I2C_XCMD=y -CONFIG_I2C_XDEV=y -CONFIG_PCA9685=y -CONFIG_PCF8574=y -CONFIG_TCA9555=y -CONFIG_MCP2300X=y -CONFIG_MCP2301X=y CONFIG_OPT3001=y -CONFIG_INA2XX=y -CONFIG_SI7021=y CONFIG_BMX280=y CONFIG_BMP388=y CONFIG_BME680=y +CONFIG_BQ25601D=y CONFIG_HDC1000=y CONFIG_APDS9930=y CONFIG_SGP30=y CONFIG_CCS811B=y CONFIG_BH1750=y +CONFIG_I2C_XCMD=y +CONFIG_I2C_XDEV=y +CONFIG_INA2XX=y +CONFIG_SI7021=y +CONFIG_PCA9685=y +CONFIG_PCF8574=y +CONFIG_TCA9555=y +CONFIG_MCP2300X=y +CONFIG_MCP2301X=y CONFIG_SPI=y CONFIG_SX1276=y CONFIG_SSD1309=y diff --git a/projects/esp32-c6_4m b/projects/esp32-c6_4m index 21195eb..ce1110d 100644 --- a/projects/esp32-c6_4m +++ b/projects/esp32-c6_4m @@ -1753,12 +1753,14 @@ CONFIG_USB_HOST_FS=y # # hardware support # +# CONFIG_USB_DIAGLOG is not set CONFIG_USB_CONSOLE=y CONFIG_GPIOS=y CONFIG_IOEXTENDERS=y CONFIG_LEDS=y CONFIG_BUTTON=y CONFIG_ROTARYENCODER=y +CONFIG_BUZZER=y CONFIG_RELAY=y CONFIG_ONEWIRE=y CONFIG_DISPLAY=y @@ -1768,24 +1770,27 @@ CONFIG_SSD1306=y CONFIG_SH1106=y # CONFIG_DHT is not set CONFIG_I2C=y -CONFIG_I2C_XCMD=y -CONFIG_I2C_XDEV=y -CONFIG_PCA9685=y -CONFIG_PCF8574=y -CONFIG_TCA9555=y -CONFIG_MCP2300X=y -CONFIG_MCP2301X=y CONFIG_OPT3001=y -CONFIG_INA2XX=y -CONFIG_SI7021=y CONFIG_BMX280=y -# CONFIG_BME680 is not set +CONFIG_BMP388=y +CONFIG_BME680=y +CONFIG_BQ25601D=y CONFIG_HDC1000=y CONFIG_APDS9930=y CONFIG_SGP30=y CONFIG_CCS811B=y CONFIG_BH1750=y +CONFIG_I2C_XCMD=y +CONFIG_I2C_XDEV=y +CONFIG_INA2XX=y +CONFIG_SI7021=y +CONFIG_PCA9685=y +CONFIG_PCF8574=y +CONFIG_TCA9555=y +CONFIG_MCP2300X=y +CONFIG_MCP2301X=y CONFIG_SPI=y +CONFIG_SSD1309=y CONFIG_ILI9341=y CONFIG_SDCARD=y CONFIG_XPT2046=y diff --git a/projects/esp32-s2_4m b/projects/esp32-s2_4m index 6b4fa99..5736cff 100644 --- a/projects/esp32-s2_4m +++ b/projects/esp32-s2_4m @@ -1702,6 +1702,7 @@ CONFIG_IOEXTENDERS=y CONFIG_LEDS=y CONFIG_BUTTON=y CONFIG_ROTARYENCODER=y +CONFIG_BUZZER=y CONFIG_RELAY=y CONFIG_ONEWIRE=y CONFIG_DISPLAY=y @@ -1711,24 +1712,27 @@ CONFIG_SSD1306=y CONFIG_SH1106=y CONFIG_DHT=y CONFIG_I2C=y -CONFIG_I2C_XCMD=y -CONFIG_I2C_XDEV=y -CONFIG_PCA9685=y -CONFIG_PCF8574=y -CONFIG_TCA9555=y -CONFIG_MCP2300X=y -CONFIG_MCP2301X=y CONFIG_OPT3001=y -CONFIG_INA2XX=y -CONFIG_SI7021=y CONFIG_BMX280=y +CONFIG_BMP388=y CONFIG_BME680=y +CONFIG_BQ25601D=y CONFIG_HDC1000=y CONFIG_APDS9930=y CONFIG_SGP30=y CONFIG_CCS811B=y CONFIG_BH1750=y +CONFIG_I2C_XCMD=y +CONFIG_I2C_XDEV=y +CONFIG_INA2XX=y +CONFIG_SI7021=y +CONFIG_PCA9685=y +CONFIG_PCF8574=y +CONFIG_TCA9555=y +CONFIG_MCP2300X=y +CONFIG_MCP2301X=y CONFIG_SPI=y +CONFIG_SSD1309=y CONFIG_SDCARD=y CONFIG_XPT2046=y CONFIG_HCSR04=y diff --git a/projects/esp32-s3_4m b/projects/esp32-s3_4m index bb87cad..826e037 100644 --- a/projects/esp32-s3_4m +++ b/projects/esp32-s3_4m @@ -469,8 +469,8 @@ CONFIG_PARTITION_TABLE_MD5=y # # Compiler options # -CONFIG_COMPILER_OPTIMIZATION_DEFAULT=y -# CONFIG_COMPILER_OPTIMIZATION_SIZE is not set +# CONFIG_COMPILER_OPTIMIZATION_DEFAULT is not set +CONFIG_COMPILER_OPTIMIZATION_SIZE=y # CONFIG_COMPILER_OPTIMIZATION_PERF is not set # CONFIG_COMPILER_OPTIMIZATION_NONE is not set CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=y @@ -690,9 +690,9 @@ CONFIG_ESP_EVENT_POST_FROM_IRAM_ISR=y # # ESP HTTP client # -CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS=y +# CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS is not set # CONFIG_ESP_HTTP_CLIENT_ENABLE_BASIC_AUTH is not set -CONFIG_ESP_HTTP_CLIENT_ENABLE_DIGEST_AUTH=y +# CONFIG_ESP_HTTP_CLIENT_ENABLE_DIGEST_AUTH is not set # end of ESP HTTP client # @@ -949,7 +949,6 @@ CONFIG_ESP_SYSTEM_PANIC_PRINT_REBOOT=y # CONFIG_ESP_SYSTEM_PANIC_GDBSTUB is not set # CONFIG_ESP_SYSTEM_GDBSTUB_RUNTIME is not set CONFIG_ESP_SYSTEM_PANIC_REBOOT_DELAY_SECONDS=0 -CONFIG_ESP_SYSTEM_SINGLE_CORE_MODE=y CONFIG_ESP_SYSTEM_RTC_FAST_MEM_AS_HEAP_DEPCHECK=y CONFIG_ESP_SYSTEM_ALLOW_RTC_FAST_MEM_AS_HEAP=y @@ -964,6 +963,7 @@ CONFIG_ESP_SYSTEM_EVENT_QUEUE_SIZE=32 CONFIG_ESP_SYSTEM_EVENT_TASK_STACK_SIZE=2304 CONFIG_ESP_MAIN_TASK_STACK_SIZE=3584 CONFIG_ESP_MAIN_TASK_AFFINITY_CPU0=y +# CONFIG_ESP_MAIN_TASK_AFFINITY_CPU1 is not set # CONFIG_ESP_MAIN_TASK_AFFINITY_NO_AFFINITY is not set CONFIG_ESP_MAIN_TASK_AFFINITY=0x0 CONFIG_ESP_MINIMAL_SHARED_STACK_SIZE=2048 @@ -978,11 +978,13 @@ CONFIG_ESP_CONSOLE_MULTIPLE_UART=y CONFIG_ESP_CONSOLE_UART_NUM=-1 CONFIG_ESP_INT_WDT=y CONFIG_ESP_INT_WDT_TIMEOUT_MS=300 +CONFIG_ESP_INT_WDT_CHECK_CPU1=y CONFIG_ESP_TASK_WDT_EN=y CONFIG_ESP_TASK_WDT_INIT=y # CONFIG_ESP_TASK_WDT_PANIC is not set CONFIG_ESP_TASK_WDT_TIMEOUT_S=5 CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0=y +CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1=y # CONFIG_ESP_PANIC_HANDLER_IRAM is not set # CONFIG_ESP_DEBUG_STUBS_ENABLE is not set CONFIG_ESP_DEBUG_OCDAWARE=y @@ -1009,6 +1011,8 @@ CONFIG_ESP_SYSTEM_BROWNOUT_INTR=y # IPC (Inter-Processor Call) # CONFIG_ESP_IPC_TASK_STACK_SIZE=1536 +CONFIG_ESP_IPC_USES_CALLERS_PRIORITY=y +CONFIG_ESP_IPC_ISR_ENABLE=y # end of IPC (Inter-Processor Call) # @@ -1045,6 +1049,8 @@ CONFIG_ESP_WIFI_AMPDU_RX_ENABLED=y CONFIG_ESP_WIFI_RX_BA_WIN=6 # CONFIG_ESP_WIFI_AMSDU_TX_ENABLED is not set CONFIG_ESP_WIFI_NVS_ENABLED=y +CONFIG_ESP_WIFI_TASK_PINNED_TO_CORE_0=y +# CONFIG_ESP_WIFI_TASK_PINNED_TO_CORE_1 is not set CONFIG_ESP_WIFI_SOFTAP_BEACON_MAX_LEN=752 CONFIG_ESP_WIFI_MGMT_SBUF_NUM=32 CONFIG_ESP_WIFI_IRAM_OPT=y @@ -1085,20 +1091,18 @@ CONFIG_ESP_WIFI_MBEDTLS_TLS_CLIENT=y # # Core dump # -# CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH is not set -CONFIG_ESP_COREDUMP_ENABLE_TO_UART=y +CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH=y +# CONFIG_ESP_COREDUMP_ENABLE_TO_UART is not set # CONFIG_ESP_COREDUMP_ENABLE_TO_NONE is not set # CONFIG_ESP_COREDUMP_DATA_FORMAT_BIN is not set CONFIG_ESP_COREDUMP_DATA_FORMAT_ELF=y CONFIG_ESP_COREDUMP_CHECKSUM_CRC32=y +CONFIG_ESP_COREDUMP_CHECK_BOOT=y CONFIG_ESP_COREDUMP_ENABLE=y CONFIG_ESP_COREDUMP_LOGS=y CONFIG_ESP_COREDUMP_MAX_TASKS_NUM=64 -CONFIG_ESP_COREDUMP_UART_DELAY=0 -CONFIG_ESP_COREDUMP_STACK_SIZE=0 -CONFIG_ESP_COREDUMP_DECODE_INFO=y -# CONFIG_ESP_COREDUMP_DECODE_DISABLE is not set -CONFIG_ESP_COREDUMP_DECODE="info" +CONFIG_ESP_COREDUMP_USE_STACK_SIZE=y +CONFIG_ESP_COREDUMP_STACK_SIZE=1280 # end of Core dump # @@ -1149,9 +1153,8 @@ CONFIG_FATFS_VFS_FSTAT_BLKSIZE=0 # Kernel # # CONFIG_FREERTOS_SMP is not set -CONFIG_FREERTOS_UNICORE=y +# CONFIG_FREERTOS_UNICORE is not set CONFIG_FREERTOS_HZ=100 -CONFIG_FREERTOS_OPTIMIZED_SCHEDULER=y # CONFIG_FREERTOS_CHECK_STACKOVERFLOW_NONE is not set # CONFIG_FREERTOS_CHECK_STACKOVERFLOW_PTRVAL is not set CONFIG_FREERTOS_CHECK_STACKOVERFLOW_CANARY=y @@ -1167,8 +1170,9 @@ CONFIG_FREERTOS_TIMER_QUEUE_LENGTH=10 CONFIG_FREERTOS_QUEUE_REGISTRY_SIZE=0 CONFIG_FREERTOS_TASK_NOTIFICATION_ARRAY_ENTRIES=1 CONFIG_FREERTOS_USE_TRACE_FACILITY=y -# CONFIG_FREERTOS_USE_STATS_FORMATTING_FUNCTIONS is not set -# CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS is not set +CONFIG_FREERTOS_USE_STATS_FORMATTING_FUNCTIONS=y +CONFIG_FREERTOS_VTASKLIST_INCLUDE_COREID=y +CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS=y # end of Kernel # @@ -1185,6 +1189,7 @@ CONFIG_FREERTOS_TICK_SUPPORT_SYSTIMER=y CONFIG_FREERTOS_CORETIMER_SYSTIMER_LVL1=y # CONFIG_FREERTOS_CORETIMER_SYSTIMER_LVL3 is not set CONFIG_FREERTOS_SYSTICK_USES_SYSTIMER=y +CONFIG_FREERTOS_RUN_TIME_STATS_USING_ESP_TIMER=y # CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH is not set # CONFIG_FREERTOS_PLACE_SNAPSHOT_FUNS_INTO_FLASH is not set # CONFIG_FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE is not set @@ -1344,6 +1349,7 @@ CONFIG_LWIP_CHECKSUM_CHECK_ICMP=y CONFIG_LWIP_TCPIP_TASK_STACK_SIZE=3072 CONFIG_LWIP_TCPIP_TASK_AFFINITY_NO_AFFINITY=y # CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU0 is not set +# CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU1 is not set CONFIG_LWIP_TCPIP_TASK_AFFINITY=0x7FFFFFFF # CONFIG_LWIP_PPP_SUPPORT is not set CONFIG_LWIP_IPV6_MEMP_NUM_ND6_QUEUE=3 @@ -1509,17 +1515,17 @@ CONFIG_MBEDTLS_ECDH_C=y CONFIG_MBEDTLS_ECDSA_C=y # CONFIG_MBEDTLS_ECJPAKE_C is not set CONFIG_MBEDTLS_ECP_DP_SECP192R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_SECP224R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_SECP256R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_SECP384R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_SECP521R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_SECP192K1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_SECP224K1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_SECP256K1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_BP256R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_BP384R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_BP512R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_CURVE25519_ENABLED=y +# CONFIG_MBEDTLS_ECP_DP_SECP224R1_ENABLED is not set +# CONFIG_MBEDTLS_ECP_DP_SECP256R1_ENABLED is not set +# CONFIG_MBEDTLS_ECP_DP_SECP384R1_ENABLED is not set +# CONFIG_MBEDTLS_ECP_DP_SECP521R1_ENABLED is not set +# CONFIG_MBEDTLS_ECP_DP_SECP192K1_ENABLED is not set +# CONFIG_MBEDTLS_ECP_DP_SECP224K1_ENABLED is not set +# CONFIG_MBEDTLS_ECP_DP_SECP256K1_ENABLED is not set +# CONFIG_MBEDTLS_ECP_DP_BP256R1_ENABLED is not set +# CONFIG_MBEDTLS_ECP_DP_BP384R1_ENABLED is not set +# CONFIG_MBEDTLS_ECP_DP_BP512R1_ENABLED is not set +# CONFIG_MBEDTLS_ECP_DP_CURVE25519_ENABLED is not set CONFIG_MBEDTLS_ECP_NIST_OPTIM=y # CONFIG_MBEDTLS_POLY1305_C is not set # CONFIG_MBEDTLS_CHACHA20_C is not set @@ -1598,6 +1604,9 @@ CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_2=y CONFIG_PTHREAD_TASK_PRIO_DEFAULT=5 CONFIG_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072 CONFIG_PTHREAD_STACK_MIN=768 +CONFIG_PTHREAD_DEFAULT_CORE_NO_AFFINITY=y +# CONFIG_PTHREAD_DEFAULT_CORE_0 is not set +# CONFIG_PTHREAD_DEFAULT_CORE_1 is not set CONFIG_PTHREAD_TASK_CORE_DEFAULT=-1 CONFIG_PTHREAD_TASK_NAME_DEFAULT="pthread" # end of PThreads @@ -1792,7 +1801,7 @@ CONFIG_CONSOLE_UART_RX=-1 CONFIG_UART_CONSOLE=y CONFIG_HWCONF_DYNAMIC=y CONFIG_LUA=y -# CONFIG_THRESHOLDS is not set +CONFIG_THRESHOLDS=y CONFIG_INTEGRATED_HELP=y CONFIG_AT_ACTIONS=y CONFIG_HOLIDAYS=y @@ -1837,6 +1846,7 @@ CONFIG_IOEXTENDERS=y CONFIG_LEDS=y CONFIG_BUTTON=y CONFIG_ROTARYENCODER=y +CONFIG_BUZZER=y CONFIG_RELAY=y CONFIG_ONEWIRE=y CONFIG_DISPLAY=y @@ -1846,24 +1856,27 @@ CONFIG_SSD1306=y CONFIG_SH1106=y CONFIG_DHT=y CONFIG_I2C=y -CONFIG_I2C_XCMD=y -CONFIG_I2C_XDEV=y -CONFIG_PCA9685=y -CONFIG_PCF8574=y -CONFIG_TCA9555=y -CONFIG_MCP2300X=y -CONFIG_MCP2301X=y CONFIG_OPT3001=y -CONFIG_INA2XX=y -CONFIG_SI7021=y CONFIG_BMX280=y +CONFIG_BMP388=y CONFIG_BME680=y +CONFIG_BQ25601D=y CONFIG_HDC1000=y CONFIG_APDS9930=y CONFIG_SGP30=y CONFIG_CCS811B=y CONFIG_BH1750=y +CONFIG_I2C_XCMD=y +CONFIG_I2C_XDEV=y +CONFIG_INA2XX=y +CONFIG_SI7021=y +CONFIG_PCA9685=y +CONFIG_PCF8574=y +CONFIG_TCA9555=y +CONFIG_MCP2300X=y +CONFIG_MCP2301X=y CONFIG_SPI=y +CONFIG_SSD1309=y CONFIG_ILI9341=y CONFIG_SDCARD=y CONFIG_XPT2046=y @@ -1902,10 +1915,10 @@ CONFIG_LOG_BOOTLOADER_LEVEL=5 CONFIG_FLASHMODE_DIO=y # CONFIG_FLASHMODE_DOUT is not set CONFIG_MONITOR_BAUD=115200 -CONFIG_OPTIMIZATION_LEVEL_DEBUG=y -CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG=y -# CONFIG_OPTIMIZATION_LEVEL_RELEASE is not set -# CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE is not set +# CONFIG_OPTIMIZATION_LEVEL_DEBUG is not set +# CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG is not set +CONFIG_OPTIMIZATION_LEVEL_RELEASE=y +CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE=y CONFIG_OPTIMIZATION_ASSERTIONS_ENABLED=y # CONFIG_OPTIMIZATION_ASSERTIONS_SILENT is not set # CONFIG_OPTIMIZATION_ASSERTIONS_DISABLED is not set @@ -1956,11 +1969,13 @@ CONFIG_MAIN_TASK_STACK_SIZE=3584 CONFIG_CONSOLE_UART_NUM=-1 CONFIG_INT_WDT=y CONFIG_INT_WDT_TIMEOUT_MS=300 +CONFIG_INT_WDT_CHECK_CPU1=y CONFIG_TASK_WDT=y CONFIG_ESP_TASK_WDT=y # CONFIG_TASK_WDT_PANIC is not set CONFIG_TASK_WDT_TIMEOUT_S=5 CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU0=y +CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU1=y # CONFIG_ESP32_DEBUG_STUBS_ENABLE is not set CONFIG_ESP32S3_DEBUG_OCDAWARE=y CONFIG_BROWNOUT_DET=y @@ -2000,6 +2015,8 @@ CONFIG_ESP32_WIFI_RX_BA_WIN=6 CONFIG_ESP32_WIFI_RX_BA_WIN=6 # CONFIG_ESP32_WIFI_AMSDU_TX_ENABLED is not set CONFIG_ESP32_WIFI_NVS_ENABLED=y +CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_0=y +# CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_1 is not set CONFIG_ESP32_WIFI_SOFTAP_BEACON_MAX_LEN=752 CONFIG_ESP32_WIFI_MGMT_SBUF_NUM=32 CONFIG_ESP32_WIFI_IRAM_OPT=y @@ -2018,19 +2035,15 @@ CONFIG_WPA_MBEDTLS_TLS_CLIENT=y # CONFIG_WPA_WPS_STRICT is not set # CONFIG_WPA_DEBUG_PRINT is not set # CONFIG_WPA_TESTING_OPTIONS is not set -# CONFIG_ESP32_ENABLE_COREDUMP_TO_FLASH is not set -CONFIG_ESP32_ENABLE_COREDUMP_TO_UART=y +CONFIG_ESP32_ENABLE_COREDUMP_TO_FLASH=y +# CONFIG_ESP32_ENABLE_COREDUMP_TO_UART is not set # CONFIG_ESP32_ENABLE_COREDUMP_TO_NONE is not set # CONFIG_ESP32_COREDUMP_DATA_FORMAT_BIN is not set CONFIG_ESP32_COREDUMP_DATA_FORMAT_ELF=y CONFIG_ESP32_COREDUMP_CHECKSUM_CRC32=y CONFIG_ESP32_ENABLE_COREDUMP=y CONFIG_ESP32_CORE_DUMP_MAX_TASKS_NUM=64 -CONFIG_ESP32_CORE_DUMP_UART_DELAY=0 -CONFIG_ESP32_CORE_DUMP_STACK_SIZE=0 -CONFIG_ESP32_CORE_DUMP_DECODE_INFO=y -# CONFIG_ESP32_CORE_DUMP_DECODE_DISABLE is not set -CONFIG_ESP32_CORE_DUMP_DECODE="info" +CONFIG_ESP32_CORE_DUMP_STACK_SIZE=1280 CONFIG_TIMER_TASK_PRIORITY=1 CONFIG_TIMER_TASK_STACK_DEPTH=2048 CONFIG_TIMER_QUEUE_LENGTH=10 @@ -2055,6 +2068,7 @@ CONFIG_UDP_RECVMBOX_SIZE=6 CONFIG_TCPIP_TASK_STACK_SIZE=3072 CONFIG_TCPIP_TASK_AFFINITY_NO_AFFINITY=y # CONFIG_TCPIP_TASK_AFFINITY_CPU0 is not set +# CONFIG_TCPIP_TASK_AFFINITY_CPU1 is not set CONFIG_TCPIP_TASK_AFFINITY=0x7FFFFFFF # CONFIG_PPP_SUPPORT is not set CONFIG_ESP32S3_TIME_SYSCALL_USE_RTC_SYSTIMER=y @@ -2066,6 +2080,9 @@ CONFIG_ESP32S3_TIME_SYSCALL_USE_RTC_FRC1=y CONFIG_ESP32_PTHREAD_TASK_PRIO_DEFAULT=5 CONFIG_ESP32_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072 CONFIG_ESP32_PTHREAD_STACK_MIN=768 +CONFIG_ESP32_DEFAULT_PTHREAD_CORE_NO_AFFINITY=y +# CONFIG_ESP32_DEFAULT_PTHREAD_CORE_0 is not set +# CONFIG_ESP32_DEFAULT_PTHREAD_CORE_1 is not set CONFIG_ESP32_PTHREAD_TASK_CORE_DEFAULT=-1 CONFIG_ESP32_PTHREAD_TASK_NAME_DEFAULT="pthread" CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ABORTS=y diff --git a/projects/esp32-s3_4m_dev b/projects/esp32-s3_4m_dev index 54c2c5e..58f96f7 100644 --- a/projects/esp32-s3_4m_dev +++ b/projects/esp32-s3_4m_dev @@ -690,9 +690,9 @@ CONFIG_ESP_EVENT_POST_FROM_IRAM_ISR=y # # ESP HTTP client # -CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS=y +# CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS is not set # CONFIG_ESP_HTTP_CLIENT_ENABLE_BASIC_AUTH is not set -CONFIG_ESP_HTTP_CLIENT_ENABLE_DIGEST_AUTH=y +# CONFIG_ESP_HTTP_CLIENT_ENABLE_DIGEST_AUTH is not set # end of ESP HTTP client # @@ -834,9 +834,7 @@ CONFIG_ESP_NETIF_USES_TCPIP_WITH_BSD_API=y # PHY # CONFIG_ESP_PHY_CALIBRATION_AND_DATA_STORAGE=y -CONFIG_ESP_PHY_INIT_DATA_IN_PARTITION=y -# CONFIG_ESP_PHY_DEFAULT_INIT_IF_INVALID is not set -# CONFIG_ESP_PHY_MULTIPLE_INIT_DATA_BIN is not set +# CONFIG_ESP_PHY_INIT_DATA_IN_PARTITION is not set CONFIG_ESP_PHY_MAX_WIFI_TX_POWER=20 CONFIG_ESP_PHY_MAX_TX_POWER=20 # CONFIG_ESP_PHY_REDUCE_TX_POWER is not set @@ -951,7 +949,6 @@ CONFIG_ESP_SYSTEM_PANIC_PRINT_REBOOT=y # CONFIG_ESP_SYSTEM_PANIC_GDBSTUB is not set # CONFIG_ESP_SYSTEM_GDBSTUB_RUNTIME is not set CONFIG_ESP_SYSTEM_PANIC_REBOOT_DELAY_SECONDS=0 -CONFIG_ESP_SYSTEM_SINGLE_CORE_MODE=y CONFIG_ESP_SYSTEM_RTC_FAST_MEM_AS_HEAP_DEPCHECK=y CONFIG_ESP_SYSTEM_ALLOW_RTC_FAST_MEM_AS_HEAP=y @@ -966,6 +963,7 @@ CONFIG_ESP_SYSTEM_EVENT_QUEUE_SIZE=32 CONFIG_ESP_SYSTEM_EVENT_TASK_STACK_SIZE=2304 CONFIG_ESP_MAIN_TASK_STACK_SIZE=3584 CONFIG_ESP_MAIN_TASK_AFFINITY_CPU0=y +# CONFIG_ESP_MAIN_TASK_AFFINITY_CPU1 is not set # CONFIG_ESP_MAIN_TASK_AFFINITY_NO_AFFINITY is not set CONFIG_ESP_MAIN_TASK_AFFINITY=0x0 CONFIG_ESP_MINIMAL_SHARED_STACK_SIZE=2048 @@ -980,11 +978,13 @@ CONFIG_ESP_CONSOLE_MULTIPLE_UART=y CONFIG_ESP_CONSOLE_UART_NUM=-1 CONFIG_ESP_INT_WDT=y CONFIG_ESP_INT_WDT_TIMEOUT_MS=300 +CONFIG_ESP_INT_WDT_CHECK_CPU1=y CONFIG_ESP_TASK_WDT_EN=y CONFIG_ESP_TASK_WDT_INIT=y # CONFIG_ESP_TASK_WDT_PANIC is not set CONFIG_ESP_TASK_WDT_TIMEOUT_S=5 CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0=y +CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1=y # CONFIG_ESP_PANIC_HANDLER_IRAM is not set # CONFIG_ESP_DEBUG_STUBS_ENABLE is not set CONFIG_ESP_DEBUG_OCDAWARE=y @@ -1011,6 +1011,8 @@ CONFIG_ESP_SYSTEM_BROWNOUT_INTR=y # IPC (Inter-Processor Call) # CONFIG_ESP_IPC_TASK_STACK_SIZE=1536 +CONFIG_ESP_IPC_USES_CALLERS_PRIORITY=y +CONFIG_ESP_IPC_ISR_ENABLE=y # end of IPC (Inter-Processor Call) # @@ -1047,6 +1049,8 @@ CONFIG_ESP_WIFI_AMPDU_RX_ENABLED=y CONFIG_ESP_WIFI_RX_BA_WIN=6 # CONFIG_ESP_WIFI_AMSDU_TX_ENABLED is not set CONFIG_ESP_WIFI_NVS_ENABLED=y +CONFIG_ESP_WIFI_TASK_PINNED_TO_CORE_0=y +# CONFIG_ESP_WIFI_TASK_PINNED_TO_CORE_1 is not set CONFIG_ESP_WIFI_SOFTAP_BEACON_MAX_LEN=752 CONFIG_ESP_WIFI_MGMT_SBUF_NUM=32 CONFIG_ESP_WIFI_IRAM_OPT=y @@ -1087,20 +1091,18 @@ CONFIG_ESP_WIFI_MBEDTLS_TLS_CLIENT=y # # Core dump # -# CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH is not set -CONFIG_ESP_COREDUMP_ENABLE_TO_UART=y +CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH=y +# CONFIG_ESP_COREDUMP_ENABLE_TO_UART is not set # CONFIG_ESP_COREDUMP_ENABLE_TO_NONE is not set # CONFIG_ESP_COREDUMP_DATA_FORMAT_BIN is not set CONFIG_ESP_COREDUMP_DATA_FORMAT_ELF=y CONFIG_ESP_COREDUMP_CHECKSUM_CRC32=y +CONFIG_ESP_COREDUMP_CHECK_BOOT=y CONFIG_ESP_COREDUMP_ENABLE=y CONFIG_ESP_COREDUMP_LOGS=y CONFIG_ESP_COREDUMP_MAX_TASKS_NUM=64 -CONFIG_ESP_COREDUMP_UART_DELAY=0 -CONFIG_ESP_COREDUMP_STACK_SIZE=0 -CONFIG_ESP_COREDUMP_DECODE_INFO=y -# CONFIG_ESP_COREDUMP_DECODE_DISABLE is not set -CONFIG_ESP_COREDUMP_DECODE="info" +CONFIG_ESP_COREDUMP_USE_STACK_SIZE=y +CONFIG_ESP_COREDUMP_STACK_SIZE=1280 # end of Core dump # @@ -1151,9 +1153,8 @@ CONFIG_FATFS_VFS_FSTAT_BLKSIZE=0 # Kernel # # CONFIG_FREERTOS_SMP is not set -CONFIG_FREERTOS_UNICORE=y +# CONFIG_FREERTOS_UNICORE is not set CONFIG_FREERTOS_HZ=100 -CONFIG_FREERTOS_OPTIMIZED_SCHEDULER=y # CONFIG_FREERTOS_CHECK_STACKOVERFLOW_NONE is not set # CONFIG_FREERTOS_CHECK_STACKOVERFLOW_PTRVAL is not set CONFIG_FREERTOS_CHECK_STACKOVERFLOW_CANARY=y @@ -1169,8 +1170,9 @@ CONFIG_FREERTOS_TIMER_QUEUE_LENGTH=10 CONFIG_FREERTOS_QUEUE_REGISTRY_SIZE=0 CONFIG_FREERTOS_TASK_NOTIFICATION_ARRAY_ENTRIES=1 CONFIG_FREERTOS_USE_TRACE_FACILITY=y -# CONFIG_FREERTOS_USE_STATS_FORMATTING_FUNCTIONS is not set -# CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS is not set +CONFIG_FREERTOS_USE_STATS_FORMATTING_FUNCTIONS=y +CONFIG_FREERTOS_VTASKLIST_INCLUDE_COREID=y +CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS=y # end of Kernel # @@ -1187,6 +1189,7 @@ CONFIG_FREERTOS_TICK_SUPPORT_SYSTIMER=y CONFIG_FREERTOS_CORETIMER_SYSTIMER_LVL1=y # CONFIG_FREERTOS_CORETIMER_SYSTIMER_LVL3 is not set CONFIG_FREERTOS_SYSTICK_USES_SYSTIMER=y +CONFIG_FREERTOS_RUN_TIME_STATS_USING_ESP_TIMER=y # CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH is not set # CONFIG_FREERTOS_PLACE_SNAPSHOT_FUNS_INTO_FLASH is not set # CONFIG_FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE is not set @@ -1346,6 +1349,7 @@ CONFIG_LWIP_CHECKSUM_CHECK_ICMP=y CONFIG_LWIP_TCPIP_TASK_STACK_SIZE=3072 CONFIG_LWIP_TCPIP_TASK_AFFINITY_NO_AFFINITY=y # CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU0 is not set +# CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU1 is not set CONFIG_LWIP_TCPIP_TASK_AFFINITY=0x7FFFFFFF # CONFIG_LWIP_PPP_SUPPORT is not set CONFIG_LWIP_IPV6_MEMP_NUM_ND6_QUEUE=3 @@ -1511,17 +1515,17 @@ CONFIG_MBEDTLS_ECDH_C=y CONFIG_MBEDTLS_ECDSA_C=y # CONFIG_MBEDTLS_ECJPAKE_C is not set CONFIG_MBEDTLS_ECP_DP_SECP192R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_SECP224R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_SECP256R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_SECP384R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_SECP521R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_SECP192K1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_SECP224K1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_SECP256K1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_BP256R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_BP384R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_BP512R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_CURVE25519_ENABLED=y +# CONFIG_MBEDTLS_ECP_DP_SECP224R1_ENABLED is not set +# CONFIG_MBEDTLS_ECP_DP_SECP256R1_ENABLED is not set +# CONFIG_MBEDTLS_ECP_DP_SECP384R1_ENABLED is not set +# CONFIG_MBEDTLS_ECP_DP_SECP521R1_ENABLED is not set +# CONFIG_MBEDTLS_ECP_DP_SECP192K1_ENABLED is not set +# CONFIG_MBEDTLS_ECP_DP_SECP224K1_ENABLED is not set +# CONFIG_MBEDTLS_ECP_DP_SECP256K1_ENABLED is not set +# CONFIG_MBEDTLS_ECP_DP_BP256R1_ENABLED is not set +# CONFIG_MBEDTLS_ECP_DP_BP384R1_ENABLED is not set +# CONFIG_MBEDTLS_ECP_DP_BP512R1_ENABLED is not set +# CONFIG_MBEDTLS_ECP_DP_CURVE25519_ENABLED is not set CONFIG_MBEDTLS_ECP_NIST_OPTIM=y # CONFIG_MBEDTLS_POLY1305_C is not set # CONFIG_MBEDTLS_CHACHA20_C is not set @@ -1600,6 +1604,9 @@ CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_2=y CONFIG_PTHREAD_TASK_PRIO_DEFAULT=5 CONFIG_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072 CONFIG_PTHREAD_STACK_MIN=768 +CONFIG_PTHREAD_DEFAULT_CORE_NO_AFFINITY=y +# CONFIG_PTHREAD_DEFAULT_CORE_0 is not set +# CONFIG_PTHREAD_DEFAULT_CORE_1 is not set CONFIG_PTHREAD_TASK_CORE_DEFAULT=-1 CONFIG_PTHREAD_TASK_NAME_DEFAULT="pthread" # end of PThreads @@ -1794,7 +1801,7 @@ CONFIG_CONSOLE_UART_RX=-1 CONFIG_UART_CONSOLE=y CONFIG_HWCONF_DYNAMIC=y CONFIG_LUA=y -# CONFIG_THRESHOLDS is not set +CONFIG_THRESHOLDS=y CONFIG_INTEGRATED_HELP=y CONFIG_AT_ACTIONS=y CONFIG_HOLIDAYS=y @@ -1840,6 +1847,7 @@ CONFIG_IOEXTENDERS=y CONFIG_LEDS=y CONFIG_BUTTON=y CONFIG_ROTARYENCODER=y +CONFIG_BUZZER=y CONFIG_RELAY=y CONFIG_ONEWIRE=y CONFIG_DISPLAY=y @@ -1850,24 +1858,25 @@ CONFIG_SH1106=y CONFIG_DHT=y CONFIG_HLW8012=y CONFIG_I2C=y -CONFIG_I2C_XCMD=y -CONFIG_I2C_XDEV=y -CONFIG_PCA9685=y -CONFIG_PCF8574=y -CONFIG_TCA9555=y -CONFIG_MCP2300X=y -CONFIG_MCP2301X=y CONFIG_OPT3001=y -CONFIG_INA2XX=y -CONFIG_SI7021=y CONFIG_BMX280=y CONFIG_BMP388=y CONFIG_BME680=y +CONFIG_BQ25601D=y CONFIG_HDC1000=y CONFIG_APDS9930=y CONFIG_SGP30=y CONFIG_CCS811B=y CONFIG_BH1750=y +CONFIG_I2C_XCMD=y +CONFIG_I2C_XDEV=y +CONFIG_INA2XX=y +CONFIG_SI7021=y +CONFIG_PCA9685=y +CONFIG_PCF8574=y +CONFIG_TCA9555=y +CONFIG_MCP2300X=y +CONFIG_MCP2301X=y CONFIG_SPI=y # CONFIG_SX1276 is not set CONFIG_SSD1309=y @@ -1940,9 +1949,7 @@ CONFIG_ESP32S3_RTC_CLK_SRC_INT_RC=y # CONFIG_ESP32S3_RTC_CLK_SRC_INT_8MD256 is not set CONFIG_ESP32S3_RTC_CLK_CAL_CYCLES=1024 CONFIG_ESP32_PHY_CALIBRATION_AND_DATA_STORAGE=y -CONFIG_ESP32_PHY_INIT_DATA_IN_PARTITION=y -# CONFIG_ESP32_PHY_DEFAULT_INIT_IF_INVALID is not set -# CONFIG_ESP32_SUPPORT_MULTIPLE_PHY_INIT_DATA_BIN is not set +# CONFIG_ESP32_PHY_INIT_DATA_IN_PARTITION is not set CONFIG_ESP32_PHY_MAX_WIFI_TX_POWER=20 CONFIG_ESP32_PHY_MAX_TX_POWER=20 # CONFIG_REDUCE_PHY_TX_POWER is not set @@ -1965,11 +1972,13 @@ CONFIG_MAIN_TASK_STACK_SIZE=3584 CONFIG_CONSOLE_UART_NUM=-1 CONFIG_INT_WDT=y CONFIG_INT_WDT_TIMEOUT_MS=300 +CONFIG_INT_WDT_CHECK_CPU1=y CONFIG_TASK_WDT=y CONFIG_ESP_TASK_WDT=y # CONFIG_TASK_WDT_PANIC is not set CONFIG_TASK_WDT_TIMEOUT_S=5 CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU0=y +CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU1=y # CONFIG_ESP32_DEBUG_STUBS_ENABLE is not set CONFIG_ESP32S3_DEBUG_OCDAWARE=y CONFIG_BROWNOUT_DET=y @@ -2009,6 +2018,8 @@ CONFIG_ESP32_WIFI_RX_BA_WIN=6 CONFIG_ESP32_WIFI_RX_BA_WIN=6 # CONFIG_ESP32_WIFI_AMSDU_TX_ENABLED is not set CONFIG_ESP32_WIFI_NVS_ENABLED=y +CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_0=y +# CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_1 is not set CONFIG_ESP32_WIFI_SOFTAP_BEACON_MAX_LEN=752 CONFIG_ESP32_WIFI_MGMT_SBUF_NUM=32 CONFIG_ESP32_WIFI_IRAM_OPT=y @@ -2027,19 +2038,15 @@ CONFIG_WPA_MBEDTLS_TLS_CLIENT=y # CONFIG_WPA_WPS_STRICT is not set # CONFIG_WPA_DEBUG_PRINT is not set # CONFIG_WPA_TESTING_OPTIONS is not set -# CONFIG_ESP32_ENABLE_COREDUMP_TO_FLASH is not set -CONFIG_ESP32_ENABLE_COREDUMP_TO_UART=y +CONFIG_ESP32_ENABLE_COREDUMP_TO_FLASH=y +# CONFIG_ESP32_ENABLE_COREDUMP_TO_UART is not set # CONFIG_ESP32_ENABLE_COREDUMP_TO_NONE is not set # CONFIG_ESP32_COREDUMP_DATA_FORMAT_BIN is not set CONFIG_ESP32_COREDUMP_DATA_FORMAT_ELF=y CONFIG_ESP32_COREDUMP_CHECKSUM_CRC32=y CONFIG_ESP32_ENABLE_COREDUMP=y CONFIG_ESP32_CORE_DUMP_MAX_TASKS_NUM=64 -CONFIG_ESP32_CORE_DUMP_UART_DELAY=0 -CONFIG_ESP32_CORE_DUMP_STACK_SIZE=0 -CONFIG_ESP32_CORE_DUMP_DECODE_INFO=y -# CONFIG_ESP32_CORE_DUMP_DECODE_DISABLE is not set -CONFIG_ESP32_CORE_DUMP_DECODE="info" +CONFIG_ESP32_CORE_DUMP_STACK_SIZE=1280 CONFIG_TIMER_TASK_PRIORITY=1 CONFIG_TIMER_TASK_STACK_DEPTH=2048 CONFIG_TIMER_QUEUE_LENGTH=10 @@ -2064,6 +2071,7 @@ CONFIG_UDP_RECVMBOX_SIZE=6 CONFIG_TCPIP_TASK_STACK_SIZE=3072 CONFIG_TCPIP_TASK_AFFINITY_NO_AFFINITY=y # CONFIG_TCPIP_TASK_AFFINITY_CPU0 is not set +# CONFIG_TCPIP_TASK_AFFINITY_CPU1 is not set CONFIG_TCPIP_TASK_AFFINITY=0x7FFFFFFF # CONFIG_PPP_SUPPORT is not set CONFIG_ESP32S3_TIME_SYSCALL_USE_RTC_SYSTIMER=y @@ -2075,6 +2083,9 @@ CONFIG_ESP32S3_TIME_SYSCALL_USE_RTC_FRC1=y CONFIG_ESP32_PTHREAD_TASK_PRIO_DEFAULT=5 CONFIG_ESP32_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072 CONFIG_ESP32_PTHREAD_STACK_MIN=768 +CONFIG_ESP32_DEFAULT_PTHREAD_CORE_NO_AFFINITY=y +# CONFIG_ESP32_DEFAULT_PTHREAD_CORE_0 is not set +# CONFIG_ESP32_DEFAULT_PTHREAD_CORE_1 is not set CONFIG_ESP32_PTHREAD_TASK_CORE_DEFAULT=-1 CONFIG_ESP32_PTHREAD_TASK_NAME_DEFAULT="pthread" CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ABORTS=y diff --git a/projects/esp32-s3_8m b/projects/esp32-s3_8m index cb85835..3351907 100644 --- a/projects/esp32-s3_8m +++ b/projects/esp32-s3_8m @@ -1852,6 +1852,7 @@ CONFIG_IOEXTENDERS=y CONFIG_LEDS=y CONFIG_BUTTON=y CONFIG_ROTARYENCODER=y +CONFIG_BUZZER=y CONFIG_RELAY=y CONFIG_ONEWIRE=y CONFIG_DISPLAY=y @@ -1861,24 +1862,27 @@ CONFIG_SSD1306=y CONFIG_SH1106=y CONFIG_DHT=y CONFIG_I2C=y -CONFIG_I2C_XCMD=y -CONFIG_I2C_XDEV=y -CONFIG_PCA9685=y -CONFIG_PCF8574=y -CONFIG_TCA9555=y -CONFIG_MCP2300X=y -CONFIG_MCP2301X=y CONFIG_OPT3001=y -CONFIG_INA2XX=y -CONFIG_SI7021=y CONFIG_BMX280=y +CONFIG_BMP388=y CONFIG_BME680=y +CONFIG_BQ25601D=y CONFIG_HDC1000=y CONFIG_APDS9930=y CONFIG_SGP30=y CONFIG_CCS811B=y CONFIG_BH1750=y +CONFIG_I2C_XCMD=y +CONFIG_I2C_XDEV=y +CONFIG_INA2XX=y +CONFIG_SI7021=y +CONFIG_PCA9685=y +CONFIG_PCF8574=y +CONFIG_TCA9555=y +CONFIG_MCP2300X=y +CONFIG_MCP2301X=y CONFIG_SPI=y +CONFIG_SSD1309=y CONFIG_ILI9341=y CONFIG_SDCARD=y CONFIG_XPT2046=y diff --git a/projects/esp32-s3_8m_dev b/projects/esp32-s3_8m_dev index 4155577..c7d10cf 100644 --- a/projects/esp32-s3_8m_dev +++ b/projects/esp32-s3_8m_dev @@ -1848,11 +1848,12 @@ CONFIG_USB_HOST_FS=y CONFIG_USB_DIAGLOG=y CONFIG_USB_CONSOLE=y CONFIG_GPIOS=y -CONFIG_CORETEMP=y +# CONFIG_CORETEMP is not set CONFIG_IOEXTENDERS=y CONFIG_LEDS=y CONFIG_BUTTON=y CONFIG_ROTARYENCODER=y +CONFIG_BUZZER=y CONFIG_RELAY=y CONFIG_ONEWIRE=y CONFIG_DISPLAY=y @@ -1863,24 +1864,25 @@ CONFIG_SH1106=y CONFIG_DHT=y # CONFIG_HLW8012 is not set CONFIG_I2C=y -CONFIG_I2C_XCMD=y -CONFIG_I2C_XDEV=y -CONFIG_PCA9685=y -CONFIG_PCF8574=y -CONFIG_TCA9555=y -CONFIG_MCP2300X=y -CONFIG_MCP2301X=y CONFIG_OPT3001=y -CONFIG_INA2XX=y -CONFIG_SI7021=y CONFIG_BMX280=y CONFIG_BMP388=y CONFIG_BME680=y +CONFIG_BQ25601D=y CONFIG_HDC1000=y CONFIG_APDS9930=y CONFIG_SGP30=y CONFIG_CCS811B=y CONFIG_BH1750=y +CONFIG_I2C_XCMD=y +CONFIG_I2C_XDEV=y +CONFIG_INA2XX=y +CONFIG_SI7021=y +CONFIG_PCA9685=y +CONFIG_PCF8574=y +CONFIG_TCA9555=y +CONFIG_MCP2300X=y +CONFIG_MCP2301X=y CONFIG_SPI=y CONFIG_SX1276=y CONFIG_SSD1309=y diff --git a/projects/esp32_4m b/projects/esp32_4m index fb56f28..cb4c6f9 100644 --- a/projects/esp32_4m +++ b/projects/esp32_4m @@ -1636,6 +1636,7 @@ CONFIG_IOEXTENDERS=y CONFIG_LEDS=y CONFIG_BUTTON=y CONFIG_ROTARYENCODER=y +CONFIG_BUZZER=y CONFIG_RELAY=y CONFIG_ONEWIRE=y CONFIG_TOUCHPAD=y @@ -1643,27 +1644,30 @@ CONFIG_DISPLAY=y CONFIG_MAX7219=y CONFIG_HT16K33=y CONFIG_SSD1306=y -# CONFIG_SH1106 is not set +CONFIG_SH1106=y CONFIG_DHT=y CONFIG_I2C=y -CONFIG_I2C_XCMD=y -CONFIG_I2C_XDEV=y -CONFIG_PCA9685=y -CONFIG_PCF8574=y -CONFIG_TCA9555=y -CONFIG_MCP2300X=y -CONFIG_MCP2301X=y CONFIG_OPT3001=y -CONFIG_INA2XX=y -CONFIG_SI7021=y CONFIG_BMX280=y +CONFIG_BMP388=y CONFIG_BME680=y +CONFIG_BQ25601D=y CONFIG_HDC1000=y CONFIG_APDS9930=y CONFIG_SGP30=y CONFIG_CCS811B=y CONFIG_BH1750=y +CONFIG_I2C_XCMD=y +CONFIG_I2C_XDEV=y +CONFIG_INA2XX=y +CONFIG_SI7021=y +CONFIG_PCA9685=y +CONFIG_PCF8574=y +CONFIG_TCA9555=y +CONFIG_MCP2300X=y +CONFIG_MCP2301X=y CONFIG_SPI=y +CONFIG_SSD1309=y CONFIG_ILI9341=y CONFIG_SDCARD=y CONFIG_XPT2046=y diff --git a/projects/esp32_4m_dev b/projects/esp32_4m_dev index e12ead4..7263a04 100644 --- a/projects/esp32_4m_dev +++ b/projects/esp32_4m_dev @@ -1,40 +1,237 @@ # # Automatically generated file. DO NOT EDIT. -# Espressif IoT Development Framework (ESP-IDF) Project Configuration -# +# Espressif IoT Development Framework (ESP-IDF) 5.1.1 Project Configuration +# +CONFIG_SOC_BROWNOUT_RESET_SUPPORTED="Not determined" +CONFIG_SOC_TWAI_BRP_DIV_SUPPORTED="Not determined" +CONFIG_SOC_DPORT_WORKAROUND="Not determined" +CONFIG_SOC_CAPS_ECO_VER_MAX=301 +CONFIG_SOC_ADC_SUPPORTED=y +CONFIG_SOC_DAC_SUPPORTED=y +CONFIG_SOC_UART_SUPPORTED=y +CONFIG_SOC_MCPWM_SUPPORTED=y +CONFIG_SOC_GPTIMER_SUPPORTED=y +CONFIG_SOC_SDMMC_HOST_SUPPORTED=y +CONFIG_SOC_BT_SUPPORTED=y +CONFIG_SOC_PCNT_SUPPORTED=y +CONFIG_SOC_WIFI_SUPPORTED=y +CONFIG_SOC_SDIO_SLAVE_SUPPORTED=y +CONFIG_SOC_TWAI_SUPPORTED=y +CONFIG_SOC_EMAC_SUPPORTED=y +CONFIG_SOC_ULP_SUPPORTED=y +CONFIG_SOC_CCOMP_TIMER_SUPPORTED=y +CONFIG_SOC_RTC_FAST_MEM_SUPPORTED=y +CONFIG_SOC_RTC_SLOW_MEM_SUPPORTED=y +CONFIG_SOC_RTC_MEM_SUPPORTED=y +CONFIG_SOC_I2S_SUPPORTED=y +CONFIG_SOC_RMT_SUPPORTED=y +CONFIG_SOC_SDM_SUPPORTED=y +CONFIG_SOC_GPSPI_SUPPORTED=y +CONFIG_SOC_LEDC_SUPPORTED=y +CONFIG_SOC_I2C_SUPPORTED=y +CONFIG_SOC_SUPPORT_COEXISTENCE=y +CONFIG_SOC_AES_SUPPORTED=y +CONFIG_SOC_MPI_SUPPORTED=y +CONFIG_SOC_SHA_SUPPORTED=y +CONFIG_SOC_FLASH_ENC_SUPPORTED=y +CONFIG_SOC_SECURE_BOOT_SUPPORTED=y +CONFIG_SOC_TOUCH_SENSOR_SUPPORTED=y +CONFIG_SOC_BOD_SUPPORTED=y +CONFIG_SOC_ULP_FSM_SUPPORTED=y +CONFIG_SOC_DPORT_WORKAROUND_DIS_INTERRUPT_LVL=5 +CONFIG_SOC_XTAL_SUPPORT_26M=y +CONFIG_SOC_XTAL_SUPPORT_40M=y +CONFIG_SOC_XTAL_SUPPORT_AUTO_DETECT=y +CONFIG_SOC_ADC_RTC_CTRL_SUPPORTED=y +CONFIG_SOC_ADC_DIG_CTRL_SUPPORTED=y +CONFIG_SOC_ADC_DMA_SUPPORTED=y +CONFIG_SOC_ADC_PERIPH_NUM=2 +CONFIG_SOC_ADC_MAX_CHANNEL_NUM=10 +CONFIG_SOC_ADC_ATTEN_NUM=4 +CONFIG_SOC_ADC_DIGI_CONTROLLER_NUM=2 +CONFIG_SOC_ADC_PATT_LEN_MAX=16 +CONFIG_SOC_ADC_DIGI_MIN_BITWIDTH=9 +CONFIG_SOC_ADC_DIGI_MAX_BITWIDTH=12 +CONFIG_SOC_ADC_DIGI_RESULT_BYTES=2 +CONFIG_SOC_ADC_DIGI_DATA_BYTES_PER_CONV=4 +CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_HIGH=2 +CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_LOW=20 +CONFIG_SOC_ADC_RTC_MIN_BITWIDTH=9 +CONFIG_SOC_ADC_RTC_MAX_BITWIDTH=12 +CONFIG_SOC_SHARED_IDCACHE_SUPPORTED=y +CONFIG_SOC_IDCACHE_PER_CORE=y +CONFIG_SOC_CPU_CORES_NUM=2 +CONFIG_SOC_CPU_INTR_NUM=32 +CONFIG_SOC_CPU_HAS_FPU=y +CONFIG_SOC_CPU_BREAKPOINTS_NUM=2 +CONFIG_SOC_CPU_WATCHPOINTS_NUM=2 +CONFIG_SOC_CPU_WATCHPOINT_SIZE=64 +CONFIG_SOC_DAC_CHAN_NUM=2 +CONFIG_SOC_DAC_RESOLUTION=8 +CONFIG_SOC_DAC_DMA_16BIT_ALIGN=y +CONFIG_SOC_GPIO_PORT=1 +CONFIG_SOC_GPIO_PIN_COUNT=40 +CONFIG_SOC_GPIO_VALID_GPIO_MASK=0xFFFFFFFFFF +CONFIG_SOC_GPIO_VALID_DIGITAL_IO_PAD_MASK=0xEF0FEA +CONFIG_SOC_I2C_NUM=2 +CONFIG_SOC_I2C_FIFO_LEN=32 +CONFIG_SOC_I2C_CMD_REG_NUM=16 +CONFIG_SOC_I2C_SUPPORT_SLAVE=y +CONFIG_SOC_I2C_SUPPORT_APB=y +CONFIG_SOC_I2S_NUM=2 +CONFIG_SOC_I2S_HW_VERSION_1=y +CONFIG_SOC_I2S_SUPPORTS_APLL=y +CONFIG_SOC_I2S_SUPPORTS_PLL_F160M=y +CONFIG_SOC_I2S_SUPPORTS_PDM=y +CONFIG_SOC_I2S_SUPPORTS_PDM_TX=y +CONFIG_SOC_I2S_PDM_MAX_TX_LINES=1 +CONFIG_SOC_I2S_SUPPORTS_PDM_RX=y +CONFIG_SOC_I2S_PDM_MAX_RX_LINES=1 +CONFIG_SOC_I2S_SUPPORTS_ADC_DAC=y +CONFIG_SOC_I2S_SUPPORTS_ADC=y +CONFIG_SOC_I2S_SUPPORTS_DAC=y +CONFIG_SOC_I2S_SUPPORTS_LCD_CAMERA=y +CONFIG_SOC_I2S_TRANS_SIZE_ALIGN_WORD=y +CONFIG_SOC_I2S_LCD_I80_VARIANT=y +CONFIG_SOC_LCD_I80_SUPPORTED=y +CONFIG_SOC_LCD_I80_BUSES=2 +CONFIG_SOC_LCD_I80_BUS_WIDTH=24 +CONFIG_SOC_LEDC_HAS_TIMER_SPECIFIC_MUX=y +CONFIG_SOC_LEDC_SUPPORT_APB_CLOCK=y +CONFIG_SOC_LEDC_SUPPORT_REF_TICK=y +CONFIG_SOC_LEDC_SUPPORT_HS_MODE=y +CONFIG_SOC_LEDC_CHANNEL_NUM=8 +CONFIG_SOC_LEDC_TIMER_BIT_WIDTH=20 +CONFIG_SOC_MCPWM_GROUPS=2 +CONFIG_SOC_MCPWM_TIMERS_PER_GROUP=3 +CONFIG_SOC_MCPWM_OPERATORS_PER_GROUP=3 +CONFIG_SOC_MCPWM_COMPARATORS_PER_OPERATOR=2 +CONFIG_SOC_MCPWM_GENERATORS_PER_OPERATOR=2 +CONFIG_SOC_MCPWM_TRIGGERS_PER_OPERATOR=2 +CONFIG_SOC_MCPWM_GPIO_FAULTS_PER_GROUP=3 +CONFIG_SOC_MCPWM_CAPTURE_TIMERS_PER_GROUP=y +CONFIG_SOC_MCPWM_CAPTURE_CHANNELS_PER_TIMER=3 +CONFIG_SOC_MCPWM_GPIO_SYNCHROS_PER_GROUP=3 +CONFIG_SOC_MMU_PERIPH_NUM=2 +CONFIG_SOC_MMU_LINEAR_ADDRESS_REGION_NUM=3 +CONFIG_SOC_MPU_MIN_REGION_SIZE=0x20000000 +CONFIG_SOC_MPU_REGIONS_MAX_NUM=8 +CONFIG_SOC_PCNT_GROUPS=1 +CONFIG_SOC_PCNT_UNITS_PER_GROUP=8 +CONFIG_SOC_PCNT_CHANNELS_PER_UNIT=2 +CONFIG_SOC_PCNT_THRES_POINT_PER_UNIT=2 +CONFIG_SOC_RMT_GROUPS=1 +CONFIG_SOC_RMT_TX_CANDIDATES_PER_GROUP=8 +CONFIG_SOC_RMT_RX_CANDIDATES_PER_GROUP=8 +CONFIG_SOC_RMT_CHANNELS_PER_GROUP=8 +CONFIG_SOC_RMT_MEM_WORDS_PER_CHANNEL=64 +CONFIG_SOC_RMT_SUPPORT_REF_TICK=y +CONFIG_SOC_RMT_SUPPORT_APB=y +CONFIG_SOC_RMT_CHANNEL_CLK_INDEPENDENT=y +CONFIG_SOC_RTCIO_PIN_COUNT=18 +CONFIG_SOC_RTCIO_INPUT_OUTPUT_SUPPORTED=y +CONFIG_SOC_RTCIO_HOLD_SUPPORTED=y +CONFIG_SOC_RTCIO_WAKE_SUPPORTED=y +CONFIG_SOC_SDM_GROUPS=1 +CONFIG_SOC_SDM_CHANNELS_PER_GROUP=8 +CONFIG_SOC_SDM_CLK_SUPPORT_APB=y +CONFIG_SOC_SPI_HD_BOTH_INOUT_SUPPORTED=y +CONFIG_SOC_SPI_AS_CS_SUPPORTED=y +CONFIG_SOC_SPI_PERIPH_NUM=3 +CONFIG_SOC_SPI_DMA_CHAN_NUM=2 +CONFIG_SOC_SPI_MAX_CS_NUM=3 +CONFIG_SOC_SPI_SUPPORT_CLK_APB=y +CONFIG_SOC_SPI_MAXIMUM_BUFFER_SIZE=64 +CONFIG_SOC_SPI_MAX_PRE_DIVIDER=8192 +CONFIG_SOC_MEMSPI_SRC_FREQ_80M_SUPPORTED=y +CONFIG_SOC_MEMSPI_SRC_FREQ_40M_SUPPORTED=y +CONFIG_SOC_MEMSPI_SRC_FREQ_26M_SUPPORTED=y +CONFIG_SOC_MEMSPI_SRC_FREQ_20M_SUPPORTED=y +CONFIG_SOC_TIMER_GROUPS=2 +CONFIG_SOC_TIMER_GROUP_TIMERS_PER_GROUP=2 +CONFIG_SOC_TIMER_GROUP_COUNTER_BIT_WIDTH=64 +CONFIG_SOC_TIMER_GROUP_TOTAL_TIMERS=4 +CONFIG_SOC_TIMER_GROUP_SUPPORT_APB=y +CONFIG_SOC_TOUCH_VERSION_1=y +CONFIG_SOC_TOUCH_SENSOR_NUM=10 +CONFIG_SOC_TOUCH_PAD_MEASURE_WAIT_MAX=0xFF +CONFIG_SOC_TWAI_CONTROLLER_NUM=1 +CONFIG_SOC_TWAI_BRP_MIN=2 +CONFIG_SOC_TWAI_CLK_SUPPORT_APB=y +CONFIG_SOC_TWAI_SUPPORT_MULTI_ADDRESS_LAYOUT=y +CONFIG_SOC_UART_NUM=3 +CONFIG_SOC_UART_SUPPORT_APB_CLK=y +CONFIG_SOC_UART_SUPPORT_REF_TICK=y +CONFIG_SOC_UART_FIFO_LEN=128 +CONFIG_SOC_UART_BITRATE_MAX=5000000 +CONFIG_SOC_SPIRAM_SUPPORTED=y +CONFIG_SOC_SPI_MEM_SUPPORT_CONFIG_GPIO_BY_EFUSE=y +CONFIG_SOC_SHA_SUPPORT_PARALLEL_ENG=y +CONFIG_SOC_SHA_SUPPORT_SHA1=y +CONFIG_SOC_SHA_SUPPORT_SHA256=y +CONFIG_SOC_SHA_SUPPORT_SHA384=y +CONFIG_SOC_SHA_SUPPORT_SHA512=y +CONFIG_SOC_RSA_MAX_BIT_LEN=4096 +CONFIG_SOC_AES_SUPPORT_AES_128=y +CONFIG_SOC_AES_SUPPORT_AES_192=y +CONFIG_SOC_AES_SUPPORT_AES_256=y +CONFIG_SOC_SECURE_BOOT_V1=y +CONFIG_SOC_EFUSE_SECURE_BOOT_KEY_DIGESTS=y +CONFIG_SOC_FLASH_ENCRYPTED_XTS_AES_BLOCK_MAX=32 +CONFIG_SOC_PHY_DIG_REGS_MEM_SIZE=21 +CONFIG_SOC_PM_SUPPORT_EXT0_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_EXT1_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_EXT_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_TOUCH_SENSOR_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_RTC_PERIPH_PD=y +CONFIG_SOC_PM_SUPPORT_RTC_FAST_MEM_PD=y +CONFIG_SOC_PM_SUPPORT_RTC_SLOW_MEM_PD=y +CONFIG_SOC_PM_SUPPORT_RC_FAST_PD=y +CONFIG_SOC_PM_SUPPORT_VDDSDIO_PD=y +CONFIG_SOC_PM_SUPPORT_MODEM_PD=y +CONFIG_SOC_CONFIGURABLE_VDDSDIO_SUPPORTED=y +CONFIG_SOC_CLK_APLL_SUPPORTED=y +CONFIG_SOC_APLL_MULTIPLIER_OUT_MIN_HZ=350000000 +CONFIG_SOC_APLL_MULTIPLIER_OUT_MAX_HZ=500000000 +CONFIG_SOC_APLL_MIN_HZ=5303031 +CONFIG_SOC_APLL_MAX_HZ=125000000 +CONFIG_SOC_CLK_RC_FAST_D256_SUPPORTED=y +CONFIG_SOC_RTC_SLOW_CLK_SUPPORT_RC_FAST_D256=y +CONFIG_SOC_CLK_RC_FAST_SUPPORT_CALIBRATION=y +CONFIG_SOC_CLK_XTAL32K_SUPPORTED=y +CONFIG_SOC_SDMMC_USE_IOMUX=y +CONFIG_SOC_SDMMC_NUM_SLOTS=2 +CONFIG_SOC_WIFI_WAPI_SUPPORT=y +CONFIG_SOC_WIFI_CSI_SUPPORT=y +CONFIG_SOC_WIFI_MESH_SUPPORT=y +CONFIG_SOC_WIFI_SUPPORT_VARIABLE_BEACON_WINDOW=y +CONFIG_SOC_WIFI_NAN_SUPPORT=y +CONFIG_SOC_BLE_SUPPORTED=y +CONFIG_SOC_BLE_MESH_SUPPORTED=y +CONFIG_SOC_BT_CLASSIC_SUPPORTED=y +CONFIG_SOC_BLUFI_SUPPORTED=y +CONFIG_SOC_ULP_HAS_ADC=y CONFIG_IDF_CMAKE=y CONFIG_IDF_TARGET_ARCH_XTENSA=y +CONFIG_IDF_TARGET_ARCH="xtensa" CONFIG_IDF_TARGET="esp32" CONFIG_IDF_TARGET_ESP32=y CONFIG_IDF_FIRMWARE_CHIP_ID=0x0000 -# -# SDK tool configuration -# -CONFIG_SDK_TOOLPREFIX="xtensa-esp32-elf-" -# CONFIG_SDK_TOOLCHAIN_SUPPORTS_TIME_WIDE_64_BITS is not set -# end of SDK tool configuration - # # Build type # CONFIG_APP_BUILD_TYPE_APP_2NDBOOT=y -# CONFIG_APP_BUILD_TYPE_ELF_RAM is not set +# CONFIG_APP_BUILD_TYPE_RAM is not set CONFIG_APP_BUILD_GENERATE_BINARIES=y CONFIG_APP_BUILD_BOOTLOADER=y CONFIG_APP_BUILD_USE_FLASH_SECTIONS=y +# CONFIG_APP_REPRODUCIBLE_BUILD is not set +# CONFIG_APP_NO_BLOBS is not set +# CONFIG_APP_COMPATIBLE_PRE_V2_1_BOOTLOADERS is not set +# CONFIG_APP_COMPATIBLE_PRE_V3_1_BOOTLOADERS is not set # end of Build type -# -# Application manager -# -CONFIG_APP_COMPILE_TIME_DATE=y -# CONFIG_APP_EXCLUDE_PROJECT_VER_VAR is not set -# CONFIG_APP_EXCLUDE_PROJECT_NAME_VAR is not set -# CONFIG_APP_PROJECT_VER_FROM_CONFIG is not set -CONFIG_APP_RETRIEVE_LEN_ELF_SHA=16 -# end of Application manager - # # Bootloader config # @@ -70,15 +267,33 @@ CONFIG_BOOTLOADER_FLASH_XMC_SUPPORT=y # # Security features # +CONFIG_SECURE_BOOT_V1_SUPPORTED=y # CONFIG_SECURE_SIGNED_APPS_NO_SECURE_BOOT is not set # CONFIG_SECURE_BOOT is not set # CONFIG_SECURE_FLASH_ENC_ENABLED is not set # end of Security features +# +# Application manager +# +CONFIG_APP_COMPILE_TIME_DATE=y +# CONFIG_APP_EXCLUDE_PROJECT_VER_VAR is not set +# CONFIG_APP_EXCLUDE_PROJECT_NAME_VAR is not set +# CONFIG_APP_PROJECT_VER_FROM_CONFIG is not set +CONFIG_APP_RETRIEVE_LEN_ELF_SHA=16 +# end of Application manager + +CONFIG_ESP_ROM_HAS_CRC_LE=y +CONFIG_ESP_ROM_HAS_CRC_BE=y +CONFIG_ESP_ROM_HAS_MZ_CRC32=y +CONFIG_ESP_ROM_HAS_JPEG_DECODE=y +CONFIG_ESP_ROM_HAS_UART_BUF_SWITCH=y +CONFIG_ESP_ROM_NEEDS_SWSETUP_WORKAROUND=y +CONFIG_ESP_ROM_HAS_NEWLIB_NANO_FORMAT=y + # # Serial flasher config # -CONFIG_ESPTOOLPY_BAUD_OTHER_VAL=115200 # CONFIG_ESPTOOLPY_NO_STUB is not set # CONFIG_ESPTOOLPY_FLASHMODE_QIO is not set # CONFIG_ESPTOOLPY_FLASHMODE_QOUT is not set @@ -100,22 +315,13 @@ CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y # CONFIG_ESPTOOLPY_FLASHSIZE_64MB is not set # CONFIG_ESPTOOLPY_FLASHSIZE_128MB is not set CONFIG_ESPTOOLPY_FLASHSIZE="4MB" -CONFIG_ESPTOOLPY_FLASHSIZE_DETECT=y +# CONFIG_ESPTOOLPY_HEADER_FLASHSIZE_UPDATE is not set CONFIG_ESPTOOLPY_BEFORE_RESET=y # CONFIG_ESPTOOLPY_BEFORE_NORESET is not set CONFIG_ESPTOOLPY_BEFORE="default_reset" CONFIG_ESPTOOLPY_AFTER_RESET=y # CONFIG_ESPTOOLPY_AFTER_NORESET is not set CONFIG_ESPTOOLPY_AFTER="hard_reset" -# CONFIG_ESPTOOLPY_MONITOR_BAUD_CONSOLE is not set -# CONFIG_ESPTOOLPY_MONITOR_BAUD_9600B is not set -# CONFIG_ESPTOOLPY_MONITOR_BAUD_57600B is not set -CONFIG_ESPTOOLPY_MONITOR_BAUD_115200B=y -# CONFIG_ESPTOOLPY_MONITOR_BAUD_230400B is not set -# CONFIG_ESPTOOLPY_MONITOR_BAUD_921600B is not set -# CONFIG_ESPTOOLPY_MONITOR_BAUD_2MB is not set -# CONFIG_ESPTOOLPY_MONITOR_BAUD_OTHER is not set -CONFIG_ESPTOOLPY_MONITOR_BAUD_OTHER_VAL=115200 CONFIG_ESPTOOLPY_MONITOR_BAUD=115200 # end of Serial flasher config @@ -139,10 +345,11 @@ CONFIG_PARTITION_TABLE_MD5=y CONFIG_COMPILER_OPTIMIZATION_SIZE=y # CONFIG_COMPILER_OPTIMIZATION_PERF is not set # CONFIG_COMPILER_OPTIMIZATION_NONE is not set -CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=y -# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT is not set +# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE is not set +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT=y # CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE is not set -CONFIG_COMPILER_OPTIMIZATION_ASSERTION_LEVEL=2 +CONFIG_COMPILER_FLOAT_LIB_FROM_GCCLIB=y +CONFIG_COMPILER_OPTIMIZATION_ASSERTION_LEVEL=1 # CONFIG_COMPILER_OPTIMIZATION_CHECKS_SILENT is not set CONFIG_COMPILER_HIDE_PATHS_MACROS=y # CONFIG_COMPILER_CXX_EXCEPTIONS is not set @@ -153,7 +360,7 @@ CONFIG_COMPILER_HIDE_PATHS_MACROS=y CONFIG_COMPILER_STACK_CHECK_MODE_ALL=y CONFIG_COMPILER_STACK_CHECK=y # CONFIG_COMPILER_WARN_WRITE_STRINGS is not set -# CONFIG_COMPILER_DISABLE_GCC8_WARNINGS is not set +# CONFIG_COMPILER_DISABLE_GCC12_WARNINGS is not set # CONFIG_COMPILER_DUMP_RTL_FILES is not set # end of Compiler options @@ -166,15 +373,13 @@ CONFIG_COMPILER_STACK_CHECK=y # # CONFIG_APPTRACE_DEST_JTAG is not set CONFIG_APPTRACE_DEST_NONE=y +# CONFIG_APPTRACE_DEST_UART1 is not set +# CONFIG_APPTRACE_DEST_UART2 is not set +CONFIG_APPTRACE_DEST_UART_NONE=y +CONFIG_APPTRACE_UART_TASK_PRIO=1 CONFIG_APPTRACE_LOCK_ENABLE=y # end of Application Level Tracing -# -# ESP-ASIO -# -# CONFIG_ASIO_SSL_SUPPORT is not set -# end of ESP-ASIO - # # Bluetooth # @@ -182,75 +387,119 @@ CONFIG_APPTRACE_LOCK_ENABLE=y # end of Bluetooth # -# CoAP Configuration -# -CONFIG_COAP_MBEDTLS_PSK=y -# CONFIG_COAP_MBEDTLS_PKI is not set -# CONFIG_COAP_MBEDTLS_DEBUG is not set -CONFIG_COAP_LOG_DEFAULT_LEVEL=0 -# end of CoAP Configuration - -# -# Driver configurations +# Driver Configurations # # -# ADC configuration +# Legacy ADC Configuration # -# CONFIG_ADC_FORCE_XPD_FSM is not set CONFIG_ADC_DISABLE_DAC=y -# end of ADC configuration +# CONFIG_ADC_SUPPRESS_DEPRECATE_WARN is not set # -# MCPWM configuration +# Legacy ADC Calibration Configuration # -# CONFIG_MCPWM_ISR_IN_IRAM is not set -# end of MCPWM configuration +CONFIG_ADC_CAL_EFUSE_TP_ENABLE=y +CONFIG_ADC_CAL_EFUSE_VREF_ENABLE=y +CONFIG_ADC_CAL_LUT_ENABLE=y +# CONFIG_ADC_CALI_SUPPRESS_DEPRECATE_WARN is not set +# end of Legacy ADC Calibration Configuration +# end of Legacy ADC Configuration # -# SPI configuration +# SPI Configuration # -# CONFIG_SPI_MASTER_IN_IRAM is not set +CONFIG_SPI_MASTER_IN_IRAM=y CONFIG_SPI_MASTER_ISR_IN_IRAM=y # CONFIG_SPI_SLAVE_IN_IRAM is not set # CONFIG_SPI_SLAVE_ISR_IN_IRAM is not set -# end of SPI configuration +# end of SPI Configuration # -# TWAI configuration +# TWAI Configuration # # CONFIG_TWAI_ISR_IN_IRAM is not set # CONFIG_TWAI_ERRATA_FIX_BUS_OFF_REC is not set # CONFIG_TWAI_ERRATA_FIX_TX_INTR_LOST is not set # CONFIG_TWAI_ERRATA_FIX_RX_FRAME_INVALID is not set # CONFIG_TWAI_ERRATA_FIX_RX_FIFO_CORRUPT is not set -# end of TWAI configuration +CONFIG_TWAI_ERRATA_FIX_LISTEN_ONLY_DOM=y +# end of TWAI Configuration # -# UART configuration +# UART Configuration # # CONFIG_UART_ISR_IN_IRAM is not set -# end of UART configuration - -# -# RTCIO configuration -# -# CONFIG_RTCIO_SUPPORT_RTC_GPIO_DESC is not set -# end of RTCIO configuration +# end of UART Configuration # # GPIO Configuration # # CONFIG_GPIO_ESP32_SUPPORT_SWITCH_SLP_PULL is not set +CONFIG_GPIO_CTRL_FUNC_IN_IRAM=y # end of GPIO Configuration # -# GDMA Configuration +# Sigma Delta Modulator Configuration +# +# CONFIG_SDM_CTRL_FUNC_IN_IRAM is not set +# CONFIG_SDM_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_SDM_ENABLE_DEBUG_LOG is not set +# end of Sigma Delta Modulator Configuration + +# +# GPTimer Configuration # -# CONFIG_GDMA_CTRL_FUNC_IN_IRAM is not set -# CONFIG_GDMA_ISR_IRAM_SAFE is not set -# end of GDMA Configuration -# end of Driver configurations +# CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM is not set +# CONFIG_GPTIMER_ISR_IRAM_SAFE is not set +# CONFIG_GPTIMER_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_GPTIMER_ENABLE_DEBUG_LOG is not set +# end of GPTimer Configuration + +# +# PCNT Configuration +# +# CONFIG_PCNT_CTRL_FUNC_IN_IRAM is not set +# CONFIG_PCNT_ISR_IRAM_SAFE is not set +# CONFIG_PCNT_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_PCNT_ENABLE_DEBUG_LOG is not set +# end of PCNT Configuration + +# +# RMT Configuration +# +CONFIG_RMT_ISR_IRAM_SAFE=y +# CONFIG_RMT_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_RMT_ENABLE_DEBUG_LOG is not set +# end of RMT Configuration + +# +# MCPWM Configuration +# +# CONFIG_MCPWM_ISR_IRAM_SAFE is not set +# CONFIG_MCPWM_CTRL_FUNC_IN_IRAM is not set +# CONFIG_MCPWM_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_MCPWM_ENABLE_DEBUG_LOG is not set +# end of MCPWM Configuration + +# +# I2S Configuration +# +# CONFIG_I2S_ISR_IRAM_SAFE is not set +# CONFIG_I2S_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_I2S_ENABLE_DEBUG_LOG is not set +# end of I2S Configuration + +# +# DAC Configuration +# +# CONFIG_DAC_CTRL_FUNC_IN_IRAM is not set +# CONFIG_DAC_ISR_IRAM_SAFE is not set +# CONFIG_DAC_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_DAC_ENABLE_DEBUG_LOG is not set +CONFIG_DAC_DMA_AUTO_16BIT_ALIGN=y +# end of DAC Configuration +# end of Driver Configurations # # eFuse Bit Manager @@ -268,70 +517,32 @@ CONFIG_EFUSE_MAX_BLK_LEN=192 # CONFIG_ESP_TLS_USING_MBEDTLS=y # CONFIG_ESP_TLS_USE_SECURE_ELEMENT is not set -# CONFIG_ESP_TLS_CLIENT_SESSION_TICKETS is not set # CONFIG_ESP_TLS_SERVER is not set # CONFIG_ESP_TLS_PSK_VERIFICATION is not set # CONFIG_ESP_TLS_INSECURE is not set # end of ESP-TLS # -# ESP32-specific +# ADC and ADC Calibration # -CONFIG_ESP32_REV_MIN_0=y -# CONFIG_ESP32_REV_MIN_1 is not set -# CONFIG_ESP32_REV_MIN_2 is not set -# CONFIG_ESP32_REV_MIN_3 is not set -CONFIG_ESP32_REV_MIN=0 -CONFIG_ESP32_DPORT_WORKAROUND=y -# CONFIG_ESP32_DEFAULT_CPU_FREQ_80 is not set -# CONFIG_ESP32_DEFAULT_CPU_FREQ_160 is not set -CONFIG_ESP32_DEFAULT_CPU_FREQ_240=y -CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ=240 -# CONFIG_ESP32_SPIRAM_SUPPORT is not set -# CONFIG_ESP32_TRAX is not set -CONFIG_ESP32_TRACEMEM_RESERVE_DRAM=0x0 -# CONFIG_ESP32_ULP_COPROC_ENABLED is not set -CONFIG_ESP32_ULP_COPROC_RESERVE_MEM=0 -CONFIG_ESP32_DEBUG_OCDAWARE=y -CONFIG_ESP32_BROWNOUT_DET=y -CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_0=y -# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_1 is not set -# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_2 is not set -# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_3 is not set -# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_4 is not set -# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_5 is not set -# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_6 is not set -# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_7 is not set -CONFIG_ESP32_BROWNOUT_DET_LVL=0 -CONFIG_ESP32_TIME_SYSCALL_USE_RTC_FRC1=y -# CONFIG_ESP32_TIME_SYSCALL_USE_RTC is not set -# CONFIG_ESP32_TIME_SYSCALL_USE_FRC1 is not set -# CONFIG_ESP32_TIME_SYSCALL_USE_NONE is not set -CONFIG_ESP32_RTC_CLK_SRC_INT_RC=y -# CONFIG_ESP32_RTC_CLK_SRC_EXT_CRYS is not set -# CONFIG_ESP32_RTC_CLK_SRC_EXT_OSC is not set -# CONFIG_ESP32_RTC_CLK_SRC_INT_8MD256 is not set -CONFIG_ESP32_RTC_CLK_CAL_CYCLES=1024 -CONFIG_ESP32_DEEP_SLEEP_WAKEUP_DELAY=2000 -CONFIG_ESP32_XTAL_FREQ_40=y -# CONFIG_ESP32_XTAL_FREQ_26 is not set -# CONFIG_ESP32_XTAL_FREQ_AUTO is not set -CONFIG_ESP32_XTAL_FREQ=40 -# CONFIG_ESP32_DISABLE_BASIC_ROM_CONSOLE is not set -# CONFIG_ESP32_NO_BLOBS is not set -# CONFIG_ESP32_COMPATIBLE_PRE_V2_1_BOOTLOADERS is not set -# CONFIG_ESP32_COMPATIBLE_PRE_V3_1_BOOTLOADERS is not set -# CONFIG_ESP32_USE_FIXED_STATIC_RAM_SIZE is not set -CONFIG_ESP32_DPORT_DIS_INTERRUPT_LVL=5 -# end of ESP32-specific +# CONFIG_ADC_ONESHOT_CTRL_FUNC_IN_IRAM is not set +# CONFIG_ADC_CONTINUOUS_ISR_IRAM_SAFE is not set # -# ADC-Calibration +# ADC Calibration Configurations # -CONFIG_ADC_CAL_EFUSE_TP_ENABLE=y -CONFIG_ADC_CAL_EFUSE_VREF_ENABLE=y -CONFIG_ADC_CAL_LUT_ENABLE=y -# end of ADC-Calibration +CONFIG_ADC_CALI_EFUSE_TP_ENABLE=y +CONFIG_ADC_CALI_EFUSE_VREF_ENABLE=y +CONFIG_ADC_CALI_LUT_ENABLE=y +# end of ADC Calibration Configurations + +CONFIG_ADC_DISABLE_DAC_OUTPUT=y +# end of ADC and ADC Calibration + +# +# Wireless Coexistence +# +# end of Wireless Coexistence # # Common ESP-related @@ -342,19 +553,8 @@ CONFIG_ESP_ERR_TO_NAME_LOOKUP=y # # Ethernet # -CONFIG_ETH_ENABLED=y -CONFIG_ETH_USE_ESP32_EMAC=y -CONFIG_ETH_PHY_INTERFACE_RMII=y -CONFIG_ETH_RMII_CLK_INPUT=y -# CONFIG_ETH_RMII_CLK_OUTPUT is not set -CONFIG_ETH_RMII_CLK_IN_GPIO=0 -CONFIG_ETH_DMA_BUFFER_SIZE=512 -CONFIG_ETH_DMA_RX_BUFFER_NUM=10 -CONFIG_ETH_DMA_TX_BUFFER_NUM=10 -CONFIG_ETH_USE_SPI_ETHERNET=y -# CONFIG_ETH_SPI_ETHERNET_DM9051 is not set -# CONFIG_ETH_SPI_ETHERNET_W5500 is not set -# CONFIG_ETH_SPI_ETHERNET_KSZ8851SNL is not set +# CONFIG_ETH_USE_ESP32_EMAC is not set +# CONFIG_ETH_USE_SPI_ETHERNET is not set # CONFIG_ETH_USE_OPENETH is not set # end of Ethernet @@ -374,9 +574,9 @@ CONFIG_ESP_EVENT_POST_FROM_IRAM_ISR=y # # ESP HTTP client # -CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS=y +# CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS is not set # CONFIG_ESP_HTTP_CLIENT_ENABLE_BASIC_AUTH is not set -CONFIG_ESP_HTTP_CLIENT_ENABLE_DIGEST_AUTH=y +# CONFIG_ESP_HTTP_CLIENT_ENABLE_DIGEST_AUTH is not set # end of ESP HTTP client # @@ -388,12 +588,14 @@ CONFIG_HTTPD_ERR_RESP_NO_DELAY=y CONFIG_HTTPD_PURGE_BUF_LEN=32 # CONFIG_HTTPD_LOG_PURGE_DATA is not set # CONFIG_HTTPD_WS_SUPPORT is not set +# CONFIG_HTTPD_QUEUE_WORK_BLOCKING is not set # end of HTTP Server # # ESP HTTPS OTA # -CONFIG_OTA_ALLOW_HTTP=y +# CONFIG_ESP_HTTPS_OTA_DECRYPT_CB is not set +CONFIG_ESP_HTTPS_OTA_ALLOW_HTTP=y # end of ESP HTTPS OTA # @@ -406,6 +608,26 @@ CONFIG_OTA_ALLOW_HTTP=y # Hardware Settings # +# +# Chip revision +# +# CONFIG_ESP32_REV_MIN_0 is not set +CONFIG_ESP32_REV_MIN_1=y +# CONFIG_ESP32_REV_MIN_1_1 is not set +# CONFIG_ESP32_REV_MIN_2 is not set +# CONFIG_ESP32_REV_MIN_3 is not set +# CONFIG_ESP32_REV_MIN_3_1 is not set +CONFIG_ESP32_REV_MIN=1 +CONFIG_ESP32_REV_MIN_FULL=100 +CONFIG_ESP_REV_MIN_FULL=100 + +# +# Maximum Supported ESP32 Revision (Rev v3.99) +# +CONFIG_ESP32_REV_MAX_FULL=399 +CONFIG_ESP_REV_MAX_FULL=399 +# end of Chip revision + # # MAC Config # @@ -413,43 +635,63 @@ CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_STA=y CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_AP=y CONFIG_ESP_MAC_ADDR_UNIVERSE_BT=y CONFIG_ESP_MAC_ADDR_UNIVERSE_ETH=y +CONFIG_ESP_MAC_UNIVERSAL_MAC_ADDRESSES_FOUR=y # CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES_TWO is not set CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES_FOUR=y CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES=4 +# CONFIG_ESP_MAC_IGNORE_MAC_CRC_ERROR is not set # end of MAC Config # # Sleep Config # # CONFIG_ESP_SLEEP_POWER_DOWN_FLASH is not set -CONFIG_ESP_SLEEP_RTC_BUS_ISO_WORKAROUND=y -# CONFIG_ESP_SLEEP_GPIO_RESET_WORKAROUND is not set CONFIG_ESP_SLEEP_FLASH_LEAKAGE_WORKAROUND=y # CONFIG_ESP_SLEEP_MSPI_NEED_ALL_IO_PU is not set +CONFIG_ESP_SLEEP_RTC_BUS_ISO_WORKAROUND=y +# CONFIG_ESP_SLEEP_GPIO_RESET_WORKAROUND is not set +CONFIG_ESP_SLEEP_DEEP_SLEEP_WAKEUP_DELAY=2000 # end of Sleep Config # # RTC Clock Config # +CONFIG_RTC_CLK_SRC_INT_RC=y +# CONFIG_RTC_CLK_SRC_EXT_CRYS is not set +# CONFIG_RTC_CLK_SRC_EXT_OSC is not set +# CONFIG_RTC_CLK_SRC_INT_8MD256 is not set +CONFIG_RTC_CLK_CAL_CYCLES=1024 # end of RTC Clock Config -# end of Hardware Settings # -# IPC (Inter-Processor Call) +# Peripheral Control # -CONFIG_ESP_IPC_TASK_STACK_SIZE=1024 -CONFIG_ESP_IPC_USES_CALLERS_PRIORITY=y -CONFIG_ESP_IPC_ISR_ENABLE=y -# end of IPC (Inter-Processor Call) +CONFIG_PERIPH_CTRL_FUNC_IN_IRAM=y +# end of Peripheral Control + +# +# Main XTAL Config +# +# CONFIG_XTAL_FREQ_26 is not set +CONFIG_XTAL_FREQ_40=y +# CONFIG_XTAL_FREQ_AUTO is not set +CONFIG_XTAL_FREQ=40 +# end of Main XTAL Config +# end of Hardware Settings # # LCD and Touch Panel # +# +# LCD Touch Drivers are maintained in the IDF Component Registry +# + # # LCD Peripheral Configuration # CONFIG_LCD_PANEL_IO_FORMAT_BUF_SIZE=32 +# CONFIG_LCD_ENABLE_DEBUG_LOG is not set # end of LCD Peripheral Configuration # end of LCD and Touch Panel @@ -459,9 +701,17 @@ CONFIG_LCD_PANEL_IO_FORMAT_BUF_SIZE=32 CONFIG_ESP_NETIF_IP_LOST_TIMER_INTERVAL=120 CONFIG_ESP_NETIF_TCPIP_LWIP=y # CONFIG_ESP_NETIF_LOOPBACK is not set -CONFIG_ESP_NETIF_TCPIP_ADAPTER_COMPATIBLE_LAYER=y +CONFIG_ESP_NETIF_USES_TCPIP_WITH_BSD_API=y +# CONFIG_ESP_NETIF_RECEIVE_REPORT_ERRORS is not set +# CONFIG_ESP_NETIF_L2_TAP is not set +# CONFIG_ESP_NETIF_BRIDGE_EN is not set # end of ESP NETIF Adapter +# +# Partition API Configuration +# +# end of Partition API Configuration + # # PHY # @@ -469,7 +719,10 @@ CONFIG_ESP_PHY_CALIBRATION_AND_DATA_STORAGE=y # CONFIG_ESP_PHY_INIT_DATA_IN_PARTITION is not set CONFIG_ESP_PHY_MAX_WIFI_TX_POWER=20 CONFIG_ESP_PHY_MAX_TX_POWER=20 -CONFIG_ESP_PHY_REDUCE_TX_POWER=y +CONFIG_ESP_PHY_RF_CAL_PARTIAL=y +# CONFIG_ESP_PHY_RF_CAL_NONE is not set +# CONFIG_ESP_PHY_RF_CAL_FULL is not set +CONFIG_ESP_PHY_CALIBRATION_MODE=0 # end of PHY # @@ -478,21 +731,51 @@ CONFIG_ESP_PHY_REDUCE_TX_POWER=y # CONFIG_PM_ENABLE is not set # end of Power Management +# +# ESP PSRAM +# +# CONFIG_SPIRAM is not set +# end of ESP PSRAM + # # ESP Ringbuf # # CONFIG_RINGBUF_PLACE_FUNCTIONS_INTO_FLASH is not set -# CONFIG_RINGBUF_PLACE_ISR_FUNCTIONS_INTO_FLASH is not set # end of ESP Ringbuf # # ESP System Settings # +# CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_80 is not set +# CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_160 is not set +CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_240=y +CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ=240 + +# +# Memory +# +# CONFIG_ESP32_USE_FIXED_STATIC_RAM_SIZE is not set + +# +# Non-backward compatible options +# +# CONFIG_ESP_SYSTEM_ESP32_SRAM1_REGION_AS_IRAM is not set +# end of Non-backward compatible options +# end of Memory + +# +# Trace memory +# +# CONFIG_ESP32_TRAX is not set +CONFIG_ESP32_TRACEMEM_RESERVE_DRAM=0x0 +# end of Trace memory + # CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT is not set CONFIG_ESP_SYSTEM_PANIC_PRINT_REBOOT=y # CONFIG_ESP_SYSTEM_PANIC_SILENT_REBOOT is not set # CONFIG_ESP_SYSTEM_PANIC_GDBSTUB is not set # CONFIG_ESP_SYSTEM_GDBSTUB_RUNTIME is not set +CONFIG_ESP_SYSTEM_PANIC_REBOOT_DELAY_SECONDS=0 # # Memory protection @@ -517,17 +800,36 @@ CONFIG_ESP_CONSOLE_UART_BAUDRATE=115200 CONFIG_ESP_INT_WDT=y CONFIG_ESP_INT_WDT_TIMEOUT_MS=3000 CONFIG_ESP_INT_WDT_CHECK_CPU1=y -CONFIG_ESP_TASK_WDT=y +CONFIG_ESP_TASK_WDT_EN=y +CONFIG_ESP_TASK_WDT_INIT=y CONFIG_ESP_TASK_WDT_PANIC=y CONFIG_ESP_TASK_WDT_TIMEOUT_S=15 CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0=y CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1=y # CONFIG_ESP_PANIC_HANDLER_IRAM is not set # CONFIG_ESP_DEBUG_STUBS_ENABLE is not set +# CONFIG_ESP_DEBUG_OCDAWARE is not set # CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_5 is not set CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_4=y + +# +# Brownout Detector +# +# CONFIG_ESP_BROWNOUT_DET is not set +# end of Brownout Detector + +# CONFIG_ESP32_DISABLE_BASIC_ROM_CONSOLE is not set +CONFIG_ESP_SYSTEM_BROWNOUT_INTR=y # end of ESP System Settings +# +# IPC (Inter-Processor Call) +# +CONFIG_ESP_IPC_TASK_STACK_SIZE=1024 +CONFIG_ESP_IPC_USES_CALLERS_PRIORITY=y +CONFIG_ESP_IPC_ISR_ENABLE=y +# end of IPC (Inter-Processor Call) + # # High resolution timer (esp_timer) # @@ -536,62 +838,95 @@ CONFIG_ESP_TIME_FUNCS_USE_RTC_TIMER=y CONFIG_ESP_TIME_FUNCS_USE_ESP_TIMER=y CONFIG_ESP_TIMER_TASK_STACK_SIZE=4096 CONFIG_ESP_TIMER_INTERRUPT_LEVEL=1 +# CONFIG_ESP_TIMER_SHOW_EXPERIMENTAL is not set +CONFIG_ESP_TIMER_TASK_AFFINITY=0x0 +CONFIG_ESP_TIMER_TASK_AFFINITY_CPU0=y +CONFIG_ESP_TIMER_ISR_AFFINITY=0x1 +CONFIG_ESP_TIMER_ISR_AFFINITY_CPU0=y # CONFIG_ESP_TIMER_SUPPORTS_ISR_DISPATCH_METHOD is not set -# CONFIG_ESP_TIMER_IMPL_FRC2 is not set CONFIG_ESP_TIMER_IMPL_TG0_LAC=y # end of High resolution timer (esp_timer) # # Wi-Fi # -CONFIG_ESP32_WIFI_ENABLED=y -CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=10 -CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=32 -CONFIG_ESP32_WIFI_STATIC_TX_BUFFER=y -# CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER is not set -CONFIG_ESP32_WIFI_TX_BUFFER_TYPE=0 -CONFIG_ESP32_WIFI_STATIC_TX_BUFFER_NUM=16 -# CONFIG_ESP32_WIFI_CSI_ENABLED is not set -CONFIG_ESP32_WIFI_AMPDU_TX_ENABLED=y -CONFIG_ESP32_WIFI_TX_BA_WIN=6 -CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED=y -CONFIG_ESP32_WIFI_RX_BA_WIN=16 -CONFIG_ESP32_WIFI_NVS_ENABLED=y -CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_0=y -# CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_1 is not set -CONFIG_ESP32_WIFI_SOFTAP_BEACON_MAX_LEN=752 -CONFIG_ESP32_WIFI_MGMT_SBUF_NUM=32 -CONFIG_ESP32_WIFI_IRAM_OPT=y -CONFIG_ESP32_WIFI_RX_IRAM_OPT=y -CONFIG_ESP32_WIFI_ENABLE_WPA3_SAE=y +CONFIG_ESP_WIFI_ENABLED=y +CONFIG_ESP_WIFI_STATIC_RX_BUFFER_NUM=10 +CONFIG_ESP_WIFI_DYNAMIC_RX_BUFFER_NUM=32 +CONFIG_ESP_WIFI_STATIC_TX_BUFFER=y +# CONFIG_ESP_WIFI_DYNAMIC_TX_BUFFER is not set +CONFIG_ESP_WIFI_TX_BUFFER_TYPE=0 +CONFIG_ESP_WIFI_STATIC_TX_BUFFER_NUM=16 +# CONFIG_ESP_WIFI_CSI_ENABLED is not set +CONFIG_ESP_WIFI_AMPDU_TX_ENABLED=y +CONFIG_ESP_WIFI_TX_BA_WIN=6 +CONFIG_ESP_WIFI_AMPDU_RX_ENABLED=y +CONFIG_ESP_WIFI_RX_BA_WIN=16 +CONFIG_ESP_WIFI_NVS_ENABLED=y +CONFIG_ESP_WIFI_TASK_PINNED_TO_CORE_0=y +# CONFIG_ESP_WIFI_TASK_PINNED_TO_CORE_1 is not set +CONFIG_ESP_WIFI_SOFTAP_BEACON_MAX_LEN=752 +CONFIG_ESP_WIFI_MGMT_SBUF_NUM=32 +CONFIG_ESP_WIFI_IRAM_OPT=y +CONFIG_ESP_WIFI_RX_IRAM_OPT=y +CONFIG_ESP_WIFI_ENABLE_WPA3_SAE=y +CONFIG_ESP_WIFI_ENABLE_SAE_PK=y +CONFIG_ESP_WIFI_SOFTAP_SAE_SUPPORT=y +CONFIG_ESP_WIFI_ENABLE_WPA3_OWE_STA=y # CONFIG_ESP_WIFI_SLP_IRAM_OPT is not set # CONFIG_ESP_WIFI_STA_DISCONNECTED_PM_ENABLE is not set # CONFIG_ESP_WIFI_GMAC_SUPPORT is not set CONFIG_ESP_WIFI_SOFTAP_SUPPORT=y # CONFIG_ESP_WIFI_SLP_BEACON_LOST_OPT is not set +CONFIG_ESP_WIFI_ESPNOW_MAX_ENCRYPT_NUM=7 +# CONFIG_ESP_WIFI_NAN_ENABLE is not set +CONFIG_ESP_WIFI_MBEDTLS_CRYPTO=y +CONFIG_ESP_WIFI_MBEDTLS_TLS_CLIENT=y +# CONFIG_ESP_WIFI_WAPI_PSK is not set +# CONFIG_ESP_WIFI_SUITE_B_192 is not set +# CONFIG_ESP_WIFI_11KV_SUPPORT is not set +# CONFIG_ESP_WIFI_MBO_SUPPORT is not set +# CONFIG_ESP_WIFI_DPP_SUPPORT is not set +# CONFIG_ESP_WIFI_11R_SUPPORT is not set +# CONFIG_ESP_WIFI_WPS_SOFTAP_REGISTRAR is not set + +# +# WPS Configuration Options +# +# CONFIG_ESP_WIFI_WPS_STRICT is not set +# CONFIG_ESP_WIFI_WPS_PASSPHRASE is not set +# end of WPS Configuration Options + +# CONFIG_ESP_WIFI_DEBUG_PRINT is not set +# CONFIG_ESP_WIFI_TESTING_OPTIONS is not set # end of Wi-Fi # # Core dump # -# CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH is not set -CONFIG_ESP_COREDUMP_ENABLE_TO_UART=y +CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH=y +# CONFIG_ESP_COREDUMP_ENABLE_TO_UART is not set # CONFIG_ESP_COREDUMP_ENABLE_TO_NONE is not set # CONFIG_ESP_COREDUMP_DATA_FORMAT_BIN is not set CONFIG_ESP_COREDUMP_DATA_FORMAT_ELF=y CONFIG_ESP_COREDUMP_CHECKSUM_CRC32=y # CONFIG_ESP_COREDUMP_CHECKSUM_SHA256 is not set +CONFIG_ESP_COREDUMP_CHECK_BOOT=y CONFIG_ESP_COREDUMP_ENABLE=y +CONFIG_ESP_COREDUMP_LOGS=y CONFIG_ESP_COREDUMP_MAX_TASKS_NUM=32 -CONFIG_ESP_COREDUMP_UART_DELAY=0 -CONFIG_ESP_COREDUMP_DECODE_INFO=y -# CONFIG_ESP_COREDUMP_DECODE_DISABLE is not set -CONFIG_ESP_COREDUMP_DECODE="info" +CONFIG_ESP_COREDUMP_STACK_SIZE=0 # end of Core dump # # FAT Filesystem support # +CONFIG_FATFS_VOLUME_COUNT=2 +# CONFIG_FATFS_LFN_NONE is not set +# CONFIG_FATFS_LFN_HEAP is not set +CONFIG_FATFS_LFN_STACK=y +# CONFIG_FATFS_SECTOR_512 is not set +CONFIG_FATFS_SECTOR_4096=y # CONFIG_FATFS_CODEPAGE_DYNAMIC is not set CONFIG_FATFS_CODEPAGE_437=y # CONFIG_FATFS_CODEPAGE_720 is not set @@ -615,93 +950,71 @@ CONFIG_FATFS_CODEPAGE_437=y # CONFIG_FATFS_CODEPAGE_949 is not set # CONFIG_FATFS_CODEPAGE_950 is not set CONFIG_FATFS_CODEPAGE=437 -CONFIG_FATFS_LFN_NONE=y -# CONFIG_FATFS_LFN_HEAP is not set -# CONFIG_FATFS_LFN_STACK is not set +CONFIG_FATFS_MAX_LFN=63 +CONFIG_FATFS_API_ENCODING_ANSI_OEM=y +# CONFIG_FATFS_API_ENCODING_UTF_8 is not set CONFIG_FATFS_FS_LOCK=0 CONFIG_FATFS_TIMEOUT_MS=10000 CONFIG_FATFS_PER_FILE_CACHE=y # CONFIG_FATFS_USE_FASTSEEK is not set +CONFIG_FATFS_VFS_FSTAT_BLKSIZE=0 # end of FAT Filesystem support # -# Modbus configuration -# -CONFIG_FMB_COMM_MODE_TCP_EN=y -CONFIG_FMB_TCP_PORT_DEFAULT=502 -CONFIG_FMB_TCP_PORT_MAX_CONN=5 -CONFIG_FMB_TCP_CONNECTION_TOUT_SEC=20 -CONFIG_FMB_COMM_MODE_RTU_EN=y -CONFIG_FMB_COMM_MODE_ASCII_EN=y -CONFIG_FMB_MASTER_TIMEOUT_MS_RESPOND=150 -CONFIG_FMB_MASTER_DELAY_MS_CONVERT=200 -CONFIG_FMB_QUEUE_LENGTH=20 -CONFIG_FMB_PORT_TASK_STACK_SIZE=2048 -CONFIG_FMB_SERIAL_BUF_SIZE=256 -CONFIG_FMB_SERIAL_ASCII_BITS_PER_SYMB=8 -CONFIG_FMB_SERIAL_ASCII_TIMEOUT_RESPOND_MS=1000 -CONFIG_FMB_PORT_TASK_PRIO=10 -# CONFIG_FMB_PORT_TASK_AFFINITY_NO_AFFINITY is not set -CONFIG_FMB_PORT_TASK_AFFINITY_CPU0=y -# CONFIG_FMB_PORT_TASK_AFFINITY_CPU1 is not set -CONFIG_FMB_PORT_TASK_AFFINITY=0x0 -CONFIG_FMB_CONTROLLER_SLAVE_ID_SUPPORT=y -CONFIG_FMB_CONTROLLER_SLAVE_ID=0x00112233 -CONFIG_FMB_CONTROLLER_NOTIFY_TIMEOUT=20 -CONFIG_FMB_CONTROLLER_NOTIFY_QUEUE_SIZE=20 -CONFIG_FMB_CONTROLLER_STACK_SIZE=4096 -CONFIG_FMB_EVENT_QUEUE_TIMEOUT=20 -CONFIG_FMB_TIMER_PORT_ENABLED=y -CONFIG_FMB_TIMER_GROUP=0 -CONFIG_FMB_TIMER_INDEX=0 -CONFIG_FMB_MASTER_TIMER_GROUP=0 -CONFIG_FMB_MASTER_TIMER_INDEX=0 -# CONFIG_FMB_TIMER_ISR_IN_IRAM is not set -# end of Modbus configuration +# FreeRTOS +# # -# FreeRTOS +# Kernel # +# CONFIG_FREERTOS_SMP is not set # CONFIG_FREERTOS_UNICORE is not set -CONFIG_FREERTOS_NO_AFFINITY=0x7FFFFFFF -CONFIG_FREERTOS_TICK_SUPPORT_CORETIMER=y -CONFIG_FREERTOS_CORETIMER_0=y -# CONFIG_FREERTOS_CORETIMER_1 is not set -CONFIG_FREERTOS_SYSTICK_USES_CCOUNT=y CONFIG_FREERTOS_HZ=1000 -CONFIG_FREERTOS_ASSERT_ON_UNTESTED_FUNCTION=y # CONFIG_FREERTOS_CHECK_STACKOVERFLOW_NONE is not set # CONFIG_FREERTOS_CHECK_STACKOVERFLOW_PTRVAL is not set CONFIG_FREERTOS_CHECK_STACKOVERFLOW_CANARY=y -# CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK is not set -CONFIG_FREERTOS_INTERRUPT_BACKTRACE=y CONFIG_FREERTOS_THREAD_LOCAL_STORAGE_POINTERS=1 -CONFIG_FREERTOS_ASSERT_FAIL_ABORT=y -# CONFIG_FREERTOS_ASSERT_FAIL_PRINT_CONTINUE is not set -# CONFIG_FREERTOS_ASSERT_DISABLE is not set -CONFIG_FREERTOS_IDLE_TASK_STACKSIZE=1536 -CONFIG_FREERTOS_ISR_STACKSIZE=2096 -# CONFIG_FREERTOS_LEGACY_HOOKS is not set +CONFIG_FREERTOS_IDLE_TASK_STACKSIZE=2048 +# CONFIG_FREERTOS_USE_IDLE_HOOK is not set +# CONFIG_FREERTOS_USE_TICK_HOOK is not set CONFIG_FREERTOS_MAX_TASK_NAME_LEN=8 -CONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION=y -# CONFIG_FREERTOS_ENABLE_STATIC_TASK_CLEAN_UP is not set +# CONFIG_FREERTOS_ENABLE_BACKWARD_COMPATIBILITY is not set CONFIG_FREERTOS_TIMER_TASK_PRIORITY=1 CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH=2048 CONFIG_FREERTOS_TIMER_QUEUE_LENGTH=10 CONFIG_FREERTOS_QUEUE_REGISTRY_SIZE=0 +CONFIG_FREERTOS_TASK_NOTIFICATION_ARRAY_ENTRIES=1 CONFIG_FREERTOS_USE_TRACE_FACILITY=y CONFIG_FREERTOS_USE_STATS_FORMATTING_FUNCTIONS=y CONFIG_FREERTOS_VTASKLIST_INCLUDE_COREID=y CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS=y +# end of Kernel + +# +# Port +# +CONFIG_FREERTOS_TASK_FUNCTION_WRAPPER=y +# CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK is not set +CONFIG_FREERTOS_TLSP_DELETION_CALLBACKS=y +# CONFIG_FREERTOS_ENABLE_STATIC_TASK_CLEAN_UP is not set +CONFIG_FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER=y +CONFIG_FREERTOS_ISR_STACKSIZE=2096 +CONFIG_FREERTOS_INTERRUPT_BACKTRACE=y +# CONFIG_FREERTOS_FPU_IN_ISR is not set +CONFIG_FREERTOS_TICK_SUPPORT_CORETIMER=y +CONFIG_FREERTOS_CORETIMER_0=y +# CONFIG_FREERTOS_CORETIMER_1 is not set +CONFIG_FREERTOS_SYSTICK_USES_CCOUNT=y CONFIG_FREERTOS_RUN_TIME_STATS_USING_ESP_TIMER=y # CONFIG_FREERTOS_RUN_TIME_STATS_USING_CPU_CLK is not set -CONFIG_FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER=y -# CONFIG_FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE is not set # CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH is not set -CONFIG_FREERTOS_DEBUG_OCDAWARE=y -# CONFIG_FREERTOS_FPU_IN_ISR is not set -CONFIG_FREERTOS_ENABLE_TASK_SNAPSHOT=y # CONFIG_FREERTOS_PLACE_SNAPSHOT_FUNS_INTO_FLASH is not set +# CONFIG_FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE is not set +CONFIG_FREERTOS_ENABLE_TASK_SNAPSHOT=y +# end of Port + +CONFIG_FREERTOS_NO_AFFINITY=0x7FFFFFFF +CONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION=y # end of FreeRTOS # @@ -709,9 +1022,9 @@ CONFIG_FREERTOS_ENABLE_TASK_SNAPSHOT=y # CONFIG_HAL_ASSERTION_EQUALS_SYSTEM=y # CONFIG_HAL_ASSERTION_DISABLE is not set -# CONFIG_HAL_ASSERTION_SILIENT is not set -# CONFIG_HAL_ASSERTION_ENABLE is not set -CONFIG_HAL_DEFAULT_ASSERTION_LEVEL=2 +# CONFIG_HAL_ASSERTION_SILENT is not set +CONFIG_HAL_DEFAULT_ASSERTION_LEVEL=1 +CONFIG_HAL_SPI_MASTER_FUNC_IN_IRAM=y # end of Hardware Abstraction Layer (HAL) and Low Level (LL) # @@ -723,21 +1036,14 @@ CONFIG_HEAP_POISONING_COMPREHENSIVE=y CONFIG_HEAP_TRACING_OFF=y # CONFIG_HEAP_TRACING_STANDALONE is not set # CONFIG_HEAP_TRACING_TOHOST is not set +# CONFIG_HEAP_USE_HOOKS is not set CONFIG_HEAP_TASK_TRACKING=y # CONFIG_HEAP_ABORT_WHEN_ALLOCATION_FAILS is not set +# CONFIG_HEAP_PLACE_FUNCTION_INTO_FLASH is not set # end of Heap memory debugging -# -# jsmn -# -# CONFIG_JSMN_PARENT_LINKS is not set -# CONFIG_JSMN_STRICT is not set -# end of jsmn - -# -# libsodium -# -# end of libsodium +CONFIG_IEEE802154_CCA_THRESHOLD=-60 +CONFIG_IEEE802154_PENDING_TABLE_SIZE=20 # # Log output @@ -764,7 +1070,8 @@ CONFIG_LOG_TIMESTAMP_SOURCE_RTOS=y # CONFIG_LWIP_LOCAL_HOSTNAME="espressif" # CONFIG_LWIP_NETIF_API is not set -# CONFIG_LWIP_TCPIP_CORE_LOCKING is not set +CONFIG_LWIP_TCPIP_CORE_LOCKING=y +# CONFIG_LWIP_CHECK_THREAD_SAFETY is not set CONFIG_LWIP_DNS_SUPPORT_MDNS_QUERIES=y # CONFIG_LWIP_L2_TO_L3_COPY is not set CONFIG_LWIP_IRAM_OPTIMIZATION=y @@ -780,17 +1087,21 @@ CONFIG_LWIP_IP4_FRAG=y CONFIG_LWIP_IP6_FRAG=y CONFIG_LWIP_IP4_REASSEMBLY=y # CONFIG_LWIP_IP6_REASSEMBLY is not set +CONFIG_LWIP_IP_REASS_MAX_PBUFS=10 # CONFIG_LWIP_IP_FORWARD is not set # CONFIG_LWIP_STATS is not set -# CONFIG_LWIP_ETHARP_TRUST_IP_MAC is not set CONFIG_LWIP_ESP_GRATUITOUS_ARP=y CONFIG_LWIP_GARP_TMR_INTERVAL=60 +CONFIG_LWIP_ESP_MLDV6_REPORT=y +CONFIG_LWIP_MLDV6_TMR_INTERVAL=40 CONFIG_LWIP_TCPIP_RECVMBOX_SIZE=32 CONFIG_LWIP_DHCP_DOES_ARP_CHECK=y # CONFIG_LWIP_DHCP_DISABLE_CLIENT_ID is not set CONFIG_LWIP_DHCP_DISABLE_VENDOR_CLASS_ID=y # CONFIG_LWIP_DHCP_RESTORE_LAST_IP is not set CONFIG_LWIP_DHCP_OPTIONS_LEN=68 +CONFIG_LWIP_NUM_NETIF_CLIENT_DATA=0 +CONFIG_LWIP_DHCP_COARSE_TIMER_SECS=1 # # DHCP server @@ -804,6 +1115,7 @@ CONFIG_LWIP_AUTOIP=y CONFIG_LWIP_AUTOIP_TRIES=2 CONFIG_LWIP_AUTOIP_MAX_CONFLICTS=9 CONFIG_LWIP_AUTOIP_RATE_LIMIT_INTERVAL=20 +CONFIG_LWIP_IPV4=y CONFIG_LWIP_IPV6=y CONFIG_LWIP_IPV6_AUTOCONFIG=y CONFIG_LWIP_IPV6_NUM_ADDRESSES=3 @@ -825,12 +1137,12 @@ CONFIG_LWIP_TCP_SYNMAXRTX=6 CONFIG_LWIP_TCP_MSS=1436 CONFIG_LWIP_TCP_TMR_INTERVAL=250 CONFIG_LWIP_TCP_MSL=60000 +CONFIG_LWIP_TCP_FIN_WAIT_TIMEOUT=20000 CONFIG_LWIP_TCP_SND_BUF_DEFAULT=5744 CONFIG_LWIP_TCP_WND_DEFAULT=5744 CONFIG_LWIP_TCP_RECVMBOX_SIZE=6 CONFIG_LWIP_TCP_QUEUE_OOSEQ=y # CONFIG_LWIP_TCP_SACK_OUT is not set -# CONFIG_LWIP_TCP_KEEP_CONNECTION_WHEN_IP_CHANGES is not set CONFIG_LWIP_TCP_OVERSIZE_MSS=y # CONFIG_LWIP_TCP_OVERSIZE_QUARTER_MSS is not set # CONFIG_LWIP_TCP_OVERSIZE_DISABLE is not set @@ -884,6 +1196,7 @@ CONFIG_LWIP_SNTP_MAX_SERVERS=1 CONFIG_LWIP_SNTP_UPDATE_DELAY=3600000 # end of SNTP +CONFIG_LWIP_BRIDGEIF_MAX_PORTS=7 CONFIG_LWIP_ESP_LWIP_ASSERT=y # @@ -898,9 +1211,15 @@ CONFIG_LWIP_HOOK_IP6_ROUTE_NONE=y CONFIG_LWIP_HOOK_ND6_GET_GW_NONE=y # CONFIG_LWIP_HOOK_ND6_GET_GW_DEFAULT is not set # CONFIG_LWIP_HOOK_ND6_GET_GW_CUSTOM is not set +CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_NONE=y +# CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_DEFAULT is not set +# CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_CUSTOM is not set CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_NONE=y # CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_DEFAULT is not set # CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_CUSTOM is not set +CONFIG_LWIP_HOOK_IP6_INPUT_NONE=y +# CONFIG_LWIP_HOOK_IP6_INPUT_DEFAULT is not set +# CONFIG_LWIP_HOOK_IP6_INPUT_CUSTOM is not set # end of Hooks # CONFIG_LWIP_DEBUG is not set @@ -919,23 +1238,20 @@ CONFIG_MBEDTLS_SSL_OUT_CONTENT_LEN=4096 # CONFIG_MBEDTLS_DEBUG is not set # -# mbedTLS v2.28.x related +# mbedTLS v3.x related # +# CONFIG_MBEDTLS_SSL_PROTO_TLS1_3 is not set # CONFIG_MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH is not set # CONFIG_MBEDTLS_X509_TRUSTED_CERT_CALLBACK is not set # CONFIG_MBEDTLS_SSL_CONTEXT_SERIALIZATION is not set CONFIG_MBEDTLS_SSL_KEEP_PEER_CERTIFICATE=y -# end of mbedTLS v2.28.x related +CONFIG_MBEDTLS_PKCS7_C=y +# end of mbedTLS v3.x related # # Certificate Bundle # -CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=y -CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_FULL=y -# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_CMN is not set -# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_NONE is not set -# CONFIG_MBEDTLS_CUSTOM_CERTIFICATE_BUNDLE is not set -CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_MAX_CERTS=200 +# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE is not set # end of Certificate Bundle # CONFIG_MBEDTLS_ECP_RESTARTABLE is not set @@ -947,9 +1263,10 @@ CONFIG_MBEDTLS_ROM_MD5=y # CONFIG_MBEDTLS_ATCA_HW_ECDSA_SIGN is not set # CONFIG_MBEDTLS_ATCA_HW_ECDSA_VERIFY is not set CONFIG_MBEDTLS_HAVE_TIME=y +# CONFIG_MBEDTLS_PLATFORM_TIME_ALT is not set # CONFIG_MBEDTLS_HAVE_TIME_DATE is not set -CONFIG_MBEDTLS_ECDSA_DETERMINISTIC=y -CONFIG_MBEDTLS_SHA512_C=y +# CONFIG_MBEDTLS_ECDSA_DETERMINISTIC is not set +# CONFIG_MBEDTLS_SHA512_C is not set CONFIG_MBEDTLS_TLS_SERVER_AND_CLIENT=y # CONFIG_MBEDTLS_TLS_SERVER_ONLY is not set # CONFIG_MBEDTLS_TLS_CLIENT_ONLY is not set @@ -963,7 +1280,6 @@ CONFIG_MBEDTLS_TLS_ENABLED=y # # CONFIG_MBEDTLS_PSK_MODES is not set CONFIG_MBEDTLS_KEY_EXCHANGE_RSA=y -CONFIG_MBEDTLS_KEY_EXCHANGE_DHE_RSA=y CONFIG_MBEDTLS_KEY_EXCHANGE_ELLIPTIC_CURVE=y CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_RSA=y CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA=y @@ -971,18 +1287,13 @@ CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA=y CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_RSA=y # end of TLS Key Exchange Methods -CONFIG_MBEDTLS_SSL_RENEGOTIATION=y -# CONFIG_MBEDTLS_SSL_PROTO_SSL3 is not set -CONFIG_MBEDTLS_SSL_PROTO_TLS1=y -CONFIG_MBEDTLS_SSL_PROTO_TLS1_1=y +# CONFIG_MBEDTLS_SSL_RENEGOTIATION is not set CONFIG_MBEDTLS_SSL_PROTO_TLS1_2=y # CONFIG_MBEDTLS_SSL_PROTO_GMTSSL1_1 is not set # CONFIG_MBEDTLS_SSL_PROTO_DTLS is not set -CONFIG_MBEDTLS_SSL_ALPN=y -CONFIG_MBEDTLS_CLIENT_SSL_SESSION_TICKETS=y -CONFIG_MBEDTLS_X509_CHECK_KEY_USAGE=y -CONFIG_MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE=y -CONFIG_MBEDTLS_SERVER_SSL_SESSION_TICKETS=y +# CONFIG_MBEDTLS_SSL_ALPN is not set +# CONFIG_MBEDTLS_CLIENT_SSL_SESSION_TICKETS is not set +# CONFIG_MBEDTLS_SERVER_SSL_SESSION_TICKETS is not set # # Symmetric Ciphers @@ -990,9 +1301,6 @@ CONFIG_MBEDTLS_SERVER_SSL_SESSION_TICKETS=y CONFIG_MBEDTLS_AES_C=y # CONFIG_MBEDTLS_CAMELLIA_C is not set # CONFIG_MBEDTLS_DES_C is not set -CONFIG_MBEDTLS_RC4_DISABLED=y -# CONFIG_MBEDTLS_RC4_ENABLED_NO_DEFAULT is not set -# CONFIG_MBEDTLS_RC4_ENABLED is not set # CONFIG_MBEDTLS_BLOWFISH_C is not set # CONFIG_MBEDTLS_XTEA_C is not set CONFIG_MBEDTLS_CCM_C=y @@ -1012,21 +1320,22 @@ CONFIG_MBEDTLS_X509_CSR_PARSE_C=y # end of Certificates CONFIG_MBEDTLS_ECP_C=y +# CONFIG_MBEDTLS_DHM_C is not set CONFIG_MBEDTLS_ECDH_C=y CONFIG_MBEDTLS_ECDSA_C=y # CONFIG_MBEDTLS_ECJPAKE_C is not set CONFIG_MBEDTLS_ECP_DP_SECP192R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_SECP224R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_SECP256R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_SECP384R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_SECP521R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_SECP192K1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_SECP224K1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_SECP256K1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_BP256R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_BP384R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_BP512R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_CURVE25519_ENABLED=y +# CONFIG_MBEDTLS_ECP_DP_SECP224R1_ENABLED is not set +# CONFIG_MBEDTLS_ECP_DP_SECP256R1_ENABLED is not set +# CONFIG_MBEDTLS_ECP_DP_SECP384R1_ENABLED is not set +# CONFIG_MBEDTLS_ECP_DP_SECP521R1_ENABLED is not set +# CONFIG_MBEDTLS_ECP_DP_SECP192K1_ENABLED is not set +# CONFIG_MBEDTLS_ECP_DP_SECP224K1_ENABLED is not set +# CONFIG_MBEDTLS_ECP_DP_SECP256K1_ENABLED is not set +# CONFIG_MBEDTLS_ECP_DP_BP256R1_ENABLED is not set +# CONFIG_MBEDTLS_ECP_DP_BP384R1_ENABLED is not set +# CONFIG_MBEDTLS_ECP_DP_BP512R1_ENABLED is not set +# CONFIG_MBEDTLS_ECP_DP_CURVE25519_ENABLED is not set CONFIG_MBEDTLS_ECP_NIST_OPTIM=y # CONFIG_MBEDTLS_POLY1305_C is not set # CONFIG_MBEDTLS_CHACHA20_C is not set @@ -1036,30 +1345,12 @@ CONFIG_MBEDTLS_ECP_NIST_OPTIM=y # CONFIG_MBEDTLS_SECURITY_RISKS is not set # end of mbedTLS -# -# mDNS -# -CONFIG_MDNS_MAX_SERVICES=10 -CONFIG_MDNS_TASK_PRIORITY=1 -CONFIG_MDNS_TASK_STACK_SIZE=4096 -# CONFIG_MDNS_TASK_AFFINITY_NO_AFFINITY is not set -CONFIG_MDNS_TASK_AFFINITY_CPU0=y -# CONFIG_MDNS_TASK_AFFINITY_CPU1 is not set -CONFIG_MDNS_TASK_AFFINITY=0x0 -CONFIG_MDNS_SERVICE_ADD_TIMEOUT_MS=2000 -# CONFIG_MDNS_STRICT_MODE is not set -CONFIG_MDNS_TIMER_PERIOD_MS=100 -# CONFIG_MDNS_NETWORKING_SOCKET is not set -CONFIG_MDNS_MULTIPLE_INSTANCE=y -# end of mDNS - # # ESP-MQTT Configurations # -CONFIG_MQTT_PROTOCOL_311=y -CONFIG_MQTT_TRANSPORT_SSL=y -CONFIG_MQTT_TRANSPORT_WEBSOCKET=y -CONFIG_MQTT_TRANSPORT_WEBSOCKET_SECURE=y +# CONFIG_MQTT_PROTOCOL_311 is not set +# CONFIG_MQTT_PROTOCOL_5 is not set +# CONFIG_MQTT_TRANSPORT_SSL is not set # CONFIG_MQTT_MSG_ID_INCREMENTAL is not set # CONFIG_MQTT_SKIP_PUBLISH_IF_DISCONNECTED is not set # CONFIG_MQTT_REPORT_DELETED_MESSAGES is not set @@ -1078,6 +1369,10 @@ CONFIG_NEWLIB_STDOUT_LINE_ENDING_CRLF=y # CONFIG_NEWLIB_STDIN_LINE_ENDING_LF is not set CONFIG_NEWLIB_STDIN_LINE_ENDING_CR=y # CONFIG_NEWLIB_NANO_FORMAT is not set +CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC_HRT=y +# CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC is not set +# CONFIG_NEWLIB_TIME_SYSCALL_USE_HRT is not set +# CONFIG_NEWLIB_TIME_SYSCALL_USE_NONE is not set # end of Newlib # @@ -1087,20 +1382,30 @@ CONFIG_NEWLIB_STDIN_LINE_ENDING_CR=y # end of NVS # -# OpenSSL +# OpenThread # -# CONFIG_OPENSSL_DEBUG is not set -CONFIG_OPENSSL_ERROR_STACK=y -CONFIG_OPENSSL_ASSERT_DO_NOTHING=y -# CONFIG_OPENSSL_ASSERT_EXIT is not set -# end of OpenSSL +# CONFIG_OPENTHREAD_ENABLED is not set # -# OpenThread +# Thread Operational Dataset # -# CONFIG_OPENTHREAD_ENABLED is not set +CONFIG_OPENTHREAD_NETWORK_NAME="OpenThread-ESP" +CONFIG_OPENTHREAD_NETWORK_CHANNEL=15 +CONFIG_OPENTHREAD_NETWORK_PANID=0x1234 +CONFIG_OPENTHREAD_NETWORK_EXTPANID="dead00beef00cafe" +CONFIG_OPENTHREAD_NETWORK_MASTERKEY="00112233445566778899aabbccddeeff" +CONFIG_OPENTHREAD_NETWORK_PSKC="104810e2315100afd6bc9215a6bfac53" +# end of Thread Operational Dataset # end of OpenThread +# +# Protocomm +# +# CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_0 is not set +# CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_1 is not set +CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_2=y +# end of Protocomm + # # PThreads # @@ -1114,6 +1419,14 @@ CONFIG_PTHREAD_TASK_CORE_DEFAULT=-1 CONFIG_PTHREAD_TASK_NAME_DEFAULT="pthread" # end of PThreads +# +# MMU Config +# +CONFIG_MMU_PAGE_SIZE_64KB=y +CONFIG_MMU_PAGE_MODE="64KB" +CONFIG_MMU_PAGE_SIZE=0x10000 +# end of MMU Config + # # SPI Flash driver # @@ -1123,7 +1436,6 @@ CONFIG_SPI_FLASH_ROM_DRIVER_PATCH=y CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y # CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set # CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set -# CONFIG_SPI_FLASH_USE_LEGACY_IMPL is not set # CONFIG_SPI_FLASH_SHARE_SPI1_BUS is not set # CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y @@ -1134,9 +1446,21 @@ CONFIG_SPI_FLASH_WRITE_CHUNK_SIZE=8192 # CONFIG_SPI_FLASH_CHECK_ERASE_TIMEOUT_DISABLED is not set # CONFIG_SPI_FLASH_OVERRIDE_CHIP_DRIVER_LIST is not set +# +# SPI Flash behavior when brownout +# +CONFIG_SPI_FLASH_BROWNOUT_RESET_XMC=y +CONFIG_SPI_FLASH_BROWNOUT_RESET=y +# end of SPI Flash behavior when brownout + # # Auto-detect flash chips # +CONFIG_SPI_FLASH_VENDOR_XMC_SUPPORTED=y +CONFIG_SPI_FLASH_VENDOR_GD_SUPPORTED=y +CONFIG_SPI_FLASH_VENDOR_ISSI_SUPPORTED=y +CONFIG_SPI_FLASH_VENDOR_MXIC_SUPPORTED=y +CONFIG_SPI_FLASH_VENDOR_WINBOND_SUPPORTED=y CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP=y CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP=y CONFIG_SPI_FLASH_SUPPORT_GD_CHIP=y @@ -1145,7 +1469,7 @@ CONFIG_SPI_FLASH_SUPPORT_WINBOND_CHIP=y # CONFIG_SPI_FLASH_SUPPORT_TH_CHIP is not set # end of Auto-detect flash chips -CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE=y +# CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE is not set # end of SPI Flash driver # @@ -1191,11 +1515,16 @@ CONFIG_SPIFFS_USE_MTIME=y # # Websocket # -CONFIG_WS_TRANSPORT=y -CONFIG_WS_BUFFER_SIZE=1024 +# CONFIG_WS_TRANSPORT is not set # end of Websocket # end of TCP Transport +# +# Ultra Low Power (ULP) Co-processor +# +# CONFIG_ULP_COPROC_ENABLED is not set +# end of Ultra Low Power (ULP) Co-processor + # # Unity unit testing library # @@ -1208,14 +1537,19 @@ CONFIG_UNITY_ENABLE_IDF_TEST_RUNNER=y # CONFIG_UNITY_ENABLE_BACKTRACE_ON_FAIL is not set # end of Unity unit testing library +# +# Root Hub configuration +# +# end of Root Hub configuration + # # Virtual file system # CONFIG_VFS_SUPPORT_IO=y CONFIG_VFS_SUPPORT_DIR=y -CONFIG_VFS_SUPPORT_SELECT=y -CONFIG_VFS_SUPPRESS_SELECT_DEBUG_OUTPUT=y -CONFIG_VFS_SUPPORT_TERMIOS=y +# CONFIG_VFS_SUPPORT_SELECT is not set +# CONFIG_VFS_SUPPORT_TERMIOS is not set +CONFIG_VFS_MAX_COUNT=8 # # Host File System I/O (Semihosting) @@ -1238,70 +1572,67 @@ CONFIG_WL_SECTOR_SIZE=4096 CONFIG_WIFI_PROV_SCAN_MAX_ENTRIES=16 CONFIG_WIFI_PROV_AUTOSTOP_TIMEOUT=30 CONFIG_WIFI_PROV_BLE_FORCE_ENCRYPTION=y +CONFIG_WIFI_PROV_STA_ALL_CHANNEL_SCAN=y +# CONFIG_WIFI_PROV_STA_FAST_SCAN is not set # end of Wi-Fi Provisioning Manager -# -# Supplicant -# -CONFIG_WPA_MBEDTLS_CRYPTO=y -# CONFIG_WPA_WAPI_PSK is not set -# CONFIG_WPA_SUITE_B_192 is not set -# CONFIG_WPA_DEBUG_PRINT is not set -# CONFIG_WPA_TESTING_OPTIONS is not set -# CONFIG_WPA_WPS_STRICT is not set -# CONFIG_WPA_11KV_SUPPORT is not set -# CONFIG_WPA_MBO_SUPPORT is not set -# CONFIG_WPA_DPP_SUPPORT is not set -# end of Supplicant - # # Atrium # +CONFIG_WFC_TARGET="esp32" # # software services # -CONFIG_WFC_TARGET="esp32" -CONFIG_VERIFY_HEAP=y -CONFIG_APP_PARAMS=y +CONFIG_CONSOLE_UART_TX=-1 +CONFIG_CONSOLE_UART_RX=-1 +CONFIG_UART_CONSOLE=y +CONFIG_HWCONF_DYNAMIC=y CONFIG_LUA=y CONFIG_THRESHOLDS=y -CONFIG_UART_CONSOLE=y CONFIG_INTEGRATED_HELP=y -CONFIG_HWCONF_DYNAMIC=y -# CONFIG_SOCKET_API is not set -CONFIG_UDNS=y -CONFIG_MQTT=y CONFIG_AT_ACTIONS=y CONFIG_HOLIDAYS=y +CONFIG_TERMSERV=y +CONFIG_STATEMACHINES=y +# CONFIG_APP_PARAMS is not set +# end of software services + +# +# networking services +# +CONFIG_OTA=y +CONFIG_UDNS=y +CONFIG_MQTT=y CONFIG_HTTP=y CONFIG_FTP=y CONFIG_TELNET=y -CONFIG_TERMSERV=y CONFIG_SYSLOG=y CONFIG_INFLUX=y -CONFIG_OTA=y -CONFIG_SMARTCONFIG=y -CONFIG_STATEMACHINES=y CONFIG_UDPCTRL=y CONFIG_WPS=y -# end of software services +# CONFIG_SMARTCONFIG is not set +# end of networking services # # filesystem support # CONFIG_FATFS=y CONFIG_ROMFS=y -# CONFIG_ROMFS_VFS is not set +CONFIG_ROMFS_VFS=y +CONFIG_ROMFS_VFS_NUMFDS=4 # end of filesystem support # # hardware support # +CONFIG_GPIOS=y +# CONFIG_CORETEMP is not set CONFIG_IOEXTENDERS=y CONFIG_LEDS=y CONFIG_BUTTON=y CONFIG_ROTARYENCODER=y +CONFIG_BUZZER=y CONFIG_RELAY=y CONFIG_ONEWIRE=y CONFIG_TOUCHPAD=y @@ -1309,27 +1640,35 @@ CONFIG_DISPLAY=y CONFIG_MAX7219=y CONFIG_HT16K33=y CONFIG_SSD1306=y +CONFIG_SH1106=y CONFIG_DHT=y # CONFIG_HLW8012 is not set CONFIG_I2C=y -CONFIG_I2C_XCMD=y -CONFIG_I2C_XDEV=y -CONFIG_PCA9685=y -CONFIG_PCF8574=y -CONFIG_MCP2300X=y -CONFIG_MCP2301X=y -CONFIG_INA2XX=y -CONFIG_SI7021=y +CONFIG_OPT3001=y CONFIG_BMX280=y +CONFIG_BMP388=y CONFIG_BME680=y +CONFIG_BQ25601D=y CONFIG_HDC1000=y CONFIG_APDS9930=y CONFIG_SGP30=y CONFIG_CCS811B=y CONFIG_BH1750=y +CONFIG_I2C_XCMD=y +CONFIG_I2C_XDEV=y +CONFIG_INA2XX=y +CONFIG_SI7021=y +CONFIG_PCA9685=y +CONFIG_PCF8574=y +CONFIG_TCA9555=y +CONFIG_MCP2300X=y +CONFIG_MCP2301X=y CONFIG_SPI=y CONFIG_SX1276=y CONFIG_SSD1309=y +CONFIG_ILI9341=y +CONFIG_SDCARD=y +CONFIG_XPT2046=y CONFIG_HCSR04=y CONFIG_DIMMER=y CONFIG_RGBLEDS=y @@ -1341,19 +1680,20 @@ CONFIG_TLC5947=y # development tools and experimental/alpha drivers (disable all) # CONFIG_DEVEL=y +CONFIG_VERIFY_HEAP=y CONFIG_FUNCTION_TIMING=y # end of development tools and experimental/alpha drivers (disable all) # end of Atrium # end of Component config -# -# Compatibility options -# -# CONFIG_LEGACY_INCLUDE_COMMON_HEADERS is not set -# end of Compatibility options +# CONFIG_IDF_EXPERIMENTAL_FEATURES is not set # Deprecated options for backward compatibility -CONFIG_TOOLPREFIX="xtensa-esp32-elf-" +# CONFIG_APP_BUILD_TYPE_ELF_RAM is not set +# CONFIG_NO_BLOBS is not set +# CONFIG_ESP32_NO_BLOBS is not set +# CONFIG_ESP32_COMPATIBLE_PRE_V2_1_BOOTLOADERS is not set +# CONFIG_ESP32_COMPATIBLE_PRE_V3_1_BOOTLOADERS is not set # CONFIG_LOG_BOOTLOADER_LEVEL_NONE is not set # CONFIG_LOG_BOOTLOADER_LEVEL_ERROR is not set # CONFIG_LOG_BOOTLOADER_LEVEL_WARN is not set @@ -1367,21 +1707,15 @@ CONFIG_LOG_BOOTLOADER_LEVEL=3 # CONFIG_FLASHMODE_QOUT is not set # CONFIG_FLASHMODE_DIO is not set CONFIG_FLASHMODE_DOUT=y -# CONFIG_MONITOR_BAUD_9600B is not set -# CONFIG_MONITOR_BAUD_57600B is not set -CONFIG_MONITOR_BAUD_115200B=y -# CONFIG_MONITOR_BAUD_230400B is not set -# CONFIG_MONITOR_BAUD_921600B is not set -# CONFIG_MONITOR_BAUD_2MB is not set -# CONFIG_MONITOR_BAUD_OTHER is not set -CONFIG_MONITOR_BAUD_OTHER_VAL=115200 CONFIG_MONITOR_BAUD=115200 +# CONFIG_OPTIMIZATION_LEVEL_DEBUG is not set # CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG is not set +CONFIG_OPTIMIZATION_LEVEL_RELEASE=y CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE=y -CONFIG_OPTIMIZATION_ASSERTIONS_ENABLED=y -# CONFIG_OPTIMIZATION_ASSERTIONS_SILENT is not set +# CONFIG_OPTIMIZATION_ASSERTIONS_ENABLED is not set +CONFIG_OPTIMIZATION_ASSERTIONS_SILENT=y # CONFIG_OPTIMIZATION_ASSERTIONS_DISABLED is not set -CONFIG_OPTIMIZATION_ASSERTION_LEVEL=2 +CONFIG_OPTIMIZATION_ASSERTION_LEVEL=1 # CONFIG_CXX_EXCEPTIONS is not set # CONFIG_STACK_CHECK_NONE is not set # CONFIG_STACK_CHECK_NORM is not set @@ -1389,55 +1723,54 @@ CONFIG_OPTIMIZATION_ASSERTION_LEVEL=2 CONFIG_STACK_CHECK_ALL=y CONFIG_STACK_CHECK=y # CONFIG_WARN_WRITE_STRINGS is not set -# CONFIG_DISABLE_GCC8_WARNINGS is not set # CONFIG_ESP32_APPTRACE_DEST_TRAX is not set CONFIG_ESP32_APPTRACE_DEST_NONE=y CONFIG_ESP32_APPTRACE_LOCK_ENABLE=y CONFIG_ADC2_DISABLE_DAC=y -# CONFIG_SPIRAM_SUPPORT is not set -CONFIG_TRACEMEM_RESERVE_DRAM=0x0 -# CONFIG_ULP_COPROC_ENABLED is not set -CONFIG_ULP_COPROC_RESERVE_MEM=0 -CONFIG_BROWNOUT_DET=y -CONFIG_BROWNOUT_DET_LVL_SEL_0=y -# CONFIG_BROWNOUT_DET_LVL_SEL_1 is not set -# CONFIG_BROWNOUT_DET_LVL_SEL_2 is not set -# CONFIG_BROWNOUT_DET_LVL_SEL_3 is not set -# CONFIG_BROWNOUT_DET_LVL_SEL_4 is not set -# CONFIG_BROWNOUT_DET_LVL_SEL_5 is not set -# CONFIG_BROWNOUT_DET_LVL_SEL_6 is not set -# CONFIG_BROWNOUT_DET_LVL_SEL_7 is not set -CONFIG_BROWNOUT_DET_LVL=0 -CONFIG_ESP32_RTC_CLOCK_SOURCE_INTERNAL_RC=y -# CONFIG_ESP32_RTC_CLOCK_SOURCE_EXTERNAL_CRYSTAL is not set -# CONFIG_ESP32_RTC_CLOCK_SOURCE_EXTERNAL_OSC is not set -# CONFIG_ESP32_RTC_CLOCK_SOURCE_INTERNAL_8MD256 is not set -# CONFIG_DISABLE_BASIC_ROM_CONSOLE is not set -# CONFIG_NO_BLOBS is not set -# CONFIG_COMPATIBLE_PRE_V2_1_BOOTLOADERS is not set +# CONFIG_MCPWM_ISR_IN_IRAM is not set # CONFIG_EVENT_LOOP_PROFILING is not set CONFIG_POST_EVENTS_FROM_ISR=y CONFIG_POST_EVENTS_FROM_IRAM_ISR=y +CONFIG_OTA_ALLOW_HTTP=y # CONFIG_TWO_UNIVERSAL_MAC_ADDRESS is not set CONFIG_FOUR_UNIVERSAL_MAC_ADDRESS=y CONFIG_NUMBER_OF_UNIVERSAL_MAC_ADDRESS=4 # CONFIG_ESP_SYSTEM_PD_FLASH is not set -# CONFIG_ESP32C3_LIGHTSLEEP_GPIO_RESET_WORKAROUND is not set -CONFIG_IPC_TASK_STACK_SIZE=1024 +CONFIG_ESP32_DEEP_SLEEP_WAKEUP_DELAY=2000 +CONFIG_ESP32_RTC_CLK_SRC_INT_RC=y +CONFIG_ESP32_RTC_CLOCK_SOURCE_INTERNAL_RC=y +# CONFIG_ESP32_RTC_CLK_SRC_EXT_CRYS is not set +# CONFIG_ESP32_RTC_CLOCK_SOURCE_EXTERNAL_CRYSTAL is not set +# CONFIG_ESP32_RTC_CLK_SRC_EXT_OSC is not set +# CONFIG_ESP32_RTC_CLOCK_SOURCE_EXTERNAL_OSC is not set +# CONFIG_ESP32_RTC_CLK_SRC_INT_8MD256 is not set +# CONFIG_ESP32_RTC_CLOCK_SOURCE_INTERNAL_8MD256 is not set +CONFIG_ESP32_RTC_CLK_CAL_CYCLES=1024 +# CONFIG_ESP32_XTAL_FREQ_26 is not set +CONFIG_ESP32_XTAL_FREQ_40=y +# CONFIG_ESP32_XTAL_FREQ_AUTO is not set +CONFIG_ESP32_XTAL_FREQ=40 CONFIG_ESP32_PHY_CALIBRATION_AND_DATA_STORAGE=y # CONFIG_ESP32_PHY_INIT_DATA_IN_PARTITION is not set CONFIG_ESP32_PHY_MAX_WIFI_TX_POWER=20 CONFIG_ESP32_PHY_MAX_TX_POWER=20 -CONFIG_ESP32_REDUCE_PHY_TX_POWER=y -# CONFIG_ESP32S2_PANIC_PRINT_HALT is not set -CONFIG_ESP32S2_PANIC_PRINT_REBOOT=y -# CONFIG_ESP32S2_PANIC_SILENT_REBOOT is not set -# CONFIG_ESP32S2_PANIC_GDBSTUB is not set +# CONFIG_SPIRAM_SUPPORT is not set +# CONFIG_ESP32_SPIRAM_SUPPORT is not set +# CONFIG_ESP32_DEFAULT_CPU_FREQ_80 is not set +# CONFIG_ESP32_DEFAULT_CPU_FREQ_160 is not set +CONFIG_ESP32_DEFAULT_CPU_FREQ_240=y +CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ=240 +CONFIG_TRACEMEM_RESERVE_DRAM=0x0 +# CONFIG_ESP32_PANIC_PRINT_HALT is not set +CONFIG_ESP32_PANIC_PRINT_REBOOT=y +# CONFIG_ESP32_PANIC_SILENT_REBOOT is not set +# CONFIG_ESP32_PANIC_GDBSTUB is not set CONFIG_SYSTEM_EVENT_QUEUE_SIZE=32 CONFIG_SYSTEM_EVENT_TASK_STACK_SIZE=2304 CONFIG_MAIN_TASK_STACK_SIZE=8192 CONFIG_CONSOLE_UART_DEFAULT=y # CONFIG_CONSOLE_UART_CUSTOM is not set +# CONFIG_CONSOLE_UART_NONE is not set # CONFIG_ESP_CONSOLE_UART_NONE is not set CONFIG_CONSOLE_UART=y CONFIG_CONSOLE_UART_NUM=0 @@ -1446,14 +1779,55 @@ CONFIG_INT_WDT=y CONFIG_INT_WDT_TIMEOUT_MS=3000 CONFIG_INT_WDT_CHECK_CPU1=y CONFIG_TASK_WDT=y +CONFIG_ESP_TASK_WDT=y CONFIG_TASK_WDT_PANIC=y CONFIG_TASK_WDT_TIMEOUT_S=15 CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU0=y CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU1=y # CONFIG_ESP32_DEBUG_STUBS_ENABLE is not set +# CONFIG_ESP32_DEBUG_OCDAWARE is not set +# CONFIG_BROWNOUT_DET is not set +# CONFIG_ESP32_BROWNOUT_DET is not set +# CONFIG_DISABLE_BASIC_ROM_CONSOLE is not set +CONFIG_IPC_TASK_STACK_SIZE=1024 CONFIG_TIMER_TASK_STACK_SIZE=4096 -# CONFIG_ESP32_ENABLE_COREDUMP_TO_FLASH is not set -CONFIG_ESP32_ENABLE_COREDUMP_TO_UART=y +CONFIG_ESP32_WIFI_ENABLED=y +CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=10 +CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=32 +CONFIG_ESP32_WIFI_STATIC_TX_BUFFER=y +# CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER is not set +CONFIG_ESP32_WIFI_TX_BUFFER_TYPE=0 +CONFIG_ESP32_WIFI_STATIC_TX_BUFFER_NUM=16 +# CONFIG_ESP32_WIFI_CSI_ENABLED is not set +CONFIG_ESP32_WIFI_AMPDU_TX_ENABLED=y +CONFIG_ESP32_WIFI_TX_BA_WIN=6 +CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED=y +CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED=y +CONFIG_ESP32_WIFI_RX_BA_WIN=16 +CONFIG_ESP32_WIFI_RX_BA_WIN=16 +CONFIG_ESP32_WIFI_NVS_ENABLED=y +CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_0=y +# CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_1 is not set +CONFIG_ESP32_WIFI_SOFTAP_BEACON_MAX_LEN=752 +CONFIG_ESP32_WIFI_MGMT_SBUF_NUM=32 +CONFIG_ESP32_WIFI_IRAM_OPT=y +CONFIG_ESP32_WIFI_RX_IRAM_OPT=y +CONFIG_ESP32_WIFI_ENABLE_WPA3_SAE=y +CONFIG_ESP32_WIFI_ENABLE_WPA3_OWE_STA=y +CONFIG_WPA_MBEDTLS_CRYPTO=y +CONFIG_WPA_MBEDTLS_TLS_CLIENT=y +# CONFIG_WPA_WAPI_PSK is not set +# CONFIG_WPA_SUITE_B_192 is not set +# CONFIG_WPA_11KV_SUPPORT is not set +# CONFIG_WPA_MBO_SUPPORT is not set +# CONFIG_WPA_DPP_SUPPORT is not set +# CONFIG_WPA_11R_SUPPORT is not set +# CONFIG_WPA_WPS_SOFTAP_REGISTRAR is not set +# CONFIG_WPA_WPS_STRICT is not set +# CONFIG_WPA_DEBUG_PRINT is not set +# CONFIG_WPA_TESTING_OPTIONS is not set +CONFIG_ESP32_ENABLE_COREDUMP_TO_FLASH=y +# CONFIG_ESP32_ENABLE_COREDUMP_TO_UART is not set # CONFIG_ESP32_ENABLE_COREDUMP_TO_NONE is not set # CONFIG_ESP32_COREDUMP_DATA_FORMAT_BIN is not set CONFIG_ESP32_COREDUMP_DATA_FORMAT_ELF=y @@ -1461,31 +1835,13 @@ CONFIG_ESP32_COREDUMP_CHECKSUM_CRC32=y # CONFIG_ESP32_COREDUMP_CHECKSUM_SHA256 is not set CONFIG_ESP32_ENABLE_COREDUMP=y CONFIG_ESP32_CORE_DUMP_MAX_TASKS_NUM=32 -CONFIG_ESP32_CORE_DUMP_UART_DELAY=0 -CONFIG_ESP32_CORE_DUMP_DECODE_INFO=y -# CONFIG_ESP32_CORE_DUMP_DECODE_DISABLE is not set -CONFIG_ESP32_CORE_DUMP_DECODE="info" -CONFIG_MB_MASTER_TIMEOUT_MS_RESPOND=150 -CONFIG_MB_MASTER_DELAY_MS_CONVERT=200 -CONFIG_MB_QUEUE_LENGTH=20 -CONFIG_MB_SERIAL_TASK_STACK_SIZE=2048 -CONFIG_MB_SERIAL_BUF_SIZE=256 -CONFIG_MB_SERIAL_TASK_PRIO=10 -CONFIG_MB_CONTROLLER_SLAVE_ID_SUPPORT=y -CONFIG_MB_CONTROLLER_SLAVE_ID=0x00112233 -CONFIG_MB_CONTROLLER_NOTIFY_TIMEOUT=20 -CONFIG_MB_CONTROLLER_NOTIFY_QUEUE_SIZE=20 -CONFIG_MB_CONTROLLER_STACK_SIZE=4096 -CONFIG_MB_EVENT_QUEUE_TIMEOUT=20 -CONFIG_MB_TIMER_PORT_ENABLED=y -CONFIG_MB_TIMER_GROUP=0 -CONFIG_MB_TIMER_INDEX=0 -# CONFIG_ENABLE_STATIC_TASK_CLEAN_UP_HOOK is not set +CONFIG_ESP32_CORE_DUMP_STACK_SIZE=0 CONFIG_TIMER_TASK_PRIORITY=1 CONFIG_TIMER_TASK_STACK_DEPTH=2048 CONFIG_TIMER_QUEUE_LENGTH=10 +# CONFIG_ENABLE_STATIC_TASK_CLEAN_UP_HOOK is not set +# CONFIG_HAL_ASSERTION_SILIENT is not set # CONFIG_L2_TO_L3_COPY is not set -# CONFIG_USE_ONLY_LWIP_SELECT is not set CONFIG_ESP_GRATUITOUS_ARP=y CONFIG_GARP_TMR_INTERVAL=60 CONFIG_TCPIP_RECVMBOX_SIZE=32 @@ -1497,7 +1853,6 @@ CONFIG_TCP_SND_BUF_DEFAULT=5744 CONFIG_TCP_WND_DEFAULT=5744 CONFIG_TCP_RECVMBOX_SIZE=6 CONFIG_TCP_QUEUE_OOSEQ=y -# CONFIG_ESP_TCP_KEEP_CONNECTION_WHEN_IP_CHANGES is not set CONFIG_TCP_OVERSIZE_MSS=y # CONFIG_TCP_OVERSIZE_QUARTER_MSS is not set # CONFIG_TCP_OVERSIZE_DISABLE is not set @@ -1508,6 +1863,12 @@ CONFIG_TCPIP_TASK_AFFINITY_NO_AFFINITY=y # CONFIG_TCPIP_TASK_AFFINITY_CPU1 is not set CONFIG_TCPIP_TASK_AFFINITY=0x7FFFFFFF # CONFIG_PPP_SUPPORT is not set +CONFIG_ESP32_TIME_SYSCALL_USE_RTC_HRT=y +CONFIG_ESP32_TIME_SYSCALL_USE_RTC_FRC1=y +# CONFIG_ESP32_TIME_SYSCALL_USE_RTC is not set +# CONFIG_ESP32_TIME_SYSCALL_USE_HRT is not set +# CONFIG_ESP32_TIME_SYSCALL_USE_FRC1 is not set +# CONFIG_ESP32_TIME_SYSCALL_USE_NONE is not set CONFIG_ESP32_PTHREAD_TASK_PRIO_DEFAULT=5 CONFIG_ESP32_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072 CONFIG_ESP32_PTHREAD_STACK_MIN=768 @@ -1519,7 +1880,7 @@ CONFIG_ESP32_PTHREAD_TASK_NAME_DEFAULT="pthread" CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ABORTS=y # CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_FAILS is not set # CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ALLOWED is not set -CONFIG_SUPPRESS_SELECT_DEBUG_OUTPUT=y -CONFIG_SUPPORT_TERMIOS=y +# CONFIG_ESP32_ULP_COPROC_ENABLED is not set +# CONFIG_SUPPORT_TERMIOS is not set CONFIG_SEMIHOSTFS_MAX_MOUNT_POINTS=1 # End of deprecated options diff --git a/projects/esp32_4m_min b/projects/esp32_4m_min index 1941058..0e9204a 100644 --- a/projects/esp32_4m_min +++ b/projects/esp32_4m_min @@ -1737,6 +1737,7 @@ CONFIG_UDNS=y # CONFIG_IOEXTENDERS is not set # CONFIG_LEDS is not set # CONFIG_BUTTON is not set +# CONFIG_BUZZER is not set # CONFIG_RELAY is not set # CONFIG_ONEWIRE is not set # CONFIG_TOUCHPAD is not set diff --git a/projects/esp32_8m_full b/projects/esp32_8m_full index 33124ac..8c6bedf 100644 --- a/projects/esp32_8m_full +++ b/projects/esp32_8m_full @@ -1743,6 +1743,7 @@ CONFIG_IOEXTENDERS=y CONFIG_LEDS=y CONFIG_BUTTON=y CONFIG_ROTARYENCODER=y +CONFIG_BUZZER=y CONFIG_RELAY=y CONFIG_ONEWIRE=y CONFIG_TOUCHPAD=y @@ -1750,33 +1751,34 @@ CONFIG_DISPLAY=y CONFIG_MAX7219=y CONFIG_HT16K33=y CONFIG_SSD1306=y -# CONFIG_SH1106 is not set +CONFIG_SH1106=y CONFIG_DHT=y CONFIG_HLW8012=y CONFIG_I2C=y -CONFIG_I2C_XCMD=y -CONFIG_I2C_XDEV=y -CONFIG_PCA9685=y -CONFIG_PCF8574=y -CONFIG_TCA9555=y -CONFIG_MCP2300X=y -CONFIG_MCP2301X=y -# CONFIG_OPT3001 is not set -CONFIG_INA2XX=y -CONFIG_SI7021=y +CONFIG_OPT3001=y CONFIG_BMX280=y -# CONFIG_BMP388 is not set +CONFIG_BMP388=y CONFIG_BME680=y +CONFIG_BQ25601D=y CONFIG_HDC1000=y CONFIG_APDS9930=y CONFIG_SGP30=y CONFIG_CCS811B=y CONFIG_BH1750=y +CONFIG_I2C_XCMD=y +CONFIG_I2C_XDEV=y +CONFIG_INA2XX=y +CONFIG_SI7021=y +CONFIG_PCA9685=y +CONFIG_PCF8574=y +CONFIG_TCA9555=y +CONFIG_MCP2300X=y +CONFIG_MCP2301X=y CONFIG_SPI=y CONFIG_SX1276=y CONFIG_SSD1309=y CONFIG_ILI9341=y -# CONFIG_SDCARD is not set +CONFIG_SDCARD=y CONFIG_XPT2046=y CONFIG_HCSR04=y CONFIG_DIMMER=y diff --git a/projects/esp8266_2m b/projects/esp8266_2m index 7ec5bb2..6d7338e 100644 --- a/projects/esp8266_2m +++ b/projects/esp8266_2m @@ -292,23 +292,25 @@ CONFIG_SSD1306=y # CONFIG_SH1106 is not set CONFIG_DHT=y CONFIG_I2C=y -CONFIG_I2C_XCMD=y -CONFIG_I2C_XDEV=y -CONFIG_PCA9685=y -CONFIG_PCF8574=y -# CONFIG_TCA9555 is not set -CONFIG_MCP2300X=y -CONFIG_MCP2301X=y # CONFIG_OPT3001 is not set -CONFIG_INA2XX=y -CONFIG_SI7021=y CONFIG_BMX280=y +# CONFIG_BMP388 is not set CONFIG_BME680=y +# CONFIG_BQ25601D is not set CONFIG_HDC1000=y CONFIG_APDS9930=y CONFIG_SGP30=y CONFIG_CCS811B=y CONFIG_BH1750=y +CONFIG_I2C_XCMD=y +CONFIG_I2C_XDEV=y +CONFIG_INA2XX=y +CONFIG_SI7021=y +CONFIG_PCA9685=y +CONFIG_PCF8574=y +# CONFIG_TCA9555 is not set +CONFIG_MCP2300X=y +CONFIG_MCP2301X=y CONFIG_HCSR04=y CONFIG_DIMMER=y CONFIG_RGBLEDS=y diff --git a/projects/esp8266_4m b/projects/esp8266_4m index 48bcc7c..295e926 100644 --- a/projects/esp8266_4m +++ b/projects/esp8266_4m @@ -292,23 +292,25 @@ CONFIG_SSD1306=y CONFIG_SH1106=y CONFIG_DHT=y CONFIG_I2C=y -CONFIG_I2C_XCMD=y -CONFIG_I2C_XDEV=y -CONFIG_PCA9685=y -CONFIG_PCF8574=y -CONFIG_TCA9555=y -CONFIG_MCP2300X=y -CONFIG_MCP2301X=y CONFIG_OPT3001=y -CONFIG_INA2XX=y -CONFIG_SI7021=y CONFIG_BMX280=y +CONFIG_BMP388=y CONFIG_BME680=y +# CONFIG_BQ25601D is not set CONFIG_HDC1000=y CONFIG_APDS9930=y CONFIG_SGP30=y CONFIG_CCS811B=y CONFIG_BH1750=y +CONFIG_I2C_XCMD=y +CONFIG_I2C_XDEV=y +CONFIG_INA2XX=y +CONFIG_SI7021=y +CONFIG_PCA9685=y +CONFIG_PCF8574=y +CONFIG_TCA9555=y +CONFIG_MCP2300X=y +CONFIG_MCP2301X=y CONFIG_HCSR04=y CONFIG_DIMMER=y CONFIG_RGBLEDS=y diff --git a/projects/esp8266_4m_full b/projects/esp8266_4m_full index 1582e4e..e574f9b 100644 --- a/projects/esp8266_4m_full +++ b/projects/esp8266_4m_full @@ -289,26 +289,28 @@ CONFIG_DISPLAY=y CONFIG_MAX7219=y CONFIG_HT16K33=y CONFIG_SSD1306=y -# CONFIG_SH1106 is not set +CONFIG_SH1106=y CONFIG_DHT=y CONFIG_I2C=y -CONFIG_I2C_XCMD=y -CONFIG_I2C_XDEV=y -CONFIG_PCA9685=y -CONFIG_PCF8574=y -CONFIG_TCA9555=y -CONFIG_MCP2300X=y -CONFIG_MCP2301X=y -# CONFIG_OPT3001 is not set -CONFIG_INA2XX=y -CONFIG_SI7021=y +CONFIG_OPT3001=y CONFIG_BMX280=y +CONFIG_BMP388=y CONFIG_BME680=y +CONFIG_BQ25601D=y CONFIG_HDC1000=y CONFIG_APDS9930=y CONFIG_SGP30=y CONFIG_CCS811B=y CONFIG_BH1750=y +CONFIG_I2C_XCMD=y +CONFIG_I2C_XDEV=y +CONFIG_INA2XX=y +CONFIG_SI7021=y +CONFIG_PCA9685=y +CONFIG_PCF8574=y +CONFIG_TCA9555=y +CONFIG_MCP2300X=y +CONFIG_MCP2301X=y CONFIG_HCSR04=y CONFIG_DIMMER=y CONFIG_RGBLEDS=y diff --git a/projects/esp8266_4m_min b/projects/esp8266_4m_min index 2ce27ed..e021fce 100644 --- a/projects/esp8266_4m_min +++ b/projects/esp8266_4m_min @@ -279,16 +279,18 @@ CONFIG_WFC_TARGET="esp8266" # CONFIG_DISPLAY is not set # CONFIG_DHT is not set CONFIG_I2C=y -# CONFIG_I2C_XCMD is not set -# CONFIG_I2C_XDEV is not set # CONFIG_OPT3001 is not set # CONFIG_BMX280 is not set +# CONFIG_BMP388 is not set # CONFIG_BME680 is not set +# CONFIG_BQ25601D is not set # CONFIG_HDC1000 is not set # CONFIG_APDS9930 is not set # CONFIG_SGP30 is not set # CONFIG_CCS811B is not set # CONFIG_BH1750 is not set +# CONFIG_I2C_XCMD is not set +# CONFIG_I2C_XDEV is not set # CONFIG_HCSR04 is not set # CONFIG_DIMMER is not set # CONFIG_RGBLEDS is not set diff --git a/projects/esp8285 b/projects/esp8285 index d3e8b4b..f7ff5da 100644 --- a/projects/esp8285 +++ b/projects/esp8285 @@ -279,16 +279,18 @@ CONFIG_BUTTON=y CONFIG_RELAY=y # CONFIG_DHT is not set CONFIG_I2C=y -# CONFIG_I2C_XCMD is not set -# CONFIG_I2C_XDEV is not set # CONFIG_OPT3001 is not set CONFIG_BMX280=y +# CONFIG_BMP388 is not set # CONFIG_BME680 is not set +# CONFIG_BQ25601D is not set # CONFIG_HDC1000 is not set # CONFIG_APDS9930 is not set # CONFIG_SGP30 is not set # CONFIG_CCS811B is not set # CONFIG_BH1750 is not set +# CONFIG_I2C_XCMD is not set +# CONFIG_I2C_XDEV is not set # CONFIG_HCSR04 is not set # CONFIG_DIMMER is not set # CONFIG_RGBLEDS is not set diff --git a/setupenv.sh b/setupenv.sh index 9edcbef..d078404 100755 --- a/setupenv.sh +++ b/setupenv.sh @@ -215,23 +215,32 @@ git reset --hard v3.3 || exit 1 git submodule deinit -f --all git switch release/v3.3 git submodule update --init -IDF_PATH=`pwd` python2 tools/idf_tools.py install || exit 1 +echo install tools +python2 -m pip install --upgrade pip +IDF_PATH="$IDF_ESP8266" python2 tools/check_python_dependencies.py IDF_PATH=`pwd` python2 tools/idf_tools.py install-python-env || exit 1 -echo patching IDF for ESP8266 -patch -t -p1 < $patchdir/idf-esp8266-v3.3.diff || echo PATCHING FAILED! +IDF_PATH=`pwd` python2 tools/idf_tools.py install || exit 1 popd > /dev/null echo settings for $IDF_ESP8266 pushd "$IDF_ESP8266" echo IDF_ESP8266=$IDF_ESP8266 >> $settings -IDF_PATH="$IDF_ESP8266" python2 "$IDF_ESP8266/tools/idf_tools.py" export | sed "s/export //g;s/=/_ESP8266=/g;s/;/\n/g;s/\"//g" >> $settings +IDF_PATH="$IDF_ESP8266" python2 "tools/idf_tools.py" export | sed "s/export //g;s/=/_ESP8266=/g;s/;/\n/g;s/\"//g" >> $settings popd > /dev/null +echo checking requirements of ESP8266 IDF in $IDF_ESP8266 +#IDF_PATH=$IDF_ESP8266 python2 -m pip install --user -r requirements.txt echo =================== cat $settings echo =================== echo +pushd "$IDF_ESP8266" +echo "updating to latest v3.3" +git checkout v3.3 +echo patching IDF for ESP8266 +patch -t -p1 < $patchdir/idf-esp8266-v3.3.diff || echo PATCHING FAILED! +popd ## ESP32 IDF if [ "$IDF_ESP32" == "" ]; then @@ -350,6 +359,7 @@ popd > /dev/null #echo checking requirements of ESP32 IDF in $IDF_ESP32 #IDF_PATH=$IDF_ESP32 pip install -r $IDF_ESP32/requirements.txt # +#pip install -U pip #echo checking requirements of ESP8266 IDF in $IDF_ESP8266 #IDF_PATH=$IDF_ESP8266 pip install -r $IDF_ESP8266/requirements.txt