diff --git a/nametag8_CH592/user/comm/i2c.h b/nametag8_CH592/user/comm/i2c.h index 64ead2d..60d8050 100644 --- a/nametag8_CH592/user/comm/i2c.h +++ b/nametag8_CH592/user/comm/i2c.h @@ -17,15 +17,57 @@ #define i2c_init() i2cm_init() -#define i2c_start() i2cm_start() +#define i2c_start() SetSysClock(CLK_SOURCE_PLL_32MHz); i2cm_start() #define i2c_restart() i2cm_restart() -#define i2c_stop() i2cm_stop() +#define i2c_stop() SetSysClock(CLK_SOURCE_HSE_16MHz); i2cm_stop() #define i2c_rd(ack) i2cm_rd(ack) #define i2c_wr(dat) i2cm_wr(dat) #define i2c_addr(a, w) i2c_start(); i2cm_addr(a, w) -#define i2c_rdbuf(d, x) i2cm_rdbuf(d, x) -#define i2c_wrbuf(d, x) i2cm_wrbuf(d, x) +#define i2c_rdbuf(d, s) i2cm_rdbuf(d, s); i2c_stop() +#define i2c_wrbuf(d, s) i2cm_wrbuf(d, s); i2c_stop() + + +#define i2c_read(a, d, s) i2c_start(); \ + i2cm_addr(a, 1); \ + i2cm_rdbuf(d, s); \ + i2c_stop() + +#define i2c_read_reg8(a, r, d, s) i2c_start(); \ + i2cm_addr(a, 0); \ + i2cm_wr(r); \ + i2cm_restart(); \ + i2cm_addr(a, 1); \ + i2cm_rdbuf(d, s); \ + i2c_stop() + +#define i2c_read_reg16(a, r, d, s) i2c_start(); \ + i2cm_addr(a, 0); \ + i2cm_wr(r >> 8); \ + i2cm_wr(r & 0xff); \ + i2cm_restart(); \ + i2cm_addr(a, 1); \ + i2cm_rdbuf(d, s); \ + i2c_stop() + + +#define i2c_write(a, d, s) i2c_start(); \ + i2cm_addr(a, 0); \ + i2cm_wrbuf(d, s); \ + i2c_stop() + +#define i2c_write_reg8(a, r, d, s) i2c_start(); \ + i2cm_addr(a, 0); \ + i2cm_wr(r); \ + i2cm_wrbuf(d, s); \ + i2c_stop() + +#define i2c_write_reg16(a, r, d, s) i2c_start(); \ + i2cm_addr(a, 0); \ + i2cm_wr(r >> 8); \ + i2cm_wr(r & 0xff); \ + i2cm_wrbuf(d, s); \ + i2c_stop() #else diff --git a/nametag8_CH592/user/comm/soft_i2c_master.c b/nametag8_CH592/user/comm/soft_i2c_master.c index 9079875..5d69c9c 100644 --- a/nametag8_CH592/user/comm/soft_i2c_master.c +++ b/nametag8_CH592/user/comm/soft_i2c_master.c @@ -59,8 +59,8 @@ void i2cm_init() sysclk = GetSysClock(); cycles = sysclk / 500000; - delay_hi = (cycles - CYCLES_TO_HI) / 4; - delay_lo = (cycles - CYCLES_TO_LO) / 4; + delay_hi = (cycles - CYCLES_TO_HI - 2) / 4; + delay_lo = (cycles - CYCLES_TO_LO - 2) / 4; } void i2cm_start() @@ -139,10 +139,10 @@ uint8_t i2cm_wr(uint8_t dat) } // use a left-aligned address with this implementation. -uint8_t i2cm_addr(uint8_t addr, uint8_t write) +uint8_t i2cm_addr(uint8_t addr, uint8_t reading_bit) { addr &= ~0x1; - addr |= write ? 0 : 1; + addr |= reading_bit ? 1 : 0; return i2cm_wr(addr); } @@ -150,10 +150,10 @@ uint8_t i2cm_addr(uint8_t addr, uint8_t write) void i2cm_rdbuf(uint8_t *dat, uint8_t len) { while(len--) *dat++ = i2cm_rd(len > 0); - i2cm_stop(); + // i2cm_stop(); } -void i2cm_wrbuf(uint8_t *dat, uint8_t len) +void i2cm_wrbuf(const uint8_t *dat, uint8_t len) { uint8_t nack; @@ -161,5 +161,5 @@ void i2cm_wrbuf(uint8_t *dat, uint8_t len) nack = i2cm_wr(*dat++); if (nack) break; } - i2cm_stop(); + // i2cm_stop(); } diff --git a/nametag8_CH592/user/comm/soft_i2c_master.h b/nametag8_CH592/user/comm/soft_i2c_master.h index d0d2e98..f3fda8b 100644 --- a/nametag8_CH592/user/comm/soft_i2c_master.h +++ b/nametag8_CH592/user/comm/soft_i2c_master.h @@ -45,10 +45,10 @@ void i2cm_stop(); uint8_t i2cm_rd(uint8_t ack); uint8_t i2cm_wr(uint8_t dat); -uint8_t i2cm_addr(uint8_t addr, uint8_t write); +uint8_t i2cm_addr(uint8_t addr, uint8_t reading_bit); void i2cm_rdbuf(uint8_t *dat, uint8_t len); -void i2cm_wrbuf(uint8_t *dat, uint8_t len); +void i2cm_wrbuf(const uint8_t *dat, uint8_t len); diff --git a/nametag8_CH592/user/global.h b/nametag8_CH592/user/global.h new file mode 100644 index 0000000..97e1f59 --- /dev/null +++ b/nametag8_CH592/user/global.h @@ -0,0 +1,27 @@ +/* + * global.h + * + * Created on: Oct 13, 2024 + * Author: true + */ + +#ifndef USER_GLOBAL_H_ +#define USER_GLOBAL_H_ + +#include + + + +extern const uint8_t vers[]; + +extern uint8_t cpu_use; +extern uint8_t cpu_max; + +extern uint32_t uptime; +extern uint16_t uptime_hour; +extern uint8_t uptime_min; +extern uint8_t uptime_sec; + + + +#endif /* USER_GLOBAL_H_ */ diff --git a/nametag8_CH592/user/hw/aw20xxx.h b/nametag8_CH592/user/hw/aw20xxx.h index 52da264..0578183 100644 --- a/nametag8_CH592/user/hw/aw20xxx.h +++ b/nametag8_CH592/user/hw/aw20xxx.h @@ -158,7 +158,7 @@ enum aw20x_size { #ifdef SOFT_I2C_MASTER #define AW20X_I2C_busy() (0) -#define AW20X_I2C_writereg(adr, reg, buf, siz) i2c_addr(adr, 1); i2c_wr(reg); i2c_wrbuf(buf, siz); +#define AW20X_I2C_writereg(adr, reg, buf, siz) i2c_write_reg8(adr, reg, buf, siz) #else #define AW20X_I2C_busy() (0) #define AW20X_I2C_writereg(adr, reg, buf, siz) i2c_write_addr1b(adr, reg, buf, siz); diff --git a/nametag8_CH592/user/hw/ch32sub.c b/nametag8_CH592/user/hw/ch32sub.c index 9ec08f7..f7d3cc6 100644 --- a/nametag8_CH592/user/hw/ch32sub.c +++ b/nametag8_CH592/user/hw/ch32sub.c @@ -14,12 +14,24 @@ #include "ch32sub.h" #include "port_intr.h" -#include "../comm/i2c.h" +// interrupt callbacks +#include "ui/btn.h" volatile uint8_t intr_flag = 0; +static void (*flag_cb[8])() = { + btn_intr, + 0, + 0, + 0, + 0, + 0, + 0, + 0 +}; + void ch32sub_isr() @@ -30,10 +42,30 @@ void ch32sub_isr() void ch32sub_process() { + uint8_t flags; + uint8_t i; + if (intr_flag) { intr_flag = 0; + flags = 1; // get interrupt flags + i2c_read_reg16(SUB_I2C_ADDR, REG_INTR_FLAGS, &flags, 1); + + while (flags) { + for (i = 0; i < 8; i++) { + if (intr_flag & (1 << i)) { + if (flag_cb[i]) flag_cb[i](); + else { + // unhandled interrupt; clear it + // ch32sub_write_1b(REG_INTR_FLAGS, i << 1); + } + } + } + + // get interrupt flags (again) + i2c_read_reg16(SUB_I2C_ADDR, REG_INTR_FLAGS, &flags, 1); + } } } @@ -42,15 +74,37 @@ void ch32sub_init() // configure interrupt pin as pull-up // interrupt driven by CH32V003 is open drain active-lo GPIOB_ModeCfg(SUB_INTR_PIN, GPIO_ModeIN_PU); - - // register interrupt handler - port_intr_cb_register(PORT_INTR_GPIOB, SUB_INTR_PIN_NR, ch32sub_isr); - // configure interrupt to be rising edge GPIOB_ITModeCfg(SUB_INTR_PIN, GPIO_ITMode_RiseEdge); + + // register interrupt handler + // note: this is handled as "high priority" within the interrupt handler now. + // port_intr_cb_register(PORT_INTR_GPIOB, SUB_INTR_PIN_NR, ch32sub_isr); + + } // things to do +void ch32sub_read(uint16_t reg, uint8_t *dat, uint8_t len) +{ + i2c_read_reg16(SUB_I2C_ADDR, reg, dat, len); +} + +void ch32sub_write(uint16_t reg, uint8_t *dat, uint8_t len) +{ + i2c_write_reg16(SUB_I2C_ADDR, reg, dat, len); +} + +void ch32sub_write_1b(uint16_t reg, uint8_t dat) +{ + i2c_start(); + i2c_addr(SUB_I2C_ADDR, 0); + i2c_wr(reg >> 8); + i2c_wr(reg & 0xff); + i2c_wr(dat); + i2c_stop(); +} + void ch32sub_rgb_hwen(uint8_t en) { i2c_addr(SUB_I2C_ADDR, 1); diff --git a/nametag8_CH592/user/hw/ch32sub.h b/nametag8_CH592/user/hw/ch32sub.h index 2b85f98..cd0bd32 100644 --- a/nametag8_CH592/user/hw/ch32sub.h +++ b/nametag8_CH592/user/hw/ch32sub.h @@ -12,6 +12,8 @@ #include "CH59x_common.h" #include +#include "../comm/i2c.h" + #define SUB_I2C_ADDR 0x5e @@ -25,11 +27,85 @@ #define SUB_INT_UTX_DONE (1 << 4) #define SUB_INT_URX_RCVD (1 << 5) +#define INT_BTN (1 << 0) +#define INT_ACCEL (1 << 1) +#define INT_UTX_DONE (1 << 4) +#define INT_UTX_TIMEOUT (1 << 5) +#define INT_UTX_ERROR (1 << 6) +#define INT_URX_RCVD (1 << 7) + + + +enum ch32sub_regmap { + // read-only + REG_INTR_FLAGS = 0x00, + REG_RSVD_01, + REG_BTN_PUSHED_LATCHED, // buttons currently pushed. + REG_BTN_PUSHED, // buttons pushed. reading will clear this value. + REG_BTN_HELD, // buttons currently being held. reading will clear this value. + REG_BTN_RELEASED, // buttons released. reading will clear this value. + REG_BTN1_MASK, // raw bitmask of button 1 state + REG_BTN2_MASK, // button interrupt is cleared on read of ANY REG_BTNx_MASK register + REG_BTN3_MASK, + REG_BTN4_MASK, + REG_BTN5_MASK, + + REG_WERR_HI = 0x0c, // write error count, high byte + REG_WERR_LO, // write error count, low byte + REG_IRDA_READ_HI, // IrDA read packet length, hi byte (currently always 0) + REG_IRDA_READ_LO, // IrDA read packet length, lo byte + + // read-write + REG_INTR_FLAGS_CLEAR = 0x10, + REG_INTR_ENABLE, // interrupt enable flags + REG_BTN_DEBOUNCE_TIME, + REG_BTN1_INT_ENABLE, // button 1 interrupt mask + REG_BTN2_INT_ENABLE, // button 2 interrupt mask + REG_BTN3_INT_ENABLE, // button 3 interrupt mask + REG_BTN4_INT_ENABLE, // button 4 interrupt mask + REG_BTN5_INT_ENABLE, // button 5 interrupt mask + + REG_RGB_HWEN, // high = RGB_HWEN hi, low = RGB_HWEN low + + REG_IRDA_TIMER = 0x1a, // IrDA read/write packet attempt time in 1/10 second increments (max ~25.5s sending time) + REG_IRDA_WRITE_RETRY, // IrDA write packet retry timeout in 1/100 second increments (max ~2.5s per retry) + REG_IRDA_MODE, // IrDA mode. 0 = idle, 1 = transmit, 2 = receive + REG_IRDA_WRITE_HI, // IrDA write packet length, hi byte (currently ignored) + REG_IRDA_WRITE_LO, // IrDA write packet length, lo byte + + REG_BTN1_HOLD_HI = 0x20, // btn initial hold time in 2ms increments, hi byte + REG_BTN1_HOLD_LO, // btn initial hold time in 2ms increments, lo byte + REG_BTN2_HOLD_HI, + REG_BTN2_HOLD_LO, + REG_BTN3_HOLD_HI, + REG_BTN3_HOLD_LO, + REG_BTN4_HOLD_HI, + REG_BTN4_HOLD_LO, + REG_BTN5_HOLD_HI, + REG_BTN5_HOLD_LO, + + REG_BTN1_REPEAT_HI = 0x30, // btn repeat time in 2ms increments, hi byte + REG_BTN1_REPEAT_LO, // btn repeat time in 2ms increments, lo byte + REG_BTN2_REPEAT_HI, + REG_BTN2_REPEAT_LO, + REG_BTN3_REPEAT_HI, + REG_BTN3_REPEAT_LO, + REG_BTN4_REPEAT_HI, + REG_BTN4_REPEAT_LO, + REG_BTN5_REPEAT_HI, + REG_BTN5_REPEAT_LO, +}; + void ch32sub_init(); +void ch32sub_isr(); void ch32sub_process(); +void ch32sub_read(uint16_t reg, uint8_t *dat, uint8_t len); +void ch32sub_write(uint16_t reg, uint8_t *dat, uint8_t len); +void ch32sub_write_1b(uint16_t reg, uint8_t dat); + void ch32sub_rgb_hwen(uint8_t en); diff --git a/nametag8_CH592/user/hw/lightsense.c b/nametag8_CH592/user/hw/lightsense.c new file mode 100644 index 0000000..0aba5b9 --- /dev/null +++ b/nametag8_CH592/user/hw/lightsense.c @@ -0,0 +1,8 @@ +/* + * lightsense.c + * + * Created on: Oct 13, 2024 + * Author: true + */ + + diff --git a/nametag8_CH592/user/hw/lightsense.h b/nametag8_CH592/user/hw/lightsense.h new file mode 100644 index 0000000..5c363b9 --- /dev/null +++ b/nametag8_CH592/user/hw/lightsense.h @@ -0,0 +1,13 @@ +/* + * lightsense.h + * + * Created on: Oct 13, 2024 + * Author: true + */ + +#ifndef USER_HW_LIGHTSENSE_H_ +#define USER_HW_LIGHTSENSE_H_ + + + +#endif /* USER_HW_LIGHTSENSE_H_ */ diff --git a/nametag8_CH592/user/hw/ssd1306.c b/nametag8_CH592/user/hw/ssd1306.c index da7edc1..3dccdec 100644 --- a/nametag8_CH592/user/hw/ssd1306.c +++ b/nametag8_CH592/user/hw/ssd1306.c @@ -1,8 +1,260 @@ /* * ssd1306.c - * - * Created on: Oct 11, 2024 - * Author: true + * begin 20190505 true + * modified 20241013 */ +#include "ssd1306.h" + +SSD1306 oled; +uint8_t oled_fb[((SSD1306_HEIGHT >> 3) * SSD1306_WIDTH) + 1]; + +uint8_t ssd1306_buf[8]; + +volatile uint8_t ssd1306_cb_pending; +volatile uint8_t ssd1306_cb_state; + + +const uint8_t ssd1306_cmd_init[] = { + 0x00, // command mode, all following bytes are command data +// 0xae, // display off + 0xd5, // set display clock div + 0x80, // suggested ratio + 0xa8, // set multiplex + 0x1f, // 128x32 (0x3f = 128x64) + 0xd3, // set display offset + 0x00, // none + 0x40, // set start line + 0x8d, // set charge pump + 0x14, // internal VCC + 0x20, // set memory addressing mode + 0x00, // horizontal mode + 0xa1, // segremap + 0xc8, // comscandec + 0xda, // set compins + 0x02, // + 0x81, // set contrast + 0xa0, // good default value + 0xd9, // set precharge + 0xf1, // internal vcc + 0xdb, // set vcomdeselect + 0x30, // + 0x2e, // disable scroll + 0xa6, // non-inverted display + 0xa4 // resume display operations +}; + +const uint8_t ssd1306_cmd_disp_window_def[] = { + SSD1306_MODE_CMD, + SSD1306_CMD_COLUMNADDR, // columns: 0 to (width - 1) + 0, + SSD1306_WIDTH - 1, + SSD1306_CMD_PAGEADDR, // pages (rows*8): 0 to ((height / 8) - 1) + 0, + (SSD1306_HEIGHT >> 3) - 1 +}; + + +void ssd1306_cb(uint8_t p) +{ + ssd1306_cb_pending = 1; + ssd1306_cb_state = p; +} + +uint8_t ssd1306_cb_get() +{ + uint8_t ret; + + ret = ssd1306_cb_pending; + ssd1306_cb_pending = 0; + + return ret; +} + + + +void ssd1306_idle_wait() +{ +/* + uint16_t timeout = 2000; + + while (!ssd1306_idle()) { + timeout--; + if (!timeout) { +#ifdef SSD1306_RESET_ON_COMM_FAIL + // todo: update reset source + // RSTSRC |= RSTSRC_SWRSF__SET; +#else + // well fuck. + // reboot the oled + shiftreg0_auxpwr(0); + shiftreg_update(); + timeout = 8000; + while (timeout--) { asm("nop"); } + shiftreg0_auxpwr(1); + shiftreg_update(); + + // and reset i2c bus (and eventually oled) + i2c_err_isr(0); +#endif + } + } +*/ +} + +/* + * sends a single command byte. + */ +void ssd1306_cmd(uint8_t cmd) +{ + uint8_t *buf = ssd1306_buf; + + *buf++ = SSD1306_MODE_CMD; + *buf++ = cmd; + + ssd1306_write(ssd1306_buf, 2, 0); + + ssd1306_idle_wait(); +} + +/* + * sets up the SSD1306. + * does not clear the screen, turn on the screen, or send data. + * you may want to use the callback for that. + */ +void ssd1306_init_step3() +{ + ssd1306_set_display(1); + oled.callback = 0; + oled.state = SSD1306_STATE_INITIALIZED | SSD1306_STATE_SET_PIXEL; +} +void ssd1306_init_step2() +{ + ssd1306_cls(&oled); + ssd1306_update(); + oled.callback = ssd1306_init_step3; +} +void ssd1306_init(uint8_t display_off_during_init) +{ + oled.width = SSD1306_WIDTH; + oled.height = SSD1306_HEIGHT; + oled.state = 0; + oled.mode = oled_fb; + oled.fb = oled_fb + 1; + + if (display_off_during_init) { + ssd1306_set_display(1); + } + + ssd1306_write(ssd1306_cmd_init, (sizeof(ssd1306_cmd_init)), ssd1306_cb); + + if (display_off_during_init) { + oled.callback = ssd1306_init_step2; + } else { + oled.callback = ssd1306_init_step3; + } +} + +void ssd1306_update() +{ + // reset our drawing window + ssd1306_write(ssd1306_cmd_disp_window_def, (sizeof(ssd1306_cmd_disp_window_def)), 0); + ssd1306_idle_wait(); + + // write our framebuffer + // since our i2c routine is state driven, and we let the state machine handle it, + // we can't just send some static data (in this case, first byte selecting mode) + // and then send our framebuffer. our display requires sending the comm mode + // byte first before receiving framebuffer data. so we waste a byte to do this... + // alternative would be to rewrite i2c routines to handle this... + *oled.mode = SSD1306_MODE_DATA; + ssd1306_write(oled.mode, ((oled.height >> 3) * oled.width) + 1, ssd1306_cb); +} + +void ssd1306_cls(SSD1306 *o) +{ + uint16_t len; + uint8_t *buf; + + len = ((o->height >> 3) * o->width); + buf = o->fb; + + while (len--) { + *buf++ = 0; + } +} + +void ssd1306_set_display(uint8_t display) +{ + uint8_t *buf = ssd1306_buf; + + *buf++ = SSD1306_MODE_CMD; + *buf++ = display ? SSD1306_CMD_DISPLAY_ON : SSD1306_CMD_DISPLAY_OFF; + + ssd1306_write(ssd1306_buf, 2, 0); + ssd1306_idle_wait(); +} + +void ssd1306_set_invert(uint8_t invert) +{ + uint8_t *buf = ssd1306_buf; + + *buf++ = SSD1306_MODE_CMD; + *buf++ = invert ? SSD1306_CMD_INVERT_ON : SSD1306_CMD_INVERT_OFF; + + ssd1306_write(ssd1306_buf, 2, 0); + ssd1306_idle_wait(); +} + +void ssd1306_set_contrast(uint8_t contrast) +{ + uint8_t *buf = ssd1306_buf; + + *buf++ = SSD1306_MODE_CMD; + *buf++ = SSD1306_CMD_CONTRAST; + *buf++ = contrast; + + ssd1306_write(ssd1306_buf, 3, 0); + ssd1306_idle_wait(); +} + +void ssd1306_set_flip(uint8_t flip) +{ + uint8_t *buf = ssd1306_buf; + + *buf++ = SSD1306_MODE_CMD; + *buf++ = flip ? SSD1306_CMD_COMSCANINC : SSD1306_CMD_COMSCANDEC; + + ssd1306_write(ssd1306_buf, 2, 0); + ssd1306_idle_wait(); + + if (flip) { + oled.state |= SSD1306_STATE_FLIP; + } else { + oled.state &= ~SSD1306_STATE_FLIP; + } +} + +void ssd1306_set_mirror(uint8_t mirror) +{ + uint8_t *buf = ssd1306_buf; + + *buf++ = SSD1306_MODE_CMD; + *buf++ = mirror ? SSD1306_CMD_SEGREMAP : SSD1306_CMD_SEGREMAP_MIRROR; + + ssd1306_write(ssd1306_buf, 2, 0); + ssd1306_idle_wait(); + + if (mirror) { + oled.state |= SSD1306_STATE_MIRROR; + } else { + oled.state &= ~SSD1306_STATE_MIRROR; + } +} + +void ssd1306_set_flipmirror(uint8_t flipm) +{ + ssd1306_set_flip(flipm); + ssd1306_set_mirror(flipm); +} diff --git a/nametag8_CH592/user/hw/ssd1306.h b/nametag8_CH592/user/hw/ssd1306.h index 13d5631..89e2330 100644 --- a/nametag8_CH592/user/hw/ssd1306.h +++ b/nametag8_CH592/user/hw/ssd1306.h @@ -1,8 +1,6 @@ /* - * ssd1306.h - * - * Created on: Oct 11, 2024 - * Author: true + * ssd1306.h 494 + * begin 20190505 true */ #ifndef USER_HW_SSD1306_H_ @@ -10,4 +8,102 @@ +#include + +#include "../comm/i2c.h" + + + +#define SSD1306_I2C_ADDR 0x3c +#define SSD1306_WIDTH 128 +#define SSD1306_HEIGHT 32 + +#define SSD1306_EXTERNALVCC 0x01 +#define SSD1306_SWITCHCAPVCC 0x02 + +#define SSD1306_MODE_CMD 0x00 +#define SSD1306_MODE_DATA 0x40 +#define SSD1306_MODE_SINGLE 0x80 + +#define SSD1306_CMD_CONTRAST 0x81 +#define SSD1306_CMD_DISPLAY_ALLON_OFF 0xA4 +#define SSD1306_CMD_DISPLAY_ALLON 0xA5 +#define SSD1306_CMD_INVERT_OFF 0xA6 +#define SSD1306_CMD_INVERT_ON 0xA7 +#define SSD1306_CMD_DISPLAY_OFF 0xAE +#define SSD1306_CMD_DISPLAY_ON 0xAF +#define SSD1306_CMD_DISPLAYOFFSET 0xD3 +#define SSD1306_CMD_SETCOMPINS 0xDA +#define SSD1306_CMD_SETVCOMDETECT 0xDB +#define SSD1306_CMD_DISPLAYCLOCKDIV 0xD5 +#define SSD1306_CMD_PRECHARGE 0xD9 +#define SSD1306_CMD_MULTIPLEX 0xA8 +#define SSD1306_CMD_LOWCOLUMN 0x00 +#define SSD1306_CMD_HIGHCOLUMN 0x10 +#define SSD1306_CMD_STARTLINE 0x40 +#define SSD1306_CMD_MEMORYMODE 0x20 +#define SSD1306_CMD_COLUMNADDR 0x21 +#define SSD1306_CMD_PAGEADDR 0x22 +#define SSD1306_CMD_COMSCANINC 0xC0 +#define SSD1306_CMD_COMSCANDEC 0xC8 +#define SSD1306_CMD_SEGREMAP 0xA0 +#define SSD1306_CMD_SEGREMAP_MIRROR 0xA1 +#define SSD1306_CMD_CHARGEPUMP 0x8D + + +#define SSD1306_STATE_INITIALIZED (1 << 0) +#define SSD1306_STATE_BUSY (1 << 1) +#define SSD1306_STATE_FLIP (1 << 2) +#define SSD1306_STATE_MIRROR (1 << 3) + +#define SSD1306_STATE_STR_HALFWIDTH (1 << 4) + +#define SSD1306_STATE_PIXEL_MASK (0xC0) +#define SSD1306_STATE_SET_PIXEL (1 << 6) +#define SSD1306_STATE_CLR_PIXEL (0) +#define SSD1306_STATE_INVERT_PIXEL (1 << 7) + + +typedef struct SSD1306 { + char state; + uint8_t width; + uint8_t height; + int8_t cursor_x; + int8_t cursor_y; + uint8_t *mode; + uint8_t *fb; + void (*callback)(); +} SSD1306; + + + +extern SSD1306 oled; +extern uint8_t oled_fb[((SSD1306_HEIGHT >> 3) * SSD1306_WIDTH) + 1]; + + + +#define ssd1306_write(dat, len, cb) i2c_addr(SSD1306_I2C_ADDR, 1); i2c_wrbuf(dat, len); if (cb) ssd1306_cb(0) +#define ssd1306_idle() 0 + + + +void ssd1306_idle_wait(); + +void ssd1306_cb(uint8_t p); // can be used to fake a callback event +uint8_t ssd1306_cb_get(); + +void ssd1306_init(uint8_t display_off_during_init); + +void ssd1306_update(); +void ssd1306_cls(SSD1306 *o); + +void ssd1306_set_display(uint8_t display); +void ssd1306_set_invert(uint8_t invert); +void ssd1306_set_contrast(uint8_t contrast); +void ssd1306_set_flip(uint8_t flip); +void ssd1306_set_mirror(uint8_t mirror); +void ssd1306_set_flipmirror(uint8_t flipm); + + + #endif /* USER_DEVICE_SSD1306_H_ */ diff --git a/nametag8_CH592/user/led/hsv2rgb.c b/nametag8_CH592/user/led/hsv2rgb.c new file mode 100644 index 0000000..14050d4 --- /dev/null +++ b/nametag8_CH592/user/led/hsv2rgb.c @@ -0,0 +1,134 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2016 B. Stultiens + * modified by true for 12-bit values + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "hsv2rgb.h" + + +void hsv2rgb_8b(uint16_t h, uint16_t s, uint16_t v, uint16_t *r, uint16_t *g , uint16_t *b) +{ + uint8_t sextant; + uint8_t bb; + uint16_t ww; + uint8_t h_fraction; + + if (!(s)) { + *(r) = *(g) = *(b) = (v); + return; + } + + sextant = h >> 8; + HSV_SEXTANT_TEST(sextant); // Optional: Limit hue sextants to defined space + + HSV_POINTER_SWAP(sextant, r, g, b); // Swap pointers depending which sextant we are in + + *g = v; // Top level + + // Perform actual calculations + /* + * Bottom level: v * (1.0 - s) + * --> (v * (255 - s) + error_corr) / 256 + */ + bb = ~s; + ww = v * bb; + ww += 1; // Error correction + ww += ww >> 8; // Error correction + *b = ww >> 8; + + h_fraction = h & 0xff; // 0...255 + + if(!(sextant & 1)) { + // *r = ...slope_up...; + /* + * Slope up: v * (1.0 - s * (1.0 - h)) + * --> (v * (255 - (s * (256 - h) + error_corr1) / 256) + error_corr2) / 256 + */ + ww = !h_fraction ? ((uint16_t)s << 8) : (s * (uint8_t)(-h_fraction)); + ww += ww >> 8; // Error correction 1 + bb = ww >> 8; + bb = ~bb; + ww = v * bb; + ww += v >> 1; // Error correction 2 + *r = ww >> 8; + } else { + // *r = ...slope_down...; + /* + * Slope down: v * (1.0 - s * h) + * --> (v * (255 - (s * h + error_corr1) / 256) + error_corr2) / 256 + */ + ww = s * h_fraction; + ww += ww >> 8; // Error correction 1 + bb = ww >> 8; + bb = ~bb; + ww = v * bb; + ww += v >> 1; // Error correction 2 + *r = ww >> 8; + + /* + * A perfect match for h_fraction == 0 implies: + * *r = (ww >> 8) + (h_fraction ? 0 : 1) + * However, this is an extra calculation that may not be required. + */ + } +} + +void hsv2rgb_32b(uint16_t h, uint16_t s, uint16_t v, uint16_t *r, uint16_t *g , uint16_t *b) +{ + HSV_MONOCHROMATIC_TEST(s, v, r, g, b); // Exit with grayscale if s == 0 + + uint8_t sextant = h >> 8; + + HSV_SEXTANT_TEST(sextant); // Optional: Limit hue sextants to defined space + + HSV_POINTER_SWAP(sextant, r, g, b); // Swap pointers depending which sextant we are in + + *g = v; // Top level + + /* + * Bottom level: v * (1.0 - s) + * --> (v * (255 - s) + error_corr + 1) / 256 + */ + uint16_t ww; // Intermediate result + ww = v * (255 - s); // We don't use ~s to prevent size-promotion side effects + ww += 1; // Error correction + ww += ww >> 8; // Error correction + *b = ww >> 8; + + uint8_t h_fraction = h & 0xff; // 0...255 + uint32_t d; // Intermediate result + + if(!(sextant & 1)) { + // *r = ...slope_up...; + d = v * (uint32_t)((255 << 8) - (uint16_t)(s * (256 - h_fraction))); + d += d >> 8; // Error correction + d += v; // Error correction + *r = d >> 16; + } else { + // *r = ...slope_down...; + d = v * (uint32_t)((255 << 8) - (uint16_t)(s * h_fraction)); + d += d >> 8; // Error correction + d += v; // Error correction + *r = d >> 16; + } +} diff --git a/nametag8_CH592/user/led/hsv2rgb.h b/nametag8_CH592/user/led/hsv2rgb.h new file mode 100644 index 0000000..cd333f7 --- /dev/null +++ b/nametag8_CH592/user/led/hsv2rgb.h @@ -0,0 +1,132 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2016 B. Stultiens + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ +#ifndef __INC_HSV2RGB_H__ +#define __INC_HSV2RGB_H__ + +#include + + +typedef struct color_rgb { + uint16_t r; + uint16_t g; + uint16_t b; +} color_rgb; + +typedef struct color_hsv { + uint16_t h; + uint16_t s; + uint16_t v; +} color_hsv; + + +#define HSV2RGB_BITS 8 // 10 +#define HSV2RGB_COUNT ((1 < HSV2RGB_BITS)-1) + +#define HSV_HUE_SEXTANT (1 << HSV2RGB_BITS) +#define HSV_HUE_STEPS (6 * HSV_HUE_SEXTANT) + +#define HSV_HUE_MIN 0 +#define HSV_HUE_MAX (HSV_HUE_STEPS - 1) +#define HSV_SAT_MIN 0 +#define HSV_SAT_MAX 255 +#define HSV_VAL_MIN 0 +#define HSV_VAL_MAX 255 + +/* Options: */ +#define HSV_USE_SEXTANT_TEST /* Limit the hue to 0...360 degrees */ + +#define hsv2rgb(h,s,v,r,g,b) hsv2rgb_32b(h,s,v,r,g,b) + + +void hsv2rgb_8b(uint16_t h, uint16_t s, uint16_t v, uint16_t *r, uint16_t *g , uint16_t *b); +void hsv2rgb_32b(uint16_t h, uint16_t s, uint16_t v, uint16_t *r, uint16_t *g , uint16_t *b); + + +/* + * Macros that are common to all implementations + */ +#ifdef HSV_USE_SEXTANT_TEST +#define HSV_SEXTANT_TEST(sextant) \ + if((sextant) > 5) { \ + (sextant) = 5; \ + } + +#else +#define HSV_SEXTANT_TEST(sextant) +#endif + +/* + * Pointer swapping: + * sext. r g b r<>b g<>b r <> g result + * 0 0 0 v u c !u v c u v c + * 0 0 1 d v c d v c + * 0 1 0 c v u u v c u v c + * 0 1 1 c d v v d c d v c d v c + * 1 0 0 u c v u v c u v c + * 1 0 1 v c d v d c d v c d v c + * + * if(sextant & 2) + * r <-> b + * + * if(sextant & 4) + * g <-> b + * + * if(!(sextant & 6) { + * if(!(sextant & 1)) + * r <-> g + * } else { + * if(sextant & 1) + * r <-> g + * } + */ +#define HSV_SWAPPTR(a,b) do { uint16_t *tmp = (a); (a) = (b); (b) = tmp; } while(0) +#define HSV_POINTER_SWAP(sextant,r,g,b) \ + do { \ + if((sextant) & 2) { \ + HSV_SWAPPTR((r), (b)); \ + } \ + if((sextant) & 4) { \ + HSV_SWAPPTR((g), (b)); \ + } \ + if(!((sextant) & 6)) { \ + if(!((sextant) & 1)) { \ + HSV_SWAPPTR((r), (g)); \ + } \ + } else { \ + if((sextant) & 1) { \ + HSV_SWAPPTR((r), (g)); \ + } \ + } \ + } while(0) +#define HSV_MONOCHROMATIC_TEST(s,v,r,g,b) \ + do { \ + if(!(s)) { \ + *(r) = *(g) = *(b) = (v); \ + return; \ + } \ + } while(0) + + + +#endif diff --git a/nametag8_CH592/user/led/rgbled.h b/nametag8_CH592/user/led/rgbled.h index 4f9857f..bc741d1 100644 --- a/nametag8_CH592/user/led/rgbled.h +++ b/nametag8_CH592/user/led/rgbled.h @@ -12,14 +12,37 @@ #include +#include "hsv2rgb.h" + #include "../comm/i2c.h" #include "../hw/ch32sub.h" +#define RGB_EDGE_COUNT 10 + + + +typedef struct LedProgram { + char *name; + void (*prog)(uint8_t *, uint16_t); +} LedProgram; + + + +extern const uint8_t edge_map[10]; +extern const LedProgram edge_pgm[6]; + +extern color_hsv hsv_edge[RGB_EDGE_COUNT]; + + + void rgbled_init(); +void rgb_edge_update(uint8_t idx); + #endif /* USER_LED_RGBLED_H_ */ + diff --git a/nametag8_CH592/user/led/rgbled_edge.c b/nametag8_CH592/user/led/rgbled_edge.c new file mode 100644 index 0000000..20c8fc1 --- /dev/null +++ b/nametag8_CH592/user/led/rgbled_edge.c @@ -0,0 +1,700 @@ +/* + * $Id: rgbled_edge.c 500 2021-08-08 19:43:38Z true $ + * begin 20210720 true + * + * programs to run to show neat shit on the LEDs + * programs may be duplicated with minimal changes between eyes and edge + * this is fine right now - we have the space + * note also that some programs may change once the LEDs run at higher bit depth + * + * programs I'd like to get done: + * - anything involving gravity, and using accelerometer + * - things that will do color fades between colors; quickest hack would be implementing rgb2hsv + */ + + +#include "rgbled.h" + +#include "hw/lis2dw.h" + +#include "../misc/intscale.h" +#include "../misc/sin7.h" +#include "../misc/tinymt.h" + +#include "user_config.h" + + +const uint8_t edge_map[10] = {3, 5, 7, 9, 0, 2, 4, 6, 8, 1}; + + +static uint8_t timeout; + + + +void edge_solid(uint8_t *a, uint16_t tick) +{ + // 1=bitfield, 2=timeout-set, 4=state, 5=hue, 6=sat, 7=val + // bitfield: + // 7: blank / off + // 3: override altcolor (if bit 1 is not set) + // 1: override hsv + // 0: flash + + int i; + color_hsv hsv = {0, 0, 0}; + + // timeout + if (!timeout || (timeout > a[2])) { + timeout = a[2]; + } else { + timeout--; + return; + } + + if (a[1] & 0x80) { + // override off + hsv.v = 0; + } else { + // color select + if (a[1] & 0x02) { + hsv.h = a[5] * 6; + hsv.s = a[6]; + hsv.v = a[7]; + } else if (a[1] & 0x08) { + hsv.h = uconf.altcolor_hue * 6; + hsv.s = uconf.altcolor_sat; + hsv.v = uconf.altcolor_val; + } else { + hsv.h = uconf.favcolor_hue * 6; + hsv.s = uconf.favcolor_sat; + hsv.v = uconf.favcolor_val; + } + + // flash + if (a[1] & 0x01) { + a[4] ^= 0x01; + if (a[4] & 0x01) hsv.v = 0; + } + } + + // update + hsv_edge[0].h = hsv.h; + hsv_edge[0].s = hsv.s; + hsv_edge[0].v = hsv.v; + + for (i = 1; i < RGB_EDGE_COUNT; i++) { + hsv_edge[i].h = hsv_edge[0].h; + hsv_edge[i].s = hsv_edge[0].s; + hsv_edge[i].v = hsv_edge[0].v; + } +} + +// todo: improve fading smoothness by doing fadeout every callback instead of on timeout +// this can be done once LED bit depth is increased +void edge_flicker(uint8_t *a, uint16_t tick) +{ + // 0=speed, 1=bitfield, 2=timeout-set, 4=state, 6=max-val, 7=min-val + // bitfield: + // 7: min-val is not half range (0-255); if unset min-val is half range (128-255) + // 6: apply a random hue instead of favcolor + // 5: do not apply LED remapping (results in a cross update pattern) + // 4: fades out all LEDs at speed setting (only if bit 1 SET) + // 3: same flicker throughout (only if bit 1 NOT SET) + // 2: make the LED random instead of sequential (only if bit 1 SET) + // 1: only process one LED per update + // 0: in single LED mode, reverse direction + // speed: fadeout speed + + int i; + uint16_t new_val; + uint8_t min, max; + + // timeout + if (!timeout || (timeout > a[2])) { + timeout = a[2]; + } else { + timeout--; + return; + } + + // set constants + hsv_edge[0].h = uconf.favcolor_hue * 6; + hsv_edge[0].s = uconf.favcolor_sat; + + if (a[6]) max = a[6]; else max = 255; + + // set value limit + if (a[1] & 0x80) { + min = a[7]; + } else { + min = (a[7] >> 1) | 0x80; + } + + // process and update LEDs + for (i = 0; i < RGB_EDGE_COUNT; i++) { + // compute new val on first round or if all-same flicker is disabled + if (!(a[1] & 0x08) || i == 0) { + new_val = u16_scale((prng_get16() & 0xff), 0, 255, min, max); + new_val = (uconf.favcolor_val * new_val) / 256; + } + + // only doing one LED? + if (a[1] & 0x02) { + // is it random? + if (a[1] & 0x04) { + i = prng_get16() % RGB_EDGE_COUNT; + } else { + // nope, sequential + a[4]++; + a[4] %= RGB_EDGE_COUNT; + i = a[4] % RGB_EDGE_COUNT; + + // is it in reverse? + if (a[1] & 0x01) { + i = RGB_EDGE_COUNT - 1 - i; + } + + // correct position + if (!(a[1] & 0x20)) { + i = edge_map[i]; + } + } + } + + // apply + hsv_edge[i].h = (a[1] & 0x40) ? (prng_get16() & 0x600) : hsv_edge[0].h; + hsv_edge[i].s = hsv_edge[0].s; + hsv_edge[i].v = new_val & 0xff; + + // bail if only doing one LED + if (a[1] & 0x02) { + // but make sure to fade LEDs if needed + if (a[1] & 0x10) { + for (i = 0; i < RGB_EDGE_COUNT; i++) { + if (hsv_edge[i].v <= a[0]) { + hsv_edge[i].v = 0; + } else { + hsv_edge[i].v -= a[0]; + } + } + } + return; + } + } +} + +uint8_t edge_circles_divider = 0; +uint8_t edge_circles_sec_ticks = 0; +void edge_circles(uint8_t *a, uint16_t tick) +{ + // 0=speed, 1=bitfield, 2=timeout-set, 4=state, 5=hue, 6=sat, 7=val + // bitfield: + // 7: apply specified hue instead of favcolor + // 6: apply a random hue + // 5: trails desaturate + // 4: secondary value is half of primary + // 3: opposing is same hue as primary (unset is alt color hue/sat; is always primary val) + // 2: enable opposing ball + // 1: enable fading trails + // 0: direction + // others: + // a[0][7:4]: fade rate of trails + // a[0][0:3]: how many ticks until extra increment on secondary; 0 disables, 0xf sets opposing + + int i; + uint16_t h, h2; + uint8_t s, v; + uint8_t x, y; + uint8_t s2; + + uint8_t trailfade = a[0] >> 4; + uint8_t desatfade = a[1] & 0x20; + + // fading + edge_circles_divider++; + edge_circles_divider %= 10; + if (!edge_circles_divider && (a[1] & 0x02)) { + for (i = 0; i < RGB_EDGE_COUNT; i++) { + if (hsv_edge[i].v <= trailfade) { + hsv_edge[i].v = 0; + } else { + hsv_edge[i].v -= trailfade; + } + + if (desatfade) { + // fade to white too + if (hsv_edge[i].s <= (trailfade >> 1)) { + hsv_edge[i].s = 0; + } else { + hsv_edge[i].s -= (trailfade >> 1); + } + } + } + } + + // timeout + if (!timeout || (timeout > a[2])) { + timeout = a[2]; + } else { + timeout--; + return; + } + + uint8_t srate = a[0] & 0x0f; + uint8_t dir = a[1] & 0x01; + uint8_t trail = a[1] & 0x02; + uint8_t second = a[1] & 0x04; + uint8_t scolor = a[1] & 0x08; + uint8_t secval = a[1] & 0x10; + uint8_t rndhue = a[1] & 0x40; + uint8_t sethue = a[1] & 0x80; + + + // state + x = (a[4] & 0xf) + 1; + x %= 10; + + y = (a[4] >> 4) + 9; + + if (second) { + if (srate == 0xf) { + // opposing mode + y = x + 5; + y %= 10; + } else if (srate) { + // gradual offset mode + srate <<= 2; + edge_circles_sec_ticks++; + if (edge_circles_sec_ticks > srate) { + edge_circles_sec_ticks = 0; + y += 9; + } + } + } + + y %= 10; + + // save state + a[4] = (y << 4) | x; + + // apply direction and secondary + if (dir) { + x = 9 - x; + y = 9 - y; + } + + // colors + s = s2 = a[6]; + v = a[7]; + + h2 = uconf.altcolor_hue * 6; + + if (sethue) { + h = a[5] * 6; + } else if (rndhue) { + h = prng_get16() & 0x5ff; + } else { + h = uconf.favcolor_hue * 6; + s = uconf.favcolor_sat; + v = uconf.favcolor_val; + s2 = uconf.altcolor_sat; + } + + // secondary + if (scolor) { + h2 = h; + s2 = s; + } + + // set the next item + hsv_edge[edge_map[x]].h = h; + hsv_edge[edge_map[x]].s = s; + hsv_edge[edge_map[x]].v = v; + + if (second && x != y) { + if (secval) v >>= 1; + + hsv_edge[edge_map[y]].h = h2; + hsv_edge[edge_map[y]].s = s2; + hsv_edge[edge_map[y]].v = v; + } + + // clear those that are on if trails are not enabled + if (!trail) { + for (i = 0; i < RGB_EDGE_COUNT; i++) { + if (i != x || (second && (i != y))) { + hsv_edge[edge_map[i]].v = 0; + } + } + } +} + +uint8_t edge_waving_divider = 0; +void edge_waving(uint8_t *a, uint16_t tick) +{ + // 0=wait-delay, 1=bitfield, 2=timeout-set, 456=work + // bitfield: + // 5 trails desaturate + // 1 enable fading trails + // others: + // a[0][7:4]: fade rate of trails + // a[0][0:3]: movement rate of up-down (stall) + + int i; + + uint8_t trailfade = a[0] >> 4; + uint8_t desatfade = a[1] & 0x20; + + edge_waving_divider++; + edge_waving_divider %= 10; + if (!edge_waving_divider && (a[1] & 0x02)) { + for (i = 0; i < RGB_EDGE_COUNT; i++) { + if (hsv_edge[i].v <= trailfade) { + hsv_edge[i].v = 0; + } else { + hsv_edge[i].v -= trailfade; + } + + if (desatfade) { + // fade to white too + if (hsv_edge[i].s <= (trailfade >> 1)) { + hsv_edge[i].s = 0; + } else { + hsv_edge[i].s -= (trailfade >> 1); + } + } + } + } + + uint8_t stall = a[0] & 0x0f; + + // timeout + if (!timeout || (timeout > a[2])) { + timeout = a[2]; + } else { + timeout--; + return; + } + + // fix + if (a[4] > 3) a[4] = 0; + if (a[5]) a[5]--; + + // clear values if trails not enabled + if (!(a[1] & 0x02)) { + for (i = 0; i < RGB_EDGE_COUNT; i++) { + hsv_edge[i].v = 0; + } + } + + switch (a[4]) { + case 0: + case 2: { // waiting state + if (!a[5]) { + // next step + a[6] = 0; + a[4]++; + } + break; + } + case 1: { // moving down + hsv_edge[edge_map[ a[6]]].h = uconf.favcolor_hue * 6; + hsv_edge[edge_map[ a[6]]].s = uconf.favcolor_sat; + hsv_edge[edge_map[ a[6]]].v = uconf.favcolor_val; + + hsv_edge[edge_map[9 - a[6]]].h = uconf.favcolor_hue * 6; + hsv_edge[edge_map[9 - a[6]]].s = uconf.favcolor_sat; + hsv_edge[edge_map[9 - a[6]]].v = uconf.favcolor_val; + + a[6]++; + if (a[6] >= 5) { + a[5] = stall; + a[4]++; + break; + } + + break; + } + case 3: { // moving up + hsv_edge[edge_map[4 - a[6]]].h = uconf.favcolor_hue * 6; + hsv_edge[edge_map[4 - a[6]]].s = uconf.favcolor_sat; + hsv_edge[edge_map[4 - a[6]]].v = uconf.favcolor_val; + + hsv_edge[edge_map[5 + a[6]]].h = uconf.favcolor_hue * 6; + hsv_edge[edge_map[5 + a[6]]].s = uconf.favcolor_sat; + hsv_edge[edge_map[5 + a[6]]].v = uconf.favcolor_val; + + a[6]++; + if (a[6] >= 5) { + a[5] = stall; + a[4]++; + break; + } + + break; + } + } +} + +void edge_rainbow(uint8_t *a, uint16_t tick) +{ + // 0=angle-rate, 1=bitfield, 2=timeout-set, 45=angle-work, 6=sat, 7=val + // bitfield: + // 7:4 hue angle division (360 divided by 1-6; all other values mean 1, except 0 which means no offset) + // 3 + // 2 + // 1 + // 0 direction + + uint16_t *rb_angle = (uint16_t *)&a[4]; + uint16_t angle; + uint16_t hoffset; + int i; + int r; + + // timeout + if (!timeout || (timeout > a[2])) { + timeout = a[2]; + } else { + timeout--; + return; + } + + // rainbow hue angle increment + // todo: in single mode, decrement instead if direction bit set + *rb_angle += (a[0]); + if (*rb_angle >= 0x600) *rb_angle -= 0x600; + angle = *rb_angle; + + // hue offset + switch (a[1] >> 4) { + case 0: { hoffset = 0; break; } // time stands still + case 2: { hoffset = 0x4d; break; } // 0xa * 0x4d * 2 = 0x604 + case 3: { hoffset = 0x33; break; } // 0xa * 0x33 * 3 = 0x5fa + case 4: { hoffset = 0x26; break; } // 0xa * 0x26 * 4 = 0x5f0 + case 5: { hoffset = 0x1f; break; } // 0xa * 0x1f * 5 = 0x60e + case 6: { hoffset = 0x1a; break; } // 0xa * 0x1a * 6 = 0x618 + default: { hoffset = 0x9a; break; } // 0xa * 0x9a * 1 = 0x604 + } + + // apply to LEDs + for (i = 0; i < RGB_EDGE_COUNT; i++) { + r = (a[1] & 0x01) ? i : RGB_EDGE_COUNT - 1 - i; + hsv_edge[edge_map[r]].h = angle; + hsv_edge[edge_map[r]].s = a[6]; + hsv_edge[edge_map[r]].v = a[7]; + + angle += hoffset; + if (angle >= 0x600) angle -= 0x600; + } +} + +void edge_copmode(uint8_t *a, uint16_t tick) +{ + // 0=work, 1=bitfield, 2=timeout-set, 3=timeout-work, 4=work, 56=steps, 7=val + // bitfield: + // 7 sync to tick 0 + // 6 skip pattern 2 + // 5 skip pattern 1 + // 4 don't override sat/val to maximums (not implemented) + // 3 use different colors on either half during pattern 2 + // 2 use different colors on either half during pattern 1 + // 1 repeat subpattern 1 + // 0 use cop colors instead of pri/alt + // others: + // a[5][7:4] amount of time to delay in pattern 2 + // a[5][0:3] amount of times to repeat pattern 2 (solid color alternate) + // a[6][7:4] amount of strobe pulses in pattern 1 + // a[6][0:3] amount of times to repeat pattern 1 (strobes) + + int i; + + uint8_t pattern, iter; + uint8_t *seq; + uint8_t w, x; + uint8_t b; + + uint8_t cnt[4]; + + color_hsv hsv; + color_hsv hsv2; + color_hsv pri, sec; + + // synchronize + if (a[1] & 0x80) { + if (!tick) { + a[3] = 0; + a[1] &= ~0x80; + } else { + return; + } + } + + // timeout + if (!timeout || (timeout > a[2])) { + timeout = a[2]; + } else { + timeout--; + return; + } + + // colors to use + if (a[1] & 0x01) { + pri.h = 0x000; + pri.s = 0xff; + sec.h = 0x400; + sec.s = 0xff; + } else { + pri.h = uconf.favcolor_hue * 6; + pri.s = uconf.favcolor_sat; + sec.h = uconf.altcolor_hue * 6; + sec.s = uconf.altcolor_sat; + } + + // pattern mode + pattern = a[0] >> 6; + iter = a[0] & 0x3f; + seq = &a[4]; + + cnt[0] = a[6] & 0xf; + cnt[1] = a[6] >> 4; + cnt[2] = a[5] & 0xf; + cnt[3] = a[5] >> 4; + + if ((pattern == 0) && (a[1] & 0x20)) pattern++; + if ((pattern == 1) && (a[1] & 0x40)) pattern++; + + if (pattern > 1) pattern = 0; + + switch (pattern) { + // strobe + case 0: { + w = cnt[1] << 1; + if (!w) w = 32; + b = (a[1] & 0x02) ? 0x02 : 0x01; + x = cnt[0]; + if (!x) x = 16; + x <<= b; + + // set main color + hsv.h = (iter & b) ? sec.h : pri.h; + hsv.s = (iter & b) ? sec.s : pri.s; + hsv.v = 0; + + // p1 alternate color mode + if (a[1] & 0x04) { + hsv2.h = (iter & b) ? pri.h : sec.h; + hsv2.s = (iter & b) ? pri.s : sec.s; + } else { + hsv2.h = hsv.h; + hsv2.s = hsv.s; + } + + // set value if on + if ((*seq < w) && !(*seq & 1)) { + hsv.v = a[7]; + } + + if (*seq > w) { + // iteration done + iter++; + *seq = 0; + if (iter >= x) { + // pattern done + pattern++; + iter = 0; + } + + break; + } + + (*seq)++; + break; + } + + // solid alternate + case 1: { + w = cnt[3] << 1; + if (!w) w = 32; + x = cnt[2] << 1; + if (!x) x = 32; + + // set main color + hsv.h = (iter & 1) ? sec.h : pri.h; + hsv.s = (iter & 1) ? sec.s : pri.s; + hsv.v = 0; + + // p2 alternate color mode + if (a[1] & 0x08) { + hsv2.h = (iter & 1) ? pri.h : sec.h; + hsv2.s = (iter & 1) ? pri.s : sec.s; + } else { + hsv2.h = hsv.h; + hsv2.s = hsv.s; + } + + // set value + hsv.v = a[7]; + + if (*seq > w) { + // iteration done + iter++; + *seq = 0; + if (iter >= x) { + // pattern done + pattern++; + iter = 0; + } + + break; + } + + (*seq)++; + break; + } + } + + // we only have two patterns + pattern %= 2; + + // save state + a[0] = (pattern << 6) | (iter & 0x3f); + + // apply to LEDs + w = RGB_EDGE_COUNT/2; + for (i = 0; i < w; i++) { + hsv_edge[edge_map[i]].h = hsv.h; + hsv_edge[edge_map[i]].s = hsv.s; + hsv_edge[edge_map[i]].v = hsv.v; + + hsv_edge[edge_map[i+w]].h = hsv2.h; + hsv_edge[edge_map[i+w]].s = hsv2.s; + hsv_edge[edge_map[i+w]].v = hsv.v; + } +} + +void edge_fade_from_center(uint8_t *a, uint16_t tick) +{ + +} + +void edge_staticbar(uint8_t *a, uint16_t tick) +{ + +} + +void edge_gravitycheck(uint8_t *a, uint16_t tick) +{ + +} + + +// implemented program table +const LedProgram edge_pgm[6] = { + {"Solid Color", edge_solid}, + {"Flicker", edge_flicker}, + {"Circles", edge_circles}, + {"Waving", edge_waving}, + {"Rainbow", edge_rainbow}, + {"Cop Mode", edge_copmode}, +}; diff --git a/nametag8_CH592/user/main.c b/nametag8_CH592/user/main.c index e88411f..22a4a33 100644 --- a/nametag8_CH592/user/main.c +++ b/nametag8_CH592/user/main.c @@ -4,6 +4,13 @@ * main MCU firmware * 2024 true * + * much of this code is copied from true's DC29 Whiskey Pirates badge, + * which was in turn copied from the original GAT Nametag. + * + * The GAT Nametag used an 8-bit 8051 core MCU. + * DC29 minibadge used a RISC-V core, and code was hastily ported. + * this is why things like the menu system are so convoluted; + * * the main MCU is responsible for the following: * - rendering OLED UI * - rendering LED programs @@ -40,7 +47,7 @@ int main() { // configure clock ch59x_xtal_conf(); - SetSysClock(CLK_SOURCE_HSE_16MHz); + SetSysClock(CLK_SOURCE_PLL_32MHz); // enable DC-DC converter; brings significant power saving PWR_DCDCCfg(ENABLE); @@ -48,6 +55,9 @@ int main() // get i2c up and running i2c_init(); + // decrease clock speed when not using i2c + SetSysClock(CLK_SOURCE_HSE_16MHz); + // configure port-based interrupts (used for chsub interrupt, mainly) port_intr_init(); diff --git a/nametag8_CH592/user/misc/accel.c b/nametag8_CH592/user/misc/accel.c index d2daa2d..6ce56bc 100644 --- a/nametag8_CH592/user/misc/accel.c +++ b/nametag8_CH592/user/misc/accel.c @@ -5,4 +5,24 @@ * Author: true */ +#include "accel.h" + + +AccelData accel; +AccelData accel_last[4]; +AccelData accel_smoothing; + +int16_t movement; + + + +int8_t accel_get_rotation() +{ + return 0; +} + +int16_t accel_get_movement() +{ + return movement; +} diff --git a/nametag8_CH592/user/misc/accel.h b/nametag8_CH592/user/misc/accel.h index 450f9c9..2f6612f 100644 --- a/nametag8_CH592/user/misc/accel.h +++ b/nametag8_CH592/user/misc/accel.h @@ -9,5 +9,26 @@ #define USER_MISC_ACCEL_H_ +#include + + + +typedef struct AccelData { + int16_t x; + int16_t y; + int16_t z; +} AccelData; + + + +extern AccelData accel; +extern uint16_t movement_worst; + + + +int8_t accel_get_rotation(); +int16_t accel_get_movement(); + + #endif /* USER_MISC_ACCEL_H_ */ diff --git a/nametag8_CH592/user/misc/checksum.c b/nametag8_CH592/user/misc/checksum.c new file mode 100644 index 0000000..5f573d4 --- /dev/null +++ b/nametag8_CH592/user/misc/checksum.c @@ -0,0 +1,27 @@ +/* + * checksum.c + * begin 20190612 true + * + * nothing special, good enough, untested, no warranty, gfy, etc + */ + + +#include + + +uint16_t checksum_gen(uint8_t *dat, uint16_t len) +{ + uint16_t r = 0; + + while (len) { + r += *dat++; + len--; + } + + return r; +} + +uint16_t checksum_verify(uint8_t *dat, uint16_t len, uint16_t checksum) +{ + return (checksum_gen(dat, len) == checksum) ? 1 : 0; +} diff --git a/nametag8_CH592/user/misc/checksum.h b/nametag8_CH592/user/misc/checksum.h new file mode 100644 index 0000000..9300dc1 --- /dev/null +++ b/nametag8_CH592/user/misc/checksum.h @@ -0,0 +1,22 @@ +/* + * checksum.h + * begin 20190612 true + * + * nothing special, good enough + */ + +#ifndef INC_MISC_CHECKSUM_H_ +#define INC_MISC_CHECKSUM_H_ + + + +#include + + + +uint16_t checksum_gen(uint8_t *dat, uint16_t len); +uint16_t checksum_verify(uint8_t *dat, uint16_t len, uint16_t checksum); + + + +#endif /* INC_MATH_CHECKSUM_H_ */ diff --git a/nametag8_CH592/user/misc/i8atan2.c b/nametag8_CH592/user/misc/i8atan2.c new file mode 100644 index 0000000..da4e696 --- /dev/null +++ b/nametag8_CH592/user/misc/i8atan2.c @@ -0,0 +1,50 @@ +/* + * i8atan2.c + * begin 20190611 true + * + * copied and fixed up from teh internets + */ + + +#include + + +static int8_t iat2(int8_t y, int8_t x) +{ + return ((y * 32 + (x / 2)) / x) * 2; +} + +int8_t i8atan2(int8_t y, int8_t x) +{ + // determine octant + if (y >= 0) { // oct 0,1,2,3 + if (x >= 0) { // oct 0,1 + if (x > y) { + return iat2(-y, -x) / 2 + (0 * 32); + } else { + if (y == 0) return 0; // (x=0,y=0) + return -iat2(-x, -y) / 2 + (2 * 32); + } + } else { // oct 2,3 + if (x >= -y) { + return iat2(x, -y) / 2 + (2 * 32); + } else { + return -iat2(-y, x) / 2 + (4 * 32); + } + } + } else { // oct 4,5,6,7 + if (x < 0) { // oct 4,5 + if (x < y) { + return iat2(y, x) / 2 + (-4 * 32); + } else { + return -iat2(x, y) / 2 + (-2 * 32); + } + } else { // oct 6,7 + if (-x >= y) { + return iat2(-x, y) / 2 + (-2 * 32); + } else { + return -iat2(y, -x) / 2 + (-0 * 32); + } + } + } +} diff --git a/nametag8_CH592/user/misc/i8atan2.h b/nametag8_CH592/user/misc/i8atan2.h new file mode 100644 index 0000000..27cb789 --- /dev/null +++ b/nametag8_CH592/user/misc/i8atan2.h @@ -0,0 +1,21 @@ +/* + * i8atan2.h + * begin 20190611 true + * + * copied and fixed up from teh internets + */ + +#ifndef INC_I8ATAN2_H_ +#define INC_I8ATAN2_H_ + + + +#include + + + +int8_t i8atan2(int8_t y, int8_t x); + + + +#endif /* INC_I8ATAN2_H_ */ diff --git a/nametag8_CH592/user/misc/intscale.c b/nametag8_CH592/user/misc/intscale.c new file mode 100644 index 0000000..0e97c66 --- /dev/null +++ b/nametag8_CH592/user/misc/intscale.c @@ -0,0 +1,6 @@ +#include + +uint16_t u16_scale(uint16_t in, uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) +{ + return (((in - x1) * (y2 - x2)) / (y1 - x1)) + x2; +} diff --git a/nametag8_CH592/user/misc/intscale.h b/nametag8_CH592/user/misc/intscale.h new file mode 100644 index 0000000..738125a --- /dev/null +++ b/nametag8_CH592/user/misc/intscale.h @@ -0,0 +1,10 @@ +#ifndef INC_MISC_INTSCALE_H_ +#define INC_MISC_INTSCALE_H_ + + + +uint16_t u16_scale(uint16_t in, uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2); + + + +#endif diff --git a/nametag8_CH592/user/misc/sin7.c b/nametag8_CH592/user/misc/sin7.c new file mode 100644 index 0000000..d2a837a --- /dev/null +++ b/nametag8_CH592/user/misc/sin7.c @@ -0,0 +1,108 @@ +/** + * Example for a sine/cosine table lookup + * + * butchered by true to work in 7 bits (int8_t, two turns), and to fix cos8 function + * copied / inspired more or less from + * https://www.atwillys.de/content/cc/sine-lookup-for-embedded-in-c/ + **/ + +#include "sin7.h" + +/* + * The number of bits of our data type: here 8 (sizeof operator returns bytes). + */ +#define INT8_BITS (8 * sizeof(int8_t)) +#ifndef INT8_MAX +#define INT8_MAX ((1<<(INT8_BITS-1))-1) +#endif + +/* + * "5 bit" large table = 32 values. The mask: all bit belonging to the table + * are 1, the all above 0. + */ +#define TABLE_BITS (5) +#define TABLE_SIZE (1<> INTERP_BITS); + + if (v0 & FLIP_BIT) { + v0 = ~v0; + v1 = ~angle; + } else { + v1 = angle; + } + + v0 &= TABLE_MASK; + + v1 = sin90[v0] + (int8_t)(((int16_t)(sin90[v0+1]-sin90[v0]) * (v1 & INTERP_MASK)) >> INTERP_BITS); + + if((angle >> INTERP_BITS) & NEGATE_BIT) { + v1 = -v1; + } + + return v1; +} + +/** + * Cosine calculation using interpolated table lookup. + * Instead of radians or degrees we use "turns" here. Means this + * cosine does NOT return one phase for 0 to 2*PI, but for 0 to 1. + * Input: -1 to 1 as int8 == -128 to 127 + * Output: -1 to 1 as int8 == -128 to 127 + * + * @param int8_t angle + * @return int8_t + */ +int8_t cos7(int8_t angle) +{ + if (angle < 0) { + angle += INT8_MAX; + angle += 1; + } + + return sin7(angle - ((INT8_MAX * 3) / 4)); +} diff --git a/nametag8_CH592/user/misc/sin7.h b/nametag8_CH592/user/misc/sin7.h new file mode 100644 index 0000000..6ec4e67 --- /dev/null +++ b/nametag8_CH592/user/misc/sin7.h @@ -0,0 +1,43 @@ +/** + * Example for a interpolated sine/cosine table lookup + * + * modified by true to work in 8 bits, and to fix cos7 function + * + */ + +#ifndef INC_SIN7_H_ +#define INC_SIN7_H_ + + + +#include + + + +/** + * Sine calculation using interpolated table lookup. + * Instead of radians or degrees we use "turns" here. Means this + * sine does NOT return one phase for 0 to 2*PI, but for 0 to 1. + * Input: -1 to 1 as int8 "Q7" == -128 to 127. + * Output: -1 to 1 as int8 "Q7" == -128 to 127. + * + * @param int8_t angle Q7 + * @return int8_t Q7 + */ +int8_t sin7(int8_t angle); + +/** + * Cosine calculation using interpolated table lookup. + * Instead of radians or degrees we use "turns" here. Means this + * cosine does NOT return one phase for 0 to 2*PI, but for 0 to 1. + * Input: -1 to 1 as int8 "Q7" == -128 to 127. + * Output: -1 to 1 as int8 "Q7" == -128 to 127. + * + * @param int8_t angle Q7 + * @return int8_t Q7 + */ +int8_t cos7(int8_t angle); + + + +#endif /* INC_MATH_SIN7_H_ */ diff --git a/nametag8_CH592/user/misc/tinymt.c b/nametag8_CH592/user/misc/tinymt.c new file mode 100644 index 0000000..ca1937d --- /dev/null +++ b/nametag8_CH592/user/misc/tinymt.c @@ -0,0 +1,162 @@ +/** + * Tiny Mersenne Twister: only 127-bit internal state. + * Derived from the reference implementation version 1.1 (2015/04/24) + * by Mutsuo Saito (Hiroshima University) and Makoto Matsumoto + * (Hiroshima University). + */ +#include +#include "tinymt.h" + + + +static void tinymt32_next_state(tinymt32_t *s); +static uint32_t tinymt32_temper(tinymt32_t *s); + + + +tinymt32_t tinymt32_s; + + + +/** + * Parameter set to use for this IETF specification. Don't change. + * This parameter set is the first entry of the precalculated + * parameter sets in tinymt32dc/tinymt32dc.0.1048576.txt by + * Kenji Rikitake, available at: + * https://github.com/jj1bdx/tinymtdc-longbatch/. + * It is also the parameter set used in: + * Rikitake, K., "TinyMT pseudo random number generator for + * Erlang", Proceedings of the 11th ACM SIGPLAN Erlang Workshop, + * September 2012. + */ +const uint32_t TINYMT32_MAT1_PARAM = UINT32_C(0x8f7011ee); +const uint32_t TINYMT32_MAT2_PARAM = UINT32_C(0xfc78ff1f); +const uint32_t TINYMT32_TMAT_PARAM = UINT32_C(0x3793fdff); + +/** + * This function initializes the internal state array with a + * 32-bit unsigned integer seed. + * @param s pointer to tinymt internal state. + * @param seed a 32-bit unsigned integer used as a seed. + */ +void tinymt32_init (tinymt32_t* s, uint32_t seed) +{ + const uint32_t MIN_LOOP = 8; + const uint32_t PRE_LOOP = 8; + s->status[0] = seed; + s->status[1] = s->mat1 = TINYMT32_MAT1_PARAM; + s->status[2] = s->mat2 = TINYMT32_MAT2_PARAM; + s->status[3] = s->tmat = TINYMT32_TMAT_PARAM; + for (int i = 1; i < MIN_LOOP; i++) { + s->status[i & 3] ^= i + UINT32_C(1812433253) + * (s->status[(i - 1) & 3] + ^ (s->status[(i - 1) & 3] >> 30)); + } + /* + * NB: The parameter set of this specification warrants + * that none of the possible 2^^32 seeds leads to an + * all-zero 127-bit internal state. Therefore, the + * period_certification() function of the original + * TinyMT32 source code has been safely removed. If + * another parameter set is used, this function will + * have to be reintroduced here. + */ + for (int i = 0; i < PRE_LOOP; i++) { + tinymt32_next_state(s); + } +} + +/** + * This function outputs a 32-bit unsigned integer from + * the internal state. + * @param s pointer to tinymt internal state. + * @return 32-bit unsigned integer r (0 <= r < 2^32). + */ +uint32_t tinymt32_get_uint32(tinymt32_t* s) +{ + tinymt32_next_state(s); + return tinymt32_temper(s); +} + +/** + * Internal tinymt32 constants and functions. + * Users should not call these functions directly. + */ +const uint32_t TINYMT32_SH0 = 1; +const uint32_t TINYMT32_SH1 = 10; +const uint32_t TINYMT32_SH8 = 8; +const uint32_t TINYMT32_MASK = UINT32_C(0x7fffffff); + +/** + * This function changes the internal state of tinymt32. + * @param s pointer to tinymt internal state. + */ +static void tinymt32_next_state (tinymt32_t* s) +{ + uint32_t x; + uint32_t y; + + y = s->status[3]; + x = (s->status[0] & TINYMT32_MASK) + ^ s->status[1] + ^ s->status[2]; + x ^= (x << TINYMT32_SH0); + y ^= (y >> TINYMT32_SH0) ^ x; + s->status[0] = s->status[1]; + s->status[1] = s->status[2]; + s->status[2] = x ^ (y << TINYMT32_SH1); + s->status[3] = y; + /* + * The if (y & 1) {...} block below replaces: + * s->status[1] ^= -((int32_t)(y & 1)) & s->mat1; + * s->status[2] ^= -((int32_t)(y & 1)) & s->mat2; + * The adopted code is equivalent to the original code + * but does not depend on the representation of negative + * integers by 2's complements. It is therefore more + * portable but includes an if branch, which may slow + * down the generation speed. + */ + if (y & 1) { + s->status[1] ^= s->mat1; + s->status[2] ^= s->mat2; + } +} + +/** + * This function outputs a 32-bit unsigned integer from + * the internal state. + * @param s pointer to tinymt internal state. + * @return 32-bit unsigned pseudorandom number. + */ +static uint32_t tinymt32_temper (tinymt32_t* s) +{ + uint32_t t0, t1; + t0 = s->status[3]; + t1 = s->status[0] + (s->status[2] >> TINYMT32_SH8); + t0 ^= t1; + /* + * The if (t1 & 1) {...} block below replaces: + * t0 ^= -((int32_t)(t1 & 1)) & s->tmat; + * The adopted code is equivalent to the original code + * but does not depend on the representation of negative + * integers by 2's complements. It is therefore more + * portable but includes an if branch, which may slow + * down the generation speed. + */ + if (t1 & 1) { + t0 ^= s->tmat; + } + return t0; +} + +uint16_t prng_scale16(uint16_t min, uint16_t max) +{ + uint32_t rnd; + + rnd = prng_get16(); + rnd *= (max - min); + rnd >>= 16; + rnd += min; + + return rnd; +} diff --git a/nametag8_CH592/user/misc/tinymt.h b/nametag8_CH592/user/misc/tinymt.h new file mode 100644 index 0000000..42ec304 --- /dev/null +++ b/nametag8_CH592/user/misc/tinymt.h @@ -0,0 +1,39 @@ +/** + * Tiny Mersenne Twister + */ + +#ifndef TINYMT_RAND_H_ +#define TINYMT_RAND_H_ + + + +/** + * tinymt32 internal state vector and parameters + */ +typedef struct { + uint32_t status[4]; + uint32_t mat1; + uint32_t mat2; + uint32_t tmat; +} tinymt32_t; + + + +extern tinymt32_t tinymt32_s; + + + +void tinymt32_init(tinymt32_t *s, uint32_t seed); +uint32_t tinymt32_get_uint32(tinymt32_t* s); + +#define prng_get8() (tinymt32_get_uint32(&tinymt32_s) & 0xff) +#define prng_get16() (tinymt32_get_uint32(&tinymt32_s) & 0xffff) +#define prng_get32() tinymt32_get_uint32(&tinymt32_s) + + + +uint16_t prng_scale16(uint16_t min, uint16_t max); + + + +#endif /* TINYMT_RAND_H */ diff --git a/nametag8_CH592/user/port_intr.c b/nametag8_CH592/user/port_intr.c index af37a46..61eaf78 100644 --- a/nametag8_CH592/user/port_intr.c +++ b/nametag8_CH592/user/port_intr.c @@ -14,6 +14,8 @@ #include "CH59x_common.h" #include "port_intr.h" +#include "hw/ch32sub.h" + #include @@ -41,7 +43,7 @@ void port_intr_cb_register(uint8_t port, uint8_t idx, void (*fn)(void)) void port_intr_init() { - + // enable port interrupt } @@ -51,7 +53,10 @@ __INTERRUPT __HIGH_CODE void GPIOA_IRQHandler(void) { + uint16_t flag = R16_PA_INT_IF; + // clear flags + R16_PA_INT_IF = flag; } __INTERRUPT @@ -59,22 +64,25 @@ __HIGH_CODE void GPIOB_IRQHandler(void) { uint8_t i; + uint8_t offset; uint16_t flag = R16_PB_INT_IF; // clear flags R16_PB_INT_IF = flag; // high priority actions - // none. + // ch32sub interrupt + if (flag & SUB_INTR_PIN) { + ch32sub_isr(); + } // general purpose fallback - for (i = 0; i < 24; i++) { + for (i = 4; i < MAX_PIN; i++) { + offset = i - 4; if (flag & (1 << i)) { - if (cb[PORT_INTR_GPIOB][i]) { - cb[PORT_INTR_GPIOB][i](); + if (cb[PORT_INTR_GPIOB][offset]) { + cb[PORT_INTR_GPIOB][offset](); } } } - - } diff --git a/nametag8_CH592/user/render/draw_ssd1306.c b/nametag8_CH592/user/render/draw_ssd1306.c new file mode 100644 index 0000000..afab911 --- /dev/null +++ b/nametag8_CH592/user/render/draw_ssd1306.c @@ -0,0 +1,609 @@ +/* + * draw_ssd1306.c + * begin 20190525 true + * + * mostly implemented by true + * some functions shamelessly copied and modified from interwebs + */ + +#include "draw_ssd1306.h" + +#include "../misc/sin7.h" + +#include +#include + + +#define _swap_(a, b) { t = a; a = b; b = t; } +#define _min_(a, b) (((a)<(b))?(a):(b)) +#define _max_(a, b) (((a)>(b))?(a):(b)) + + +SSD1306 *o = &oled; // we only ever support one... + + +void ssd1306fb_set_target(SSD1306 *target) +{ + o = target; +} + + +void ssd1306fb_set_cursor(int8_t x, int8_t y) +{ + o->cursor_x = x; + o->cursor_y = y; +} + +void ssd1306fb_set_color(uint8_t color) +{ + o->state &= ~SSD1306_STATE_PIXEL_MASK; + o->state |= color & SSD1306_STATE_PIXEL_MASK; +} + +/* + * this function rotatecopies one framebuffer into another, + * around an axis at the center of the framebuffer. + * + * there are assumptions about pages as well; Y pages will always + * start on a boundary. + */ +void ssd1306fb_rotate(SSD1306 *src, SSD1306 *dst, int8_t rot) +{ + int8_t x, y, nx, ny; + int8_t startx, starty, endx, endy; + + int8_t yoff; // page, using same terminology as the rest of the code + int8_t xoff; // x offset within the page + int8_t dxoff; // destination's x offset + int8_t dyoff; // destination's x offset + + uint8_t *s; + uint8_t *d; + + uint16_t idx; + + s = src->fb; + d = dst->fb; + + endx = dst->width >> 1; + startx = 0 - endx; + if ((dst->width & 1) == 0) startx++; + + endy = dst->height >> 1; + starty = 0 - endy; + if ((dst->height & 1) == 0) starty++; + + for (y = starty; y <= endy; y++) { + yoff = (y - starty) & 7; + xoff = ((y - starty) >> 3) * dst->width; + + for (x = startx; x <= endx; x++) { + if (s[x - startx + xoff] & (1 << yoff)) { + nx = (int16_t)(x * cos7(rot) - y * sin7(rot)) >> 7; + ny = (int16_t)(x * sin7(rot) + y * cos7(rot)) >> 7; + + if ((nx >= startx) && (nx <= endx)) { + if ((ny >= starty) && (ny <= endy)) { + dyoff = (ny - starty) & 7; + dxoff = ((ny - starty) >> 3) * dst->width; + idx = nx - startx + dxoff; + if (idx >= 512) return; + d[idx] |= (1 << dyoff); + } + } + } + } + } +} + +/* + * draws from data stored in horizontal priority page byte order + * (useful for copying between buffers) + */ +void ssd1306fb_copy(int8_t x, int8_t y, uint8_t width, uint8_t height, const uint8_t *dat) +{ + uint16_t i; + + uint8_t d; + + uint8_t w; + + uint8_t xp; // actual pixel x + uint16_t yp; // actual page y + int16_t pos; // output buffer offset + + uint8_t rh; // pages to draw + int8_t yoff; // y pixel drawing offset + + uint16_t bytes; // bytes to draw (calculated) + + uint8_t *fb; + int16_t fb_siz; + + + if (x >= o->width) return; + if (y >= o->height) return; + + fb = o->fb; + fb_siz = (o->height >> 3) * o->width; + + rh = 1 + ((height - 1) >> 3); + yoff = y & 7; + + bytes = (width * rh); + + w = width; + + height = x; + width = 0; + + for (i = 0; i < bytes; i++) { + d = dat[i]; + + xp = x + (i % w); + yp = ((y >> 3) + (i / w)) * o->width; + + pos = xp + yp; + + // half-width + if (o->state & SSD1306_STATE_STR_HALFWIDTH) { + if (xp != height) { + height = xp; + width++; + + if (width & 0x01) { + i += rh - 1; + continue; + } + } + } + + pos -= ((width + 1) >> 1); + + if ((pos < fb_siz) && (xp < o->width)) { + if (yoff >= 0) { + if (pos >= 0) { + if (o->state & SSD1306_STATE_SET_PIXEL) { + fb[pos] |= (d << yoff); + } else if (o->state & SSD1306_STATE_INVERT_PIXEL) { + fb[pos] ^= (d << yoff); + } else { + fb[pos] &= ~(d << yoff); + } + } + + if (yoff && ((pos + o->width) < fb_siz)) { + if (o->state & SSD1306_STATE_SET_PIXEL) { + fb[pos + o->width] |= (d >> (8 - yoff)); + } else if (o->state & SSD1306_STATE_INVERT_PIXEL) { + fb[pos + o->width] ^= (d >> (8 - yoff)); + } else { + fb[pos + o->width] &= ~(d >> (8 - yoff)); + } + } + } + } + } +} + +/* + * draws from data stored in vertical priority page byte order (why? why not just horizontal? ...) + */ +void ssd1306fb_draw_raw(int8_t x, int8_t y, uint8_t width, uint8_t height, const uint8_t *dat, uint16_t dat_offset, uint16_t bytes) +{ + uint16_t i; + + uint8_t d; + + uint8_t xp; + uint16_t yp; + int16_t pos; + + uint8_t rh; + int8_t yoff; + + int8_t y_init, yoff_init; + + uint8_t *fb; + int16_t fb_siz; + + + if (x >= o->width) return; + if (y >= o->height) return; + + fb = o->fb; + fb_siz = (o->height >> 3) * o->width; + + rh = 1 + ((height - 1) >> 3); + yoff = y & 7; + + bytes = (bytes == 0) ? width * rh : bytes; + + y_init = y; + yoff_init = yoff; + + height = x; + width = 0; + + for (i = 0; i < bytes; i++) { + // reset y if next horizontal drawing phase is started + if ((i & rh) == 0) { + y = y_init; + yoff = yoff_init; + } + + d = dat[dat_offset + i]; + + xp = x + (i / rh); + yp = ((y >> 3) + (i % rh)) * o->width; + + pos = xp + yp; + + // half-width + if (o->state & SSD1306_STATE_STR_HALFWIDTH) { + if (xp != height) { + height = xp; + width++; + + if (width & 0x01) { + i += rh - 1; + continue; + } + } + } + + pos -= ((width + 1) >> 1); + + if ((pos < fb_siz) && (xp < o->width)) { + if (yoff >= 0) { + if (pos >= 0) { + if (o->state & SSD1306_STATE_SET_PIXEL) { + fb[pos] |= (d << yoff); + } else if (o->state & SSD1306_STATE_INVERT_PIXEL) { + fb[pos] ^= (d << yoff); + } else { + fb[pos] &= ~(d << yoff); + } + } + + if (yoff && ((pos + o->width) < fb_siz)) { + if (o->state & SSD1306_STATE_SET_PIXEL) { + fb[pos + o->width] |= (d >> (8 - yoff)); + } else if (o->state & SSD1306_STATE_INVERT_PIXEL) { + fb[pos + o->width] ^= (d >> (8 - yoff)); + } else { + fb[pos + o->width] &= ~(d >> (8 - yoff)); + } + } + } + } + } +} + +void ssd1306fb_draw_pix(uint8_t x, uint8_t y) +{ + uint8_t *fb; + + if (x >= o->width) return; + if (y >= o->height) return; + + fb = o->fb; + fb += ((y >> 3) * o->width); + fb += x; + + y = 1 << (y & 7); + + if (o->state & SSD1306_STATE_SET_PIXEL) { + *fb |= y; + } else if (o->state & SSD1306_STATE_INVERT_PIXEL) { + *fb ^= y; + } else { + *fb &= ~y; + } +} + +void ssd1306fb_draw_hline(uint8_t x1, uint8_t x2, uint8_t y) +{ + uint8_t t; + uint8_t *fb; + + if (x1 >= o->width) return; + if (x2 >= o->width) return; + if (y >= o->height) return; + + if (x1 > x2) { + _swap_(x1, x2); + } + + fb = o->fb; + fb += ((y >> 3) * o->width); + fb += x1; + + y = 1 << (y & 7); + t = (x2 - x1) + 1; + + if (o->state & SSD1306_STATE_SET_PIXEL) { + while (t--) *fb++ |= y; + } else if (o->state & SSD1306_STATE_INVERT_PIXEL) { + while (t--) *fb++ ^= y; + } else { + y = ~y; + while (t--) *fb++ &= y; + } +} + +void ssd1306fb_draw_vline(uint8_t x, uint8_t y1, uint8_t y2) +{ + uint8_t t; + uint8_t draw; + uint8_t *fb; + int8_t yoff, len; + + if (x >= o->width) return; + if (y1 >= o->height) return; + if (y2 >= o->height) return; + + if (y1 > y2) { + _swap_(y1, y2); + } + + yoff = y1 & 7; + + fb = o->fb; + fb += ((y1 >> 3) * o->width); + fb += x; + + len = (y2 - y1) + 1; + + // work the first page if it has an offset + if (yoff) { + yoff = 8 - yoff; + + draw = ~(0xff >> yoff); + + if (len < yoff) { + draw &= (0xff >> (yoff - len)); + } + + if (o->state & SSD1306_STATE_SET_PIXEL) { + *fb |= draw; + } else if (o->state & SSD1306_STATE_INVERT_PIXEL) { + *fb ^= draw; + } else { + *fb &= ~draw; + } + + if (len < yoff) return; + + len -= yoff; + fb += o->width; + } + + // work any full pages + while (len >= 8) { + if (o->state & SSD1306_STATE_SET_PIXEL) { + *fb = 0xff; + } else if (o->state & SSD1306_STATE_INVERT_PIXEL) { + *fb ^= ~(*fb); + } else { + *fb = 0x00; + } + + len -= 8; + fb += o->width; + } + + // work last page + if (len > 0) { + draw = (1 << (len & 7)) - 1; + + if (o->state & SSD1306_STATE_SET_PIXEL) { + *fb |= draw; + } else if (o->state & SSD1306_STATE_INVERT_PIXEL) { + *fb ^= draw; + } else { + *fb &= ~draw; + } + } +} + +void ssd1306fb_draw_line(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2) +{ + int8_t t; + int8_t dx, dy; + int8_t err; + int8_t ystep; + + int8_t steep = abs(y2 - y1) > abs(x2 - x1); + + if (steep) { + _swap_(x1, y1); + _swap_(x2, y2); + } + + if (x1 > x2) { + _swap_(x1, x2); + _swap_(y1, y2); + } + + dx = x2 - x1; + dy = abs(y2 - y1); + + err = dx / 2; + + if (y1 < y2) { + ystep = 1; + } else { + ystep = -1; + } + + for (; x1 <= x2; x1++) { + if (steep) { + ssd1306fb_draw_pix(y1, x1); + } else { + ssd1306fb_draw_pix(x1, y1); + } + + err -= dy; + + if (err < 0) { + y1 += ystep; + err += dx; + } + } +} + +void ssd1306fb_draw_rect(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2) +{ + ssd1306fb_draw_vline(x1, y1 + 1, y2 - 1); + ssd1306fb_draw_hline(x1, x2, y1); + ssd1306fb_draw_hline(x1, x2, y2); + ssd1306fb_draw_vline(x2, y1 + 1, y2 - 1); +} + + +// note: rect fill not working right now, lol +void ssd1306fb_draw_rect_fill(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2) +{ + uint8_t t; + + if (y1 > y2) _swap_(y1, y2); + + do { + // todo: replace with vline implementation, it might be faster, + // as multiple bits are set per assign vs one bit max with hline + ssd1306fb_draw_hline(x1, x2, y1); + } while (y1++ < y2); +} + +void ssd1306fb_draw_circle(int8_t x, int8_t y, uint8_t radius) +{ + int8_t xs = 0; + int8_t ys = radius; + int8_t dp = 1 - radius; + + do { + if (dp < 0) { + dp = dp + 2 * (xs++) + 3; + } else { + dp = dp + 2 * (xs++) - 2 * (ys--) + 5; + } + + ssd1306fb_draw_pix(x + xs, y + ys); + ssd1306fb_draw_pix(x - xs, y + ys); + ssd1306fb_draw_pix(x + xs, y - ys); + ssd1306fb_draw_pix(x - xs, y - ys); + ssd1306fb_draw_pix(x + ys, y + xs); + ssd1306fb_draw_pix(x - ys, y + xs); + ssd1306fb_draw_pix(x + ys, y - xs); + ssd1306fb_draw_pix(x - ys, y - xs); + } while (xs < ys); + + ssd1306fb_draw_pix(x + radius, y); + ssd1306fb_draw_pix(x, y + radius); + ssd1306fb_draw_pix(x - radius, y); + ssd1306fb_draw_pix(x, y - radius); +} + +/* + * character string drawing functions draw at the cursor position. + */ +uint8_t ssd1306fb_get_str_width(const uint8_t *font, const char *str, uint8_t len, int8_t extra_spacing) +{ + uint8_t first = font[FONT_FIRST_CHAR_POS]; + uint8_t chr_width; + uint8_t str_width = 0; + uint8_t w; + + w = len; + + while (w--) { + chr_width = font[FONT_JUMPTABLE_START + (str[w] - first) * FONT_JUMPTABLE_BYTES + FONT_JUMPTABLE_WIDTH]; + + if (o->state & SSD1306_STATE_STR_HALFWIDTH) { + chr_width >>= 1; + } + + str_width += chr_width; + } + + str_width += extra_spacing * (len - 1); + + return str_width; +} + +uint8_t ssd1306fb_get_font_height(const uint8_t *font) +{ + return font[FONT_HEIGHT_POS]; +} + +void ssd1306fb_internal_str(const uint8_t *font, const char *str, uint8_t len, int8_t spacing) +{ + const uint8_t height = font[FONT_HEIGHT_POS]; + const uint8_t first = font[FONT_FIRST_CHAR_POS]; + const uint16_t jt_siz = font[FONT_CHAR_NUM_POS] * FONT_JUMPTABLE_BYTES; + const uint16_t last = font[FONT_CHAR_NUM_POS] + first; + + uint8_t i; + + uint8_t c; // current character + uint8_t offset; // offset from first character in font table (usually space 0x20) + + uint8_t *jtdata; // font jump table data for character + uint16_t pos; // position of actual character data + + if (!len) return; + + for (i = 0; i < len; i++) { + if (o->cursor_x > o->width) return; + + c = str[i]; + + // character valid? + if (c >= first && c < last) { + offset = c - first; + + // get + jtdata = (uint8_t *)(font + FONT_JUMPTABLE_START + (offset * FONT_JUMPTABLE_BYTES)); + + if (!(jtdata[FONT_JUMPTABLE_MSB] == 255 && jtdata[FONT_JUMPTABLE_LSB] == 255)) { + pos = FONT_JUMPTABLE_START + + jt_siz + + ((jtdata[FONT_JUMPTABLE_MSB] << 8) + + jtdata[FONT_JUMPTABLE_LSB]); + + ssd1306fb_draw_raw( + o->cursor_x, + o->cursor_y, + jtdata[FONT_JUMPTABLE_WIDTH], + height, + font, + pos, + jtdata[FONT_JUMPTABLE_SIZE]); + } + + offset = jtdata[FONT_JUMPTABLE_WIDTH]; + + if (o->state & SSD1306_STATE_STR_HALFWIDTH) { + offset >>= 1; + } + + o->cursor_x += offset; + + if (i + 1 != len) { + o->cursor_x += spacing; + } + } + } +} + +void ssd1306fb_draw_str(const uint8_t *font, const char *str, int8_t extra_spacing) +{ + //uint8_t lh; + uint8_t len; + + //lh = *(font + FONT_HEIGHT_POS); + len = strlen(str); + + ssd1306fb_internal_str(font, str, len, extra_spacing); //, ssd1306fb_get_str_width(font, str, len)); +} diff --git a/nametag8_CH592/user/render/draw_ssd1306.h b/nametag8_CH592/user/render/draw_ssd1306.h new file mode 100644 index 0000000..0d8b12e --- /dev/null +++ b/nametag8_CH592/user/render/draw_ssd1306.h @@ -0,0 +1,43 @@ +/* + * $Id: draw_ssd1306.h 494 2021-07-21 11:46:11Z true $ + * begin 20190525 true + */ + +#ifndef USER_RENDER_DRAW_SSD1306_H_ +#define USER_RENDER_DRAW_SSD1306_H_ + + + +#include "hw/ssd1306.h" + +#include "render/font.h" + + + +void ssd1306fb_set_target(SSD1306 *target); + +void ssd1306fb_set_cursor(int8_t x, int8_t y); +void ssd1306fb_set_color(uint8_t color); + +void ssd1306fb_rotate(SSD1306 *src, SSD1306 *dst, int8_t rot); +void ssd1306fb_copy(int8_t x, int8_t y, uint8_t width, uint8_t height, const uint8_t *dat); + +void ssd1306fb_draw_raw(int8_t x, int8_t y, uint8_t width, uint8_t height, const uint8_t *dat, uint16_t dat_offset, uint16_t bytes); + +void ssd1306fb_draw_pix(uint8_t x, uint8_t y); + +void ssd1306fb_draw_hline(uint8_t x1, uint8_t x2, uint8_t y); +void ssd1306fb_draw_vline(uint8_t x, uint8_t y1, uint8_t y2); +void ssd1306fb_draw_line(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2); +void ssd1306fb_draw_rect(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2); +//void ssd1306fb_draw_rect_fill(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2); +void ssd1306fb_draw_circle(int8_t x, int8_t y, uint8_t radius); + +uint8_t ssd1306fb_get_str_width(const uint8_t *font, const char *str, uint8_t len, int8_t extra_spacing); +uint8_t ssd1306fb_get_font_height(const uint8_t *font); + +void ssd1306fb_draw_str(const uint8_t *font, const char *str, int8_t extra_spacing); + + + +#endif /* USER_RENDER_DRAW_SSD1306_H_ */ diff --git a/nametag8_CH592/user/render/font.h b/nametag8_CH592/user/render/font.h new file mode 100644 index 0000000..de1dfd1 --- /dev/null +++ b/nametag8_CH592/user/render/font.h @@ -0,0 +1,51 @@ +/* + * $Id: font.h 494 2021-07-21 11:46:11Z true $ + * begin 20190525 true + */ + +#ifndef USER_RENDER_FONT_STATIC_H_ +#define USER_RENDER_FONT_STATIC_H_ + + + +#include + + + +#define FONT_JUMPTABLE_BYTES 4 + +#define FONT_JUMPTABLE_MSB 0 +#define FONT_JUMPTABLE_LSB 1 +#define FONT_JUMPTABLE_SIZE 2 +#define FONT_JUMPTABLE_WIDTH 3 +#define FONT_JUMPTABLE_START 4 + +#define FONT_WIDTH_POS 0 +#define FONT_HEIGHT_POS 1 +#define FONT_FIRST_CHAR_POS 2 +#define FONT_CHAR_NUM_POS 3 + + + +typedef struct FontTable { + uint8_t tag_allowed; + const char *name; + const uint8_t *font; +} FontTable; + + + +extern const uint8_t font_Dialog_plain_8[]; +extern const uint8_t font_DejaVu_Sans_Mono_Bold_11[]; +extern const uint8_t font_Nimbus_Mono_L_Bold_20[]; +extern const uint8_t font_DialogInput_Bold_24[]; +extern const uint8_t font_Chewy_24[]; +extern const uint8_t font_Crushed_25[]; +extern const uint8_t font_Nimbus_Sans_L_25[]; +extern const uint8_t font_Orbitron_28[]; + +extern const FontTable font_table[8]; + + + +#endif /* USER_RENDER_FONT_STATIC_H_ */ diff --git a/nametag8_CH592/user/render/font_static.c b/nametag8_CH592/user/render/font_static.c new file mode 100644 index 0000000..c825216 --- /dev/null +++ b/nametag8_CH592/user/render/font_static.c @@ -0,0 +1,1598 @@ +/* + * static_font.c + * begin 20190525 true + * + * fonts used in the nametag project. + * you can see this website for reference: http://oleddisplay.squix.ch + * + * possible converters with source code: + * https://github.com/squix78/esp8266-oled-ssd1306-font-converter (source for the website) + */ + +#include + +#include "font.h" + + + +const uint8_t font_Dialog_plain_8[] = { + 0x08, // Width: 8 + 0x0A, // Height: 10 + 0x20, // First Char: 32 + 0x5E, // Numbers of Chars: 94 + + // Jump Table: + 0xFF, 0xFF, 0x00, 0x03, // 32:65535 + 0x00, 0x00, 0x03, 0x03, // 33:0 + 0x00, 0x03, 0x07, 0x04, // 34:3 + 0x00, 0x0A, 0x0B, 0x07, // 35:10 + 0x00, 0x15, 0x09, 0x05, // 36:21 + 0x00, 0x1E, 0x0F, 0x08, // 37:30 + 0x00, 0x2D, 0x0B, 0x06, // 38:45 + 0x00, 0x38, 0x03, 0x02, // 39:56 + 0x00, 0x3B, 0x05, 0x03, // 40:59 + 0x00, 0x40, 0x05, 0x03, // 41:64 + 0x00, 0x45, 0x07, 0x04, // 42:69 + 0x00, 0x4C, 0x0B, 0x07, // 43:76 + 0x00, 0x57, 0x04, 0x03, // 44:87 + 0x00, 0x5B, 0x05, 0x03, // 45:91 + 0x00, 0x60, 0x03, 0x03, // 46:96 + 0x00, 0x63, 0x05, 0x03, // 47:99 + 0x00, 0x68, 0x09, 0x05, // 48:104 + 0x00, 0x71, 0x07, 0x05, // 49:113 + 0x00, 0x78, 0x09, 0x05, // 50:120 + 0x00, 0x81, 0x09, 0x05, // 51:129 + 0x00, 0x8A, 0x09, 0x05, // 52:138 + 0x00, 0x93, 0x09, 0x05, // 53:147 + 0x00, 0x9C, 0x09, 0x05, // 54:156 + 0x00, 0xA5, 0x09, 0x05, // 55:165 + 0x00, 0xAE, 0x09, 0x05, // 56:174 + 0x00, 0xB7, 0x09, 0x05, // 57:183 + 0x00, 0xC0, 0x03, 0x03, // 58:192 + 0x00, 0xC3, 0x04, 0x03, // 59:195 + 0x00, 0xC7, 0x0B, 0x07, // 60:199 + 0x00, 0xD2, 0x0B, 0x07, // 61:210 + 0x00, 0xDD, 0x0B, 0x07, // 62:221 + 0x00, 0xE8, 0x07, 0x04, // 63:232 + 0x00, 0xEF, 0x0F, 0x08, // 64:239 + 0x00, 0xFE, 0x09, 0x05, // 65:254 + 0x01, 0x07, 0x09, 0x05, // 66:263 + 0x01, 0x10, 0x0B, 0x06, // 67:272 + 0x01, 0x1B, 0x0B, 0x06, // 68:283 + 0x01, 0x26, 0x09, 0x05, // 69:294 + 0x01, 0x2F, 0x07, 0x05, // 70:303 + 0x01, 0x36, 0x0B, 0x06, // 71:310 + 0x01, 0x41, 0x09, 0x06, // 72:321 + 0x01, 0x4A, 0x03, 0x02, // 73:330 + 0x01, 0x4D, 0x04, 0x02, // 74:333 + 0x01, 0x51, 0x09, 0x05, // 75:337 + 0x01, 0x5A, 0x07, 0x04, // 76:346 + 0x01, 0x61, 0x0B, 0x07, // 77:353 + 0x01, 0x6C, 0x09, 0x06, // 78:364 + 0x01, 0x75, 0x0B, 0x06, // 79:373 + 0x01, 0x80, 0x09, 0x05, // 80:384 + 0x01, 0x89, 0x0B, 0x06, // 81:393 + 0x01, 0x94, 0x0B, 0x06, // 82:404 + 0x01, 0x9F, 0x09, 0x05, // 83:415 + 0x01, 0xA8, 0x09, 0x05, // 84:424 + 0x01, 0xB1, 0x09, 0x06, // 85:433 + 0x01, 0xBA, 0x09, 0x05, // 86:442 + 0x01, 0xC3, 0x0D, 0x08, // 87:451 + 0x01, 0xD0, 0x09, 0x05, // 88:464 + 0x01, 0xD9, 0x09, 0x05, // 89:473 + 0x01, 0xE2, 0x09, 0x05, // 90:482 + 0x01, 0xEB, 0x06, 0x03, // 91:491 + 0x01, 0xF1, 0x06, 0x03, // 92:497 + 0x01, 0xF7, 0x06, 0x03, // 93:503 + 0x01, 0xFD, 0x09, 0x07, // 94:509 + 0x02, 0x06, 0x08, 0x04, // 95:518 + 0x02, 0x0E, 0x03, 0x04, // 96:526 + 0x02, 0x11, 0x09, 0x05, // 97:529 + 0x02, 0x1A, 0x09, 0x05, // 98:538 + 0x02, 0x23, 0x07, 0x04, // 99:547 + 0x02, 0x2A, 0x09, 0x05, // 100:554 + 0x02, 0x33, 0x09, 0x05, // 101:563 + 0x02, 0x3C, 0x05, 0x03, // 102:572 + 0x02, 0x41, 0x0A, 0x05, // 103:577 + 0x02, 0x4B, 0x09, 0x05, // 104:587 + 0x02, 0x54, 0x03, 0x02, // 105:596 + 0x02, 0x57, 0x04, 0x02, // 106:599 + 0x02, 0x5B, 0x07, 0x05, // 107:603 + 0x02, 0x62, 0x03, 0x02, // 108:610 + 0x02, 0x65, 0x0F, 0x08, // 109:613 + 0x02, 0x74, 0x09, 0x05, // 110:628 + 0x02, 0x7D, 0x09, 0x05, // 111:637 + 0x02, 0x86, 0x09, 0x05, // 112:646 + 0x02, 0x8F, 0x0A, 0x05, // 113:655 + 0x02, 0x99, 0x05, 0x03, // 114:665 + 0x02, 0x9E, 0x07, 0x04, // 115:670 + 0x02, 0xA5, 0x05, 0x03, // 116:677 + 0x02, 0xAA, 0x09, 0x05, // 117:682 + 0x02, 0xB3, 0x07, 0x05, // 118:691 + 0x02, 0xBA, 0x0B, 0x07, // 119:698 + 0x02, 0xC5, 0x07, 0x05, // 120:709 + 0x02, 0xCC, 0x09, 0x05, // 121:716 + 0x02, 0xD5, 0x07, 0x04, // 122:725 + 0x02, 0xDC, 0x08, 0x05, // 123:732 + 0x02, 0xE4, 0x04, 0x03, // 124:740 + 0x02, 0xE8, 0x07, 0x05, // 125:744 + + // Font Data: + 0x00,0x00,0xBC, // 33 + 0x00,0x00,0x0C,0x00,0x00,0x00,0x0C, // 34 + 0x00,0x00,0xA8,0x00,0x7C,0x00,0xEA,0x00,0x3E,0x00,0x28, // 35 + 0x00,0x00,0x98,0x00,0xA8,0x00,0xFC,0x01,0xA8, // 36 + 0x00,0x00,0x1C,0x00,0x14,0x00,0xDC,0x00,0x30,0x00,0xEC,0x00,0xA0,0x00,0xE0, // 37 + 0x00,0x00,0x60,0x00,0xBC,0x00,0xF4,0x00,0xC4,0x00,0xA0, // 38 + 0x00,0x00,0x0C, // 39 + 0x00,0x00,0x7C,0x00,0x82, // 40 + 0x00,0x00,0x82,0x00,0x7C, // 41 + 0x24,0x00,0x18,0x00,0x3C,0x00,0x18, // 42 + 0x00,0x00,0x20,0x00,0x20,0x00,0xF8,0x00,0x20,0x00,0x20, // 43 + 0x00,0x00,0x80,0x01, // 44 + 0x00,0x00,0x20,0x00,0x20, // 45 + 0x00,0x00,0x80, // 46 + 0x80,0x01,0x70,0x00,0x0C, // 47 + 0x00,0x00,0x78,0x00,0x84,0x00,0x84,0x00,0x78, // 48 + 0x00,0x00,0x84,0x00,0xFC,0x00,0x80, // 49 + 0x00,0x00,0x84,0x00,0xC4,0x00,0xA4,0x00,0x98, // 50 + 0x00,0x00,0x84,0x00,0xA4,0x00,0xA4,0x00,0xD8, // 51 + 0x00,0x00,0x60,0x00,0x58,0x00,0xFC,0x00,0x40, // 52 + 0x00,0x00,0x9C,0x00,0x94,0x00,0x94,0x00,0x64, // 53 + 0x00,0x00,0x78,0x00,0xAC,0x00,0xA4,0x00,0xE4, // 54 + 0x00,0x00,0x04,0x00,0x84,0x00,0x74,0x00,0x0C, // 55 + 0x00,0x00,0xD8,0x00,0xA4,0x00,0xA4,0x00,0xD8, // 56 + 0x00,0x00,0x9C,0x00,0x94,0x00,0xD4,0x00,0x78, // 57 + 0x00,0x00,0x90, // 58 + 0x00,0x00,0x90,0x01, // 59 + 0x00,0x00,0x20,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x48, // 60 + 0x00,0x00,0x50,0x00,0x50,0x00,0x50,0x00,0x50,0x00,0x50, // 61 + 0x00,0x00,0x48,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x20, // 62 + 0x00,0x00,0x04,0x00,0xB4,0x00,0x0C, // 63 + 0x00,0x00,0x70,0x00,0x88,0x00,0x74,0x01,0x54,0x01,0x74,0x01,0x4C,0x00,0x38, // 64 + 0x80,0x00,0x70,0x00,0x4C,0x00,0x70,0x00,0x80, // 65 + 0x00,0x00,0xFC,0x00,0xA4,0x00,0xA4,0x00,0xDC, // 66 + 0x00,0x00,0x78,0x00,0xCC,0x00,0x84,0x00,0x84,0x00,0x88, // 67 + 0x00,0x00,0xFC,0x00,0x84,0x00,0x84,0x00,0x84,0x00,0x78, // 68 + 0x00,0x00,0xFC,0x00,0xA4,0x00,0xA4,0x00,0xA4, // 69 + 0x00,0x00,0xFC,0x00,0x24,0x00,0x24, // 70 + 0x00,0x00,0x78,0x00,0x8C,0x00,0x84,0x00,0x94,0x00,0x78, // 71 + 0x00,0x00,0xFC,0x00,0x20,0x00,0x20,0x00,0xFC, // 72 + 0x00,0x00,0xFC, // 73 + 0x00,0x02,0xFC,0x03, // 74 + 0x00,0x00,0xFC,0x00,0x30,0x00,0x68,0x00,0xC4, // 75 + 0x00,0x00,0xFC,0x00,0x80,0x00,0x80, // 76 + 0x00,0x00,0xFC,0x00,0x1C,0x00,0x70,0x00,0x1C,0x00,0xFC, // 77 + 0x00,0x00,0xFC,0x00,0x18,0x00,0x60,0x00,0xFC, // 78 + 0x00,0x00,0x78,0x00,0x84,0x00,0x84,0x00,0x84,0x00,0x78, // 79 + 0x00,0x00,0xFC,0x00,0x14,0x00,0x14,0x00,0x1C, // 80 + 0x00,0x00,0x78,0x00,0x84,0x00,0x84,0x00,0x84,0x01,0x78, // 81 + 0x00,0x00,0xFC,0x00,0x14,0x00,0x34,0x00,0x6C,0x00,0x80, // 82 + 0x00,0x00,0x98,0x00,0x94,0x00,0xB4,0x00,0xE4, // 83 + 0x04,0x00,0x04,0x00,0xFC,0x00,0x04,0x00,0x04, // 84 + 0x00,0x00,0x7C,0x00,0x80,0x00,0x80,0x00,0x7C, // 85 + 0x04,0x00,0x38,0x00,0xC0,0x00,0x38,0x00,0x04, // 86 + 0x0C,0x00,0xF0,0x00,0x78,0x00,0x04,0x00,0x78,0x00,0xF0,0x00,0x0C, // 87 + 0x84,0x00,0x4C,0x00,0x30,0x00,0x4C,0x00,0x84, // 88 + 0x04,0x00,0x0C,0x00,0xF0,0x00,0x0C,0x00,0x04, // 89 + 0x00,0x00,0x84,0x00,0xE4,0x00,0xB4,0x00,0x8C, // 90 + 0x00,0x00,0xFC,0x01,0x04,0x01, // 91 + 0x0C,0x00,0x70,0x00,0x80,0x01, // 92 + 0x00,0x00,0x04,0x01,0xFC,0x01, // 93 + 0x00,0x00,0x08,0x00,0x08,0x00,0x04,0x00,0x08, // 94 + 0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02, // 95 + 0x00,0x00,0x04, // 96 + 0x00,0x00,0xE0,0x00,0xB0,0x00,0xB0,0x00,0xF0, // 97 + 0x00,0x00,0xFE,0x00,0x90,0x00,0x90,0x00,0x60, // 98 + 0x00,0x00,0x60,0x00,0x90,0x00,0x90, // 99 + 0x00,0x00,0x60,0x00,0x90,0x00,0x90,0x00,0xFE, // 100 + 0x00,0x00,0x60,0x00,0xB0,0x00,0xB0,0x00,0xB0, // 101 + 0x10,0x00,0xFE,0x00,0x12, // 102 + 0x00,0x00,0x60,0x00,0x90,0x02,0x90,0x02,0xF0,0x01, // 103 + 0x00,0x00,0xFE,0x00,0x10,0x00,0x10,0x00,0xF0, // 104 + 0x00,0x00,0xF4, // 105 + 0x00,0x02,0xF4,0x03, // 106 + 0x00,0x00,0xFE,0x00,0x60,0x00,0x90, // 107 + 0x00,0x00,0xFE, // 108 + 0x00,0x00,0xF0,0x00,0x10,0x00,0x10,0x00,0xF0,0x00,0x10,0x00,0x10,0x00,0xF0, // 109 + 0x00,0x00,0xF0,0x00,0x10,0x00,0x10,0x00,0xF0, // 110 + 0x00,0x00,0x60,0x00,0x90,0x00,0x90,0x00,0x60, // 111 + 0x00,0x00,0xF0,0x03,0x90,0x00,0x90,0x00,0x60, // 112 + 0x00,0x00,0x60,0x00,0x90,0x00,0x90,0x00,0xF0,0x03, // 113 + 0x00,0x00,0xF0,0x00,0x10, // 114 + 0x00,0x00,0xB0,0x00,0xB0,0x00,0xD0, // 115 + 0x10,0x00,0xF8,0x00,0x90, // 116 + 0x00,0x00,0xF0,0x00,0x80,0x00,0x80,0x00,0xF0, // 117 + 0x10,0x00,0xE0,0x00,0xE0,0x00,0x10, // 118 + 0x30,0x00,0xC0,0x00,0x30,0x00,0x30,0x00,0xC0,0x00,0x30, // 119 + 0x90,0x00,0xF0,0x00,0xF0,0x00,0x90, // 120 + 0x00,0x00,0x10,0x02,0xE0,0x03,0x60,0x00,0x10, // 121 + 0x00,0x00,0x90,0x00,0xD0,0x00,0xF0, // 122 + 0x00,0x00,0x20,0x00,0xDC,0x01,0x04,0x01, // 123 + 0x00,0x00,0xFC,0x03, // 124 + 0x00,0x00,0x04,0x01,0xDC,0x01,0x20, // 125 +}; + +const uint8_t font_DejaVu_Sans_Mono_Bold_11[] = { + 0x07, // Width: 7 + 0x0E, // Height: 14 + 0x20, // First Char: 32 + 0x5E, // Numbers of Chars: 94 + + // Jump Table: + 0xFF, 0xFF, 0x00, 0x07, // 32:65535 + 0x00, 0x00, 0x0A, 0x07, // 33:0 + 0x00, 0x0A, 0x09, 0x07, // 34:10 + 0x00, 0x13, 0x0D, 0x07, // 35:19 + 0x00, 0x20, 0x0C, 0x07, // 36:32 + 0x00, 0x2C, 0x0C, 0x07, // 37:44 + 0x00, 0x38, 0x0E, 0x07, // 38:56 + 0x00, 0x46, 0x07, 0x07, // 39:70 + 0x00, 0x4D, 0x0A, 0x07, // 40:77 + 0x00, 0x57, 0x0A, 0x07, // 41:87 + 0x00, 0x61, 0x0B, 0x07, // 42:97 + 0x00, 0x6C, 0x0B, 0x07, // 43:108 + 0x00, 0x77, 0x08, 0x07, // 44:119 + 0x00, 0x7F, 0x0A, 0x07, // 45:127 + 0x00, 0x89, 0x08, 0x07, // 46:137 + 0x00, 0x91, 0x0B, 0x07, // 47:145 + 0x00, 0x9C, 0x0E, 0x07, // 48:156 + 0x00, 0xAA, 0x0E, 0x07, // 49:170 + 0x00, 0xB8, 0x0E, 0x07, // 50:184 + 0x00, 0xC6, 0x0E, 0x07, // 51:198 + 0x00, 0xD4, 0x0E, 0x07, // 52:212 + 0x00, 0xE2, 0x0E, 0x07, // 53:226 + 0x00, 0xF0, 0x0E, 0x07, // 54:240 + 0x00, 0xFE, 0x0D, 0x07, // 55:254 + 0x01, 0x0B, 0x0E, 0x07, // 56:267 + 0x01, 0x19, 0x0E, 0x07, // 57:281 + 0x01, 0x27, 0x08, 0x07, // 58:295 + 0x01, 0x2F, 0x08, 0x07, // 59:303 + 0x01, 0x37, 0x0E, 0x07, // 60:311 + 0x01, 0x45, 0x0E, 0x07, // 61:325 + 0x01, 0x53, 0x0E, 0x07, // 62:339 + 0x01, 0x61, 0x09, 0x07, // 63:353 + 0x01, 0x6A, 0x0C, 0x07, // 64:362 + 0x01, 0x76, 0x0E, 0x07, // 65:374 + 0x01, 0x84, 0x0E, 0x07, // 66:388 + 0x01, 0x92, 0x0E, 0x07, // 67:402 + 0x01, 0xA0, 0x0E, 0x07, // 68:416 + 0x01, 0xAE, 0x0E, 0x07, // 69:430 + 0x01, 0xBC, 0x0D, 0x07, // 70:444 + 0x01, 0xC9, 0x0E, 0x07, // 71:457 + 0x01, 0xD7, 0x0E, 0x07, // 72:471 + 0x01, 0xE5, 0x0E, 0x07, // 73:485 + 0x01, 0xF3, 0x0E, 0x07, // 74:499 + 0x02, 0x01, 0x0E, 0x07, // 75:513 + 0x02, 0x0F, 0x0E, 0x07, // 76:527 + 0x02, 0x1D, 0x0E, 0x07, // 77:541 + 0x02, 0x2B, 0x0E, 0x07, // 78:555 + 0x02, 0x39, 0x0E, 0x07, // 79:569 + 0x02, 0x47, 0x0D, 0x07, // 80:583 + 0x02, 0x54, 0x0E, 0x07, // 81:596 + 0x02, 0x62, 0x0E, 0x07, // 82:610 + 0x02, 0x70, 0x0E, 0x07, // 83:624 + 0x02, 0x7E, 0x0D, 0x07, // 84:638 + 0x02, 0x8B, 0x0E, 0x07, // 85:651 + 0x02, 0x99, 0x0D, 0x07, // 86:665 + 0x02, 0xA6, 0x0D, 0x07, // 87:678 + 0x02, 0xB3, 0x0E, 0x07, // 88:691 + 0x02, 0xC1, 0x0D, 0x07, // 89:705 + 0x02, 0xCE, 0x0E, 0x07, // 90:718 + 0x02, 0xDC, 0x0A, 0x07, // 91:732 + 0x02, 0xE6, 0x0C, 0x07, // 92:742 + 0x02, 0xF2, 0x0A, 0x07, // 93:754 + 0x02, 0xFC, 0x0B, 0x07, // 94:764 + 0x03, 0x07, 0x0E, 0x07, // 95:775 + 0x03, 0x15, 0x07, 0x07, // 96:789 + 0x03, 0x1C, 0x0E, 0x07, // 97:796 + 0x03, 0x2A, 0x0E, 0x07, // 98:810 + 0x03, 0x38, 0x0E, 0x07, // 99:824 + 0x03, 0x46, 0x0E, 0x07, // 100:838 + 0x03, 0x54, 0x0E, 0x07, // 101:852 + 0x03, 0x62, 0x0B, 0x07, // 102:866 + 0x03, 0x6D, 0x0E, 0x07, // 103:877 + 0x03, 0x7B, 0x0E, 0x07, // 104:891 + 0x03, 0x89, 0x0E, 0x07, // 105:905 + 0x03, 0x97, 0x0A, 0x07, // 106:919 + 0x03, 0xA1, 0x0E, 0x07, // 107:929 + 0x03, 0xAF, 0x0C, 0x07, // 108:943 + 0x03, 0xBB, 0x0E, 0x07, // 109:955 + 0x03, 0xC9, 0x0E, 0x07, // 110:969 + 0x03, 0xD7, 0x0E, 0x07, // 111:983 + 0x03, 0xE5, 0x0E, 0x07, // 112:997 + 0x03, 0xF3, 0x0E, 0x07, // 113:1011 + 0x04, 0x01, 0x0D, 0x07, // 114:1025 + 0x04, 0x0E, 0x0E, 0x07, // 115:1038 + 0x04, 0x1C, 0x0C, 0x07, // 116:1052 + 0x04, 0x28, 0x0E, 0x07, // 117:1064 + 0x04, 0x36, 0x0D, 0x07, // 118:1078 + 0x04, 0x43, 0x0D, 0x07, // 119:1091 + 0x04, 0x50, 0x0E, 0x07, // 120:1104 + 0x04, 0x5E, 0x0D, 0x07, // 121:1118 + 0x04, 0x6B, 0x0E, 0x07, // 122:1131 + 0x04, 0x79, 0x0E, 0x07, // 123:1145 + 0x04, 0x87, 0x08, 0x07, // 124:1159 + 0x04, 0x8F, 0x0D, 0x07, // 125:1167 + + // Font Data: + 0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x06,0xF8,0x06, // 33 + 0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x38, // 34 + 0x00,0x01,0x20,0x07,0xF0,0x01,0x38,0x07,0xE0,0x03,0x38,0x01,0x20, // 35 + 0x00,0x00,0x60,0x02,0xD0,0x04,0xF8,0x1F,0xD0,0x04,0x80,0x03, // 36 + 0x38,0x01,0x28,0x01,0xB8,0x00,0x40,0x07,0x40,0x05,0x20,0x07, // 37 + 0x00,0x00,0x80,0x03,0xB8,0x07,0xF8,0x04,0x88,0x07,0x00,0x06,0x80,0x07, // 38 + 0x00,0x00,0x00,0x00,0x00,0x00,0x38, // 39 + 0x00,0x00,0x00,0x00,0xE0,0x01,0xF8,0x07,0x0C,0x0C, // 40 + 0x00,0x00,0x00,0x00,0x0C,0x0C,0xF8,0x07,0xE0,0x01, // 41 + 0x00,0x00,0x90,0x00,0x60,0x00,0xF8,0x01,0x60,0x00,0x90, // 42 + 0x00,0x00,0x80,0x00,0x80,0x00,0xE0,0x03,0x80,0x00,0x80, // 43 + 0x00,0x00,0x00,0x10,0x00,0x0E,0x00,0x06, // 44 + 0x00,0x00,0x00,0x00,0x80,0x01,0x80,0x01,0x80,0x01, // 45 + 0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x06, // 46 + 0x00,0x00,0x00,0x08,0x00,0x06,0xC0,0x01,0x30,0x00,0x08, // 47 + 0x00,0x00,0xF0,0x03,0xF8,0x07,0x08,0x04,0x48,0x04,0xF8,0x07,0xF0,0x03, // 48 + 0x00,0x00,0x08,0x04,0x08,0x04,0xF8,0x07,0xF8,0x07,0x00,0x04,0x00,0x04, // 49 + 0x00,0x00,0x08,0x04,0x08,0x06,0x08,0x05,0xC8,0x04,0x78,0x04,0x30,0x04, // 50 + 0x00,0x00,0x08,0x04,0x48,0x04,0x48,0x04,0x48,0x04,0xB8,0x07,0xB0,0x03, // 51 + 0x00,0x00,0x80,0x01,0x60,0x01,0x30,0x01,0xF8,0x07,0xF8,0x07,0x00,0x01, // 52 + 0x00,0x00,0x78,0x04,0x78,0x04,0x48,0x04,0x48,0x04,0xC8,0x07,0x88,0x03, // 53 + 0x00,0x00,0xE0,0x03,0xF8,0x07,0x58,0x04,0x48,0x04,0xC8,0x07,0x80,0x03, // 54 + 0x00,0x00,0x08,0x00,0x08,0x04,0x88,0x07,0xE8,0x03,0xF8,0x00,0x18, // 55 + 0x00,0x00,0xB0,0x03,0xB8,0x07,0x48,0x04,0x48,0x04,0xB8,0x07,0xB0,0x03, // 56 + 0x00,0x00,0x70,0x00,0xF8,0x04,0x88,0x04,0x88,0x06,0xF8,0x07,0xF0,0x01, // 57 + 0x00,0x00,0x00,0x00,0x60,0x06,0x60,0x06, // 58 + 0x00,0x00,0x00,0x10,0x60,0x0E,0x60,0x06, // 59 + 0x00,0x00,0x80,0x01,0x80,0x01,0xC0,0x03,0x40,0x02,0x40,0x02,0x60,0x06, // 60 + 0x00,0x00,0x40,0x01,0x40,0x01,0x40,0x01,0x40,0x01,0x40,0x01,0x40,0x01, // 61 + 0x00,0x00,0x60,0x06,0x40,0x02,0x40,0x02,0xC0,0x03,0x80,0x01,0x80,0x01, // 62 + 0x00,0x00,0x10,0x00,0xC8,0x06,0xB8,0x06,0x38, // 63 + 0xE0,0x03,0x10,0x04,0xC8,0x09,0x28,0x0A,0x28,0x0A,0xF0,0x0F, // 64 + 0x00,0x00,0x00,0x06,0xE0,0x07,0x78,0x01,0x78,0x01,0xE0,0x07,0x00,0x06, // 65 + 0x00,0x00,0xF8,0x07,0xF8,0x07,0x48,0x04,0x48,0x04,0xB8,0x07,0xB0,0x03, // 66 + 0x00,0x00,0xE0,0x01,0xF0,0x03,0x18,0x06,0x08,0x04,0x08,0x04,0x10,0x02, // 67 + 0x00,0x00,0xF8,0x07,0xF8,0x07,0x08,0x04,0x08,0x04,0xF8,0x07,0xE0,0x01, // 68 + 0x00,0x00,0xF8,0x07,0xF8,0x07,0x48,0x04,0x48,0x04,0x48,0x04,0x08,0x04, // 69 + 0x00,0x00,0xF8,0x07,0xF8,0x07,0x48,0x00,0x48,0x00,0x48,0x00,0x08, // 70 + 0x00,0x00,0xE0,0x01,0xF0,0x03,0x18,0x06,0x88,0x04,0x88,0x07,0x90,0x07, // 71 + 0x00,0x00,0xF8,0x07,0xF8,0x07,0x40,0x00,0x40,0x00,0xF8,0x07,0xF8,0x07, // 72 + 0x00,0x00,0x08,0x04,0x08,0x04,0xF8,0x07,0xF8,0x07,0x08,0x04,0x08,0x04, // 73 + 0x00,0x00,0x00,0x02,0x00,0x04,0x08,0x04,0x08,0x04,0xF8,0x07,0xF8,0x03, // 74 + 0x00,0x00,0xF8,0x07,0xF8,0x07,0xC0,0x00,0xF0,0x01,0x18,0x07,0x08,0x06, // 75 + 0x00,0x00,0xF8,0x07,0xF8,0x07,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04, // 76 + 0x00,0x00,0xF8,0x07,0xF0,0x07,0xE0,0x00,0xE0,0x00,0xF0,0x07,0xF8,0x07, // 77 + 0x00,0x00,0xF8,0x07,0xF8,0x07,0x70,0x00,0x80,0x03,0xF8,0x07,0xF8,0x07, // 78 + 0x00,0x00,0xF0,0x03,0xF8,0x07,0x08,0x04,0x08,0x04,0xF8,0x07,0xF0,0x03, // 79 + 0x00,0x00,0xF8,0x07,0xF8,0x07,0x88,0x00,0x88,0x00,0xF8,0x00,0x70, // 80 + 0x00,0x00,0xF0,0x03,0xF8,0x07,0x08,0x04,0x08,0x04,0xF8,0x0F,0xF0,0x03, // 81 + 0x00,0x00,0xF8,0x07,0xF8,0x07,0x88,0x00,0x88,0x00,0x78,0x03,0x70,0x06, // 82 + 0x00,0x00,0x70,0x02,0x78,0x04,0xC8,0x04,0xC8,0x04,0x88,0x07,0x90,0x03, // 83 + 0x00,0x00,0x08,0x00,0x08,0x00,0xF8,0x07,0xF8,0x07,0x08,0x00,0x08, // 84 + 0x00,0x00,0xF8,0x03,0xF8,0x07,0x00,0x04,0x00,0x04,0xF8,0x07,0xF8,0x03, // 85 + 0x00,0x00,0x18,0x00,0xF8,0x01,0x80,0x07,0x80,0x07,0xF8,0x01,0x18, // 86 + 0x78,0x00,0xF8,0x07,0x80,0x07,0x60,0x00,0x80,0x07,0xF8,0x07,0x78, // 87 + 0x00,0x00,0x08,0x04,0x38,0x07,0xE0,0x01,0xE0,0x01,0x38,0x07,0x08,0x04, // 88 + 0x00,0x00,0x08,0x00,0x78,0x00,0xE0,0x07,0xE0,0x07,0x78,0x00,0x08, // 89 + 0x00,0x00,0x08,0x06,0x08,0x07,0xC8,0x05,0x68,0x04,0x38,0x04,0x18,0x04, // 90 + 0x00,0x00,0x00,0x00,0xFC,0x0F,0xFC,0x0F,0x04,0x08, // 91 + 0x00,0x00,0x08,0x00,0x30,0x00,0xC0,0x01,0x00,0x06,0x00,0x08, // 92 + 0x00,0x00,0x00,0x00,0x04,0x08,0xFC,0x0F,0xFC,0x0F, // 93 + 0x20,0x00,0x30,0x00,0x18,0x00,0x18,0x00,0x30,0x00,0x20, // 94 + 0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20, // 95 + 0x00,0x00,0x04,0x00,0x0C,0x00,0x08, // 96 + 0x00,0x00,0x00,0x03,0xA0,0x07,0xA0,0x04,0xA0,0x04,0xE0,0x07,0xC0,0x07, // 97 + 0x00,0x00,0xFC,0x07,0xFC,0x07,0x20,0x04,0x20,0x04,0xE0,0x07,0xC0,0x03, // 98 + 0x00,0x00,0xC0,0x03,0xE0,0x07,0x60,0x06,0x20,0x04,0x20,0x04,0x20,0x04, // 99 + 0x00,0x00,0xC0,0x03,0xE0,0x07,0x20,0x04,0x20,0x04,0xFC,0x07,0xFC,0x07, // 100 + 0x00,0x00,0xC0,0x03,0xE0,0x07,0xA0,0x04,0xA0,0x04,0xE0,0x04,0xC0,0x04, // 101 + 0x00,0x00,0x20,0x00,0xF8,0x07,0xFC,0x07,0x24,0x00,0x24, // 102 + 0x00,0x00,0xC0,0x03,0xE0,0x17,0x20,0x14,0x20,0x14,0xE0,0x1F,0xE0,0x0F, // 103 + 0x00,0x00,0xFC,0x07,0xFC,0x07,0x20,0x00,0x20,0x00,0xE0,0x07,0xC0,0x07, // 104 + 0x00,0x00,0x20,0x04,0x20,0x04,0xEC,0x07,0xEC,0x07,0x00,0x04,0x00,0x04, // 105 + 0x00,0x00,0x20,0x10,0x20,0x10,0xEC,0x1F,0xEC,0x0F, // 106 + 0x00,0x00,0xFC,0x07,0xFC,0x07,0x80,0x00,0xE0,0x03,0x20,0x06,0x00,0x04, // 107 + 0x04,0x00,0x04,0x00,0xFC,0x03,0xFC,0x07,0x00,0x04,0x00,0x04, // 108 + 0x00,0x00,0xE0,0x07,0xE0,0x07,0x20,0x00,0xE0,0x07,0x20,0x00,0xE0,0x07, // 109 + 0x00,0x00,0xE0,0x07,0xE0,0x07,0x20,0x00,0x20,0x00,0xE0,0x07,0xC0,0x07, // 110 + 0x00,0x00,0xC0,0x03,0xE0,0x07,0x20,0x04,0x20,0x04,0xE0,0x07,0xC0,0x03, // 111 + 0x00,0x00,0xE0,0x1F,0xE0,0x1F,0x20,0x04,0x20,0x04,0xE0,0x07,0xC0,0x03, // 112 + 0x00,0x00,0xC0,0x03,0xE0,0x07,0x20,0x04,0x20,0x04,0xE0,0x1F,0xE0,0x1F, // 113 + 0x00,0x00,0x00,0x00,0xE0,0x07,0xE0,0x07,0x20,0x00,0x20,0x00,0x20, // 114 + 0x00,0x00,0xC0,0x02,0xE0,0x04,0xA0,0x05,0xA0,0x05,0x20,0x07,0x40,0x03, // 115 + 0x20,0x00,0x20,0x00,0xF8,0x07,0xF8,0x07,0x20,0x04,0x20,0x04, // 116 + 0x00,0x00,0xE0,0x03,0xE0,0x07,0x00,0x04,0x00,0x04,0xE0,0x07,0xE0,0x07, // 117 + 0x00,0x00,0x60,0x00,0xE0,0x03,0x00,0x07,0x00,0x07,0xE0,0x03,0x60, // 118 + 0x60,0x00,0xE0,0x07,0x00,0x07,0x80,0x00,0x00,0x07,0xE0,0x07,0x60, // 119 + 0x00,0x00,0x20,0x04,0x60,0x06,0xC0,0x03,0xC0,0x03,0x60,0x06,0x20,0x04, // 120 + 0x00,0x00,0x20,0x10,0xE0,0x11,0x00,0x1F,0x80,0x07,0xE0,0x01,0x20, // 121 + 0x00,0x00,0x20,0x06,0x20,0x07,0x20,0x05,0xA0,0x04,0xE0,0x04,0x60,0x04, // 122 + 0x00,0x00,0x80,0x00,0x80,0x00,0x7C,0x0F,0x7C,0x0F,0x04,0x08,0x04,0x08, // 123 + 0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x1F, // 124 + 0x00,0x00,0x04,0x08,0x04,0x08,0x7C,0x0F,0x7C,0x0F,0x80,0x00,0x80, // 125 +}; + +const uint8_t font_Nimbus_Mono_L_Bold_20[] = { + 0x0C, // Width: 12 + 0x19, // Height: 25 + 0x20, // First Char: 32 + 0x5E, // Numbers of Chars: 94 + + // Jump Table: + 0xFF, 0xFF, 0x00, 0x0C, // 32:65535 + 0x00, 0x00, 0x1E, 0x0C, // 33:0 + 0x00, 0x1E, 0x22, 0x0C, // 34:30 + 0x00, 0x40, 0x2A, 0x0C, // 35:64 + 0x00, 0x6A, 0x26, 0x0C, // 36:106 + 0x00, 0x90, 0x27, 0x0C, // 37:144 + 0x00, 0xB7, 0x27, 0x0C, // 38:183 + 0x00, 0xDE, 0x1A, 0x0C, // 39:222 + 0x00, 0xF8, 0x23, 0x0C, // 40:248 + 0x01, 0x1B, 0x1B, 0x0C, // 41:283 + 0x01, 0x36, 0x26, 0x0C, // 42:310 + 0x01, 0x5C, 0x2A, 0x0C, // 43:348 + 0x01, 0x86, 0x1B, 0x0C, // 44:390 + 0x01, 0xA1, 0x2A, 0x0C, // 45:417 + 0x01, 0xCB, 0x1B, 0x0C, // 46:459 + 0x01, 0xE6, 0x25, 0x0C, // 47:486 + 0x02, 0x0B, 0x27, 0x0C, // 48:523 + 0x02, 0x32, 0x27, 0x0C, // 49:562 + 0x02, 0x59, 0x27, 0x0C, // 50:601 + 0x02, 0x80, 0x2B, 0x0C, // 51:640 + 0x02, 0xAB, 0x27, 0x0C, // 52:683 + 0x02, 0xD2, 0x2B, 0x0C, // 53:722 + 0x02, 0xFD, 0x2B, 0x0C, // 54:765 + 0x03, 0x28, 0x26, 0x0C, // 55:808 + 0x03, 0x4E, 0x27, 0x0C, // 56:846 + 0x03, 0x75, 0x2A, 0x0C, // 57:885 + 0x03, 0x9F, 0x1B, 0x0C, // 58:927 + 0x03, 0xBA, 0x1B, 0x0C, // 59:954 + 0x03, 0xD5, 0x2B, 0x0C, // 60:981 + 0x04, 0x00, 0x2A, 0x0C, // 61:1024 + 0x04, 0x2A, 0x2A, 0x0C, // 62:1066 + 0x04, 0x54, 0x26, 0x0C, // 63:1108 + 0x04, 0x7A, 0x27, 0x0C, // 64:1146 + 0x04, 0xA1, 0x2F, 0x0C, // 65:1185 + 0x04, 0xD0, 0x2B, 0x0C, // 66:1232 + 0x04, 0xFB, 0x2F, 0x0C, // 67:1275 + 0x05, 0x2A, 0x2A, 0x0C, // 68:1322 + 0x05, 0x54, 0x2B, 0x0C, // 69:1364 + 0x05, 0x7F, 0x2A, 0x0C, // 70:1407 + 0x05, 0xA9, 0x2E, 0x0C, // 71:1449 + 0x05, 0xD7, 0x2B, 0x0C, // 72:1495 + 0x06, 0x02, 0x27, 0x0C, // 73:1538 + 0x06, 0x29, 0x2E, 0x0C, // 74:1577 + 0x06, 0x57, 0x2F, 0x0C, // 75:1623 + 0x06, 0x86, 0x2B, 0x0C, // 76:1670 + 0x06, 0xB1, 0x2F, 0x0C, // 77:1713 + 0x06, 0xE0, 0x2E, 0x0C, // 78:1760 + 0x07, 0x0E, 0x2E, 0x0C, // 79:1806 + 0x07, 0x3C, 0x26, 0x0C, // 80:1852 + 0x07, 0x62, 0x2F, 0x0C, // 81:1890 + 0x07, 0x91, 0x2F, 0x0C, // 82:1937 + 0x07, 0xC0, 0x2B, 0x0C, // 83:1984 + 0x07, 0xEB, 0x2A, 0x0C, // 84:2027 + 0x08, 0x15, 0x2E, 0x0C, // 85:2069 + 0x08, 0x43, 0x2E, 0x0C, // 86:2115 + 0x08, 0x71, 0x2E, 0x0C, // 87:2161 + 0x08, 0x9F, 0x2F, 0x0C, // 88:2207 + 0x08, 0xCE, 0x2A, 0x0C, // 89:2254 + 0x08, 0xF8, 0x2B, 0x0C, // 90:2296 + 0x09, 0x23, 0x23, 0x0C, // 91:2339 + 0x09, 0x46, 0x27, 0x0C, // 92:2374 + 0x09, 0x6D, 0x1B, 0x0C, // 93:2413 + 0x09, 0x88, 0x26, 0x0C, // 94:2440 + 0x09, 0xAE, 0x2F, 0x0C, // 95:2478 + 0x09, 0xDD, 0x1A, 0x0C, // 96:2525 + 0x09, 0xF7, 0x2F, 0x0C, // 97:2551 + 0x0A, 0x26, 0x2B, 0x0C, // 98:2598 + 0x0A, 0x51, 0x2B, 0x0C, // 99:2641 + 0x0A, 0x7C, 0x2F, 0x0C, // 100:2684 + 0x0A, 0xAB, 0x2B, 0x0C, // 101:2731 + 0x0A, 0xD6, 0x2A, 0x0C, // 102:2774 + 0x0B, 0x00, 0x2E, 0x0C, // 103:2816 + 0x0B, 0x2E, 0x2B, 0x0C, // 104:2862 + 0x0B, 0x59, 0x2B, 0x0C, // 105:2905 + 0x0B, 0x84, 0x27, 0x0C, // 106:2948 + 0x0B, 0xAB, 0x2B, 0x0C, // 107:2987 + 0x0B, 0xD6, 0x2B, 0x0C, // 108:3030 + 0x0C, 0x01, 0x2F, 0x0C, // 109:3073 + 0x0C, 0x30, 0x2B, 0x0C, // 110:3120 + 0x0C, 0x5B, 0x2A, 0x0C, // 111:3163 + 0x0C, 0x85, 0x2B, 0x0C, // 112:3205 + 0x0C, 0xB0, 0x2F, 0x0C, // 113:3248 + 0x0C, 0xDF, 0x2E, 0x0C, // 114:3295 + 0x0D, 0x0D, 0x27, 0x0C, // 115:3341 + 0x0D, 0x34, 0x27, 0x0C, // 116:3380 + 0x0D, 0x5B, 0x2B, 0x0C, // 117:3419 + 0x0D, 0x86, 0x2E, 0x0C, // 118:3462 + 0x0D, 0xB4, 0x2E, 0x0C, // 119:3508 + 0x0D, 0xE2, 0x2B, 0x0C, // 120:3554 + 0x0E, 0x0D, 0x2A, 0x0C, // 121:3597 + 0x0E, 0x37, 0x27, 0x0C, // 122:3639 + 0x0E, 0x5E, 0x23, 0x0C, // 123:3678 + 0x0E, 0x81, 0x1B, 0x0C, // 124:3713 + 0x0E, 0x9C, 0x22, 0x0C, // 125:3740 + + // Font Data: + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x80,0x7F,0x06,0x00,0x80,0x7F,0x06,0x00,0x80,0x01, // 33 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x0F,0x00,0x00,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x0F,0x00,0x00,0x80,0x1F, // 34 + 0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xCC,0x00,0x00,0x00,0xFC,0x1F,0x00,0xE0,0xFF,0x0F,0x00,0xC0,0xCF,0x00,0x00,0x00,0xCC,0x0F,0x00,0xC0,0xFF,0x1F,0x00,0xE0,0xFF,0x00,0x00,0x00,0xCC,0x00,0x00,0x00,0x0C, // 35 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCE,0x03,0x00,0x00,0xDF,0x03,0x00,0x80,0x19,0x03,0x00,0xE0,0x19,0x1F,0x00,0xE0,0x19,0x1F,0x00,0x80,0x31,0x03,0x00,0x80,0xF7,0x01,0x00,0x00,0xE7, // 36 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x00,0x00,0x80,0x69,0x00,0x00,0x80,0x28,0x00,0x00,0x80,0xB8,0x03,0x00,0x00,0x77,0x04,0x00,0x00,0x50,0x04,0x00,0x00,0xD8,0x04,0x00,0x00,0x88,0x03, // 37 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x03,0x00,0x00,0xFE,0x07,0x00,0x00,0x7F,0x06,0x00,0x00,0xF3,0x06,0x00,0x00,0xC3,0x07,0x00,0x00,0x87,0x07,0x00,0x00,0xE3,0x07,0x00,0x00,0xE0,0x06, // 38 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x0F,0x00,0x00,0x80,0x1F, // 39 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x03,0x00,0x00,0xFE,0x0F,0x00,0x80,0x07,0x3E,0x00,0x80,0x01,0x30, // 40 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x30,0x00,0x80,0x07,0x3E,0x00,0x00,0xFE,0x0F,0x00,0x00,0xF8,0x03, // 41 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x7E,0x00,0x00,0x80,0x1F,0x00,0x00,0x80,0x1F,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x06, // 42 + 0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0xFF,0x07,0x00,0x00,0xFF,0x07,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30, // 43 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x01, // 44 + 0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30, // 45 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x07, // 46 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1F,0x00,0x00,0xC0,0x07,0x00,0x00,0xF0,0x01,0x00,0x00,0x3C,0x00,0x00,0x00,0x0F,0x00,0x00,0xC0,0x03,0x00,0x00,0xE0, // 47 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x01,0x00,0x00,0xFF,0x03,0x00,0x80,0x03,0x07,0x00,0x80,0x01,0x06,0x00,0x80,0x01,0x06,0x00,0x80,0x03,0x07,0x00,0x00,0xFF,0x03,0x00,0x00,0xFE,0x01, // 48 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x06,0x00,0x80,0x01,0x06,0x00,0x80,0x01,0x06,0x00,0x80,0xFF,0x07,0x00,0xC0,0xFF,0x07,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06, // 49 + 0x00,0x00,0x00,0x00,0x00,0x04,0x06,0x00,0x00,0x07,0x07,0x00,0x00,0x83,0x07,0x00,0x80,0xC1,0x07,0x00,0x80,0xE1,0x06,0x00,0x80,0x61,0x06,0x00,0x80,0x33,0x06,0x00,0x00,0x1F,0x07,0x00,0x00,0x0E,0x07, // 50 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x03,0x07,0x00,0x80,0x03,0x06,0x00,0x80,0x11,0x06,0x00,0x80,0x11,0x06,0x00,0x80,0x31,0x06,0x00,0x80,0x39,0x07,0x00,0x00,0xEF,0x03,0x00,0x00,0xCE,0x01, // 51 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0xDC,0x00,0x00,0x00,0xCF,0x06,0x00,0x80,0xC3,0x06,0x00,0x80,0xFF,0x07,0x00,0x80,0xFF,0x07,0x00,0x00,0xC0,0x06, // 52 + 0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x80,0x3F,0x07,0x00,0x80,0x3F,0x06,0x00,0x80,0x19,0x06,0x00,0x80,0x19,0x06,0x00,0x80,0x19,0x06,0x00,0x80,0x19,0x06,0x00,0x80,0x39,0x07,0x00,0x80,0xF1,0x03,0x00,0x00,0xE0,0x01, // 53 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0xFC,0x01,0x00,0x00,0xFE,0x03,0x00,0x00,0x3B,0x07,0x00,0x80,0x1B,0x06,0x00,0x80,0x19,0x06,0x00,0x80,0x39,0x07,0x00,0x80,0xF1,0x03,0x00,0x80,0xE1,0x01, // 54 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x07,0x00,0x80,0xE1,0x07,0x00,0x80,0xF9,0x01,0x00,0x80,0x3F,0x00,0x00,0x80,0x07, // 55 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCE,0x01,0x00,0x00,0xFF,0x03,0x00,0x80,0x71,0x06,0x00,0x80,0x31,0x06,0x00,0x80,0x31,0x06,0x00,0x80,0x71,0x06,0x00,0x00,0xFF,0x03,0x00,0x00,0xCE,0x01, // 56 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x06,0x00,0x00,0x1F,0x06,0x00,0x80,0x31,0x06,0x00,0x80,0x31,0x06,0x00,0x80,0x31,0x07,0x00,0x80,0xB1,0x03,0x00,0x00,0xFF,0x01,0x00,0x00,0xFF,0x00,0x00,0x00,0x18, // 57 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x07,0x00,0x00,0x1C,0x07, // 58 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x0C,0x1F,0x00,0x00,0x1C,0x07,0x00,0x00,0x0C,0x01, // 59 + 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0xD8,0x00,0x00,0x00,0xD8,0x00,0x00,0x00,0x8C,0x01,0x00,0x00,0x8C,0x01,0x00,0x00,0x06,0x03,0x00,0x00,0x06,0x03, // 60 + 0x00,0x00,0x00,0x00,0x00,0xD8,0x00,0x00,0x00,0xD8,0x00,0x00,0x00,0xD8,0x00,0x00,0x00,0xD8,0x00,0x00,0x00,0xD8,0x00,0x00,0x00,0xD8,0x00,0x00,0x00,0xD8,0x00,0x00,0x00,0xD8,0x00,0x00,0x00,0xD8,0x00,0x00,0x00,0xD8, // 61 + 0x00,0x00,0x00,0x00,0x00,0x06,0x03,0x00,0x00,0x06,0x03,0x00,0x00,0x8C,0x01,0x00,0x00,0x8C,0x01,0x00,0x00,0xD8,0x00,0x00,0x00,0xD8,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20, // 62 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x80,0x07,0x00,0x00,0x80,0x01,0x06,0x00,0x80,0x61,0x07,0x00,0x80,0x71,0x06,0x00,0x80,0x33,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x0E, // 63 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x07,0x00,0x80,0xFF,0x1F,0x00,0x80,0xE3,0x3C,0x00,0xC0,0xF0,0x31,0x00,0xC0,0x18,0x33,0x00,0xC0,0x19,0x33,0x00,0x80,0xFF,0x1B,0x00,0x00,0xFF,0x1F, // 64 + 0x00,0x00,0x06,0x00,0x00,0x00,0x07,0x00,0x80,0xE1,0x07,0x00,0x80,0xFD,0x06,0x00,0x80,0xFF,0x06,0x00,0x80,0xC7,0x00,0x00,0x80,0xC7,0x00,0x00,0x00,0xFF,0x06,0x00,0x00,0xF8,0x06,0x00,0x00,0xE0,0x07,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x06, // 65 + 0x00,0x00,0x00,0x00,0x80,0x01,0x06,0x00,0x80,0xFF,0x07,0x00,0x80,0xFF,0x07,0x00,0x80,0x31,0x06,0x00,0x80,0x31,0x06,0x00,0x80,0x31,0x06,0x00,0x80,0x39,0x06,0x00,0x00,0x7F,0x06,0x00,0x00,0xEE,0x03,0x00,0x00,0xC0,0x01, // 66 + 0x00,0x00,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0xFE,0x01,0x00,0x00,0x87,0x03,0x00,0x80,0x03,0x07,0x00,0x80,0x01,0x06,0x00,0x80,0x01,0x06,0x00,0x80,0x01,0x06,0x00,0x80,0x01,0x06,0x00,0x00,0x07,0x07,0x00,0x80,0x0F,0x03,0x00,0x00,0x00,0x01, // 67 + 0x80,0x01,0x06,0x00,0x80,0xFF,0x07,0x00,0x80,0xFF,0x07,0x00,0x80,0x01,0x06,0x00,0x80,0x01,0x06,0x00,0x80,0x01,0x06,0x00,0x80,0x01,0x06,0x00,0x80,0x03,0x06,0x00,0x00,0x07,0x03,0x00,0x00,0xFE,0x01,0x00,0x00,0xFC, // 68 + 0x00,0x00,0x00,0x00,0x80,0x01,0x06,0x00,0x80,0xFF,0x07,0x00,0x80,0xFF,0x07,0x00,0x80,0x31,0x06,0x00,0x80,0x31,0x06,0x00,0x80,0x7D,0x06,0x00,0x80,0x79,0x06,0x00,0x80,0x01,0x06,0x00,0x80,0x87,0x07,0x00,0x80,0x87,0x07, // 69 + 0x00,0x00,0x00,0x00,0x80,0x01,0x06,0x00,0x80,0xFF,0x07,0x00,0x80,0xFF,0x07,0x00,0x80,0x31,0x06,0x00,0x80,0x31,0x06,0x00,0x80,0xFD,0x06,0x00,0x80,0x79,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x07,0x00,0x00,0x80,0x07, // 70 + 0x00,0x00,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0xFE,0x03,0x00,0x00,0x07,0x03,0x00,0x80,0x03,0x06,0x00,0x80,0x01,0x06,0x00,0x80,0x61,0x06,0x00,0x80,0x61,0x06,0x00,0x80,0x61,0x06,0x00,0x80,0xE7,0x03,0x00,0x80,0xE7,0x03,0x00,0x00,0x60, // 71 + 0x00,0x00,0x00,0x00,0x80,0x01,0x06,0x00,0x80,0xFF,0x07,0x00,0x80,0xFF,0x07,0x00,0x80,0x31,0x06,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x80,0x31,0x06,0x00,0x80,0xFF,0x07,0x00,0x80,0xFF,0x07,0x00,0x80,0x01,0x06, // 72 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x06,0x00,0x80,0x01,0x06,0x00,0x80,0x01,0x06,0x00,0x80,0xFF,0x07,0x00,0x80,0xFF,0x07,0x00,0x80,0x01,0x06,0x00,0x80,0x01,0x06,0x00,0x80,0x01,0x06, // 73 + 0x00,0x00,0x00,0x00,0x00,0xE0,0x03,0x00,0x00,0xE0,0x03,0x00,0x00,0x00,0x06,0x00,0x80,0x01,0x06,0x00,0x80,0x01,0x06,0x00,0x80,0x01,0x06,0x00,0x80,0x01,0x07,0x00,0x80,0xFF,0x03,0x00,0x80,0xFF,0x01,0x00,0x80,0x01,0x00,0x00,0x80,0x01, // 74 + 0x00,0x00,0x00,0x00,0x80,0x01,0x06,0x00,0x80,0xFF,0x07,0x00,0x80,0xFF,0x07,0x00,0x80,0x31,0x06,0x00,0x80,0x39,0x06,0x00,0x00,0x7C,0x00,0x00,0x80,0xEF,0x00,0x00,0x80,0xC7,0x07,0x00,0x80,0x83,0x07,0x00,0x80,0x01,0x06,0x00,0x00,0x00,0x06, // 75 + 0x00,0x00,0x00,0x00,0x80,0x01,0x06,0x00,0x80,0x01,0x06,0x00,0x80,0xFF,0x07,0x00,0x80,0xFF,0x07,0x00,0x80,0x01,0x06,0x00,0x80,0x01,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0xC0,0x07,0x00,0x00,0xC0,0x07, // 76 + 0x80,0x01,0x06,0x00,0x80,0xFF,0x07,0x00,0x80,0xFF,0x07,0x00,0x80,0x0F,0x06,0x00,0x00,0x7C,0x06,0x00,0x00,0xF0,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x7C,0x06,0x00,0x80,0x0F,0x06,0x00,0x80,0xFF,0x07,0x00,0x80,0xFF,0x07,0x00,0x80,0x01,0x06, // 77 + 0x80,0x01,0x06,0x00,0x80,0xFF,0x07,0x00,0x80,0xFF,0x07,0x00,0x00,0x0F,0x06,0x00,0x00,0x1E,0x06,0x00,0x00,0x3C,0x00,0x00,0x00,0xF0,0x00,0x00,0x80,0xE1,0x01,0x00,0x80,0xC1,0x03,0x00,0x80,0xFF,0x07,0x00,0x80,0xFF,0x07,0x00,0x80,0x01, // 78 + 0x00,0x78,0x00,0x00,0x00,0xFE,0x01,0x00,0x00,0x87,0x03,0x00,0x00,0x03,0x03,0x00,0x80,0x01,0x06,0x00,0x80,0x01,0x06,0x00,0x80,0x01,0x06,0x00,0x80,0x01,0x06,0x00,0x00,0x03,0x03,0x00,0x00,0x87,0x03,0x00,0x00,0xFE,0x01,0x00,0x00,0x78, // 79 + 0x80,0x00,0x00,0x00,0x80,0x01,0x06,0x00,0x80,0xFF,0x07,0x00,0x80,0xFF,0x07,0x00,0x80,0x61,0x06,0x00,0x80,0x61,0x06,0x00,0x80,0x61,0x06,0x00,0x80,0x73,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x1E, // 80 + 0x00,0xF8,0x00,0x00,0x00,0xFE,0x01,0x00,0x00,0x87,0x13,0x00,0x00,0x03,0x1F,0x00,0x80,0x01,0x1E,0x00,0x80,0x01,0x1E,0x00,0x80,0x01,0x1E,0x00,0x80,0x01,0x1E,0x00,0x00,0x03,0x1B,0x00,0x00,0x87,0x1B,0x00,0x00,0xFE,0x19,0x00,0x00,0x78,0x08, // 81 + 0x80,0x00,0x00,0x00,0x80,0x01,0x06,0x00,0x80,0xFF,0x07,0x00,0x80,0xFF,0x07,0x00,0x80,0x61,0x06,0x00,0x80,0x61,0x06,0x00,0x80,0xE1,0x00,0x00,0x80,0xF3,0x01,0x00,0x00,0xBF,0x03,0x00,0x00,0x1E,0x07,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06, // 82 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8E,0x07,0x00,0x00,0x9F,0x03,0x00,0x80,0x3B,0x07,0x00,0x80,0x31,0x06,0x00,0x80,0x31,0x06,0x00,0x80,0x31,0x06,0x00,0x80,0x73,0x07,0x00,0x80,0xE7,0x03,0x00,0x80,0xC7,0x01, // 83 + 0x00,0x00,0x00,0x00,0x80,0x0F,0x00,0x00,0x80,0x0F,0x00,0x00,0x80,0x01,0x06,0x00,0x80,0x01,0x06,0x00,0x80,0xFF,0x07,0x00,0x80,0xFF,0x07,0x00,0x80,0x01,0x06,0x00,0x80,0x01,0x06,0x00,0x80,0x0F,0x00,0x00,0x80,0x0F, // 84 + 0x80,0x01,0x00,0x00,0x80,0xFF,0x01,0x00,0x80,0xFF,0x03,0x00,0x80,0x01,0x03,0x00,0x80,0x01,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x80,0x01,0x06,0x00,0x80,0x01,0x03,0x00,0x80,0xFF,0x03,0x00,0x80,0xFF,0x01,0x00,0x80,0x01, // 85 + 0x80,0x01,0x00,0x00,0x80,0x03,0x00,0x00,0x80,0x1F,0x00,0x00,0x80,0x7D,0x00,0x00,0x80,0xF1,0x03,0x00,0x00,0x80,0x07,0x00,0x00,0x80,0x07,0x00,0x80,0xE1,0x03,0x00,0x80,0x7D,0x00,0x00,0x80,0x1F,0x00,0x00,0x80,0x03,0x00,0x00,0x80,0x01, // 86 + 0x80,0x01,0x00,0x00,0x80,0x7F,0x00,0x00,0x80,0xFF,0x07,0x00,0x80,0x81,0x07,0x00,0x80,0xF1,0x03,0x00,0x00,0x7C,0x00,0x00,0x00,0x7C,0x00,0x00,0x80,0xF9,0x03,0x00,0x80,0xC1,0x07,0x00,0x80,0xFF,0x07,0x00,0x80,0x7F,0x00,0x00,0x80,0x01, // 87 + 0x00,0x01,0x06,0x00,0x80,0x01,0x06,0x00,0x80,0x03,0x07,0x00,0x80,0xC7,0x07,0x00,0x80,0xFD,0x06,0x00,0x00,0x78,0x00,0x00,0x00,0x78,0x00,0x00,0x80,0xFF,0x06,0x00,0x80,0xC7,0x07,0x00,0x80,0x03,0x07,0x00,0x80,0x01,0x06,0x00,0x00,0x00,0x06, // 88 + 0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x03,0x06,0x00,0x80,0x0F,0x06,0x00,0x80,0x1D,0x06,0x00,0x00,0xF8,0x07,0x00,0x00,0xF8,0x07,0x00,0x80,0x1D,0x06,0x00,0x80,0x0F,0x06,0x00,0x80,0x03,0x06,0x00,0x80,0x01, // 89 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x0F,0x07,0x00,0x80,0x8F,0x07,0x00,0x80,0xC1,0x07,0x00,0x80,0x71,0x06,0x00,0x80,0x39,0x06,0x00,0x80,0x1D,0x06,0x00,0x80,0x0F,0x06,0x00,0x80,0xC7,0x07,0x00,0x80,0xC3,0x07, // 90 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0x3F,0x00,0x80,0xFF,0x3F,0x00,0x80,0x01,0x30,0x00,0x80,0x01,0x30, // 91 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xC0,0x03,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0xF0,0x01,0x00,0x00,0xC0,0x07,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x1C, // 92 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x30,0x00,0x80,0x01,0x30,0x00,0x80,0xFF,0x3F,0x00,0x80,0xFF,0x3F, // 93 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x07,0x00,0x00,0xC0,0x03,0x00,0x00,0x80,0x03,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0C, // 94 + 0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10, // 95 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x01, // 96 + 0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0xC8,0x03,0x00,0x00,0xEC,0x06,0x00,0x00,0x6C,0x06,0x00,0x00,0x6C,0x06,0x00,0x00,0x6C,0x06,0x00,0x00,0x6C,0x07,0x00,0x00,0xFC,0x07,0x00,0x00,0xF8,0x07,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x02, // 97 + 0x80,0x01,0x06,0x00,0x80,0xFF,0x07,0x00,0x80,0xFF,0x07,0x00,0x00,0x18,0x03,0x00,0x00,0x0C,0x06,0x00,0x00,0x0C,0x06,0x00,0x00,0x0C,0x06,0x00,0x00,0x0C,0x06,0x00,0x00,0x18,0x03,0x00,0x00,0xF8,0x03,0x00,0x00,0xF0,0x01, // 98 + 0x00,0x00,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0xF8,0x03,0x00,0x00,0x18,0x07,0x00,0x00,0x0C,0x06,0x00,0x00,0x0C,0x06,0x00,0x00,0x0C,0x06,0x00,0x00,0x0C,0x06,0x00,0x00,0x1C,0x06,0x00,0x00,0x3C,0x07,0x00,0x00,0x3C,0x03, // 99 + 0x00,0x00,0x00,0x00,0x00,0xF0,0x01,0x00,0x00,0xF8,0x03,0x00,0x00,0x18,0x03,0x00,0x00,0x0C,0x06,0x00,0x00,0x0C,0x06,0x00,0x00,0x0C,0x06,0x00,0x80,0x0C,0x06,0x00,0x80,0x19,0x03,0x00,0x80,0xFF,0x07,0x00,0x80,0xFF,0x07,0x00,0x00,0x00,0x06, // 100 + 0x00,0x00,0x00,0x00,0x00,0xF0,0x01,0x00,0x00,0xF8,0x03,0x00,0x00,0xDC,0x06,0x00,0x00,0xCC,0x06,0x00,0x00,0xCC,0x06,0x00,0x00,0xCC,0x06,0x00,0x00,0xCC,0x06,0x00,0x00,0xD8,0x06,0x00,0x00,0xF8,0x06,0x00,0x00,0xE0,0x02, // 101 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x06,0x00,0x00,0x0C,0x06,0x00,0x00,0xFF,0x07,0x00,0x80,0xFF,0x07,0x00,0x80,0x0D,0x06,0x00,0x80,0x0D,0x06,0x00,0x80,0x0D,0x06,0x00,0x80,0x0D,0x06,0x00,0x80,0x01, // 102 + 0x00,0x00,0x00,0x00,0x00,0xF0,0x01,0x00,0x00,0xF8,0x03,0x00,0x00,0x1C,0x67,0x00,0x00,0x0C,0x66,0x00,0x00,0x0C,0x66,0x00,0x00,0x0C,0x66,0x00,0x00,0x18,0x63,0x00,0x00,0xFC,0x3F,0x00,0x00,0xFC,0x1F,0x00,0x00,0x0C,0x00,0x00,0x00,0x08, // 103 + 0x80,0x00,0x00,0x00,0x80,0x01,0x06,0x00,0x80,0xFF,0x07,0x00,0x80,0xFF,0x07,0x00,0x00,0x18,0x06,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x06,0x00,0x00,0xFC,0x07,0x00,0x00,0xF8,0x07,0x00,0x00,0x00,0x06, // 104 + 0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x0C,0x06,0x00,0x00,0x0C,0x06,0x00,0x80,0x0D,0x06,0x00,0x80,0xFD,0x07,0x00,0x00,0xFC,0x07,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06, // 105 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x60,0x00,0x00,0x0C,0x60,0x00,0x00,0x0C,0x60,0x00,0x00,0x0C,0x60,0x00,0x80,0x0D,0x60,0x00,0x80,0x0D,0x70,0x00,0x00,0xFC,0x3F,0x00,0x00,0xFC,0x1F, // 106 + 0x80,0x00,0x06,0x00,0x80,0x00,0x06,0x00,0x80,0xFF,0x07,0x00,0x80,0xFF,0x07,0x00,0x00,0x60,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0xBC,0x07,0x00,0x00,0x9C,0x07,0x00,0x00,0x0C,0x07,0x00,0x00,0x0C,0x06,0x00,0x00,0x00,0x06, // 107 + 0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x80,0x01,0x06,0x00,0x80,0x01,0x06,0x00,0x80,0x01,0x06,0x00,0x80,0xFF,0x07,0x00,0x80,0xFF,0x07,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06, // 108 + 0x00,0x0C,0x06,0x00,0x00,0xFC,0x07,0x00,0x00,0xFC,0x07,0x00,0x00,0x0C,0x06,0x00,0x00,0x0C,0x00,0x00,0x00,0xFC,0x07,0x00,0x00,0xF8,0x07,0x00,0x00,0x0C,0x06,0x00,0x00,0x0C,0x00,0x00,0x00,0xFC,0x07,0x00,0x00,0xF8,0x07,0x00,0x00,0x00,0x06, // 109 + 0x00,0x00,0x00,0x00,0x00,0x0C,0x06,0x00,0x00,0xFC,0x07,0x00,0x00,0xFC,0x07,0x00,0x00,0x18,0x06,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x06,0x00,0x00,0xFC,0x07,0x00,0x00,0xF8,0x07,0x00,0x00,0x00,0x06, // 110 + 0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0xF8,0x03,0x00,0x00,0x18,0x03,0x00,0x00,0x0C,0x06,0x00,0x00,0x0C,0x06,0x00,0x00,0x0C,0x06,0x00,0x00,0x0C,0x06,0x00,0x00,0x18,0x03,0x00,0x00,0xF8,0x03,0x00,0x00,0xE0, // 111 + 0x00,0x0C,0x60,0x00,0x00,0xFC,0x7F,0x00,0x00,0xFC,0x7F,0x00,0x00,0x18,0x63,0x00,0x00,0x0C,0x66,0x00,0x00,0x0C,0x06,0x00,0x00,0x0C,0x06,0x00,0x00,0x0C,0x06,0x00,0x00,0x18,0x03,0x00,0x00,0xF8,0x03,0x00,0x00,0xE0,0x01, // 112 + 0x00,0x00,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0xF8,0x03,0x00,0x00,0x18,0x03,0x00,0x00,0x0C,0x06,0x00,0x00,0x0C,0x06,0x00,0x00,0x0C,0x06,0x00,0x00,0x0C,0x66,0x00,0x00,0x18,0x63,0x00,0x00,0xFC,0x7F,0x00,0x00,0xFC,0x7F,0x00,0x00,0x0C,0x60, // 113 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x06,0x00,0x00,0x0C,0x06,0x00,0x00,0xFC,0x07,0x00,0x00,0xFC,0x07,0x00,0x00,0x18,0x06,0x00,0x00,0x18,0x06,0x00,0x00,0x0C,0x06,0x00,0x00,0x0C,0x06,0x00,0x00,0x0C,0x00,0x00,0x00,0x08, // 114 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x07,0x00,0x00,0x7C,0x07,0x00,0x00,0x6C,0x06,0x00,0x00,0x6C,0x06,0x00,0x00,0x6C,0x06,0x00,0x00,0xCC,0x06,0x00,0x00,0xDC,0x03,0x00,0x00,0x9C,0x03, // 115 + 0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x80,0xFF,0x03,0x00,0x80,0xFF,0x07,0x00,0x00,0x0C,0x06,0x00,0x00,0x0C,0x06,0x00,0x00,0x0C,0x06,0x00,0x00,0x0C,0x06,0x00,0x00,0x0C,0x07,0x00,0x00,0x00,0x03, // 116 + 0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0xFC,0x03,0x00,0x00,0xFC,0x07,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x0C,0x06,0x00,0x00,0x0C,0x03,0x00,0x00,0xFC,0x07,0x00,0x00,0xFC,0x07,0x00,0x00,0x00,0x06, // 117 + 0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0xEC,0x03,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x07,0x00,0x00,0xEC,0x03,0x00,0x00,0xFC,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C, // 118 + 0x00,0x0C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0xFC,0x03,0x00,0x00,0xEC,0x07,0x00,0x00,0xC0,0x07,0x00,0x00,0xF0,0x01,0x00,0x00,0xF0,0x01,0x00,0x00,0xE0,0x07,0x00,0x00,0xCC,0x07,0x00,0x00,0xFC,0x03,0x00,0x00,0x3C,0x00,0x00,0x00,0x0C, // 119 + 0x00,0x00,0x00,0x00,0x00,0x0C,0x06,0x00,0x00,0x1C,0x07,0x00,0x00,0xBC,0x07,0x00,0x00,0xFC,0x07,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xFC,0x07,0x00,0x00,0x9C,0x07,0x00,0x00,0x1C,0x07,0x00,0x00,0x0C,0x06, // 120 + 0x00,0x00,0x00,0x00,0x00,0x0C,0x60,0x00,0x00,0x3C,0x60,0x00,0x00,0xFC,0x60,0x00,0x00,0xCC,0x7B,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x6F,0x00,0x00,0xCC,0x03,0x00,0x00,0xFC,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x0C, // 121 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x06,0x00,0x00,0x1C,0x07,0x00,0x00,0xCC,0x07,0x00,0x00,0xEC,0x06,0x00,0x00,0x7C,0x06,0x00,0x00,0x3C,0x06,0x00,0x00,0x1C,0x07,0x00,0x00,0x0C,0x07, // 122 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xFF,0x1F,0x00,0x80,0xFF,0x3F,0x00,0x80,0x01,0x30,0x00,0x80,0x00,0x30, // 123 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0x3F,0x00,0x80,0xFF,0x3F, // 124 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x30,0x00,0x80,0x01,0x30,0x00,0x80,0xBF,0x3F,0x00,0x00,0xFF,0x1F,0x00,0x00,0x60,0x00,0x00,0x00,0x40, // 125 +}; + +const uint8_t font_DialogInput_Bold_24[] = { + 0x0E, // Width: 14 + 0x1D, // Height: 29 + 0x20, // First Char: 32 + 0x5E, // Numbers of Chars: 94 + + // Jump Table: + 0xFF, 0xFF, 0x00, 0x0E, // 32:65535 + 0x00, 0x00, 0x23, 0x0E, // 33:0 + 0x00, 0x23, 0x2E, 0x0E, // 34:35 + 0x00, 0x51, 0x36, 0x0E, // 35:81 + 0x00, 0x87, 0x33, 0x0E, // 36:135 + 0x00, 0xBA, 0x37, 0x0E, // 37:186 + 0x00, 0xF1, 0x37, 0x0E, // 38:241 + 0x01, 0x28, 0x22, 0x0E, // 39:296 + 0x01, 0x4A, 0x28, 0x0E, // 40:330 + 0x01, 0x72, 0x27, 0x0E, // 41:370 + 0x01, 0x99, 0x32, 0x0E, // 42:409 + 0x01, 0xCB, 0x37, 0x0E, // 43:459 + 0x02, 0x02, 0x23, 0x0E, // 44:514 + 0x02, 0x25, 0x2B, 0x0E, // 45:549 + 0x02, 0x50, 0x23, 0x0E, // 46:592 + 0x02, 0x73, 0x31, 0x0E, // 47:627 + 0x02, 0xA4, 0x33, 0x0E, // 48:676 + 0x02, 0xD7, 0x33, 0x0E, // 49:727 + 0x03, 0x0A, 0x33, 0x0E, // 50:778 + 0x03, 0x3D, 0x33, 0x0E, // 51:829 + 0x03, 0x70, 0x33, 0x0E, // 52:880 + 0x03, 0xA3, 0x33, 0x0E, // 53:931 + 0x03, 0xD6, 0x33, 0x0E, // 54:982 + 0x04, 0x09, 0x32, 0x0E, // 55:1033 + 0x04, 0x3B, 0x33, 0x0E, // 56:1083 + 0x04, 0x6E, 0x33, 0x0E, // 57:1134 + 0x04, 0xA1, 0x23, 0x0E, // 58:1185 + 0x04, 0xC4, 0x23, 0x0E, // 59:1220 + 0x04, 0xE7, 0x33, 0x0E, // 60:1255 + 0x05, 0x1A, 0x33, 0x0E, // 61:1306 + 0x05, 0x4D, 0x33, 0x0E, // 62:1357 + 0x05, 0x80, 0x32, 0x0E, // 63:1408 + 0x05, 0xB2, 0x38, 0x0E, // 64:1458 + 0x05, 0xEA, 0x37, 0x0E, // 65:1514 + 0x06, 0x21, 0x33, 0x0E, // 66:1569 + 0x06, 0x54, 0x33, 0x0E, // 67:1620 + 0x06, 0x87, 0x37, 0x0E, // 68:1671 + 0x06, 0xBE, 0x33, 0x0E, // 69:1726 + 0x06, 0xF1, 0x31, 0x0E, // 70:1777 + 0x07, 0x22, 0x33, 0x0E, // 71:1826 + 0x07, 0x55, 0x33, 0x0E, // 72:1877 + 0x07, 0x88, 0x2F, 0x0E, // 73:1928 + 0x07, 0xB7, 0x2F, 0x0E, // 74:1975 + 0x07, 0xE6, 0x33, 0x0E, // 75:2022 + 0x08, 0x19, 0x37, 0x0E, // 76:2073 + 0x08, 0x50, 0x33, 0x0E, // 77:2128 + 0x08, 0x83, 0x2F, 0x0E, // 78:2179 + 0x08, 0xB2, 0x33, 0x0E, // 79:2226 + 0x08, 0xE5, 0x32, 0x0E, // 80:2277 + 0x09, 0x17, 0x33, 0x0E, // 81:2327 + 0x09, 0x4A, 0x37, 0x0E, // 82:2378 + 0x09, 0x81, 0x33, 0x0E, // 83:2433 + 0x09, 0xB4, 0x31, 0x0E, // 84:2484 + 0x09, 0xE5, 0x2F, 0x0E, // 85:2533 + 0x0A, 0x14, 0x35, 0x0E, // 86:2580 + 0x0A, 0x49, 0x36, 0x0E, // 87:2633 + 0x0A, 0x7F, 0x37, 0x0E, // 88:2687 + 0x0A, 0xB6, 0x35, 0x0E, // 89:2742 + 0x0A, 0xEB, 0x33, 0x0E, // 90:2795 + 0x0B, 0x1E, 0x2C, 0x0E, // 91:2846 + 0x0B, 0x4A, 0x34, 0x0E, // 92:2890 + 0x0B, 0x7E, 0x24, 0x0E, // 93:2942 + 0x0B, 0xA2, 0x36, 0x0E, // 94:2978 + 0x0B, 0xD8, 0x38, 0x0E, // 95:3032 + 0x0C, 0x10, 0x21, 0x0E, // 96:3088 + 0x0C, 0x31, 0x33, 0x0E, // 97:3121 + 0x0C, 0x64, 0x33, 0x0E, // 98:3172 + 0x0C, 0x97, 0x33, 0x0E, // 99:3223 + 0x0C, 0xCA, 0x33, 0x0E, // 100:3274 + 0x0C, 0xFD, 0x33, 0x0E, // 101:3325 + 0x0D, 0x30, 0x2E, 0x0E, // 102:3376 + 0x0D, 0x5E, 0x34, 0x0E, // 103:3422 + 0x0D, 0x92, 0x33, 0x0E, // 104:3474 + 0x0D, 0xC5, 0x33, 0x0E, // 105:3525 + 0x0D, 0xF8, 0x28, 0x0E, // 106:3576 + 0x0E, 0x20, 0x37, 0x0E, // 107:3616 + 0x0E, 0x57, 0x33, 0x0E, // 108:3671 + 0x0E, 0x8A, 0x37, 0x0E, // 109:3722 + 0x0E, 0xC1, 0x33, 0x0E, // 110:3777 + 0x0E, 0xF4, 0x33, 0x0E, // 111:3828 + 0x0F, 0x27, 0x33, 0x0E, // 112:3879 + 0x0F, 0x5A, 0x34, 0x0E, // 113:3930 + 0x0F, 0x8E, 0x32, 0x0E, // 114:3982 + 0x0F, 0xC0, 0x33, 0x0E, // 115:4032 + 0x0F, 0xF3, 0x2F, 0x0E, // 116:4083 + 0x10, 0x22, 0x33, 0x0E, // 117:4130 + 0x10, 0x55, 0x32, 0x0E, // 118:4181 + 0x10, 0x87, 0x36, 0x0E, // 119:4231 + 0x10, 0xBD, 0x33, 0x0E, // 120:4285 + 0x10, 0xF0, 0x32, 0x0E, // 121:4336 + 0x11, 0x22, 0x2F, 0x0E, // 122:4386 + 0x11, 0x51, 0x30, 0x0E, // 123:4433 + 0x11, 0x81, 0x24, 0x0E, // 124:4481 + 0x11, 0xA5, 0x33, 0x0E, // 125:4517 + + // Font Data: + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x73,0x00,0xE0,0xFF,0x73,0x00,0xE0,0xFF,0x73, // 33 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x0F,0x00,0x00,0xE0,0x0F,0x00,0x00,0xE0,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x0F,0x00,0x00,0xE0,0x0F,0x00,0x00,0xE0,0x0F, // 34 + 0x00,0x00,0x07,0x00,0x00,0x1C,0x47,0x00,0x00,0x1C,0x7F,0x00,0x00,0xDC,0x7F,0x00,0x00,0xFC,0x0F,0x00,0xC0,0xFF,0x07,0x00,0xC0,0x1F,0x47,0x00,0xC0,0x1C,0x7F,0x00,0x00,0xDC,0x7F,0x00,0x00,0xFE,0x0F,0x00,0xC0,0x7F,0x07,0x00,0xC0,0x1F,0x07,0x00,0xC0,0x1C,0x07,0x00,0x00,0x1C, // 35 + 0x00,0x00,0x00,0x00,0x00,0x3C,0x38,0x00,0x00,0xFE,0x38,0x00,0x00,0xFE,0x70,0x00,0x00,0xE7,0x70,0x00,0x00,0xC7,0x71,0x00,0xE0,0xFF,0xFF,0x07,0xE0,0xFF,0xFF,0x07,0x00,0xC7,0x71,0x00,0x00,0x87,0x7B,0x00,0x00,0x87,0x3F,0x00,0x00,0x0E,0x3F,0x00,0x00,0x00,0x1E, // 36 + 0x80,0x03,0x00,0x00,0xC0,0x07,0x03,0x00,0x60,0x0C,0x01,0x00,0x60,0x8C,0x01,0x00,0x60,0x8C,0x00,0x00,0xC0,0x47,0x00,0x00,0x80,0x43,0x00,0x00,0x00,0x20,0x1C,0x00,0x00,0x30,0x3E,0x00,0x00,0x10,0x63,0x00,0x00,0x18,0x63,0x00,0x00,0x08,0x63,0x00,0x00,0x0C,0x3E,0x00,0x00,0x00,0x1C, // 37 + 0x00,0x00,0x00,0x00,0x00,0x80,0x0F,0x00,0x00,0xC0,0x1F,0x00,0x80,0xE7,0x3F,0x00,0xC0,0x7F,0x78,0x00,0xE0,0x3F,0x70,0x00,0xE0,0xFC,0x70,0x00,0xE0,0xF0,0x71,0x00,0xE0,0xE0,0x73,0x00,0xE0,0xC0,0x7F,0x00,0xE0,0x00,0x3F,0x00,0xC0,0x01,0x7E,0x00,0x00,0xC0,0x7F,0x00,0x00,0xC0,0x77, // 38 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x0F,0x00,0x00,0xE0,0x0F,0x00,0x00,0xE0,0x0F, // 39 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x0F,0x00,0x00,0xFF,0x7F,0x00,0xC0,0xFF,0xFF,0x01,0xE0,0x07,0xF0,0x03,0xE0,0x00,0x80,0x03,0x20,0x00,0x00,0x02, // 40 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x02,0xE0,0x00,0x80,0x03,0xE0,0x07,0xF0,0x03,0xC0,0xFF,0xFF,0x01,0x00,0xFE,0x7F,0x00,0x00,0xF8,0x0F, // 41 + 0x00,0x00,0x00,0x00,0x00,0x21,0x00,0x00,0x80,0x73,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x1E,0x00,0x00,0xE0,0xFF,0x01,0x00,0xE0,0xFF,0x01,0x00,0x00,0x1E,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x33,0x00,0x00,0x80,0x73,0x00,0x00,0x00,0x21, // 42 + 0x00,0x00,0x00,0x00,0x00,0xC0,0x01,0x00,0x00,0xC0,0x01,0x00,0x00,0xC0,0x01,0x00,0x00,0xC0,0x01,0x00,0x00,0xC0,0x01,0x00,0x00,0xFE,0x3F,0x00,0x00,0xFE,0x3F,0x00,0x00,0xFE,0x3F,0x00,0x00,0xC0,0x01,0x00,0x00,0xC0,0x01,0x00,0x00,0xC0,0x01,0x00,0x00,0xC0,0x01,0x00,0x00,0xC0,0x01, // 43 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0xF8,0x07,0x00,0x00,0xF8,0x07,0x00,0x00,0xF8,0x03,0x00,0x00,0xF8, // 44 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x80,0x03,0x00,0x00,0x80,0x03,0x00,0x00,0x80,0x03,0x00,0x00,0x80,0x03,0x00,0x00,0x80,0x03,0x00,0x00,0x80,0x03, // 45 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x78, // 46 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0xC0,0x01,0x00,0x00,0xF8,0x01,0x00,0x00,0xFE,0x00,0x00,0x80,0x3F,0x00,0x00,0xE0,0x07,0x00,0x00,0xF8,0x01,0x00,0x00,0x7F,0x00,0x00,0xC0,0x1F,0x00,0x00,0xE0,0x07,0x00,0x00,0xE0,0x00,0x00,0x00,0x20, // 47 + 0x00,0x00,0x00,0x00,0x00,0xFE,0x03,0x00,0x80,0xFF,0x1F,0x00,0xC0,0xFF,0x3F,0x00,0xC0,0x03,0x3C,0x00,0xE0,0x00,0x70,0x00,0xE0,0x70,0x70,0x00,0xE0,0x70,0x70,0x00,0xE0,0x70,0x70,0x00,0xC0,0x03,0x3C,0x00,0xC0,0xFF,0x3F,0x00,0x80,0xFF,0x1F,0x00,0x00,0xFC,0x03, // 48 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x01,0x70,0x00,0xC0,0x01,0x70,0x00,0xE0,0x00,0x70,0x00,0xE0,0x00,0x70,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0xFF,0x7F,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x70, // 49 + 0x00,0x00,0x00,0x00,0xC0,0x01,0x70,0x00,0xC0,0x01,0x78,0x00,0xE0,0x00,0x7C,0x00,0xE0,0x00,0x7E,0x00,0xE0,0x00,0x7F,0x00,0xE0,0x80,0x77,0x00,0xE0,0xC0,0x73,0x00,0xE0,0xE0,0x71,0x00,0xE0,0xF1,0x70,0x00,0xC0,0x7F,0x70,0x00,0x80,0x1F,0x70,0x00,0x00,0x0F,0x70, // 50 + 0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0xC0,0x01,0x38,0x00,0xC0,0x00,0x70,0x00,0xE0,0x70,0x70,0x00,0xE0,0x70,0x70,0x00,0xE0,0x70,0x70,0x00,0xE0,0x70,0x70,0x00,0xE0,0x70,0x70,0x00,0xE0,0xF9,0x78,0x00,0xC0,0xDF,0x3F,0x00,0xC0,0xDF,0x3F,0x00,0x00,0x8F,0x0F, // 51 + 0x00,0x00,0x00,0x00,0x00,0x80,0x07,0x00,0x00,0xE0,0x07,0x00,0x00,0xF8,0x07,0x00,0x00,0x3C,0x07,0x00,0x00,0x1F,0x07,0x00,0x80,0x07,0x07,0x00,0xE0,0x01,0x07,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0xFF,0x7F,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x07, // 52 + 0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0xE0,0x7F,0x30,0x00,0xE0,0x3F,0x70,0x00,0xE0,0x3F,0x70,0x00,0xE0,0x38,0x70,0x00,0xE0,0x38,0x70,0x00,0xE0,0x38,0x70,0x00,0xE0,0x78,0x78,0x00,0xE0,0x78,0x38,0x00,0xE0,0xF0,0x3F,0x00,0xE0,0xE0,0x1F,0x00,0x00,0xC0,0x0F, // 53 + 0x00,0x00,0x00,0x00,0x00,0xFC,0x07,0x00,0x00,0xFF,0x1F,0x00,0x80,0xFF,0x3F,0x00,0xC0,0x73,0x38,0x00,0xE0,0x39,0x70,0x00,0xE0,0x38,0x70,0x00,0xE0,0x38,0x70,0x00,0xE0,0x38,0x70,0x00,0xE0,0x78,0x78,0x00,0xE0,0xF0,0x3F,0x00,0xC0,0xF1,0x1F,0x00,0x00,0xC0,0x0F, // 54 + 0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x40,0x00,0xE0,0x00,0x70,0x00,0xE0,0x00,0x7E,0x00,0xE0,0x80,0x3F,0x00,0xE0,0xE0,0x0F,0x00,0xE0,0xFC,0x03,0x00,0xE0,0xFF,0x00,0x00,0xE0,0x1F,0x00,0x00,0xE0,0x07,0x00,0x00,0xE0,0x01, // 55 + 0x00,0x00,0x00,0x00,0x00,0x8F,0x0F,0x00,0xC0,0xDF,0x3F,0x00,0xC0,0xDF,0x3F,0x00,0xE0,0xF9,0x78,0x00,0xE0,0x70,0x70,0x00,0xE0,0x70,0x70,0x00,0xE0,0x70,0x70,0x00,0xE0,0x70,0x70,0x00,0xE0,0xF9,0x78,0x00,0xC0,0xDF,0x3F,0x00,0xC0,0xDF,0x3F,0x00,0x00,0x0F,0x0F, // 56 + 0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x80,0xFF,0x38,0x00,0xC0,0xFF,0x70,0x00,0xE0,0xE1,0x71,0x00,0xE0,0xC0,0x71,0x00,0xE0,0xC0,0x71,0x00,0xE0,0xC0,0x71,0x00,0xE0,0xC0,0x79,0x00,0xC0,0xE1,0x3C,0x00,0xC0,0xFF,0x1F,0x00,0x80,0xFF,0x0F,0x00,0x00,0xFE,0x03, // 57 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x78,0x00,0x00,0x78,0x78,0x00,0x00,0x78,0x78,0x00,0x00,0x78,0x78, // 58 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x78,0xF8,0x07,0x00,0x78,0xF8,0x07,0x00,0x78,0xF8,0x03,0x00,0x78,0xF8, // 59 + 0x00,0x00,0x00,0x00,0x00,0xC0,0x01,0x00,0x00,0xE0,0x03,0x00,0x00,0xE0,0x03,0x00,0x00,0x60,0x03,0x00,0x00,0x70,0x07,0x00,0x00,0x70,0x07,0x00,0x00,0x38,0x0E,0x00,0x00,0x38,0x0E,0x00,0x00,0x1C,0x1C,0x00,0x00,0x1C,0x1C,0x00,0x00,0x1C,0x1C,0x00,0x00,0x0E,0x38, // 60 + 0x00,0x00,0x00,0x00,0x00,0x38,0x0E,0x00,0x00,0x38,0x0E,0x00,0x00,0x38,0x0E,0x00,0x00,0x38,0x0E,0x00,0x00,0x38,0x0E,0x00,0x00,0x38,0x0E,0x00,0x00,0x38,0x0E,0x00,0x00,0x38,0x0E,0x00,0x00,0x38,0x0E,0x00,0x00,0x38,0x0E,0x00,0x00,0x38,0x0E,0x00,0x00,0x38,0x0E, // 61 + 0x00,0x00,0x00,0x00,0x00,0x0E,0x38,0x00,0x00,0x1C,0x1C,0x00,0x00,0x1C,0x1C,0x00,0x00,0x1C,0x1C,0x00,0x00,0x38,0x0E,0x00,0x00,0x38,0x0E,0x00,0x00,0x70,0x07,0x00,0x00,0x70,0x07,0x00,0x00,0x60,0x03,0x00,0x00,0xE0,0x03,0x00,0x00,0xE0,0x03,0x00,0x00,0xC0,0x01, // 62 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x01,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x80,0x77,0x00,0xE0,0xC0,0x77,0x00,0xE0,0xE0,0x77,0x00,0xE0,0x70,0x00,0x00,0xE0,0x38,0x00,0x00,0xE0,0x3F,0x00,0x00,0xC0,0x0F,0x00,0x00,0x80,0x07, // 63 + 0x00,0xE0,0x1F,0x00,0x00,0xF8,0x7F,0x00,0x00,0x3E,0xF0,0x00,0x00,0x0E,0xC0,0x01,0x00,0x83,0x87,0x03,0x80,0xE3,0x1F,0x03,0x80,0x61,0x18,0x06,0x80,0x31,0x30,0x06,0x80,0x31,0x30,0x06,0x80,0x31,0x30,0x06,0x80,0x33,0x30,0x06,0x00,0x67,0x18,0x06,0x00,0xFE,0x3F,0x07,0x00,0xFC,0x3F,0x02, // 64 + 0x00,0x00,0x60,0x00,0x00,0x00,0x7E,0x00,0x00,0xC0,0x7F,0x00,0x00,0xFC,0x7F,0x00,0xC0,0xFF,0x07,0x00,0xE0,0x7F,0x07,0x00,0xE0,0x03,0x07,0x00,0xE0,0x03,0x07,0x00,0xE0,0x7F,0x07,0x00,0xC0,0xFF,0x07,0x00,0x00,0xFC,0x7F,0x00,0x00,0xC0,0x7F,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x60, // 65 + 0x00,0x00,0x00,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0x70,0x70,0x00,0xE0,0x70,0x70,0x00,0xE0,0x70,0x70,0x00,0xE0,0x70,0x70,0x00,0xE0,0x79,0x70,0x00,0xC0,0xDF,0x78,0x00,0xC0,0xDF,0x3F,0x00,0x80,0xCF,0x3F,0x00,0x00,0x00,0x1F, // 66 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x03,0x00,0x00,0xFF,0x0F,0x00,0x80,0xFF,0x1F,0x00,0xC0,0x07,0x3E,0x00,0xE0,0x01,0x78,0x00,0xE0,0x00,0x70,0x00,0xE0,0x00,0x70,0x00,0xE0,0x00,0x70,0x00,0xE0,0x00,0x70,0x00,0xE0,0x01,0x78,0x00,0xC0,0x03,0x3C, // 67 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0x00,0x70,0x00,0xE0,0x00,0x70,0x00,0xE0,0x00,0x70,0x00,0xE0,0x00,0x70,0x00,0xC0,0x01,0x38,0x00,0xC0,0x07,0x3E,0x00,0x80,0xFF,0x1F,0x00,0x00,0xFF,0x0F,0x00,0x00,0xFC,0x03, // 68 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0x70,0x70,0x00,0xE0,0x70,0x70,0x00,0xE0,0x70,0x70,0x00,0xE0,0x70,0x70,0x00,0xE0,0x70,0x70,0x00,0xE0,0x70,0x70,0x00,0xE0,0x70,0x70,0x00,0xE0,0x00,0x70, // 69 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0x70,0x00,0x00,0xE0,0x70,0x00,0x00,0xE0,0x70,0x00,0x00,0xE0,0x70,0x00,0x00,0xE0,0x70,0x00,0x00,0xE0,0x70,0x00,0x00,0xE0,0x70,0x00,0x00,0xE0, // 70 + 0x00,0x00,0x00,0x00,0x00,0xFC,0x03,0x00,0x00,0xFF,0x0F,0x00,0x80,0xFF,0x1F,0x00,0xC0,0x07,0x3E,0x00,0xE0,0x01,0x78,0x00,0xE0,0x00,0x70,0x00,0xE0,0x00,0x70,0x00,0xE0,0xE0,0x70,0x00,0xE0,0xE0,0x70,0x00,0xE0,0xE1,0x7F,0x00,0xC0,0xE1,0x3F,0x00,0x00,0xE0,0x3F, // 71 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0xFF,0x7F,0x00,0x00,0x70,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x70,0x00,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0xFF,0x7F, // 72 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x70,0x00,0xE0,0x00,0x70,0x00,0xE0,0x00,0x70,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0x00,0x70,0x00,0xE0,0x00,0x70,0x00,0xE0,0x00,0x70, // 73 + 0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x70,0x00,0xE0,0x00,0x70,0x00,0xE0,0x00,0x70,0x00,0xE0,0x00,0x70,0x00,0xE0,0x00,0x78,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x0F, // 74 + 0x00,0x00,0x00,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0xFF,0x7F,0x00,0x00,0xF8,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0xFE,0x01,0x00,0x00,0xFF,0x07,0x00,0xC0,0xE7,0x1F,0x00,0xE0,0x83,0x7F,0x00,0xE0,0x01,0x7E,0x00,0x60,0x00,0x78,0x00,0x20,0x00,0x60, // 75 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0xFF,0x7F,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x70, // 76 + 0x00,0x00,0x00,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0x07,0x00,0x00,0x80,0xFF,0x00,0x00,0x00,0xF8,0x01,0x00,0x00,0xF8,0x01,0x00,0x80,0xFF,0x00,0x00,0xE0,0x07,0x00,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0xFF,0x7F, // 77 + 0x00,0x00,0x00,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0x07,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0xF8,0x01,0x00,0x00,0xC0,0x0F,0x00,0x00,0x00,0x7E,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0xFF,0x7F, // 78 + 0x00,0x00,0x00,0x00,0x00,0xFC,0x03,0x00,0x80,0xFF,0x1F,0x00,0xC0,0xFF,0x3F,0x00,0xC0,0x03,0x3C,0x00,0xE0,0x00,0x70,0x00,0xE0,0x00,0x70,0x00,0xE0,0x00,0x70,0x00,0xE0,0x00,0x70,0x00,0xC0,0x03,0x3C,0x00,0xC0,0xFF,0x3F,0x00,0x80,0xFF,0x1F,0x00,0x00,0xFC,0x03, // 79 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0xE0,0x00,0x00,0xE0,0xE0,0x00,0x00,0xE0,0xE0,0x00,0x00,0xE0,0xE0,0x00,0x00,0xE0,0xF1,0x00,0x00,0xC0,0x7F,0x00,0x00,0xC0,0x7F,0x00,0x00,0x00,0x1F, // 80 + 0x00,0x00,0x00,0x00,0x00,0xFC,0x03,0x00,0x80,0xFF,0x1F,0x00,0xC0,0xFF,0x3F,0x00,0xC0,0x03,0x3C,0x00,0xE0,0x00,0x70,0x00,0xE0,0x00,0x70,0x00,0xE0,0x00,0x70,0x00,0xE0,0x00,0xF0,0x00,0xC0,0x03,0xFC,0x01,0xC0,0xFF,0xFF,0x03,0x80,0xFF,0x9F,0x01,0x00,0xFC,0x07, // 81 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0xE0,0x00,0x00,0xE0,0xE0,0x00,0x00,0xE0,0xE0,0x00,0x00,0xE0,0xE0,0x03,0x00,0xE0,0xF1,0x0F,0x00,0xC0,0xBF,0x3F,0x00,0xC0,0x3F,0x7F,0x00,0x00,0x1F,0x7C,0x00,0x00,0x00,0x70, // 82 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x3C,0x00,0xC0,0x3F,0x78,0x00,0xC0,0x3F,0x78,0x00,0xE0,0x79,0x70,0x00,0xE0,0x70,0x70,0x00,0xE0,0xF0,0x70,0x00,0xE0,0xF0,0x70,0x00,0xE0,0xE0,0x79,0x00,0xE0,0xE1,0x3F,0x00,0xC0,0xC3,0x3F,0x00,0x00,0x80,0x0F, // 83 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0, // 84 + 0x00,0x00,0x00,0x00,0xE0,0xFF,0x0F,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x78,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x0F, // 85 + 0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xE0,0x0F,0x00,0x00,0xE0,0xFF,0x00,0x00,0xE0,0xFF,0x0F,0x00,0x00,0xFC,0x7F,0x00,0x00,0x80,0x7F,0x00,0x00,0x00,0x70,0x00,0x00,0x80,0x7F,0x00,0x00,0xFC,0x7F,0x00,0xE0,0xFF,0x0F,0x00,0xE0,0xFF,0x00,0x00,0xE0,0x0F,0x00,0x00,0x60, // 86 + 0xE0,0x01,0x00,0x00,0xE0,0xFF,0x03,0x00,0xE0,0xFF,0x7F,0x00,0x00,0xFC,0x7F,0x00,0x00,0x00,0x7F,0x00,0x00,0xFC,0x1F,0x00,0x00,0xFC,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0xFC,0x1F,0x00,0x00,0x80,0x7F,0x00,0x00,0xF8,0x7F,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0xFF,0x07,0x00,0xE0,0x03, // 87 + 0x20,0x00,0x40,0x00,0xE0,0x00,0x70,0x00,0xE0,0x01,0x78,0x00,0xE0,0x07,0x7E,0x00,0x80,0x9F,0x1F,0x00,0x00,0xFF,0x0F,0x00,0x00,0xFC,0x03,0x00,0x00,0xFC,0x03,0x00,0x00,0xFF,0x0F,0x00,0x80,0x9F,0x1F,0x00,0xE0,0x07,0x7E,0x00,0xE0,0x01,0x78,0x00,0xE0,0x00,0x70,0x00,0x20,0x00,0x40, // 88 + 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x03,0x00,0x00,0xE0,0x1F,0x00,0x00,0x80,0x7F,0x00,0x00,0x00,0xFE,0x7F,0x00,0x00,0xF0,0x7F,0x00,0x00,0xFE,0x7F,0x00,0x80,0x7F,0x00,0x00,0xE0,0x1F,0x00,0x00,0xE0,0x03,0x00,0x00,0xE0,0x00,0x00,0x00,0x20, // 89 + 0x00,0x00,0x00,0x00,0xE0,0x00,0x78,0x00,0xE0,0x00,0x7C,0x00,0xE0,0x00,0x7F,0x00,0xE0,0x80,0x7F,0x00,0xE0,0xE0,0x77,0x00,0xE0,0xF0,0x73,0x00,0xE0,0xFC,0x70,0x00,0xE0,0x7E,0x70,0x00,0xE0,0x1F,0x70,0x00,0xE0,0x0F,0x70,0x00,0xE0,0x03,0x70,0x00,0xE0,0x01,0x70, // 90 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x03,0xE0,0xFF,0xFF,0x03,0xE0,0xFF,0xFF,0x03,0x60,0x00,0x00,0x03,0x60,0x00,0x00,0x03,0x60,0x00,0x00,0x03, // 91 + 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x03,0x00,0x00,0x80,0x0F,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0xF8,0x01,0x00,0x00,0xE0,0x07,0x00,0x00,0x80,0x1F,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0xF0,0x01,0x00,0x00,0xC0,0x01,0x00,0x00,0x00,0x01, // 92 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x03,0x60,0x00,0x00,0x03,0x60,0x00,0x00,0x03,0xE0,0xFF,0xFF,0x03,0xE0,0xFF,0xFF,0x03,0xE0,0xFF,0xFF,0x03, // 93 + 0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0E,0x00,0x00,0x80,0x07,0x00,0x00,0xC0,0x03,0x00,0x00,0xE0,0x01,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0xC0,0x03,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x08, // 94 + 0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x18, // 95 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x80, // 96 + 0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x00,0x38,0x3F,0x00,0x00,0xBC,0x7F,0x00,0x00,0x9C,0x73,0x00,0x00,0x9C,0x73,0x00,0x00,0x9C,0x73,0x00,0x00,0x9C,0x73,0x00,0x00,0x9C,0x33,0x00,0x00,0xBC,0x3B,0x00,0x00,0xF8,0x7F,0x00,0x00,0xF8,0x7F,0x00,0x00,0xE0,0x7F, // 97 + 0x00,0x00,0x00,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0xFF,0x7F,0x00,0x00,0x30,0x18,0x00,0x00,0x18,0x30,0x00,0x00,0x1C,0x70,0x00,0x00,0x1C,0x70,0x00,0x00,0x1C,0x70,0x00,0x00,0x3C,0x78,0x00,0x00,0xF8,0x3F,0x00,0x00,0xF0,0x1F,0x00,0x00,0xE0,0x0F, // 98 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x07,0x00,0x00,0xF0,0x1F,0x00,0x00,0xF8,0x3F,0x00,0x00,0x78,0x38,0x00,0x00,0x3C,0x78,0x00,0x00,0x1C,0x70,0x00,0x00,0x1C,0x70,0x00,0x00,0x1C,0x70,0x00,0x00,0x1C,0x70,0x00,0x00,0x1C,0x70,0x00,0x00,0x38,0x38, // 99 + 0x00,0x00,0x00,0x00,0x00,0xE0,0x0F,0x00,0x00,0xF0,0x1F,0x00,0x00,0xF8,0x3F,0x00,0x00,0x3C,0x78,0x00,0x00,0x1C,0x70,0x00,0x00,0x1C,0x70,0x00,0x00,0x1C,0x70,0x00,0x00,0x18,0x30,0x00,0x00,0x30,0x18,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0xFF,0x7F, // 100 + 0x00,0x00,0x00,0x00,0x00,0xC0,0x0F,0x00,0x00,0xF0,0x1F,0x00,0x00,0xF8,0x3F,0x00,0x00,0xBC,0x7B,0x00,0x00,0x9C,0x73,0x00,0x00,0x9C,0x73,0x00,0x00,0x9C,0x73,0x00,0x00,0x9C,0x73,0x00,0x00,0xBC,0x73,0x00,0x00,0xF8,0x73,0x00,0x00,0xF0,0x3B,0x00,0x00,0xE0,0x03, // 101 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0xC0,0xFF,0x7F,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0x1C,0x00,0x00,0xE0,0x1C,0x00,0x00,0xE0,0x1C,0x00,0x00,0xE0,0x1C, // 102 + 0x00,0x00,0x00,0x00,0x00,0xE0,0x0F,0x00,0x00,0xF0,0x1F,0x07,0x00,0xF8,0x3F,0x0E,0x00,0x3C,0x78,0x0E,0x00,0x1C,0x70,0x0E,0x00,0x1C,0x70,0x0E,0x00,0x1C,0x70,0x0E,0x00,0x18,0x70,0x0E,0x00,0x38,0x38,0x0F,0x00,0xFC,0xFF,0x07,0x00,0xFC,0xFF,0x07,0x00,0xFC,0xFF,0x01, // 103 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0xFF,0x7F,0x00,0x00,0x38,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0xFC,0x7F,0x00,0x00,0xF8,0x7F,0x00,0x00,0xF0,0x7F, // 104 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x1C,0x70,0x00,0x00,0x1C,0x70,0x00,0x00,0x1C,0x70,0x00,0x78,0xFC,0x7F,0x00,0x78,0xFC,0x7F,0x00,0x78,0xFC,0x7F,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x70, // 105 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0F,0x78,0xFC,0xFF,0x0F,0x78,0xFC,0xFF,0x07,0x78,0xFC,0xFF,0x03, // 106 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0xFF,0x7F,0x00,0x00,0xC0,0x03,0x00,0x00,0xE0,0x01,0x00,0x00,0xF0,0x07,0x00,0x00,0xF8,0x0F,0x00,0x00,0x3C,0x3F,0x00,0x00,0x1C,0x7C,0x00,0x00,0x0C,0x78,0x00,0x00,0x04,0x60,0x00,0x00,0x00,0x40, // 107 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0xFF,0x1F,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x7F,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x70, // 108 + 0x00,0x00,0x00,0x00,0x00,0xFC,0x7F,0x00,0x00,0xFC,0x7F,0x00,0x00,0xFC,0x7F,0x00,0x00,0x18,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0xFC,0x7F,0x00,0x00,0xFC,0x7F,0x00,0x00,0xF0,0x7F,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0xFC,0x7F,0x00,0x00,0xFC,0x7F,0x00,0x00,0xF0,0x7F, // 109 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x7F,0x00,0x00,0xFC,0x7F,0x00,0x00,0xFC,0x7F,0x00,0x00,0x38,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0xFC,0x7F,0x00,0x00,0xF8,0x7F,0x00,0x00,0xF0,0x7F, // 110 + 0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0xF0,0x1F,0x00,0x00,0xF8,0x3F,0x00,0x00,0x3C,0x78,0x00,0x00,0x1C,0x70,0x00,0x00,0x1C,0x70,0x00,0x00,0x1C,0x70,0x00,0x00,0x1C,0x70,0x00,0x00,0x3C,0x78,0x00,0x00,0xF8,0x3F,0x00,0x00,0xF0,0x1F,0x00,0x00,0xC0,0x07, // 111 + 0x00,0x00,0x00,0x00,0x00,0xFC,0xFF,0x0F,0x00,0xFC,0xFF,0x0F,0x00,0xFC,0xFF,0x0F,0x00,0x30,0x18,0x00,0x00,0x18,0x30,0x00,0x00,0x1C,0x70,0x00,0x00,0x1C,0x70,0x00,0x00,0x1C,0x70,0x00,0x00,0x3C,0x78,0x00,0x00,0xF8,0x3F,0x00,0x00,0xF0,0x1F,0x00,0x00,0xE0,0x0F, // 112 + 0x00,0x00,0x00,0x00,0x00,0xE0,0x0F,0x00,0x00,0xF0,0x1F,0x00,0x00,0xF8,0x3F,0x00,0x00,0x3C,0x78,0x00,0x00,0x1C,0x70,0x00,0x00,0x1C,0x70,0x00,0x00,0x1C,0x70,0x00,0x00,0x18,0x30,0x00,0x00,0x30,0x18,0x00,0x00,0xFC,0xFF,0x0F,0x00,0xFC,0xFF,0x0F,0x00,0xFC,0xFF,0x0F, // 113 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x7F,0x00,0x00,0xFC,0x7F,0x00,0x00,0xFC,0x7F,0x00,0x00,0x70,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x38, // 114 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x38,0x00,0x00,0xF8,0x39,0x00,0x00,0xFC,0x71,0x00,0x00,0xDC,0x71,0x00,0x00,0xDC,0x73,0x00,0x00,0x9C,0x73,0x00,0x00,0x9C,0x73,0x00,0x00,0x9C,0x73,0x00,0x00,0x9C,0x7F,0x00,0x00,0x38,0x3F,0x00,0x00,0x00,0x1E, // 115 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0xC0,0xFF,0x1F,0x00,0xC0,0xFF,0x3F,0x00,0xC0,0xFF,0x7F,0x00,0x00,0x1C,0x70,0x00,0x00,0x1C,0x70,0x00,0x00,0x1C,0x70,0x00,0x00,0x1C,0x70, // 116 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x1F,0x00,0x00,0xFC,0x3F,0x00,0x00,0xFC,0x7F,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x38,0x00,0x00,0xFC,0x7F,0x00,0x00,0xFC,0x7F,0x00,0x00,0xFC,0x7F, // 117 + 0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0xFC,0x03,0x00,0x00,0xFC,0x1F,0x00,0x00,0xC0,0x7F,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x7C,0x00,0x00,0xC0,0x7F,0x00,0x00,0xFC,0x1F,0x00,0x00,0xFC,0x03,0x00,0x00,0x7C,0x00,0x00,0x00,0x0C, // 118 + 0x00,0x1C,0x00,0x00,0x00,0xFC,0x03,0x00,0x00,0xFC,0x7F,0x00,0x00,0xC0,0x7F,0x00,0x00,0x00,0x78,0x00,0x00,0xC0,0x7F,0x00,0x00,0xE0,0x03,0x00,0x00,0xE0,0x03,0x00,0x00,0xC0,0x7F,0x00,0x00,0x00,0x78,0x00,0x00,0xC0,0x7F,0x00,0x00,0xFC,0x7F,0x00,0x00,0xFC,0x03,0x00,0x00,0x1C, // 119 + 0x00,0x00,0x00,0x00,0x00,0x04,0x40,0x00,0x00,0x0C,0x60,0x00,0x00,0x3C,0x78,0x00,0x00,0x7C,0x7E,0x00,0x00,0xF8,0x3F,0x00,0x00,0xE0,0x0F,0x00,0x00,0xE0,0x0F,0x00,0x00,0xF8,0x3F,0x00,0x00,0x7C,0x7E,0x00,0x00,0x3C,0x78,0x00,0x00,0x0C,0x60,0x00,0x00,0x04,0x40, // 120 + 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x3C,0x00,0x0E,0x00,0xFC,0x01,0x0E,0x00,0xFC,0x07,0x0E,0x00,0xE0,0xFF,0x0F,0x00,0x00,0xFF,0x07,0x00,0x00,0xFE,0x03,0x00,0xE0,0x7F,0x00,0x00,0xFC,0x0F,0x00,0x00,0xFC,0x01,0x00,0x00,0x3C,0x00,0x00,0x00,0x04, // 121 + 0x00,0x00,0x00,0x00,0x00,0x1C,0x70,0x00,0x00,0x1C,0x78,0x00,0x00,0x1C,0x7C,0x00,0x00,0x1C,0x7F,0x00,0x00,0x9C,0x7F,0x00,0x00,0xDC,0x77,0x00,0x00,0xFC,0x73,0x00,0x00,0xFC,0x71,0x00,0x00,0x7C,0x70,0x00,0x00,0x3C,0x70,0x00,0x00,0x1C,0x70, // 122 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0xC0,0x03,0x00,0xC0,0xFF,0xFF,0x03,0xE0,0xFF,0xFF,0x07,0xE0,0x7F,0xFE,0x07,0x60,0x00,0x00,0x06,0x60,0x00,0x00,0x06,0x60,0x00,0x00,0x06, // 123 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x1F,0xE0,0xFF,0xFF,0x1F,0xE0,0xFF,0xFF,0x1F, // 124 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x06,0x60,0x00,0x00,0x06,0x60,0x00,0x00,0x06,0xE0,0x7F,0xFE,0x07,0xE0,0xFF,0xFF,0x07,0xC0,0xFF,0xFF,0x03,0x00,0xC0,0x03,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01, // 125 +}; + +const uint8_t font_Chewy_24[] = { + 0x14, // Width: 20 + 0x20, // Height: 32 + 0x20, // First Char: 32 + 0x5E, // Numbers of Chars: 94 + + // Jump Table: + 0xFF, 0xFF, 0x00, 0x06, // 32:65535 + 0x00, 0x00, 0x13, 0x06, // 33:0 + 0x00, 0x13, 0x16, 0x07, // 34:19 + 0x00, 0x29, 0x2E, 0x0C, // 35:41 + 0x00, 0x57, 0x2B, 0x0B, // 36:87 + 0x00, 0x82, 0x4B, 0x13, // 37:130 + 0x00, 0xCD, 0x3F, 0x11, // 38:205 + 0x01, 0x0C, 0x0A, 0x04, // 39:268 + 0x01, 0x16, 0x18, 0x06, // 40:278 + 0x01, 0x2E, 0x13, 0x06, // 41:302 + 0x01, 0x41, 0x26, 0x0B, // 42:321 + 0x01, 0x67, 0x2B, 0x0B, // 43:359 + 0x01, 0x92, 0x0F, 0x04, // 44:402 + 0x01, 0xA1, 0x27, 0x0B, // 45:417 + 0x01, 0xC8, 0x0F, 0x04, // 46:456 + 0x01, 0xD7, 0x22, 0x09, // 47:471 + 0x01, 0xF9, 0x37, 0x0F, // 48:505 + 0x02, 0x30, 0x17, 0x06, // 49:560 + 0x02, 0x47, 0x2F, 0x0C, // 50:583 + 0x02, 0x76, 0x2B, 0x0C, // 51:630 + 0x02, 0xA1, 0x32, 0x0D, // 52:673 + 0x02, 0xD3, 0x2F, 0x0C, // 53:723 + 0x03, 0x02, 0x2F, 0x0D, // 54:770 + 0x03, 0x31, 0x2E, 0x0D, // 55:817 + 0x03, 0x5F, 0x37, 0x0E, // 56:863 + 0x03, 0x96, 0x2E, 0x0C, // 57:918 + 0x03, 0xC4, 0x0F, 0x05, // 58:964 + 0x03, 0xD3, 0x0F, 0x05, // 59:979 + 0x03, 0xE2, 0x1B, 0x08, // 60:994 + 0x03, 0xFD, 0x2B, 0x0C, // 61:1021 + 0x04, 0x28, 0x1B, 0x08, // 62:1064 + 0x04, 0x43, 0x2A, 0x0C, // 63:1091 + 0x04, 0x6D, 0x43, 0x11, // 64:1133 + 0x04, 0xB0, 0x33, 0x0D, // 65:1200 + 0x04, 0xE3, 0x2B, 0x0B, // 66:1251 + 0x05, 0x0E, 0x2B, 0x0B, // 67:1294 + 0x05, 0x39, 0x32, 0x0D, // 68:1337 + 0x05, 0x6B, 0x2B, 0x0B, // 69:1387 + 0x05, 0x96, 0x26, 0x0A, // 70:1430 + 0x05, 0xBC, 0x33, 0x0D, // 71:1468 + 0x05, 0xEF, 0x2F, 0x0D, // 72:1519 + 0x06, 0x1E, 0x1F, 0x08, // 73:1566 + 0x06, 0x3D, 0x27, 0x0A, // 74:1597 + 0x06, 0x64, 0x2F, 0x0D, // 75:1636 + 0x06, 0x93, 0x2F, 0x0C, // 76:1683 + 0x06, 0xC2, 0x43, 0x12, // 77:1730 + 0x07, 0x05, 0x37, 0x0F, // 78:1797 + 0x07, 0x3C, 0x2F, 0x0D, // 79:1852 + 0x07, 0x6B, 0x2A, 0x0B, // 80:1899 + 0x07, 0x95, 0x30, 0x0D, // 81:1941 + 0x07, 0xC5, 0x2E, 0x0C, // 82:1989 + 0x07, 0xF3, 0x1F, 0x08, // 83:2035 + 0x08, 0x12, 0x22, 0x09, // 84:2066 + 0x08, 0x34, 0x33, 0x0E, // 85:2100 + 0x08, 0x67, 0x2E, 0x0C, // 86:2151 + 0x08, 0x95, 0x3A, 0x0F, // 87:2197 + 0x08, 0xCF, 0x2B, 0x0B, // 88:2255 + 0x08, 0xFA, 0x26, 0x0A, // 89:2298 + 0x09, 0x20, 0x27, 0x0A, // 90:2336 + 0x09, 0x47, 0x18, 0x06, // 91:2375 + 0x09, 0x5F, 0x20, 0x08, // 92:2399 + 0x09, 0x7F, 0x14, 0x06, // 93:2431 + 0x09, 0x93, 0x2A, 0x0B, // 94:2451 + 0x09, 0xBD, 0x2F, 0x0C, // 95:2493 + 0x09, 0xEC, 0x12, 0x05, // 96:2540 + 0x09, 0xFE, 0x2B, 0x0B, // 97:2558 + 0x0A, 0x29, 0x2F, 0x0D, // 98:2601 + 0x0A, 0x58, 0x23, 0x0A, // 99:2648 + 0x0A, 0x7B, 0x2B, 0x0C, // 100:2683 + 0x0A, 0xA6, 0x2B, 0x0B, // 101:2726 + 0x0A, 0xD1, 0x22, 0x09, // 102:2769 + 0x0A, 0xF3, 0x2B, 0x0C, // 103:2803 + 0x0B, 0x1E, 0x2B, 0x0C, // 104:2846 + 0x0B, 0x49, 0x13, 0x06, // 105:2889 + 0x0B, 0x5C, 0x13, 0x06, // 106:2908 + 0x0B, 0x6F, 0x2C, 0x0B, // 107:2927 + 0x0B, 0x9B, 0x13, 0x06, // 108:2971 + 0x0B, 0xAE, 0x37, 0x10, // 109:2990 + 0x0B, 0xE5, 0x2B, 0x0B, // 110:3045 + 0x0C, 0x10, 0x27, 0x0B, // 111:3088 + 0x0C, 0x37, 0x2B, 0x0C, // 112:3127 + 0x0C, 0x62, 0x2E, 0x0C, // 113:3170 + 0x0C, 0x90, 0x26, 0x0A, // 114:3216 + 0x0C, 0xB6, 0x1B, 0x08, // 115:3254 + 0x0C, 0xD1, 0x23, 0x09, // 116:3281 + 0x0C, 0xF4, 0x2B, 0x0C, // 117:3316 + 0x0D, 0x1F, 0x2E, 0x0C, // 118:3359 + 0x0D, 0x4D, 0x42, 0x11, // 119:3405 + 0x0D, 0x8F, 0x2A, 0x0B, // 120:3471 + 0x0D, 0xB9, 0x2F, 0x0C, // 121:3513 + 0x0D, 0xE8, 0x2B, 0x0B, // 122:3560 + 0x0E, 0x13, 0x1B, 0x07, // 123:3603 + 0x0E, 0x2E, 0x0F, 0x05, // 124:3630 + 0x0E, 0x3D, 0x17, 0x07, // 125:3645 + + // Font Data: + 0x00,0x00,0x00,0x00,0x00,0xFF,0x87,0x01,0xC0,0xFF,0xDF,0x01,0xC0,0xFF,0xDF,0x01,0x00,0xFF,0xC7, // 33 + 0x00,0x00,0x00,0x00,0x80,0x0F,0x00,0x00,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x0F,0x00,0x00,0x80,0x1F, // 34 + 0x00,0x00,0x02,0x00,0x00,0x10,0x02,0x00,0x00,0x18,0x7B,0x00,0x00,0xF8,0x3F,0x00,0x00,0xFE,0x07,0x00,0x80,0xFF,0x07,0x00,0x00,0x18,0x7F,0x00,0x00,0xF8,0x1F,0x00,0x00,0xFF,0x03,0x00,0x80,0x3F,0x02,0x00,0x00,0x10,0x02,0x00,0x00,0x10, // 35 + 0x00,0x00,0x00,0x00,0x00,0x38,0x1C,0x00,0x00,0x7C,0x1C,0x00,0x00,0xFE,0x3C,0x00,0x00,0xE6,0xF8,0x01,0xC0,0xE7,0xF9,0x01,0xC0,0xC7,0xF9,0x01,0x00,0xC7,0x3B,0x00,0x00,0x8F,0x3F,0x00,0x00,0x0E,0x1F,0x00,0x00,0x04,0x0E, // 36 + 0x00,0x3E,0x00,0x00,0x00,0xFF,0x00,0x00,0x80,0xE3,0x01,0x00,0xC0,0xC1,0xC1,0x00,0xC0,0xC1,0x71,0x00,0xC0,0xE3,0x3D,0x00,0x80,0xFF,0x1E,0x00,0x00,0xBE,0x0F,0x00,0x00,0xC0,0x07,0x00,0x00,0xE0,0x01,0x00,0x00,0xF8,0x00,0x00,0x00,0x3C,0x1F,0x00,0x00,0x9E,0x7F,0x00,0x00,0xCF,0xF1,0x00,0x80,0xE3,0xE0,0x00,0xC0,0xE0,0xE0,0x00,0x00,0xE0,0xF1,0x00,0x00,0xC0,0x7F,0x00,0x00,0x00,0x1F, // 37 + 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x7F,0x00,0x00,0x8F,0xFF,0x00,0x80,0xFF,0xFF,0x00,0xC0,0xFF,0xE1,0x00,0xC0,0xF1,0xE0,0x00,0xC0,0xF9,0xE1,0x00,0xC0,0xFF,0xF7,0x00,0x80,0x9F,0x7F,0x00,0x00,0x0F,0x7E,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xEF,0x01,0x00,0x00,0xC7,0x01,0x00,0x00,0x03, // 38 + 0x00,0x00,0x00,0x00,0x80,0x1F,0x00,0x00,0x80,0x3F, // 39 + 0x00,0x00,0x00,0x00,0x00,0xF8,0x07,0x00,0x00,0xFE,0x3F,0x00,0xC0,0x0F,0xF8,0x00,0xE0,0x01,0xE0,0x01,0x60,0x00,0x80,0x01, // 40 + 0x00,0x00,0x00,0x00,0x60,0x00,0x80,0x01,0xE0,0x07,0xF8,0x00,0x80,0xFF,0x3F,0x00,0x00,0xFC,0x07, // 41 + 0x00,0x00,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x3C,0x00,0x00,0xC0,0xFF,0x01,0x00,0x00,0x3C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x42, // 42 + 0x00,0x00,0x04,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x07,0x00,0x00,0xE0,0x3F,0x00,0x00,0xC0,0x7F,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06, // 43 + 0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x02,0x00,0x00,0xE0,0x03,0x00,0x00,0xC0, // 44 + 0x00,0x00,0x04,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x04, // 45 + 0x00,0x00,0x60,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xC0, // 46 + 0x00,0x00,0x70,0x00,0x00,0x00,0x3E,0x00,0x00,0x80,0x1F,0x00,0x00,0xE0,0x07,0x00,0x00,0xF8,0x01,0x00,0x00,0x7E,0x00,0x00,0x00,0x3F,0x00,0x00,0x80,0x07,0x00,0x00,0xC0,0x01, // 47 + 0x00,0xC0,0x07,0x00,0x00,0xF8,0x3F,0x00,0x00,0xFC,0x7F,0x00,0x00,0xFE,0xFF,0x00,0x00,0x3F,0xF8,0x01,0x80,0x0F,0xF0,0x01,0x80,0x07,0xE0,0x01,0x80,0x07,0xE0,0x01,0x80,0x07,0xE0,0x01,0x80,0x0F,0xF0,0x00,0x00,0x1F,0xFC,0x00,0x00,0xFE,0x7F,0x00,0x00,0xFC,0x1F,0x00,0x00,0xF0,0x07, // 48 + 0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x80,0xFF,0x7F,0x00,0x80,0xFF,0xFF,0x00,0x80,0xFF,0xFF,0x00,0x00,0xFE,0x7F, // 49 + 0x00,0x00,0x60,0x00,0x00,0x1C,0xF0,0x00,0x00,0x1F,0xF8,0x00,0x00,0x1F,0xFE,0x00,0x80,0x0F,0xFF,0x00,0x80,0x87,0xFF,0x00,0x80,0xE7,0xE7,0x00,0x80,0xFF,0xE3,0x00,0x80,0xFF,0xE1,0x00,0x00,0x7F,0xE0,0x00,0x00,0x1E,0x60,0x00,0x00,0x00,0x60, // 50 + 0x00,0x00,0x00,0x00,0x00,0x06,0xC0,0x00,0x00,0xCF,0xC0,0x01,0x00,0xCF,0xC1,0x01,0x80,0xC7,0xC0,0x01,0x80,0xE3,0xC0,0x01,0x80,0xE3,0xC0,0x01,0x80,0xF3,0xE1,0x00,0x80,0xFF,0xFF,0x00,0x00,0xFF,0x7F,0x00,0x00,0x3E,0x1F, // 51 + 0x00,0x00,0x00,0x00,0x00,0xFF,0x01,0x00,0x80,0xFF,0x01,0x00,0x00,0xFF,0x01,0x00,0x00,0xE0,0x01,0x00,0x00,0xE0,0x01,0x00,0x00,0xE0,0x3F,0x00,0x00,0xFF,0xFF,0x00,0x80,0xFF,0xFF,0x00,0x80,0xFF,0x3F,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x40, // 52 + 0x00,0x00,0x00,0x00,0x00,0xFF,0x38,0x00,0x00,0xFF,0x7D,0x00,0x00,0xFF,0x79,0x00,0x80,0xFF,0xF1,0x00,0x80,0xE7,0xF0,0x00,0x80,0xE7,0xF0,0x00,0x80,0xE7,0xF9,0x00,0x80,0xE7,0xFF,0x00,0x80,0xC3,0x7F,0x00,0x00,0xC3,0x3F,0x00,0x00,0x00,0x1F, // 53 + 0x00,0x80,0x0F,0x00,0x00,0xE0,0x3F,0x00,0x00,0xF8,0x7F,0x00,0x00,0xFC,0xFF,0x00,0x00,0xFE,0xF8,0x00,0x00,0xFF,0xE0,0x00,0x00,0xEF,0xE0,0x00,0x80,0xE7,0xE0,0x00,0x80,0xE3,0xF1,0x00,0x80,0xC1,0x7F,0x00,0x00,0xC0,0x3F,0x00,0x00,0x00,0x1F, // 54 + 0x00,0x06,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x00,0x00,0x80,0x07,0xE0,0x00,0x80,0x07,0xFC,0x00,0x80,0x07,0x7F,0x00,0x80,0xC7,0x3F,0x00,0x80,0xF7,0x0F,0x00,0x80,0xFF,0x03,0x00,0x80,0x7F,0x00,0x00,0x80,0x1F,0x00,0x00,0x00,0x07, // 55 + 0x00,0x00,0x38,0x00,0x00,0x3C,0xFE,0x00,0x00,0x7E,0xFF,0x00,0x00,0x7F,0xFF,0x01,0x00,0xFF,0xE7,0x01,0x80,0xF7,0xC3,0x01,0x80,0xE3,0xC1,0x01,0x80,0xE3,0xC1,0x01,0x80,0xF3,0xC3,0x01,0x80,0xFF,0xE3,0x00,0x80,0xFF,0xFF,0x00,0x00,0xBF,0xFF,0x00,0x00,0x0E,0x7F,0x00,0x00,0x00,0x3C, // 56 + 0x00,0x00,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0xFE,0x01,0x00,0x00,0xFF,0x83,0x01,0x80,0xC7,0xE3,0x01,0x80,0x83,0xF3,0x01,0x80,0x83,0xFB,0x00,0x80,0x83,0x7F,0x00,0x80,0xC7,0x3F,0x00,0x00,0xFF,0x1F,0x00,0x00,0xFE,0x07,0x00,0x00,0xF8, // 57 + 0x00,0x80,0x61,0x00,0x00,0x80,0xE3,0x00,0x00,0x80,0xE3,0x00,0x00,0x00,0xC3, // 58 + 0x00,0x80,0xE1,0x00,0x00,0x80,0xE3,0x02,0x00,0x80,0xE3,0x03,0x00,0x00,0xC3, // 59 + 0x00,0x00,0x06,0x00,0x00,0x80,0x0F,0x00,0x00,0xC0,0x1D,0x00,0x00,0xC0,0x39,0x00,0x00,0xE0,0x30,0x00,0x00,0x70,0x70,0x00,0x00,0x30,0x60, // 60 + 0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x00,0x00,0x80,0x19,0x00,0x00,0x80,0x19,0x00,0x00,0x80,0x19,0x00,0x00,0x80,0x19,0x00,0x00,0x80,0x19,0x00,0x00,0x80,0x19,0x00,0x00,0x80,0x19,0x00,0x00,0x80,0x19,0x00,0x00,0x00,0x11, // 61 + 0x00,0x00,0x00,0x00,0x00,0x30,0x60,0x00,0x00,0x70,0x70,0x00,0x00,0xE0,0x38,0x00,0x00,0xC0,0x1D,0x00,0x00,0x80,0x0F,0x00,0x00,0x00,0x03, // 62 + 0x00,0x03,0x00,0x00,0x80,0x07,0x00,0x00,0x80,0x07,0x00,0x00,0xC0,0x03,0x00,0x00,0xC0,0xE1,0xC7,0x00,0xC0,0xE1,0xEF,0x00,0xC0,0xF1,0xEF,0x00,0x80,0x73,0x60,0x00,0x80,0x3F,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x0E, // 63 + 0x00,0xE0,0x07,0x00,0x00,0xF8,0x1F,0x00,0x00,0x3C,0x38,0x00,0x00,0x0E,0x70,0x00,0x00,0xC7,0x63,0x00,0x00,0xE7,0xE7,0x00,0x80,0x73,0xCE,0x00,0x80,0x3B,0xCC,0x00,0x80,0x1B,0xCC,0x00,0x80,0x1B,0xC6,0x00,0x80,0xFB,0xC7,0x00,0x80,0xFB,0xCC,0x00,0x00,0x07,0x6C,0x00,0x00,0x07,0x6E,0x00,0x00,0x0E,0x67,0x00,0x00,0xFC,0x07,0x00,0x00,0xF0,0x01, // 64 + 0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0xE0,0xFF,0x00,0x00,0xFC,0xFF,0x00,0x00,0xFE,0x3F,0x00,0x00,0x3F,0x07,0x00,0x80,0x07,0x07,0x00,0x80,0x07,0x07,0x00,0x80,0x0F,0x07,0x00,0x00,0xFF,0x7F,0x00,0x00,0xFE,0xFF,0x00,0x00,0xF8,0xFF,0x00,0x00,0x00,0x7F, // 65 + 0x00,0x00,0x00,0x00,0x00,0xFF,0x7F,0x00,0x80,0xFF,0xFF,0x00,0x80,0xFF,0xFF,0x00,0xC0,0xFF,0xFF,0x00,0xC0,0xC3,0xF1,0x00,0xC0,0xE3,0xF9,0x00,0xC0,0xFF,0x7F,0x00,0xC0,0xFF,0x7F,0x00,0x80,0x3F,0x3F,0x00,0x00,0x0F,0x1E, // 66 + 0x00,0xE0,0x0F,0x00,0x00,0xFC,0x3F,0x00,0x00,0xFE,0xFF,0x00,0x80,0xFF,0xFF,0x00,0x80,0x1F,0xF0,0x01,0xC0,0x07,0xE0,0x01,0xC0,0x07,0xE0,0x01,0xC0,0x3F,0xE0,0x01,0xC0,0x7F,0xF0,0x00,0x80,0x7F,0xF0,0x00,0x00,0x3E,0x70, // 67 + 0x00,0x00,0x00,0x00,0x00,0xFC,0x7F,0x00,0x80,0xFF,0xFF,0x00,0x80,0xFF,0xFF,0x00,0xC0,0xFF,0xFF,0x00,0xC0,0x07,0xF8,0x00,0xC0,0x07,0x7C,0x00,0xC0,0x07,0x7E,0x00,0xC0,0x0F,0x3F,0x00,0x80,0xFF,0x1F,0x00,0x80,0xFF,0x0F,0x00,0x00,0xFF,0x07,0x00,0x00,0xFC, // 68 + 0x00,0x00,0x00,0x00,0x00,0xFC,0x3F,0x00,0x00,0xFF,0x7F,0x00,0x80,0xFF,0xFF,0x00,0x80,0xFF,0xFF,0x00,0x80,0xCF,0xFB,0x00,0xC0,0xE7,0x7B,0x00,0xC0,0xE7,0x7D,0x00,0xC0,0xE3,0x3D,0x00,0xC0,0xE3,0x3C,0x00,0x80,0x01,0x18, // 69 + 0x00,0x00,0x00,0x00,0x00,0xFE,0x3F,0x00,0x00,0xFF,0xFF,0x00,0x80,0xFF,0xFF,0x00,0x80,0xFF,0x7F,0x00,0x80,0xCF,0x03,0x00,0xC0,0xE7,0x01,0x00,0xC0,0xE7,0x01,0x00,0xC0,0xE3,0x00,0x00,0xC0,0x01, // 70 + 0x00,0xE0,0x0F,0x00,0x00,0xFC,0x7F,0x00,0x00,0xFE,0xFF,0x00,0x00,0xFF,0xFF,0x01,0x80,0x1F,0xF0,0x01,0xC0,0x03,0xF3,0x01,0xC0,0x83,0xFB,0x01,0xC0,0xBF,0xFF,0x00,0xC0,0xBF,0xFF,0x00,0x80,0xBF,0x3F,0x00,0x00,0x9F,0x0F,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x03, // 71 + 0x00,0x00,0x00,0x00,0x80,0xFF,0x7F,0x00,0xC0,0xFF,0xFF,0x00,0xC0,0xFF,0xFF,0x00,0x80,0xFF,0x3F,0x00,0x00,0x80,0x07,0x00,0x00,0x80,0x07,0x00,0x00,0x80,0x07,0x00,0x80,0xFF,0xFF,0x00,0xC0,0xFF,0xFF,0x00,0xC0,0xFF,0xFF,0x00,0x80,0xFF,0x1F, // 72 + 0x80,0x01,0xC0,0x00,0x80,0x03,0xE0,0x00,0xC0,0x03,0xF8,0x00,0xC0,0xFF,0xFF,0x00,0xC0,0xFF,0xFF,0x00,0xC0,0xFF,0xFF,0x00,0xC0,0xFF,0x73,0x00,0xC0,0x01,0x70, // 73 + 0x00,0x80,0x7F,0x00,0x00,0x80,0xFF,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0xF0,0x01,0x00,0x00,0xF0,0x01,0x80,0x1F,0xF8,0x01,0x80,0xFF,0xFF,0x01,0x80,0xFF,0xFF,0x00,0x00,0xFE,0x7F,0x00,0x00,0xF8,0x1F, // 74 + 0x00,0x00,0x00,0x00,0x00,0xFC,0x7F,0x00,0xC0,0xFF,0xFF,0x00,0xC0,0xFF,0xFF,0x00,0x80,0xFF,0x7F,0x00,0x00,0xE0,0x07,0x00,0x00,0xF0,0x07,0x00,0x00,0xF8,0x1F,0x00,0x00,0xFF,0x3F,0x00,0x80,0x1F,0x7F,0x00,0xC0,0x0F,0xFC,0x00,0xC0,0x03,0xF0, // 75 + 0x00,0x00,0x00,0x00,0x00,0xF8,0x7F,0x00,0x00,0xFF,0xFF,0x01,0x80,0xFF,0xFF,0x01,0x00,0xFF,0xFF,0x01,0x00,0x00,0xE0,0x01,0x00,0x00,0xE0,0x01,0x00,0x00,0xF0,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x30, // 76 + 0x00,0x00,0x00,0x00,0x00,0xF0,0x3F,0x00,0x00,0xFE,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x80,0xFF,0x1F,0x00,0x80,0xFF,0x01,0x00,0x00,0xFE,0x1F,0x00,0x00,0xFC,0x7F,0x00,0x00,0xE0,0xFF,0x00,0x00,0xF0,0x7F,0x00,0x00,0xFC,0x1F,0x00,0x00,0xFF,0x03,0x00,0x80,0x3F,0x00,0x00,0x80,0xFF,0x0F,0x00,0x80,0xFF,0x7F,0x00,0x00,0xFE,0xFF,0x00,0x00,0xF0,0x7F, // 77 + 0x00,0x00,0x00,0x00,0x00,0xF8,0x3F,0x00,0x00,0xFF,0xFF,0x00,0xC0,0xFF,0xFF,0x00,0xC0,0xFF,0xFF,0x00,0x80,0xFF,0x3F,0x00,0x00,0xFF,0x01,0x00,0x00,0xF8,0x0F,0x00,0x00,0x80,0x3F,0x00,0x00,0xFF,0x7F,0x00,0xC0,0xFF,0xFF,0x00,0xC0,0xFF,0xFF,0x00,0x80,0xFF,0x7F,0x00,0x00,0xFE,0x0F, // 78 + 0x00,0xF0,0x0F,0x00,0x00,0xFC,0x7F,0x00,0x00,0xFE,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x80,0x1F,0xF8,0x01,0x80,0x0F,0xF0,0x01,0x80,0x0F,0xF0,0x01,0x80,0x1F,0xF8,0x01,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFE,0x3F,0x00,0x00,0xF0,0x0F, // 79 + 0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x80,0xFF,0xFF,0x01,0x80,0xFF,0xFF,0x01,0xC0,0xFF,0x7F,0x00,0xC0,0xC7,0x03,0x00,0xC0,0xE7,0x03,0x00,0xC0,0xE7,0x01,0x00,0xC0,0xFF,0x01,0x00,0x80,0xFF,0x00,0x00,0x80,0x7F, // 80 + 0x00,0xF0,0x0F,0x00,0x00,0xFC,0x7F,0x00,0x00,0xFE,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x80,0x1F,0xF8,0x01,0x80,0x0F,0xFE,0x01,0x80,0x0F,0xFE,0x01,0x80,0x1F,0xFE,0x01,0x80,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFE,0xFF,0x01,0x00,0xF0,0xCF,0x01, // 81 + 0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x80,0xFF,0xFF,0x01,0x80,0xFF,0xFF,0x01,0x80,0xFF,0xFF,0x00,0xC0,0x87,0x0F,0x00,0xC0,0xC7,0x0F,0x00,0xC0,0xE7,0x3F,0x00,0xC0,0xFF,0xFF,0x00,0x80,0xFF,0xFC,0x01,0x80,0x7F,0xF0,0x01,0x00,0x3E, // 82 + 0x00,0x3C,0xC0,0x01,0x00,0x7E,0xE0,0x01,0x00,0xFF,0xF0,0x01,0x80,0xFF,0xF9,0x01,0x80,0xC7,0xFF,0x00,0xC0,0xC3,0x7F,0x00,0xC0,0x83,0x3F,0x00,0xC0,0x01,0x0E, // 83 + 0x00,0x07,0x00,0x00,0x80,0x07,0x00,0x00,0x80,0x07,0x00,0x00,0x80,0xFF,0xFF,0x00,0xC0,0xFF,0xFF,0x01,0xC0,0xFF,0xFF,0x01,0xC0,0xFF,0xFF,0x00,0xC0,0x03,0x00,0x00,0xC0,0x03, // 84 + 0x00,0x00,0x00,0x00,0x00,0xFC,0x07,0x00,0x80,0xFF,0x1F,0x00,0xC0,0xFF,0x3F,0x00,0xC0,0xFF,0x7F,0x00,0x80,0x0F,0xFC,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0xF0,0x00,0xC0,0x03,0xF8,0x00,0xC0,0xFF,0xFF,0x00,0xC0,0xFF,0x7F,0x00,0x00,0xFF,0x3F,0x00,0x00,0xF8,0x0F, // 85 + 0x80,0x1F,0x00,0x00,0xC0,0xFF,0x01,0x00,0x80,0xFF,0x0F,0x00,0x00,0xFE,0x3F,0x00,0x00,0xE0,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0xE0,0xFF,0x00,0x00,0xFC,0x3F,0x00,0x00,0xFF,0x0F,0x00,0x80,0xFF,0x01,0x00,0xC0,0x7F,0x00,0x00,0xC0,0x07, // 86 + 0x00,0x00,0x00,0x00,0x00,0xFF,0x07,0x00,0x80,0xFF,0x7F,0x00,0x80,0xFF,0xFF,0x00,0x00,0xFC,0xFF,0x00,0x00,0xE0,0x7F,0x00,0x00,0xFC,0x1F,0x00,0x00,0xFF,0x03,0x00,0x00,0xFE,0x0F,0x00,0x00,0xE0,0x3F,0x00,0x00,0xF8,0xFF,0x00,0x00,0xFE,0xFF,0x00,0x80,0xFF,0x7F,0x00,0x80,0xFF,0x0F,0x00,0x00,0x7F, // 87 + 0x00,0x00,0xF0,0x00,0xC0,0x03,0xFC,0x00,0xC0,0x1F,0x7F,0x00,0x80,0xFF,0x3F,0x00,0x00,0xFF,0x1F,0x00,0x00,0xFC,0x0F,0x00,0x00,0xF8,0x1F,0x00,0x00,0xFE,0x3F,0x00,0x00,0x7F,0x7E,0x00,0x80,0x1F,0xF8,0x00,0xC0,0x0F,0xE0, // 88 + 0x80,0x0F,0x00,0x00,0xC0,0x7F,0x00,0x00,0xC0,0xFF,0xE1,0x01,0x80,0xFF,0xFB,0x01,0x00,0xFE,0xFF,0x00,0x00,0xF0,0x7F,0x00,0x00,0xF8,0x1F,0x00,0x00,0xFE,0x07,0x00,0x80,0xFF,0x01,0x00,0xC0,0x7F, // 89 + 0x00,0x06,0x70,0x00,0x00,0x07,0xFC,0x00,0x80,0x07,0xFF,0x00,0x80,0xC7,0xFF,0x00,0x80,0xE7,0xFF,0x00,0xC0,0xFB,0xFF,0x00,0xC0,0xFF,0xF7,0x00,0xC0,0xFF,0xF1,0x00,0xC0,0x3F,0x70,0x00,0xC0,0x0F,0x70, // 90 + 0x00,0x00,0x00,0x00,0xE0,0xFF,0x7F,0x00,0xE0,0xFF,0xFF,0x01,0xE0,0xFF,0xFF,0x01,0xE0,0x00,0xC0,0x01,0x40,0x00,0xC0,0x01, // 91 + 0x80,0x07,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xF8,0x07,0x00,0x00,0xC0,0x1F,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0xC0,0x01, // 92 + 0xC0,0x00,0xC0,0x00,0xE0,0x00,0xC0,0x01,0xE0,0xFF,0xFF,0x01,0xE0,0xFF,0xFF,0x01,0x00,0xFF,0xFF,0x01, // 93 + 0x00,0x18,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x0F,0x00,0x00,0x80,0x03,0x00,0x00,0xC0,0x01,0x00,0x00,0xC0,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x18, // 94 + 0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0, // 95 + 0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x01, // 96 + 0x00,0x30,0x38,0x00,0x00,0x38,0x7C,0x00,0x00,0x38,0xFE,0x00,0x00,0x3C,0xFE,0x00,0x00,0x1C,0xEE,0x00,0x00,0x1C,0xE7,0x00,0x00,0x3C,0x67,0x00,0x00,0xF8,0xFF,0x00,0x00,0xF8,0xFF,0x01,0x00,0xF0,0xFF,0x01,0x00,0x80,0xFF, // 97 + 0x00,0x00,0x00,0x00,0x00,0xFF,0x7F,0x00,0xC0,0xFF,0xFF,0x00,0xC0,0xFF,0xFF,0x00,0x80,0xFF,0x7F,0x00,0x00,0xE0,0xF0,0x00,0x00,0x70,0xF0,0x00,0x00,0x78,0xF0,0x00,0x00,0x78,0xF8,0x00,0x00,0xF8,0x7F,0x00,0x00,0xF0,0x3F,0x00,0x00,0xE0,0x0F, // 98 + 0x00,0x80,0x1F,0x00,0x00,0xF0,0x7F,0x00,0x00,0xF8,0xFF,0x00,0x00,0xF8,0xFF,0x01,0x00,0xFC,0xE0,0x01,0x00,0x3C,0xC0,0x01,0x00,0xFC,0xE1,0x01,0x00,0xF8,0xF1,0x00,0x00,0xF0,0x60, // 99 + 0x00,0xC0,0x0F,0x00,0x00,0xF0,0x3F,0x00,0x00,0xF8,0x7F,0x00,0x00,0x78,0xF8,0x00,0x00,0x78,0xF0,0x00,0x00,0x78,0xF0,0x00,0x00,0xF0,0xF8,0x00,0x80,0xFF,0x7F,0x00,0xC0,0xFF,0x7F,0x00,0xC0,0xFF,0xFF,0x00,0x80,0xFF,0xFF, // 100 + 0x00,0x80,0x0F,0x00,0x00,0xF0,0x3F,0x00,0x00,0xF8,0x7F,0x00,0x00,0xF8,0xFF,0x00,0x00,0x3C,0xF7,0x00,0x00,0x1C,0xF7,0x00,0x00,0x9C,0xF3,0x00,0x00,0xFC,0xFB,0x00,0x00,0xF8,0x79,0x00,0x00,0xF0,0x3C,0x00,0x00,0x00,0x18, // 101 + 0x00,0xC0,0x01,0x00,0x00,0xC0,0x01,0x00,0x00,0xFC,0x7F,0x00,0x00,0xFF,0xFF,0x00,0x80,0xFF,0xFF,0x00,0xC0,0xFF,0x7F,0x00,0xC0,0xE7,0x00,0x00,0xC0,0xE3,0x00,0x00,0xC0,0x6F, // 102 + 0x00,0x00,0x00,0x00,0x00,0x80,0x3F,0x18,0x00,0xE0,0x7F,0x3C,0x00,0xF8,0xFF,0x78,0x00,0x7C,0xE0,0x78,0x00,0x3C,0xE0,0x78,0x00,0x7C,0xF0,0x7E,0x00,0xF8,0xFF,0x3F,0x00,0xF0,0xFF,0x3F,0x00,0xF8,0xFF,0x0F,0x00,0xF0,0xFF, // 103 + 0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0x00,0x80,0xFF,0xFF,0x01,0xC0,0xFF,0xFF,0x00,0x80,0xFF,0x01,0x00,0x00,0xE0,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0xF0,0xFF,0x00,0x00,0xF0,0xFF,0x01,0x00,0xF0,0xFF,0x01,0x00,0xC0,0xFF, // 104 + 0x00,0x00,0x00,0x00,0x00,0xE0,0x7F,0x00,0x80,0xF9,0xFF,0x00,0x80,0xF9,0xFF,0x00,0x80,0xF1,0x3F, // 105 + 0x00,0x00,0x00,0x3E,0x00,0xF8,0xFF,0x1F,0x80,0xFD,0xFF,0x0F,0x80,0xFD,0xFF,0x07,0x80,0xF1,0xFF, // 106 + 0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0x00,0xC0,0xFF,0xFF,0x01,0xC0,0xFF,0xFF,0x00,0x80,0xFF,0x0F,0x00,0x00,0xC0,0x07,0x00,0x00,0xE0,0x1F,0x00,0x00,0xF0,0x7F,0x00,0x00,0xF8,0xFE,0x00,0x00,0x7C,0xF8,0x01,0x00,0x1C,0xE0,0x01, // 107 + 0x00,0x00,0x00,0x00,0x00,0xF8,0x3F,0x00,0x00,0xFF,0xFF,0x01,0x80,0xFF,0xFF,0x01,0x80,0xFF,0xFF, // 108 + 0x00,0x00,0x00,0x00,0x00,0xF8,0x3F,0x00,0x00,0xFC,0xFF,0x00,0x00,0xFC,0xFF,0x00,0x00,0xF8,0xFF,0x00,0x00,0x7C,0x00,0x00,0x00,0xFC,0x7F,0x00,0x00,0xFC,0xFF,0x00,0x00,0xF8,0xFF,0x00,0x00,0xF0,0x1F,0x00,0x00,0x78,0x00,0x00,0x00,0xFC,0xFF,0x00,0x00,0xFC,0xFF,0x00,0x00,0xF0,0x3F, // 109 + 0x00,0x00,0x00,0x00,0x00,0xF8,0x7F,0x00,0x00,0xFC,0xFF,0x00,0x00,0xFC,0xFF,0x00,0x00,0xF0,0x7F,0x00,0x00,0x78,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x7C,0xFE,0x00,0x00,0xFC,0xFF,0x00,0x00,0xF8,0x7F,0x00,0x00,0xF0,0x0F, // 110 + 0x00,0xC0,0x1F,0x00,0x00,0xF0,0x7F,0x00,0x00,0xF8,0xFF,0x00,0x00,0xFC,0xFF,0x01,0x00,0x7C,0xE0,0x01,0x00,0x7C,0xC0,0x01,0x00,0xFC,0xFF,0x01,0x00,0xF8,0xFF,0x00,0x00,0xF0,0x7F,0x00,0x00,0xC0,0x0F, // 111 + 0x00,0x00,0x00,0x00,0x00,0xF0,0xFF,0x3F,0x00,0xF8,0xFF,0x7F,0x00,0xF8,0xFF,0x7F,0x00,0xF0,0xFF,0x1F,0x00,0xF8,0xF0,0x00,0x00,0x78,0xF0,0x00,0x00,0x78,0xF8,0x00,0x00,0xF8,0xFF,0x00,0x00,0xF0,0x7F,0x00,0x00,0xC0,0x1F, // 112 + 0x00,0x80,0x1F,0x00,0x00,0xE0,0x7F,0x00,0x00,0xF0,0x7F,0x00,0x00,0x78,0xF8,0x00,0x00,0x3C,0xF0,0x00,0x00,0x1C,0xF0,0x00,0x00,0x1C,0xF8,0x00,0x00,0x3C,0x7C,0x00,0x00,0xF8,0xFF,0x3F,0x00,0xFC,0xFF,0x7F,0x00,0xFC,0xFF,0x3F,0x00,0xFC, // 113 + 0x00,0x00,0x00,0x00,0x00,0xF0,0x7F,0x00,0x00,0xF8,0xFF,0x00,0x00,0xF8,0xFF,0x00,0x00,0xE0,0x7F,0x00,0x00,0xF0,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x70, // 114 + 0x00,0x00,0xE0,0x00,0x00,0xF0,0xF0,0x00,0x00,0xFC,0xF3,0x00,0x00,0xFE,0xFF,0x00,0x00,0xFE,0x7F,0x00,0x00,0x9E,0x3F,0x00,0x00,0x0E,0x1E, // 115 + 0x00,0x30,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0xF8,0x7F,0x00,0x80,0xFF,0xFF,0x00,0xC0,0xFF,0xFF,0x01,0xC0,0xFF,0xFF,0x01,0x00,0x38,0xC0,0x01,0x00,0x38,0xC0,0x01,0x00,0x18,0xC0, // 116 + 0x00,0xC0,0x1F,0x00,0x00,0xF0,0x3F,0x00,0x00,0xF8,0x7F,0x00,0x00,0xF8,0xFD,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0xF0,0x00,0x00,0xF0,0xFF,0x00,0x00,0xF8,0x7F,0x00,0x00,0xF8,0x3F,0x00,0x00,0xE0,0x0F, // 117 + 0x00,0xF8,0x00,0x00,0x00,0xF8,0x07,0x00,0x00,0xF8,0x1F,0x00,0x00,0xE0,0x7F,0x00,0x00,0x80,0xFF,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0xFF,0x00,0x00,0xC0,0x7F,0x00,0x00,0xE0,0x1F,0x00,0x00,0xF0,0x07,0x00,0x00,0xF8,0x01,0x00,0x00,0x78, // 118 + 0x00,0x00,0x00,0x00,0x00,0xF8,0x0F,0x00,0x00,0xF8,0x7F,0x00,0x00,0xF8,0xFF,0x00,0x00,0xE0,0xFF,0x00,0x00,0x00,0x7E,0x00,0x00,0x80,0x3F,0x00,0x00,0xE0,0x1F,0x00,0x00,0xF8,0x07,0x00,0x00,0xF8,0x0F,0x00,0x00,0xF0,0x3F,0x00,0x00,0xC0,0xFF,0x00,0x00,0x00,0xFC,0x00,0x00,0xE0,0xFF,0x00,0x00,0xF8,0x3F,0x00,0x00,0xF8,0x0F,0x00,0x00,0xF8, // 119 + 0x00,0x00,0xC0,0x00,0x00,0x38,0xF0,0x00,0x00,0xF8,0x7D,0x00,0x00,0xF0,0x7F,0x00,0x00,0xE0,0x3F,0x00,0x00,0x80,0x1F,0x00,0x00,0xC0,0x7F,0x00,0x00,0xF0,0x7F,0x00,0x00,0xF0,0xF9,0x00,0x00,0x78,0xE0,0x00,0x00,0x38, // 120 + 0x00,0xE0,0x0F,0x00,0x00,0xF8,0x1F,0x18,0x00,0xF8,0x3F,0x38,0x00,0xF0,0x7F,0x78,0x00,0x00,0x78,0x78,0x00,0x00,0x78,0x70,0x00,0x00,0x78,0x78,0x00,0x00,0x3C,0x7C,0x00,0xF0,0x1F,0x3F,0x00,0xF8,0xFF,0x1F,0x00,0xF8,0xFF,0x0F,0x00,0xC0,0xFF, // 121 + 0x00,0x20,0x60,0x00,0x00,0x70,0xF8,0x00,0x00,0x70,0xFE,0x00,0x00,0x38,0xFF,0x00,0x00,0xB8,0xFF,0x00,0x00,0xF8,0xEF,0x00,0x00,0xF8,0xE7,0x00,0x00,0xF8,0xE3,0x00,0x00,0xF8,0x60,0x00,0x00,0x70,0x60,0x00,0x00,0x00,0x60, // 122 + 0x00,0x00,0x00,0x00,0x00,0xC0,0x01,0x00,0x80,0xE3,0xF3,0x00,0xC0,0xFF,0xFF,0x01,0xE0,0xBF,0xFF,0x01,0xE0,0x00,0xC7,0x01,0x60,0x00,0xC0, // 123 + 0x00,0x00,0x00,0x00,0x80,0xFF,0x7F,0x00,0xC0,0xFF,0xFF,0x01,0x00,0xFE,0xFF, // 124 + 0xC0,0x00,0x00,0x03,0xE0,0x30,0x80,0x03,0xE0,0xFF,0xFF,0x03,0xE0,0xFF,0xFF,0x01,0x80,0xE3,0xE3,0x00,0x00,0xC0,0x01, // 125 +}; + +const uint8_t font_Crushed_25[] = { + 0x13, // Width: 19 + 0x1E, // Height: 30 + 0x20, // First Char: 32 + 0x5E, // Numbers of Chars: 94 + + // Jump Table: + 0xFF, 0xFF, 0x00, 0x05, // 32:65535 + 0x00, 0x00, 0x0F, 0x05, // 33:0 + 0x00, 0x0F, 0x12, 0x06, // 34:15 + 0x00, 0x21, 0x2A, 0x0C, // 35:33 + 0x00, 0x4B, 0x23, 0x09, // 36:75 + 0x00, 0x6E, 0x33, 0x0D, // 37:110 + 0x00, 0xA1, 0x2B, 0x0C, // 38:161 + 0x00, 0xCC, 0x06, 0x03, // 39:204 + 0x00, 0xD2, 0x18, 0x07, // 40:210 + 0x00, 0xEA, 0x17, 0x07, // 41:234 + 0x01, 0x01, 0x1A, 0x08, // 42:257 + 0x01, 0x1B, 0x2E, 0x0E, // 43:283 + 0x01, 0x49, 0x0C, 0x04, // 44:329 + 0x01, 0x55, 0x16, 0x07, // 45:341 + 0x01, 0x6B, 0x0B, 0x04, // 46:363 + 0x01, 0x76, 0x15, 0x06, // 47:374 + 0x01, 0x8B, 0x27, 0x0B, // 48:395 + 0x01, 0xB2, 0x0F, 0x06, // 49:434 + 0x01, 0xC1, 0x1F, 0x09, // 50:449 + 0x01, 0xE0, 0x23, 0x09, // 51:480 + 0x02, 0x03, 0x27, 0x0A, // 52:515 + 0x02, 0x2A, 0x23, 0x09, // 53:554 + 0x02, 0x4D, 0x27, 0x0A, // 54:589 + 0x02, 0x74, 0x1E, 0x08, // 55:628 + 0x02, 0x92, 0x27, 0x0A, // 56:658 + 0x02, 0xB9, 0x23, 0x0A, // 57:697 + 0x02, 0xDC, 0x0F, 0x05, // 58:732 + 0x02, 0xEB, 0x0F, 0x05, // 59:747 + 0x02, 0xFA, 0x2F, 0x0E, // 60:762 + 0x03, 0x29, 0x2F, 0x0E, // 61:809 + 0x03, 0x58, 0x2E, 0x0E, // 62:856 + 0x03, 0x86, 0x1E, 0x08, // 63:902 + 0x03, 0xA4, 0x43, 0x13, // 64:932 + 0x03, 0xE7, 0x27, 0x0A, // 65:999 + 0x04, 0x0E, 0x27, 0x0A, // 66:1038 + 0x04, 0x35, 0x27, 0x0A, // 67:1077 + 0x04, 0x5C, 0x2B, 0x0C, // 68:1116 + 0x04, 0x87, 0x1F, 0x09, // 69:1159 + 0x04, 0xA6, 0x1E, 0x09, // 70:1190 + 0x04, 0xC4, 0x27, 0x0C, // 71:1220 + 0x04, 0xEB, 0x27, 0x0C, // 72:1259 + 0x05, 0x12, 0x0F, 0x05, // 73:1298 + 0x05, 0x21, 0x17, 0x07, // 74:1313 + 0x05, 0x38, 0x27, 0x0A, // 75:1336 + 0x05, 0x5F, 0x1F, 0x09, // 76:1375 + 0x05, 0x7E, 0x33, 0x0F, // 77:1406 + 0x05, 0xB1, 0x27, 0x0C, // 78:1457 + 0x05, 0xD8, 0x2B, 0x0C, // 79:1496 + 0x06, 0x03, 0x26, 0x0A, // 80:1539 + 0x06, 0x29, 0x2F, 0x0C, // 81:1577 + 0x06, 0x58, 0x27, 0x0A, // 82:1624 + 0x06, 0x7F, 0x23, 0x09, // 83:1663 + 0x06, 0xA2, 0x22, 0x09, // 84:1698 + 0x06, 0xC4, 0x2A, 0x0C, // 85:1732 + 0x06, 0xEE, 0x26, 0x0A, // 86:1774 + 0x07, 0x14, 0x3D, 0x10, // 87:1812 + 0x07, 0x51, 0x27, 0x0A, // 88:1873 + 0x07, 0x78, 0x22, 0x09, // 89:1912 + 0x07, 0x9A, 0x23, 0x09, // 90:1946 + 0x07, 0xBD, 0x1C, 0x07, // 91:1981 + 0x07, 0xD9, 0x13, 0x06, // 92:2009 + 0x07, 0xEC, 0x18, 0x07, // 93:2028 + 0x08, 0x04, 0x1A, 0x09, // 94:2052 + 0x08, 0x1E, 0x24, 0x09, // 95:2078 + 0x08, 0x42, 0x0E, 0x07, // 96:2114 + 0x08, 0x50, 0x27, 0x0B, // 97:2128 + 0x08, 0x77, 0x27, 0x0B, // 98:2167 + 0x08, 0x9E, 0x27, 0x0A, // 99:2206 + 0x08, 0xC5, 0x2B, 0x0C, // 100:2245 + 0x08, 0xF0, 0x27, 0x0B, // 101:2288 + 0x09, 0x17, 0x22, 0x09, // 102:2327 + 0x09, 0x39, 0x27, 0x0C, // 103:2361 + 0x09, 0x60, 0x27, 0x0C, // 104:2400 + 0x09, 0x87, 0x0F, 0x05, // 105:2439 + 0x09, 0x96, 0x17, 0x07, // 106:2454 + 0x09, 0xAD, 0x27, 0x0A, // 107:2477 + 0x09, 0xD4, 0x1F, 0x09, // 108:2516 + 0x09, 0xF3, 0x3F, 0x11, // 109:2547 + 0x0A, 0x32, 0x27, 0x0C, // 110:2610 + 0x0A, 0x59, 0x2B, 0x0C, // 111:2649 + 0x0A, 0x84, 0x26, 0x0A, // 112:2692 + 0x0A, 0xAA, 0x2F, 0x0C, // 113:2730 + 0x0A, 0xD9, 0x1E, 0x08, // 114:2777 + 0x0A, 0xF7, 0x23, 0x09, // 115:2807 + 0x0B, 0x1A, 0x22, 0x09, // 116:2842 + 0x0B, 0x3C, 0x27, 0x0C, // 117:2876 + 0x0B, 0x63, 0x26, 0x0A, // 118:2915 + 0x0B, 0x89, 0x3D, 0x10, // 119:2953 + 0x0B, 0xC6, 0x27, 0x0A, // 120:3014 + 0x0B, 0xED, 0x26, 0x0A, // 121:3053 + 0x0C, 0x13, 0x23, 0x09, // 122:3091 + 0x0C, 0x36, 0x20, 0x09, // 123:3126 + 0x0C, 0x56, 0x10, 0x06, // 124:3158 + 0x0C, 0x66, 0x1E, 0x09, // 125:3174 + + // Font Data: + 0x00,0x00,0x00,0x00,0x80,0x0F,0xC0,0x00,0x80,0xFF,0xCF,0x00,0x80,0x0F,0xC0, // 33 + 0x00,0x00,0x00,0x00,0x80,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x0F, // 34 + 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x08,0x3E,0x00,0x00,0xF8,0x1F,0x00,0x80,0x7F,0x02,0x00,0x80,0x0B,0x02,0x00,0x00,0x08,0x3E,0x00,0x00,0xF8,0x0F,0x00,0x80,0x3F,0x02,0x00,0x80,0x08,0x02,0x00,0x00,0x08, // 35 + 0x00,0x00,0x00,0x00,0x00,0x3E,0x60,0x00,0x00,0x7F,0x40,0x00,0x00,0xE1,0xC0,0x00,0xC0,0xFF,0xFF,0x01,0x00,0x81,0x43,0x00,0x00,0x01,0x77,0x00,0x00,0x03,0x3E,0x00,0x00,0x00,0x08, // 36 + 0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x80,0xC1,0x00,0x00,0x80,0x80,0xC0,0x00,0x00,0x7F,0x38,0x00,0x00,0x3E,0x0E,0x00,0x00,0xC0,0x01,0x00,0x00,0x78,0x3C,0x00,0x00,0x0E,0x7F,0x00,0x80,0x83,0x81,0x00,0x80,0x00,0x81,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x18, // 37 + 0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x00,0x3E,0xFF,0x00,0x80,0xFF,0xC1,0x00,0x80,0xC1,0x83,0x00,0x80,0x70,0x8F,0x00,0x80,0x3F,0xDC,0x00,0x00,0x0F,0x78,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0xDF,0x00,0x00,0x00,0x83, // 38 + 0x00,0x00,0x00,0x00,0x80,0x0F, // 39 + 0x00,0x00,0x00,0x00,0x00,0xC0,0x01,0x00,0x00,0xFE,0x3F,0x00,0xC0,0x1F,0xFC,0x01,0xC0,0x01,0xC0,0x01,0x40,0x00,0x00,0x01, // 40 + 0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x1F,0xF8,0x01,0x00,0xFE,0x7F,0x00,0x00,0xE0,0x03, // 41 + 0x00,0x00,0x00,0x00,0x00,0x0B,0x00,0x00,0x00,0x0E,0x00,0x00,0x80,0x1F,0x00,0x00,0x80,0x16,0x00,0x00,0x00,0x0B,0x00,0x00,0x00,0x0A, // 42 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xF8,0x1F,0x00,0x00,0xF8,0x1F,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80, // 43 + 0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x02,0x00,0x00,0xC0,0x01, // 44 + 0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80, // 45 + 0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0, // 46 + 0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x00,0x00,0x80,0x3F,0x00,0x00,0xFC,0x01,0x00,0x80,0x0F,0x00,0x00,0x80, // 47 + 0x00,0x00,0x00,0x00,0x00,0xFC,0x1F,0x00,0x00,0xFF,0x7F,0x00,0x80,0x03,0xE0,0x00,0x80,0x01,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x01,0xC0,0x00,0x00,0x07,0xF0,0x00,0x00,0xFE,0x7F,0x00,0x00,0xF8,0x0F, // 48 + 0x80,0x01,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0xFF,0xFF,0x00,0x80,0xFF,0xFF, // 49 + 0x00,0x03,0xC0,0x00,0x80,0x01,0xE0,0x00,0x80,0x01,0xF0,0x00,0x80,0x00,0xD8,0x00,0x80,0x01,0xCE,0x00,0x80,0x83,0xC7,0x00,0x00,0xFF,0xC1,0x00,0x00,0x7E,0xC0, // 50 + 0x00,0x02,0xE0,0x00,0x80,0x01,0xC0,0x00,0x80,0x01,0x80,0x00,0x80,0xC0,0x80,0x00,0x80,0xC1,0x80,0x00,0x80,0xE1,0xC1,0x00,0x00,0x3F,0xFF,0x00,0x00,0x1E,0x7E,0x00,0x00,0x00,0x08, // 51 + 0x00,0x00,0x0C,0x00,0x00,0x00,0x0F,0x00,0x00,0xC0,0x0D,0x00,0x00,0x70,0x0C,0x00,0x00,0x1C,0x0C,0x00,0x00,0x07,0x0C,0x00,0x80,0xFF,0xFF,0x00,0x80,0xFF,0xFF,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C, // 52 + 0x00,0x00,0x00,0x00,0x80,0xFF,0xE0,0x00,0x80,0x7F,0x80,0x00,0x80,0x61,0x80,0x00,0x80,0x41,0x80,0x00,0x80,0xC1,0xC0,0x00,0x80,0xC1,0xE1,0x00,0x80,0x81,0x7F,0x00,0x00,0x00,0x1E, // 53 + 0x00,0x00,0x00,0x00,0x00,0xF8,0x1F,0x00,0x00,0xFE,0x7F,0x00,0x00,0x47,0xE0,0x00,0x80,0x41,0x80,0x00,0x80,0x41,0x80,0x00,0x80,0x40,0x80,0x00,0x80,0xC1,0xF3,0x00,0x80,0x81,0x7F,0x00,0x00,0x00,0x0C, // 54 + 0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0xF0,0x00,0x80,0x01,0xFF,0x00,0x80,0xE1,0x1F,0x00,0x80,0xFD,0x00,0x00,0x80,0x0F,0x00,0x00,0x80,0x01, // 55 + 0x00,0x00,0x00,0x00,0x00,0x1E,0x3E,0x00,0x00,0xBF,0xFF,0x00,0x80,0xE1,0xC0,0x00,0x80,0xC0,0x80,0x00,0x80,0xC0,0x80,0x00,0x80,0xC1,0xC0,0x00,0x00,0xBF,0xF7,0x00,0x00,0x1E,0x7F,0x00,0x00,0x00,0x1C, // 56 + 0x00,0x00,0x00,0x00,0x00,0xFE,0x40,0x00,0x00,0xFF,0x81,0x00,0x80,0x01,0x81,0x00,0x80,0x00,0x83,0x00,0x80,0x01,0xC3,0x00,0x80,0x01,0xE1,0x00,0x00,0xFF,0x7F,0x00,0x00,0xFC,0x1F, // 57 + 0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0xC0,0xC0,0x00,0x00,0x40,0x40, // 58 + 0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x02,0x00,0xC0,0xC0,0x03,0x00,0x40,0x80, // 59 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0xC0,0x01,0x00,0x00,0x40,0x01,0x00,0x00,0x60,0x03,0x00,0x00,0x60,0x02,0x00,0x00,0x30,0x06,0x00,0x00,0x30,0x04,0x00,0x00,0x10,0x0C,0x00,0x00,0x18,0x08,0x00,0x00,0x0C,0x18, // 60 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x06,0x00,0x00,0x20,0x06,0x00,0x00,0x20,0x06,0x00,0x00,0x20,0x06,0x00,0x00,0x20,0x06,0x00,0x00,0x20,0x06,0x00,0x00,0x20,0x06,0x00,0x00,0x20,0x06,0x00,0x00,0x20,0x06,0x00,0x00,0x20,0x06, // 61 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x18,0x00,0x00,0x18,0x0C,0x00,0x00,0x10,0x0C,0x00,0x00,0x30,0x04,0x00,0x00,0x20,0x06,0x00,0x00,0x60,0x02,0x00,0x00,0x60,0x03,0x00,0x00,0xC0,0x01,0x00,0x00,0xC0,0x01,0x00,0x00,0x80, // 62 + 0x00,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x80,0x01,0xC7,0x00,0x80,0xC0,0xCF,0x00,0x80,0xE1,0x84,0x00,0x80,0x7F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x0C, // 63 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x0F,0x00,0x00,0x7C,0x3E,0x00,0x00,0x0E,0x70,0x00,0x00,0x07,0x40,0x00,0x00,0xE3,0xC7,0x00,0x80,0x71,0x8E,0x00,0x80,0x11,0x88,0x00,0x80,0x09,0x88,0x00,0x80,0x08,0x84,0x00,0x80,0x91,0x87,0x00,0x80,0xF9,0xCF,0x00,0x00,0x09,0x48,0x00,0x00,0x03,0x0C,0x00,0x00,0x0E,0x06,0x00,0x00,0xFC,0x03, // 64 + 0x00,0x00,0xC0,0x00,0x00,0x00,0xFC,0x00,0x00,0xE0,0x7F,0x00,0x00,0xFF,0x05,0x00,0x80,0x0F,0x04,0x00,0x80,0x07,0x04,0x00,0x80,0xFF,0x04,0x00,0x00,0xF0,0x3F,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xC0, // 65 + 0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0x00,0x80,0xFF,0xFF,0x00,0x80,0xC1,0x80,0x00,0x80,0xC1,0x80,0x00,0x80,0xC1,0x80,0x00,0x80,0xC1,0xC0,0x00,0x00,0xFF,0xE1,0x00,0x00,0x3E,0x7F,0x00,0x00,0x00,0x3E, // 66 + 0x00,0x00,0x00,0x00,0x00,0xF8,0x0F,0x00,0x00,0xFE,0x3F,0x00,0x00,0x0F,0x70,0x00,0x00,0x03,0xC0,0x00,0x80,0x01,0xC0,0x00,0x80,0x01,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x01,0xC0,0x00,0x80,0x03,0xE0, // 67 + 0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0x00,0x80,0xFF,0xFF,0x00,0x80,0x01,0x80,0x00,0x80,0x01,0x80,0x00,0x80,0x01,0x80,0x00,0x80,0x01,0xC0,0x00,0x00,0x03,0xC0,0x00,0x00,0x0F,0x78,0x00,0x00,0xFE,0x3F,0x00,0x00,0xF0,0x0F, // 68 + 0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0x00,0x80,0xFF,0xFF,0x00,0x80,0xC1,0x80,0x00,0x80,0xC1,0x80,0x00,0x80,0xC1,0x80,0x00,0x80,0xC1,0x80,0x00,0x80,0xC1,0x80, // 69 + 0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0x00,0x80,0xFF,0xFF,0x00,0x80,0xC1,0x80,0x00,0x80,0xC1,0x00,0x00,0x80,0xC1,0x00,0x00,0x80,0xC1,0x00,0x00,0x80,0xC1, // 70 + 0x00,0x00,0x00,0x00,0x00,0xF8,0x0F,0x00,0x00,0xFE,0x3F,0x00,0x00,0x0F,0x70,0x00,0x00,0x03,0xC0,0x00,0x80,0x01,0xC0,0x00,0x80,0x00,0x81,0x00,0x80,0x01,0x81,0x00,0x80,0x01,0xFF,0x00,0x80,0x03,0xFF, // 71 + 0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0x00,0x80,0xFF,0xFF,0x00,0x80,0xC0,0x80,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x80,0xFF,0xFF,0x00,0x80,0xFF,0xFF, // 72 + 0x00,0x00,0x00,0x00,0x80,0x1F,0xFC,0x00,0x80,0xFF,0xFF,0x00,0x80,0x01,0x80, // 73 + 0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xE0,0x00,0x80,0xFF,0x7F,0x00,0x80,0xFF,0x1F, // 74 + 0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0x00,0x80,0xFF,0xFF,0x00,0x80,0xC0,0x80,0x00,0x00,0xF0,0x03,0x00,0x00,0x3C,0x0F,0x00,0x00,0x0E,0x3C,0x00,0x80,0x03,0x70,0x00,0x80,0x01,0xE0,0x00,0x80,0x00,0x80, // 75 + 0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0x00,0x80,0xFF,0xFF,0x00,0x80,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80, // 76 + 0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0x00,0x80,0xFF,0xFF,0x00,0x80,0x07,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0xC0,0x0F,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x3F,0x00,0x00,0xF8,0x01,0x00,0x80,0x1F,0x00,0x00,0x80,0xFF,0xFF,0x00,0x80,0xFF,0xFF, // 77 + 0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0x00,0x80,0xFF,0xFF,0x00,0x80,0x0F,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x3C,0x00,0x80,0xFF,0xFF,0x00,0x80,0xFF,0xFF, // 78 + 0x00,0x00,0x00,0x00,0x00,0xF8,0x0F,0x00,0x00,0xFE,0x3F,0x00,0x00,0x07,0x70,0x00,0x80,0x01,0xC0,0x00,0x80,0x01,0x80,0x00,0x80,0x01,0x80,0x00,0x80,0x01,0xC0,0x00,0x00,0x03,0xE0,0x00,0x00,0xFE,0x7F,0x00,0x00,0xFC,0x1F, // 79 + 0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0x00,0x80,0xFF,0xFF,0x00,0x80,0x01,0x83,0x00,0x80,0x01,0x03,0x00,0x80,0x01,0x03,0x00,0x80,0x01,0x01,0x00,0x00,0xFF,0x01,0x00,0x00,0xFE,0x00,0x00,0x00,0x38, // 80 + 0x00,0x00,0x00,0x00,0x00,0xF8,0x0F,0x00,0x00,0xFE,0x3F,0x00,0x00,0x07,0x70,0x00,0x80,0x01,0xC0,0x00,0x80,0x01,0x80,0x00,0x80,0x01,0x80,0x00,0x80,0x01,0xC0,0x00,0x00,0x03,0xE0,0x00,0x00,0xFE,0xFF,0x01,0x00,0xFC,0x9F,0x01,0x00,0x00,0x80, // 81 + 0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0x00,0x80,0xFF,0xFF,0x00,0x80,0x81,0x81,0x00,0x80,0x81,0x01,0x00,0x80,0x81,0x01,0x00,0x80,0x81,0x0F,0x00,0x00,0xFF,0xFE,0x00,0x00,0x7E,0xF0,0x00,0x00,0x10,0x80, // 82 + 0x00,0x00,0x00,0x00,0x00,0x3F,0xE0,0x00,0x00,0x7F,0x80,0x00,0x80,0xE1,0x80,0x00,0x80,0xC0,0x81,0x00,0x80,0x80,0x83,0x00,0x80,0x01,0xE7,0x00,0x80,0x03,0x7E,0x00,0x00,0x00,0x38, // 83 + 0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0xFF,0xFF,0x00,0x80,0xFF,0xFF,0x00,0x80,0x01,0x80,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01, // 84 + 0x00,0x00,0x00,0x00,0x80,0xFF,0x1F,0x00,0x80,0xFF,0x7F,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xC0,0x00,0x80,0x1F,0xF8,0x00,0x80,0xFF,0x7F,0x00,0x80,0x01, // 85 + 0x80,0x01,0x00,0x00,0x80,0x1F,0x00,0x00,0x00,0xFF,0x03,0x00,0x00,0xC0,0x7F,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0xF0,0x00,0x00,0x80,0xFF,0x00,0x00,0xFE,0x07,0x00,0x80,0x3F,0x00,0x00,0x80,0x03, // 86 + 0x80,0x01,0x00,0x00,0x80,0x3F,0x00,0x00,0x80,0xFF,0x0F,0x00,0x00,0xC0,0xFF,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x0F,0x00,0x80,0x1F,0x00,0x00,0x80,0x3F,0x00,0x00,0x00,0xFC,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0xF0,0x00,0x00,0xE0,0xFF,0x00,0x80,0xFF,0x03,0x00,0x80,0x1F,0x00,0x00,0x80, // 87 + 0x80,0x00,0x80,0x00,0x80,0x03,0xE0,0x00,0x80,0x0F,0xF8,0x00,0x00,0x3C,0x1E,0x00,0x00,0xE0,0x07,0x00,0x00,0xF0,0x07,0x00,0x00,0x3C,0x3E,0x00,0x80,0x0F,0xF8,0x00,0x80,0x03,0xC0,0x00,0x80,0x00,0x80, // 88 + 0x80,0x01,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0xF0,0xE1,0x00,0x00,0x80,0xFF,0x00,0x00,0xF0,0xF9,0x00,0x00,0x3F,0x00,0x00,0x80,0x07,0x00,0x00,0x80,0x01, // 89 + 0x00,0x00,0x80,0x00,0x80,0x01,0xE0,0x00,0x80,0x01,0xF8,0x00,0x80,0x01,0xBF,0x00,0x80,0xE1,0x83,0x00,0x80,0xFD,0x80,0x00,0x80,0x1F,0x80,0x00,0x80,0x03,0x80,0x00,0x80,0x00,0x80, // 90 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xFF,0xFF,0x01,0xC0,0xFF,0xFF,0x01,0x40,0x00,0x00,0x01,0x40,0x00,0x00,0x01,0x40,0x00,0x00,0x01, // 91 + 0x80,0x00,0x00,0x00,0x80,0x0F,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0xC0,0x1F,0x00,0x00,0x00,0xF8, // 92 + 0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x01,0x40,0x00,0x00,0x01,0x40,0x00,0x00,0x01,0xC0,0xFF,0xFF,0x01,0xC0,0xFF,0xFF,0x01, // 93 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x1E,0x00,0x00,0x80,0x03,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x38, // 94 + 0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06, // 95 + 0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x02, // 96 + 0x00,0x00,0x00,0x00,0x00,0x03,0x7F,0x00,0x80,0x81,0xFF,0x00,0x80,0x81,0xC1,0x00,0x80,0xC0,0x80,0x00,0x80,0x40,0x80,0x00,0x80,0x41,0xC0,0x00,0x80,0x67,0xE0,0x00,0x00,0xFF,0xFF,0x00,0x00,0xF8,0xFF, // 97 + 0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0x00,0x80,0xFF,0xFF,0x00,0x80,0xC1,0x80,0x00,0x80,0xC1,0x80,0x00,0x80,0xC1,0x80,0x00,0x80,0xC1,0xC0,0x00,0x00,0xE3,0xC1,0x00,0x00,0xFF,0x7F,0x00,0x00,0x1C,0x3F, // 98 + 0x00,0x00,0x00,0x00,0x00,0xF8,0x0F,0x00,0x00,0xFE,0x3F,0x00,0x00,0x0F,0x70,0x00,0x00,0x03,0xC0,0x00,0x80,0x01,0xC0,0x00,0x80,0x01,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x01,0xC0,0x00,0x80,0x03,0xE0, // 99 + 0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0x00,0x80,0xFF,0xFF,0x00,0x80,0x01,0x80,0x00,0x80,0x01,0x80,0x00,0x80,0x01,0x80,0x00,0x80,0x01,0xC0,0x00,0x00,0x03,0xC0,0x00,0x00,0x0F,0x78,0x00,0x00,0xFE,0x3F,0x00,0x00,0xF0,0x0F, // 100 + 0x00,0x00,0x00,0x00,0x00,0xF8,0x0F,0x00,0x00,0xFE,0x3F,0x00,0x00,0xC7,0x70,0x00,0x80,0xC1,0xC0,0x00,0x80,0xC0,0x80,0x00,0x80,0xC1,0x80,0x00,0x80,0xC3,0x80,0x00,0x00,0xFF,0xC0,0x00,0x00,0xFC,0xE0, // 101 + 0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0x00,0x00,0xFE,0xFF,0x00,0x00,0xC7,0x80,0x00,0x80,0xC1,0x00,0x00,0x80,0xC1,0x00,0x00,0x80,0xC0,0x00,0x00,0x80,0xC1,0x00,0x00,0x80,0x01, // 102 + 0x00,0x00,0x00,0x00,0x00,0xF8,0x0F,0x00,0x00,0xFE,0x3F,0x00,0x00,0x0F,0x70,0x00,0x00,0x03,0xC0,0x00,0x80,0x01,0xC0,0x00,0x80,0x00,0x81,0x00,0x80,0x01,0x81,0x00,0x80,0x01,0xFF,0x00,0x80,0x03,0xFF, // 103 + 0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0x00,0x80,0xFF,0xFF,0x00,0x80,0xC0,0x80,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x80,0xFF,0xFF,0x00,0x80,0xFF,0xFF, // 104 + 0x00,0x00,0x00,0x00,0x80,0x1F,0xFC,0x00,0x80,0xFF,0xFF,0x00,0x80,0x01,0x80, // 105 + 0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xE0,0x00,0x80,0xFF,0x7F,0x00,0x80,0xFF,0x1F, // 106 + 0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0x00,0x80,0xFF,0xFF,0x00,0x80,0xC0,0x80,0x00,0x00,0xF0,0x03,0x00,0x00,0x3C,0x0F,0x00,0x00,0x0E,0x3C,0x00,0x80,0x03,0x70,0x00,0x80,0x01,0xE0,0x00,0x80,0x00,0x80, // 107 + 0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0x00,0x80,0xFF,0xFF,0x00,0x80,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80, // 108 + 0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0x00,0x80,0xFF,0xFF,0x00,0x00,0x03,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x3F,0xF0,0x00,0x00,0xFF,0xFF,0x00,0x00,0x03,0x80,0x00,0x00,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x0F,0xC0,0x00,0x00,0xFF,0xFF,0x00,0x00,0x08,0xF0, // 109 + 0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0x00,0x80,0xFF,0xFF,0x00,0x00,0x06,0x00,0x00,0x00,0x03,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0xFF,0xFF,0x00,0x00,0xFF,0xFF, // 110 + 0x00,0x00,0x00,0x00,0x00,0xF8,0x0F,0x00,0x00,0xFE,0x3F,0x00,0x00,0x07,0x70,0x00,0x80,0x01,0xC0,0x00,0x80,0x01,0x80,0x00,0x80,0x01,0x80,0x00,0x80,0x01,0xC0,0x00,0x00,0x03,0xE0,0x00,0x00,0xFE,0x7F,0x00,0x00,0xFC,0x1F, // 111 + 0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0x00,0x80,0xFF,0xFF,0x00,0x80,0x01,0x83,0x00,0x80,0x01,0x03,0x00,0x80,0x01,0x03,0x00,0x80,0x01,0x01,0x00,0x00,0xFF,0x01,0x00,0x00,0xFE,0x00,0x00,0x00,0x38, // 112 + 0x00,0x00,0x00,0x00,0x00,0xF8,0x0F,0x00,0x00,0xFE,0x3F,0x00,0x00,0x07,0x70,0x00,0x80,0x01,0xC0,0x00,0x80,0x01,0x80,0x00,0x80,0x01,0x80,0x00,0x80,0x01,0xC0,0x00,0x00,0x03,0xE0,0x00,0x00,0xFE,0xFF,0x01,0x00,0xFC,0x9F,0x01,0x00,0x00,0x80, // 113 + 0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0x00,0x80,0xFF,0xFF,0x00,0x00,0x06,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01, // 114 + 0x00,0x00,0x00,0x00,0x00,0x3F,0xE0,0x00,0x00,0x7F,0x80,0x00,0x80,0xE1,0x80,0x00,0x80,0xC0,0x81,0x00,0x80,0x80,0x83,0x00,0x80,0x01,0xE7,0x00,0x80,0x03,0x7E,0x00,0x00,0x00,0x38, // 115 + 0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0xFF,0xFF,0x00,0x80,0xFF,0xFF,0x00,0x80,0x01,0x80,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01, // 116 + 0x00,0x00,0x00,0x00,0x80,0xFF,0x1F,0x00,0x80,0xFF,0xFF,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x60,0x00,0x80,0xFF,0xFF,0x00,0x80,0xFF,0xFF, // 117 + 0x80,0x01,0x00,0x00,0x80,0x1F,0x00,0x00,0x00,0xFF,0x03,0x00,0x00,0xC0,0x7F,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0xF0,0x00,0x00,0x80,0xFF,0x00,0x00,0xFE,0x07,0x00,0x80,0x3F,0x00,0x00,0x80,0x03, // 118 + 0x80,0x01,0x00,0x00,0x80,0x3F,0x00,0x00,0x80,0xFF,0x0F,0x00,0x00,0xC0,0xFF,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x0F,0x00,0x80,0x1F,0x00,0x00,0x80,0x3F,0x00,0x00,0x00,0xFC,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0xF0,0x00,0x00,0xE0,0xFF,0x00,0x80,0xFF,0x03,0x00,0x80,0x1F,0x00,0x00,0x80, // 119 + 0x80,0x00,0x80,0x00,0x80,0x03,0xE0,0x00,0x80,0x0F,0xF8,0x00,0x00,0x3C,0x1E,0x00,0x00,0xE0,0x07,0x00,0x00,0xF0,0x07,0x00,0x00,0x3C,0x3E,0x00,0x80,0x0F,0xF8,0x00,0x80,0x03,0xC0,0x00,0x80,0x00,0x80, // 120 + 0x80,0x00,0xC0,0x00,0x80,0x07,0x80,0x00,0x00,0x1F,0xC0,0x00,0x00,0xF8,0xE0,0x00,0x00,0xC0,0x7F,0x00,0x00,0x80,0x1F,0x00,0x00,0xF0,0x03,0x00,0x00,0x7F,0x00,0x00,0x80,0x0F,0x00,0x00,0x80,0x01, // 121 + 0x00,0x00,0x80,0x00,0x80,0x01,0xE0,0x00,0x80,0x01,0xF8,0x00,0x80,0x01,0xBF,0x00,0x80,0xE1,0x83,0x00,0x80,0xFD,0x80,0x00,0x80,0x1F,0x80,0x00,0x80,0x03,0x80,0x00,0x80,0x00,0x80, // 122 + 0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x01,0x00,0x80,0x7F,0xFF,0x00,0xC0,0x7F,0xFF,0x01,0xC0,0x00,0x00,0x01,0x40,0x00,0x00,0x01,0x40,0x00,0x00,0x01, // 123 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0xE0,0xFF,0xFF,0x3F, // 124 + 0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x01,0x40,0x00,0x00,0x01,0xC0,0x30,0x86,0x01,0x80,0x7F,0xFF,0x01,0x00,0xCF,0xFB,0x00,0x00,0x80,0x00,0x00,0x00,0x80, // 125 +}; + +const uint8_t font_Nimbus_Sans_L_25[] = { + 0x15, // Width: 21 + 0x20, // Height: 32 + 0x20, // First Char: 32 + 0x5E, // Numbers of Chars: 95 + + // Jump Table: + 0xFF, 0xFF, 0x00, 0x06, // 32:65535 + 0x00, 0x00, 0x0F, 0x06, // 33:0 + 0x00, 0x0F, 0x16, 0x07, // 34:15 + 0x00, 0x25, 0x2A, 0x0B, // 35:37 + 0x00, 0x4F, 0x2B, 0x0B, // 36:79 + 0x00, 0x7A, 0x47, 0x12, // 37:122 + 0x00, 0xC1, 0x2F, 0x0E, // 38:193 + 0x00, 0xF0, 0x0A, 0x04, // 39:240 + 0x00, 0xFA, 0x18, 0x07, // 40:250 + 0x01, 0x12, 0x13, 0x07, // 41:274 + 0x01, 0x25, 0x1A, 0x08, // 42:293 + 0x01, 0x3F, 0x2B, 0x0C, // 43:319 + 0x01, 0x6A, 0x10, 0x06, // 44:362 + 0x01, 0x7A, 0x17, 0x07, // 45:378 + 0x01, 0x91, 0x0F, 0x06, // 46:401 + 0x01, 0xA0, 0x15, 0x06, // 47:416 + 0x01, 0xB5, 0x27, 0x0B, // 48:437 + 0x01, 0xDC, 0x1B, 0x0B, // 49:476 + 0x01, 0xF7, 0x27, 0x0B, // 50:503 + 0x02, 0x1E, 0x2B, 0x0B, // 51:542 + 0x02, 0x49, 0x2B, 0x0B, // 52:585 + 0x02, 0x74, 0x27, 0x0B, // 53:628 + 0x02, 0x9B, 0x2B, 0x0B, // 54:667 + 0x02, 0xC6, 0x2A, 0x0B, // 55:710 + 0x02, 0xF0, 0x27, 0x0B, // 56:752 + 0x03, 0x17, 0x27, 0x0B, // 57:791 + 0x03, 0x3E, 0x0F, 0x06, // 58:830 + 0x03, 0x4D, 0x10, 0x06, // 59:845 + 0x03, 0x5D, 0x2B, 0x0C, // 60:861 + 0x03, 0x88, 0x2B, 0x0C, // 61:904 + 0x03, 0xB3, 0x2B, 0x0C, // 62:947 + 0x03, 0xDE, 0x26, 0x0B, // 63:990 + 0x04, 0x04, 0x47, 0x15, // 64:1028 + 0x04, 0x4B, 0x33, 0x0E, // 65:1099 + 0x04, 0x7E, 0x33, 0x0E, // 66:1150 + 0x04, 0xB1, 0x37, 0x0F, // 67:1201 + 0x04, 0xE8, 0x33, 0x0F, // 68:1256 + 0x05, 0x1B, 0x33, 0x0E, // 69:1307 + 0x05, 0x4E, 0x2D, 0x0D, // 70:1358 + 0x05, 0x7B, 0x37, 0x10, // 71:1403 + 0x05, 0xB2, 0x33, 0x0F, // 72:1458 + 0x05, 0xE5, 0x0F, 0x06, // 73:1509 + 0x05, 0xF4, 0x23, 0x0A, // 74:1524 + 0x06, 0x17, 0x33, 0x0E, // 75:1559 + 0x06, 0x4A, 0x27, 0x0B, // 76:1610 + 0x06, 0x71, 0x3B, 0x11, // 77:1649 + 0x06, 0xAC, 0x33, 0x0F, // 78:1708 + 0x06, 0xDF, 0x3B, 0x10, // 79:1759 + 0x07, 0x1A, 0x2E, 0x0E, // 80:1818 + 0x07, 0x48, 0x3B, 0x10, // 81:1864 + 0x07, 0x83, 0x37, 0x0F, // 82:1923 + 0x07, 0xBA, 0x2F, 0x0E, // 83:1978 + 0x07, 0xE9, 0x2D, 0x0D, // 84:2025 + 0x08, 0x16, 0x33, 0x0F, // 85:2070 + 0x08, 0x49, 0x31, 0x0E, // 86:2121 + 0x08, 0x7A, 0x49, 0x13, // 87:2170 + 0x08, 0xC3, 0x33, 0x0E, // 88:2243 + 0x08, 0xF6, 0x31, 0x0E, // 89:2294 + 0x09, 0x27, 0x2F, 0x0D, // 90:2343 + 0x09, 0x56, 0x14, 0x06, // 91:2390 + 0x09, 0x6A, 0x17, 0x06, // 92:2410 + 0x09, 0x81, 0x14, 0x06, // 93:2433 + 0x09, 0x95, 0x27, 0x0A, // 94:2453 + 0x09, 0xBC, 0x2C, 0x0B, // 95:2492 + 0x09, 0xE8, 0x0E, 0x07, // 96:2536 + 0x09, 0xF6, 0x2B, 0x0B, // 97:2550 + 0x0A, 0x21, 0x27, 0x0B, // 98:2593 + 0x0A, 0x48, 0x27, 0x0A, // 99:2632 + 0x0A, 0x6F, 0x27, 0x0B, // 100:2671 + 0x0A, 0x96, 0x27, 0x0B, // 101:2710 + 0x0A, 0xBD, 0x16, 0x06, // 102:2749 + 0x0A, 0xD3, 0x28, 0x0B, // 103:2771 + 0x0A, 0xFB, 0x27, 0x0B, // 104:2811 + 0x0B, 0x22, 0x0B, 0x05, // 105:2850 + 0x0B, 0x2D, 0x0C, 0x05, // 106:2861 + 0x0B, 0x39, 0x27, 0x0A, // 107:2873 + 0x0B, 0x60, 0x0B, 0x05, // 108:2912 + 0x0B, 0x6B, 0x3F, 0x11, // 109:2923 + 0x0B, 0xAA, 0x27, 0x0B, // 110:2986 + 0x0B, 0xD1, 0x2B, 0x0B, // 111:3025 + 0x0B, 0xFC, 0x27, 0x0B, // 112:3068 + 0x0C, 0x23, 0x28, 0x0B, // 113:3107 + 0x0C, 0x4B, 0x16, 0x07, // 114:3147 + 0x0C, 0x61, 0x23, 0x0A, // 115:3169 + 0x0C, 0x84, 0x17, 0x06, // 116:3204 + 0x0C, 0x9B, 0x27, 0x0B, // 117:3227 + 0x0C, 0xC2, 0x26, 0x0A, // 118:3266 + 0x0C, 0xE8, 0x36, 0x0F, // 119:3304 + 0x0D, 0x1E, 0x27, 0x0A, // 120:3358 + 0x0D, 0x45, 0x26, 0x0A, // 121:3397 + 0x0D, 0x6B, 0x23, 0x0A, // 122:3435 + 0x0D, 0x8E, 0x18, 0x07, // 123:3470 + 0x0D, 0xA6, 0x0F, 0x05, // 124:3494 + 0x0D, 0xB5, 0x1B, 0x07, // 125:3509 + + // Font Data: + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xFF,0xE7,0x00,0xC0,0xFF,0xE7, // 33 + 0x00,0x00,0x00,0x00,0xC0,0x0F,0x00,0x00,0xC0,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x0F,0x00,0x00,0xC0,0x0F, // 34 + 0x00,0x00,0x00,0x00,0x00,0x30,0x06,0x00,0x00,0x30,0xF6,0x00,0x00,0xF8,0x7F,0x00,0x80,0x3F,0x06,0x00,0x00,0x30,0x06,0x00,0x00,0x30,0xFE,0x00,0x00,0xFC,0x3F,0x00,0x80,0x3F,0x06,0x00,0x00,0x30,0x06,0x00,0x00,0x30, // 35 + 0x00,0x00,0x00,0x00,0x00,0x1E,0x3C,0x00,0x80,0x7F,0x7C,0x00,0x80,0x61,0xE0,0x00,0xC0,0xE0,0xC0,0x00,0xE0,0xFF,0xFF,0x03,0xC0,0xC0,0xC0,0x00,0x80,0xC1,0xC1,0x00,0x80,0x83,0x63,0x00,0x80,0x87,0x7F,0x00,0x00,0x06,0x1F, // 36 + 0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x00,0x80,0xFF,0x00,0x00,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x00,0x80,0xFF,0x60,0x00,0x00,0x3E,0x18,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x01,0x00,0x00,0xC0,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x0C,0x3E,0x00,0x00,0x03,0x7F,0x00,0x80,0x80,0xC1,0x00,0x00,0x80,0x80,0x00,0x00,0x80,0xC1,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x3E, // 37 + 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x7F,0x00,0x00,0x8F,0xE1,0x00,0x80,0xFF,0xC0,0x00,0xC0,0x70,0xC0,0x00,0xC0,0xF0,0xC1,0x00,0xC0,0x1F,0x67,0x00,0x80,0x0F,0x3E,0x00,0x00,0x00,0x3F,0x00,0x00,0x80,0xF7,0x00,0x00,0x00,0xC0, // 38 + 0x00,0x00,0x00,0x00,0xC0,0x0F,0x00,0x00,0xC0,0x0F, // 39 + 0x00,0x00,0x00,0x00,0x00,0xE0,0x3F,0x00,0x00,0xFC,0xFF,0x01,0x00,0x1F,0xC0,0x07,0xC0,0x01,0x00,0x1C,0x40,0x00,0x00,0x10, // 40 + 0x40,0x00,0x00,0x10,0xC0,0x01,0x00,0x1C,0x00,0x0F,0x80,0x07,0x00,0xFC,0xFF,0x01,0x00,0xE0,0x3F, // 41 + 0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x1A,0x00,0x00,0xC0,0x0F,0x00,0x00,0xC0,0x0F,0x00,0x00,0x00,0x1A,0x00,0x00,0x00,0x03, // 42 + 0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0xF0,0xFF,0x00,0x00,0xF0,0xFF,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06, // 43 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x04,0x00,0x00,0xE0,0x03, // 44 + 0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03, // 45 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0, // 46 + 0x00,0x00,0xE0,0x00,0x00,0x00,0x3E,0x00,0x00,0xC0,0x07,0x00,0x00,0x7C,0x00,0x00,0xC0,0x07,0x00,0x00,0xC0, // 47 + 0x00,0x00,0x00,0x00,0x00,0xF8,0x0F,0x00,0x00,0xFE,0x3F,0x00,0x00,0x07,0x70,0x00,0x80,0x01,0xC0,0x00,0x80,0x01,0xC0,0x00,0x80,0x01,0xC0,0x00,0x00,0x07,0x70,0x00,0x00,0xFE,0x3F,0x00,0x00,0xF8,0x0F, // 48 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0E,0x00,0x00,0x80,0xFF,0xFF,0x00,0x80,0xFF,0xFF, // 49 + 0x00,0x00,0xC0,0x00,0x00,0x1E,0xF8,0x00,0x00,0x0F,0xDC,0x00,0x80,0x03,0xCE,0x00,0x80,0x01,0xC6,0x00,0x80,0x01,0xC3,0x00,0x80,0x81,0xC3,0x00,0x80,0xC3,0xC1,0x00,0x00,0xFF,0xC0,0x00,0x00,0x7E,0xC0, // 50 + 0x00,0x00,0x00,0x00,0x00,0x0E,0x3C,0x00,0x00,0x0F,0x78,0x00,0x80,0x03,0xE0,0x00,0x80,0xC1,0xC0,0x00,0x80,0xC1,0xC0,0x00,0x80,0xC1,0xC0,0x00,0x80,0xE3,0xC0,0x00,0x00,0xBF,0x61,0x00,0x00,0x9E,0x7F,0x00,0x00,0x00,0x1F, // 51 + 0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x80,0x0F,0x00,0x00,0xE0,0x0C,0x00,0x00,0x30,0x0C,0x00,0x00,0x1C,0x0C,0x00,0x00,0x07,0x0C,0x00,0x80,0xFF,0xFF,0x00,0x80,0xFF,0xFF,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C, // 52 + 0x00,0x00,0x18,0x00,0x00,0xFC,0x78,0x00,0x80,0xFF,0x60,0x00,0x80,0x61,0xC0,0x00,0x80,0x61,0xC0,0x00,0x80,0x61,0xC0,0x00,0x80,0x61,0xC0,0x00,0x80,0xC1,0x60,0x00,0x80,0xC1,0x7F,0x00,0x00,0x00,0x1F, // 53 + 0x00,0x00,0x00,0x00,0x00,0xF0,0x0F,0x00,0x00,0xFE,0x3F,0x00,0x00,0xCF,0x70,0x00,0x80,0x43,0xC0,0x00,0x80,0x61,0xC0,0x00,0x80,0x61,0xC0,0x00,0x80,0x61,0xC0,0x00,0x00,0xE3,0x60,0x00,0x00,0xC7,0x7F,0x00,0x00,0x04,0x1F, // 54 + 0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0xF0,0x00,0x80,0x01,0xFE,0x00,0x80,0x81,0x0F,0x00,0x80,0xF1,0x01,0x00,0x80,0x39,0x00,0x00,0x80,0x0F,0x00,0x00,0x80,0x03,0x00,0x00,0x80,0x01, // 55 + 0x00,0x00,0x00,0x00,0x00,0x3E,0x1F,0x00,0x00,0xFF,0x7F,0x00,0x80,0xE3,0xE1,0x00,0x80,0xC1,0xC0,0x00,0x80,0xC1,0xC0,0x00,0x80,0xC1,0xC0,0x00,0x80,0xE3,0xE1,0x00,0x00,0xFF,0x7F,0x00,0x00,0x1E,0x1F, // 56 + 0x00,0x00,0x00,0x00,0x00,0x7C,0x38,0x00,0x00,0xFF,0x79,0x00,0x80,0x83,0xE3,0x00,0x80,0x01,0xC3,0x00,0x80,0x01,0xC3,0x00,0x80,0x01,0xC3,0x00,0x00,0x83,0x71,0x00,0x00,0xFF,0x3F,0x00,0x00,0xFC,0x07, // 57 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0xE0,0x00,0x00,0x38,0xE0, // 58 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0xE0,0x04,0x00,0x38,0xE0,0x03, // 59 + 0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x00,0x00,0x80,0x0D,0x00,0x00,0x80,0x0D,0x00,0x00,0xC0,0x18,0x00,0x00,0xC0,0x38,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x60,0x00,0x00,0x30,0x60,0x00,0x00,0x30,0xC0, // 60 + 0x00,0x00,0x00,0x00,0x00,0xC0,0x18,0x00,0x00,0xC0,0x18,0x00,0x00,0xC0,0x18,0x00,0x00,0xC0,0x18,0x00,0x00,0xC0,0x18,0x00,0x00,0xC0,0x18,0x00,0x00,0xC0,0x18,0x00,0x00,0xC0,0x18,0x00,0x00,0xC0,0x18,0x00,0x00,0xC0,0x18, // 61 + 0x00,0x00,0x00,0x00,0x00,0x30,0x60,0x00,0x00,0x30,0x60,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0xC0,0x18,0x00,0x00,0x80,0x19,0x00,0x00,0x80,0x0D,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x06, // 62 + 0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x80,0x07,0x00,0x00,0xC0,0x01,0x00,0x00,0xC0,0x00,0xE7,0x00,0xC0,0x80,0xE7,0x00,0xC0,0xC0,0x00,0x00,0xC0,0x71,0x00,0x00,0x80,0x3F,0x00,0x00,0x00,0x1F, // 63 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x03,0x00,0x00,0xFC,0x0F,0x00,0x00,0x0F,0x3C,0x00,0x00,0xC3,0x77,0x00,0x80,0xF1,0x6F,0x00,0xC0,0x39,0xFC,0x00,0xC0,0x1C,0xD8,0x00,0xC0,0x0C,0xC8,0x00,0xC0,0x0C,0xC6,0x00,0xC0,0xF8,0xDF,0x00,0x80,0x7D,0x58,0x00,0x80,0x07,0x6C,0x00,0x00,0x07,0x3E,0x00,0x00,0xFE,0x17,0x00,0x00,0xF8,0x01, // 64 + 0x00,0x00,0x80,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x7E,0x00,0x00,0xE0,0x0F,0x00,0x00,0xFC,0x07,0x00,0x80,0x1F,0x06,0x00,0xC0,0x01,0x06,0x00,0xC0,0x0F,0x06,0x00,0x00,0xFF,0x06,0x00,0x00,0xF8,0x07,0x00,0x00,0x80,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0xC0, // 65 + 0x00,0x00,0x00,0x00,0xC0,0xFF,0xFF,0x00,0xC0,0xFF,0xFF,0x00,0xC0,0xC0,0xC0,0x00,0xC0,0xC0,0xC0,0x00,0xC0,0xC0,0xC0,0x00,0xC0,0xC0,0xC0,0x00,0xC0,0xC0,0xC0,0x00,0xC0,0xC0,0xC0,0x00,0xC0,0xE1,0xC0,0x00,0x80,0xBF,0x61,0x00,0x00,0x9F,0x7F,0x00,0x00,0x00,0x1F, // 66 + 0x00,0x00,0x00,0x00,0x00,0xF8,0x07,0x00,0x00,0xFE,0x1F,0x00,0x00,0x0F,0x3C,0x00,0x80,0x03,0x70,0x00,0xC0,0x01,0xE0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0x80,0x01,0x60,0x00,0x80,0x07,0x38,0x00,0x00,0x0F,0x1E,0x00,0x00,0x08,0x06, // 67 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xFF,0xFF,0x00,0xC0,0xFF,0xFF,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0x80,0x01,0x60,0x00,0x80,0x07,0x78,0x00,0x00,0xFF,0x1F,0x00,0x00,0xF8,0x07, // 68 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xFF,0xFF,0x00,0xC0,0xFF,0xFF,0x00,0xC0,0xC0,0xC0,0x00,0xC0,0xC0,0xC0,0x00,0xC0,0xC0,0xC0,0x00,0xC0,0xC0,0xC0,0x00,0xC0,0xC0,0xC0,0x00,0xC0,0xC0,0xC0,0x00,0xC0,0xC0,0xC0,0x00,0xC0,0xC0,0xC0,0x00,0xC0,0x00,0xC0, // 69 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xFF,0xFF,0x00,0xC0,0xFF,0xFF,0x00,0xC0,0xC0,0x00,0x00,0xC0,0xC0,0x00,0x00,0xC0,0xC0,0x00,0x00,0xC0,0xC0,0x00,0x00,0xC0,0xC0,0x00,0x00,0xC0,0xC0,0x00,0x00,0xC0,0xC0,0x00,0x00,0xC0, // 70 + 0x00,0x00,0x00,0x00,0x00,0xF8,0x07,0x00,0x00,0xFE,0x1F,0x00,0x00,0x0F,0x38,0x00,0x80,0x03,0x60,0x00,0xC0,0x01,0xE0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0xC0,0xC0,0x00,0xC0,0xC0,0xC0,0x00,0x80,0xC1,0x60,0x00,0x80,0xC3,0x30,0x00,0x00,0xC7,0x3F,0x00,0x00,0xC4,0xFF, // 71 + 0x00,0x00,0x00,0x00,0xC0,0xFF,0xFF,0x00,0xC0,0xFF,0xFF,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0xC0,0xFF,0xFF,0x00,0xC0,0xFF,0xFF, // 72 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xFF,0xFF,0x00,0xC0,0xFF,0xFF, // 73 + 0x00,0x00,0x3C,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xE0,0x00,0xC0,0xFF,0x7F,0x00,0xC0,0xFF,0x3F, // 74 + 0x00,0x00,0x00,0x00,0xC0,0xFF,0xFF,0x00,0xC0,0xFF,0xFF,0x00,0x00,0xC0,0x01,0x00,0x00,0xE0,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0xFC,0x01,0x00,0x00,0x8E,0x07,0x00,0x00,0x07,0x1F,0x00,0x80,0x03,0x7C,0x00,0xC0,0x01,0xF0,0x00,0x40,0x00,0xC0,0x00,0x00,0x00,0x80, // 75 + 0x00,0x00,0x00,0x00,0xC0,0xFF,0xFF,0x00,0xC0,0xFF,0xFF,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0, // 76 + 0x00,0x00,0x00,0x00,0xC0,0xFF,0xFF,0x00,0xC0,0xFF,0xFF,0x00,0xC0,0x07,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0xF0,0x03,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x3F,0x00,0x00,0xF0,0x03,0x00,0x00,0x3F,0x00,0x00,0xC0,0x07,0x00,0x00,0xC0,0xFF,0xFF,0x00,0xC0,0xFF,0xFF, // 77 + 0x00,0x00,0x00,0x00,0xC0,0xFF,0xFF,0x00,0xC0,0xFF,0xFF,0x00,0xC0,0x03,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0xC0,0x03,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0xF0,0x00,0xC0,0xFF,0xFF,0x00,0xC0,0xFF,0xFF, // 78 + 0x00,0x00,0x00,0x00,0x00,0xF0,0x07,0x00,0x00,0xFE,0x1F,0x00,0x00,0x0F,0x3C,0x00,0x80,0x03,0x70,0x00,0x80,0x01,0xE0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x01,0x60,0x00,0x80,0x03,0x70,0x00,0x00,0x0F,0x3C,0x00,0x00,0xFE,0x1F,0x00,0x00,0xF8,0x07, // 79 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xFF,0xFF,0x00,0xC0,0xFF,0xFF,0x00,0xC0,0xC0,0x00,0x00,0xC0,0xC0,0x00,0x00,0xC0,0xC0,0x00,0x00,0xC0,0xC0,0x00,0x00,0xC0,0xC0,0x00,0x00,0xC0,0xE1,0x00,0x00,0x80,0x7F,0x00,0x00,0x00,0x3F, // 80 + 0x00,0x00,0x00,0x00,0x00,0xF0,0x07,0x00,0x00,0xFE,0x1F,0x00,0x00,0x0F,0x3C,0x00,0x80,0x03,0x70,0x00,0x80,0x01,0xE0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xD8,0x00,0xC0,0x01,0xF8,0x00,0x80,0x03,0x70,0x00,0x00,0x0F,0xFC,0x00,0x00,0xFE,0xDF,0x01,0x00,0xF8,0x87, // 81 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xFF,0xFF,0x00,0xC0,0xFF,0xFF,0x00,0xC0,0xC0,0x00,0x00,0xC0,0xC0,0x00,0x00,0xC0,0xC0,0x00,0x00,0xC0,0xC0,0x00,0x00,0xC0,0xC0,0x00,0x00,0xC0,0xC0,0x00,0x00,0xC0,0xE1,0x01,0x00,0x80,0xFF,0xFF,0x00,0x00,0x1F,0xFF,0x00,0x00,0x00,0x80, // 82 + 0x00,0x00,0x00,0x00,0x00,0x1E,0x1C,0x00,0x80,0x7F,0x38,0x00,0x80,0x71,0x60,0x00,0xC0,0x60,0xC0,0x00,0xC0,0xE0,0xC0,0x00,0xC0,0xC0,0xC0,0x00,0xC0,0xC0,0xC0,0x00,0xC0,0xC1,0xC1,0x00,0x80,0x81,0x61,0x00,0x80,0x87,0x7F,0x00,0x00,0x06,0x1F, // 83 + 0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0xFF,0xFF,0x00,0xC0,0xFF,0xFF,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0, // 84 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xFF,0x1F,0x00,0xC0,0xFF,0x3F,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x70,0x00,0xC0,0xFF,0x3F,0x00,0xC0,0xFF,0x0F, // 85 + 0x00,0x00,0x00,0x00,0xC0,0x03,0x00,0x00,0xC0,0x1F,0x00,0x00,0x00,0xFE,0x01,0x00,0x00,0xE0,0x0F,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xFC,0x00,0x00,0x80,0x1F,0x00,0x00,0xF8,0x03,0x00,0x80,0x7F,0x00,0x00,0xC0,0x07,0x00,0x00,0xC0, // 86 + 0x40,0x00,0x00,0x00,0xC0,0x0F,0x00,0x00,0xC0,0xFF,0x01,0x00,0x00,0xF0,0x1F,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xF8,0x00,0x00,0x80,0x3F,0x00,0x00,0xFC,0x03,0x00,0xC0,0x1F,0x00,0x00,0xC0,0x01,0x00,0x00,0xC0,0x3F,0x00,0x00,0x00,0xFC,0x03,0x00,0x00,0x80,0x7F,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0xF8,0x1F,0x00,0xC0,0xFF,0x00,0x00,0xC0,0x07,0x00,0x00,0x40, // 87 + 0x00,0x00,0x00,0x00,0x40,0x00,0xC0,0x00,0xC0,0x01,0xF0,0x00,0x80,0x07,0x7C,0x00,0x00,0x1F,0x1E,0x00,0x00,0xFC,0x07,0x00,0x00,0xF0,0x01,0x00,0x00,0xF0,0x03,0x00,0x00,0x3C,0x0F,0x00,0x00,0x0F,0x3C,0x00,0xC0,0x03,0xF8,0x00,0xC0,0x00,0xE0,0x00,0x40,0x00,0x80, // 88 + 0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x03,0x00,0x00,0x80,0x0F,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0xC0,0xFF,0x00,0x00,0xC0,0xFF,0x00,0x00,0xF0,0x00,0x00,0x00,0x3E,0x00,0x00,0x80,0x0F,0x00,0x00,0xC0,0x03,0x00,0x00,0xC0, // 89 + 0x00,0x00,0xC0,0x00,0xC0,0x00,0xF0,0x00,0xC0,0x00,0xF8,0x00,0xC0,0x00,0xDE,0x00,0xC0,0x00,0xCF,0x00,0xC0,0xC0,0xC3,0x00,0xC0,0xF0,0xC0,0x00,0xC0,0x78,0xC0,0x00,0xC0,0x1E,0xC0,0x00,0xC0,0x0F,0xC0,0x00,0xC0,0x03,0xC0,0x00,0xC0,0x00,0xC0, // 90 + 0x00,0x00,0x00,0x00,0xC0,0xFF,0xFF,0x1F,0xC0,0xFF,0xFF,0x1F,0xC0,0x00,0x00,0x18,0xC0,0x00,0x00,0x18, // 91 + 0xC0,0x01,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x80,0x0F,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0xC0, // 92 + 0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x18,0xC0,0x00,0x00,0x18,0xC0,0xFF,0xFF,0x1F,0xC0,0xFF,0xFF,0x1F, // 93 + 0x00,0x00,0x03,0x00,0x00,0xE0,0x01,0x00,0x00,0x38,0x00,0x00,0x00,0x0F,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0xC0,0x03,0x00,0x00,0x00,0x02, // 94 + 0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04, // 95 + 0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x01,0x00,0x00,0x00,0x03, // 96 + 0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x70,0xFE,0x00,0x00,0x30,0xE6,0x00,0x00,0x18,0xC2,0x00,0x00,0x18,0xC2,0x00,0x00,0x18,0x43,0x00,0x00,0x38,0x23,0x00,0x00,0xF0,0x7F,0x00,0x00,0xE0,0xFF,0x00,0x00,0x00,0xC0, // 97 + 0x00,0x00,0x00,0x00,0xC0,0xFF,0xFF,0x00,0xC0,0xFF,0xFF,0x00,0x00,0x70,0x70,0x00,0x00,0x18,0xC0,0x00,0x00,0x18,0xC0,0x00,0x00,0x18,0xC0,0x00,0x00,0x38,0xE0,0x00,0x00,0xF0,0x7F,0x00,0x00,0xC0,0x1F, // 98 + 0x00,0x00,0x00,0x00,0x00,0x80,0x1F,0x00,0x00,0xE0,0x7F,0x00,0x00,0x70,0x70,0x00,0x00,0x18,0xC0,0x00,0x00,0x18,0xC0,0x00,0x00,0x18,0xC0,0x00,0x00,0x38,0xE0,0x00,0x00,0xF0,0x78,0x00,0x00,0xE0,0x18, // 99 + 0x00,0x00,0x00,0x00,0x00,0xC0,0x1F,0x00,0x00,0xF0,0x7F,0x00,0x00,0x38,0xF0,0x00,0x00,0x18,0xC0,0x00,0x00,0x18,0xC0,0x00,0x00,0x18,0xC0,0x00,0x00,0x70,0x60,0x00,0xC0,0xFF,0xFF,0x00,0xC0,0xFF,0xFF, // 100 + 0x00,0x00,0x00,0x00,0x00,0xC0,0x1F,0x00,0x00,0xF0,0x7F,0x00,0x00,0x30,0xE3,0x00,0x00,0x18,0xC3,0x00,0x00,0x18,0xC3,0x00,0x00,0x18,0xC3,0x00,0x00,0x38,0xE3,0x00,0x00,0xF0,0x73,0x00,0x00,0xE0,0x33, // 101 + 0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x80,0xFF,0xFF,0x00,0xC0,0xFF,0xFF,0x00,0xC0,0x18,0x00,0x00,0xC0,0x18, // 102 + 0x00,0x00,0x00,0x00,0x00,0xC0,0x1F,0x02,0x00,0xF0,0x7F,0x1E,0x00,0x38,0x70,0x3C,0x00,0x18,0xC0,0x30,0x00,0x18,0xC0,0x30,0x00,0x18,0xC0,0x30,0x00,0x70,0x60,0x18,0x00,0xF8,0xFF,0x1F,0x00,0xF8,0xFF,0x07, // 103 + 0x00,0x00,0x00,0x00,0xC0,0xFF,0xFF,0x00,0xC0,0xFF,0xFF,0x00,0x00,0x60,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0xF0,0xFF,0x00,0x00,0xE0,0xFF, // 104 + 0x00,0x00,0x00,0x00,0xC0,0xF9,0xFF,0x00,0xC0,0xF9,0xFF, // 105 + 0x00,0x00,0x00,0x18,0xC0,0xF9,0xFF,0x1F,0xC0,0xF9,0xFF,0x0F, // 106 + 0x00,0x00,0x00,0x00,0xC0,0xFF,0xFF,0x00,0xC0,0xFF,0xFF,0x00,0x00,0x00,0x07,0x00,0x00,0x80,0x03,0x00,0x00,0xE0,0x0F,0x00,0x00,0x70,0x3E,0x00,0x00,0x38,0xF8,0x00,0x00,0x08,0xE0,0x00,0x00,0x00,0x80, // 107 + 0x00,0x00,0x00,0x00,0xC0,0xFF,0xFF,0x00,0xC0,0xFF,0xFF, // 108 + 0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0x00,0x00,0xF8,0xFF,0x00,0x00,0x60,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0xF8,0xFF,0x00,0x00,0xE0,0xFF,0x00,0x00,0x30,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0xF0,0xFF,0x00,0x00,0xE0,0xFF, // 109 + 0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0x00,0x00,0xF8,0xFF,0x00,0x00,0x60,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0xF0,0xFF,0x00,0x00,0xE0,0xFF, // 110 + 0x00,0x00,0x00,0x00,0x00,0x80,0x0F,0x00,0x00,0xE0,0x3F,0x00,0x00,0x70,0x70,0x00,0x00,0x38,0xE0,0x00,0x00,0x18,0xC0,0x00,0x00,0x18,0xC0,0x00,0x00,0x38,0xC0,0x00,0x00,0x70,0x70,0x00,0x00,0xE0,0x3F,0x00,0x00,0xC0,0x1F, // 111 + 0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0x1F,0x00,0xF8,0xFF,0x1F,0x00,0x60,0x70,0x00,0x00,0x18,0xC0,0x00,0x00,0x18,0xC0,0x00,0x00,0x18,0xC0,0x00,0x00,0x38,0x70,0x00,0x00,0xF0,0x7F,0x00,0x00,0xC0,0x1F, // 112 + 0x00,0x00,0x00,0x00,0x00,0xC0,0x1F,0x00,0x00,0xF0,0x7F,0x00,0x00,0x38,0x70,0x00,0x00,0x18,0xC0,0x00,0x00,0x18,0xC0,0x00,0x00,0x18,0xC0,0x00,0x00,0x70,0x60,0x00,0x00,0xF8,0xFF,0x1F,0x00,0xF8,0xFF,0x1F, // 113 + 0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0x00,0x00,0xF8,0xFF,0x00,0x00,0x20,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x18, // 114 + 0x00,0x00,0x00,0x00,0x00,0xE0,0x31,0x00,0x00,0xF0,0x71,0x00,0x00,0x18,0xE3,0x00,0x00,0x18,0xC3,0x00,0x00,0x18,0xC6,0x00,0x00,0x38,0xE6,0x00,0x00,0x70,0x7E,0x00,0x00,0x60,0x3C, // 115 + 0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x80,0xFF,0x7F,0x00,0x80,0xFF,0xFF,0x00,0x00,0x18,0xC0,0x00,0x00,0x18,0xC0, // 116 + 0x00,0x00,0x00,0x00,0x00,0xF8,0x3F,0x00,0x00,0xF8,0x7F,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x30,0x00,0x00,0xF8,0xFF,0x00,0x00,0xF8,0xFF, // 117 + 0x00,0x08,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0xF0,0x07,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x3F,0x00,0x00,0xE0,0x07,0x00,0x00,0x78,0x00,0x00,0x00,0x08, // 118 + 0x00,0x08,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0xF0,0x1F,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xF0,0x00,0x00,0x80,0x3F,0x00,0x00,0xF8,0x01,0x00,0x00,0x78,0x00,0x00,0x00,0xF0,0x0F,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x7F,0x00,0x00,0xF8,0x03,0x00,0x00,0x38, // 119 + 0x00,0x00,0x80,0x00,0x00,0x18,0xC0,0x00,0x00,0x78,0xF0,0x00,0x00,0xE0,0x3D,0x00,0x00,0xC0,0x0F,0x00,0x00,0x80,0x0F,0x00,0x00,0xE0,0x3D,0x00,0x00,0x78,0xF0,0x00,0x00,0x18,0xC0,0x00,0x00,0x00,0x80, // 120 + 0x00,0x08,0x00,0x00,0x00,0x78,0x00,0x18,0x00,0xF0,0x07,0x18,0x00,0x00,0x3F,0x1C,0x00,0x00,0xF8,0x0F,0x00,0x00,0xF0,0x01,0x00,0x00,0x3F,0x00,0x00,0xF0,0x07,0x00,0x00,0x78,0x00,0x00,0x00,0x08, // 121 + 0x00,0x00,0x00,0x00,0x00,0x18,0xE0,0x00,0x00,0x18,0xF8,0x00,0x00,0x18,0xDC,0x00,0x00,0x18,0xCE,0x00,0x00,0x98,0xC3,0x00,0x00,0xD8,0xC1,0x00,0x00,0x78,0xC0,0x00,0x00,0x38,0xC0, // 122 + 0x00,0x00,0x02,0x00,0x00,0x00,0x07,0x00,0x80,0xFF,0xFD,0x0F,0xC0,0xFF,0xF8,0x1F,0xC0,0x00,0x00,0x18,0xC0,0x00,0x00,0x18, // 123 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xFF,0xFF,0x00,0xC0,0xFF,0xFF, // 124 + 0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x18,0xC0,0x00,0x00,0x18,0xC0,0xFF,0xF8,0x1F,0x80,0xFF,0xFD,0x0F,0x00,0x00,0x07,0x00,0x00,0x00,0x02, // 125 +}; + +const uint8_t font_Orbitron_28[] = { + 0x27, // Width: 39 + 0x1C, // Height: 28 + 0x20, // First Char: 32 + 0x5E, // Numbers of Chars: 94 + + // Jump Table: + 0xFF, 0xFF, 0x00, 0x08, // 32:65535 + 0x00, 0x00, 0x13, 0x06, // 33:0 + 0x00, 0x13, 0x21, 0x0A, // 34:19 + 0x00, 0x34, 0x52, 0x16, // 35:52 + 0x00, 0x86, 0x53, 0x16, // 36:134 + 0x00, 0xD9, 0x67, 0x1B, // 37:217 + 0x01, 0x40, 0x63, 0x1A, // 38:320 + 0x01, 0xA3, 0x11, 0x06, // 39:419 + 0x01, 0xB4, 0x17, 0x08, // 40:436 + 0x01, 0xCB, 0x17, 0x08, // 41:459 + 0x01, 0xE2, 0x31, 0x0E, // 42:482 + 0x02, 0x13, 0x2E, 0x0C, // 43:531 + 0x02, 0x41, 0x13, 0x05, // 44:577 + 0x02, 0x54, 0x32, 0x0E, // 45:596 + 0x02, 0x86, 0x13, 0x06, // 46:646 + 0x02, 0x99, 0x35, 0x0F, // 47:665 + 0x02, 0xCE, 0x57, 0x17, // 48:718 + 0x03, 0x25, 0x23, 0x0B, // 49:805 + 0x03, 0x48, 0x57, 0x17, // 50:840 + 0x03, 0x9F, 0x57, 0x17, // 51:927 + 0x03, 0xF6, 0x4A, 0x14, // 52:1014 + 0x04, 0x40, 0x57, 0x17, // 53:1088 + 0x04, 0x97, 0x57, 0x17, // 54:1175 + 0x04, 0xEE, 0x43, 0x12, // 55:1262 + 0x05, 0x31, 0x57, 0x17, // 56:1329 + 0x05, 0x88, 0x57, 0x17, // 57:1416 + 0x05, 0xDF, 0x13, 0x06, // 58:1503 + 0x05, 0xF2, 0x0F, 0x05, // 59:1522 + 0x06, 0x01, 0x2F, 0x0D, // 60:1537 + 0x06, 0x30, 0x3F, 0x12, // 61:1584 + 0x06, 0x6F, 0x32, 0x0D, // 62:1647 + 0x06, 0xA1, 0x46, 0x13, // 63:1697 + 0x06, 0xE7, 0x57, 0x17, // 64:1767 + 0x07, 0x3E, 0x57, 0x17, // 65:1854 + 0x07, 0x95, 0x57, 0x17, // 66:1941 + 0x07, 0xEC, 0x57, 0x17, // 67:2028 + 0x08, 0x43, 0x57, 0x17, // 68:2115 + 0x08, 0x9A, 0x4F, 0x15, // 69:2202 + 0x08, 0xE9, 0x4D, 0x14, // 70:2281 + 0x09, 0x36, 0x57, 0x17, // 71:2358 + 0x09, 0x8D, 0x57, 0x18, // 72:2445 + 0x09, 0xE4, 0x13, 0x06, // 73:2532 + 0x09, 0xF7, 0x4F, 0x16, // 74:2551 + 0x0A, 0x46, 0x53, 0x16, // 75:2630 + 0x0A, 0x99, 0x57, 0x16, // 76:2713 + 0x0A, 0xF0, 0x5F, 0x1A, // 77:2800 + 0x0B, 0x4F, 0x57, 0x17, // 78:2895 + 0x0B, 0xA6, 0x57, 0x17, // 79:2982 + 0x0B, 0xFD, 0x56, 0x16, // 80:3069 + 0x0C, 0x53, 0x5F, 0x19, // 81:3155 + 0x0C, 0xB2, 0x57, 0x17, // 82:3250 + 0x0D, 0x09, 0x57, 0x17, // 83:3337 + 0x0D, 0x60, 0x51, 0x15, // 84:3424 + 0x0D, 0xB1, 0x57, 0x17, // 85:3505 + 0x0E, 0x08, 0x69, 0x1C, // 86:3592 + 0x0E, 0x71, 0x7D, 0x21, // 87:3697 + 0x0E, 0xEE, 0x53, 0x17, // 88:3822 + 0x0F, 0x41, 0x55, 0x17, // 89:3905 + 0x0F, 0x96, 0x57, 0x17, // 90:3990 + 0x0F, 0xED, 0x17, 0x08, // 91:4077 + 0x10, 0x04, 0x37, 0x0F, // 92:4100 + 0x10, 0x3B, 0x17, 0x08, // 93:4155 + 0xFF, 0xFF, 0x00, 0x00, // 94:65535 + 0x10, 0x52, 0x57, 0x17, // 95:4178 + 0xFF, 0xFF, 0x00, 0x06, // 96:65535 + 0x10, 0xA9, 0x47, 0x13, // 97:4265 + 0x10, 0xF0, 0x47, 0x13, // 98:4336 + 0x11, 0x37, 0x47, 0x13, // 99:4407 + 0x11, 0x7E, 0x43, 0x13, // 100:4478 + 0x11, 0xC1, 0x47, 0x13, // 101:4545 + 0x12, 0x08, 0x29, 0x0B, // 102:4616 + 0x12, 0x31, 0x48, 0x13, // 103:4657 + 0x12, 0x79, 0x47, 0x13, // 104:4729 + 0x12, 0xC0, 0x0F, 0x06, // 105:4800 + 0x12, 0xCF, 0x14, 0x07, // 106:4815 + 0x12, 0xE3, 0x47, 0x12, // 107:4835 + 0x13, 0x2A, 0x1F, 0x08, // 108:4906 + 0x13, 0x49, 0x67, 0x1B, // 109:4937 + 0x13, 0xB0, 0x47, 0x13, // 110:5040 + 0x13, 0xF7, 0x47, 0x13, // 111:5111 + 0x14, 0x3E, 0x47, 0x13, // 112:5182 + 0x14, 0x85, 0x44, 0x13, // 113:5253 + 0x14, 0xC9, 0x35, 0x0E, // 114:5321 + 0x14, 0xFE, 0x47, 0x13, // 115:5374 + 0x15, 0x45, 0x2B, 0x0B, // 116:5445 + 0x15, 0x70, 0x47, 0x13, // 117:5488 + 0x15, 0xB7, 0x55, 0x16, // 118:5559 + 0x16, 0x0C, 0x71, 0x1E, // 119:5644 + 0x16, 0x7D, 0x47, 0x13, // 120:5757 + 0x16, 0xC4, 0x48, 0x13, // 121:5828 + 0x17, 0x0C, 0x47, 0x14, // 122:5900 + 0x17, 0x53, 0x1B, 0x08, // 123:5971 + 0x17, 0x6E, 0x13, 0x06, // 124:5998 + 0x17, 0x81, 0x1A, 0x08, // 125:6017 + + // Font Data: + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x7F,0x1C,0x00,0xFE,0x7F,0x1C,0x00,0xFE,0x7F,0x1C, // 33 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x1E, // 34 + 0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0xE0,0xE0,0x18,0x00,0xE0,0xE0,0x1F,0x00,0xE0,0xE0,0x1F,0x00,0xE0,0xFC,0x0F,0x00,0xE0,0xFF,0x00,0x00,0xF0,0xFF,0x00,0x00,0xFE,0xE3,0x00,0x00,0xFE,0xE0,0x00,0x00,0xEE,0xE0,0x00,0x00,0xE2,0xE0,0x10,0x00,0xE0,0xE0,0x1F,0x00,0xE0,0xE0,0x1F,0x00,0xE0,0xFC,0x0F,0x00,0xE0,0xFF,0x00,0x00,0xF0,0xFF,0x00,0x00,0xFE,0xE3,0x00,0x00,0xFE,0xE0,0x00,0x00,0xEE,0xE0,0x00,0x00,0xE2,0xE0, // 35 + 0x00,0x00,0x00,0x00,0xF8,0x07,0x07,0x00,0xFE,0x0F,0x0F,0x00,0xFE,0x0F,0x1F,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x3E,0xFC,0x1F,0x00,0x3E,0xFC,0x0F,0x00,0x3C,0xF8,0x07, // 36 + 0x00,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0xFC,0x01,0x00,0x00,0xFE,0x03,0x00,0x00,0x06,0x03,0x1E,0x00,0x06,0x03,0x0F,0x00,0x06,0x83,0x07,0x00,0x06,0xC3,0x03,0x00,0x06,0xE3,0x01,0x00,0xFE,0xE3,0x00,0x00,0xFC,0xF1,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x0F,0x00,0x00,0x80,0x07,0x00,0x00,0x80,0xE7,0x0F,0x00,0xC0,0xF3,0x0F,0x00,0xE0,0x31,0x1C,0x00,0xF0,0x30,0x18,0x00,0x78,0x30,0x18,0x00,0x3C,0x30,0x18,0x00,0x3C,0x30,0x18,0x00,0x1E,0xF0,0x1F,0x00,0x00,0xE0,0x0F,0x00,0x00,0xC0,0x03, // 37 + 0x00,0x00,0x00,0x00,0x00,0xF8,0x03,0x00,0x00,0xFC,0x0F,0x00,0xFC,0xFF,0x1F,0x00,0xFE,0xFF,0x1F,0x00,0xFE,0x07,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x1C,0x1C,0x00,0x0E,0x1C,0x1C,0x00,0x0E,0x38,0x1C,0x00,0x0E,0x38,0x1C,0x00,0x0E,0x70,0x1C,0x00,0x0E,0x70,0x1C,0x00,0x0E,0xE0,0x1C,0x00,0x0E,0xE0,0x1C,0x00,0x0E,0xC0,0x1D,0x00,0x0E,0xC0,0x1D,0x00,0x3E,0x80,0x1F,0x00,0x3C,0xF8,0x1F,0x00,0x38,0xF8,0x0F,0x00,0x00,0xF8,0x07,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x1C, // 38 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x1E, // 39 + 0x00,0x00,0x00,0x00,0xF0,0xFF,0x03,0x00,0xFC,0xFF,0x0F,0x00,0xFE,0xFF,0x1F,0x00,0x0E,0x00,0x1E,0x00,0x0E,0x00,0x1C, // 40 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x1C,0x00,0xFE,0xFF,0x1F,0x00,0xFE,0xFF,0x1F,0x00,0xFC,0xFF,0x0F, // 41 + 0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x70,0x04,0x00,0x00,0x70,0x0E,0x00,0x00,0xE0,0x1F,0x00,0x00,0xFE,0x07,0x00,0x00,0xFE,0x03,0x00,0x00,0xFE,0x03,0x00,0x00,0xE0,0x0F,0x00,0x00,0xF0,0x1F,0x00,0x00,0x70,0x0E,0x00,0x00,0x70,0x04,0x00,0x00,0x60, // 42 + 0x00,0x38,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x38,0x00,0x00,0x80,0xFF,0x03,0x00,0x80,0xFF,0x03,0x00,0x80,0xFF,0x03,0x00,0x00,0x38,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x38, // 43 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x01,0x00,0x00,0xFC,0x00,0x00,0x00,0x3C, // 44 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x38, // 45 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C, // 46 + 0x00,0x00,0x1E,0x00,0x00,0x00,0x0F,0x00,0x00,0x80,0x07,0x00,0x00,0xE0,0x03,0x00,0x00,0xF0,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x1E,0x00,0x00,0x80,0x0F,0x00,0x00,0xC0,0x03,0x00,0x00,0xE0,0x01,0x00,0x00,0xF0,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x3E, // 47 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0xFF,0x0F,0x00,0xFE,0xFF,0x1F,0x00,0xFE,0xFF,0x1F,0x00,0x0E,0xC0,0x1F,0x00,0x0E,0xE0,0x1D,0x00,0x0E,0xF0,0x1C,0x00,0x0E,0xF0,0x1C,0x00,0x0E,0x78,0x1C,0x00,0x0E,0x3C,0x1C,0x00,0x0E,0x1E,0x1C,0x00,0x0E,0x0F,0x1C,0x00,0x8E,0x07,0x1C,0x00,0x8E,0x07,0x1C,0x00,0xCE,0x03,0x1C,0x00,0xEE,0x01,0x1C,0x00,0xFE,0x00,0x1C,0x00,0x7E,0x00,0x1C,0x00,0xFE,0xFF,0x1F,0x00,0xFC,0xFF,0x0F,0x00,0xF8,0xFF,0x07, // 48 + 0x80,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0xFE,0xFF,0x1F,0x00,0xFE,0xFF,0x1F,0x00,0xFE,0xFF,0x1F, // 49 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0xF8,0x1F,0x00,0x3E,0xFC,0x1F,0x00,0x3E,0xFC,0x1F,0x00,0x0E,0x1C,0x1C,0x00,0x0E,0x1C,0x1C,0x00,0x0E,0x1C,0x1C,0x00,0x0E,0x1C,0x1C,0x00,0x0E,0x1C,0x1C,0x00,0x0E,0x1C,0x1C,0x00,0x0E,0x1C,0x1C,0x00,0x0E,0x1C,0x1C,0x00,0x0E,0x1C,0x1C,0x00,0x0E,0x1C,0x1C,0x00,0x0E,0x1C,0x1C,0x00,0x0E,0x1C,0x1C,0x00,0x0E,0x1C,0x1C,0x00,0x0E,0x1C,0x1C,0x00,0xFE,0x0F,0x1C,0x00,0xFC,0x0F,0x1C,0x00,0xF8,0x03,0x1C, // 50 + 0x00,0x00,0x00,0x00,0x30,0x00,0x02,0x00,0x3C,0x00,0x0E,0x00,0x3E,0x00,0x1E,0x00,0x3E,0x00,0x1E,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0xFE,0x1F,0x1C,0x00,0xFC,0xFF,0x1F,0x00,0xF8,0xFF,0x0F,0x00,0x00,0xF0,0x03, // 51 + 0x00,0xE0,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xEF,0x00,0x00,0x80,0xE7,0x00,0x00,0xC0,0xE3,0x00,0x00,0xE0,0xE3,0x00,0x00,0xF0,0xE1,0x00,0x00,0xF0,0xE0,0x00,0x00,0x78,0xE0,0x00,0x00,0x3C,0xE0,0x00,0x00,0xFE,0xFF,0x1F,0x00,0xFE,0xFF,0x1F,0x00,0xFE,0xFF,0x1F,0x00,0xFE,0xFF,0x1F,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0, // 52 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x0F,0x0F,0x00,0xFE,0x0F,0x1F,0x00,0xFE,0x0F,0x1F,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0xFE,0x1F,0x00,0x0E,0xFC,0x0F,0x00,0x0E,0xF8,0x07, // 53 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0xFF,0x0F,0x00,0xFE,0xFF,0x1F,0x00,0xFE,0xFF,0x1F,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x00,0x0E,0x1C,0x00,0x00,0xFE,0x1F,0x00,0x00,0xFC,0x0F,0x00,0x00,0xF8,0x07, // 54 + 0x0E,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0xFE,0xFF,0x1F,0x00,0xFC,0xFF,0x1F,0x00,0xF8,0xFF,0x1F, // 55 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0xFF,0x0F,0x00,0xFE,0xFF,0x1F,0x00,0xFE,0xFF,0x1F,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0xFE,0xFF,0x1F,0x00,0xFC,0xFF,0x0F,0x00,0xF8,0xFB,0x07, // 56 + 0x00,0x00,0x00,0x00,0xF0,0x03,0x02,0x00,0xFC,0x0F,0x0C,0x00,0xFE,0x0F,0x1C,0x00,0x0E,0x1E,0x1C,0x00,0x0E,0x1C,0x1C,0x00,0x0E,0x1C,0x1C,0x00,0x0E,0x1C,0x1C,0x00,0x0E,0x1C,0x1C,0x00,0x0E,0x1C,0x1C,0x00,0x0E,0x1C,0x1C,0x00,0x0E,0x1C,0x1C,0x00,0x0E,0x1C,0x1C,0x00,0x0E,0x1C,0x1C,0x00,0x0E,0x1C,0x1C,0x00,0x0E,0x1C,0x1C,0x00,0x0E,0x1C,0x1C,0x00,0x0E,0x1C,0x1C,0x00,0x0E,0x1C,0x1E,0x00,0xFE,0xFF,0x1F,0x00,0xFC,0xFF,0x0F,0x00,0xF0,0xFF,0x03, // 57 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C, // 58 + 0x00,0x00,0x00,0x00,0xE0,0x00,0xFC,0x01,0xE0,0x00,0xFC,0x00,0xE0,0x00,0x7C, // 59 + 0x00,0x38,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xEE,0x01,0x00,0x00,0xCF,0x01,0x00,0x00,0xC7,0x03,0x00,0x80,0x83,0x03,0x00,0xC0,0x03,0x07,0x00,0xC0,0x01,0x0F,0x00,0xE0,0x01,0x0E,0x00,0xE0,0x00,0x1E, // 60 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCE,0x01,0x00,0x00,0xCE,0x01,0x00,0x00,0xCE,0x01,0x00,0x00,0xCE,0x01,0x00,0x00,0xCE,0x01,0x00,0x00,0xCE,0x01,0x00,0x00,0xCE,0x01,0x00,0x00,0xCE,0x01,0x00,0x00,0xCE,0x01,0x00,0x00,0xCE,0x01,0x00,0x00,0xCE,0x01,0x00,0x00,0xCE,0x01,0x00,0x00,0xCE,0x01,0x00,0x00,0xCE,0x01, // 61 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x01,0x1E,0x00,0xC0,0x01,0x0F,0x00,0xC0,0x03,0x07,0x00,0x80,0x83,0x07,0x00,0x80,0x87,0x03,0x00,0x00,0xC7,0x03,0x00,0x00,0xEE,0x01,0x00,0x00,0xFE,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x78, // 62 + 0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0E,0x70,0x1C,0x00,0x0E,0x78,0x1C,0x00,0x0E,0x7C,0x1C,0x00,0x0E,0x1C,0x00,0x00,0x0E,0x1C,0x00,0x00,0x0E,0x1C,0x00,0x00,0x0E,0x1C,0x00,0x00,0x0E,0x1C,0x00,0x00,0x0E,0x1C,0x00,0x00,0x0E,0x1C,0x00,0x00,0x0E,0x1C,0x00,0x00,0xFE,0x1F,0x00,0x00,0xFE,0x1F,0x00,0x00,0xFC,0x0F, // 63 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0xFF,0x0F,0x00,0xFE,0xFF,0x1F,0x00,0xFE,0xFF,0x1F,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x3F,0x1C,0x00,0x8E,0x7F,0x1C,0x00,0xCE,0xE1,0x1C,0x00,0xCE,0xE1,0x1C,0x00,0xCE,0xE1,0x1C,0x00,0xCE,0xE1,0x1C,0x00,0xCE,0xE1,0x1C,0x00,0x8E,0xFF,0x1C,0x00,0x8E,0xFF,0x1C,0x00,0x0E,0xFE,0x1C,0x00,0x0E,0xE0,0x1C,0x00,0x0E,0xE0,0x1C,0x00,0xFE,0xFF,0x1C,0x00,0xFC,0xFF,0x1C,0x00,0xF8,0xFF,0x1C, // 64 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0xFF,0x1F,0x00,0xFE,0xFF,0x1F,0x00,0xFE,0xFF,0x1F,0x00,0x0E,0x38,0x00,0x00,0x0E,0x38,0x00,0x00,0x0E,0x38,0x00,0x00,0x0E,0x38,0x00,0x00,0x0E,0x38,0x00,0x00,0x0E,0x38,0x00,0x00,0x0E,0x38,0x00,0x00,0x0E,0x38,0x00,0x00,0x0E,0x38,0x00,0x00,0x0E,0x38,0x00,0x00,0x0E,0x38,0x00,0x00,0x0E,0x38,0x00,0x00,0x0E,0x38,0x00,0x00,0x0E,0x38,0x00,0x00,0xFE,0xFF,0x1F,0x00,0xFC,0xFF,0x1F,0x00,0xF8,0xFF,0x1F, // 65 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0x1F,0x00,0xFE,0xFF,0x1F,0x00,0xFE,0xFF,0x1F,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0xFE,0x0F,0x1C,0x00,0xFC,0xFF,0x1F,0x00,0xF8,0xFF,0x0F,0x00,0x00,0xF8,0x07, // 66 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0xFF,0x0F,0x00,0xFE,0xFF,0x1F,0x00,0xFE,0xFF,0x1F,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C, // 67 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0x1F,0x00,0xFE,0xFF,0x1F,0x00,0xFE,0xFF,0x1F,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0xFE,0xFF,0x1F,0x00,0xFC,0xFF,0x0F,0x00,0xF8,0xFF,0x07, // 68 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0x1F,0x00,0xFE,0xFF,0x1F,0x00,0xFE,0xFF,0x1F,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C, // 69 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0x1F,0x00,0xFE,0xFF,0x1F,0x00,0xFE,0xFF,0x1F,0x00,0x0E,0x0E,0x00,0x00,0x0E,0x0E,0x00,0x00,0x0E,0x0E,0x00,0x00,0x0E,0x0E,0x00,0x00,0x0E,0x0E,0x00,0x00,0x0E,0x0E,0x00,0x00,0x0E,0x0E,0x00,0x00,0x0E,0x0E,0x00,0x00,0x0E,0x0E,0x00,0x00,0x0E,0x0E,0x00,0x00,0x0E,0x0E,0x00,0x00,0x0E,0x0E,0x00,0x00,0x0E,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0E, // 70 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0xFF,0x0F,0x00,0xFE,0xFF,0x1F,0x00,0xFE,0xFF,0x1F,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x1C,0x1C,0x00,0x0E,0x1C,0x1C,0x00,0x0E,0x1C,0x1C,0x00,0x0E,0x1C,0x1C,0x00,0x0E,0x1C,0x1C,0x00,0x3E,0xFC,0x1F,0x00,0x3C,0xFC,0x0F,0x00,0x38,0xFC,0x07, // 71 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0x1F,0x00,0xFE,0xFF,0x1F,0x00,0xFE,0xFF,0x1F,0x00,0x00,0x0E,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0E,0x00,0x00,0xFE,0xFF,0x1F,0x00,0xFE,0xFF,0x1F,0x00,0xFE,0xFF,0x1F, // 72 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0x1F,0x00,0xFE,0xFF,0x1F,0x00,0xFE,0xFF,0x1F, // 73 + 0x00,0x80,0x07,0x00,0x00,0x80,0x0F,0x00,0x00,0x80,0x1F,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0xFE,0xFF,0x1F,0x00,0xFE,0xFF,0x0F,0x00,0xFE,0xFF,0x0F, // 74 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0x1F,0x00,0xFE,0xFF,0x1F,0x00,0xFE,0xFF,0x1F,0x00,0x00,0x0E,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x3F,0x00,0x00,0x80,0x7F,0x00,0x00,0xE0,0xF3,0x00,0x00,0xF0,0xE1,0x03,0x00,0xF8,0xC0,0x07,0x00,0x7C,0x80,0x0F,0x00,0x1E,0x00,0x1F,0x00,0x0E,0x00,0x1C,0x00,0x06,0x00,0x18,0x00,0x02,0x00,0x10, // 75 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0x1F,0x00,0xFE,0xFF,0x1F,0x00,0xFE,0xFF,0x1F,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C, // 76 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0x1F,0x00,0xFE,0xFF,0x1F,0x00,0xFE,0xFF,0x1F,0x00,0x3E,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0xE0,0x03,0x00,0x00,0xC0,0x07,0x00,0x00,0x80,0x0F,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x1F,0x00,0x00,0x80,0x0F,0x00,0x00,0xC0,0x07,0x00,0x00,0xE0,0x03,0x00,0x00,0xF0,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0xFE,0xFF,0x1F,0x00,0xFE,0xFF,0x1F,0x00,0xFE,0xFF,0x1F, // 77 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0x1F,0x00,0xFE,0xFF,0x1F,0x00,0xFE,0xFF,0x1F,0x00,0x3E,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0xE0,0x03,0x00,0x00,0xC0,0x07,0x00,0x00,0x80,0x0F,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0xF0,0x01,0x00,0x00,0xE0,0x03,0x00,0x00,0xC0,0x07,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x1E,0x00,0xFE,0xFF,0x1F,0x00,0xFE,0xFF,0x1F,0x00,0xFE,0xFF,0x1F, // 78 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0xFF,0x0F,0x00,0xFE,0xFF,0x1F,0x00,0xFE,0xFF,0x1F,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0xFE,0xFF,0x1F,0x00,0xFC,0xFF,0x0F,0x00,0xF8,0xFF,0x07, // 79 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0x1F,0x00,0xFE,0xFF,0x1F,0x00,0xFE,0xFF,0x1F,0x00,0x0E,0x38,0x00,0x00,0x0E,0x38,0x00,0x00,0x0E,0x38,0x00,0x00,0x0E,0x38,0x00,0x00,0x0E,0x38,0x00,0x00,0x0E,0x38,0x00,0x00,0x0E,0x38,0x00,0x00,0x0E,0x38,0x00,0x00,0x0E,0x38,0x00,0x00,0x0E,0x38,0x00,0x00,0x0E,0x38,0x00,0x00,0x0E,0x38,0x00,0x00,0x0E,0x38,0x00,0x00,0x0E,0x38,0x00,0x00,0xFE,0x3F,0x00,0x00,0xFC,0x1F,0x00,0x00,0xF8,0x07, // 80 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0xFF,0x0F,0x00,0xFE,0xFF,0x1F,0x00,0xFE,0xFF,0x1F,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0xFE,0xFF,0x1F,0x00,0xFC,0xFF,0x1F,0x00,0xF8,0xFF,0x1F,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C, // 81 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0x1F,0x00,0xFE,0xFF,0x1F,0x00,0xFE,0xFF,0x1F,0x00,0x0E,0x38,0x00,0x00,0x0E,0x38,0x00,0x00,0x0E,0x38,0x00,0x00,0x0E,0x38,0x00,0x00,0x0E,0x38,0x00,0x00,0x0E,0x38,0x00,0x00,0x0E,0x38,0x00,0x00,0x0E,0x38,0x00,0x00,0x0E,0xF8,0x00,0x00,0x0E,0xF8,0x01,0x00,0x0E,0xF8,0x03,0x00,0x0E,0xF8,0x07,0x00,0x0E,0x38,0x0F,0x00,0x0E,0x38,0x1E,0x00,0xFE,0x3F,0x1C,0x00,0xFC,0x1F,0x18,0x00,0xF8,0x07,0x10, // 82 + 0x00,0x00,0x00,0x00,0xF0,0x03,0x03,0x00,0xFC,0x07,0x0F,0x00,0xFE,0x0F,0x1F,0x00,0x0E,0x0E,0x1E,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x0E,0x1C,0x00,0x0E,0x1C,0x1E,0x00,0x3E,0xFC,0x1F,0x00,0x3C,0xFC,0x0F,0x00,0x30,0xF0,0x03, // 83 + 0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0xFE,0xFF,0x1F,0x00,0xFE,0xFF,0x1F,0x00,0xFE,0xFF,0x1F,0x00,0x0E,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0E, // 84 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0x0F,0x00,0xFE,0xFF,0x1F,0x00,0xFE,0xFF,0x1F,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0xFE,0xFF,0x1F,0x00,0xFE,0xFF,0x0F,0x00,0xFE,0xFF,0x07, // 85 + 0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0xF8,0x01,0x00,0x00,0xF0,0x03,0x00,0x00,0xC0,0x0F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0xF8,0x01,0x00,0x00,0xE0,0x07,0x00,0x00,0x80,0x1F,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x1E,0x00,0x00,0x80,0x1F,0x00,0x00,0xE0,0x0F,0x00,0x00,0xF0,0x03,0x00,0x00,0xFC,0x00,0x00,0x00,0x3F,0x00,0x00,0x80,0x1F,0x00,0x00,0xE0,0x07,0x00,0x00,0xF8,0x01,0x00,0x00,0x7E,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x02, // 86 + 0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFC,0x07,0x00,0x00,0xF0,0x1F,0x00,0x00,0x80,0xFF,0x00,0x00,0x00,0xFC,0x07,0x00,0x00,0xE0,0x1F,0x00,0x00,0x80,0x1F,0x00,0x00,0xE0,0x1F,0x00,0x00,0xFC,0x07,0x00,0x80,0xFF,0x00,0x00,0xE0,0x3F,0x00,0x00,0xFC,0x07,0x00,0x00,0xFE,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFC,0x07,0x00,0x00,0xE0,0x3F,0x00,0x00,0x80,0xFF,0x00,0x00,0x00,0xFC,0x07,0x00,0x00,0xE0,0x1F,0x00,0x00,0x80,0x1F,0x00,0x00,0xE0,0x1F,0x00,0x00,0xFC,0x07,0x00,0x80,0xFF,0x00,0x00,0xF0,0x1F,0x00,0x00,0xFC,0x07,0x00,0x00,0xFE,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x02, // 87 + 0x00,0x00,0x00,0x00,0x02,0x00,0x10,0x00,0x06,0x00,0x18,0x00,0x0E,0x00,0x1C,0x00,0x1E,0x00,0x1E,0x00,0x3C,0x00,0x0F,0x00,0x78,0xC0,0x07,0x00,0xF0,0xE1,0x03,0x00,0xE0,0xF3,0x01,0x00,0xC0,0xFF,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x1F,0x00,0x00,0x80,0x7F,0x00,0x00,0xC0,0xFF,0x00,0x00,0xE0,0xF3,0x01,0x00,0xF0,0xC0,0x03,0x00,0x7C,0x80,0x07,0x00,0x3E,0x00,0x1F,0x00,0x1E,0x00,0x1E,0x00,0x0E,0x00,0x1C,0x00,0x02,0x00,0x18, // 88 + 0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0xF0,0x01,0x00,0x00,0xE0,0x03,0x00,0x00,0x80,0x0F,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0xFE,0x1F,0x00,0x00,0xFC,0x1F,0x00,0x00,0xFF,0x1F,0x00,0x80,0x1F,0x00,0x00,0xC0,0x07,0x00,0x00,0xE0,0x03,0x00,0x00,0xF8,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x02, // 89 + 0x00,0x00,0x00,0x00,0x0E,0x00,0x1E,0x00,0x0E,0x00,0x1E,0x00,0x0E,0x00,0x1F,0x00,0x0E,0x80,0x1F,0x00,0x0E,0xC0,0x1F,0x00,0x0E,0xE0,0x1D,0x00,0x0E,0xF0,0x1C,0x00,0x0E,0x78,0x1C,0x00,0x0E,0x78,0x1C,0x00,0x0E,0x3C,0x1C,0x00,0x0E,0x1E,0x1C,0x00,0x0E,0x0F,0x1C,0x00,0x8E,0x07,0x1C,0x00,0xCE,0x03,0x1C,0x00,0xCE,0x03,0x1C,0x00,0xEE,0x01,0x1C,0x00,0xFE,0x00,0x1C,0x00,0x7E,0x00,0x1C,0x00,0x3E,0x00,0x1C,0x00,0x1E,0x00,0x1C,0x00,0x1E,0x00,0x1C, // 90 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0x1F,0x00,0xFE,0xFF,0x1F,0x00,0xFE,0xFF,0x1F,0x00,0x0E,0x00,0x1C, // 91 + 0x1E,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0xC0,0x03,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0xC0,0x03,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x1F, // 92 + 0x00,0x00,0x00,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0xFE,0xFF,0x1F,0x00,0xFE,0xFF,0x1F,0x00,0xFE,0xFF,0x1F, // 93 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0, // 95 + 0x00,0x00,0x00,0x00,0xE0,0xF8,0x03,0x00,0xE0,0xF8,0x0F,0x00,0xE0,0xF8,0x1F,0x00,0xE0,0x38,0x1E,0x00,0xE0,0x38,0x1C,0x00,0xE0,0x38,0x1C,0x00,0xE0,0x38,0x1C,0x00,0xE0,0x38,0x1C,0x00,0xE0,0x38,0x1C,0x00,0xE0,0x38,0x1C,0x00,0xE0,0x38,0x1C,0x00,0xE0,0x38,0x1C,0x00,0xE0,0x38,0x1C,0x00,0xE0,0x38,0x1C,0x00,0xE0,0xFF,0x1F,0x00,0xC0,0xFF,0x1F,0x00,0x80,0xFF,0x1F, // 97 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x1F,0x00,0xFF,0xFF,0x1F,0x00,0xFF,0xFF,0x1F,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0xFF,0x1F,0x00,0xE0,0xFF,0x0F,0x00,0x80,0xFF,0x07, // 98 + 0x00,0x00,0x00,0x00,0x00,0xFF,0x03,0x00,0xC0,0xFF,0x0F,0x00,0xE0,0xFF,0x1F,0x00,0xE0,0x00,0x1E,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C, // 99 + 0x00,0x00,0x00,0x00,0xC0,0xFF,0x0F,0x00,0xE0,0xFF,0x1F,0x00,0xE0,0xFF,0x1F,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xFF,0xFF,0x1F,0x00,0xFF,0xFF,0x1F,0x00,0xFF,0xFF,0x1F, // 100 + 0x00,0x00,0x00,0x00,0x00,0xFF,0x03,0x00,0xC0,0xFF,0x0F,0x00,0xE0,0xFF,0x1F,0x00,0xE0,0x38,0x1E,0x00,0xE0,0x38,0x1C,0x00,0xE0,0x38,0x1C,0x00,0xE0,0x38,0x1C,0x00,0xE0,0x38,0x1C,0x00,0xE0,0x38,0x1C,0x00,0xE0,0x38,0x1C,0x00,0xE0,0x38,0x1C,0x00,0xE0,0x38,0x1C,0x00,0xE0,0x38,0x1C,0x00,0xE0,0x38,0x1C,0x00,0xE0,0x3F,0x1C,0x00,0xC0,0x3F,0x1C,0x00,0x80,0x3F,0x1C, // 101 + 0x00,0x00,0x00,0x00,0xF8,0xFF,0x1F,0x00,0xFE,0xFF,0x1F,0x00,0xFF,0xFF,0x1F,0x00,0xFF,0xFF,0x1F,0x00,0xE3,0x00,0x00,0x00,0xE3,0x00,0x00,0x00,0xE3,0x00,0x00,0x00,0xE3,0x00,0x00,0x00,0xE3,0x00,0x00,0x00,0xE3, // 102 + 0x00,0x00,0x00,0x00,0x80,0xFF,0x07,0x00,0xC0,0xFF,0x0F,0x00,0xE0,0xFF,0x1F,0x00,0xE0,0x00,0x1C,0x07,0xE0,0x00,0x1C,0x07,0xE0,0x00,0x1C,0x07,0xE0,0x00,0x1C,0x07,0xE0,0x00,0x1C,0x07,0xE0,0x00,0x1C,0x07,0xE0,0x00,0x1C,0x07,0xE0,0x00,0x1C,0x07,0xE0,0x00,0x1C,0x07,0xE0,0x00,0x1C,0x07,0xE0,0x00,0x1C,0x07,0xE0,0xFF,0xFF,0x07,0xC0,0xFF,0xFF,0x03,0x80,0xFF,0xFF,0x01, // 103 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x1F,0x00,0xFF,0xFF,0x1F,0x00,0xFF,0xFF,0x1F,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0xFF,0x1F,0x00,0xE0,0xFF,0x1F,0x00,0x80,0xFF,0x1F, // 104 + 0x00,0x00,0x00,0x00,0xE3,0xFF,0x1F,0x00,0xE3,0xFF,0x1F,0x00,0xE3,0xFF,0x1F, // 105 + 0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x07,0xE3,0xFF,0xFF,0x07,0xE3,0xFF,0xFF,0x07,0xE3,0xFF,0xFF,0x03, // 106 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x1F,0x00,0xFF,0xFF,0x1F,0x00,0xFF,0xFF,0x1F,0x00,0x00,0x38,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0xFE,0x01,0x00,0x00,0xCF,0x03,0x00,0x80,0x87,0x07,0x00,0xC0,0x03,0x0F,0x00,0xE0,0x01,0x1E,0x00,0xE0,0x00,0x1C,0x00,0x60,0x00,0x18,0x00,0x20,0x00,0x10, // 107 + 0x00,0x00,0x00,0x00,0xFF,0xFF,0x03,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x1F,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C, // 108 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x1F,0x00,0xE0,0xFF,0x1F,0x00,0xE0,0xFF,0x1F,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0xFF,0x1F,0x00,0xE0,0xFF,0x1F,0x00,0xE0,0xFF,0x1F,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0xFF,0x1F,0x00,0xC0,0xFF,0x1F,0x00,0x80,0xFF,0x1F, // 109 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x1F,0x00,0xE0,0xFF,0x1F,0x00,0xE0,0xFF,0x1F,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0xFF,0x1F,0x00,0xE0,0xFF,0x1F,0x00,0x80,0xFF,0x1F, // 110 + 0x00,0x00,0x00,0x00,0x00,0xFF,0x03,0x00,0xC0,0xFF,0x0F,0x00,0xE0,0xFF,0x1F,0x00,0xE0,0x00,0x1E,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0xFF,0x1F,0x00,0xC0,0xFF,0x0F,0x00,0x80,0xFF,0x07, // 111 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x07,0xE0,0xFF,0xFF,0x07,0xE0,0xFF,0xFF,0x07,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0xFF,0x1F,0x00,0xE0,0xFF,0x0F,0x00,0x80,0xFF,0x07, // 112 + 0x00,0x00,0x00,0x00,0xC0,0xFF,0x0F,0x00,0xE0,0xFF,0x1F,0x00,0xE0,0xFF,0x1F,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0xFF,0xFF,0x07,0xE0,0xFF,0xFF,0x07,0xE0,0xFF,0xFF,0x07, // 113 + 0x00,0x00,0x00,0x00,0x00,0xFF,0x1F,0x00,0xC0,0xFF,0x1F,0x00,0xE0,0xFF,0x1F,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0, // 114 + 0x00,0x00,0x00,0x00,0x80,0x0F,0x02,0x00,0xC0,0x1F,0x0E,0x00,0xE0,0x3F,0x1E,0x00,0xE0,0x38,0x1C,0x00,0xE0,0x38,0x1C,0x00,0xE0,0x38,0x1C,0x00,0xE0,0x38,0x1C,0x00,0xE0,0x38,0x1C,0x00,0xE0,0x38,0x1C,0x00,0xE0,0x38,0x1C,0x00,0xE0,0x38,0x1C,0x00,0xE0,0x38,0x1C,0x00,0xE0,0x38,0x1C,0x00,0xE0,0x78,0x1C,0x00,0xE0,0xF1,0x1F,0x00,0xC0,0xF1,0x0F,0x00,0x80,0xE1,0x07, // 115 + 0x00,0x00,0x00,0x00,0xFF,0xFF,0x03,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x1F,0x00,0xFF,0xFF,0x1F,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x00,0x1C, // 116 + 0x00,0x00,0x00,0x00,0xE0,0xFF,0x03,0x00,0xE0,0xFF,0x0F,0x00,0xE0,0xFF,0x1F,0x00,0xE0,0xFF,0x1F,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0xE0,0xFF,0x1F,0x00,0xE0,0xFF,0x0F,0x00,0xE0,0xFF,0x07, // 117 + 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x03,0x00,0x00,0xE0,0x0F,0x00,0x00,0x80,0x3F,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0xF8,0x01,0x00,0x00,0xE0,0x07,0x00,0x00,0x80,0x1F,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x1E,0x00,0x00,0x80,0x1F,0x00,0x00,0xE0,0x07,0x00,0x00,0xF8,0x03,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x00,0x00,0xC0,0x0F,0x00,0x00,0xE0,0x03,0x00,0x00,0xE0,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x20, // 118 + 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0xE0,0x07,0x00,0x00,0xE0,0x3F,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFC,0x07,0x00,0x00,0xE0,0x1F,0x00,0x00,0x80,0x1F,0x00,0x00,0xE0,0x1F,0x00,0x00,0xF8,0x07,0x00,0x00,0xFE,0x01,0x00,0xC0,0x7F,0x00,0x00,0xE0,0x0F,0x00,0x00,0xE0,0x03,0x00,0x00,0xE0,0x03,0x00,0x00,0xE0,0x0F,0x00,0x00,0xC0,0x3F,0x00,0x00,0x00,0xFE,0x01,0x00,0x00,0xF8,0x07,0x00,0x00,0xE0,0x1F,0x00,0x00,0x80,0x1F,0x00,0x00,0xE0,0x1F,0x00,0x00,0xF8,0x07,0x00,0x00,0xFF,0x01,0x00,0xE0,0x3F,0x00,0x00,0xE0,0x07,0x00,0x00,0xE0,0x01,0x00,0x00,0x20, // 119 + 0x00,0x00,0x00,0x00,0x20,0x00,0x10,0x00,0x60,0x00,0x18,0x00,0xE0,0x00,0x1C,0x00,0xE0,0x01,0x1E,0x00,0xE0,0x83,0x0F,0x00,0x80,0xC7,0x07,0x00,0x00,0xFF,0x03,0x00,0x00,0xFE,0x01,0x00,0x00,0x7C,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFF,0x01,0x00,0x80,0xCF,0x07,0x00,0xC0,0x87,0x0F,0x00,0xE0,0x01,0x1F,0x00,0xE0,0x00,0x1E,0x00,0x60,0x00,0x18,0x00,0x20,0x00,0x10, // 120 + 0x00,0x00,0x00,0x00,0xE0,0xFF,0x07,0x00,0xE0,0xFF,0x0F,0x00,0xE0,0xFF,0x1F,0x00,0x00,0x00,0x1C,0x07,0x00,0x00,0x1C,0x07,0x00,0x00,0x1C,0x07,0x00,0x00,0x1C,0x07,0x00,0x00,0x1C,0x07,0x00,0x00,0x1C,0x07,0x00,0x00,0x1C,0x07,0x00,0x00,0x1C,0x07,0x00,0x00,0x1C,0x07,0x00,0x00,0x1C,0x07,0x00,0x00,0x1C,0x07,0xE0,0xFF,0xFF,0x07,0xE0,0xFF,0xFF,0x03,0xE0,0xFF,0xFF,0x01, // 121 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x1E,0x00,0xE0,0x00,0x1F,0x00,0xE0,0x80,0x1F,0x00,0xE0,0xC0,0x1F,0x00,0xE0,0xC0,0x1D,0x00,0xE0,0xE0,0x1C,0x00,0xE0,0xF0,0x1C,0x00,0xE0,0x78,0x1C,0x00,0xE0,0x3C,0x1C,0x00,0xE0,0x1C,0x1C,0x00,0xE0,0x1E,0x1C,0x00,0xE0,0x0F,0x1C,0x00,0xE0,0x07,0x1C,0x00,0xE0,0x03,0x1C,0x00,0xE0,0x03,0x1C,0x00,0xE0,0x01,0x1C, // 122 + 0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x00,0xFC,0xFF,0x07,0x00,0xFE,0xFB,0x0F,0x00,0xFE,0xF3,0x1F,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C, // 123 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF, // 124 + 0x00,0x00,0x00,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x1C,0x00,0xFE,0xF1,0x1F,0x00,0xFE,0xFB,0x0F,0x00,0xFC,0xFF,0x0F,0x00,0x00,0x1E, // 125 +}; diff --git a/nametag8_CH592/user/render/font_table.c b/nametag8_CH592/user/render/font_table.c new file mode 100644 index 0000000..4beea89 --- /dev/null +++ b/nametag8_CH592/user/render/font_table.c @@ -0,0 +1,18 @@ +/* + * font_table.c + * begin 20190613 true + */ + +#include "font.h" + + +const FontTable font_table[8] = { + {0, "Dialog 8", font_Dialog_plain_8}, + {0, "DJVmonoB11", font_DejaVu_Sans_Mono_Bold_11}, + {1, "Nimbmono20", font_Nimbus_Mono_L_Bold_20}, + {1, "DJVmonoB24", font_DialogInput_Bold_24}, + {1, "Chewy 24", font_Chewy_24}, + {1, "Crushed 25", font_Crushed_25}, + {1, "NimbSL 25", font_Nimbus_Sans_L_25}, + {1, "Orbitron28", font_Orbitron_28}, +}; diff --git a/nametag8_CH592/user/ui/btn.c b/nametag8_CH592/user/ui/btn.c new file mode 100644 index 0000000..13aebaf --- /dev/null +++ b/nametag8_CH592/user/ui/btn.c @@ -0,0 +1,93 @@ +/* + * btn.c + * + * created Oct 13, 2024 + * + * read and process buttons from sub MCU. + * provide button handling support to application. + * + */ + +#include "btn.h" + +#include "hw/ch32sub.h" + + + +BtnSub btn[BTN_COUNT]; + +uint8_t btn_pushed; +uint8_t btn_held; + + + +void btn_push_cb(uint8_t idx) +{ + btn_pushed |= (1 << idx); + if (btn[idx].cb_push) btn[idx].cb_push(idx); +} + +void btn_hold_cb(uint8_t idx) +{ + btn_held |= (1 << idx); + if (btn[idx].cb_hold) btn[idx].cb_hold(idx); +} + +void btn_release_cb(uint8_t idx) +{ + btn_pushed &= ~(1 << idx); + btn_held &= ~(1 << idx); + if (btn[idx].cb_release) btn[idx].cb_release(idx); +} + + +void btn_commit_hold() +{ + uint8_t i, x; + uint8_t val[BTN_COUNT*2]; + + x = 0; + for (i = 0; i < BTN_COUNT; i++) { + val[x + 0x00] = btn[i].hold >> 8; + val[x + 0x01] = btn[i].hold & 0xff; + x += 2; + } + + ch32sub_write(REG_BTN1_HOLD_HI, val, sizeof(val)); + + x = 0; + for (i = 0; i < BTN_COUNT; i++) { + val[x + 0x00] = btn[i].repeat >> 8; + val[x + 0x01] = btn[i].repeat & 0xff; + x += 2; + } + + ch32sub_write(REG_BTN1_REPEAT_HI, val, sizeof(val)); +} + + +void btn_intr() +{ + uint8_t i; + uint8_t btn_state[4]; // [9]; + // uint8_t *btn_mask = &btn_state[4]; + + // get button data. + ch32sub_read(REG_BTN_PUSHED_LATCHED, btn_state, sizeof(btn_state)); + + // clear button interrupt flag + ch32sub_write_1b(REG_INTR_FLAGS_CLEAR, INT_BTN); + + // process callbacks for new events + for (i = 0; i < BTN_COUNT; i++) { + if (btn_state[1] & (1 << i)) { + btn_push_cb(i); + } + if (btn_state[2] & (1 << i)) { + btn_hold_cb(i); + } + if (btn_state[3] & (1 << i)) { + btn_release_cb(i); + } + } +} diff --git a/nametag8_CH592/user/ui/btn.h b/nametag8_CH592/user/ui/btn.h new file mode 100644 index 0000000..df8c017 --- /dev/null +++ b/nametag8_CH592/user/ui/btn.h @@ -0,0 +1,43 @@ +/* + * btn.h + * + * Created on: Oct 13, 2024 + * Author: true + */ + +#ifndef USER_UI_BTN_H_ +#define USER_UI_BTN_H_ + + +#include + + + +#define BTN_COUNT 5 +#define HOLD_PERIOD 5 // period in milliseconds for each "hold" tick internally + + + +typedef struct BtnSub { + uint16_t hold; // initial hold + uint16_t repeat; // repeated hold + void (*cb_push)(uint8_t); + void (*cb_hold)(uint8_t); + void (*cb_release)(uint8_t); +} BtnSub; + + + +extern BtnSub btn[BTN_COUNT]; + +extern uint8_t btn_pushed; +extern uint8_t btn_held; + + + +void btn_intr(); +void btn_commit_hold(); + + + +#endif /* USER_UI_BTN_H_ */ diff --git a/nametag8_CH592/user/ui/menu.h b/nametag8_CH592/user/ui/menu.h new file mode 100644 index 0000000..a92aef1 --- /dev/null +++ b/nametag8_CH592/user/ui/menu.h @@ -0,0 +1,109 @@ +/* + * $Id: menu.h 495 2021-07-22 20:53:39Z true $ + * begin 20190527 true + */ + +#ifndef INC_UI_MENU_H_ +#define INC_UI_MENU_H_ + + +#include + +#include "render/draw_ssd1306.h" // for OLED support +//#include "driver/efm8ub2_userflash.h" // flash read/write operations +#include "ui/btn.h" // for button control + + +typedef struct MenuItem { + uint8_t count; // amount of entries in this menu + uint8_t flags; // misc settings for the menu + struct MenuItem *root; // menu to return to when going back + uint8_t root_idx; // menu index to return to + void (*dispfn)(uint8_t); // function which handles any drawing (idx) + void (*entryfn)(uint8_t); // function to call when entering menu (idx) +} MenuItem; + + + +#define MENU_FLAG_NONE (0) +#define MENU_FLAG_NO_AUTOCLS (1 << 0) +#define MENU_FLAG_SCROLL (1 << 4) +#define MENU_FLAG_SAVE_ON_EXIT (1 << 7) + +#define MENU_BTNSTYLE_MAIN 0x00 +#define MENU_BTNSTYLE_MENU 0x02 + +#define MENU_BTNSTYLE_NAME_IDLE 0x11 +#define MENU_BTNSTYLE_NAME_EDIT 0x12 + +#define MENU_BTNSTYLE_LED_EDIT 0x21 + +#define MENU_BTNSTYLE_OPTION_EDIT 0x51 + +#define MENU_BTNSTYLE_PROGSIMPLE_IDLE 0xe1 +#define MENU_BTNSTYLE_PROGSIMPLE_EDIT 0xe2 + +#define MENU_BTNSTYLE_ABOUT 0x60 + + + +extern MenuItem *menu; +extern uint8_t menu_idx; + +extern uint8_t mtick; + + + +void menu_start(uint8_t x); +void menu_stop(uint8_t x); + +void menu_tick(); + +void menu_prev_push(MenuItem *m); +MenuItem * menu_prev_pop(); + +void menu_btn_use_std(); +void menu_btn_use_none(); + +void menu_btn_exit(uint8_t idx); + +void menu_draw_buttons(uint8_t mode, uint8_t indicator_mask); +void menu_draw_tabs(uint8_t active_idx); + + + +// menu_none_nametag +extern const MenuItem menu_none; +void menu_none_disp(uint8_t idx); + +// menu_0_root +extern const MenuItem menu_0; +void menu_0_disp(uint8_t idx); +void menu_0_enter(uint8_t idx); + +// menu_1_name +extern const MenuItem menu_1; +void menu_1_disp(uint8_t idx); +void menu_1_enter(uint8_t idx); + +// menu_2_led +extern const MenuItem menu_2; +void menu_2_disp(uint8_t idx); +void menu_2_enter(uint8_t idx); + +// menu_3_snek +extern const MenuItem menu_3_snek; +void snek_disp(uint8_t idx); + +// menu_5_options +extern const MenuItem menu_5; +void menu_5_disp(uint8_t idx); +void menu_5_enter(uint8_t idx); + +// menu_6_about +extern const MenuItem menu_6; +void menu_6_disp(uint8_t idx); + + + +#endif /* INC_UI_MENU_H_ */ diff --git a/nametag8_CH592/user/ui/menu_base.c b/nametag8_CH592/user/ui/menu_base.c new file mode 100644 index 0000000..4c2ffe9 --- /dev/null +++ b/nametag8_CH592/user/ui/menu_base.c @@ -0,0 +1,310 @@ +/* + * $Id: menu_base.c 500 2021-08-08 19:43:38Z true $ + * begin 20190527 true + */ + +#include "menu.h" +#include "user_config.h" + +#include + + +MenuItem *menu; +uint8_t menu_idx = 0; + +uint8_t mtick; + + +void menu_tick() +{ + if (menu) { + // display + if (menu->dispfn) { + menu->dispfn(menu_idx); + + // // do we flip the display? + if ((menu == &menu_6) && (menu_idx == 4)) { // accelerometer + // accelerometer page never flips + ssd1306_set_flipmirror(0); + } else if (menu != &menu_none) { // nametag + if (sysflags & SYS_OLED_ROTATE_X) { + ssd1306_set_flipmirror(1); + } else { + ssd1306_set_flipmirror(0); + } + } + } + } + + mtick++; +} + +void menu_start(uint8_t x) +{ + x = x; + + menu = (MenuItem *)&menu_0; + menu_idx = 0; + + uconf.framemod = UCONF_FRAMERATE_FULL; + + menu_btn_use_std(); +} + +void menu_stop(uint8_t x) +{ + x = x; + + menu = (MenuItem *)&menu_none; + + menu_btn_use_none(); +} + + +void menu_btn_next(uint8_t idx) +{ + menu_idx++; + if (menu_idx >= menu->count) { + menu_idx = 0; + } +} + +void menu_btn_prev(uint8_t idx) +{ + if (menu_idx == 0) { + menu_idx = menu->count - 1; + } else { + menu_idx--; + } +} + +void menu_btn_enter(uint8_t idx) +{ + if (menu->entryfn) { + menu->entryfn(menu_idx); + } +} + +void menu_btn_exit(uint8_t idx) +{ + if (menu->root) { + // save data to flash if necessary + if (menu->flags & MENU_FLAG_SAVE_ON_EXIT) { + uconf_write(); + } + + // change menu + menu_idx = menu->root_idx; + menu = menu->root; + } + + // some menu entries override the enter button. + // make sure we're set back up to known values + menu_btn_use_std(); + + // if any menu disabled LEDs, re-enable them + uconf.flags &= ~UCONF_FLAGS_LEDS_DISABLE; +} + +void menu_btn_use_std() +{ + btn[0].cb_push = &menu_btn_next; + btn[0].cb_hold = &menu_btn_next; + btn[0].cb_release = 0; + btn[0].hold = 300 / HOLD_PERIOD; + btn[0].repeat = 150 / HOLD_PERIOD; + + btn[1].cb_push = &menu_btn_exit; + btn[1].cb_hold = 0; + btn[1].cb_release = 0; + btn[1].hold = 0; + btn[1].repeat = 0; + + btn[2].cb_push = &menu_btn_enter; + btn[2].cb_hold = 0; + btn[2].cb_release = 0; + btn[2].hold = 0; + btn[2].repeat = 0; + + btn[3].cb_push = &menu_btn_prev; + btn[3].cb_hold = &menu_btn_prev; + btn[3].cb_release = 0; + btn[3].hold = 300 / HOLD_PERIOD; + btn[3].repeat = 150 / HOLD_PERIOD; + + btn_commit_hold(); +} + +void menu_btn_use_none() +{ + uint8_t i; + + for (i = 0; i < BTN_COUNT; i++) { + btn[i].cb_push = &menu_btn_enter; + btn[i].hold = 0; + btn[i].repeat = 0; + } + + btn_commit_hold(); +} + + +void menu_draw_buttons(uint8_t mode, uint8_t mask) +{ + uint8_t w; + uint8_t i, j; + + char button_txt[4][12]; + + // text + if (menu->flags & MENU_FLAG_SCROLL) { + strcpy(button_txt[0], "Scroll"); + strcpy(button_txt[2], "Scroll"); + } else { + button_txt[0][0] = 0; + button_txt[2][0] = 0; + } + + switch (mode) { + case MENU_BTNSTYLE_MAIN: { + switch (mask) { + case 0: strcpy(button_txt[1], "Resume"); break; + case 3: + case 4: strcpy(button_txt[1], "Play"); break; + default: strcpy(button_txt[1], "Select"); break; + } + strcpy(button_txt[3], " "); + + mask = 0x07; + + break; + } + + case MENU_BTNSTYLE_MENU: { + strcpy(button_txt[1], "Set/Chg"); + strcpy(button_txt[3], "Back"); + break; + } + + case MENU_BTNSTYLE_NAME_IDLE: { + strcpy(button_txt[0], "Next"); + strcpy(button_txt[1], "Edit"); + strcpy(button_txt[2], "Prev"); + strcpy(button_txt[3], "Done"); + break; + } + + case MENU_BTNSTYLE_NAME_EDIT: { + strcpy(button_txt[0], "Next"); + strcpy(button_txt[1], "Char Done"); + strcpy(button_txt[2], "Prev"); + strcpy(button_txt[3], "Backsp"); + break; + } + + case MENU_BTNSTYLE_LED_EDIT: + case MENU_BTNSTYLE_OPTION_EDIT: { + strcpy(button_txt[0], "+"); + strcpy(button_txt[1], "OK"); + strcpy(button_txt[2], "-"); + strcpy(button_txt[3], "OK"); + break; + } + + case MENU_BTNSTYLE_PROGSIMPLE_IDLE: { + strcpy(button_txt[0], "->"); + strcpy(button_txt[1], "Edit"); + strcpy(button_txt[2], "<-"); + strcpy(button_txt[3], "Exit Editor"); + break; + } + case MENU_BTNSTYLE_PROGSIMPLE_EDIT: { + strcpy(button_txt[0], "+"); + strcpy(button_txt[1], "Done"); + strcpy(button_txt[2], "-"); + strcpy(button_txt[3], "Next ->"); + break; + } + + case MENU_BTNSTYLE_ABOUT: { + for (i = 0; i < 4; i++) { + button_txt[i][0] = 0x20; + button_txt[i][1] = 0x00; + } + if (mask == 0x08) { + strcpy(button_txt[3], "Back"); + } + break; + } + } + + for (i = 0; i < 4; i++) { + if (button_txt[i][0] == 0) { + strcpy(button_txt[i], "----"); + } + } + + ssd1306fb_set_cursor(18, -2); + ssd1306fb_draw_str(font_Dialog_plain_8, button_txt[0], 0); + + w = ssd1306fb_get_str_width(font_Dialog_plain_8, button_txt[1], strlen(button_txt[1]), 0); + ssd1306fb_set_cursor(116 - w, -2); + ssd1306fb_draw_str(font_Dialog_plain_8, button_txt[1], 0); + + ssd1306fb_set_cursor(18, 24); + ssd1306fb_draw_str(font_Dialog_plain_8, button_txt[2], 0); + + w = ssd1306fb_get_str_width(font_Dialog_plain_8, button_txt[3], strlen(button_txt[3]), 0); + ssd1306fb_set_cursor(116 - w, 24); + ssd1306fb_draw_str(font_Dialog_plain_8, button_txt[3], 0); + + // indicators + i = 16; j = 0; // lower and upper left + while (j < 6) { + if (mask & 0x02) ssd1306fb_draw_hline(11, i, 31 - j); + if (mask & 0x01) ssd1306fb_draw_hline(11, i, j); + i--; j++; + } + + i = 118; j = 0; // lower and upper right + while (j < 6) { + if (mask & 0x08) ssd1306fb_draw_hline(i, 123, 31 - j); + if (mask & 0x04) ssd1306fb_draw_hline(i, 123, j); + i++; j++; + } +} + +void menu_draw_tabs(uint8_t active_idx) +{ + uint8_t h; + uint8_t i; + + uint8_t x, y, s; + + uint8_t count = menu->count; + + h = (SSD1306_HEIGHT - 1) / count; // individual height + y = ((SSD1306_HEIGHT - (h * count)) >> 1); // starting offset + s = y; // memorized offset + + for (i = 0; i < count; i++) { + x = (i == active_idx) ? 0 : 2; + + ssd1306fb_draw_hline(x, 6, y); + ssd1306fb_draw_vline(x, y, y + h); + + y += h; + + if (i == active_idx) { + ssd1306fb_draw_hline(0, 6, y); + } + + if (y >= SSD1306_HEIGHT) { + y = SSD1306_HEIGHT - 1; + } + } + + ssd1306fb_draw_hline(2, 6, y); + + ssd1306fb_draw_vline(6, s, y); // right line +} diff --git a/nametag8_CH592/user/ui/menu_def.c b/nametag8_CH592/user/ui/menu_def.c new file mode 100644 index 0000000..d7abdf2 --- /dev/null +++ b/nametag8_CH592/user/ui/menu_def.c @@ -0,0 +1,45 @@ +/* + * $Id: menu_def.c 499 2021-07-26 05:24:02Z true $ + * begin 20190527 true + * + * main menu + */ + +#include "menu.h" + +#include "user_config.h" + + + +// fake menu when exiting +const MenuItem menu_none = {1, 0, 0, 0, &menu_none_disp, &menu_start}; + +// root menu + // exit, snek, morble, set name, leds, options, about +const MenuItem menu_0 = {7, MENU_FLAG_SCROLL, + 0, 0, &menu_0_disp, &menu_0_enter}; + +// name menu + // set name, display mode, flip mode, font select, char spacing, half-width, color invert +const MenuItem menu_1 = {7, MENU_FLAG_SCROLL | MENU_FLAG_SAVE_ON_EXIT, + (MenuItem *)&menu_0, 1, &menu_1_disp, &menu_1_enter}; + +// led menu + // edge mode, edge setup, eyes mode, eyes setup, favcolor hue, sat, val, altcolor hue, sat, val +const MenuItem menu_2 = {10, MENU_FLAG_SCROLL | MENU_FLAG_SAVE_ON_EXIT, + (MenuItem *)&menu_0, 2, &menu_2_disp, &menu_2_enter}; + + +// snek menu +const MenuItem menu_3_snek = {1, MENU_FLAG_NONE, //MENU_FLAG_SAVE_ON_EXIT, + (MenuItem *)&menu_0, 3, &snek_disp, NULL}; + +// options menu + // leds on/off, sleep on/off, sleep threshold, wake threshold, recal lightsense, show cpu usage, show accel "angle", +const MenuItem menu_5 = {7, MENU_FLAG_SCROLL | MENU_FLAG_SAVE_ON_EXIT, + (MenuItem *)&menu_0, 5, &menu_5_disp, &menu_5_enter}; + +// about menu + // credits, leds, leds, leds, accel, cpu usage/uptime, light/temp, errors, font test +const MenuItem menu_6 = {9, MENU_FLAG_SCROLL, + (MenuItem *)&menu_0, 6, &menu_6_disp, 0}; diff --git a/nametag8_CH592/user/ui/menu_entry_0.c b/nametag8_CH592/user/ui/menu_entry_0.c new file mode 100644 index 0000000..dfb3d39 --- /dev/null +++ b/nametag8_CH592/user/ui/menu_entry_0.c @@ -0,0 +1,324 @@ +/* + * $Id: menu_entry_0.c 494 2021-07-21 11:46:11Z true $ + * begin 20190527 true + * + * main menu functions + */ + +#include "menu.h" + +#include "render/font.h" + +#include "misc/accel.h" +#include "misc/sin7.h" + +#include "global.h" +#include "user_config.h" + +#include +#include + + +#define ROTATE_TARGET_WIDTH 40 +#define ROTATE_TARGET_HEIGHT 32 + +#define ROTATE_NAME_LEN_FULLRATE 15 // set to length in characters of name to run at +#define ROTATE_NAME_LEN_HALFRATE 15 // the specified rate, max. exceeding half rate + // name length will not allow dynamic names. + // if your MCU has i2c DMA, set these to max name. + // if no i2c DMA, then set based on reported CPU + // usage per update rate, and tweak update rate. + +uint8_t rotsrc_fb[(ROTATE_TARGET_WIDTH * (ROTATE_TARGET_HEIGHT >> 3)) + 1]; +uint8_t rotdst_fb[(ROTATE_TARGET_WIDTH * (ROTATE_TARGET_HEIGHT >> 3)) + 1]; + +SSD1306 rotsrc; +SSD1306 rotdst; + + +uint8_t wiggle = 1; + + +static void menu_none_init() +{ + rotsrc.width = rotdst.width = ROTATE_TARGET_WIDTH; + rotsrc.height = rotdst.height = ROTATE_TARGET_HEIGHT; + + rotsrc.mode = rotsrc_fb; + rotsrc.fb = rotsrc_fb + 1; + + rotdst.mode = rotdst_fb; + rotdst.fb = rotdst_fb + 1; +} + +static void menu_none_set_halfwidth(SSD1306 *dst) +{ + if (uconf.nameconf & UCONF_NAME_MODE_HALFWIDTH) { + dst->state |= SSD1306_STATE_STR_HALFWIDTH; + } else { + dst->state &= ~SSD1306_STATE_STR_HALFWIDTH; + } +} + +static void menu_none_set_flipmirror(uint8_t flip_flag) +{ + if (uconf.nameconf & UCONF_NAME_MODE_AUTOROTATE) { + if (sysflags & flip_flag) { + ssd1306_set_flipmirror(1); + } else { + ssd1306_set_flipmirror(0); + } + } else if (uconf.nameconf & UCONF_NAME_MODE_ROTATE180) { + ssd1306_set_flipmirror(1); + } else { + ssd1306_set_flipmirror(0); + } +} + + +const uint8_t err_namewide_1[] = "Name Too Wide"; +const uint8_t err_namewide_2[] = "Shorten the name, reduce"; +const uint8_t err_namewide_3[] = "spacing or try a smaller font."; + +const uint8_t err_namelong_1[] = "Name Too Long"; +const uint8_t err_namelong_2[] = "Names 10 to 15 chars long"; +const uint8_t err_namelong_3[] = "must use Horizontal orientation."; + +static void menu_none_print_error(uint8_t *err1, uint8_t *err2, uint8_t *err3) +{ + ssd1306fb_set_cursor(0, 0); + ssd1306fb_draw_str(font_DejaVu_Sans_Mono_Bold_11, (const char *)err1, 0); + ssd1306fb_set_cursor(0, 12); + ssd1306fb_draw_str(font_Dialog_plain_8, (const char *)err2, 0); + ssd1306fb_set_cursor(0, 20); + ssd1306fb_draw_str(font_Dialog_plain_8, (const char *)err3, 0); + return; +} + +void menu_none_disp(uint8_t idx) +{ + uint8_t i, j; + uint8_t o; + uint16_t w; + + int8_t left, top; + int8_t rot; + + char txt[6]; + + (idx = idx); + + menu_none_init(); + + // total width and left / starting boundary + menu_none_set_halfwidth(&rotsrc); + ssd1306fb_set_target(&rotsrc); + + w = ssd1306fb_get_str_width(font_table[uconf.font_idx].font, + uconf.name, + strlen(uconf.name), + uconf.char_spacing); + + if (w > oled.width + 16) { + menu_none_print_error((uint8_t *)err_namewide_1, (uint8_t *)err_namewide_2, (uint8_t *)err_namewide_3); + } + + left = (oled.width >> 1) - (w >> 1); + top = oled.height - ssd1306fb_get_font_height(font_table[uconf.font_idx].font) - 1; + + // get rotation + rot = accel_get_rotation(); + + // render modes + switch (uconf.nameconf & UCONF_NAME_DISP_MASK) { + case UCONF_NAME_DISP_STATIC_HORIZ: { + menu_none_set_flipmirror(SYS_OLED_ROTATE_X); + + menu_none_set_halfwidth(&oled); + ssd1306fb_set_target(&oled); + + ssd1306fb_set_cursor(left, top); + ssd1306fb_draw_str(font_table[uconf.font_idx].font, uconf.name, uconf.char_spacing); + break; + } + + case UCONF_NAME_DISP_STATIC_VERT: { + menu_none_set_flipmirror(SYS_OLED_ROTATE_Y); + + rot = 95; + + goto MENU_0_DISP_CHAR_ROTATE; + } + case UCONF_NAME_DISP_WIGGLE: { + menu_none_set_flipmirror(SYS_OLED_ROTATE_X); + + // why this value? why the fuck not. value is the "speed" of the wiggle + wiggle += MISC_WIGGLE_RATE; + wiggle += (uconf.framemod == UCONF_FRAMERATE_FULL) ? 0 : MISC_WIGGLE_RATE; + // the shift is the maximum "angle" of the wiggle + rot = (cos7(wiggle) >> MISC_WIGGLE_SHIFT); + + goto MENU_0_DISP_CHAR_ROTATE; + } + case UCONF_NAME_DISP_CHAR_ROTATE: { + ssd1306_set_flipmirror(0); + +MENU_0_DISP_CHAR_ROTATE: + // set pixel printing color - only set it on the output, not on rotation buffers + ssd1306fb_set_target(&oled); + ssd1306fb_set_color(uconf.nameconf & UCONF_NAME_MODE_COLOR_INVERT ? + SSD1306_STATE_INVERT_PIXEL : SSD1306_STATE_SET_PIXEL); + + j = strlen(uconf.name); + + // set framerate, or abort if invalid + if (j > ROTATE_NAME_LEN_FULLRATE) { + if (j > ROTATE_NAME_LEN_HALFRATE) { + menu_none_print_error((uint8_t *)err_namelong_1, (uint8_t *)err_namelong_2, (uint8_t *)err_namelong_3); + return; + } else { + uconf.framemod = UCONF_FRAMERATE_HALF; + } + } else { + uconf.framemod = UCONF_FRAMERATE_FULL; + } + + // configure rotation buffer + ssd1306fb_set_target(&rotsrc); + ssd1306fb_set_color(SSD1306_STATE_SET_PIXEL); + menu_none_set_halfwidth(&rotsrc); + + txt[1] = 0; + + for (i = 0; i < strlen(uconf.name); i++) { + j = i; + + // change character order + if (uconf.nameconf & UCONF_NAME_DISP_MASK) { + // this method is a bit jumpy, but works for now + if (sysflags & SYS_OLED_REVERSE_CHARS) { + j = strlen(uconf.name) - i - 1; + } + } + + txt[0] = uconf.name[j]; + + // set target buffer, need to do this before width calc + // as this will have the halfwidth bit set appropriately + ssd1306fb_set_target(&rotsrc); + + // get left drawing position, so the character is rendered centered + o = ssd1306fb_get_str_width(font_table[uconf.font_idx].font, txt, 1, 0); + w = ((rotsrc.width >> 1) - (o >> 1)); + + // clear buffers before work + ssd1306_cls(&rotdst); + ssd1306_cls(&rotsrc); + + // render and rotate + ssd1306fb_set_cursor(w, top); + ssd1306fb_draw_str(font_table[uconf.font_idx].font, txt, 0); + ssd1306fb_rotate(&rotsrc, &rotdst, rot); + + // copy dst buffer to oled buffer in correct position + ssd1306fb_set_target(&oled); + ssd1306fb_copy(left - w, 0, ROTATE_TARGET_WIDTH, ROTATE_TARGET_HEIGHT, rotdst.fb); + + // update position of character based on spacing + left += o + uconf.char_spacing; + } + + break; + } + } + + ssd1306fb_set_target(&oled); + + if (uconf.flags & UCONF_FLAGS_SHOW_ACCEL_ANGLE) { + sprintf(txt, "%+3d", accel_get_rotation()); + ssd1306fb_set_cursor(90, 0); + ssd1306fb_draw_str(font_DejaVu_Sans_Mono_Bold_11, txt, 1); + } + + if (uconf.flags & UCONF_FLAGS_SHOW_CPU_USAGE) { + sprintf(txt, "%3u%%", cpu_use); + ssd1306fb_set_cursor(90, 20); + ssd1306fb_draw_str(font_DejaVu_Sans_Mono_Bold_11, txt, 1); + } + + oled.state &= ~SSD1306_STATE_STR_HALFWIDTH; +} + +void menu_0_disp(uint8_t idx) +{ + char txt[12]; + uint8_t w; + + ssd1306fb_set_color(SSD1306_STATE_SET_PIXEL); + + // circle next to item + ssd1306fb_draw_circle(24, 16, (mtick & 0x04) ? 2 : 1); + + // which item selected? + ssd1306fb_set_cursor(32, 9); + switch (idx) { + case 0: strcpy(txt, "Nametag!"); break; + case 1: strcpy(txt, "Name Setup"); break; + case 2: strcpy(txt, "LED Setup"); break; + case 3: strcpy(txt, "Snek"); break; + case 4: strcpy(txt, "Morble"); break; + case 5: strcpy(txt, "Options"); break; + case 6: strcpy(txt, "About"); break; + } + ssd1306fb_draw_str(font_DejaVu_Sans_Mono_Bold_11, txt, 1); + + // disabled / incomplete entries + switch (idx) { + case 4: { + w = ssd1306fb_get_str_width(font_DejaVu_Sans_Mono_Bold_11, txt, strlen(txt), 1); + ssd1306fb_draw_hline(32, w + 32, 16); + ssd1306fb_draw_hline(32, w + 32, 17); + } + } + + // draw extras + menu_draw_tabs(idx); + menu_draw_buttons(MENU_BTNSTYLE_MAIN, idx); +} + +void menu_0_enter(uint8_t idx) +{ + switch (idx) { + case 0: { + menu_stop(0); + return; + } + case 1: { + menu = (MenuItem *)&menu_1; + menu_idx = 0; + return; + } + case 2: { + menu = (MenuItem *)&menu_2; + menu_idx = 0; + return; + } + case 3: { + menu = (MenuItem *)&menu_3_snek; + return; + } + case 4: { + return; + } + case 5: { + menu = (MenuItem *)&menu_5; + menu_idx = 0; + return; + } + case 6: { + menu = (MenuItem *)&menu_6; + menu_idx = 0; + return; + } + } +} diff --git a/nametag8_CH592/user/ui/menu_entry_1.c b/nametag8_CH592/user/ui/menu_entry_1.c new file mode 100644 index 0000000..43877b6 --- /dev/null +++ b/nametag8_CH592/user/ui/menu_entry_1.c @@ -0,0 +1,398 @@ +/* + * $Id: menu_entry_1.c 494 2021-07-21 11:46:11Z true $ + * begin 20190612 true + * + * name setup menu functions + */ + +#include "menu.h" + +#include "render/font.h" + +#include "user_config.h" + +#include +#include + + +#define EDIT_MODE_OFF 0x00 +#define EDIT_MODE_IDLE 0x01 +#define EDIT_MODE_EDIT 0x02 + + +static uint8_t menu_last; +static uint8_t edit_mode = 0; +static uint8_t edit_pos; + + +uint8_t menu_1_get_offset() +{ + uint8_t a; + + if (edit_pos < strlen(uconf.name)) { + a = uconf.name[edit_pos]; + + if (a < 0x30) { + return 0x30; + } else if (a < 0x40) { + return 0x40; + } else if (a < 0x60) { + return 0x60; + } + } + + return 0x20; +} + +void menu_1_btn_next(uint8_t idx) +{ + uint8_t first, last, len; + + if (edit_mode == EDIT_MODE_IDLE) { + edit_pos++; + if (edit_pos > strlen(uconf.name) || edit_pos > UCONF_NAME_MAXLEN) { + edit_pos = 0; + } + } else { + first = font_table[uconf.font_idx].font[FONT_FIRST_CHAR_POS]; + last = font_table[uconf.font_idx].font[FONT_CHAR_NUM_POS] + first; + len = strlen(uconf.name); + + if (edit_pos < UCONF_NAME_MAXLEN ) { + uconf.name[edit_pos]++; + if ((uconf.name[edit_pos] < first) || (uconf.name[edit_pos] >= last)) { + uconf.name[edit_pos] = first; + } + + if (edit_pos == len) { + uconf.name[edit_pos + 1] = 0x00; + } + } + } +} + +void menu_1_btn_prev(uint8_t idx) +{ + uint8_t first, last, len; + + if (edit_mode == EDIT_MODE_IDLE) { + if (edit_pos == 0) { + edit_pos = strlen(uconf.name) + 1; + } + edit_pos--; + } else { + first = font_table[uconf.font_idx].font[FONT_FIRST_CHAR_POS]; + last = font_table[uconf.font_idx].font[FONT_CHAR_NUM_POS] + first; + len = strlen(uconf.name); + + if (edit_pos < UCONF_NAME_MAXLEN) { + if (uconf.name[edit_pos] <= first) { + uconf.name[edit_pos] = last; + } + uconf.name[edit_pos]--; + + if (edit_pos == len) { + uconf.name[edit_pos + 1] = 0x00; + } + } + } +} + +void menu_1_btn_enter(uint8_t idx) +{ + if (edit_mode == EDIT_MODE_IDLE) { + edit_mode = EDIT_MODE_EDIT; + } else { + edit_mode = EDIT_MODE_IDLE; + } +} + +void menu_1_btn_exit(uint8_t idx) +{ + uint8_t i; + + if (edit_mode == EDIT_MODE_IDLE) { + edit_mode = EDIT_MODE_OFF; + menu_btn_use_std(); + } else { + // delete + /* + if (strlen(uconf.name)) { + if (edit_pos) { + for (i = edit_pos; i < strlen(uconf.name) - 1; i++) { + uconf.name[i] = uconf.name[i+1]; + } + uconf.name[i] = 0x00; + } + }*/ + + // backspace + if (edit_pos && (uconf.name[0] != 0)) { + for (i = edit_pos - 1; i < strlen(uconf.name); i++) { + uconf.name[i] = uconf.name[i + 1]; + } + uconf.name[i] = 0x00; + edit_pos--; + } + } +} + +void menu_1_btn_use() +{ + btn[0].cb_push = &menu_1_btn_prev; + btn[0].cb_hold = &menu_1_btn_prev; + btn[0].cb_release = 0; + btn[0].hold = 280 / HOLD_PERIOD; + btn[0].repeat = ((edit_mode == EDIT_MODE_IDLE) ? 240 : 60) / HOLD_PERIOD; + + btn[1].cb_push = &menu_1_btn_exit; + btn[1].cb_hold = 0; + btn[1].cb_release = 0; + btn[1].hold = 0; + btn[1].repeat = 0; + + btn[2].cb_push = &menu_1_btn_enter; + btn[2].cb_hold = 0; + btn[2].cb_release = 0; + btn[2].hold = 0; + btn[2].repeat = 0; + + btn[3].cb_push = &menu_1_btn_next; + btn[3].cb_hold = &menu_1_btn_next; + btn[3].cb_release = 0; + btn[3].hold = btn[0].hold; + btn[3].repeat = btn[0].repeat; + + btn_commit_hold(); +} + +void menu_1_name_edit() +{ + uint8_t w, x; + char txt[10]; + + ssd1306fb_set_cursor(10, 8); + ssd1306fb_draw_str(font_table[1].font, uconf.name, 0); + + ssd1306fb_draw_circle(oled.cursor_x + 4, oled.cursor_y + 7, (mtick & 0x04) ? 2 : 1); + + // draw underline + if (edit_mode == EDIT_MODE_IDLE || (edit_mode == EDIT_MODE_EDIT && (mtick & 0x08))) { + x = font_table[1].font[FONT_WIDTH_POS]; + w = x - 1; + + x *= edit_pos; + x += 10; + w += x; + + ssd1306fb_draw_hline(x + 1, w, 21); + } + + // draw character count and limits + + sprintf(txt, "%2u / %02u", (uint8_t)strlen(uconf.name), (uint8_t)UCONF_NAME_MAXLEN); + ssd1306fb_set_cursor((oled.width >> 1) - (ssd1306fb_get_str_width(font_table[0].font, txt, strlen(txt), 0) >> 1), 24); + ssd1306fb_draw_str(font_table[0].font, txt, 0); +} + +void menu_1_font_next() +{ + do { + uconf.font_idx++; + if (uconf.font_idx >= (sizeof(font_table) / sizeof(font_table[0]))) { + uconf.font_idx = 0; + } + } while (!font_table[uconf.font_idx].tag_allowed); +} + +void menu_1_disp(uint8_t idx) +{ + int8_t w, x; + char txt[16]; + + if (edit_mode != EDIT_MODE_OFF) { + menu_1_btn_use(); // this also sets button speed as necessary + menu_1_name_edit(); + goto MENU_0_DRAW_TEXT_DONE; + } + + ssd1306fb_set_cursor(10, 7); + + // which item selected? + switch (idx) { + case 0: { + ssd1306fb_draw_str(font_table[0].font, "Set Your Name", 1); + strcpy(txt, "Set>"); + break; + } + case 1: { +MENU_0_ORIENTATION: + ssd1306fb_draw_str(font_table[0].font, "Nametag Orientation", 1); + switch (uconf.nameconf & UCONF_NAME_DISP_MASK) { + case UCONF_NAME_DISP_STATIC_HORIZ: { + strcpy(txt, "Horiz"); + break; + } + case UCONF_NAME_DISP_STATIC_VERT: { + strcpy(txt, "Vert"); + break; + } + case UCONF_NAME_DISP_WIGGLE: { + strcpy(txt, "Wiggle"); + break; + } + case UCONF_NAME_DISP_CHAR_ROTATE: { + oled.state |= SSD1306_STATE_STR_HALFWIDTH; + strcpy(txt, "Always UP"); + break; + } + } + break; + } + case 2: { + if ((uconf.nameconf & UCONF_NAME_DISP_MASK) != UCONF_NAME_DISP_CHAR_ROTATE) { + ssd1306fb_draw_str(font_table[0].font, "Nametag Flip", 1); + + if (uconf.nameconf & UCONF_NAME_MODE_ROTATE180) { + strcpy(txt, "Flip"); + } else if (uconf.nameconf & UCONF_NAME_MODE_AUTOROTATE) { + strcpy(txt, "Auto"); + } else { + strcpy(txt, "Normal"); + } + + break; + } else { + if (menu_last > menu_idx) { + menu_idx--; + goto MENU_0_ORIENTATION; + } else { + menu_idx++; + goto MENU_0_FONT; + } + } + break; + } + case 3: { +MENU_0_FONT: + ssd1306fb_draw_str(font_table[0].font, "Font", 1); + + ssd1306fb_set_cursor(10, 15); + ssd1306fb_draw_str(font_table[0].font, font_table[uconf.font_idx].name, 1); + + ssd1306fb_set_cursor(69, + 2 + oled.height - ssd1306fb_get_font_height(font_table[uconf.font_idx].font)); + ssd1306fb_draw_str(font_table[uconf.font_idx].font, "ab", 1); + + goto MENU_0_DRAW_TEXT_DONE; + break; + } + case 4: { + ssd1306fb_draw_str(font_table[0].font, "Character Spacing (px)", 1); + sprintf(txt, "%d", (int8_t)uconf.char_spacing); + break; + } + case 5: { + ssd1306fb_draw_str(font_table[0].font, "Render at Half Width?", 1); + strcpy(txt, (uconf.nameconf & UCONF_NAME_MODE_HALFWIDTH) ? "Yes" : "No"); + break; + } + case 6: { + ssd1306fb_draw_str(font_table[0].font, "Pixel Draw Mode", 1); + strcpy(txt, (uconf.nameconf & UCONF_NAME_MODE_COLOR_INVERT) ? "Invert" : "Bright"); + break; + } + } + + w = ssd1306fb_get_str_width(font_table[1].font, txt, strlen(txt), 1); + x = 68 - (w >> 1); + ssd1306fb_set_cursor(x, 18); + ssd1306fb_draw_str(font_table[1].font, txt, 1); + + // draw box + ssd1306fb_draw_rect(x - 2, 18, x + w + 2, 31); + +MENU_0_DRAW_TEXT_DONE: + oled.state &= ~SSD1306_STATE_STR_HALFWIDTH; + + // draw extras + menu_draw_tabs(idx); + + if (edit_mode == EDIT_MODE_OFF) { + w = MENU_BTNSTYLE_MENU; + } else { + w = 0x10 + edit_mode; + } + + menu_draw_buttons(w, 0x0f); + + // remember this for skipping + menu_last = menu_idx; +} + +void menu_1_enter(uint8_t idx) +{ + int8_t a; + + switch (idx) { + case 0: { + // start the name editor... + edit_mode = EDIT_MODE_IDLE; + edit_pos = 0; + return; + } + case 1: { // display mode + a = (uconf.nameconf & UCONF_NAME_DISP_MASK) >> UCONF_NAME_DISP_OFFSET; + + if (++a >= UCONF_NAME_DISP_COUNT) { + a = 0; + } + + uconf.nameconf &= ~UCONF_NAME_DISP_MASK; + uconf.nameconf |= (a << UCONF_NAME_DISP_OFFSET) & UCONF_NAME_DISP_MASK; + + return; + } + case 2: { // char flip mode + if ((uconf.nameconf & UCONF_NAME_DISP_MASK) != UCONF_NAME_DISP_CHAR_ROTATE) { + if (uconf.nameconf & UCONF_NAME_MODE_AUTOROTATE) { + uconf.nameconf &= ~(UCONF_NAME_MODE_ROTATE180 | UCONF_NAME_MODE_AUTOROTATE); + } else if (uconf.nameconf & UCONF_NAME_MODE_ROTATE180) { + uconf.nameconf &= ~UCONF_NAME_MODE_ROTATE180; + uconf.nameconf |= UCONF_NAME_MODE_AUTOROTATE; + } else { + uconf.nameconf |= UCONF_NAME_MODE_ROTATE180; + } + } + + return; + } + case 3: { // font + menu_1_font_next(); + break; + } + case 4: { + if (++uconf.char_spacing > 9) { + uconf.char_spacing = -1; + } + + break; + } + case 5: { + if (uconf.nameconf & UCONF_NAME_MODE_HALFWIDTH) { + uconf.nameconf &= ~UCONF_NAME_MODE_HALFWIDTH; + } else { + uconf.nameconf |= UCONF_NAME_MODE_HALFWIDTH; + } + break; + } + case 6: { + if (uconf.nameconf & UCONF_NAME_MODE_COLOR_INVERT) { + uconf.nameconf &= ~UCONF_NAME_MODE_COLOR_INVERT; + } else { + uconf.nameconf |= UCONF_NAME_MODE_COLOR_INVERT; + } + break; + } + } +} diff --git a/nametag8_CH592/user/ui/menu_entry_2.c b/nametag8_CH592/user/ui/menu_entry_2.c new file mode 100644 index 0000000..f8b7a75 --- /dev/null +++ b/nametag8_CH592/user/ui/menu_entry_2.c @@ -0,0 +1,425 @@ +/* + * $Id: menu_entry_2.c 495 2021-07-22 20:53:39Z true $ + * begin 20190612 true + * + * led setup menu functions + */ + +#include "ui/menu.h" + +#include "render/font.h" + +#include "led/rgbled.h" + +#include "user_config.h" + +#include +#include + + + +#define EDIT_MODE_OFF 0x00 +#define EDIT_MODE_IDLE 0x01 +#define EDIT_MODE_EDIT 0x02 + + + +static uint8_t edit_mode = MENU_BTNSTYLE_MENU; +static uint8_t edit_idx; +static uint8_t prog_data_idx = 0; + + + +static void menu_2_val_inc(uint8_t *val, uint8_t loop) +{ + if (!loop && *val == 0xff) return; + (*val)++; +} + +static void menu_2_val_dec(uint8_t *val, uint8_t loop) +{ + if (!loop && *val == 0x00) return; + (*val)--; +} + +void menu_2_btn_next(uint8_t idx) +{ + switch (edit_idx) { + case 1: + case 3: { + switch (edit_mode) { + case MENU_BTNSTYLE_PROGSIMPLE_IDLE: { + prog_data_idx++; + if (prog_data_idx > 15) { + prog_data_idx = 0; + } + break; + } + case MENU_BTNSTYLE_PROGSIMPLE_EDIT: { + uint8_t e; + uint8_t *x; + uint8_t *s; + + s = uconf.ledprog_edge_data[uconf.ledprog_edge_idx]; + x = &s[prog_data_idx >> 1]; + + if (prog_data_idx & 0x01) { + e = *x & 0xf; + e++; if (e >= 0x10) e = 0; + *x &= 0xf0; + *x |= e & 0xf; + } else { + e = *x >> 4; + e++; if (e >= 0x10) e = 0; + *x &= 0x0f; + *x |= e << 4; + } + break; + } + } + break; + } + case 4: menu_2_val_inc(&uconf.favcolor_hue, 1); return; + case 5: menu_2_val_inc(&uconf.favcolor_sat, 0); return; + case 6: menu_2_val_inc(&uconf.favcolor_val, 0); return; + case 7: menu_2_val_inc(&uconf.altcolor_hue, 1); return; + case 8: menu_2_val_inc(&uconf.altcolor_sat, 0); return; + case 9: menu_2_val_inc(&uconf.altcolor_val, 0); return; + } +} + +void menu_2_btn_prev(uint8_t idx) +{ + switch (edit_idx) { + case 1: + case 3: { + switch (edit_mode) { + case MENU_BTNSTYLE_PROGSIMPLE_IDLE: { + if (prog_data_idx) { + prog_data_idx--; + } else { + prog_data_idx = 15; + } + break; + } + case MENU_BTNSTYLE_PROGSIMPLE_EDIT: { + uint8_t e; + uint8_t *x; + uint8_t *s; + + s = uconf.ledprog_edge_data[uconf.ledprog_edge_idx]; + x = &s[prog_data_idx >> 1]; + + if (prog_data_idx & 0x01) { + e = *x & 0xf; + if (!e) e = 0xf; else e--; + *x &= ~0xf; + *x |= e & 0xf; + } else { + e = *x >> 4; + if (!e) e = 0xf; else e--; + *x &= ~0xf0; + *x |= e << 4; + } + break; + } + } + break; + } + case 4: menu_2_val_dec(&uconf.favcolor_hue, 1); return; + case 5: menu_2_val_dec(&uconf.favcolor_sat, 0); return; + case 6: menu_2_val_dec(&uconf.favcolor_val, 0); return; + case 7: menu_2_val_dec(&uconf.altcolor_hue, 1); return; + case 8: menu_2_val_dec(&uconf.altcolor_sat, 0); return; + case 9: menu_2_val_dec(&uconf.altcolor_val, 0); return; + } +} + +void menu_2_btn_exit(uint8_t idx) +{ + edit_mode = MENU_BTNSTYLE_MENU; + menu_btn_use_std(); +} + +void menu_2_btn_use(uint8_t idx) +{ + btn[0].cb_push = &menu_2_btn_prev; + btn[0].cb_hold = &menu_2_btn_prev; + btn[0].cb_release = 0; + btn[0].hold = 200 / HOLD_PERIOD; + btn[0].repeat = 40 / HOLD_PERIOD; + + btn[1].cb_push = &menu_2_btn_exit; + btn[1].cb_hold = 0; + btn[1].cb_release = 0; + btn[1].hold = 0; + btn[1].repeat = 0; + + btn[2].cb_push = &menu_2_btn_exit; + btn[2].cb_hold = 0; + btn[2].cb_release = 0; + btn[2].hold = 0; + btn[2].repeat = 0; + + btn[3].cb_push = &menu_2_btn_next; + btn[3].cb_hold = &menu_2_btn_next; + btn[3].cb_release = 0; + btn[3].hold = btn[0].hold; + btn[3].repeat = btn[0].repeat; + + btn_commit_hold(); +} + +void menu_2_edit_enter(uint8_t idx) +{ + if (edit_mode == MENU_BTNSTYLE_PROGSIMPLE_IDLE) { + edit_mode = MENU_BTNSTYLE_PROGSIMPLE_EDIT; + } else { + edit_mode = MENU_BTNSTYLE_PROGSIMPLE_IDLE; + } +} + +void menu_2_edit_exit(uint8_t idx) +{ + if (edit_mode == MENU_BTNSTYLE_PROGSIMPLE_IDLE) { + edit_mode = MENU_BTNSTYLE_MENU; + menu_btn_use_std(); + } else { + prog_data_idx++; + prog_data_idx %= 16; + } +} + +void menu_2_edit_use(uint8_t idx) +{ + btn[0].cb_push = &menu_2_btn_prev; + btn[0].cb_hold = &menu_2_btn_prev; + btn[0].cb_release = 0; + btn[0].hold = 280 / HOLD_PERIOD; + btn[0].repeat = 160 / HOLD_PERIOD; + + btn[1].cb_push = &menu_2_edit_exit; + btn[1].cb_hold = 0; + btn[1].cb_release = 0; + btn[1].hold = 0; + btn[1].repeat = 0; + + btn[2].cb_push = &menu_2_edit_enter; + btn[2].cb_hold = 0; + btn[2].cb_release = 0; + btn[2].hold = 0; + btn[2].repeat = 0; + + btn[3].cb_push = &menu_2_btn_next; + btn[3].cb_hold = &menu_2_btn_next; + btn[3].cb_release = 0; + btn[3].hold = btn[0].hold; + btn[3].repeat = btn[0].repeat; + + btn_commit_hold(); +} + + +void menu_2_disp(uint8_t idx) +{ + int i; + int8_t w, x; + uint8_t f; + char txt[20]; + + if (edit_mode == MENU_BTNSTYLE_LED_EDIT) { + menu_2_btn_use(idx); + } + + ssd1306fb_set_cursor(10, 7); + + if (idx >= 2 && idx <= 7) { + f = (idx - 4) / 3; + ssd1306fb_draw_str(font_table[0].font, (f == 0) ? "Favorite " : "Alternate ", 1); + } + + // which item selected? + switch (idx) { + case 0: { + ssd1306fb_draw_str(font_table[0].font, "Edge Program", 1); + ssd1306fb_set_cursor(16, 15); + ssd1306fb_draw_str(font_table[0].font, edge_pgm[uconf.ledprog_edge_idx].name, 1); + + goto MENU_2_DRAW_TEXT_DONE; + } + case 1: { + uint8_t *s; + + sprintf(txt, "Edge"); + s = uconf.ledprog_edge_data[uconf.ledprog_edge_idx]; + + if (edit_mode == MENU_BTNSTYLE_MENU) { + ssd1306fb_draw_str(font_table[0].font, txt, 1); + ssd1306fb_draw_str(font_table[0].font, " Settings", 1); + } else { + ssd1306fb_set_cursor(48, 0); + ssd1306fb_draw_str(font_table[1].font, txt, 1); + } + + w = 16; + x = 0; + for (i = 0; i < 8; i++) { + sprintf(txt, "%01X", s[i] >> 4); + ssd1306fb_set_cursor(w, 15); + ssd1306fb_draw_str(font_table[0].font, txt, 0); + if (prog_data_idx == x++) { + if (edit_mode == MENU_BTNSTYLE_PROGSIMPLE_EDIT || + edit_mode == MENU_BTNSTYLE_PROGSIMPLE_IDLE) { + ssd1306fb_draw_hline(w, w+4, 25); + } + if (edit_mode == MENU_BTNSTYLE_PROGSIMPLE_EDIT) { + ssd1306fb_draw_hline(w, w+4, 14); + } + } + + w += 5; + sprintf(txt, "%01X", s[i] & 0xf); + ssd1306fb_set_cursor(w, 15); + ssd1306fb_draw_str(font_table[0].font, txt, 0); + if (prog_data_idx == x++) { + if (edit_mode == MENU_BTNSTYLE_PROGSIMPLE_EDIT || + edit_mode == MENU_BTNSTYLE_PROGSIMPLE_IDLE) { + ssd1306fb_draw_hline(w, w+4, 25); + } + if (edit_mode == MENU_BTNSTYLE_PROGSIMPLE_EDIT) { + ssd1306fb_draw_hline(w, w+4, 14); + } + } + + w += 8; + } + + if (edit_mode == MENU_BTNSTYLE_PROGSIMPLE_EDIT) { + + } + + goto MENU_2_DRAW_TEXT_DONE; + } + case 2: + case 5: { + ssd1306fb_draw_str(font_table[0].font, "Color Hue", 1); + + // bar position + f = (idx == 4) ? uconf.favcolor_hue : uconf.altcolor_hue; + + // draw hue markers + ssd1306fb_draw_vline(36 + 21, 19, 21); + ssd1306fb_draw_vline(36 + 42, 19, 21); + + goto MENU_2_EDIT_COLOR_LINE; + } + case 3: + case 6: { + ssd1306fb_draw_str(font_table[0].font, "Color Sat.", 1); + + // bar position + f = (idx == 5) ? uconf.favcolor_sat : uconf.altcolor_sat; + + goto MENU_2_PCT_COLOR_TEXT; + } + case 4: + case 7: { + ssd1306fb_draw_str(font_table[0].font, "Color Value", 1); + + // bar position + f = (idx == 6) ? uconf.favcolor_val : uconf.altcolor_val; + +MENU_2_PCT_COLOR_TEXT: + // percentage text + sprintf(txt, "%3u%%", ((uint16_t)f * 100) / 255); + ssd1306fb_set_cursor(50, 24); + ssd1306fb_draw_str(font_table[0].font, txt, 1); + +MENU_2_EDIT_COLOR_LINE: + // draw value line + f >>= 2; + f += 36; + ssd1306fb_draw_hline(36, 99, 20); + + // draw end markers + ssd1306fb_draw_vline(36, 19, 21); + ssd1306fb_draw_vline(36 + 63, 19, 21); + + // draw position triangle + ssd1306fb_draw_hline(f - 2, f + 2, 16); + ssd1306fb_draw_line(f + 2, 16, f, 19); + ssd1306fb_draw_line(f - 2, 16, f, 19); + + if (edit_mode == MENU_BTNSTYLE_LED_EDIT) { + if (idx == 4 || idx == 7) { + // RGBR indicators + ssd1306fb_set_cursor(33, 21); + ssd1306fb_draw_str(font_table[0].font, "R", 0); + + oled.cursor_x = 33 + 21; + ssd1306fb_draw_str(font_table[0].font, "G", 0); + + oled.cursor_x = 33 + 42; + ssd1306fb_draw_str(font_table[0].font, "B", 0); + + oled.cursor_x = 33 + 63; + ssd1306fb_draw_str(font_table[0].font, "R", 0); + } else { + // 0 - 100% indicators + ssd1306fb_set_cursor(28 + 7, 21); + ssd1306fb_draw_str(font_table[0].font, "0%", 0); + + oled.cursor_x = 28 + 63 - 14; + ssd1306fb_draw_str(font_table[0].font, "100%", 0); + } + } + + goto MENU_2_DRAW_TEXT_DONE; + } + } + + w = ssd1306fb_get_str_width(font_table[1].font, txt, strlen(txt), 1); + x = 68 - (w >> 1); + ssd1306fb_set_cursor(x, 18); + ssd1306fb_draw_str(font_table[1].font, txt, 1); + + // draw box + ssd1306fb_draw_rect(x - 2, 18, x + w + 2, 31); + +MENU_2_DRAW_TEXT_DONE: + // draw extras + menu_draw_tabs(idx); + + menu_draw_buttons(edit_mode, 0x0f); +} + +void menu_2_enter(uint8_t idx) +{ + uint8_t a; + + edit_idx = idx; + + switch (idx) { + case 0: { + a = (sizeof(edge_pgm) / sizeof(edge_pgm[0])); + uconf.ledprog_edge_idx++; + if (uconf.ledprog_edge_idx >= a) { + uconf.ledprog_edge_idx = 0; + } + break; + } + case 1: { + edit_mode = MENU_BTNSTYLE_PROGSIMPLE_IDLE; + menu_2_edit_use(idx); + break; + } + default: { + if (edit_mode == MENU_BTNSTYLE_LED_EDIT) { + edit_mode = MENU_BTNSTYLE_MENU; + menu_btn_use_std(); + } else { + edit_mode = MENU_BTNSTYLE_LED_EDIT; + } + } + } +} diff --git a/nametag8_CH592/user/ui/menu_entry_3.c b/nametag8_CH592/user/ui/menu_entry_3.c new file mode 100644 index 0000000..573fc2e --- /dev/null +++ b/nametag8_CH592/user/ui/menu_entry_3.c @@ -0,0 +1,392 @@ +/* + * $Id: menu_entry_3.c 494 2021-07-21 11:46:11Z true $ + * begin 20200807 true + * + * snek + */ + +#include "ui/menu.h" + +#include "render/draw_ssd1306.h" + +#include "led/rgbled.h" + +#include "misc/accel.h" +#include "misc/tinymt.h" + +#include "global.h" +#include "user_config.h" + +#include +#include + + + + +#define SNEK_SPEED_BASE 33 +#define SNEK_SPEED_MODIFIER 3 + +#define SNEK_SPEED_MAXSEL 11 + +#define SNEK_DIR_NORTH 0x01 +#define SNEK_DIR_SOUTH 0x02 +#define SNEK_DIR_WEST 0x04 +#define SNEK_DIR_EAST 0x08 + +#define SNEK_FUDGE 0x80 + + + +struct Snek { + uint8_t direction; + uint8_t speed; + uint8_t timeout; + uint8_t rsvd; + int8_t head_x; + int8_t head_y; + int8_t tail_x; + int8_t tail_y; + int8_t apple_x; + int8_t apple_y; +}; + + + +static struct Snek snek; +static uint16_t playfield[64]; + +static uint8_t gamemode = 0xff; + +static uint8_t banner; +static int8_t banner_x[4]; +static int8_t banner_y[4]; + + + +void snek_renderframe() +{ + uint8_t i; + uint8_t w; + int8_t a, b; + int8_t x, y; + + // render apple + snek.direction += 0x40; + w = snek.direction >> 6; + + x = snek.apple_x << 1; + y = snek.apple_y << 1; + switch (w) { + case 1: x++; break; + case 2: x++; y++; break; + case 3: y++; break; + } + + oled.state &= ~SSD1306_STATE_PIXEL_MASK; + oled.state |= SSD1306_STATE_INVERT_PIXEL; + ssd1306fb_draw_pix(x, y); + + // render + oled.state &= ~SSD1306_STATE_PIXEL_MASK; + oled.state |= SSD1306_STATE_SET_PIXEL; + + for (x = 0; x < 64; x++) { + a = x << 1; + w = playfield[x] >> 8; + y = playfield[x] & 0xff; + + for (i = 0; i < 8; i++) { + if (w & (1 << i)) { + b = (i + 0) << 1; + ssd1306fb_draw_vline(a+0, b, b + 1); + ssd1306fb_draw_vline(a+1, b, b + 1); + } + if (y & (1 << i)) { + b = (i + 8) << 1; + ssd1306fb_draw_vline(a+0, b, b + 1); + ssd1306fb_draw_vline(a+1, b, b + 1); + } + } + } + + // do we do next step? + snek.timeout += SNEK_SPEED_MODIFIER * snek.speed; + if (snek.timeout < SNEK_SPEED_BASE) { + return; + } + snek.timeout -= SNEK_SPEED_BASE; + + // move head based on direction + switch (snek.direction) { + case SNEK_DIR_NORTH: snek.head_y--; break; + case SNEK_DIR_SOUTH: snek.head_y++; break; + case SNEK_DIR_WEST: snek.head_x--; break; + case SNEK_DIR_EAST: snek.head_x++; break; + } + + snek.head_x += 64; + snek.head_x %= 64; + + snek.head_y += 16; + snek.head_y %= 16; + + playfield[snek.head_x] |= (1 << snek.head_y); + + // determine solids near tail location + w = 0; + + // derender old tail + + // set new tail +} + +void snek_fixapple() +{ + // uint8_t y_pos, y_off; + + while (1) { + // is a pixel lit at this location + if (playfield[snek.apple_x] & (1 << snek.apple_y)) { + // if so, move our apple + snek.apple_x += 3; + snek.apple_x %= 64; + snek.apple_y++; + snek.apple_y %= 16; + } else { + break; + } + } +} + +void snek_newgame() +{ + uint16_t rnd; + uint8_t i; + + // set up snek default coordinates + rnd = prng_get16(); + snek.head_x = ((rnd & 0xff) % 48) + 8; + snek.head_y = ((rnd >> 8) % 8) + 4; + + // what way is the head moving? + rnd = prng_get16(); + snek.direction = 1 << (rnd & 0x03); + + // set our initial tail based on this direction + snek.tail_x = snek.head_x; + snek.tail_y = snek.head_y; + switch (snek.direction & 0xf) { + case SNEK_DIR_NORTH: snek.tail_y++; break; + case SNEK_DIR_SOUTH: snek.tail_y--; break; + case SNEK_DIR_WEST: snek.tail_x++; break; + case SNEK_DIR_EAST: snek.tail_x--; break; + } + + // position the apple + snek.apple_x = ((rnd & 0xfc) % 48) + 8; + snek.apple_y = ((rnd >> 8) % 8) + 4; + snek_fixapple(); + + // clear the screen + for (i = 0; i < 64; i++) { + playfield[i] = 0; + } + + // render initial frame + playfield[snek.head_x] |= (1 << snek.head_y); + playfield[snek.tail_x] |= (1 << snek.tail_y); + + snek_renderframe(); + + // start the game + gamemode = 0; +} + +void snek_banner_jiggle() +{ + int8_t x_off, y_off; + uint16_t rnd; + + rnd = prng_get16(); + + x_off = (rnd ) & 0x03; + y_off = (rnd >> 8) & 0x01; + + switch (banner) { + case 0: { // welcome + banner_x[0] = 31; + banner_y[0] = 0 + y_off; + break; + } + case 1: { // snek + banner_x[1] = 29; + banner_y[1] = 7 + y_off; + break; + } + case 2: { // to + banner_x[2] = 78; + banner_y[2] = 0 + y_off; + break; + } + case 3: { // speed + banner_x[3] = -1; + banner_y[3] = 11 + y_off; + break; + } + } + + banner_x[banner] += x_off; +} + +void snek_btn_prev(uint8_t idx) +{ + if (!gamemode) { + + } else { + if (snek.speed > SNEK_SPEED_MAXSEL) { + snek.speed = SNEK_SPEED_MAXSEL; + } + if (snek.speed > 1) { + snek.speed--; + } + } +} + +void snek_btn_next(uint8_t idx) +{ + if (!gamemode) { + + } else { + if (snek.speed < SNEK_SPEED_MAXSEL) { + snek.speed++; + } + } +} + +void snek_btn_enter(uint8_t idx) +{ + if (gamemode != 0) { + snek_newgame(); + } +} + +void snek_btn_exit(uint8_t idx) +{ + if (!gamemode) { + gamemode = 1; + } else { + gamemode = 0xff; + + menu_btn_use_std(); + menu_btn_exit(idx); + } +} + +void snek_btn_use() +{ + btn[0].cb_push = &snek_btn_prev; + btn[0].cb_hold = &snek_btn_prev; + btn[0].cb_release = 0; + btn[0].hold = 200 / HOLD_PERIOD; + btn[0].repeat = 40 / HOLD_PERIOD; + + btn[1].cb_push = &snek_btn_exit; + btn[1].cb_hold = 0; + btn[1].cb_release = 0; + btn[1].hold = 0; + btn[1].repeat = 0; + + btn[2].cb_push = &snek_btn_enter; + btn[2].cb_hold = 0; + btn[2].cb_release = 0; + btn[2].hold = 0; + btn[2].repeat = 0; + + btn[3].cb_push = &snek_btn_next; + btn[3].cb_hold = &snek_btn_next; + btn[3].cb_release = 0; + btn[3].hold = btn[0].hold; + btn[3].repeat = btn[0].repeat; + + btn_commit_hold(); +} + +void snek_init() +{ + uint8_t i; + + snek_btn_use(); + + for (i = 0; i < 5; i++) { + banner = i; + snek_banner_jiggle(); + } + + gamemode = 17; +} + +void snek_disp(uint8_t idx) +{ + // uint8_t i; + int8_t w; + char txt[12]; + + if (gamemode == 0xff) { + snek_init(); + } + + // banner jiggle + if (!banner) { + banner = 4; + } + banner--; + + snek_banner_jiggle(); + + if (gamemode) { + ssd1306_cls(&oled); + + // main menu + strcpy(txt, "play"); + w = ssd1306fb_get_str_width(font_Dialog_plain_8, txt, strlen(txt), 0); + ssd1306fb_set_cursor(116 - w, -2); + ssd1306fb_draw_str(font_Dialog_plain_8, txt, 0); + + strcpy(txt, "exit"); + w = ssd1306fb_get_str_width(font_Dialog_plain_8, txt, strlen(txt), 0); + ssd1306fb_set_cursor(116 - w, 24); + ssd1306fb_draw_str(font_Dialog_plain_8, txt, 0); + + // speed + ssd1306fb_set_cursor(-1, 6); + ssd1306fb_draw_str(font_table[0].font, "spd", 1); + ssd1306fb_set_cursor( 0, 15); + txt[0] = 0x30 + (snek.speed / 10); + txt[1] = 0x30 + (snek.speed % 10); + txt[2] = 0x00; + ssd1306fb_draw_str(font_table[1].font, txt, 1); + + // welcome + ssd1306fb_set_cursor(banner_x[0], banner_y[0]); + ssd1306fb_draw_str(font_table[0].font, "welcom", 1); + + // to + if (gamemode <= 9) { + ssd1306fb_set_cursor(banner_x[2], banner_y[2]); + ssd1306fb_draw_str(font_table[0].font, "to", 1); + } + + // snek + if (gamemode == 1) { + ssd1306fb_set_cursor(banner_x[1], banner_y[1]); + ssd1306fb_draw_str(font_table[3].font, "snek", 1); + } + + if (gamemode > 1) { + gamemode--; + } + } else { + // running the game + snek_renderframe(); + } +} diff --git a/nametag8_CH592/user/ui/menu_entry_5.c b/nametag8_CH592/user/ui/menu_entry_5.c new file mode 100644 index 0000000..1110ed1 --- /dev/null +++ b/nametag8_CH592/user/ui/menu_entry_5.c @@ -0,0 +1,154 @@ +/* + * $Id: menu_entry_5.c 499 2021-07-26 05:24:02Z true $ + * begin 20190613 true + * + * settings menu functions + */ + +#include "ui/menu.h" + +#include "render/font.h" + +#include "hw/lightsense.h" + +#include "user_config.h" + +#include +#include + + +const uint16_t sleep_times[] = { + 0, + 300, + 600, + 900, + 1200, + 1800, +}; + + +void menu_5_disp(uint8_t idx) +{ + int8_t w, x; + char txt[12]; + + ssd1306fb_set_cursor(10, 7); + + uconf.flags &= ~UCONF_FLAGS_LEDS_DISABLE; + + // which item selected? + switch (idx) { + case 0: { + ssd1306fb_draw_str(font_table[0].font, "Enable LEDs", 1); + strcpy(txt, (uconf.flags & UCONF_FLAGS_LEDS_ENABLE) ? "On" : "Off"); + break; + } + case 1: { + ssd1306fb_draw_str(font_table[0].font, "No Movement Sleep Time", 0); + if (uconf.sleep_timeout) { + sprintf(txt, "%dmin", (uconf.sleep_timeout / 60)); + } else { + strcpy(txt, "Off"); + } + break; + } + case 2: { + ssd1306fb_draw_str(font_table[0].font, "No Movement Threshold", 0); + strcpy(txt, "Normal"); + break; + } + case 3: { + ssd1306fb_draw_str(font_table[0].font, "Wakeup Threshold", 1); + strcpy(txt, "Normal"); + break; + } + case 4: { + // constantly save value at this screen + uconf.lsens_lo_thresh = lsens_get_lo_threshold(); + // ensure LEDs are disabled when calibrating + uconf.flags |= UCONF_FLAGS_LEDS_DISABLE; + + ssd1306fb_draw_str(font_table[0].font, "Recal Lightsense DARK RM!", 0); + sprintf(txt, "%d", uconf.lsens_lo_thresh); + break; + } + case 5: { + ssd1306fb_draw_str(font_table[0].font, "Debug: Show CPU%", 1); + strcpy(txt, (uconf.flags & UCONF_FLAGS_SHOW_CPU_USAGE) ? "Yes" : "No"); + break; + } + case 6: { + ssd1306fb_draw_str(font_table[0].font, "Debug: Show Accel", 1); + strcpy(txt, (uconf.flags & UCONF_FLAGS_SHOW_ACCEL_ANGLE) ? "Yes" : "No"); + break; + } + } + + w = ssd1306fb_get_str_width(font_table[1].font, txt, strlen(txt), 1); + x = 68 - (w >> 1); + ssd1306fb_set_cursor(x, 18); + ssd1306fb_draw_str(font_table[1].font, txt, 1); + + // draw box + ssd1306fb_draw_rect(x - 2, 18, x + w + 2, 31); + + // draw extras + menu_draw_tabs(idx); + + menu_draw_buttons(MENU_BTNSTYLE_MENU, 0x0f); +} + +void menu_5_enter(uint8_t idx) +{ + int i, j; + + switch (idx) { + case 0: { + if (uconf.flags & UCONF_FLAGS_LEDS_ENABLE) { + uconf.flags &= ~UCONF_FLAGS_LEDS_ENABLE; + } else { + uconf.flags |= UCONF_FLAGS_LEDS_ENABLE; + } + break; + } + case 1: { + j = sizeof(sleep_times) / sizeof(sleep_times[0]); + for (i = 0; i < j; i++) { + if (uconf.sleep_timeout == sleep_times[i]) { + i++; + i %= j; + uconf.sleep_timeout = sleep_times[i]; + j = 0xff; + break; + } + } + + // couldn't find a match, so set default + if (j != 0xff) { + uconf.sleep_timeout = sleep_times[4]; + } + break; + } + case 4: { + // reset sensor threshold to recal value + lsens_set_lo_threshold(0xffff); + break; + } + case 5: { + if (uconf.flags & UCONF_FLAGS_SHOW_CPU_USAGE) { + uconf.flags &= ~UCONF_FLAGS_SHOW_CPU_USAGE; + } else { + uconf.flags |= UCONF_FLAGS_SHOW_CPU_USAGE; + } + break; + } + case 6: { + if (uconf.flags & UCONF_FLAGS_SHOW_ACCEL_ANGLE) { + uconf.flags &= ~UCONF_FLAGS_SHOW_ACCEL_ANGLE; + } else { + uconf.flags |= UCONF_FLAGS_SHOW_ACCEL_ANGLE; + } + break; + } + } +} diff --git a/nametag8_CH592/user/ui/menu_entry_6.c b/nametag8_CH592/user/ui/menu_entry_6.c new file mode 100644 index 0000000..ff4e076 --- /dev/null +++ b/nametag8_CH592/user/ui/menu_entry_6.c @@ -0,0 +1,339 @@ +/* + * $Id: menu_entry_6.c 500 2021-08-08 19:43:38Z true $ + * begin 20190527 true + * + * about menu functions + */ + +#include "ui/btn.h" +#include "ui/menu.h" + +#include "hw/lightsense.h" + +#include "led/rgbled.h" + +#include "misc/accel.h" + +#include "global.h" +#include "user_config.h" + +#include +#include +#include + + + +#define MCU_FLASH 448 +#define MCU_SRAM 24+2 + + +uint8_t font_index = 0; +uint8_t font_glyph = 0; + +uint8_t sn_byte = 0; + + + +void menu_6_font_index(int8_t dir) +{ + font_index += dir; + if (font_index >= (sizeof(font_table) / sizeof(font_table[0]))) { + if (dir > 0) { + font_index = 0; + } else { + font_index = (sizeof(font_table) / sizeof(font_table[0])) - 1; + } + } +} + +void menu_6_font_glyph(int8_t dir) +{ + font_glyph += dir; + if (font_glyph > font_table[font_index].font[FONT_CHAR_NUM_POS] - 1) { + if (dir > 0) { + font_glyph = 0; + } else { + font_glyph = font_table[font_index].font[FONT_CHAR_NUM_POS] - 1; + } + } +} + +void menu_6_font_next(uint8_t idx) +{ + /* todo: implement button state flags + if (btn[1].held) { + menu_6_font_index(1); + } else { + menu_6_font_glyph(1); + } + */ +} + +void menu_6_font_prev(uint8_t idx) +{ + /* + if (btn[2].held) { + menu_6_font_index(-1); + } else { + menu_6_font_glyph(-1); + } + */ +} + +void menu_6_accel_reset() +{ + movement_worst = 0; +} + +void menu_6_btn_use() +{ + btn[1].cb_push = &menu_6_font_prev; + btn[1].cb_hold = &menu_6_font_prev; + btn[1].hold = 200 / HOLD_PERIOD; + btn[1].repeat = 40 / HOLD_PERIOD; + + btn[2].cb_push = &menu_6_font_next; + btn[2].cb_hold = &menu_6_font_next; + btn[2].hold = btn[1].hold; + btn[2].repeat = btn[1].repeat; + + btn_commit_hold(); +} + +void menu_6_disp(uint8_t idx) +{ + uint8_t i; + char txt[30]; + + const uint8_t led_pos[4][2] = { + {10, 1}, + {82, 1}, + {10, 17}, + {82, 17}, + }; + + // which item selected? + switch (idx) { + case 0: { + ssd1306fb_set_cursor(11, 0); + ssd1306fb_draw_str(font_DejaVu_Sans_Mono_Bold_11, "GAT", 1); + ssd1306fb_set_cursor(13, 11); + ssd1306fb_draw_str(font_Dialog_plain_8, "Nametag", 1); + ssd1306fb_set_cursor(80, 0); + ssd1306fb_draw_str(font_Dialog_plain_8, "by true", 1); + + + if (sn_byte) { + sprintf(txt, "#%d", sn_byte); + i = ssd1306fb_get_str_width(font_DejaVu_Sans_Mono_Bold_11, txt, strlen(txt), 0); + ssd1306fb_set_cursor(97 - (i >> 1), 10); + ssd1306fb_draw_str(font_DejaVu_Sans_Mono_Bold_11, txt, 1); + } + + sprintf(txt, "%s", vers); + ssd1306fb_set_cursor(11, 24); + ssd1306fb_draw_str(font_Dialog_plain_8, "v", 0); + ssd1306fb_set_cursor(15, 24); + ssd1306fb_draw_str(font_Dialog_plain_8, txt, 0); + ssd1306fb_set_cursor(54, 24); + ssd1306fb_draw_str(font_Dialog_plain_8, "@WhiskeyHackers", 0); + break; + } + case 1: { + ssd1306fb_set_cursor(54, 4); + ssd1306fb_draw_str(font_DejaVu_Sans_Mono_Bold_11, "LED", 1); + ssd1306fb_set_cursor(54, 15); + ssd1306fb_draw_str(font_DejaVu_Sans_Mono_Bold_11, "1-4", 1); + + for (i = 0; i < 4; i++) { + ssd1306fb_set_cursor(led_pos[i][0], led_pos[i][1]); + sprintf(txt, "R%d h%03X", i + 1, hsv_edge[edge_map[i + 0]].h); + ssd1306fb_draw_str(font_Dialog_plain_8, txt, 1); + sprintf(txt, "s%02X v%02X", hsv_edge[edge_map[i + 0]].s, hsv_edge[edge_map[i + 0]].v); + oled.cursor_x = led_pos[i][0]; + oled.cursor_y += 7; + ssd1306fb_draw_str(font_Dialog_plain_8, txt, 1); + } + break; + } + case 2: { + ssd1306fb_set_cursor(54, 4); + ssd1306fb_draw_str(font_DejaVu_Sans_Mono_Bold_11, "LED", 1); + ssd1306fb_set_cursor(54, 15); + ssd1306fb_draw_str(font_DejaVu_Sans_Mono_Bold_11, "5-8", 1); + + for (i = 0; i < 4; i++) { + ssd1306fb_set_cursor(led_pos[i][0], led_pos[i][1]); + sprintf(txt, "R%d h%03X", i + 5, hsv_edge[edge_map[i + 4]].h); + ssd1306fb_draw_str(font_Dialog_plain_8, txt, 1); + sprintf(txt, "s%02X v%02X", hsv_edge[edge_map[i + 4]].s, hsv_edge[edge_map[i + 4]].v); + oled.cursor_x = led_pos[i][0]; + oled.cursor_y += 7; + ssd1306fb_draw_str(font_Dialog_plain_8, txt, 1); + } + break; + } + case 3: { + ssd1306fb_set_cursor(54, 4); + ssd1306fb_draw_str(font_DejaVu_Sans_Mono_Bold_11, "LED", 1); + ssd1306fb_set_cursor(54, 15); + ssd1306fb_draw_str(font_DejaVu_Sans_Mono_Bold_11, "9-12", 1); + + for (i = 0; i < 4; i++) { + ssd1306fb_set_cursor(led_pos[i][0], led_pos[i][1]); + sprintf(txt, "R%d h%03X", i + 5, hsv_edge[edge_map[i + 8]].h); + ssd1306fb_draw_str(font_Dialog_plain_8, txt, 1); + sprintf(txt, "s%02X v%02X", hsv_edge[edge_map[i + 8]].s, hsv_edge[edge_map[i + 8]].v); + oled.cursor_x = led_pos[i][0]; + oled.cursor_y += 7; + ssd1306fb_draw_str(font_Dialog_plain_8, txt, 1); + } + break; + } + case 4: { + ssd1306fb_set_cursor(10, -1); + ssd1306fb_draw_str(font_DejaVu_Sans_Mono_Bold_11, "Accelerometer", 1); + + sprintf(txt, "X: %3d", accel.x); + ssd1306fb_set_cursor(11, 10); + ssd1306fb_draw_str(font_Dialog_plain_8, txt, 1); + sprintf(txt, "Y: %3d", accel.y); + ssd1306fb_set_cursor(11, 17); + ssd1306fb_draw_str(font_Dialog_plain_8, txt, 1); + sprintf(txt, "Z: %3d", accel.z); + ssd1306fb_set_cursor(11, 24); + ssd1306fb_draw_str(font_Dialog_plain_8, txt, 1); + sprintf(txt, "m%i", abs(accel_get_movement())); + ssd1306fb_set_cursor(104, 10); + ssd1306fb_draw_str(font_Dialog_plain_8, txt, 0); + sprintf(txt, "w%d", movement_worst); + ssd1306fb_set_cursor(106, 17); + ssd1306fb_draw_str(font_Dialog_plain_8, txt, 0); + + ssd1306fb_draw_line(80, 23, 80 + (accel.x >> 1), 23 + (accel.y >> 2)); + + ssd1306fb_set_color(SSD1306_STATE_INVERT_PIXEL); + ssd1306fb_draw_circle(80 + (accel.x >> 1), 23 + (accel.y >> 2), 2); + ssd1306fb_set_color(SSD1306_STATE_SET_PIXEL); + + break; + } + case 5: { + sprintf(txt, "CPU Load: %3u%%", cpu_use); + ssd1306fb_set_cursor(10, -1); + ssd1306fb_draw_str(font_DejaVu_Sans_Mono_Bold_11, txt, 1); + + sprintf(txt, "CPU Max: %3u%%", cpu_max); + ssd1306fb_set_cursor(10, 9); + ssd1306fb_draw_str(font_DejaVu_Sans_Mono_Bold_11, txt, 1); + + ssd1306fb_set_cursor(10, 23); + sprintf(txt, "Up %01d:%02d:%02d", uptime_hour, uptime_min, uptime_sec); + ssd1306fb_draw_str(font_Dialog_plain_8, txt, 0); + break; + } + case 6: { + ssd1306fb_set_cursor(10, -1); + ssd1306fb_draw_str(font_Dialog_plain_8, "Light: ", 1); + oled.cursor_x = 39; + sprintf(txt, "%d lo, %02d + %d", lsens_get_lo_threshold(), lsens_get_hi(), lsens_get_lo()); + ssd1306fb_draw_str(font_Dialog_plain_8, txt, 0); + + ssd1306fb_set_cursor(10, 7); + ssd1306fb_draw_str(font_Dialog_plain_8, "Temp: Batt:", 1); + + oled.cursor_x = 42; + sprintf(txt, "%d.%dC", temp_degc, temp_degc_decimal); + ssd1306fb_draw_str(font_Dialog_plain_8, txt, 0); + + oled.cursor_x = 98; + sprintf(txt, "%d.%02dV", batt_volt, batt_mv); + ssd1306fb_draw_str(font_Dialog_plain_8, txt, 0); + + ssd1306fb_set_cursor(10, 16); + ssd1306fb_draw_str(font_Dialog_plain_8, "Flash Conf Writes: ", 0); + sprintf(txt, "%lu", uconf.iter); + ssd1306fb_draw_str(font_Dialog_plain_8, txt, 1); + + ssd1306fb_set_cursor(10, 24); + ssd1306fb_draw_str(font_Dialog_plain_8, "MCU: ", 1); + sprintf(txt, "%dK / %dK", MCU_FLASH, MCU_SRAM); + ssd1306fb_draw_str(font_Dialog_plain_8, txt, 1); + + break; + } + case 7: { + ssd1306fb_set_cursor(10, -1); + ssd1306fb_draw_str(font_DejaVu_Sans_Mono_Bold_11, "Error Counters", 1); + + /* + ssd1306fb_set_cursor(10, 10); + sprintf(txt, "i2c0: %lu e# %02x", i2c_err_cnt[0], i2c_last_err_reason[0]); + ssd1306fb_draw_str(font_Dialog_plain_8, txt, 0); + + ssd1306fb_set_cursor(10, 17); + sprintf(txt, "i2c1: %lu e# %02x", i2c_err_cnt[1], i2c_last_err_reason[1]); + ssd1306fb_draw_str(font_Dialog_plain_8, txt, 0); + + ssd1306fb_set_cursor(10, 24); + sprintf(txt, "uart1: s%lu i%lu", btn_short_packet_cnt, btn_invalid_packet_cnt); + ssd1306fb_draw_str(font_Dialog_plain_8, txt, 0); + + ssd1306fb_set_cursor(74, 10); + sprintf(txt, "brt-pk: %04x", eyes_val_lsens); + ssd1306fb_draw_str(font_Dialog_plain_8, txt, 0); + */ + + break; + } + case 8: { + ssd1306fb_set_cursor(10, -1); + ssd1306fb_draw_str(font_DejaVu_Sans_Mono_Bold_11, "Font Test", 1); + + sprintf(txt, "Index:%3u", (uint8_t)font_index); + ssd1306fb_set_cursor(10, 9); + ssd1306fb_draw_str(font_DejaVu_Sans_Mono_Bold_11, txt, 1); + + sprintf(txt, "Glyph:%3u", (uint8_t)(font_glyph + 0x20)); + ssd1306fb_set_cursor(10, 19); + ssd1306fb_draw_str(font_DejaVu_Sans_Mono_Bold_11, txt, 1); + + sprintf(txt, "%c", (font_glyph + 0x20)); + ssd1306fb_draw_rect(83, 3, 116, 28); + ssd1306fb_set_cursor(85, 5); + ssd1306fb_draw_str(font_table[font_index].font, txt, 1); + break; + } + } + + // draw extras + menu_draw_tabs(idx); + + // buttons + switch (idx) { + case 0: + case 1: + case 2: + case 3: { + menu_btn_use_std(); + break; + } + case 4: { + menu_btn_use_std(); + btn[2].cb_push = menu_6_accel_reset; + break; + } + case 8: { + menu_6_btn_use(); + menu_draw_buttons(MENU_BTNSTYLE_ABOUT, 0x0c); + break; + } + default: { + menu_btn_use_std(); + menu_draw_buttons(MENU_BTNSTYLE_ABOUT, 0x08); + break; + } + } +} + + diff --git a/nametag8_CH592/user/ui/menu_entry_7.c b/nametag8_CH592/user/ui/menu_entry_7.c new file mode 100644 index 0000000..e69de29 diff --git a/nametag8_CH592/user/user_config.c b/nametag8_CH592/user/user_config.c new file mode 100644 index 0000000..38936fc --- /dev/null +++ b/nametag8_CH592/user/user_config.c @@ -0,0 +1,143 @@ +/* + * $Id: user_config.c 500 2021-08-08 19:43:38Z true $ + * begin 20190615 true + */ + +#include "user_config.h" + +#include "hw/eeprom16.h" +#include "misc/checksum.h" + +#include "led/rgbled.h" + +#include + + + +UserConf uconf; +uint8_t sysflags; + +uint16_t uconf_flash_offset; + +static const uint8_t uconf_edge_defaults[8][8] = { + {0x03, 0x10, 0x04, 0x00, 0x00, 0x00, 0xff, 0xa0}, + {0x03, 0x10, 0x04, 0x00, 0x00, 0x00, 0xff, 0xa0}, + {0x15, 0x42, 0x50, 0x00, 0xa0, 0x30, 0xff, 0x20}, + {0x03, 0x10, 0x04, 0x00, 0x00, 0x00, 0xff, 0xa0}, + {0x03, 0x11, 0x05, 0x00, 0x00, 0x00, 0xff, 0x80}, + {0x00, 0x01, 0x04, 0x00, 0x00, 0x66, 0x46, 0x80}, + {0x03, 0x10, 0x04, 0x00, 0x00, 0x00, 0xff, 0xa0}, + {0x03, 0x10, 0x04, 0x00, 0x00, 0x00, 0xff, 0xa0} +}; + + + +static void uconf_defaults() +{ + int i; + + uconf.ver = UCONF_VER; + uconf.flags = UCONF_FLAGS_LEDS_ENABLE; + uconf.framemod = UCONF_FRAMERATE_FULL; + uconf.nameconf = UCONF_NAME_DISP_CHAR_ROTATE | UCONF_NAME_MODE_AUTOROTATE | UCONF_NAME_MODE_COLOR_INVERT; + if (uconf_flash_offset == 0xf0) { + uconf.iter = 0; + } + uconf.font_idx = 3; + uconf.char_spacing = 2; + + // todo: add LUT + strcpy(uconf.name, "Supercon"); + + uconf.favcolor_hue = 170; + uconf.favcolor_sat = 240; + uconf.favcolor_val = 32; + + uconf.altcolor_hue = 0; + uconf.altcolor_sat = 240; + uconf.altcolor_val = 32; + + uconf.ledprog_edge_idx = 4; + + for (i = 0; i < 8; i++) { + uconf.ledprog_edge[i] = 0; + } + + memcpy(uconf.ledprog_edge_data, uconf_edge_defaults, sizeof(uconf_edge_defaults)); + + uconf.lsens_lo_thresh = 0x6a0; + uconf.sleep_timeout = 20 * 60; + + uconf.checksum = checksum_gen((uint8_t *)&uconf, sizeof(uconf) - 2); +} + +static int8_t uconf_validate() +{ + // version check + if (uconf.ver != UCONF_VER) { + return -1; + } + + // blank check + if (uconf.checksum == 0xffff) return -2; + + // checksum verify + if (!checksum_verify((uint8_t *)&uconf, sizeof(uconf) - 2, uconf.checksum)) { + return -3; + } + + // fix any mistakes + if (uconf.ledprog_edge_idx > (sizeof(edge_pgm) / sizeof(edge_pgm[0]))) uconf.ledprog_edge_idx = 0; + + return 0; +} + +void uconf_load() +{ + uint8_t i; + + w25q_power_up(); + + for (i = 0; i < FLASH_RSVD_PAGES; i++) { + // find last page of valid config from flash + uconf_flash_offset = (FLASH_RSVD_PAGES - 1) - i; + w25q_read(uconf_flash_offset * FLASH_UCONF_BYTES, (uint8_t *)&uconf, FLASH_UCONF_BYTES); + if (!uconf_validate()) { + // valid data + return; + } + } + + w25q_power_down(); + + // flash has no valid data whatsoever + // don't worry about flash setup; that is done during writing + uconf_flash_offset = 0xf0; + uconf_defaults(); +} + +void uconf_write() +{ + eclic_global_interrupt_disable(); + + w25q_power_up(); + + // track writes and set up next page to write + uconf.iter++; + uconf_flash_offset++; + if (uconf_flash_offset >= FLASH_RSVD_PAGES) { + // we need to erase flash and start writing at the beginning + w25q_erase_sector(0x000000, 1); + uconf_flash_offset = 0; + } + + // calculate checksum + uconf.checksum = checksum_gen((uint8_t *)&uconf, sizeof(uconf) - 2); + + // write config data + w25q_write(uconf_flash_offset * FLASH_UCONF_BYTES, (uint8_t *)&uconf, FLASH_UCONF_BYTES); + + w25q_power_down(); + + eclic_global_interrupt_enable(); +} diff --git a/nametag8_CH592/user/user_config.h b/nametag8_CH592/user/user_config.h new file mode 100644 index 0000000..d5367fe --- /dev/null +++ b/nametag8_CH592/user/user_config.h @@ -0,0 +1,105 @@ +/* + * user_config.h + * + * Created on: Jun 12, 2019 + * Author: true + */ + +#ifndef USER_CONFIG_H_ +#define USER_CONFIG_H_ + + + +#include "misc/checksum.h" + + + +// some global options +#define FLASH_RSVD_PAGES 16 // how many FLASH_UCONF_BYTES to reserve/check +#define FLASH_UCONF_BYTES 256 // basically assumed everywhere + +#define MISC_WIGGLE_RATE (7 - 4); +#define MISC_WIGGLE_SHIFT 4 + +// system state stuff +#define SYS_OLED_ROTATE_X (1 << 0) +#define SYS_OLED_ROTATE_Y (1 << 1) +#define SYS_OLED_REVERSE_CHARS (1 << 2) + +// user configuration stuff +#define UCONF_VER 0x03 + +#define UCONF_FLAGS_AUTOROTATE_ENA (1 << 0) +#define UCONF_FLAGS_LEDS_DISABLE (1 << 3) // used by programs to temporarily disable LEDs +#define UCONF_FLAGS_FAVOR_SPEED (1 << 4) // todo: increase clock rather than reduce framerate +#define UCONF_FLAGS_LEDS_ENABLE (1 << 5) +#define UCONF_FLAGS_SHOW_CPU_USAGE (1 << 6) +#define UCONF_FLAGS_SHOW_ACCEL_ANGLE (1 << 7) + +#define UCONF_FRAMERATE_FULL 40 // this is set/used at runtime, makes no difference in saved config +#define UCONF_FRAMERATE_HALF 40 // take the tickrate divided by this for the framerate. + +#define UCONF_NAME_MAXLEN 15 + +#define UCONF_NAME_MODE_ROTATE180 (1 << 0) // force flipping the display over +#define UCONF_NAME_MODE_AUTOROTATE (1 << 1) // automatically flip the display +#define UCONF_NAME_MODE_HALFWIDTH (1 << 2) // render only every other line of fonts +#define UCONF_NAME_MODE_COLOR_INVERT (1 << 3) // use pixel invert instead of set + +#define UCONF_NAME_DISP_MASK 0x30 +#define UCONF_NAME_DISP_COUNT 4 +#define UCONF_NAME_DISP_OFFSET 4 +#define UCONF_NAME_DISP_STATIC_HORIZ 0x00 // unchanging name +#define UCONF_NAME_DISP_STATIC_VERT 0x10 // unchanging name, each char rotated 90deg +#define UCONF_NAME_DISP_WIGGLE 0x20 // sine-wiggling name +#define UCONF_NAME_DISP_CHAR_ROTATE 0x30 // auto-rotating characters + + + +// this must be FLASH_UCONF_BYTES long for assumptions in code to work out +typedef struct UserConf { + uint8_t ver; + uint8_t flags; + uint8_t framemod; + uint8_t nameconf; // 4 + uint32_t iter; // 8 + uint8_t font_idx; + int8_t char_spacing; // 10 + char name[UCONF_NAME_MAXLEN + 1]; // 26 + char name2[UCONF_NAME_MAXLEN + 1]; // 42 + uint8_t favcolor_hue; + uint8_t favcolor_sat; + uint8_t favcolor_val; // 45 + uint8_t altcolor_hue; + uint8_t altcolor_sat; + uint8_t altcolor_val; // 48 + uint8_t ledprog_edge_idx; + uint8_t ledprog_eyes_idx; // 50 + uint8_t ledprog_edge[16]; // 66 + uint8_t ledprog_edge_data[16][8]; // 194 + uint8_t padding[54]; // 248 + uint16_t lsens_lo_thresh; // 250 + uint16_t sleep_timeout; // 252 + uint16_t tempcx10_offset; // 253-254 + uint16_t checksum; // 255-256 +} UserConf; + + + +extern UserConf uconf; +extern uint8_t sysflags; + +extern uint8_t batt_volt; +extern uint8_t batt_mv; + +extern uint8_t temp_degc; +extern uint8_t temp_degc_decimal; + + + +void uconf_load(); +void uconf_write(); + + + +#endif /* USER_CONFIG_H_ */