From d4f889b901c2c1f99017fbff67eb43e76ae378b4 Mon Sep 17 00:00:00 2001 From: Sebastian Nieto Date: Sun, 13 Sep 2026 21:01:52 -0300 Subject: [PATCH] =?UTF-8?q?feat:=20cluster=20digital=20Ford=20Ka=20Endura?= =?UTF-8?q?=201.3=20con=20badge=20t=C3=A1ctico=20ECO,=20alarmas=20sincroni?= =?UTF-8?q?zadas=20y=20emulador=20OBD2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Agregado badge táctico [ ECO ] en tiempo real (1900-2550 RPM, 45-82% carga motor) - Sincronización de alarma visual destellante con titileo del título en pantalla completa - Reajuste de escala y umbrales de temperatura (120°C fondo de escala, 110°C alarma) - Configuración de emulador Bluetooth con modo fijo --eco y ciclo dinámico - Limpieza de carpetas y archivos obsoletos del proyecto original - Actualización completa de documentación en README.md --- LICENSE.md | 23 - README.md | 134 +- emulator/README.md | 5 + emulator/obd2_emulator.py | 186 ++- sketch/obd2_gauge/bluetooth.h | 124 +- sketch/obd2_gauge/config.h | 1509 +++++++++++++++++--- sketch/obd2_gauge/image.h | 2289 +++++++++++++++++++++--------- sketch/obd2_gauge/meter.h | 1215 +++++++++------- sketch/obd2_gauge/obd2_gauge.ino | 623 ++++++-- sketch/obd2_gauge/touchscreen.h | 31 +- 10 files changed, 4433 insertions(+), 1706 deletions(-) delete mode 100644 LICENSE.md diff --git a/LICENSE.md b/LICENSE.md deleted file mode 100644 index 7a5e12c..0000000 --- a/LICENSE.md +++ /dev/null @@ -1,23 +0,0 @@ -MIT No Commercial Use License - -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. - -Non-Commercial Use Restriction: -The Software and any derivative works thereof must not be used, distributed, -or otherwise exploited for commercial purposes or for any financial benefit. diff --git a/README.md b/README.md index 779884b..2892f23 100644 --- a/README.md +++ b/README.md @@ -1,61 +1,99 @@ -# OBD2 Gauge (ESP32 Bluetooth) +# Cluster Digital OBD-II ESP32 CYD (Ford Ka Endura 1.3) -## This repository has been archived and is no longer maintained. (October 24th, 2025) +Instrumento digital automotriz de alta precisión basado en la placa **ESP32 CYD (ESP32-2432S028)** con pantalla táctil resistiva TFT de 2.8" (320x240). Se comunica de forma inalámbrica vía Bluetooth SPP con un escáner **ELM327 v1.5** conectado al puerto OBD-II del vehículo. -A fully functional code-updated -Last Update: September 27th, 2024 +El sistema fue diseñado y calibrado a medida para el motor **Ford Ka Endura-E 1.3** (y es compatible con instalaciones de GNC). -This is an ESP32 OBD2 Gauge for vehicles that are compatible with OBD2 -(Special made for FORD vehicle) - - Prototype https://youtu.be/PkQaUJbzTNM - - Current Model Short Demo https://youtu.be/vvBIeim7XTE - +--- -## Software: -- Arduino IDE 2.3.2 + ESP32 arduino core 2.0.17 -- * IMPORTANT * this project won't work with ESP32 arduiino core 3.x.x -- modified TFT_eSPI library 2.5.43 +## Características Principales -## Hardware -- ESP32 TFT2.8 320x240 with "RESISTIVE" touch board. -buy here https://s.click.aliexpress.com/e/_Ew95gMl -- ELM327 Bluetooth adaptor (recommended v1.5 not v2.1) - Highly recommend ELM327 Bluetooth adaptor https://s.click.aliexpress.com/e/_oo3THvG -- A small speaker for mobile phone 1 Watt 8 ohm 9x28 mmm. -- A push button 6x6x5 2 legs -- 3d print enclosure -- 12v to 5v dc micro usb power regulator module -- Gauge magnetic stand +### 1. Cuadrante de 4 Instrumentos Simultáneos +* **Temperatura de Refrigerante (PID 0105):** Rango 60°C a 120°C. Color dinámico (verde en rango normal, amarillo de advertencia y rojo a partir de 110°C con alarma sonora y visual). +* **Velocidad del Vehículo (PID 010D):** Rango 0 a 160 km/h. +* **Revoluciones por Minuto (PID 010C):** Rango 0 a 6.000 RPM. +* **Voltaje de Batería (Comando ATRV):** Rango 10.0V a 16.0V en tiempo real directo del borne del ELM327. -## Features: -- Show vehicle data 7 pids -* MAP - manifold air pressure (PSI) -* PCM - pcm voltage (volt) -* ENG LOAD - engine load (%) -* ENG SPD - engine speed (RPM) -* Coolant - coolant temperature (c) -* Oil Temp - engine oil temperature (c) -* TFT - Ford transmission fluid temperature (c) +### 2. Modo Pantalla Completa (Full Screen) +* Tocando cualquier cuadrante, la pantalla se expande a vista completa para ese parámetro. +* Escala curvada de 20 bloques con **antialiasing de subpíxel** para bordes ultra suaves sin efecto serrucho. +* Tipografía digital retrofuturista **DSEG7 Modern 80pt** con coma decimal integrada y actualización veloz sin parpadeo (*flicker-free*). +* Alarma visual sincronizada: el icono, el arco y el título parpadean en rojo de forma simultánea ante sobretemperatura o sobretensión. -- 8 layout page selectable display -- DTC read and clear function (Engine warning light only) -- Warning when parameter reaches setting value -- Adjustable warning value for each PIDs -- Configurable CPU overheat protection -- Configurable gauge Auto turn on/off -- Auto screen brightness -- Change off screen to user screen with micro SDcard -- Firmware updatable (micro SDcard and WiFi) -- VIN Read on the About page. +### 3. Badge Táctico de Máxima Eficiencia `[ ECO ]` +* Calcula en tiempo real el punto óptimo de funcionamiento y entrega de torque (Sweet Spot) para el Ford Ka Endura 1.3: + * **RPM:** Entre 1.900 y 2.550 RPM (pico de par motor y mejor rendimiento volumétrico). + * **Carga de Motor (PID 0104 en segundo plano):** Entre 45% y 82% (apertura de mariposa con mínimas pérdidas por bombeo, antes del enriquecimiento a plena carga). +* **Diseño táctico:** Pastilla rectangular con bordes redondeados en verde esmeralda brillante (`[ ECO ]`) que se ilumina en el cuadrante de RPM y en el encabezado de pantalla completa. +* Al salir del rango óptimo, se apaga de inmediato restaurando de forma invisible el degradado del fondo. +### 4. Audio y Melodías de Alarma +* Control de volumen independiente: Silencio, Ultra Bajo, Bajo (Casio suave), Medio y Alto. +* Selector de sonidos y tonos de alarma: + * Chime BMW (doble tono sincronizado). + * Casio Digital (doble chirp suave no invasivo). + * Tono bitonal clásico. + * Alarma continua urgente. -## [Flash Firmware Online](https://vaandcob.github.io/webpage/src/index.html) +### 5. Menú de Configuración Táctil +* **Gestión de Alarmas:** Conmutadores táctiles independientes ON/OFF para cada parámetro con guardado persistente en NVS (Preferences). +* **Temas Visuales:** 6 paletas de color con degradados ambientales de fondo (*Cyan, Emerald, Amber, Violet, Ice Blue, Graphite*). +* **Brillo Automático:** Regulación inteligente mediante sensor de luz ambiente (LDR) integrado en la placa, o selección manual (5% a 100%). +* **Auto-Sleep:** Apagado automático de pantalla y suspensión ligera al detener el motor (RPM <= 300) tras el tiempo configurado (30s, 1m, 2m, 5m u OFF). -------------------------------------------------------- -[![Buy Me a Coffee](https://img.buymeacoffee.com/button-api/?text=Buy%20me%20a%20coffee&emoji=☕&slug=vaandcob&button_colour=FFDD00&font_colour=000000&font_family=Cookie&outline_colour=000000&coffee_colour=ffffff)](https://www.buymeacoffee.com/vaandcob) +--- +## Hardware Requerido +1. **Placa ESP32 CYD 2.8" (ESP32-2432S028):** + * Pantalla TFT 320x240 con controlador ILI9341 / ST7789. + * Pantalla táctil resistiva con controlador XPT2046. + * Sensor de luz LDR en pin analógico. + * LED RGB integrado. +2. **Escáner OBD-II Bluetooth:** + * Adaptador ELM327 v1.5 (muy recomendado con chip PIC18F25K80, evitar clones v2.1 de baja calidad). +3. **Buzzer / Parlante:** + * Parlantito o buzzer pasivo de 8 ohms conectado al pin de audio del CYD (controlado por canal PWM con modulación de volumen). +4. **Alimentación:** + * Módulo convertidor 12V a 5V USB (conectado a positivo bajo llave o directo si se utiliza auto-sleep). -## Emulador OBD2 / ELM327 Bluetooth incluido -En la carpeta se incluye el script para emular un adaptador ELM327 v1.5 y la ECU del vehículo vía Bluetooth SPP en Linux. Permite probar y validar la pantalla CYD en banco de pruebas sin necesidad de conectarse a un auto real. -Consulta [emulator/README.md](emulator/README.md) para ver requisitos y modo de uso. +--- + +## Compilación y Carga de Firmware + +El proyecto se encuentra preparado para compilarse tanto con `arduino-cli` como con Arduino IDE: + +### Requisitos de Software +* **ESP32 Arduino Core:** Versión 2.0.17 (las ramas 3.x no son compatibles con el esquema de partición). +* **Librería TFT_eSPI:** 2.5.43 o superior con la configuración de pines del CYD. +* **Esquema de Partición:** `huge_app` (3MB APP / No OTA / LittleFS). + +### Compilación desde Terminal +```bash +arduino-cli compile -b esp32:esp32:esp32:PartitionScheme=huge_app sketch/obd2_gauge +``` + +### Carga al Dispositivo +```bash +arduino-cli upload -p /dev/ttyUSB0 --fqbn esp32:esp32:esp32:PartitionScheme=huge_app sketch/obd2_gauge +``` + +--- + +## Emulador de Pruebas Bluetooth en Banco + +En la carpeta `emulator/` se incluye el script `obd2_emulator.py` para simular un adaptador ELM327 v1.5 y la ECU del auto en Linux vía Bluetooth SPP: + +### Modo ECO Fijo (Recomendado para calibración visual) +Mantiene los parámetros fijados en el punto dulce (2.250 RPM, 58% carga, 14.2V, 90°C) con el badge `[ ECO ]` permanentemente encendido: +```bash +python3 emulator/obd2_emulator.py --eco +``` + +### Modo Ciclo de Demostración +Ejecuta un ciclo dinámico de 36 segundos que incluye batería baja, ralentí, 10 segundos continuos en crucero ECO, aceleración exigida y fondo de escala con alarmas: +```bash +python3 emulator/obd2_emulator.py +``` + +*Nota: Mientras el emulador corre en la terminal, podés presionar `e` + Enter para activar el modo ECO fijo o `c` + Enter para volver al ciclo dinámico.* diff --git a/emulator/README.md b/emulator/README.md index 16ecd40..eb99f27 100644 --- a/emulator/README.md +++ b/emulator/README.md @@ -20,8 +20,13 @@ Script en Python que emula un adaptador OBD-II Bluetooth ELM327 v1.5 completo y 2. Ejecuta el emulador: ```bash + # Modo normal (ciclo dinámico con fase ECO de 10s): python3 emulator/obd2_emulator.py + + # O modo ECO fijo permanente (RPM 2250, Carga 58%): + python3 emulator/obd2_emulator.py --eco ``` + *Nota: En la terminal podés presionar 'e' + Enter para activar ECO fijo o 'c' + Enter para volver al ciclo.* 3. Enciende la pantalla ESP32 CYD. Se conectará automáticamente por Bluetooth SPP (Canal 1 RFCOMM). 4. El emulador responderá a los PIDs estándar de OBD2: diff --git a/emulator/obd2_emulator.py b/emulator/obd2_emulator.py index 66f6c88..bf93851 100755 --- a/emulator/obd2_emulator.py +++ b/emulator/obd2_emulator.py @@ -11,6 +11,7 @@ import math import select import socket import threading +import argparse import dbus import dbus.service from dbus.mainloop.glib import DBusGMainLoop @@ -19,78 +20,98 @@ from gi.repository import GLib # Vehicle Simulation State class VehicleState: def __init__(self): - self.rpm = 1800.0 # RPM + self.rpm = 2250.0 # RPM (Sweet spot default) self.target_rpm = 2200.0 # Target RPM for smooth transitions - self.speed = 45.0 # km/h - self.coolant_temp = 88.0 # °C - self.oil_temp = 92.0 # °C + self.speed = 70.0 # km/h + self.coolant_temp = 90.0 # °C + self.oil_temp = 93.0 # °C self.trans_temp = 82.0 # °C (Ford T6 221E1C) - self.load = 32.0 # % (0-100) + self.load = 58.0 # % (Sweet spot: 45% - 82%) self.map_psi = 14.7 # psi (Manifold Absolute Pressure) self.pcm_volt = 14.2 # Volts (MUST be > 12.5V or gauge will sleep) self.auto_simulate = True + self.mode = "cycle" # "cycle" or "eco" (modo fijo) self.lock = threading.Lock() def update_simulation(self): """Simulates driving telemetry with clear transitions through color zones and holds at max scale""" t = time.time() with self.lock: - if self.auto_simulate: - # 32-second demonstration cycle: - # 0 - 5s: FASE 1 - Batería Baja Crítica (<12V) -> ROJO con alarma destellante (10.8V, 3 bloques) - # 5 - 9s: FASE 2 - Batería en reposo / baja carga (12.0 - 13.2V) -> AMARILLO (12.4V, 8 bloques) - # 9 - 16s: FASE 3 - Marcha normal / óptima -> Todo en VERDE (RPM 2200, Vel 60, Temp 92°C, Volt 14.2V) - # 16 - 21s: FASE 4 - Precaución / carga alta -> Todo en AMARILLO (RPM 4200, Vel 120, Temp 102°C, Volt 15.0V) - # 21 - 27s: FASE 5 - MÁXIMO ABSOLUTO (100% de escala) -> Todo en ROJO con alarma destellante (RPM 6000, Vel 160, Temp 120°C, Volt 16.0V) - # 27 - 32s: FASE 6 - Descenso suave de vuelta al inicio - cycle_period = 32.0 - phase = t % cycle_period + if not self.auto_simulate: + return - if phase < 5.0: - # Batería baja crítica (<12V) -> ROJO destellante - self.pcm_volt = 10.8 - self.rpm = 800.0 - self.speed = 0.0 - self.coolant_temp = 86.0 - elif phase < 9.0: - # Batería en reposo / baja carga (12.0 - 13.2V) -> AMARILLO - self.pcm_volt = 12.4 - self.rpm = 800.0 - self.speed = 0.0 - self.coolant_temp = 88.0 - elif phase < 16.0: - # Marcha normal -> VERDE - p = (phase - 9.0) / 7.0 - self.pcm_volt = 14.2 - self.rpm = 1500.0 + p * (2600.0 - 1500.0) - self.speed = 30.0 + p * (75.0 - 30.0) - self.coolant_temp = 90.0 + p * (94.0 - 90.0) - elif phase < 21.0: - # Exigido / autopista -> AMARILLO - p = (phase - 16.0) / 5.0 - self.pcm_volt = 14.9 + p * 0.2 # 14.9 a 15.1V (Amarillo) - self.rpm = 3800.0 + p * (4800.0 - 3800.0) # 3800 a 4800 (Amarillo) - self.speed = 112.0 + p * (128.0 - 112.0) # 112 a 128 (Amarillo) - self.coolant_temp = 99.0 + p * (104.0 - 99.0) # 99 a 104 (Amarillo) - elif phase < 27.0: - # MÁXIMO ABSOLUTO (100% de escala) -> ROJO con alarma destellante - self.pcm_volt = 16.0 - self.rpm = 6000.0 - self.speed = 160.0 - self.coolant_temp = 120.0 - else: - # Retorno progresivo - p = (phase - 27.0) / 5.0 - self.pcm_volt = 16.0 - p * (16.0 - 10.8) - self.rpm = 6000.0 - p * (6000.0 - 800.0) - self.speed = 160.0 - p * 160.0 - self.coolant_temp = 120.0 - p * (120.0 - 86.0) + if self.mode == "eco": + # MODO ECO FIJO: Bloquea telemetría permanentemente en el punto dulce óptimo + self.pcm_volt = 14.2 + self.rpm = 2250.0 # Rango ECO: 1900 - 2550 RPM + self.load = 58.0 # Rango ECO: 45% - 82% + self.speed = 70.0 # km/h + self.coolant_temp = 90.0 # °C + self.oil_temp = 93.0 + self.map_psi = 14.5 + self.trans_temp = 82.0 + return - # Correlated auxiliary telemetry - self.map_psi = 10.0 + 16.0 * ((self.rpm - 800.0) / 5200.0) - self.load = 15.0 + 75.0 * ((self.rpm - 800.0) / 5200.0) - self.oil_temp = self.coolant_temp + 3.0 - self.trans_temp = 82.0 + 1.0 * math.cos(t * 0.09) + # Ciclo de demostración de 36 segundos con FASE ECO dedicada y prolongada: + # 0 - 4s: FASE 1 - Batería Baja Crítica (<12V) -> ROJO con alarma destellante (10.8V) + # 4 - 8s: FASE 2 - Ralentí y reposo (12.4V, 850 RPM, Carga 28%) + # 8 - 18s: FASE 3 - CRUCERO ÓPTIMO [ ECO ] (10 seg continuos: 2200 RPM, Carga 58%, 70 km/h, 14.2V) -> BADGE ACTIVO + # 18 - 24s: FASE 4 - Exigido / autopista (3800 - 4800 RPM, Carga 88%, 120 km/h, 102°C) -> Sale de ECO + # 24 - 30s: FASE 5 - MÁXIMO ABSOLUTO (100% escala: 6000 RPM, 160 km/h, 120°C, 16.0V) -> Todo en ROJO con alarma + # 30 - 36s: FASE 6 - Descenso suave de vuelta al inicio + cycle_period = 36.0 + phase = t % cycle_period + + if phase < 4.0: + # Batería baja crítica (<12V) -> ROJO destellante + self.pcm_volt = 10.8 + self.rpm = 800.0 + self.speed = 0.0 + self.coolant_temp = 86.0 + self.load = 25.0 + elif phase < 8.0: + # Batería en reposo / baja carga (12.0 - 13.2V) -> AMARILLO + self.pcm_volt = 12.4 + self.rpm = 850.0 + self.speed = 0.0 + self.coolant_temp = 88.0 + self.load = 28.0 + elif phase < 18.0: + # FASE ECO: Marcha y crucero óptimo durante 10 segundos continuos (RPM: 2150-2300, Carga: 56%-62%) + p = (phase - 8.0) / 10.0 + self.pcm_volt = 14.2 + self.rpm = 2200.0 + math.sin(p * math.pi) * 100.0 + self.load = 58.0 + math.sin(p * math.pi) * 4.0 + self.speed = 65.0 + p * 10.0 + self.coolant_temp = 90.0 + p * 2.0 + elif phase < 24.0: + # Exigido / autopista -> AMARILLO + p = (phase - 18.0) / 6.0 + self.pcm_volt = 14.9 + p * 0.2 + self.rpm = 3800.0 + p * (4800.0 - 3800.0) + self.load = 85.0 + p * 8.0 + self.speed = 112.0 + p * (128.0 - 112.0) + self.coolant_temp = 99.0 + p * (104.0 - 99.0) + elif phase < 30.0: + # MÁXIMO ABSOLUTO (100% de escala) -> ROJO con alarma destellante + self.pcm_volt = 16.0 + self.rpm = 6000.0 + self.load = 96.0 + self.speed = 160.0 + self.coolant_temp = 120.0 + else: + # Retorno progresivo + p = (phase - 30.0) / 6.0 + self.pcm_volt = 16.0 - p * (16.0 - 10.8) + self.rpm = 6000.0 - p * (6000.0 - 800.0) + self.load = 96.0 - p * (96.0 - 25.0) + self.speed = 160.0 - p * 160.0 + self.coolant_temp = 120.0 - p * (120.0 - 86.0) + + # Correlated auxiliary telemetry + self.map_psi = 10.0 + 16.0 * ((self.rpm - 800.0) / 5200.0) + self.oil_temp = self.coolant_temp + 3.0 + self.trans_temp = 82.0 + 1.0 * math.cos(t * 0.09) state = VehicleState() @@ -310,10 +331,18 @@ def handle_client_stream(sock): sock.sendall(response.encode("latin1")) now = time.time() - if now - last_display_time > 0.4: + if now - last_display_time > 0.25: last_display_time = now cmd_display = cmd if cmd else "" - print(f"\r[ECT: {state.coolant_temp:3.0f}°C | RPM: {state.rpm:4.0f} | SPEED: {state.speed:3.0f} km/h | Volt: {state.pcm_volt:4.1f}V | CMD: {cmd_display:6s} -> {response.strip()}]", end="", flush=True) + with state.lock: + c_rpm = state.rpm + c_load = state.load + c_temp = state.coolant_temp + c_spd = state.speed + c_volt = state.pcm_volt + is_eco = (1900.0 <= c_rpm <= 2550.0 and 45.0 <= c_load <= 82.0) + eco_badge = "\033[92;1m[ECO ACTIVO]\033[0m" if is_eco else "\033[90m[ECO OFF]\033[0m" + print(f"\r[RPM: {c_rpm:4.0f} | Carga: {c_load:2.0f}% {eco_badge} | {c_temp:3.0f}°C | {c_spd:3.0f} km/h | {c_volt:4.1f}V | CMD: {cmd_display:5s} -> {response.strip():14s}] ", end="", flush=True) except socket.timeout: pass @@ -338,9 +367,26 @@ def simulation_worker(): def run_emulator(): - print("=" * 65) + parser = argparse.ArgumentParser(description="OBD-II Bluetooth Emulator con soporte ECO Badge (Ford Ka Endura 1.3)") + parser.add_argument("--mode", "-m", choices=["cycle", "eco"], default="cycle", help="Modo inicial: 'cycle' (demostración) o 'eco' (fijo)") + parser.add_argument("--eco", "-e", action="store_true", help="Iniciar directamente en modo ECO fijo (RPM=2250, Carga=58%%)") + args = parser.parse_args() + + if args.eco or args.mode == "eco": + state.mode = "eco" + + print("=" * 70) print(" ESP32 CYD OBD2 Bluetooth Emulator (ELM327 v1.5)") - print("=" * 65) + print(" Soporte para Badge Táctico ECO / OPT (Ford Ka Endura 1.3)") + print("=" * 70) + if state.mode == "eco": + print(">>> MODO ACTUAL: ECO FIJO (RPM: 2250, Carga: 58%, Vel: 70 km/h) <<<") + else: + print(">>> MODO ACTUAL: CICLO DINÁMICO (Fase ECO activa entre 8s y 18s) <<<") + print("Comandos interactivos en consola:") + print(" - Escribe 'e' + [Enter]: Activar MODO ECO FIJO (permanente)") + print(" - Escribe 'c' + [Enter]: Activar MODO CICLO AUTOMÁTICO") + print(" - Presiona Ctrl+C o escribe 'q': Salir\n") # Start simulation thread sim_thread = threading.Thread(target=simulation_worker, daemon=True) @@ -423,12 +469,24 @@ def run_emulator(): try: while True: - rlist, _, _ = select.select([server_sock], [], [], 1.0) + rlist, _, _ = select.select([server_sock, sys.stdin], [], [], 1.0) if server_sock in rlist: client_sock, client_info = server_sock.accept() print(f"\n[Bluetooth Socket] Conexión entrante aceptada desde {client_info}!") t = threading.Thread(target=handle_client_stream, args=(client_sock,), daemon=True) t.start() + if sys.stdin in rlist: + line = sys.stdin.readline().strip().lower() + if line in ["e", "eco"]: + with state.lock: + state.mode = "eco" + print("\n\n>>> MODO ECO FIJO ACTIVADO: RPM=2250, Carga=58% (Badge [ ECO ] permanente) <<<\n") + elif line in ["c", "cycle"]: + with state.lock: + state.mode = "cycle" + print("\n\n>>> MODO CICLO AUTOMÁTICO ACTIVADO (Fase ECO activa entre 8s y 18s) <<<\n") + elif line in ["q", "quit", "exit"]: + break except KeyboardInterrupt: print("\nDeteniendo emulador...") finally: diff --git a/sketch/obd2_gauge/bluetooth.h b/sketch/obd2_gauge/bluetooth.h index 4b8d86e..4e4f0b9 100644 --- a/sketch/obd2_gauge/bluetooth.h +++ b/sketch/obd2_gauge/bluetooth.h @@ -1,5 +1,11 @@ /* Bluetooth function */ //---------------------------------- +extern bool ignitionOn; +extern bool wokeFromSleep; +void initScreen(); +void plotNoData(uint8_t cell); +void touchBeep(); + //convert bt address to text //{0x00,0x1d,0xa5,0x00,0x12,0x92} -> 00:1d:a5:00:12:92 String ByteArraytoString(esp_bd_addr_t bt_address) { @@ -19,7 +25,7 @@ String ByteArraytoString(esp_bd_addr_t bt_address) { /*=======================*/ void scanBTdevice() {//scan bluetooth device - digitalWrite(LED_BLUE_PIN,LOW);//blue led on + setRearLedColor(0, 0, 200);//blue led on Serial.println("Scanning for OBDII Adaptor..."); Terminal("Scanning for OBDII Adaptor...",0,48,320,191); btDeviceCount = 0; @@ -39,7 +45,7 @@ void scanBTdevice() {//scan bluetooth device #ifdef SERIAL_DEBUG Serial.println("Discovering stopped"); #endif - digitalWrite(LED_BLUE_PIN,HIGH);//blue led off + setRearLedOff();//blue led off delay(1000);//redsicovery delay } else { @@ -110,7 +116,8 @@ void scanBTdevice() {//scan bluetooth device while(!BTSerial.connected(1000) && (try_count < 10)) { Serial.print(F(".")); blink =! blink; - digitalWrite(LED_BLUE_PIN,blink);//blue led offset + if (blink) setRearLedColor(0, 0, 200); + else setRearLedOff(); if (blink) tft.setTextColor(TFT_BLUE,TFT_BLACK); else tft.setTextColor(TFT_BLACK,TFT_BLACK); tft.drawRightString("$",319,210,4); @@ -121,12 +128,13 @@ void scanBTdevice() {//scan bluetooth device Terminal("Connect failed!",0,48,320,191); Serial.println(F("Connect failed!")); BTSerial.disconnect(); + setRearLedOff(); foundOBD2 = false; } else { Terminal("Connected Successfully!",0,48,320,191); Serial.println(F("Connected Successfully!")); prompt = true; - digitalWrite(LED_GREEN_PIN, LOW);//green led + updateRearLedTheme(); // Set rear RGB LED to active theme color foundOBD2 = true; } @@ -139,7 +147,7 @@ void scanBTdevice() {//scan bluetooth device //--------------------------- //connect to recent obdII for fast connection, skip scanning void connectLastOBDII() { - digitalWrite(LED_BLUE_PIN,LOW);//blue led on + setRearLedColor(0, 0, 200);//blue led on String txt = "Connecting to " + client_name +" - " + ByteArraytoString(recent_client_addr); Terminal(txt,0,48,320,191); Serial.println(txt); @@ -149,20 +157,120 @@ void connectLastOBDII() { while(!BTSerial.connected(1000) && (try_count <3)) { Serial.print(F(".")); blink =! blink; - digitalWrite(LED_BLUE_PIN,blink);//blue led offset + if (blink) setRearLedColor(0, 0, 200); + else setRearLedOff(); try_count++; } if (try_count == 3) {//cannot connect Terminal("OBDII Adaptor not found!",0,48,320,191); Serial.println(F("OBDII Adaptor not found!")); BTSerial.disconnect(); + setRearLedOff(); foundOBD2 = false; } else { Terminal("Connected Successfully!",0,48,320,191); Serial.println(F("Connected Successfully!")); prompt = true; - digitalWrite(LED_GREEN_PIN, LOW);//green led + updateRearLedTheme(); // Set rear RGB LED to active theme color foundOBD2 = true; } -}//connectLasbtOBDII \ No newline at end of file +}//connectLasbtOBDII + +//--------------------------- +// Resume Bluetooth connection with OBDII scanner upon waking from sleep +bool resumeBluetoothConnection() { + bool hasRecentAddr = false; + for (uint8_t i = 0; i < 6; i++) { + if (recent_client_addr[i] != 0) { + hasRecentAddr = true; + break; + } + } + if (!hasRecentAddr) { + foundOBD2 = false; + return false; + } + + // Draw authentic themed resume card + tft.fillScreen(TFT_BLACK); + tft.fillRectVGradient(0, 0, 320, 26, getThemeAccentColor(), getThemeDarkColor()); + tft.fillRect(0, 26, 320, 2, getThemePrimaryColor()); + tft.setTextColor(TFT_WHITE); + tft.drawCentreString("Conexion Bluetooth", 160, 2, 4); + + tft.fillRoundRect(14, 44, 292, 114, 6, getThemeDarkColor()); + tft.drawRoundRect(14, 44, 292, 114, 6, getThemeAccentColor()); + tft.fillRoundRect(18, 50, 4, 102, 2, getThemePrimaryColor()); + + tft.setTextColor(TFT_WHITE, getThemeDarkColor()); + tft.drawCentreString("Reanudando conexion...", 160, 54, 4); + + tft.setTextColor(0xBDD7, getThemeDarkColor()); + tft.drawCentreString("Conectando con escaner OBDII", 160, 88, 2); + String macStr = ByteArraytoString(recent_client_addr); + tft.drawCentreString(macStr.c_str(), 160, 108, 2); + + // Request Bluetooth connection to OBDII scanner + setRearLedColor(0, 0, 200); // Blue LED indicating connection attempt + BTSerial.disconnect(); + delay(50); + BTSerial.connect(recent_client_addr, 0, sec_mask, role); + + uint8_t try_count = 0; + bool blink = false; + while (!BTSerial.connected(1000) && (try_count < 4)) { + blink = !blink; + if (blink) setRearLedColor(0, 0, 200); + else setRearLedOff(); + + String dots = ""; + for (uint8_t d = 0; d <= (try_count % 4); d++) dots += ". "; + tft.setTextColor(getThemePrimaryColor(), getThemeDarkColor()); + tft.drawCentreString(dots.c_str(), 160, 132, 4); + + uint16_t tx = 0, ty = 0; + if (getTouch(&tx, &ty) || digitalRead(SELECTOR_PIN) == LOW) { + break; // Abort on user interaction + } + try_count++; + } + + if (BTSerial.connected()) { + tft.setTextColor(TFT_GREEN, getThemeDarkColor()); + tft.drawCentreString("[ OK ] Conectado con exito!", 160, 132, 2); + setRearLedColor(0, 255, 0); + delay(200); + + // Re-initialize ELM327 protocol and commands for Ford J1850 PWM + sendATCommand("ATE0", 800); // Echo OFF + sendATCommand("ATL0", 800); // Linefeeds OFF + sendATCommand("ATH0", 800); // Headers OFF + sendATCommand("ATAT1", 800); // Normal adaptive timing + sendATCommand("ATSP1", 800); // Ford J1850 PWM (Protocol 1) + String r0100 = sendATCommand("0100", 2500); + ignitionOn = (r0100.indexOf("41 00") != -1); + + foundOBD2 = true; + prompt = true; + bt_message = ""; + updateRearLedTheme(); // Restore theme color on rear RGB LED + touchBeep(); + initScreen(); + lastActivityTime = millis(); + return true; + } else { + tft.setTextColor(TFT_RED, getThemeDarkColor()); + tft.drawCentreString("[!] Escaner no disponible", 160, 132, 2); + BTSerial.disconnect(); + setRearLedOff(); + foundOBD2 = false; + delay(400); + initScreen(); + for (uint8_t c = 0; c < 4; c++) { + plotNoData(c); + } + lastActivityTime = millis(); + return false; + } +} \ No newline at end of file diff --git a/sketch/obd2_gauge/config.h b/sketch/obd2_gauge/config.h index b649408..edc15d6 100644 --- a/sketch/obd2_gauge/config.h +++ b/sketch/obd2_gauge/config.h @@ -4,13 +4,83 @@ Configuration menu for OBD2 Gauge with volume and per-instrument alarm controls #include #include #include +#include +#include +#include #define mypic_filename "/mypic.jpg" #define FORMAT_SPIFFS_IF_FAILED true +// Inactivity Auto-Sleep settings (0: OFF, 1: 30s, 2: 1m, 3: 2m, 4: 5m) +const uint16_t AUTO_SLEEP_SEC_TABLE[5] = { 0, 30, 60, 120, 300 }; +const char* const AUTO_SLEEP_NAME_TABLE[5] = { "OFF", "30s", "1m", "2m", "5m" }; +extern uint8_t autoSleepIndex; +extern uint32_t lastActivityTime; +extern uint8_t beepSoundType; +extern bool wokeFromSleep; + /*------------ SOUND EFFECTS ----------*/ -// Crisp High-Pitch Casio Chirp (4096 Hz, 25ms) +const char* const BEEP_NAME_TABLE[6] = { + "Casio Chirp", + "Click Corto", + "Tono Suave", + "Tick Digital", + "Doble Pip", + "Campana Retro" +}; + +void playBeepSample(uint8_t type, uint8_t vol) { + if (vol == 0) return; + uint16_t duty = VOL_DUTY_TABLE[vol > 5 ? 3 : vol]; + + if (type == 0) { // Casio Chirp (4096 Hz, 25ms) + ledcSetup(buzzerChannel, 4096, 10); + ledcWrite(buzzerChannel, duty); + delay(25); + ledcWrite(buzzerChannel, 0); + } else if (type == 1) { // Click Corto (3200 Hz, 12ms) + ledcSetup(buzzerChannel, 3200, 10); + ledcWrite(buzzerChannel, duty); + delay(12); + ledcWrite(buzzerChannel, 0); + } else if (type == 2) { // Tono Suave (2400 Hz, 28ms) + ledcSetup(buzzerChannel, 2400, 10); + ledcWrite(buzzerChannel, duty); + delay(28); + ledcWrite(buzzerChannel, 0); + } else if (type == 3) { // Tick Digital (4800 Hz, 8ms) + ledcSetup(buzzerChannel, 4800, 10); + ledcWrite(buzzerChannel, duty); + delay(8); + ledcWrite(buzzerChannel, 0); + } else if (type == 4) { // Doble Pip (3500 Hz 12ms -> 4500 Hz 15ms) + ledcSetup(buzzerChannel, 3500, 10); + ledcWrite(buzzerChannel, duty); + delay(12); + ledcWrite(buzzerChannel, 0); + delay(15); + ledcSetup(buzzerChannel, 4500, 10); + ledcWrite(buzzerChannel, duty); + delay(15); + ledcWrite(buzzerChannel, 0); + } else if (type == 5) { // Campana Retro (2093 Hz Do7, 35ms) + ledcSetup(buzzerChannel, 2093, 10); + ledcWrite(buzzerChannel, duty); + delay(35); + ledcWrite(buzzerChannel, 0); + } +} + +void touchBeep() { + playBeepSample(beepSoundType, buzzerVolumeLevel); +} + +// Crisp High-Pitch Casio Chirp (redirects to touchBeep when freq == 4096) inline void casioBeep(uint16_t freq = 4096, uint8_t duration_ms = 25) { + if (freq == 4096) { + touchBeep(); + return; + } uint16_t duty = VOL_DUTY_TABLE[buzzerVolumeLevel > 5 ? 3 : buzzerVolumeLevel]; if (duty == 0) return; // Mute mode ledcSetup(buzzerChannel, freq, 10); @@ -20,27 +90,30 @@ inline void casioBeep(uint16_t freq = 4096, uint8_t duration_ms = 25) { } void beepbeep() { - casioBeep(4096, 25); - delay(30); - casioBeep(4096, 25); + touchBeep(); + delay(35); + touchBeep(); } void beep() { - casioBeep(4096, 40); + touchBeep(); } void clickSound() { - casioBeep(4096, 25); + touchBeep(); } -// Configuration menu list (4 options) -const String menuList[4] = { - "Activación de Alarmas", // 0 - "Sonido de Alarma", // 1 - "Volumen de Bip", // 2 - "Salir" // 3 +// Configuration menu list (7 options) +const String menuList[7] = { + "Alarmas", // 0 + "Sonidos", // 1 + "Brillo de Pantalla", // 2 + "Apariencia", // 3 + "Modo Dormir", // 4 + "Reiniciar", // 5 + "Salir" // 6 }; -const uint8_t maxMenu = 4; +const uint8_t maxMenu = 7; // Menu list for warning setting (4 vehicle gauges) const String parameterList[4][2] = { @@ -51,64 +124,90 @@ const String parameterList[4][2] = { }; // ------------------------------------------------------------- -// Sub-screen 0: Ajuste de Alarmas (Activación Tactil ON/OFF) +// Componente de Boton SALIR con Animacion de Pulsacion Tactil +// ------------------------------------------------------------- +void drawExitButton(bool pressed) { + uint16_t bgCol = pressed ? getThemePrimaryColor() : getThemeAccentColor(); + uint16_t txtCol = pressed ? TFT_BLACK : TFT_WHITE; + uint16_t borderCol = pressed ? TFT_WHITE : getThemeDarkColor(); + + tft.fillRoundRect(80, 186, 160, 42, 5, bgCol); + tft.drawRoundRect(80, 186, 160, 42, 5, borderCol); + if (pressed) { + tft.drawRoundRect(81, 187, 158, 40, 4, TFT_WHITE); + } + tft.setTextColor(txtCol, bgCol); + tft.drawCentreString("SALIR", 160, 194, 4); +} + +void animateExitButtonPress() { + drawExitButton(true); + touchBeep(); + delay(120); + waitForTouchRelease(); +} + +// ------------------------------------------------------------- +// Sub-screen 0: Ajuste de Alarmas (Activacion Tactil ON/OFF) // ------------------------------------------------------------- void warningMenu() { tft.fillScreen(TFT_BLACK); - tft.fillRectVGradient(0, 0, 320, 26, TFT_ORANGE, 0xfc00); - tft.setTextColor(TFT_BLACK); - tft.drawCentreString("[--- Activación de Alarmas ---]", 159, 0, 4); auto drawAllRows = [&]() { + uint16_t onCol = getThemePrimaryColor(); // Clean active accent + for (uint8_t i = 0; i < 4; i++) { - int y = 34 + i * 39; - tft.fillRoundRect(8, y, 304, 36, 5, 0x18E3); + int y = 10 + i * 44; + tft.fillRoundRect(8, y, 304, 38, 5, getThemeDarkColor()); + tft.drawRoundRect(8, y, 304, 38, 5, getThemeAccentColor()); + if (alarmEnabled[i]) { + tft.fillRoundRect(10, y + 4, 3, 30, 1, onCol); + } - tft.setTextColor(alarmEnabled[i] ? TFT_WHITE : 0x8410, 0x18E3); - tft.drawString(parameterList[i][0], 22, y + 6, 4); + tft.setTextColor(alarmEnabled[i] ? TFT_WHITE : 0x8410, getThemeDarkColor()); + tft.drawString(parameterList[i][0], 22, y + 7, 4); - // Large tactile ON / OFF badge - uint16_t badgeCol = alarmEnabled[i] ? TFT_GREEN : 0x8000; - tft.fillRoundRect(220, y + 4, 84, 28, 5, badgeCol); - tft.drawRoundRect(220, y + 4, 84, 28, 5, TFT_WHITE); - tft.setTextColor(TFT_WHITE, badgeCol); - tft.drawCentreString(alarmEnabled[i] ? "ON" : "OFF", 262, y + 6, 4); + // Large tactile ON / OFF badge (completely red-free: neutral slate for OFF, theme accent for ON) + uint16_t badgeCol = alarmEnabled[i] ? onCol : 0x2124; + uint16_t txtCol = alarmEnabled[i] ? TFT_BLACK : 0xAD55; + uint16_t borderCol = alarmEnabled[i] ? TFT_WHITE : 0x4A69; + + tft.fillRoundRect(220, y + 4, 84, 30, 5, badgeCol); + tft.drawRoundRect(220, y + 4, 84, 30, 5, borderCol); + tft.setTextColor(txtCol, badgeCol); + tft.drawCentreString(alarmEnabled[i] ? "ON" : "OFF", 262, y + 7, 4); } }; - drawAllRows(); + drawAllRows(); // Initial draw of all alarm rows with ON/OFF badges - // Bottom action button: [ GUARDAR Y SALIR ] - tft.fillRoundRect(25, 194, 270, 38, 5, 0x02EC); // Rich Ocean Blue - tft.setTextColor(TFT_WHITE); - tft.drawCentreString("GUARDAR Y SALIR", 160, 201, 4); - delay(200); + // Bottom action button: [ SALIR ] (x: 80, y: 186, w: 160, h: 42) + drawExitButton(false); + waitForTouchRelease(); while (true) { autoDim(); uint16_t tx = 0, ty = 0; if (getTouch(&tx, &ty)) { // 1. Direct touch on any parameter row to toggle ON/OFF - if (ty >= 32 && ty < 190) { - int8_t row = (ty - 34) / 39; + if (ty >= 6 && ty < 184) { + int8_t row = (ty - 10) / 44; if (row >= 0 && row < 4) { alarmEnabled[row] = !alarmEnabled[row]; drawAllRows(); - casioBeep(4096, 25); - while (isScreenPressed()) { delay(10); yield(); } - delay(50); + touchBeep(); + waitForTouchRelease(); } } - // 2. Bottom button [ GUARDAR Y SALIR ] or top bar - else if ((ty >= 190 && ty <= 238 && tx >= 20 && tx <= 300) || ty < 30) { - casioBeep(4096, 25); + // 2. Bottom button [ SALIR ] + else if (ty >= 180 && tx >= 20 && tx <= 300) { pref.begin("setting", false); for (uint8_t i = 0; i < 4; i++) { String almKey = "alm_" + String(i); pref.putBool(almKey.c_str(), alarmEnabled[i]); } pref.end(); - while (isScreenPressed()) { delay(10); yield(); } + animateExitButtonPress(); break; } } else if (digitalRead(SELECTOR_PIN) == LOW) { @@ -122,10 +221,12 @@ void warningMenu() { // ------------------------------------------------------------- // Sub-screen 1: Sonido de Alarma (Tipo de Sonido y Volumen) // ------------------------------------------------------------- -const char* const ALARM_NAME_TABLE[4] = { - "Casio Doble", - "Sincronizado", - "Bitonal Auto", +const char* const ALARM_NAME_TABLE[6] = { + "Chime BMW", + "Mercedes Gong", + "Audi Cockpit", + "Porsche Sport", + "Casio Clasico", "Triple Urgente" }; @@ -133,41 +234,62 @@ void playAlarmSample(uint8_t type, uint8_t vol) { if (vol == 0) return; uint16_t duty = VOL_DUTY_TABLE[vol > 5 ? 3 : vol]; - if (type == 0) { // Casio Doble + if (type == 0) { // Chime BMW (Mi7 -> Do7, 2637 Hz -> 2093 Hz) + ledcSetup(buzzerChannel, 2637, 10); + ledcWrite(buzzerChannel, duty); + delay(60); + ledcWrite(buzzerChannel, 0); + delay(15); + ledcSetup(buzzerChannel, 2093, 10); + ledcWrite(buzzerChannel, duty); + delay(110); + ledcWrite(buzzerChannel, 0); + } else if (type == 1) { // Mercedes Gong (Re7 -> Fa#7, 2349 Hz -> 2960 Hz) + ledcSetup(buzzerChannel, 2349, 10); + ledcWrite(buzzerChannel, duty); + delay(45); + ledcWrite(buzzerChannel, 0); + delay(20); + ledcSetup(buzzerChannel, 2960, 10); + ledcWrite(buzzerChannel, duty); + delay(85); + ledcWrite(buzzerChannel, 0); + } else if (type == 2) { // Audi Cockpit (Do7 -> Mi7 -> Sol7, 2093 -> 2637 -> 3136 Hz) + ledcSetup(buzzerChannel, 2093, 10); + ledcWrite(buzzerChannel, duty); + delay(35); + ledcSetup(buzzerChannel, 2637, 10); + ledcWrite(buzzerChannel, duty); + delay(35); + ledcSetup(buzzerChannel, 3136, 10); + ledcWrite(buzzerChannel, duty); + delay(65); + ledcWrite(buzzerChannel, 0); + } else if (type == 3) { // Porsche Sport (Doble staccato rapido 3500 Hz) + ledcSetup(buzzerChannel, 3500, 10); + ledcWrite(buzzerChannel, duty); + delay(30); + ledcWrite(buzzerChannel, 0); + delay(25); + ledcSetup(buzzerChannel, 3500, 10); + ledcWrite(buzzerChannel, duty); + delay(30); + ledcWrite(buzzerChannel, 0); + } else if (type == 4) { // Casio Clasico (Doble chirp 4096 Hz) ledcSetup(buzzerChannel, 4096, 10); ledcWrite(buzzerChannel, duty); - delay(25); + delay(24); ledcWrite(buzzerChannel, 0); delay(35); ledcSetup(buzzerChannel, 4096, 10); ledcWrite(buzzerChannel, duty); - delay(25); + delay(24); ledcWrite(buzzerChannel, 0); - } else if (type == 1) { // Sincronizado - ledcSetup(buzzerChannel, 4096, 10); - ledcWrite(buzzerChannel, duty); - delay(30); - ledcWrite(buzzerChannel, 0); - delay(100); - ledcSetup(buzzerChannel, 4096, 10); - ledcWrite(buzzerChannel, duty); - delay(30); - ledcWrite(buzzerChannel, 0); - } else if (type == 2) { // Bitonal Auto - ledcSetup(buzzerChannel, 4096, 10); - ledcWrite(buzzerChannel, duty); - delay(40); - ledcWrite(buzzerChannel, 0); - delay(20); - ledcSetup(buzzerChannel, 3072, 10); - ledcWrite(buzzerChannel, duty); - delay(40); - ledcWrite(buzzerChannel, 0); - } else if (type == 3) { // Triple Urgente + } else if (type == 5) { // Triple Urgente (3 pulsos rapidos 4096 Hz) for (uint8_t k = 0; k < 3; k++) { ledcSetup(buzzerChannel, 4096, 10); ledcWrite(buzzerChannel, duty); - delay(20); + delay(22); ledcWrite(buzzerChannel, 0); if (k < 2) delay(25); } @@ -176,99 +298,90 @@ void playAlarmSample(uint8_t type, uint8_t vol) { void alarmSoundMenu() { tft.fillScreen(TFT_BLACK); - tft.fillRectVGradient(0, 0, 320, 26, TFT_ORANGE, 0xfc00); - tft.setTextColor(TFT_BLACK); - tft.drawCentreString("[--- Sonido de Alarma ---]", 159, 0, 4); auto drawAlarmUI = []() { - tft.fillRect(0, 28, 320, 160, TFT_BLACK); + tft.fillRect(0, 0, 320, 186, TFT_BLACK); - // 4 Pattern Tiles (2x2 grid) - for (uint8_t i = 0; i < 4; i++) { + // 6 Pattern Tiles (3 rows x 2 columns) from y = 8 to y = 120 + for (uint8_t i = 0; i < 6; i++) { int16_t x = (i % 2 == 0) ? 10 : 166; - int16_t y = (i < 2) ? 34 : 74; + int16_t y = 8 + (i / 2) * 38; int16_t w = 144; int16_t h = 34; bool isSel = (i == alarmSoundType); - uint16_t bg = isSel ? TFT_BLUE : 0x18E3; + uint16_t bg = isSel ? getThemeAccentColor() : getThemeDarkColor(); + uint16_t border = isSel ? getThemePrimaryColor() : getThemeAccentColor(); tft.fillRoundRect(x, y, w, h, 5, bg); + tft.drawRoundRect(x, y, w, h, 5, border); if (isSel) { - tft.drawRoundRect(x, y, w, h, 5, TFT_CYAN); tft.drawRoundRect(x + 1, y + 1, w - 2, h - 2, 4, TFT_WHITE); } tft.setTextColor(isSel ? TFT_WHITE : 0xBDD7, bg); - tft.drawCentreString(ALARM_NAME_TABLE[i], x + w / 2, y + 8, 2); + tft.drawCentreString(ALARM_NAME_TABLE[i], x + w / 2, y + 9, 2); } - // Volume level label - tft.setTextColor(TFT_WHITE, TFT_BLACK); - String lvlStr = "Volumen: Nivel " + String(alarmVolumeLevel) + " de 5 (" + VOL_NAME_TABLE[alarmVolumeLevel] + ")"; - tft.drawCentreString(lvlStr.c_str(), 160, 116, 2); - - // 6 Direct Touch Tiles (0 to 5) for Alarm Volume + // 6 Direct Touch Tiles (0 to 5) for Alarm Volume from y = 126 to y = 180 for (uint8_t i = 0; i <= 5; i++) { int16_t bx = 7 + i * 52; - int16_t by = 136; + int16_t by = 126; int16_t bw = 46; - int16_t bh = 46; + int16_t bh = 54; bool isSel = (i == alarmVolumeLevel); - uint16_t bgCol = isSel ? (i == 0 ? 0x8000 : (i >= 4 ? TFT_ORANGE : (i >= 2 ? TFT_GREEN : 0x03E0))) : 0x18E3; + uint16_t bgCol = isSel ? (i == 0 ? 0x3187 : getThemeAccentColor()) : getThemeDarkColor(); + uint16_t borderCol = isSel ? (i == 0 ? TFT_WHITE : getThemePrimaryColor()) : getThemeAccentColor(); tft.fillRoundRect(bx, by, bw, bh, 5, bgCol); + tft.drawRoundRect(bx, by, bw, bh, 5, borderCol); if (isSel) { - tft.drawRoundRect(bx, by, bw, bh, 5, TFT_WHITE); tft.drawRoundRect(bx + 1, by + 1, bw - 2, bh - 2, 4, TFT_WHITE); } tft.setTextColor(isSel ? TFT_WHITE : 0xAD55, bgCol); - tft.drawCentreString(String(i).c_str(), bx + bw / 2, by + 6, 6); + tft.drawCentreString(String(i).c_str(), bx + bw / 2, by + 8, 6); } }; - drawAlarmUI(); + drawAlarmUI(); // Initial draw of sound cards and volume tiles - // Bottom action button: [ GUARDAR Y SALIR ] - tft.fillRoundRect(25, 192, 270, 40, 5, 0x02EC); // Rich Ocean Blue - tft.setTextColor(TFT_WHITE); - tft.drawCentreString("GUARDAR Y SALIR", 160, 200, 4); - delay(200); + // Bottom action button: [ SALIR ] (x: 80, y: 186, w: 160, h: 42) + drawExitButton(false); + waitForTouchRelease(); while (true) { autoDim(); uint16_t tx = 0, ty = 0; if (getTouch(&tx, &ty)) { - // 1. Touch on pattern selection (y: 32 to 112) - if (ty >= 32 && ty <= 112) { + // 1. Touch on pattern selection (y: 0 to 122) + if (ty < 122) { int8_t col = (tx < 160) ? 0 : 1; - int8_t row = (ty < 72) ? 0 : 1; + int8_t row = (ty - 6) / 38; + if (row < 0) row = 0; + if (row > 2) row = 2; uint8_t selType = row * 2 + col; - if (selType < 4) { + if (selType < 6) { alarmSoundType = selType; drawAlarmUI(); playAlarmSample(alarmSoundType, alarmVolumeLevel); } - while (isScreenPressed()) { delay(10); yield(); } - delay(50); + waitForTouchRelease(); } - // 2. Touch on alarm volume tiles (y: 130 to 186) - else if (ty >= 130 && ty <= 186) { + // 2. Touch on alarm volume tiles (y: 122 to 184) + else if (ty >= 122 && ty < 184) { int8_t touchedLvl = (tx - 7) / 52; if (touchedLvl >= 0 && touchedLvl <= 5) { alarmVolumeLevel = touchedLvl; drawAlarmUI(); playAlarmSample(alarmSoundType, alarmVolumeLevel); } - while (isScreenPressed()) { delay(10); yield(); } - delay(50); + waitForTouchRelease(); } - // 3. Bottom button [ GUARDAR Y SALIR ] or top bar - else if ((ty >= 188 && ty <= 238 && tx >= 20 && tx <= 300) || ty < 30) { - casioBeep(4096, 25); + // 3. Bottom button [ SALIR ] (y: 180 to 240) + else if (ty >= 180 && tx >= 20 && tx <= 300) { pref.begin("setting", false); pref.putUChar("alm_vol", alarmVolumeLevel); pref.putUChar("alm_type", alarmSoundType); pref.end(); - while (isScreenPressed()) { delay(10); yield(); } + animateExitButtonPress(); break; } } else if (digitalRead(SELECTOR_PIN) == LOW) { @@ -280,82 +393,94 @@ void alarmSoundMenu() { } // ------------------------------------------------------------- -// Sub-screen 2: Volumen de Bip (Ajuste Tactil Directo) +// Sub-screen 2: Sonido de Bip (Tipo de Sonido y Volumen) // ------------------------------------------------------------- -void volumeMenu() { +void beepSoundMenu() { tft.fillScreen(TFT_BLACK); - tft.fillRectVGradient(0, 0, 320, 26, TFT_ORANGE, 0xfc00); - tft.setTextColor(TFT_BLACK); - tft.drawCentreString("[--- Volumen de Bip ---]", 159, 0, 4); - auto drawVolUI = []() { - tft.fillRect(0, 28, 320, 150, TFT_BLACK); + auto drawBeepUI = []() { + tft.fillRect(0, 0, 320, 186, TFT_BLACK); - // Level number and title - tft.setTextColor(TFT_WHITE, TFT_BLACK); - String lvlStr = "Nivel " + String(buzzerVolumeLevel) + " de 5"; - tft.drawCentreString(lvlStr.c_str(), 160, 34, 4); + // 6 Pattern Tiles (3 rows x 2 columns) from y = 8 to y = 120 + for (uint8_t i = 0; i < 6; i++) { + int16_t x = (i % 2 == 0) ? 10 : 166; + int16_t y = 8 + (i / 2) * 38; + int16_t w = 144; + int16_t h = 34; + bool isSel = (i == beepSoundType); - tft.setTextColor(buzzerVolumeLevel == 0 ? TFT_RED : TFT_CYAN, TFT_BLACK); - tft.drawCentreString(VOL_NAME_TABLE[buzzerVolumeLevel], 160, 60, 4); + uint16_t bg = isSel ? getThemeAccentColor() : getThemeDarkColor(); + uint16_t border = isSel ? getThemePrimaryColor() : getThemeAccentColor(); + tft.fillRoundRect(x, y, w, h, 5, bg); + tft.drawRoundRect(x, y, w, h, 5, border); + if (isSel) { + tft.drawRoundRect(x + 1, y + 1, w - 2, h - 2, 4, TFT_WHITE); + } + tft.setTextColor(isSel ? TFT_WHITE : 0xBDD7, bg); + tft.drawCentreString(BEEP_NAME_TABLE[i], x + w / 2, y + 9, 2); + } - // 6 Direct Touch Tiles (0 to 5) + // 6 Direct Touch Tiles (0 to 5) for Beep Volume from y = 126 to y = 180 for (uint8_t i = 0; i <= 5; i++) { int16_t bx = 7 + i * 52; - int16_t by = 94; + int16_t by = 126; int16_t bw = 46; - int16_t bh = 68; + int16_t bh = 54; bool isSel = (i == buzzerVolumeLevel); - uint16_t bgCol; + uint16_t bgCol = isSel ? (i == 0 ? 0x3187 : getThemeAccentColor()) : getThemeDarkColor(); + uint16_t borderCol = isSel ? (i == 0 ? TFT_WHITE : getThemePrimaryColor()) : getThemeAccentColor(); + tft.fillRoundRect(bx, by, bw, bh, 5, bgCol); + tft.drawRoundRect(bx, by, bw, bh, 5, borderCol); if (isSel) { - bgCol = (i == 0) ? 0x8000 : (i >= 4 ? TFT_ORANGE : (i >= 2 ? TFT_GREEN : 0x03E0)); - } else { - bgCol = 0x18E3; // Dark charcoal slate + tft.drawRoundRect(bx + 1, by + 1, bw - 2, bh - 2, 4, TFT_WHITE); } - - tft.fillRoundRect(bx, by, bw, bh, 6, bgCol); - if (isSel) { - tft.drawRoundRect(bx, by, bw, bh, 6, TFT_WHITE); - tft.drawRoundRect(bx + 1, by + 1, bw - 2, bh - 2, 5, TFT_WHITE); - } - tft.setTextColor(isSel ? TFT_WHITE : 0xAD55, bgCol); - tft.drawCentreString(String(i).c_str(), bx + bw / 2, by + 14, 6); + tft.drawCentreString(String(i).c_str(), bx + bw / 2, by + 8, 6); } }; - drawVolUI(); + drawBeepUI(); // Initial draw of sound cards and volume tiles - // [ GUARDAR Y SALIR ] - tft.fillRoundRect(25, 186, 270, 42, 6, 0x02EC); // Rich Ocean Blue - tft.setTextColor(TFT_WHITE); - tft.drawCentreString("GUARDAR Y SALIR", 160, 196, 4); - - delay(200); + // Bottom action button: [ SALIR ] (x: 80, y: 186, w: 160, h: 42) + drawExitButton(false); + waitForTouchRelease(); while (true) { autoDim(); uint16_t tx = 0, ty = 0; if (getTouch(&tx, &ty)) { - // 1. Direct Touch on the 6 volume tiles (y: 85 to 175) - if (ty >= 85 && ty <= 175) { + // 1. Touch on pattern selection (y: 0 to 122) + if (ty < 122) { + int8_t col = (tx < 160) ? 0 : 1; + int8_t row = (ty - 6) / 38; + if (row < 0) row = 0; + if (row > 2) row = 2; + uint8_t selType = row * 2 + col; + if (selType < 6) { + beepSoundType = selType; + drawBeepUI(); + playBeepSample(beepSoundType, buzzerVolumeLevel); + } + waitForTouchRelease(); + } + // 2. Touch on beep volume tiles (y: 122 to 184) + else if (ty >= 122 && ty < 184) { int8_t touchedLvl = (tx - 7) / 52; if (touchedLvl >= 0 && touchedLvl <= 5) { buzzerVolumeLevel = touchedLvl; - drawVolUI(); - casioBeep(4096, 25); // Immediate acoustic feedback at selected volume + drawBeepUI(); + playBeepSample(beepSoundType, buzzerVolumeLevel); } - while (isScreenPressed()) { delay(10); yield(); } - delay(50); + waitForTouchRelease(); } - // 2. GUARDAR Y SALIR (y: 180 to 238) or top bar - else if ((ty >= 180 && ty <= 238 && tx >= 20 && tx <= 300) || ty < 30) { - casioBeep(4096, 25); + // 3. Bottom button [ SALIR ] (y: 180 to 240) + else if (ty >= 180 && tx >= 20 && tx <= 300) { pref.begin("setting", false); pref.putUChar("b_vol", buzzerVolumeLevel); + pref.putUChar("b_type", beepSoundType); pref.end(); - while (isScreenPressed()) { delay(10); yield(); } + animateExitButtonPress(); break; } } else if (digitalRead(SELECTOR_PIN) == LOW) { @@ -366,39 +491,909 @@ void volumeMenu() { } } +void volumeMenu() { + beepSoundMenu(); +} + // ------------------------------------------------------------- -// Menu Principal +// Sub-screen 3: Modo Reposo / Sleep (Manual y por Inactividad) // ------------------------------------------------------------- -void listMenu(uint8_t choice) { +void enterLightSleep() { + // Acoustic power-down feedback (two gentle tones descending) + casioBeep(3500, 20); + delay(30); + casioBeep(2200, 30); + + // 1. Smooth fade out of backlight + for (int b = (int)currentBacklight; b >= 0; b -= 25) { + ledcWrite(backlightChannel, b < 0 ? 0 : b); + delay(10); + } + ledcWrite(backlightChannel, 0); + currentBacklight = 0.0f; + targetBacklight = 0; + + // 2. Put display controller to sleep + tft.writecommand(0x10); // ST7789_SLPIN + delay(120); + + // Turn OFF all rear RGB LEDs completely during sleep mode + setRearLedOff(); + digitalWrite(LED_RED_PIN, HIGH); + digitalWrite(LED_GREEN_PIN, HIGH); + digitalWrite(LED_BLUE_PIN, HIGH); + + // Cleanly disconnect and terminate Bluetooth before sleep to release remote link + if (BTSerial.hasClient() || BTSerial.connected() || foundOBD2) { + BTSerial.disconnect(); + delay(50); + } + BTSerial.end(); + foundOBD2 = false; + + // 3. Configure wakeup sources: + // GPIO 36: XPT2046 Touch IRQ (PENIRQ), pulls LOW when touched + // GPIO 27: Selector Button (SELECTOR_PIN), pulls LOW when pressed + esp_sleep_enable_ext0_wakeup(GPIO_NUM_36, 0); + gpio_wakeup_enable((gpio_num_t)SELECTOR_PIN, GPIO_INTR_LOW_LEVEL); + esp_sleep_enable_gpio_wakeup(); + + // 4. Enter Light Sleep + esp_light_sleep_start(); + + // === WAKE UP === + gpio_wakeup_disable((gpio_num_t)SELECTOR_PIN); + rtc_gpio_deinit(GPIO_NUM_36); + + // Restart Bluetooth controller stack fresh + BTSerial.begin("Va&Cob OBDII Gauge", true); + + // Restore rear RGB LED status in selected theme color if connected + if (foundOBD2) { + updateRearLedTheme(); + } + + // 5. Wake LCD controller + tft.writecommand(0x11); // ST7789_SLPOUT + delay(120); + + // 6. Restore backlight smoothly according to current brightness setting (Auto LDR or Manual) + uint8_t wakeTarget = 255; + if (brightnessIndex > 0) { + wakeTarget = BRIGHTNESS_PWM_TABLE[brightnessIndex > 5 ? 5 : brightnessIndex]; + } else { + // Mode Auto: sample LDR sensor immediately to determine day or night + int light = analogRead(LDR_PIN); + if (light > LIGHT_LEVEL) { // Low light (night) + wakeTarget = 15; + dim = true; + low_count = 6; + high_count = 0; + } else { // Bright light (day) + wakeTarget = 255; + dim = false; + high_count = 6; + low_count = 0; + } + } + + // Smooth fade in to target brightness + for (int b = 0; b <= (int)wakeTarget; b += 15) { + ledcWrite(backlightChannel, b > wakeTarget ? wakeTarget : b); + delay(10); + } + ledcWrite(backlightChannel, wakeTarget); + currentBacklight = (float)wakeTarget; + targetBacklight = wakeTarget; + + // 7. Wake acoustic confirmation chirp + touchBeep(); + + // 8. Wait for touch to be fully released + waitForTouchRelease(); + + wokeFromSleep = true; +} + +void drawSleepHeader() { + tft.fillRectVGradient(0, 0, 320, 26, getThemeAccentColor(), getThemeDarkColor()); + tft.fillRect(0, 26, 320, 2, getThemePrimaryColor()); + tft.setTextColor(TFT_WHITE); + tft.drawCentreString("Modo Dormir", 160, 2, 4); +} + +void sleepMenu() { + tft.fillScreen(TFT_BLACK); + drawSleepHeader(); + + uint8_t subSel = 255; // 0: DORMIR, 1: SALIR + + auto drawSleepBottomButton = [&](uint8_t idx, bool isSel, bool isPressed) { + int16_t bx = (idx == 0) ? 14 : 166; + int16_t by = 166; + int16_t bw = 140; + int16_t bh = 48; + const char* label = (idx == 0) ? "DORMIR" : "SALIR"; + + uint16_t bgCol = isPressed ? getThemePrimaryColor() : getThemeAccentColor(); + uint16_t txtCol = isPressed ? TFT_BLACK : TFT_WHITE; + uint16_t borderCol = (isPressed || isSel) ? getThemePrimaryColor() : getThemeDarkColor(); + + tft.fillRoundRect(bx, by, bw, bh, 6, bgCol); + tft.drawRoundRect(bx, by, bw, bh, 6, borderCol); + if (isPressed || isSel) { + tft.drawRoundRect(bx + 1, by + 1, bw - 2, bh - 2, 5, TFT_WHITE); + } + tft.setTextColor(txtCol, bgCol); + tft.drawCentreString(label, bx + bw / 2, by + 12, 4); + }; + + auto drawSleepBottomButtons = [&](uint8_t sel) { + drawSleepBottomButton(0, sel == 0, false); + drawSleepBottomButton(1, sel == 1, false); + }; + + auto drawSleepUI = [&]() { + tft.fillRect(0, 28, 320, 134, TFT_BLACK); + + // 1. Inactivity Sleep Section Label + tft.setTextColor(TFT_WHITE, TFT_BLACK); + tft.drawCentreString("Auto-Sleep por Inactividad", 160, 38, 4); + tft.setTextColor(0xBDD7, TFT_BLACK); + tft.drawCentreString("(Apagado al detenerse el motor)", 160, 68, 2); + + // 2. 5 Direct Touch Tiles for Auto-Sleep Timeout: [OFF] [30s] [1m] [2m] [5m] + for (uint8_t i = 0; i < 5; i++) { + int16_t bx = 8 + i * 62; + int16_t by = 94; + int16_t bw = 56; + int16_t bh = 54; + bool isSel = (i == autoSleepIndex); + + uint16_t bgCol = isSel ? (i == 0 ? 0x3187 : getThemeAccentColor()) : getThemeDarkColor(); + uint16_t borderCol = isSel ? (i == 0 ? TFT_WHITE : getThemePrimaryColor()) : getThemeAccentColor(); + + tft.fillRoundRect(bx, by, bw, bh, 5, bgCol); + tft.drawRoundRect(bx, by, bw, bh, 5, borderCol); + if (isSel) { + tft.drawRoundRect(bx + 1, by + 1, bw - 2, bh - 2, 4, TFT_WHITE); + } + + tft.setTextColor(isSel ? TFT_WHITE : 0xBDD7, bgCol); + tft.drawCentreString(AUTO_SLEEP_NAME_TABLE[i], bx + bw / 2, by + 14, 4); + } + }; + + drawSleepUI(); + drawSleepBottomButtons(subSel); + waitForTouchRelease(); + + bool pressed = false; + long holdtimer = 0; + + while (true) { + autoDim(); + uint16_t tx = 0, ty = 0; + if (getTouch(&tx, &ty)) { + // 1. Tap on Auto-Sleep Timeout Tiles (y: 88 to 154) + if (ty >= 88 && ty <= 154) { + int8_t touchedTile = (tx - 8) / 62; + if (touchedTile >= 0 && touchedTile < 5) { + autoSleepIndex = touchedTile; + drawSleepUI(); + touchBeep(); + pref.begin("setting", false); + pref.putUChar("auto_sleep", autoSleepIndex); + pref.end(); + waitForTouchRelease(); + } + } + // 2. Tap on Bottom Buttons (y: 158 to 230) + else if (ty >= 158 && ty <= 230) { + if (tx >= 10 && tx <= 158) { + // [ DORMIR ] + drawSleepBottomButton(0, true, true); + touchBeep(); + delay(120); + waitForTouchRelease(); + enterLightSleep(); + if (wokeFromSleep) break; + // Redraw UI upon waking up + tft.fillScreen(TFT_BLACK); + drawSleepHeader(); + drawSleepUI(); + drawSleepBottomButtons(subSel); + waitForTouchRelease(); + } else if (tx >= 162 && tx <= 310) { + // [ SALIR ] + drawSleepBottomButton(1, true, true); + touchBeep(); + delay(120); + waitForTouchRelease(); + break; + } + } + } else if (digitalRead(SELECTOR_PIN) == LOW) { + if (!pressed) { + pressed = true; + holdtimer = millis(); + } else if (millis() - holdtimer > 1000) { + // Long press + if (subSel == 0) { + drawSleepBottomButton(0, true, true); + touchBeep(); + delay(120); + enterLightSleep(); + if (wokeFromSleep) break; + tft.fillScreen(TFT_BLACK); + drawSleepHeader(); + drawSleepUI(); + drawSleepBottomButtons(subSel); + waitForTouchRelease(); + } else { + drawSleepBottomButton(1, true, true); + touchBeep(); + delay(120); + break; + } + } + } else { + if (pressed) { + if (millis() - holdtimer >= 40 && millis() - holdtimer <= 1000) { + subSel = (subSel == 0) ? 1 : 0; + drawSleepBottomButtons(subSel); + clickSound(); + } + pressed = false; + delay(150); + } + } + yield(); + } +} + +// ------------------------------------------------------------- +// Sub-screen: Confirmacion de Reinicio de Placa +// ------------------------------------------------------------- +void restartConfirmationMenu() { + tft.fillScreen(TFT_BLACK); + tft.fillRectVGradient(0, 0, 320, 26, getThemeAccentColor(), getThemeDarkColor()); + tft.fillRect(0, 26, 320, 2, getThemePrimaryColor()); + tft.setTextColor(TFT_WHITE); + tft.drawCentreString("Reiniciar Dispositivo", 160, 2, 4); + + // Themed confirmation dialog card + tft.fillRoundRect(14, 44, 292, 104, 6, getThemeDarkColor()); + tft.drawRoundRect(14, 44, 292, 104, 6, getThemeAccentColor()); + tft.fillRoundRect(18, 50, 4, 92, 2, getThemePrimaryColor()); // Left accent pill + + tft.setTextColor(TFT_WHITE, getThemeDarkColor()); + tft.drawCentreString("Desea reiniciar la placa?", 160, 56, 4); + + tft.setTextColor(0xBDD7, getThemeDarkColor()); + tft.drawCentreString("El sistema se reiniciara", 160, 92, 2); + tft.drawCentreString("y volvera a conectar con el OBD2", 160, 112, 2); + + uint8_t subSel = 1; // 0: REINICIAR, 1: SALIR (por defecto SALIR para seguridad) + + auto drawSubButton = [&](uint8_t idx, bool isSel, bool isPressed) { + int16_t bx = (idx == 0) ? 14 : 166; + int16_t by = 166; + int16_t bw = 140; + int16_t bh = 48; + const char* label = (idx == 0) ? "REINICIAR" : "SALIR"; + + uint16_t bgCol = isPressed ? getThemePrimaryColor() : getThemeAccentColor(); + uint16_t txtCol = isPressed ? TFT_BLACK : TFT_WHITE; + uint16_t borderCol = (isPressed || isSel) ? getThemePrimaryColor() : getThemeDarkColor(); + + tft.fillRoundRect(bx, by, bw, bh, 6, bgCol); + tft.drawRoundRect(bx, by, bw, bh, 6, borderCol); + if (isPressed || isSel) { + tft.drawRoundRect(bx + 1, by + 1, bw - 2, bh - 2, 5, TFT_WHITE); + } + tft.setTextColor(txtCol, bgCol); + tft.drawCentreString(label, bx + bw / 2, by + 12, 4); + }; + + auto drawSubButtons = [&](uint8_t sel) { + drawSubButton(0, sel == 0, false); + drawSubButton(1, sel == 1, false); + }; + + drawSubButtons(subSel); + waitForTouchRelease(); + + bool pressed = false; + long holdtimer = 0; + + while (true) { + autoDim(); + uint16_t tx = 0, ty = 0; + if (getTouch(&tx, &ty)) { + if (ty >= 155 && ty <= 225) { + if (tx >= 10 && tx <= 158) { + // Confirmado: Reiniciar! + drawSubButton(0, true, true); + touchBeep(); + delay(120); + waitForTouchRelease(); + tft.fillScreen(TFT_BLACK); + tft.setTextColor(TFT_CYAN, TFT_BLACK); + tft.drawCentreString("Reiniciando...", 160, 105, 4); + delay(400); + ESP.restart(); + } else if (tx >= 162 && tx <= 310) { + // Salir + drawSubButton(1, true, true); + touchBeep(); + delay(120); + waitForTouchRelease(); + break; + } + } + } else if (digitalRead(SELECTOR_PIN) == LOW) { + if (!pressed) { + pressed = true; + holdtimer = millis(); + } else if (millis() - holdtimer > 1000) { + // Pulsacion larga: ejecutar opcion seleccionada + if (subSel == 0) { + drawSubButton(0, true, true); + touchBeep(); + delay(120); + tft.fillScreen(TFT_BLACK); + tft.setTextColor(TFT_CYAN, TFT_BLACK); + tft.drawCentreString("Reiniciando...", 160, 105, 4); + delay(400); + ESP.restart(); + } else { + drawSubButton(1, true, true); + touchBeep(); + delay(120); + break; + } + } + } else { + if (pressed) { + if (millis() - holdtimer >= 40 && millis() - holdtimer <= 1000) { + subSel = (subSel == 0) ? 1 : 0; + drawSubButtons(subSel); + clickSound(); + } + pressed = false; + delay(150); + } + } + yield(); + } +} + +// ------------------------------------------------------------- +// Sub-screen: Brillo de Pantalla (AUTO LDR y 5 Niveles Manuales) +// ------------------------------------------------------------- +void brightnessMenu() { + uint8_t curChoice = brightnessIndex; + bool pressed = false; + long holdtimer = 0; + tft.fillScreen(TFT_BLACK); + + auto applyBrightness = [](uint8_t idx) { + if (idx == 0) { + int light = analogRead(LDR_PIN); + targetBacklight = (light > LIGHT_LEVEL) ? 15 : 255; + } else { + targetBacklight = BRIGHTNESS_PWM_TABLE[idx > 5 ? 5 : idx]; + } + currentBacklight = (float)targetBacklight; + ledcWrite(backlightChannel, targetBacklight); + }; + + auto drawBrightnessUI = [&]() { + tft.fillRect(0, 0, 320, 180, TFT_BLACK); + + // 1. Status Card (y: 16 to 98, h: 82) + tft.fillRoundRect(10, 16, 300, 82, 5, getThemeDarkColor()); + tft.drawRoundRect(10, 16, 300, 82, 5, getThemeAccentColor()); + tft.fillRoundRect(12, 22, 4, 70, 2, getThemePrimaryColor()); + + tft.setTextColor(TFT_WHITE, getThemeDarkColor()); + if (brightnessIndex == 0) { + tft.drawString("Modo: AUTOMATICO", 24, 24, 4); + tft.setTextColor(0xBDD7, getThemeDarkColor()); + int lightVal = analogRead(LDR_PIN); + String ldrText = String("Sensor LDR: ") + (lightVal > LIGHT_LEVEL ? "Noche (Dim 15)" : "Dia (255)"); + tft.drawString(ldrText, 24, 50, 2); + } else { + String title = String("Modo: MANUAL (") + BRIGHTNESS_NAME_TABLE[brightnessIndex] + ")"; + tft.drawString(title, 24, 24, 4); + tft.setTextColor(0xBDD7, getThemeDarkColor()); + String sub = String("Nivel ") + String(brightnessIndex) + " de 5 fijo"; + tft.drawString(sub, 24, 50, 2); + } + + // Visual Progress Bar (y = 72, x = 20, w = 280, h = 16) + tft.fillRoundRect(20, 72, 280, 16, 4, 0x0841); + tft.drawRoundRect(20, 72, 280, 16, 4, getThemeDarkColor()); + + int fillW = 0; + if (brightnessIndex == 0) { + fillW = map((int)currentBacklight, 0, 255, 0, 276); + } else { + fillW = (brightnessIndex * 276) / 5; + } + if (fillW > 4) { + uint16_t barCol = (brightnessIndex == 0) ? getThemePrimaryColor() : (brightnessIndex >= 4 ? TFT_ORANGE : getThemeAccentColor()); + tft.fillRoundRect(22, 74, fillW, 12, 3, barCol); + } + + // 2. 6 Direct Touch Tiles (y: 112 to 170, h: 58) + for (uint8_t i = 0; i < 6; i++) { + int16_t bx = 7 + i * 52; + int16_t by = 112; + int16_t bw = 46; + int16_t bh = 58; + bool isSel = (i == brightnessIndex); + + uint16_t bgCol = isSel ? getThemePrimaryColor() : getThemeDarkColor(); + uint16_t borderCol = isSel ? TFT_WHITE : getThemeAccentColor(); + tft.fillRoundRect(bx, by, bw, bh, 5, bgCol); + tft.drawRoundRect(bx, by, bw, bh, 5, borderCol); + if (isSel) { + tft.drawRoundRect(bx + 1, by + 1, bw - 2, bh - 2, 4, TFT_WHITE); + } + tft.setTextColor(isSel ? TFT_BLACK : 0xAD55, bgCol); + if (i == 0) { + tft.drawCentreString("AUTO", bx + bw / 2, by + 20, 2); + } else { + tft.drawCentreString(String(i).c_str(), bx + bw / 2, by + 10, 6); + } + } + }; + + drawBrightnessUI(); + + // Bottom action button: [ SALIR ] (x: 80, y: 186, w: 160, h: 42) + drawExitButton(false); + waitForTouchRelease(); + + while (true) { + autoDim(); + uint16_t tx = 0, ty = 0; + + if (getTouch(&tx, &ty)) { + // 1. Direct Touch on Brightness Tiles (y: 106 to 176) + if (ty >= 106 && ty < 176) { + int8_t touchedTile = (tx - 7) / 52; + if (touchedTile >= 0 && touchedTile <= 5) { + brightnessIndex = touchedTile; + applyBrightness(brightnessIndex); + drawBrightnessUI(); + clickSound(); + } + waitForTouchRelease(); + } + // 2. Bottom button [ SALIR ] (y: 180 to 240) + else if (ty >= 180 && tx >= 20 && tx <= 300) { + pref.begin("setting", false); + pref.putUChar("b_bright", brightnessIndex); + pref.end(); + animateExitButtonPress(); + break; + } + } else if (digitalRead(SELECTOR_PIN) == LOW) { + if (!pressed) { + pressed = true; + holdtimer = millis(); + } else if (millis() - holdtimer > 1000) { + pref.begin("setting", false); + pref.putUChar("b_bright", brightnessIndex); + pref.end(); + animateExitButtonPress(); + break; + } + } else { + if (pressed) { + if (millis() - holdtimer >= 40 && millis() - holdtimer <= 1000) { + curChoice = (curChoice + 1) % 6; + brightnessIndex = curChoice; + applyBrightness(brightnessIndex); + drawBrightnessUI(); + clickSound(); + } + pressed = false; + delay(150); + } + } + yield(); + } +} + +// ------------------------------------------------------------- +// Sub-screen: Menu de Sonidos (Alarma y Click) +// ------------------------------------------------------------- +void soundsMenu() { + uint8_t choice = 255; + bool pressed = false; + long holdtimer = 0; + + auto drawSoundsUI = [&](uint8_t sel) { + tft.fillScreen(TFT_BLACK); + + // Card 0: Sonido de Alarma (y: 20 to 88, h: 68) + uint16_t bg0 = (sel == 0) ? getThemeAccentColor() : getThemeDarkColor(); + uint16_t border0 = (sel == 0) ? getThemePrimaryColor() : getThemeAccentColor(); + tft.fillRoundRect(10, 20, 300, 68, 5, bg0); + tft.drawRoundRect(10, 20, 300, 68, 5, border0); + if (sel == 0) { + tft.drawRoundRect(11, 21, 298, 66, 4, TFT_WHITE); + } else { + tft.fillRoundRect(13, 26, 4, 56, 2, getThemePrimaryColor()); + } + tft.setTextColor(TFT_WHITE, bg0); + tft.drawString("Sonido de Alarma", 24, 28, 4); + String almInfo = String(ALARM_NAME_TABLE[alarmSoundType > 5 ? 0 : alarmSoundType]) + " | " + + (alarmVolumeLevel == 0 ? "Silencio" : ("Vol: " + String(alarmVolumeLevel))); + tft.setTextColor((sel == 0) ? TFT_YELLOW : 0xBDD7, bg0); + tft.drawString(almInfo, 24, 58, 2); + + // Card 1: Sonido de Click (y: 102 to 170, h: 68) + uint16_t bg1 = (sel == 1) ? getThemeAccentColor() : getThemeDarkColor(); + uint16_t border1 = (sel == 1) ? getThemePrimaryColor() : getThemeAccentColor(); + tft.fillRoundRect(10, 102, 300, 68, 5, bg1); + tft.drawRoundRect(10, 102, 300, 68, 5, border1); + if (sel == 1) { + tft.drawRoundRect(11, 103, 298, 66, 4, TFT_WHITE); + } else { + tft.fillRoundRect(13, 108, 4, 56, 2, getThemePrimaryColor()); + } + tft.setTextColor(TFT_WHITE, bg1); + tft.drawString("Sonido de Click", 24, 110, 4); + String beepInfo = String(BEEP_NAME_TABLE[beepSoundType > 5 ? 0 : beepSoundType]) + " | " + + (buzzerVolumeLevel == 0 ? "Silencio" : ("Vol: " + String(buzzerVolumeLevel))); + tft.setTextColor((sel == 1) ? TFT_YELLOW : 0xBDD7, bg1); + tft.drawString(beepInfo, 24, 140, 2); + + // Bottom action button: [ SALIR ] (x: 80, y: 186, w: 160, h: 42) + drawExitButton(false); + if (sel == 2) { + tft.drawRoundRect(80, 186, 160, 42, 5, getThemePrimaryColor()); + tft.drawRoundRect(81, 187, 158, 40, 4, TFT_WHITE); + } + }; + + drawSoundsUI(choice); + waitForTouchRelease(); + + while (true) { + autoDim(); + int8_t executeSelect = -1; + uint16_t tx = 0, ty = 0; + + if (getTouch(&tx, &ty)) { + if (ty >= 16 && ty < 96) { + executeSelect = 0; + } else if (ty >= 96 && ty < 176) { + executeSelect = 1; + } else if (ty >= 178 && ty <= 240 && tx >= 20 && tx <= 300) { + executeSelect = 2; + } + + if (executeSelect >= 0) { + choice = executeSelect; + if (executeSelect == 2) { + animateExitButtonPress(); + break; + } else { + drawSoundsUI(choice); + touchBeep(); + waitForTouchRelease(); + } + } + } else if (digitalRead(SELECTOR_PIN) == LOW) { + if (!pressed) { + pressed = true; + holdtimer = millis(); + } else if (millis() - holdtimer > 1200) { + if (choice != 255) { + executeSelect = choice; + } + pressed = false; + } + } else { + if (pressed) { + if (millis() - holdtimer >= 40 && millis() - holdtimer <= 1200) { + if (choice == 255) choice = 0; + else choice = (choice + 1) % 3; + drawSoundsUI(choice); + clickSound(); + } + pressed = false; + delay(150); + } + } + + if (executeSelect >= 0) { + if (executeSelect == 0) { + alarmSoundMenu(); + choice = 255; + drawSoundsUI(choice); + waitForTouchRelease(); + } else if (executeSelect == 1) { + beepSoundMenu(); + choice = 255; + drawSoundsUI(choice); + waitForTouchRelease(); + } else if (executeSelect == 2) { + animateExitButtonPress(); + break; + } + pressed = false; + } + yield(); + } +} + +// ------------------------------------------------------------- +// Menu de Apariencia / Temas +// ------------------------------------------------------------- +void drawThemeHeader() { + tft.fillRectVGradient(0, 0, 320, 26, getThemeAccentColor(), getThemeDarkColor()); + tft.fillRect(0, 26, 320, 2, getThemePrimaryColor()); + tft.setTextColor(TFT_WHITE); + tft.drawCentreString("Apariencia / Temas", 160, 2, 4); +} + +void themeMenu() { + tft.fillScreen(TFT_BLACK); + + const char* const THEME_SHORT_NAMES[6] = { + "Cian", "Verde", "Ambar", "Blanco", "Naranja", "Violeta" + }; + + auto drawThemeUI = [&]() { + // Redraw screen header banner in newly selected theme colors + drawThemeHeader(); + + // Sincronizar LED RGB trasero con el tema seleccionado en tiempo real + updateRearLedTheme(); + + // 1. Live Menu UI & Divider Preview Card (y: 33 to 96, h: 64, x: 10, w: 300) + tft.fillRoundRect(10, 33, 300, 64, 5, 0x1082); + tft.drawRoundRect(10, 33, 300, 64, 5, GAUGE_THEMES[themeIndex].accentColor); + tft.drawRoundRect(11, 34, 298, 62, 4, 0x2104); + + // Left side: Theme Name and Description + tft.setTextColor(GAUGE_THEMES[themeIndex].primaryColor, 0x1082); + tft.drawString(GAUGE_THEMES[themeIndex].name, 20, 40, 4); + tft.setTextColor(0xAD55, 0x1082); + tft.drawString(GAUGE_THEMES[themeIndex].desc, 20, 69, 2); + + // Right side: Simulated Mini Vignette & Menu Preview + // Mini Instrument Vignette + Crosshair Line (x: 168, y: 39, w: 126, h: 18) + tft.fillRectVGradient(168, 39, 126, 12, GAUGE_THEMES[themeIndex].bgColor, TFT_BLACK); + tft.fillRect(168, 51, 126, 6, TFT_BLACK); + tft.fillRect(220, 39, 2, 18, GAUGE_THEMES[themeIndex].divColor); // Sample Crosshair line + tft.fillCircle(188, 48, 3, TFT_GREEN); // Sample green gauge block + tft.setTextColor(0xBDD7, TFT_BLACK); + tft.drawRightString("VIGNETTE", 290, 42, 1); + + // Mini Selected Card (x: 168, y: 62, w: 72, h: 28) + tft.fillRoundRect(168, 62, 72, 28, 4, GAUGE_THEMES[themeIndex].accentColor); + tft.drawRoundRect(168, 62, 72, 28, 4, GAUGE_THEMES[themeIndex].primaryColor); + tft.setTextColor(TFT_WHITE, GAUGE_THEMES[themeIndex].accentColor); + tft.drawCentreString("MENU", 204, 71, 2); + + // Mini Salir Button (x: 246, y: 62, w: 48, h: 28) + tft.fillRoundRect(246, 62, 48, 28, 4, GAUGE_THEMES[themeIndex].accentColor); + tft.drawRoundRect(246, 62, 48, 28, 4, GAUGE_THEMES[themeIndex].darkColor); + tft.setTextColor(TFT_WHITE, GAUGE_THEMES[themeIndex].accentColor); + tft.drawCentreString("SALIR", 270, 71, 2); + + // 2. 6 Theme Selection Tiles (y: 103 to 175, 2 rows of 3) + for (uint8_t i = 0; i < 6; i++) { + uint8_t row = i / 3; + uint8_t col = i % 3; + int16_t tx = 10 + col * 102; + int16_t ty = 103 + row * 38; + int16_t tw = 96; + int16_t th = 34; + bool isSel = (i == themeIndex); + + uint16_t bg = isSel ? GAUGE_THEMES[i].darkColor : 0x1082; + tft.fillRoundRect(tx, ty, tw, th, 5, bg); + + if (isSel) { + tft.drawRoundRect(tx, ty, tw, th, 5, GAUGE_THEMES[i].primaryColor); + tft.drawRoundRect(tx + 1, ty + 1, tw - 2, th - 2, 4, TFT_WHITE); + } else { + tft.drawRoundRect(tx, ty, tw, th, 5, 0x2104); + } + + // Circular color swatch with subtle halo + int16_t cx = tx + 16; + int16_t cy = ty + 17; + tft.drawCircle(cx, cy, 7, isSel ? TFT_WHITE : 0x4208); + tft.fillCircle(cx, cy, 5, GAUGE_THEMES[i].primaryColor); + + // Label + tft.setTextColor(isSel ? TFT_WHITE : 0xBDD7, bg); + tft.drawString(THEME_SHORT_NAMES[i], tx + 30, ty + 9, 2); + } + + // 3. Redraw Exit button in newly selected theme colors + drawExitButton(false); + }; + + drawThemeUI(); + waitForTouchRelease(); + + bool pressed = false; + long holdtimer = 0; + + while (true) { + autoDim(); + uint16_t tx = 0, ty = 0; + + if (getTouch(&tx, &ty)) { + // 1. Touch on theme tiles (y: 100 to 180) + if (ty >= 100 && ty < 182) { + uint8_t col = (tx < 110) ? 0 : ((tx < 212) ? 1 : 2); + uint8_t row = (ty < 140) ? 0 : 1; + uint8_t touchedIdx = row * 3 + col; + if (touchedIdx < 6) { + if (touchedIdx != themeIndex) { + themeIndex = touchedIdx; + pref.begin("setting", false); + pref.putUChar("theme_idx", themeIndex); + pref.end(); + touchBeep(); + drawThemeUI(); + } + } + waitForTouchRelease(); + } + // 2. Touch on [ SALIR ] button (y: 182 to 240) + else if (ty >= 182 && tx >= 20 && tx <= 300) { + animateExitButtonPress(); + break; + } + } else if (digitalRead(SELECTOR_PIN) == LOW) { + if (!pressed) { + pressed = true; + holdtimer = millis(); + } else if (millis() - holdtimer > 1000) { + animateExitButtonPress(); + break; + } + } else { + if (pressed) { + if (millis() - holdtimer >= 40 && millis() - holdtimer <= 1000) { + themeIndex = (themeIndex + 1) % 6; + pref.begin("setting", false); + pref.putUChar("theme_idx", themeIndex); + pref.end(); + touchBeep(); + drawThemeUI(); + } + pressed = false; + delay(150); + } + } + yield(); + } +} + +// ------------------------------------------------------------- +// Encabezado del Menu de Configuracion (Estilo Azul Oceano & Cian) +// ------------------------------------------------------------- +void drawConfigHeader() { + tft.fillRectVGradient(0, 0, 320, 26, getThemeAccentColor(), getThemeDarkColor()); + tft.fillRect(0, 26, 320, 2, getThemePrimaryColor()); + tft.setTextColor(TFT_WHITE); + tft.drawCentreString("Menu de Configuracion", 160, 2, 4); +} + +// ------------------------------------------------------------- +// Funciones de Botones de Scroll con Animacion Tactil +// ------------------------------------------------------------- +void drawScrollUpButton(bool canScroll, bool pressed) { + uint16_t bg = pressed ? getThemePrimaryColor() : (canScroll ? getThemeDarkColor() : 0x0841); + uint16_t fg = pressed ? TFT_BLACK : (canScroll ? getThemePrimaryColor() : 0x4208); + uint16_t border = pressed ? getThemePrimaryColor() : (canScroll ? getThemeAccentColor() : 0x2104); + + tft.fillRoundRect(268, 32, 42, 42, 5, bg); + tft.drawRoundRect(268, 32, 42, 42, 5, border); + if (pressed) { + tft.drawRoundRect(269, 33, 40, 40, 4, TFT_WHITE); + } + tft.fillTriangle(289, 42, 278, 58, 300, 58, fg); +} + +void drawScrollDownButton(bool canScroll, bool pressed) { + uint16_t bg = pressed ? getThemePrimaryColor() : (canScroll ? getThemeDarkColor() : 0x0841); + uint16_t fg = pressed ? TFT_BLACK : (canScroll ? getThemePrimaryColor() : 0x4208); + uint16_t border = pressed ? getThemePrimaryColor() : (canScroll ? getThemeAccentColor() : 0x2104); + + tft.fillRoundRect(268, 186, 42, 42, 5, bg); + tft.drawRoundRect(268, 186, 42, 42, 5, border); + if (pressed) { + tft.drawRoundRect(269, 187, 40, 40, 4, TFT_WHITE); + } + tft.fillTriangle(289, 214, 278, 198, 300, 198, fg); +} + +// ------------------------------------------------------------- +// Menu Principal con Scroll Lateral (Opcion 3) +// ------------------------------------------------------------- +void listMenu(uint8_t choice, uint8_t scrollOffset) { + // Clear list area, scroll column, and bottom area (y: 28 to 240) tft.fillRect(0, 28, 320, 212, TFT_BLACK); - for (uint8_t i = 0; i < maxMenu; i++) { - int y = 34 + i * 50; - if (choice == i) { - tft.fillRoundRect(10, y, 300, 42, 5, TFT_BLUE); - tft.drawRoundRect(10, y, 300, 42, 5, TFT_CYAN); - tft.drawRoundRect(11, y + 1, 298, 40, 4, TFT_CYAN); - tft.setTextColor(TFT_WHITE, TFT_BLUE); + // 1. Draw 3 visible cards from menuList[scrollOffset .. scrollOffset + 2] + for (uint8_t i = 0; i < 3; i++) { + uint8_t itemIdx = scrollOffset + i; + if (itemIdx >= 6) break; + + int y = 32 + i * 50; + bool isSel = (choice == itemIdx); + + uint16_t bgCol = isSel ? getThemeAccentColor() : getThemeDarkColor(); + uint16_t borderCol = isSel ? getThemePrimaryColor() : getThemeAccentColor(); + + tft.fillRoundRect(10, y, 250, 44, 5, bgCol); + tft.drawRoundRect(10, y, 250, 44, 5, borderCol); + if (isSel) { + tft.drawRoundRect(11, y + 1, 248, 42, 4, TFT_WHITE); } else { - tft.fillRoundRect(10, y, 300, 42, 5, 0x18E3); // subtle dark card - tft.setTextColor(TFT_WHITE, 0x18E3); + // Sleek vertical theme accent bar on the left of each item card + tft.fillRoundRect(13, y + 6, 4, 32, 2, getThemePrimaryColor()); } - tft.drawString(menuList[i], 22, y + 9, 4); + + tft.setTextColor(TFT_WHITE, bgCol); + tft.drawString(menuList[itemIdx], 26, y + 9, 4); + + // Chevron arrow '>' on right edge of card in theme primary color + tft.fillTriangle(248, y + 22, 242, y + 16, 242, y + 28, isSel ? TFT_WHITE : getThemePrimaryColor()); + } + + // 2. Right Scroll Column (x: 268 to 310, w: 42) + uint8_t maxScroll = 3; // 6 total items - 3 visible items = 3 + + // Up Button [ ▲ ] (x: 268, y: 32, w: 42, h: 42) + drawScrollUpButton(scrollOffset > 0, false); + + // Extended Middle Track & Thumb (y: 78 to 182, h: 104) + tft.fillRoundRect(286, 78, 6, 104, 3, 0x0841); + tft.drawRoundRect(286, 78, 6, 104, 3, getThemeDarkColor()); + int thumbY = 78 + (scrollOffset * 72) / maxScroll; + tft.fillRoundRect(286, thumbY, 6, 32, 3, getThemePrimaryColor()); + + // Down Button [ ▼ ] (x: 268, y: 186, w: 42, h: 42 - aligned with SALIR) + drawScrollDownButton(scrollOffset < maxScroll, false); + + // 3. Bottom action button: [ SALIR ] (x: 80, y: 186, w: 160, h: 42) + drawExitButton(false); + if (choice == 6) { + tft.drawRoundRect(80, 186, 160, 42, 5, getThemePrimaryColor()); + tft.drawRoundRect(81, 187, 158, 40, 4, TFT_WHITE); } } void configMenu() { - uint8_t select = 0; + uint8_t select = 255; + uint8_t scrollOffset = 0; + const uint8_t maxScroll = 3; // 6 items - 3 visible = 3 bool pressed = false; long holdtimer = 0; + tft.fillScreen(TFT_BLACK); - tft.fillRectVGradient(0, 0, 320, 26, TFT_ORANGE, 0xfc00); - tft.setTextColor(TFT_BLACK); - tft.drawCentreString("[--- Configuration Menu ---]", 159, 0, 4); - listMenu(select); - delay(300); + drawConfigHeader(); + listMenu(select, scrollOffset); + waitForTouchRelease(); while (true) { + if (wokeFromSleep) break; autoDim(); int8_t executeSelect = -1; @@ -406,36 +1401,102 @@ void configMenu() { if (getTouch(&tx, &ty)) { int8_t touchedOpt = -1; - if (ty >= 28 && ty < 80) touchedOpt = 0; - else if (ty >= 80 && ty < 130) touchedOpt = 1; - else if (ty >= 130 && ty < 180) touchedOpt = 2; - else if (ty >= 180 && ty <= 235) touchedOpt = 3; - if (touchedOpt >= 0) { - select = touchedOpt; - listMenu(select); - clickSound(); - while (isScreenPressed()) { - delay(10); - yield(); + // 1. Touch on bottom [ SALIR ] button (x: 10 to 264, y: 182 to 240) + if (ty >= 182 && ty <= 240 && tx >= 10 && tx < 265) { + touchedOpt = 6; // SALIR + } + // 2. Touch on the 3 visible cards (x: 10 to 264, y: 28 to 182) + else if (tx >= 10 && tx < 265) { + if (ty >= 28 && ty < 78) { + touchedOpt = scrollOffset + 0; + } else if (ty >= 78 && ty < 129) { + touchedOpt = scrollOffset + 1; + } else if (ty >= 129 && ty < 182) { + touchedOpt = scrollOffset + 2; + } + } + // 3. Touch on Scroll Column (x: 265 to 318) + else if (tx >= 265 && tx <= 318) { + // Up Button [ ▲ ] (y: 28 to 76) + if (ty >= 28 && ty <= 76) { + drawScrollUpButton(scrollOffset > 0, true); + touchBeep(); + if (scrollOffset > 0) { + scrollOffset--; + } + delay(100); + waitForTouchRelease(); + listMenu(select, scrollOffset); + } + // Down Button [ ▼ ] (y: 184 to 240 - aligned with SALIR) + else if (ty >= 184 && ty <= 240) { + drawScrollDownButton(scrollOffset < maxScroll, true); + touchBeep(); + if (scrollOffset < maxScroll) { + scrollOffset++; + } + delay(100); + waitForTouchRelease(); + listMenu(select, scrollOffset); + } + // Middle Track (y: 77 to 183) + else if (ty > 76 && ty < 184) { + if (ty < 130) { + drawScrollUpButton(scrollOffset > 0, true); + touchBeep(); + if (scrollOffset > 0) scrollOffset--; + } else { + drawScrollDownButton(scrollOffset < maxScroll, true); + touchBeep(); + if (scrollOffset < maxScroll) scrollOffset++; + } + delay(100); + waitForTouchRelease(); + listMenu(select, scrollOffset); + } + } + + if (touchedOpt >= 0 && touchedOpt < 7) { + select = touchedOpt; + if (select == 6) { + animateExitButtonPress(); + break; + } else { + listMenu(select, scrollOffset); + clickSound(); + waitForTouchRelease(); + executeSelect = select; } - delay(80); - executeSelect = select; } } else if (digitalRead(SELECTOR_PIN) == LOW) { if (!pressed) { pressed = true; holdtimer = millis(); } else if (millis() - holdtimer > 1200) { - executeSelect = select; + if (select != 255) { + executeSelect = select; + } pressed = false; } } else { if (pressed) { if (millis() - holdtimer >= 40 && millis() - holdtimer <= 1200) { - select++; - if (select >= maxMenu) select = 0; - listMenu(select); + if (select == 255) { + select = scrollOffset; + } else { + select++; + if (select >= maxMenu) select = 0; + } + // Auto-scroll to keep selected card visible + if (select < 6) { + if (select < scrollOffset) { + scrollOffset = select; + } else if (select >= scrollOffset + 3) { + scrollOffset = select - 2; + } + } + listMenu(select, scrollOffset); clickSound(); } pressed = false; @@ -446,35 +1507,63 @@ void configMenu() { if (executeSelect >= 0) { select = executeSelect; - // Option 0: Activacion de Alarmas (ON/OFF) + // Option 0: Alarmas (ON/OFF) if (select == 0) { warningMenu(); tft.fillScreen(TFT_BLACK); - tft.fillRectVGradient(0, 0, 320, 26, TFT_ORANGE, 0xfc00); - tft.setTextColor(TFT_BLACK); - tft.drawCentreString("[--- Configuration Menu ---]", 159, 0, 4); - listMenu(select); + drawConfigHeader(); + select = 255; + listMenu(select, scrollOffset); + waitForTouchRelease(); } - // Option 1: Sonido de Alarma (Tipo de Sonido y Volumen) + // Option 1: Sonidos (Menu de Sonido de Alarma y Sonido de Click) else if (select == 1) { - alarmSoundMenu(); + soundsMenu(); tft.fillScreen(TFT_BLACK); - tft.fillRectVGradient(0, 0, 320, 26, TFT_ORANGE, 0xfc00); - tft.setTextColor(TFT_BLACK); - tft.drawCentreString("[--- Configuration Menu ---]", 159, 0, 4); - listMenu(select); + drawConfigHeader(); + select = 255; + listMenu(select, scrollOffset); + waitForTouchRelease(); } - // Option 2: Volumen de Bip (Toques de pantalla) + // Option 2: Brillo de Pantalla else if (select == 2) { - volumeMenu(); + brightnessMenu(); tft.fillScreen(TFT_BLACK); - tft.fillRectVGradient(0, 0, 320, 26, TFT_ORANGE, 0xfc00); - tft.setTextColor(TFT_BLACK); - tft.drawCentreString("[--- Configuration Menu ---]", 159, 0, 4); - listMenu(select); + drawConfigHeader(); + select = 255; + listMenu(select, scrollOffset); + waitForTouchRelease(); } - // Option 3: Exit + // Option 3: Apariencia / Temas else if (select == 3) { + themeMenu(); + tft.fillScreen(TFT_BLACK); + drawConfigHeader(); + select = 255; + listMenu(select, scrollOffset); + waitForTouchRelease(); + } + // Option 4: Modo Dormir + else if (select == 4) { + sleepMenu(); + tft.fillScreen(TFT_BLACK); + drawConfigHeader(); + select = 255; + listMenu(select, scrollOffset); + waitForTouchRelease(); + } + // Option 5: Reiniciar + else if (select == 5) { + restartConfirmationMenu(); + tft.fillScreen(TFT_BLACK); + drawConfigHeader(); + select = 255; + listMenu(select, scrollOffset); + waitForTouchRelease(); + } + // Option 6: Exit + else if (select == 6) { + animateExitButtonPress(); break; } diff --git a/sketch/obd2_gauge/image.h b/sketch/obd2_gauge/image.h index 3b8e94b..1061e2c 100644 --- a/sketch/obd2_gauge/image.h +++ b/sketch/obd2_gauge/image.h @@ -8025,7 +8025,7 @@ static const unsigned short icon_battery_32[1024] PROGMEM = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, }; -// Header Icon: icon_temp_42 (42x42 px, 1764 elements, RGB565 Big-Endian) +// Header Icon: icon_temp_42 (1764 elements, RGB565 True Color) static const unsigned short icon_temp_42[1764] PROGMEM = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -8036,111 +8036,226 @@ static const unsigned short icon_temp_42[1764] PROGMEM = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x41E7, 0xC618, 0xFF9E, 0xF7BE, 0xC617, 0x39E7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x62EC, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0x5B0C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20C3, 0xF7BE, 0xFFFF, 0xFFFF, - 0xB596, 0xB5B6, 0xFFDF, 0xFFFF, 0xF79D, 0x18E3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x632D, 0xFFFF, 0xFFFF, 0x6B4D, 0x1082, 0x1082, 0x6B6E, 0xFFFF, 0xFFFF, 0x630C, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFF5B, 0xFFDF, 0xFF9E, 0xFFFF, 0xFFDE, 0xF7FE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x9491, 0xFFFF, 0xFFFF, 0x2104, 0x1082, 0x1082, 0x20E3, 0xFFFF, 0xFFF8, 0xC5AE, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE60, 0xFE40, - 0x5A64, 0x0820, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x94D3, 0xFFFF, 0xFFFF, 0x18A3, 0x1082, 0x1082, - 0x10C3, 0xFFFF, 0xFFF6, 0xDE0D, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0x83A7, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xFF9F, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xEFDF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x9CB2, 0xFFFF, 0xFFFF, 0x18C3, 0x1082, 0x1082, 0x18C2, 0xFFFF, 0xFFFE, 0xA4F2, 0x6260, 0x62A0, - 0x6A80, 0x6AA0, 0x6A80, 0x5A40, 0x1040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x94D3, 0xFFFF, - 0xFFFF, 0x18A3, 0x38C4, 0x38C3, 0x10C3, 0xFFFF, 0xFFFF, 0x9CB3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFDD7, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFDF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFDE, 0xDFFB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9CB2, 0xFFFF, 0xFFBE, 0x4165, 0xFA08, 0xFA28, 0x4145, 0xFFDF, - 0xFFFF, 0x9CD3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x94D3, 0xFFFF, 0xFFBF, 0x61A7, 0xFA29, 0xFA08, 0x59C7, 0xFF9E, 0xFFFB, 0xB550, 0xBCA0, 0xBCA0, 0xBCA0, 0xBCA0, - 0xBCA0, 0xBCA0, 0xBCA0, 0xBCA0, 0x8BE7, 0x1840, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9CB2, 0xFFFF, 0xFF9E, 0x61C7, - 0xFA28, 0xFA28, 0x61C6, 0xFFBE, 0xFFF4, 0xDE2D, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xEE49, 0x51C0, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x94D3, 0xFFFF, 0xFFBF, 0x61A7, 0xFA29, 0xFA08, 0x61C7, 0xFF9E, 0xFFFD, 0xAD31, - 0x93E0, 0x9BC0, 0x93E0, 0x9BC0, 0x93E0, 0x9BC0, 0x93E0, 0x9BC0, 0x6B26, 0x1020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x9CB2, 0xFFFF, 0xFF9E, 0x61C7, 0xFA28, 0xFA28, 0x61C6, 0xFFBE, 0xFFFF, 0x9CD3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x94D3, 0xFFFF, 0xFFBF, 0x61A7, 0xFA29, 0xFA08, - 0x61C7, 0xFF9E, 0xFFFF, 0x9CB3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x9CB2, 0xFFFF, 0xFF9E, 0x61C7, 0xFA28, 0xFA28, 0x61C6, 0xFFBE, 0xFFFD, 0xA511, 0x7AE0, 0x7300, - 0x7AE0, 0x7300, 0x7AE0, 0x7300, 0x1881, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x94D3, 0xFFFF, - 0xFFBF, 0x934D, 0xFA29, 0xFA08, 0x934D, 0xFF9E, 0xFFF5, 0xDE0D, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0x8BE8, 0x1000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xA4D3, 0xFFFF, 0xFF9E, 0xE5D7, 0xFA28, 0xFA28, 0xE5B6, 0xFFBE, - 0xFFF9, 0xBDB0, 0xE580, 0xDDA0, 0xE580, 0xDDA0, 0xE580, 0xDD60, 0x49E3, 0x0820, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x1061, 0xEF5D, 0xFFFF, 0xFFBF, 0xE5B7, 0xFA29, 0xFA08, 0xDDD7, 0xFF9E, 0xFFFF, 0xEF3D, 0x0862, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xAD75, 0xFFFF, 0xFFFF, 0xFE9A, 0xD3EF, - 0xFA28, 0xFA28, 0xDBCF, 0xFEBA, 0xFFFF, 0xFFFF, 0xAD54, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x31C7, 0xFFFF, 0xFFDF, 0xF6FC, 0xFA6A, 0xFA28, 0xFA29, 0xFA08, 0xFA29, 0xFA69, 0xF71C, 0xFFDF, - 0xFFFF, 0x39A6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9492, 0xFFFF, - 0xFF5C, 0xCC10, 0xFA28, 0xFA28, 0xFA28, 0xFA28, 0xFA28, 0xFA28, 0xD410, 0xFF7D, 0xFFFF, 0x9492, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xBE18, 0xFFFF, 0xFE9A, 0xCACB, 0xFA29, 0xFA08, 0xFA29, 0xFA08, - 0xFA29, 0xFA08, 0xC2EC, 0xFE9A, 0xFFFF, 0xC5F8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0xD659, 0xFFFF, 0xFE59, 0xCAEB, 0xFA28, 0xFA28, 0xFA28, 0xFA28, 0xFA28, 0xFA28, 0xCACB, 0xFE59, 0xFFFF, 0xCE59, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xAD96, 0xFFFF, 0xFF1C, 0xC32C, - 0xFA29, 0xFA08, 0xFA29, 0xFA08, 0xFA29, 0xFA08, 0xC34D, 0xFEFB, 0xFFFF, 0xB575, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6B4D, 0xFFFF, 0xFF9D, 0xDD96, 0xFA28, 0xFA28, 0xFA28, 0xFA28, 0xFA28, 0xFA28, - 0xE575, 0xFF9E, 0xFFFF, 0x6B4D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0862, 0xEF3D, 0xFFFF, 0xFFFF, 0xFC51, 0xE28A, 0xFA29, 0xFA08, 0xE28A, 0xFC31, 0xFFFF, 0xFFFF, 0xE75D, 0x0841, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x1020, 0x41E3, 0x9BA0, 0xB4C2, 0xD520, 0xC4C0, 0x93A2, 0x5A20, 0x0820, 0x0000, 0x0000, 0x4A8A, 0xFFFF, 0xFFFF, 0xFFDF, 0xF75D, - 0xFDB6, 0xFDB6, 0xFF5C, 0xFFFF, 0xFFFF, 0xFFFF, 0xACCB, 0x3980, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0820, 0x62A5, 0xE5C0, 0xFE41, 0xFE60, 0xFE40, 0xFE60, 0xFE40, - 0xFE60, 0xFE40, 0xDDC6, 0x8AE0, 0x0861, 0x0000, 0x52CB, 0xF79E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFF7, 0xEED2, - 0xFE60, 0xFE40, 0xBCE6, 0x6220, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0820, 0x5204, 0x5245, 0x1000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x61E0, 0xEE49, 0xFE40, 0xFE60, 0xFE60, 0xEDE0, 0xDD40, 0xE5C1, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xEE04, 0x9BA0, - 0x49C1, 0x4A22, 0xBD72, 0xFFBB, 0xFFFF, 0xFFFF, 0xFFD8, 0xF735, 0xE5A1, 0xE5E2, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xD564, 0x8B40, - 0x49C0, 0x3160, 0x51E0, 0x7B43, 0xE580, 0xFE62, 0xEE48, 0x59E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x3920, 0xDDE9, 0xE5E6, 0x9340, - 0x18C2, 0x0800, 0x0000, 0x0000, 0x20C0, 0x72E4, 0xEDE0, 0xFE41, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE62, 0xF600, - 0x5A85, 0x1020, 0x0000, 0x0000, 0x3940, 0x93E5, 0xFE40, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, - 0xDE0A, 0x4100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0841, 0x0820, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x1840, 0x5AA4, 0xE560, 0xFE62, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0x9C26, 0x28C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x30C0, 0x83A5, 0xF5E0, 0xFE61, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xE5A4, 0x9380, 0x1881, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x1061, 0x5220, 0x7B22, 0x8361, 0x8320, 0x4A23, 0x2080, 0x0000, 0x0000, 0x0000, 0x2902, 0x5A40, 0x6A80, - 0x4A03, 0x2080, 0x0000, 0x0000, 0x3960, 0x6AC3, 0x8361, 0x8320, 0x41E3, 0x1040, 0x0000, 0x0000, 0x0820, 0x3142, 0x5A60, 0x6A80, - 0x5242, 0x3920, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x2922, 0xBC40, 0xEE44, 0xFE40, 0xFE60, - 0xFE40, 0xFE60, 0xFE40, 0xFE40, 0xAC65, 0x4180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4960, 0xBD27, 0xFE40, 0xFE60, - 0xFE40, 0xFE60, 0xFE40, 0xF600, 0x8365, 0x28C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x18C1, 0x20C1, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x4960, 0xE62A, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, - 0xB4C6, 0x6200, 0x0841, 0x0000, 0x20C0, 0x7B45, 0xFE40, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE61, 0xFE20, - 0x8BC5, 0x4980, 0x0021, 0x0000, 0x0840, 0x39A2, 0xAC20, 0xF624, 0xE64A, 0x4940, 0x0000, 0x0000, 0x0000, 0x0000, 0x59A0, 0xEE49, - 0xFE42, 0xCCE0, 0x6262, 0x3120, 0x1860, 0x2101, 0x6A60, 0xACA4, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xF620, 0xFE40, 0xFE60, - 0xFE40, 0xFE60, 0x9C04, 0x49A0, 0x1880, 0x2901, 0x82C0, 0xD585, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xF600, 0xFE40, 0xFE60, - 0xFE40, 0xFE60, 0xEE49, 0x51A0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3963, 0x2963, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x4160, 0x9C25, 0xFE40, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xD5A7, 0x61E0, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x6240, 0xCD26, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xF663, 0xD500, 0x41E4, 0x0800, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x28C0, 0x62C4, - 0xA3E0, 0xAC41, 0x9382, 0x5A20, 0x0820, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3940, 0x6AE3, - 0xA3E0, 0xAC41, 0x9BE2, 0x72E0, 0x2902, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xEF9F, 0xFFFF, 0xFFFF, 0xFFDF, 0x0000, 0x0000, 0xEF9F, 0xFFFF, 0xFFFF, 0xFFDF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, + 0xFFFE, 0xFFFF, 0xFFFF, 0xFFBF, 0x0000, 0x0000, 0xFED7, 0xFFFF, 0xFFF8, 0xFF52, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE60, 0xFE40, + 0xFECB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF7FF, 0xFFFF, 0xFFFF, 0xFEBF, 0x0000, 0x0000, + 0xAFFF, 0xFFFF, 0xFFF6, 0xFF0F, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFF0D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xFFBE, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0xFFF5, 0xFFFF, 0xFFFE, 0xFFBC, 0xFE20, 0xFEC0, + 0xFE00, 0xFE40, 0xFE00, 0xFE60, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF7FF, 0xFFFF, + 0xFFFF, 0xFEBF, 0xFB52, 0xFB4D, 0xAFFF, 0xFFFF, 0xFFFF, 0xFFBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFBE, 0xFFFF, 0xFFBE, 0xFD53, 0xFA08, 0xFA28, 0xFCD3, 0xFFDF, + 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0xF7FF, 0xFFFF, 0xFFBF, 0xFC32, 0xFA29, 0xFA08, 0xFCF4, 0xFF9E, 0xFFFB, 0xFF97, 0xFE40, 0xFE40, 0xFE40, 0xFE40, + 0xFE40, 0xFE40, 0xFE40, 0xFE40, 0xFF2D, 0xFAA0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFBE, 0xFFFF, 0xFF9E, 0xFC92, + 0xFA28, 0xFA28, 0xFC8F, 0xFFBE, 0xFFF4, 0xFF2F, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFEC9, 0xFD60, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF7FF, 0xFFFF, 0xFFBF, 0xFC32, 0xFA29, 0xFA08, 0xFC92, 0xFF9E, 0xFFFD, 0xFFB9, + 0xFEA0, 0xFE20, 0xFEA0, 0xFE20, 0xFEA0, 0xFE20, 0xFEA0, 0xFE20, 0xFF8E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xFFBE, 0xFFFF, 0xFF9E, 0xFC92, 0xFA28, 0xFA28, 0xFC8F, 0xFFBE, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF7FF, 0xFFFF, 0xFFBF, 0xFC32, 0xFA29, 0xFA08, + 0xFC92, 0xFF9E, 0xFFFF, 0xFFBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xFFBE, 0xFFFF, 0xFF9E, 0xFC92, 0xFA28, 0xFA28, 0xFC8F, 0xFFBE, 0xFFFD, 0xFFDB, 0xFE00, 0xFEA0, + 0xFE00, 0xFEA0, 0xFE00, 0xFEA0, 0xFD4A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF7FF, 0xFFFF, + 0xFFBF, 0xFDB7, 0xFA29, 0xFA08, 0xFDB7, 0xFF9E, 0xFFF5, 0xFF0F, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFF2F, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFF7E, 0xFFFF, 0xFF9E, 0xFE7A, 0xFA28, 0xFA28, 0xFE59, 0xFFBE, + 0xFFF9, 0xFFB6, 0xFE20, 0xFE80, 0xFE20, 0xFE80, 0xFE20, 0xFE40, 0xFE6A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0xFFDF, 0xFFFF, 0xFFBF, 0xFE5A, 0xFA29, 0xFA08, 0xFEBB, 0xFF9E, 0xFFFF, 0xFFBF, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFE9A, 0xFCB2, + 0xFA28, 0xFA28, 0xFC51, 0xFEBA, 0xFFFF, 0xFFFF, 0xFFDE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xDFDF, 0xFFFF, 0xFFDF, 0xFF3D, 0xFA6A, 0xFA28, 0xFA29, 0xFA08, 0xFA29, 0xFA69, 0xFF5D, 0xFFDF, + 0xFFFF, 0xFF5B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, + 0xFF5C, 0xFD14, 0xFA28, 0xFA28, 0xFA28, 0xFA28, 0xFA28, 0xFA28, 0xFCD3, 0xFF7D, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF7DF, 0xFFFF, 0xFE9A, 0xFB6D, 0xFA29, 0xFA08, 0xFA29, 0xFA08, + 0xFA29, 0xFA08, 0xFBD0, 0xFE9A, 0xFFFF, 0xFFBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0xFF9E, 0xFFFF, 0xFE59, 0xFB8D, 0xFA28, 0xFA28, 0xFA28, 0xFA28, 0xFA28, 0xFA28, 0xFB6D, 0xFE59, 0xFFFF, 0xFFDF, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF7DF, 0xFFFF, 0xFF1C, 0xFC10, + 0xFA29, 0xFA08, 0xFA29, 0xFA08, 0xFA29, 0xFA08, 0xFC31, 0xFEFB, 0xFFFF, 0xFFBE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFDF, 0xFFFF, 0xFF9D, 0xFE7A, 0xFA28, 0xFA28, 0xFA28, 0xFA28, 0xFA28, 0xFA28, + 0xFE17, 0xFF9E, 0xFFFF, 0xFFDF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xFFBF, 0xFFFF, 0xFFFF, 0xFC51, 0xFACB, 0xFA29, 0xFA08, 0xFACB, 0xFC31, 0xFFFF, 0xFFFF, 0xF7DF, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xFF4B, 0xFDE0, 0xFEC2, 0xFE20, 0xFE20, 0xFE43, 0xFE20, 0x0000, 0x0000, 0x0000, 0xE7FF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFF9E, + 0xFDB6, 0xFDB6, 0xFF5C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFF10, 0xFEA0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFECD, 0xFE60, 0xFE41, 0xFE60, 0xFE40, 0xFE60, 0xFE40, + 0xFE60, 0xFE40, 0xFEA7, 0xFD40, 0x0000, 0x0000, 0xEFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFF7, 0xFF53, + 0xFE60, 0xFE40, 0xFEA8, 0xFD80, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFE4C, 0xFF10, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0xFCC0, 0xFEC9, 0xFE40, 0xFE60, 0xFE60, 0xFE40, 0xFE00, 0xFE61, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE84, 0xFDE0, + 0xFE03, 0xFF66, 0xFF59, 0xFFBB, 0xFFFF, 0xFFFF, 0xFFD8, 0xFF76, 0xFE41, 0xFE82, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE64, 0xFDE0, + 0xFE00, 0xFF20, 0xFDC0, 0xFEC6, 0xFE20, 0xFE62, 0xFEC8, 0xFD40, 0x0000, 0x0000, 0x0000, 0x0000, 0xFD00, 0xFECA, 0xFE86, 0xFDA0, + 0xFFF5, 0x0000, 0x0000, 0x0000, 0xFDC0, 0xFE69, 0xFE40, 0xFE41, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE62, 0xFE40, + 0xFF2E, 0x0000, 0x0000, 0x0000, 0xFD80, 0xFEA8, 0xFE40, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, + 0xFF0B, 0xFBE0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xFAA0, 0xFF8B, 0xFE00, 0xFE62, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFECA, 0xFCA0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xFBE0, 0xFF09, 0xFE20, 0xFE61, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE44, 0xFE00, 0xFD4A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xFEA0, 0xFE84, 0xFE81, 0xFE00, 0xFF6A, 0xFBE0, 0x0000, 0x0000, 0x0000, 0xFE2C, 0xFE60, 0xFE00, + 0xFF0A, 0xFBE0, 0x0000, 0x0000, 0xFE20, 0xFEA7, 0xFE81, 0xFE00, 0xFF4B, 0x0000, 0x0000, 0x0000, 0x0000, 0xFE8A, 0xFEC0, 0xFE00, + 0xFF06, 0xFD00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFF0C, 0xFDC0, 0xFEC4, 0xFE40, 0xFE60, + 0xFE40, 0xFE60, 0xFE40, 0xFE40, 0xFE87, 0xFDC0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFCC0, 0xFF09, 0xFE40, 0xFE60, + 0xFE40, 0xFE60, 0xFE40, 0xFE40, 0xFE89, 0xFCA0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFEA, 0xFDC7, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xFCC0, 0xFEEB, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, + 0xFEC8, 0xFD20, 0x0000, 0x0000, 0xFDC0, 0xFECA, 0xFE40, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE61, 0xFE20, + 0xFEE9, 0xFD20, 0x0000, 0x0000, 0x0000, 0xFF49, 0xFE20, 0xFE64, 0xFF0B, 0xFC40, 0x0000, 0x0000, 0x0000, 0x0000, 0xFC80, 0xFEC9, + 0xFE42, 0xFE20, 0xFE25, 0xFDC0, 0xFC00, 0xFFA7, 0xFDC0, 0xFEE6, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, + 0xFE40, 0xFE60, 0xFEA6, 0xFD80, 0xFD40, 0xFE26, 0xFD60, 0xFEA6, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE40, 0xFE40, 0xFE60, + 0xFE40, 0xFE60, 0xFEC9, 0xFD00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFE2D, 0xEFF1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0xFD40, 0xFEC8, 0xFE40, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFEC8, 0xFCC0, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0xFDE0, 0xFE67, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFEA3, 0xFE00, 0xFF50, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFCA0, 0xFF2A, + 0xFE00, 0xFE41, 0xFE03, 0xFE20, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFD80, 0xFEE7, + 0xFE00, 0xFE41, 0xFE63, 0xFE60, 0xFE2C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000 }; -// Header Icon: icon_speed_42 (42x42 px, 1764 elements, RGB565 Big-Endian) +// Header Icon Alpha: icon_temp_42_alpha (1764 elements, 8-bit Alpha Mask) +static const unsigned char icon_temp_42_alpha[1764] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xC6, 0xFF, 0xF7, 0xC6, 0x3C, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x63, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0xF7, 0xFF, 0xFF, + 0xB5, 0xB6, 0xFF, 0xFF, 0xF7, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xFF, 0xFF, 0x6B, 0x00, 0x00, 0x73, 0xFF, 0xFF, 0x63, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x94, 0xFF, 0xFF, 0x21, 0x00, 0x00, 0x21, 0xFF, 0xFF, 0xC6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9C, 0xFF, 0xFF, 0x18, 0x00, 0x00, + 0x18, 0xFF, 0xFF, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x9C, 0xFF, 0xFF, 0x18, 0x00, 0x00, 0x18, 0xFF, 0xFF, 0xA5, 0x63, 0x63, + 0x6B, 0x6B, 0x6B, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9C, 0xFF, + 0xFF, 0x18, 0x39, 0x39, 0x18, 0xFF, 0xFF, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9C, 0xFF, 0xFF, 0x42, 0xFF, 0xFF, 0x42, 0xFF, + 0xFF, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x9C, 0xFF, 0xFF, 0x63, 0xFF, 0xFF, 0x5A, 0xFF, 0xFF, 0xB5, 0xBD, 0xBD, 0xBD, 0xBD, + 0xBD, 0xBD, 0xBD, 0xBD, 0x8C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9C, 0xFF, 0xFF, 0x63, + 0xFF, 0xFF, 0x63, 0xFF, 0xFF, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0x52, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9C, 0xFF, 0xFF, 0x63, 0xFF, 0xFF, 0x63, 0xFF, 0xFF, 0xAD, + 0x94, 0x9C, 0x94, 0x9C, 0x94, 0x9C, 0x94, 0x9C, 0x6B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x9C, 0xFF, 0xFF, 0x63, 0xFF, 0xFF, 0x63, 0xFF, 0xFF, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9C, 0xFF, 0xFF, 0x63, 0xFF, 0xFF, + 0x63, 0xFF, 0xFF, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x9C, 0xFF, 0xFF, 0x63, 0xFF, 0xFF, 0x63, 0xFF, 0xFF, 0xA5, 0x7B, 0x73, + 0x7B, 0x73, 0x7B, 0x73, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9C, 0xFF, + 0xFF, 0x94, 0xFF, 0xFF, 0x94, 0xFF, 0xFF, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8C, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA5, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xE7, 0xFF, + 0xFF, 0xBD, 0xE7, 0xDE, 0xE7, 0xDE, 0xE7, 0xDE, 0x4A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xEF, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xDE, 0xFF, 0xFF, 0xEF, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAE, 0xFF, 0xFF, 0xFF, 0xD6, + 0xFF, 0xFF, 0xDE, 0xFF, 0xFF, 0xFF, 0xAD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x39, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, + 0xFF, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0xFF, + 0xFF, 0xCE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD6, 0xFF, 0xFF, 0x94, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xFF, 0xFF, 0xCE, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xC6, 0xFF, 0xFF, 0xC6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xD6, 0xFF, 0xFF, 0xCE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0xFF, 0xFF, 0xCE, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB5, 0xFF, 0xFF, 0xC6, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC6, 0xFF, 0xFF, 0xB5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xFF, 0xFF, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xE7, 0xFF, 0xFF, 0x6B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xEF, 0xFF, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xFF, 0xEF, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x42, 0x9C, 0xB5, 0xD6, 0xC6, 0x94, 0x5A, 0x00, 0x00, 0x00, 0x52, 0xFF, 0xFF, 0xFF, 0xF7, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAD, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xDE, 0x8C, 0x00, 0x00, 0x5A, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, + 0xFF, 0xFF, 0xBD, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x52, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x63, 0xEF, 0xFF, 0xFF, 0xFF, 0xEF, 0xDE, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0x9C, + 0x4A, 0x4A, 0xBD, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xE7, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xD6, 0x8C, + 0x4A, 0x31, 0x52, 0x7B, 0xE7, 0xFF, 0xEF, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x39, 0xDE, 0xE7, 0x94, + 0x18, 0x00, 0x00, 0x00, 0x21, 0x73, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, + 0x5A, 0x00, 0x00, 0x00, 0x39, 0x94, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xDE, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x5A, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9C, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x31, 0x84, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x94, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x52, 0x7B, 0x84, 0x84, 0x4A, 0x21, 0x00, 0x00, 0x00, 0x29, 0x5A, 0x6B, + 0x4A, 0x21, 0x00, 0x00, 0x39, 0x6B, 0x84, 0x84, 0x42, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5A, 0x6B, + 0x52, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0xBD, 0xEF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xAD, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xBD, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xF7, 0x84, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x21, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xB5, 0x63, 0x00, 0x00, 0x21, 0x7B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x8C, 0x4A, 0x00, 0x00, 0x00, 0x39, 0xAD, 0xF7, 0xE7, 0x4A, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xEF, + 0xFF, 0xCE, 0x63, 0x31, 0x18, 0x21, 0x6B, 0xAD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, + 0xFF, 0xFF, 0x9C, 0x4A, 0x18, 0x29, 0x84, 0xD6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, + 0xFF, 0xFF, 0xEF, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x42, 0x9C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD6, 0x63, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x63, 0xCE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xD6, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x63, + 0xA5, 0xAD, 0x94, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x6B, + 0xA5, 0xAD, 0x9C, 0x73, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00 +}; + +// Header Icon: icon_speed_42 (1764 elements, RGB565 True Color) static const unsigned short icon_speed_42[1764] PROGMEM = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -8153,95 +8268,90 @@ static const unsigned short icon_speed_42[1764] PROGMEM = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1081, 0x528A, 0x83EF, 0x94B2, 0xB575, 0xAD75, 0x9C92, 0x7C10, - 0x528A, 0x1082, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0821, - 0x632D, 0xCE39, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xC639, 0x630C, 0x0021, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x736D, 0xE73D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, - 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF3C, 0x6B8E, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x1904, 0xC618, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF7E, 0xAD35, 0x6B4D, 0x5289, 0x4A46, 0x5246, 0x528A, 0x6B2C, 0xA555, 0xEF5D, - 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xC619, 0x20E3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4A49, 0xF77D, 0xFFFF, 0xFFFF, 0xFFFF, 0xCE59, 0x528A, - 0x0800, 0x0000, 0x0800, 0x4A04, 0xFE40, 0xFE60, 0x49E3, 0x0800, 0x0000, 0x0020, 0x528A, 0xCE59, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF7E, - 0x4A48, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x4229, 0xFFBE, 0xFFFF, 0xFFFF, 0xEF7E, 0x528A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x49E4, 0xFE60, 0xFE40, - 0x41E4, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x52AB, 0xF77D, 0xFFFF, 0xFFFF, 0xF7BF, 0x4208, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x39E7, 0xFFBE, 0xFFFF, 0xFFFF, 0xC659, - 0x20E3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x4A04, 0xFE40, 0xFE60, 0x49E3, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x18E4, 0xCE38, 0xFFFF, 0xFFFF, 0xF7BE, 0x39C6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0862, 0xE71C, 0xFFFF, 0xFFFF, 0xC659, 0x1041, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x3983, 0xCD20, 0xD520, 0x39A3, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0842, 0xC618, 0xFFFF, 0xFFFF, - 0xE73D, 0x1062, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9CB2, 0xFFFF, - 0xFFFF, 0xD6BA, 0x1082, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0800, 0x1041, 0x2882, 0x0800, 0x0000, 0x1082, 0xDEBA, 0xFFFF, 0xFFFF, 0x94B3, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x39A6, 0xFFFF, 0xFFFF, 0xFFFF, 0x3186, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0840, 0x3962, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9102, 0xCAA8, 0xE28A, 0xB0C3, - 0x0000, 0x0000, 0x31A7, 0xFFDF, 0xFFFF, 0xFFDF, 0x31A7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0xA555, 0xFFFF, 0xFFFF, 0x9451, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xABE0, 0xF665, 0x7325, 0x1020, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x62C6, 0xFA88, 0xFA47, 0xFA28, 0xE9C7, 0x0000, 0x0000, 0x0000, 0x8C72, 0xFFFF, 0xFFFF, - 0xAD34, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x10C3, 0xFFBF, 0xFFFF, 0xFFBF, 0x10A3, 0x0000, - 0x0000, 0x0000, 0x0000, 0x1060, 0xE5A0, 0xFE41, 0xEE46, 0x9340, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xA2C0, 0xDC65, - 0xFA29, 0xFA08, 0xDA8A, 0xA8C3, 0x0000, 0x0000, 0x0000, 0x1882, 0xF7BF, 0xFFFF, 0xF7DF, 0x18A3, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x736D, 0xFFFF, 0xFFFF, 0xA514, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2880, 0xA488, - 0xD5A9, 0x30C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8840, 0xD2EA, 0xFA28, 0xFA28, 0xA269, 0x3800, 0x0000, 0x0000, - 0x0000, 0x0000, 0xAD14, 0xFFFF, 0xFFFF, 0x6B6E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xA555, 0xFFFF, - 0xFFFF, 0x4A29, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18C2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x1021, 0xE9C7, 0xFA29, 0xFA29, 0xFA08, 0x20A3, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4A4A, 0xFFFF, 0xFFFF, 0xAD34, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xEF1C, 0xFFFF, 0xFFFF, 0x1082, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3000, 0x79E8, 0xFA28, 0xFA28, 0xE28A, 0xA0C2, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1082, 0xFFFF, 0xFFFF, 0xE71C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x1061, 0xFFFF, 0xFFFF, 0xD6DB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x7801, 0xD2AB, 0xFA29, 0xFA08, 0x9A6A, 0x3800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0xDEDB, 0xFFFF, 0xFFFF, 0x0862, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18E3, 0xFFFF, 0xFFFF, 0xCE38, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x1041, 0xF1E7, 0xFA49, - 0xFA28, 0xFA28, 0x2082, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xCE59, 0xFFFF, 0xFFFF, 0x18C2, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2925, 0xFFFF, 0xFFFF, 0xB5D7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x10C3, 0x9CB2, 0xFE18, 0xC410, 0xFA29, 0xFA08, 0xDAAB, 0x9061, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC5D7, 0xFFFF, 0xFFFF, 0x2105, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2124, - 0xFFFF, 0xFFFF, 0xC617, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x10C3, 0xD679, 0xE71C, - 0xFC92, 0xDAAB, 0xFA28, 0xFA28, 0x9249, 0x3000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC638, - 0xFFFF, 0xFFFF, 0x2103, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0820, 0xFFFF, 0xFFFF, 0xDF1C, 0x0000, 0x0000, 0x0000, - 0x0820, 0x41A3, 0x7B87, 0x1000, 0x0000, 0x0000, 0x0000, 0x9471, 0xE6FC, 0xDE7A, 0xFA6A, 0xFA28, 0xFA29, 0xFA49, 0x9451, 0x0800, - 0x0000, 0x0000, 0x2000, 0x69A6, 0x30C3, 0x1000, 0x0000, 0x0000, 0x0000, 0xEF3C, 0xFFFF, 0xFFDF, 0x0021, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0xE71B, 0xFFFF, 0xFFFF, 0x0861, 0x0000, 0x1081, 0xDD20, 0xFE62, 0xEE49, 0x5180, 0x0000, 0x0000, - 0x0000, 0xCE59, 0xFE79, 0xCCB2, 0xFA28, 0xFA28, 0xDAAA, 0xFCB2, 0xCE38, 0x0000, 0x0000, 0x0000, 0x7000, 0xCACB, 0xFA49, 0xD9A6, - 0x1041, 0x0000, 0x1041, 0xFFFF, 0xFFFF, 0xDF1C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xAD96, 0xFFFF, - 0xFFFF, 0x528A, 0x0000, 0x0000, 0xD520, 0xFE42, 0xCD67, 0x59C0, 0x0000, 0x0000, 0x0000, 0xC618, 0xFE9A, 0xCCB3, 0xFA29, 0xFA08, - 0xC451, 0xFE59, 0xC619, 0x0000, 0x0000, 0x0000, 0x6821, 0xB249, 0xEA49, 0xD986, 0x0000, 0x0000, 0x52AB, 0xFFFF, 0xFFFF, 0xB575, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630B, 0xFFFF, 0xFFFF, 0xA534, 0x0000, 0x0000, 0x49A0, 0x5201, - 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x7C10, 0xEEFB, 0xDEFB, 0xF471, 0xF492, 0xE6DB, 0xE71C, 0x83EF, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x50A2, 0x4882, 0x0000, 0x0000, 0xAD34, 0xFFFF, 0xFFFF, 0x5AEC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x1083, 0xFFDF, 0xFFFF, 0xF79E, 0x18C3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0841, - 0xBE18, 0xE6FC, 0xDF1C, 0xE6FC, 0xDF1C, 0xC5D7, 0x0842, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18C3, - 0xF7BF, 0xFFFF, 0xFFDF, 0x1082, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xAD55, 0xFFFF, 0xFFFF, - 0x9CD2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1041, 0x7BCF, 0xBDB6, 0xB5D7, 0x7BAE, 0x0861, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9CD3, 0xFFFF, 0xFFFF, 0xAD34, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2904, 0xFFDF, 0xFFFF, 0xFFFF, 0x20E4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x1904, 0xFFDF, 0xFFFF, 0xFFDF, 0x2125, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x9CB2, 0xFFFF, 0xFFFF, 0x39E7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x41E7, 0xFFFF, 0xFFFF, 0x94D3, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0862, 0x8C31, 0x6B6E, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2966, 0x1082, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x736D, 0x8451, 0x1061, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8451, 0x9CD2, 0x0000, 0x7BAE, 0xCE79, - 0x1082, 0xD6DB, 0xDEBA, 0x0000, 0x1041, 0xF7BE, 0xAD34, 0x0000, 0xCE38, 0x39E7, 0xFFFF, 0x0861, 0x0000, 0x9CD3, 0x8C30, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C30, 0x94D3, 0x738E, 0xCE59, 0x1062, 0x0000, 0xDEBA, 0xDEDC, 0x2925, 0x528A, 0xDEDB, - 0xA535, 0x0000, 0xE73D, 0x18A3, 0xFFFF, 0x0841, 0x0000, 0x9CB3, 0x8431, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8451, - 0xEF3C, 0xFFFF, 0x5269, 0x0000, 0x0000, 0xD6DB, 0x9CB2, 0x7BCF, 0xA514, 0x9CD3, 0xAD34, 0x2145, 0xCE38, 0x18C3, 0xFFFF, 0xDF1C, - 0xE6FB, 0xF79E, 0x8C30, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C30, 0xB5B7, 0x4A49, 0xE73D, 0x20C3, 0x0000, 0xDEBA, - 0x4249, 0xCE38, 0xD6DB, 0x5ACB, 0xA535, 0x5AAA, 0x94B3, 0x18A3, 0xFFFF, 0x18C3, 0x1082, 0xA4F4, 0x8431, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x8451, 0x9CD2, 0x0000, 0x83CF, 0xD69A, 0x1041, 0xD6DB, 0x2945, 0xCE59, 0x9CD2, 0x5ACB, 0xAD34, 0x8C51, - 0x6B2C, 0x18C3, 0xFFFF, 0x0861, 0x0000, 0x9CD3, 0x8C30, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x39A6, 0x39E8, 0x0000, - 0x0000, 0x62EB, 0x2145, 0x5AAA, 0x1082, 0x39C7, 0x2145, 0x2104, 0x4229, 0x6B2D, 0x2125, 0x0841, 0x632D, 0x0000, 0x0000, 0x39C7, - 0x31A7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xF7DF, 0xF7DF, + 0xF7BF, 0xF7BF, 0xF7BF, 0xF7DF, 0xF7BF, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xF7BF, 0xFFDF, + 0xF7DF, 0xF7BF, 0xFFDF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7FF, + 0xF7DF, 0xEFBF, 0xEF9F, 0xEF9F, 0xEFBF, 0xEF9F, 0xEFBF, 0xF7DF, 0xF7BF, 0xF7DF, 0xF7BF, 0xF7BF, 0xF7DF, 0xF7BF, 0xFFFF, 0xFFFF, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BF, 0xEF9F, 0xD73F, 0xB6FF, 0x8E1F, 0x865F, 0xEFBF, 0xEFBF, 0x865F, 0x8E7F, + 0xB6BF, 0xDF7F, 0xEF9F, 0xEF9F, 0xFFDF, 0xF7BF, 0xF7BF, 0xF7BF, 0xF7FF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEFBF, + 0xBEDF, 0x2D3F, 0x0000, 0x0000, 0x0000, 0x0000, 0xEFBF, 0xEFBF, 0x0000, 0x0000, 0x0000, 0xEF9F, 0xEF9F, 0xD6FF, 0xE77F, 0xF7BF, + 0xFFDF, 0xF7FF, 0xF7FF, 0xF7DF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xFFFF, 0xFFFF, 0xF7DF, 0xFFDF, 0xF7DF, 0xFFFF, 0xF7DF, 0xD77F, 0x55DF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xEF9F, 0xEF9F, 0x0000, 0x0000, 0xEFBF, 0xFFFF, 0xF7BF, 0x0000, 0x4D9F, 0xCF5F, 0xF7BF, 0xF7DF, 0xF79F, 0xFFDF, 0xF7BF, 0xFFDF, + 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xF7DF, 0xF7BF, 0xF7BF, 0xFFFF, + 0xF7FF, 0xC73F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF7DF, + 0xF7DF, 0x0000, 0x0000, 0x0000, 0xB6FF, 0xEFBF, 0xFFFF, 0xF7BF, 0xF7BF, 0xFFDF, 0xF7BF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFDF, 0xF7BF, 0xFFFF, 0xF7BF, 0xB6FF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFC8F, 0xB6BF, + 0xF7BF, 0xFFDF, 0xF7DF, 0xFFDF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xF7DF, + 0xF7DF, 0xF7BF, 0xFFDF, 0xCF5F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFA89, 0xFB0A, 0x0000, 0x0000, 0xCF5F, 0xEF9F, 0xF7DF, 0xF7BF, 0xF7BF, 0xF7BF, + 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xF7DF, 0xF7BF, 0xF7BF, 0xFFFF, 0xDF5F, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFA27, + 0xFA89, 0xFA69, 0x0000, 0x0000, 0x0000, 0xE77F, 0xF7BF, 0xF7BF, 0xFEDB, 0xFDF8, 0xFFBE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xFFFF, 0xFFFF, 0xF7DF, 0xFFDF, 0xF7BF, 0xF7FF, 0xAE9F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF9E6, 0xFA48, 0xF966, 0x0000, 0x0000, 0x0000, 0x0000, 0xDF7F, + 0xFEFD, 0xFD56, 0xFBEF, 0xFA49, 0xFDF8, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xF7BF, 0xF7BF, 0xF7BF, 0xDF7F, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xF9C6, 0xFA48, 0xF906, 0x0000, 0x0000, 0x0000, 0xF7DF, 0xFFDF, 0xF7FF, 0xFDD9, 0xF9E7, 0xF966, 0xF861, 0xFB2C, 0xFFFF, + 0x0000, 0x0000, 0x0000, 0x0000, 0xFFDF, 0xF7DF, 0xF7BF, 0xFFDF, 0xF7BF, 0xB71F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF9C6, 0xFA48, 0xF8E4, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0xF7BF, 0xF7FF, 0xEF1F, 0xF8E4, 0xF8A2, 0xF882, 0xF965, 0xFF1C, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xF7DF, + 0xF7BF, 0xF7BF, 0xEF9F, 0x8E7F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, + 0xEFBF, 0xEF9F, 0xF7BF, 0xFB0B, 0xF9E7, 0xF905, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x16BF, 0xFA09, + 0xF882, 0xF8C3, 0xF861, 0xFDD7, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xF7DF, 0xF7FF, 0xF7BF, 0xF7DF, 0xE7BF, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xF7DF, 0xDF5F, 0xD73F, 0xD73F, 0xDF5F, 0xF7DF, 0xFB2C, 0xF800, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFB0E, 0xF882, 0xF8C3, 0xF820, 0xFD14, 0xFFFF, 0x0000, + 0x0000, 0xFFFF, 0xFFDF, 0xF7FF, 0xFFFF, 0xF7BF, 0xD77F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xF7BF, 0xDF5F, 0xC71F, 0xBF1F, 0xBF1F, 0xC71F, 0xDF7F, 0xF7BF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xFC73, 0xF8A2, 0xF8C3, 0xF800, 0xFC30, 0xFFFF, 0x0000, 0x0000, 0xFFFF, 0xF7DF, 0xF7BF, 0xF7FF, 0xF7BF, + 0xCF5F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xEF9F, 0xCF5F, 0xCF5F, 0xFF7F, 0xFEDE, + 0xCF5F, 0xCF5F, 0xE79F, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFA08, 0xFA28, 0xFB8F, 0xF8A2, 0xF8A2, + 0xF800, 0xFBEF, 0xFFFF, 0x0000, 0x0000, 0xFFFF, 0xF7BF, 0xF7DF, 0xF7BF, 0xF7FF, 0xCF5F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xE77F, 0xDF5F, 0xBF5F, 0xFCD4, 0xFC73, 0xBF5F, 0xDF5F, 0xE77F, 0xFFFF, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFA08, 0xFA28, 0xFB2D, 0xF882, 0xF8A2, 0xF800, 0xFBEF, 0xFFFF, 0x0000, 0x0000, 0xFFFF, + 0xFFFF, 0xF7BF, 0xF7DF, 0xF7FF, 0xCF5F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xEF9F, + 0xD75F, 0xC71F, 0xCF5F, 0xCF5F, 0xC71F, 0xD75F, 0xEF9F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFA69, + 0xFAEB, 0xFC33, 0xF882, 0xF8A2, 0xF800, 0xFBEF, 0xFFFF, 0x0000, 0x0000, 0xFFFF, 0xFFDF, 0xF7DF, 0xF7BF, 0xF7BF, 0xE77F, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xEFDF, 0xC6FF, 0xC73F, 0xC73F, 0xC6FF, 0xEFDF, + 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFBB1, 0xF861, 0xF8A2, 0xF800, 0xFC92, + 0xFFFF, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xF7BF, 0xF7DF, 0xF7DF, 0xDF5F, 0x5E5F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xEFBF, 0xE77F, 0xE77F, 0xEFBF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x2EDF, 0xFA8B, 0xF841, 0xF882, 0xF800, 0xFD55, 0xFFFF, 0x0000, 0x0000, 0x0000, 0xFFDF, 0xF7BF, + 0xF7BF, 0xF7BF, 0xEFBF, 0xAEDF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7E7F, 0xF946, + 0xF841, 0xF861, 0xF882, 0xFE79, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xF7BF, 0xF7DF, 0xF7BF, 0xF7DF, 0xCF1F, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFD78, 0xF882, 0xF861, 0xF800, 0xFA08, 0xFFFF, 0x0000, 0x0000, + 0x0000, 0x0000, 0xFFFF, 0xF7BF, 0xF7BF, 0xF7BF, 0xF7DF, 0xEF9F, 0xBF1F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xFF3F, 0xF9C7, 0xF820, 0xF882, 0xF800, 0xFC51, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFDF, 0xF7DF, 0xF7BF, + 0xF7DF, 0xF7BF, 0xF7DF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF985, 0xF904, 0xF8C3, 0xF861, 0xF861, + 0xFE79, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xF7BF, 0xEFBF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF9A6, 0xF8A2, 0xFAEB, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xFB0B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -8252,125 +8362,360 @@ static const unsigned short icon_speed_42[1764] PROGMEM = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000 }; -// Header Icon: icon_rpm_42 (42x42 px, 1764 elements, RGB565 Big-Endian) +// Header Icon Alpha: icon_speed_42_alpha (1764 elements, 8-bit Alpha Mask) +static const unsigned char icon_speed_42_alpha[1764] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xF7, 0xF7, 0xF7, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xF7, 0xEF, + 0xEF, 0xEF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, + 0xD6, 0xBD, 0xC6, 0xC6, 0xBD, 0xD6, 0xEF, 0xF7, 0xFF, 0xF7, 0xEF, 0xEF, 0xE7, 0xEF, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBD, 0x8C, 0x6B, 0x4A, 0x42, 0xE7, 0xE7, 0x42, 0x4A, + 0x6B, 0xA5, 0xC6, 0xEF, 0xF7, 0xEF, 0xE7, 0xE7, 0xDE, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBD, + 0x7B, 0x31, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xEF, 0x8C, 0xAD, 0xEF, + 0xE7, 0xDE, 0xDE, 0xD6, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0x8C, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0x00, 0x00, 0xF7, 0xFF, 0xFF, 0x00, 0x39, 0x84, 0xD6, 0xE7, 0xDE, 0xD6, 0xD6, 0xFF, + 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xDE, 0x6B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, + 0xF7, 0x00, 0x00, 0x00, 0x6B, 0xC6, 0xDE, 0xD6, 0xD6, 0xCE, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xE7, 0x6B, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x6B, + 0xC6, 0xD6, 0xCE, 0xC6, 0xDE, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xF7, + 0xF7, 0xFF, 0xF7, 0x7B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xEF, 0x00, 0x00, 0x73, 0xD6, 0xCE, 0xCE, 0xC6, 0xF7, + 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xF7, 0xF7, 0xFF, 0xAD, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, + 0xE7, 0xBD, 0x00, 0x00, 0x00, 0x8C, 0xD6, 0xC6, 0xC6, 0xDE, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0xEF, 0xEF, 0xFF, 0xDE, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xF7, 0xAD, 0x00, 0x00, 0x00, 0x00, 0x9C, + 0xB5, 0xD6, 0xDE, 0xE7, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xEF, 0xEF, 0xFF, 0x9C, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xFF, 0xFF, 0xAD, 0x00, 0x00, 0x00, 0xF7, 0xFF, 0xFF, 0xA5, 0xEF, 0xF7, 0xFF, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0xF7, 0xEF, 0xEF, 0xE7, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF7, 0xFF, 0xFF, 0xAD, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xF7, 0xFF, 0x84, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xF7, 0xE7, + 0xE7, 0xF7, 0xC6, 0x4A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xB5, 0xA5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xC6, + 0xFF, 0xF7, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xDE, 0xE7, 0xEF, 0x9C, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xEF, 0xBD, 0xBD, 0xEF, 0xFF, 0xCE, 0x9C, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0xFF, 0xF7, 0xF7, 0xFF, 0xFF, 0x00, + 0x00, 0xFF, 0xFF, 0xDE, 0xDE, 0xEF, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xFF, 0xE7, 0x94, 0x9C, 0x9C, 0x94, 0xDE, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7B, 0xFF, 0xF7, 0xF7, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xDE, 0xDE, 0xE7, + 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xA5, 0x9C, 0x94, 0x9C, + 0x9C, 0xA5, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x9C, 0xF7, 0xFF, + 0xF7, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xD6, 0xDE, 0xDE, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x9C, 0xA5, 0xB5, 0xBD, 0xA5, 0x9C, 0xFF, 0xFF, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xAD, 0xEF, 0xFF, 0xF7, 0xFF, 0xFF, 0x00, 0x00, 0xFF, + 0xF7, 0xD6, 0xD6, 0xDE, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, + 0xBD, 0x94, 0xA5, 0xA5, 0x94, 0xBD, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, + 0xFF, 0x84, 0xFF, 0xF7, 0xF7, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xF7, 0xCE, 0xD6, 0xDE, 0x8C, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xB5, 0x94, 0x94, 0xB5, 0xFF, + 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0xFF, 0xF7, 0xF7, 0xFF, + 0xFF, 0x00, 0x00, 0xFF, 0xEF, 0xCE, 0xCE, 0xD6, 0xA5, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xF7, 0xF7, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x84, 0xA5, 0xFF, 0xF7, 0xF7, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xF7, 0xD6, + 0xCE, 0xD6, 0xBD, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, + 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0xD6, + 0xFF, 0xEF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xE7, 0xC6, 0xCE, 0xCE, 0x7B, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xF7, 0xF7, 0xEF, 0xFF, 0xFF, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0xF7, 0xC6, 0xC6, 0xC6, 0xB5, 0x7B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x63, 0xC6, 0xFF, 0xEF, 0xEF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF7, 0xC6, 0xCE, + 0xE7, 0xFF, 0xE7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0xFF, 0xFF, 0xF7, 0xF7, + 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xF7, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF, 0xEF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00 +}; + +// Header Icon: icon_rpm_42 (1764 elements, RGB565 True Color) static const unsigned short icon_rpm_42[1764] PROGMEM = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF7FE, 0xEFDF, 0xF7BF, 0xF7DF, 0xF7DF, 0xEFDF, 0xF7DF, 0xF7DF, 0xF7FF, 0xFFFF, 0xF7DF, + 0xF7DF, 0xF7DF, 0xF7FF, 0xF7FF, 0xF7FF, 0xEF9F, 0xEFFF, 0xF7FE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF7FF, 0xDFBF, + 0xEFDF, 0xF7DF, 0xF7DF, 0xEFDF, 0xEFBF, 0xEFDF, 0xEFFF, 0xF7DF, 0xEFBF, 0xF7DF, 0xF7FF, 0xF7FF, 0xEFBF, 0xF7FF, 0xEFDF, 0xEFBF, + 0xE7FF, 0xE7BF, 0xEFBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xEF9F, 0xCFFF, 0xEFFF, 0xEFDF, 0xEF9F, 0xEF9F, 0xEF9F, 0xEFDF, + 0xEFDF, 0xEFDF, 0xEF9F, 0xEFDF, 0xFFFF, 0xFFFF, 0xEFDF, 0xDF9F, 0xEFDF, 0xD79F, 0xC77F, 0xC77F, 0xEF9F, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0xE77F, 0xEF9F, 0xEFDF, 0xF7DF, 0xF7BF, 0xF7DF, 0xEFDF, 0xEFDF, 0xF7BF, 0xF7DF, 0xFFDF, 0xF7BF, 0xFFFF, 0xF7BF, + 0xFFDF, 0xF7BF, 0xEF9F, 0xFFFF, 0xEFFF, 0xEFDF, 0xEF9F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xDFDF, 0xE7FF, 0xDFFE, 0xFFFF, + 0xFFFF, 0xEFDF, 0xEFDF, 0xEFDF, 0xEFDF, 0xEFDF, 0xFFFF, 0xEF9F, 0xEFDF, 0xFFFF, 0xEFDF, 0xEF9F, 0xEF9F, 0xE7FF, 0xE77F, 0xD7FE, + 0xE7FF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xDF9F, 0xEF9F, 0xF7FF, 0xF7BF, 0xF7FF, 0xF7BF, 0xF7FF, 0xFFFF, 0xF7DF, + 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xF7DF, 0xF7FF, 0xF7BF, 0xDF9F, 0xEFDF, 0xEFDF, 0xEFDF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xD7DF, 0xDFDF, 0xF7FE, 0xE77F, 0xEF9F, 0xEFFF, 0xF7FE, 0xEFFF, 0xEFDF, 0xFFFF, 0xEF9F, 0xFFFF, 0xFFFF, 0xFFFF, 0xEFDF, 0xFFFF, + 0xE77F, 0xF7FE, 0xDFDF, 0xDFDF, 0xDF5F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xE7BF, 0xE7FF, 0xE77F, 0xEFBF, 0xF7BF, 0xF7DF, + 0xE7BF, 0xE7FF, 0xF7DF, 0xF7BF, 0xF7FF, 0xF7DF, 0xF7BF, 0xF7DF, 0xE7BF, 0xE7BF, 0xEFBF, 0xE7BF, 0xD77F, 0xE7DF, 0xE7BF, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xE7BF, 0xD7BF, 0xE7BF, 0xEFBF, 0xE7BF, 0xBF3F, 0xD7FF, 0xD7FF, 0xBF9F, 0xB75F, 0xD7DF, 0xBF5F, + 0xD79F, 0xBF3F, 0xBF9F, 0xBF9F, 0xCF9F, 0xDF7F, 0xDF9F, 0xDF9F, 0xE77F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF7FF, 0xD7BF, + 0xE7BF, 0xEFDF, 0xEFDF, 0xDF9F, 0xEFDF, 0xEFBF, 0xDFDF, 0xDFDF, 0xDF5F, 0xDFDF, 0xD7DF, 0xEFDF, 0xEFDF, 0xEFBF, 0xDF9F, 0xDFBF, + 0xCF5F, 0xCF5F, 0xE7DF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF7FF, 0xD7BF, 0xE7BF, 0xEFBF, 0xEF9F, 0xEF9F, 0xEFDF, 0xF7DF, + 0xD79F, 0xBEDF, 0x0000, 0x0000, 0xE7FF, 0xE7BF, 0xEFBF, 0xEFBF, 0xEF9F, 0xE7BF, 0xCF5F, 0xCF5F, 0xE7DF, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0xF7FF, 0xD7BF, 0xDF7F, 0xF7DF, 0xEFBF, 0xEFBF, 0xEFDF, 0xEFFF, 0xE77F, 0x0000, 0x0000, 0x0000, 0xCF7F, 0xE7BF, + 0xEFBF, 0xEFDF, 0xDF9F, 0xE7BF, 0xCF5F, 0xCF5F, 0xE7BF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF7FF, 0xD7BF, 0xDF7F, 0xEFDF, + 0xEFDF, 0xEFBF, 0xEFBF, 0xEFDF, 0xEFDF, 0xDFDF, 0xD7DF, 0xE7FF, 0xD7DF, 0xEF9F, 0xEFBF, 0xEFBF, 0xEFBF, 0xE77F, 0xCF5F, 0xDFDF, + 0xE7BF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF7BF, 0xE7BF, 0xDF7F, 0xF7DF, 0xF7DF, 0xEF9F, 0xEFBF, 0xEFDF, 0xF7DF, 0xDF9F, + 0xEFDF, 0xEFDF, 0xE7BF, 0xEFDF, 0xEFBF, 0xEF9F, 0xEF9F, 0xDF7F, 0xDF9F, 0xDF9F, 0xE7BF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xF7BF, 0xE7BF, 0xE7BF, 0xF7DF, 0xF7DF, 0xF7BF, 0xF7BF, 0xF7FF, 0xE7BF, 0xF7DF, 0xFFDF, 0xF7DF, 0xF7FF, 0xF7DF, 0xF7FF, 0xE7BF, + 0xEFBF, 0xE7BF, 0xDF9F, 0xDF9F, 0xE7BF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF7BF, 0xD77F, 0xE7BF, 0xF7BF, 0xEFBF, 0xEFDF, + 0xF7FF, 0xEFDF, 0xEFDF, 0xEFDF, 0xEF5F, 0xEFFF, 0xFFFF, 0xFFFF, 0xF7DF, 0xEF9F, 0xEF9F, 0xDF7F, 0xDF9F, 0xDF9F, 0xE7BF, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xF7FF, 0xE7FF, 0xE77F, 0xEFDF, 0xEFFD, 0x0000, 0x0000, 0x0000, 0xCFDF, 0x7EDF, 0xAF3F, 0xAFFD, + 0xB75F, 0x0000, 0x0000, 0x0000, 0xBFBF, 0xE7FF, 0xD79F, 0xD77F, 0xE7DF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xEF9F, 0xDFFE, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xD79F, 0xC77F, 0xBF3F, 0xC77F, 0xD79F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xDFDF, 0xEFDF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xEFFF, 0xD7FF, 0xCF5F, 0xCF7F, 0xE7BF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF7DF, 0xD79F, 0xCF9F, 0xEFFF, 0xF7DF, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xF7DF, 0xD73F, 0xCF5F, 0xD7FF, 0xF7DF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF7DF, 0xEFFF, + 0xCF9F, 0xD7FF, 0xF7DF, 0xDFFB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF7FF, 0xD79F, 0xD77F, 0xD7FF, 0xF7DF, 0xEFFD, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xFFFF, 0xF7FF, 0xD79F, 0xC77F, 0xD79F, 0xF7DF, 0xEFFD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xEFFD, 0xF7DF, 0xD79F, 0xD7BF, 0xD7FF, + 0xF7DF, 0xFFDF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF7FE, 0xF7DF, 0xCFFF, 0xC77F, 0xBF3F, 0xF7BF, 0xF7FE, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xEFDF, + 0xE7BF, 0xD79F, 0xD77F, 0xD79F, 0xEF9F, 0xF7BF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF7FF, 0xE7BF, 0xEFFF, 0xD79F, 0xD79F, 0xE7BF, 0xF7FF, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0xF7DF, 0xF7DF, 0xF7DF, 0xEFFF, 0xF7DF, 0xF7BF, 0xF7DF, 0xF7DF, 0xF7FF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xE7FF, 0xF7DF, 0xF7FF, 0xEF9F, 0xF7BF, 0xFFFF, + 0xF7DF, 0xFFFF, 0xF7FF, 0xDF5F, 0xEFBF, 0xF7FF, 0xDFFE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xEFFD, 0xF7FF, 0xF7FF, 0xEFDF, 0xE77F, 0xEFDF, 0xBFBF, 0x0000, 0xFFFF, 0xFFDF, 0xF7FF, 0xDF9F, 0xEFBF, + 0xE7DF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xEFFD, 0xF7FF, 0xE7BF, + 0xEFDF, 0xEFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xE77F, 0xF7BF, 0xDFDF, 0xDF7F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xEFFD, 0xF7FF, 0xDFDF, 0xEFDF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0xEF9F, 0xDF9F, 0xDFBF, 0xDFFB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xAFFF, 0xEF9F, 0xDFDF, 0xDF5F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xEFFD, 0xF7FE, 0xEFFF, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xBFBF, 0xF7BF, 0xE7FE, 0xEFFF, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xEFDF, 0xEFDF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xCF1F, 0xEFBF, 0xDF9F, 0xE77F, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xE7BF, 0xDF9F, 0xDF7F, 0x97FB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xCFDF, + 0xEFBF, 0xE77F, 0xD73F, 0xF7DF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xE7BF, 0xD79F, 0xE7BF, 0xE7BF, 0xBEDF, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xBFBF, 0xF7DF, 0xEFDF, 0xE77F, 0xEFDF, 0xF7BF, 0xFFFF, + 0xE77F, 0xFFFF, 0xF7BF, 0xEFDF, 0xE77F, 0xEFBF, 0xD77F, 0xAFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xD7FE, 0xE7FF, 0xEF9F, 0xE7FF, 0xEFDF, 0xE7BF, 0xF7FF, 0xF7DF, 0xDF9F, 0xE77F, 0xEFDF, 0xBF5F, + 0xC77F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xAFFF, 0xAFFF, + 0x0000, 0xDFDF, 0xF7DF, 0xF7FF, 0xF7FF, 0xF7FF, 0xE7DF, 0xF7FE, 0x0000, 0x0000, 0xBFBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x2966, 0x738E, 0xA535, 0xBDB7, 0xCE9A, 0xD67A, 0xB5D7, 0xA514, 0x6B8E, 0x2945, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0882, 0x7BCE, 0xE73C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, - 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF1C, 0x7BCF, 0x1061, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x7BCF, 0xF77D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, - 0xFFFF, 0xFFFF, 0xEF7E, 0x7BAF, 0x0021, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20E3, 0xC638, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, - 0xD679, 0x8C51, 0x4A28, 0x528A, 0xFFFF, 0xFFFF, 0x5289, 0x4A49, 0x8C51, 0xD69A, 0xFFBE, 0xEE9A, 0xEDD7, 0xFF5D, 0xC618, 0x18E3, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x3186, 0xEF7E, 0xFFFF, 0xFFFF, 0xFFFF, 0xB5B7, 0x39C7, 0x0000, 0x0000, 0x0000, 0x3165, 0xFFFF, 0xFFFF, - 0x2966, 0x0000, 0x0000, 0x0000, 0xB186, 0xDA8A, 0xF249, 0xFA8A, 0xEEDC, 0xFF3C, 0x31A7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3145, 0xEF7D, 0xFFFF, 0xFFFF, - 0xF77D, 0x52AA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2986, 0xFFFF, 0xFFFF, 0x3165, 0x0000, 0x0000, 0x0000, 0xC944, 0xEA69, - 0xFA28, 0xFA28, 0xDACA, 0xFD34, 0xF75D, 0x2965, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18C3, 0xE73D, 0xFFFF, 0xFFFF, 0xDEBA, 0x1904, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0821, 0x2145, 0x2925, 0x0041, 0x0000, 0x0000, 0x0000, 0x8862, 0xDA8A, 0xFA29, 0xFA08, 0xFA29, 0xFA08, 0xE5F8, 0xFEBB, - 0x10C3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xAD76, - 0xFFFF, 0xFFFF, 0xE71B, 0x1904, 0x6200, 0xCD87, 0xA467, 0x2080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x2000, 0x5145, 0xFA28, 0xFA49, 0xFA28, 0xFA28, 0xDACB, 0xFDB6, 0xB555, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x52AB, 0xFFFF, 0xFFFF, 0xF79E, 0x2125, 0x0000, 0xDD80, 0xFE41, - 0xF645, 0xAC00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6000, 0xBA8A, - 0xFA29, 0xFA08, 0xFA29, 0xFA49, 0xF77E, 0x5A69, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0xDEDB, 0xFFFF, 0xFFFF, 0x73AE, 0x0000, 0x0000, 0xC4A0, 0xF663, 0xFE40, 0xFE60, 0x41C3, 0x0820, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x20A2, 0xFA07, 0xFA49, 0xFA28, 0xFA28, 0xDCB2, 0xFE59, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4A29, 0xFFFF, 0xFFFF, 0xD6BB, 0x0000, - 0x0000, 0x0000, 0x3900, 0xE60A, 0xFE60, 0xFE40, 0xC58B, 0x2060, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x7821, 0xD2AB, 0xFA29, 0xFA08, 0xCACB, 0xFDD7, 0x4229, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xAD96, 0xFFFF, 0xFFFF, 0x736D, 0x0000, 0x0000, 0x0000, 0x1000, 0x6B26, 0xFE40, 0xFE60, - 0xF645, 0x9BC0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3000, 0x8228, - 0xFA28, 0xFA28, 0xF269, 0xFBAE, 0xB555, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0xF79E, - 0xFFFF, 0xFFBE, 0x0862, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xD520, 0xFE42, 0xFE60, 0xFE40, 0x3183, 0x0800, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x1861, 0xFA29, 0xFA08, 0xFA29, 0xFA28, 0xEF1D, 0x0800, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3165, 0xFFFF, 0xFFFF, 0xC638, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x5160, 0xE64A, 0xFE40, 0xFE60, 0xC549, 0x2060, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0xD145, 0xEA69, 0xFA28, 0xFA28, 0xE5B6, 0x40E4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x5B0C, 0xFFFF, 0xFFFF, 0x9471, 0x0000, 0x0000, 0x0000, 0x0841, 0x0862, 0x0841, 0x0820, 0x7B66, 0xFE60, 0xFE40, - 0xEE46, 0x9340, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0801, 0x0800, 0x0021, 0x0000, 0x8041, 0xDAAA, - 0xFA29, 0xFA08, 0xD493, 0x8A49, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7B8E, 0xFFFF, 0xFFFF, 0x6B6E, - 0x0000, 0x0000, 0x0000, 0xDEDB, 0xFFFF, 0xCE59, 0x0000, 0x0841, 0xE560, 0xFE62, 0xFE40, 0xFE40, 0x3122, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0xD965, 0xF269, 0xA289, 0x3800, 0x5800, 0xC2EB, 0xFA28, 0xFA28, 0xCBAE, 0xA2CB, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7BF0, 0xFFFF, 0xFFFF, 0x630C, 0x0000, 0x0000, 0x0000, 0xDEBB, 0xFFFF, 0xCE39, - 0x0000, 0x0000, 0x51A0, 0xEE49, 0xFE60, 0xFE40, 0xFE41, 0xF600, 0x9427, 0x28A0, 0x0000, 0x0000, 0x0000, 0x0000, 0xD186, 0xF249, - 0x9A8A, 0x3800, 0x3800, 0xB2CB, 0xFA29, 0xFA08, 0xC30C, 0xBACB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x83EF, 0xFFFF, 0xFFFF, 0x632C, 0x0000, 0x0000, 0x0000, 0x0861, 0x1061, 0x0861, 0x0000, 0x0000, 0x1800, 0x9428, 0xFE40, 0xFE60, - 0xFE40, 0xFE60, 0xFE60, 0xEDE0, 0x1881, 0x0000, 0x0000, 0x0000, 0x1000, 0x0821, 0x0820, 0x0000, 0x3800, 0xA28A, 0xFA28, 0xFA28, - 0xC2EB, 0xC30C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x632D, 0xFFFF, 0xFFFF, 0x8410, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1020, 0x9408, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0x8BE8, 0x1000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3000, 0xA28A, 0xFA29, 0xFA08, 0xC2EC, 0xAA08, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x41E7, 0xFFFF, 0xFFFF, 0xAD75, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x2000, 0xCDAB, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xCD8A, 0x1820, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x3800, 0xA2AB, 0xFA28, 0xFA28, 0xC2EB, 0x8124, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x10A3, 0xFFDF, - 0xFFFF, 0xEF5D, 0x0021, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1820, 0xCD6A, 0xFE60, 0xFE40, 0xFE60, 0xFE40, - 0xFE60, 0xFE40, 0xC58B, 0x1800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4800, 0xC2CB, 0xFA29, 0xFA08, 0xC34D, 0x5000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC638, 0xFFFF, 0xFFFF, 0x4A28, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x83A7, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0x8386, 0x1020, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0xCACB, 0xFA28, 0xFA28, 0xC3AE, 0x3000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x6B4D, 0xFFFF, 0xFFFF, 0xAD76, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0840, - 0xDD60, 0xFE41, 0xFE60, 0xFE40, 0xFE62, 0xDD60, 0x0841, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xA8C3, 0xE26A, - 0xFA29, 0xFA08, 0x932D, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x10C3, 0xFF9E, 0xFFFF, - 0xFFFF, 0x39E7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2040, 0x7B66, 0xD520, 0xD540, 0x7B45, 0x1860, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0820, 0xFA07, 0xFA49, 0xFA28, 0xFA28, 0x4144, 0x1000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7BF0, 0xFFFF, 0xFFFF, 0xC618, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x1000, 0x40E4, 0xFA29, 0xFA08, 0xF249, 0xF229, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x1041, 0xE73D, 0xFFFF, 0xE73C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x5165, 0xFA28, 0xFA28, 0xE28A, 0x98A3, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3186, 0x94B3, 0x39C7, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1041, 0xEA08, 0xF249, 0xA2AB, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x39A6, 0xFFFF, 0xE6FB, 0xEF5D, - 0xD679, 0x1904, 0x8C30, 0xF79E, 0xE6FB, 0xEF5D, 0x62EB, 0x4A49, 0xFFFF, 0x634D, 0x0000, 0x738E, 0xFFFF, 0x39C7, 0x0000, 0x0000, - 0x0800, 0x1061, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x31C7, 0xEF3D, 0x0000, 0x0000, 0xBDD8, 0x738E, 0x8451, 0x9CB3, 0x0000, 0x528A, - 0xDEDC, 0x4A29, 0xDEDC, 0xBDB6, 0x0000, 0xC5F8, 0xDEFC, 0x39A7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x39A6, 0xF7BE, 0x8C50, 0x94B2, 0xEF5C, 0x31A6, 0x8C30, 0xC618, 0x6B2C, 0xB5B6, 0xAD34, 0x4A49, 0xBDD6, 0xD6DB, 0x2924, 0xCE79, - 0xCE58, 0x39C7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x31C7, 0xF77E, 0x52AB, 0xBDB6, 0x9492, 0x0000, - 0x8451, 0xD67A, 0x8451, 0x62EC, 0x0842, 0x4A29, 0xB5D7, 0x8C51, 0xB5B7, 0x7BCF, 0xC659, 0x39A7, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x39A6, 0xEF5D, 0x0000, 0x18C3, 0xF77D, 0x31A6, 0x8C30, 0x9CD3, 0x0000, 0x0000, 0x0000, 0x4A49, - 0xBDD6, 0x39E7, 0xFFFF, 0x2965, 0xCE58, 0x39C7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x10A3, 0x62CB, - 0x0000, 0x0000, 0x3A08, 0x41E8, 0x31A7, 0x39C7, 0x0000, 0x0000, 0x0000, 0x18C3, 0x4A4A, 0x0000, 0x5B0C, 0x0000, 0x4A8A, 0x18A2, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000 }; -// Header Icon: icon_battery_42 (42x42 px, 1764 elements, RGB565 Big-Endian) +// Header Icon Alpha: icon_rpm_42_alpha (1764 elements, 8-bit Alpha Mask) +static const unsigned char icon_rpm_42_alpha[1764] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x63, 0x8C, 0xA5, 0xB5, 0xBD, 0xC6, 0xD6, 0xDF, 0xE7, 0xEF, + 0xEF, 0xE7, 0xCF, 0xB6, 0x9C, 0x7B, 0x5A, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9C, 0xB5, + 0xBD, 0xF7, 0xFF, 0xE7, 0xD6, 0xCE, 0xDE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xDF, 0xCE, 0xB5, + 0x94, 0x9C, 0xB5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5A, 0x52, 0x5A, 0x7B, 0x84, 0x7B, 0x73, 0x6B, + 0x73, 0x7B, 0x84, 0x84, 0x86, 0x86, 0x7B, 0x73, 0x63, 0x5A, 0x4A, 0x4A, 0x63, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x52, 0x6B, 0x73, 0x8C, 0x94, 0x8C, 0x84, 0x84, 0x8C, 0x8C, 0x8C, 0x94, 0x94, 0x94, + 0x8C, 0x8C, 0x84, 0x75, 0x6D, 0x63, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x4A, 0x4D, 0x65, + 0x6D, 0x6B, 0x63, 0x63, 0x6B, 0x6B, 0x6D, 0x73, 0x73, 0x6D, 0x6B, 0x6B, 0x63, 0x52, 0x4A, 0x45, + 0x4A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x7B, 0x84, 0x9C, 0xA5, 0x9C, 0x94, 0x94, 0x9E, 0xA5, + 0xA5, 0xA5, 0xA6, 0xA6, 0xA5, 0x9C, 0x94, 0x84, 0x73, 0x73, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x31, 0x42, 0x45, 0x52, 0x5A, 0x5A, 0x55, 0x5A, 0x63, 0x65, 0x6B, 0x65, 0x65, 0x65, 0x63, 0x5A, + 0x52, 0x45, 0x42, 0x42, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0x9C, 0xAD, 0xD6, 0xD6, 0xA5, + 0x9C, 0x9C, 0xA5, 0xAD, 0xAE, 0xB5, 0xB5, 0xAD, 0xAD, 0xAD, 0xB5, 0xAD, 0x94, 0x8C, 0xA5, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x9C, 0x94, 0x9C, 0xD6, 0x94, 0x63, 0x5A, 0x5A, 0x5A, 0x39, 0x31, 0x42, + 0x5A, 0x5A, 0x5A, 0x63, 0x84, 0xA5, 0x7B, 0x7B, 0xAD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0x94, + 0xA5, 0xCE, 0xB5, 0xBD, 0xB5, 0xBD, 0x7B, 0x42, 0x39, 0x42, 0x6B, 0xB5, 0xB5, 0xBD, 0xBD, 0xA5, + 0x84, 0x84, 0xA5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0x94, 0xA5, 0xD6, 0xBD, 0xB5, 0xB5, 0xA5, + 0x5A, 0x21, 0x00, 0x00, 0x4A, 0xA5, 0xBD, 0xB5, 0xBD, 0xA5, 0x84, 0x84, 0xA5, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x94, 0x94, 0xA5, 0xCE, 0xBD, 0xB5, 0xB5, 0x9E, 0x52, 0x00, 0x00, 0x00, 0x52, 0x9C, + 0xBD, 0xB5, 0xBD, 0xA5, 0x84, 0x84, 0xA5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0x94, 0xA5, 0xCE, + 0xB5, 0xB5, 0xB5, 0xB5, 0x6B, 0x42, 0x31, 0x4A, 0x6B, 0xBD, 0xB5, 0xB5, 0xB5, 0xA5, 0x84, 0x7B, + 0xA5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0x94, 0xA5, 0xCE, 0xBD, 0xB5, 0xB5, 0xB5, 0xAD, 0x7B, + 0x63, 0x73, 0xAD, 0xB5, 0xB5, 0xB5, 0xBD, 0xA5, 0x7B, 0x7B, 0xA5, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x94, 0x94, 0x9C, 0xCE, 0xCE, 0xA5, 0x9C, 0x9C, 0xAD, 0xB5, 0xB5, 0xBD, 0xB6, 0xB5, 0xAE, 0xAD, + 0xB5, 0x9C, 0x7B, 0x7B, 0xA5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0x94, 0xA5, 0xDE, 0xDE, 0xBD, + 0x94, 0x7B, 0x73, 0x73, 0x7B, 0x7D, 0x86, 0x9C, 0xAD, 0xBD, 0xBD, 0xAD, 0x84, 0x7B, 0xA5, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x9C, 0x9C, 0x8C, 0x63, 0x2C, 0x00, 0x00, 0x00, 0x29, 0x21, 0x31, 0x24, + 0x39, 0x00, 0x00, 0x00, 0x21, 0x4A, 0x6B, 0x8C, 0xAD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6B, 0x55, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x4A, 0x63, 0x4A, 0x6B, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x42, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x8E, 0x5A, 0x73, 0x52, 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAD, 0x6B, 0x84, 0x5A, 0xAD, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xAD, 0x63, 0x84, 0x5A, 0xAD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAD, 0x5A, + 0x84, 0x5A, 0xAD, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAE, 0x5A, 0x8C, 0x5A, 0xAD, 0x24, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x18, 0xAE, 0x5A, 0x8C, 0x5A, 0xAD, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xAD, 0x5A, 0x8C, 0x5A, + 0xAD, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xAD, 0x52, 0x94, 0x63, 0xA5, 0x55, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, + 0x9C, 0x5A, 0x8C, 0x63, 0x84, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBE, 0xA5, 0x5A, 0x6B, 0x5A, 0x8C, 0xC7, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x8C, 0xD6, 0xAD, 0x8E, 0x8C, 0x8C, 0xA5, 0xCE, 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0xA5, 0xC7, 0x7B, 0x94, 0xA6, + 0xA5, 0xA6, 0x94, 0x7B, 0xBD, 0xAE, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x24, 0xDE, 0xC7, 0x73, 0x9C, 0x73, 0x21, 0x00, 0x18, 0x63, 0x9C, 0x73, 0xC6, + 0xAD, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xCF, 0x94, + 0x84, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4A, 0x8C, 0x84, 0xA5, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xDE, 0x7B, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x73, 0x7B, 0xAD, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x18, 0x73, 0x42, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x45, 0x5A, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0xAD, 0x5D, 0x5A, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x63, 0x7B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0xDE, 0x7B, 0x8C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x8C, 0x7B, 0xAD, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, + 0xCE, 0x9C, 0x6B, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8C, 0x6B, 0x94, 0xA5, 0x21, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0xB5, 0xB5, 0xA5, 0x6B, 0x94, 0x65, + 0x52, 0x65, 0xA5, 0x7B, 0x8C, 0xB5, 0x94, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x45, 0x4A, 0x6B, 0x9C, 0x73, 0x8C, 0x94, 0x8C, 0x7B, 0x9C, 0x73, 0x42, + 0x4A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, + 0x00, 0x39, 0x8C, 0x94, 0x94, 0x94, 0x8C, 0x45, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00 +}; + +// Header Icon: icon_battery_42 (1764 elements, RGB565 True Color) static const unsigned short icon_battery_42[1764] PROGMEM = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -8388,87 +8733,80 @@ static const unsigned short icon_battery_42[1764] PROGMEM = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0820, 0x5ACB, 0x6B4C, 0x6B4D, 0x6B4C, 0x6B4D, 0x6B4C, 0x5ACB, 0x0820, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0041, 0x5ACB, 0x6B4D, 0x6B4C, 0x6B4D, 0x6B4C, 0x6B4D, 0x5ACB, 0x0041, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x52CB, 0xE6FC, 0xDF1C, 0xE6FC, - 0xDF1C, 0xE6FC, 0xDF1C, 0xE6FC, 0x52CB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x5AAB, 0xDF1C, 0xE6FC, 0xDF1C, 0xE6FC, 0xDF1C, 0xE6FC, 0xDF1C, 0x5AAB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630C, 0xE71C, 0xE6FB, 0xE71C, 0xE6FB, 0xE71C, 0xE6FB, 0xE71C, 0x630C, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x632C, 0xE6FB, 0xE71C, 0xE6FB, 0xE71C, - 0xE6FB, 0xE71C, 0xE6FB, 0x632C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x630C, 0xE6FC, 0xDF1C, 0xE6FC, 0xDF1C, 0xE6FC, 0xDF1C, 0xE6FC, 0x630C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630C, 0xDF1C, 0xE6FC, 0xDF1C, 0xE6FC, 0xDF1C, 0xE6FC, 0xDF1C, 0x630C, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2080, 0x62C4, 0xC504, 0xF6AC, 0xF6AB, 0xF6AB, 0xF6AB, 0xF6AB, - 0xF6AB, 0xF6AB, 0xC504, 0x9BE0, 0x9BC0, 0x9BE0, 0x9BC0, 0x9BE0, 0x9BC0, 0x9BE0, 0x9BC0, 0x9BE0, 0x9BC0, 0x9BE0, 0x9BC0, 0xC525, - 0xF6AB, 0xF6AB, 0xF6AB, 0xF6AB, 0xF6AB, 0xF6AB, 0xF6AB, 0xBD05, 0x62A4, 0x18A0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x3162, 0xEDE0, 0xFE41, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, - 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, - 0xFE60, 0xFE40, 0xFE61, 0xEDC0, 0x3183, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x2880, 0xCDAA, 0xFE40, 0xFE60, 0xFE40, 0xFE60, - 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, - 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xCD8A, 0x2080, - 0x0000, 0x0000, 0x0000, 0x0000, 0x6220, 0xEE48, 0xF663, 0xDD40, 0x5A83, 0x5A42, 0x5243, 0x5A42, 0x5243, 0x5A42, 0x5243, 0x5A42, - 0x5243, 0x5A42, 0x5243, 0x5A42, 0x5243, 0x5A42, 0x5243, 0x5A42, 0x5243, 0x5A42, 0x5243, 0x5A42, 0x5243, 0x5A42, 0x5243, 0x5A42, - 0x5243, 0x5A42, 0x5243, 0x5A42, 0x5242, 0x5A62, 0xD560, 0xFE42, 0xEE49, 0x6200, 0x0000, 0x0000, 0x0000, 0x0000, 0x9320, 0xF666, - 0xF647, 0x8B20, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, - 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, - 0x8B20, 0xEE47, 0xF646, 0x8B40, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B40, 0xF646, 0xEE48, 0x8AE0, 0x18C3, 0x18C3, 0x18C3, 0x18C3, - 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, - 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x8300, 0xF647, 0xEE46, 0x9340, 0x0000, 0x0000, - 0x0000, 0x0000, 0x9340, 0xF666, 0xF647, 0x8300, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, - 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, - 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x8B00, 0xEE47, 0xF645, 0x9360, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B40, 0xF646, 0xEE48, 0x8AE0, - 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, - 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x8300, 0xF647, - 0xEE46, 0x9340, 0x0000, 0x0000, 0x0000, 0x0000, 0x9340, 0xF666, 0xF647, 0x8300, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, - 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, - 0x5041, 0x8A49, 0xB269, 0x70A2, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x8B00, 0xEE47, 0xF645, 0x9360, 0x0000, 0x0000, 0x0000, 0x0000, - 0x8B40, 0xF646, 0xEE48, 0x8AE0, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, - 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x90C3, 0xD2AA, 0xEA6A, 0xD186, 0x18C3, 0x18C3, - 0x18C3, 0x18C3, 0x8300, 0xF647, 0xEE46, 0x9340, 0x0000, 0x0000, 0x0000, 0x0000, 0x9340, 0xF666, 0xF647, 0x8300, 0x18C3, 0x18C3, - 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, - 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0xA0C3, 0xD2AB, 0xF249, 0xD9A6, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x8B00, 0xEE47, 0xF645, 0x9360, - 0x0000, 0x0000, 0x0000, 0x0000, 0x8B40, 0xF646, 0xEE48, 0x8AE0, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, - 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x98C3, 0xDA8A, - 0xEA6A, 0xD986, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x8300, 0xF647, 0xEE46, 0x9340, 0x0000, 0x0000, 0x0000, 0x0000, 0x9340, 0xF666, - 0xF647, 0x8300, 0x18C3, 0x18C3, 0x528A, 0xE71C, 0xF77D, 0xF79E, 0xF77D, 0xF79E, 0xF77D, 0xDEFC, 0x4A28, 0x18C3, 0x18C3, 0x18C3, - 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x5040, 0x9269, 0xF207, 0xF208, 0xFA07, 0xFA49, 0xFA28, 0xFA28, 0xF207, 0xF208, 0xBA89, 0x7082, - 0x8B00, 0xEE47, 0xF645, 0x9360, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B40, 0xF646, 0xEE48, 0x8AE0, 0x18C3, 0x18C3, 0xB5B7, 0xFFFF, - 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xA555, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x8082, 0xD2AB, - 0xFA29, 0xFA08, 0xFA29, 0xFA08, 0xFA29, 0xFA08, 0xFA29, 0xFA08, 0xE26A, 0xC945, 0x8300, 0xF647, 0xEE46, 0x9340, 0x0000, 0x0000, - 0x0000, 0x0000, 0x9340, 0xF666, 0xF647, 0x8300, 0x18C3, 0x18C3, 0x7BAE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, - 0x6B2C, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x6840, 0xB2CB, 0xFA28, 0xFA28, 0xFA28, 0xFA28, 0xFA28, 0xFA28, - 0xFA28, 0xFA28, 0xDAAA, 0x98C3, 0x8B00, 0xEE47, 0xF645, 0x9360, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B40, 0xF646, 0xEE48, 0x8AE0, - 0x18C3, 0x18C3, 0x18C3, 0x39A6, 0x4249, 0x4A29, 0x4249, 0x4A29, 0x4249, 0x3186, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, - 0x18C3, 0x18C3, 0x18C3, 0x20E3, 0x4125, 0x4904, 0xA925, 0xE28A, 0xEA49, 0xE1A6, 0x4125, 0x4904, 0x2925, 0x20A2, 0x8300, 0xF647, - 0xEE46, 0x9340, 0x0000, 0x0000, 0x0000, 0x0000, 0x9340, 0xF666, 0xF647, 0x8300, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, - 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, - 0xA0C3, 0xD2AB, 0xF249, 0xD9A6, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x8B00, 0xEE47, 0xF645, 0x9360, 0x0000, 0x0000, 0x0000, 0x0000, - 0x8B40, 0xF646, 0xEE48, 0x8AE0, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, - 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x90C3, 0xDAAA, 0xEA6A, 0xD986, 0x18C3, 0x18C3, - 0x18C3, 0x18C3, 0x8300, 0xF647, 0xEE46, 0x9340, 0x0000, 0x0000, 0x0000, 0x0000, 0x9340, 0xF666, 0xF647, 0x8300, 0x18C3, 0x18C3, - 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, - 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x6840, 0xB2CB, 0xDA8A, 0x98C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x8B00, 0xEE47, 0xF645, 0x9360, - 0x0000, 0x0000, 0x0000, 0x0000, 0x8B40, 0xF646, 0xEE48, 0x8AE0, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, - 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x20C3, - 0x2104, 0x20A3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x8300, 0xF647, 0xEE46, 0x9340, 0x0000, 0x0000, 0x0000, 0x0000, 0x9340, 0xF666, - 0xF647, 0x8300, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, - 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, - 0x8B00, 0xEE47, 0xF645, 0x9360, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B40, 0xF646, 0xEE48, 0x8AE0, 0x18C3, 0x18C3, 0x18C3, 0x18C3, - 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, - 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x8300, 0xF647, 0xEE46, 0x9340, 0x0000, 0x0000, - 0x0000, 0x0000, 0x9340, 0xF666, 0xF647, 0x8300, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, - 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, - 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x8B00, 0xEE47, 0xF645, 0x9360, 0x0000, 0x0000, 0x0000, 0x0000, 0x6A80, 0xEE47, 0xF644, 0xC480, - 0x1904, 0x18C2, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, - 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x20E3, 0xBCA0, 0xF643, - 0xEE48, 0x7260, 0x0000, 0x0000, 0x0000, 0x0000, 0x38C0, 0xDE0A, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, - 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, - 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xE60A, 0x30C0, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0800, 0x6285, 0xFE40, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, - 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0xFE60, 0xFE40, - 0xFE60, 0xFE40, 0xFE60, 0xFE40, 0x5A85, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5180, 0x9C25, 0xDD60, 0xDD80, - 0xE580, 0xDDA0, 0xE580, 0xDDA0, 0xE580, 0xDDA0, 0xE580, 0xDDA0, 0xE580, 0xDDA0, 0xE580, 0xDDA0, 0xE580, 0xDDA0, 0xE580, 0xDDA0, - 0xE580, 0xDDA0, 0xE580, 0xDDA0, 0xE580, 0xDDA0, 0xE580, 0xDDA0, 0xE580, 0xDDA0, 0xE580, 0xDD60, 0xA424, 0x49A0, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xEFFD, 0xFFFF, 0xFFDF, 0xF7FE, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xEFFD, 0xF7FE, 0xFFFF, 0xEFFD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xEFFD, 0xF7DF, 0xFFDF, 0xEFFF, 0x0000, 0x0000, 0xDFFB, 0xFFDF, 0xFFDF, 0xFFDF, + 0xFFDF, 0xFFDF, 0xFFDF, 0xDFFB, 0xEFFD, 0xEFFD, 0xDFFB, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFFF, 0x0000, 0x0000, + 0xEFFD, 0xFFDF, 0xFFFF, 0xEFFD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, + 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0x0000, 0x0000, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFDF, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFBF, 0xEFFD, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFDF, 0xF7FE, 0xF7FE, 0xEFFD, + 0xFFDF, 0xFFDF, 0xFFFF, 0xFFDE, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFBE, 0xFFDF, + 0xFFFF, 0xFFFF, 0xEFFD, 0xF7FE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xEFFD, 0xFFBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, + 0xFFDF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFFF, + 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xF7FE, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xEFFD, 0xF7FE, 0xDFDF, 0xFFDF, 0xF7FE, 0xF7FE, 0xF7FE, 0xF7FE, 0xDF5F, 0xFFDF, 0xFFDF, + 0xF7FE, 0xFFDF, 0xFFDF, 0xFFDF, 0xF7FE, 0xF7FE, 0xFFDF, 0xFFDF, 0xF7FE, 0xF7FE, 0xF7FE, 0xDFDF, 0xFFDF, 0xFFDF, 0xF7FE, 0xF7FE, + 0xFFDF, 0xFFDF, 0xDFDF, 0xDFDF, 0xF7FE, 0xFFDF, 0xDFDF, 0xF7FE, 0xEFFD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFDF, + 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, + 0xFFDF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, + 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xE7FC, 0xDFFD, 0xE7FC, 0xF7FE, 0xF7FE, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFDF, 0xFFDF, + 0xFFFF, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x5FF1, 0x27EA, 0x27EA, + 0x27EB, 0x9FF6, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xE7FC, 0x37EB, 0x1FE9, 0x1FE9, 0x37EC, 0xE7FC, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFDF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xA7F7, 0x1FE9, 0x1FE9, 0x1FE9, 0x87F4, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, + 0xFFDF, 0xFFDF, 0xFFDF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFDF, + 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, 0xF7FE, 0x67F0, 0x1FE9, 0x1FE9, 0x37EC, 0xDFFD, 0xFFFF, + 0xFFDF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEFDF, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xE7FE, 0x37EC, 0x1FE9, 0x1FE9, 0x6FF1, 0xEFFE, 0xF7FE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, + 0xFFDF, 0xFFDE, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xB7F7, 0x1FEA, 0x1FE9, + 0x1FE9, 0x27EA, 0x2FEB, 0x37EB, 0x97F6, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFDF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xEF9F, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, + 0xFFBE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0x67F0, 0x1FE9, 0x1FE9, 0x1FE9, 0x1FE9, 0x1FE9, 0x4FED, 0xE7FD, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xF7FE, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xF7FE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFFF, + 0xFFFF, 0x87F4, 0x67F1, 0x6FF0, 0x2FEB, 0x1FE9, 0x2FEB, 0xBFF9, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xF7FE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xF7DF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFDF, 0xF7FE, 0x3FEC, 0x1FE9, + 0x87F4, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xF7FE, 0xF7FE, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFE, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xC7FA, 0x27EA, 0x5FEF, 0xF7FE, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDE, + 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, + 0xFFFF, 0x8FF4, 0x3FEC, 0xCFFB, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDE, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xEFFF, 0xFFFF, 0xFFDF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDE, 0xFFDF, 0xFFDF, 0xFFBE, 0xFFFF, 0x5FF0, 0x9FF6, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF7FE, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xE7FD, 0x97F5, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDE, 0xFFFF, 0xFFDF, + 0xFFFF, 0xFFFF, 0xFFDF, 0xFFBF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xF7FE, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, 0xEFFD, 0xEFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFDF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xE7FF, 0xFFFF, 0xFFDF, 0xFFFF, 0xF7FE, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFBE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7FE, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xFFFF, 0xEF9F, 0xEF9F, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, + 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xEF9F, 0xEFDF, 0xFFDF, + 0xFFFF, 0xEFDF, 0xFFFF, 0xEFDF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BF, 0xFFFF, 0xEF9F, 0xEFDF, 0xFFFF, 0xFFFF, + 0xEFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEFDF, 0xFFFF, 0xEFDF, 0xFFDF, + 0xEFDF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -8482,14 +8820,136 @@ static const unsigned short icon_battery_42[1764] PROGMEM = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000 +}; + +// Header Icon Alpha: icon_battery_42_alpha (1764 elements, 8-bit Alpha Mask) +static const unsigned char icon_battery_42_alpha[1764] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xA6, 0xBD, 0x5D, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0xC3, 0x9E, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xA5, 0xB5, 0x5A, 0x00, 0x00, 0x1C, 0x31, 0x31, 0x31, + 0x31, 0x31, 0x31, 0x30, 0x2C, 0x2C, 0x30, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x18, 0x00, 0x00, + 0x61, 0xBD, 0x94, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x39, 0xA5, 0xB6, 0x65, 0x00, 0x00, 0x8C, 0xD7, 0xDE, 0xDE, 0xD7, 0xCF, 0xC6, 0xBD, 0xB5, 0xB5, + 0xB6, 0xBD, 0xC6, 0xCE, 0xCF, 0xD7, 0xDE, 0x8C, 0x00, 0x00, 0x6D, 0xBD, 0x96, 0x39, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x24, 0x29, 0x52, 0x6B, 0x73, 0x5D, 0x3C, 0x2C, + 0xA5, 0xE7, 0xE7, 0xEF, 0xE7, 0xD7, 0xCE, 0xBE, 0xB5, 0xB5, 0xB6, 0xBE, 0xC7, 0xCF, 0xDE, 0xE7, + 0xE7, 0xA6, 0x2C, 0x3C, 0x65, 0x75, 0x65, 0x52, 0x29, 0x24, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x9C, 0xA6, 0xAD, 0xAE, 0xAE, 0xB5, 0xBD, 0xBE, 0xC7, 0xD6, 0xDF, 0xE7, 0xEB, 0xE7, 0xD7, + 0xCE, 0xBE, 0xB5, 0xB5, 0xB6, 0xBE, 0xC7, 0xCF, 0xD7, 0xDF, 0xE7, 0xE7, 0xD7, 0xCF, 0xC7, 0xBE, + 0xB6, 0xAE, 0xAD, 0xA6, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x96, 0xA5, 0xA6, 0xAD, 0xAE, + 0xB5, 0xBD, 0xBE, 0xC7, 0xCF, 0xD7, 0xDE, 0xDE, 0xD7, 0xCE, 0xBE, 0xB6, 0xAD, 0xAD, 0xB5, 0xBA, + 0xBE, 0xC7, 0xCF, 0xD6, 0xDE, 0xDF, 0xDE, 0xD6, 0xCE, 0xC3, 0xB6, 0xAD, 0xA5, 0x9E, 0x94, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x34, 0x39, 0x39, 0x3C, 0x3C, 0x3C, 0x3C, 0x42, 0x42, 0x42, + 0x45, 0x42, 0x42, 0x42, 0x3C, 0x3C, 0x39, 0x39, 0x3C, 0x3C, 0x3C, 0x42, 0x42, 0x42, 0x45, 0x45, + 0x42, 0x42, 0x42, 0x42, 0x3C, 0x39, 0x39, 0x34, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x65, 0x8E, 0x94, 0x94, 0x96, 0x96, 0x9C, 0x9C, 0x9E, 0xA5, 0xA6, 0xA5, 0xA5, 0x9E, 0x9C, 0x96, + 0x94, 0x8E, 0x94, 0x96, 0x96, 0x9C, 0x9E, 0xA5, 0xA5, 0xA6, 0xA5, 0x9E, 0x9C, 0x9C, 0x96, 0x94, + 0x8E, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0xAE, 0xB5, 0xB6, 0xBD, 0xC6, + 0xCE, 0xCF, 0xD7, 0xDF, 0xE7, 0xE7, 0xDF, 0xD6, 0xC7, 0xBE, 0xB5, 0xB5, 0xB6, 0xBE, 0xC7, 0xCE, + 0xD6, 0xDE, 0xE7, 0xE7, 0xE7, 0xDE, 0xCF, 0xC7, 0xBD, 0xB5, 0xAD, 0x84, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7D, 0xAD, 0xAE, 0xB5, 0xBD, 0xBE, 0xC7, 0xCE, 0xD6, 0xDE, 0xDF, 0xE7, + 0xDE, 0xCF, 0xC6, 0xAA, 0xA6, 0xA2, 0xA6, 0xAE, 0xC3, 0xCE, 0xD6, 0xD7, 0xDF, 0xE7, 0xDF, 0xD7, + 0xCF, 0xC6, 0xB6, 0xAE, 0xAD, 0x7D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xAD, + 0xAE, 0xB5, 0xB6, 0xBD, 0xC6, 0xCE, 0xD6, 0xDE, 0xDF, 0xDF, 0xD7, 0xCF, 0xBE, 0xB6, 0xDB, 0xDB, + 0xD7, 0xBA, 0xBE, 0xC7, 0xCF, 0xD7, 0xDF, 0xE7, 0xDF, 0xD7, 0xCE, 0xC6, 0xB6, 0xAE, 0xA6, 0x75, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0xA6, 0xAD, 0xAE, 0xB5, 0xBD, 0xBE, 0xC7, + 0xCF, 0xD7, 0xDE, 0xDF, 0xD7, 0xCE, 0xB6, 0xDB, 0xF7, 0xF7, 0xE7, 0xC3, 0xBE, 0xC7, 0xCF, 0xD7, + 0xDF, 0xDF, 0xDE, 0xD6, 0xC7, 0xBE, 0xB6, 0xAD, 0xA6, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x6D, 0xA5, 0xA6, 0xAD, 0xB5, 0xB6, 0xBE, 0xC7, 0xCE, 0xD6, 0xDE, 0xDE, 0xD7, 0xCB, + 0xB2, 0xEF, 0xF7, 0xF3, 0xCF, 0xBA, 0xBE, 0xC6, 0xCE, 0xD6, 0xDE, 0xDF, 0xDB, 0xCF, 0xC7, 0xBD, + 0xB5, 0xAD, 0xA5, 0x6D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xA5, 0xA6, 0xAD, + 0xAE, 0xB6, 0xBD, 0xC6, 0xCE, 0xD6, 0xD7, 0xDE, 0xD6, 0xC3, 0xBE, 0xF7, 0xF7, 0xE7, 0xBE, 0xB6, + 0xBD, 0xC6, 0xCE, 0xD3, 0xD7, 0xDE, 0xD7, 0xCF, 0xC6, 0xBA, 0xAE, 0xA6, 0x9E, 0x6B, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x9E, 0xA5, 0xA6, 0xAD, 0xB2, 0xB6, 0xBE, 0xC7, 0xCF, + 0xD7, 0xD7, 0xCF, 0xB6, 0xD7, 0xF7, 0xF3, 0xC7, 0xA2, 0xA6, 0xAA, 0xBE, 0xC7, 0xCF, 0xD6, 0xD7, + 0xD6, 0xCE, 0xBE, 0xB5, 0xAD, 0xA5, 0x9C, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x63, 0x9C, 0x9E, 0xA5, 0xA6, 0xAE, 0xB5, 0xBD, 0xC6, 0xCE, 0xD6, 0xD6, 0xCE, 0xB2, 0xEB, 0xF7, + 0xF3, 0xDB, 0xCF, 0xCB, 0xBA, 0xBD, 0xC6, 0xCE, 0xD6, 0xD6, 0xCF, 0xC7, 0xBD, 0xB5, 0xA6, 0x9E, + 0x9C, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x96, 0x9C, 0x9E, 0xA6, 0xAD, + 0xB5, 0xB6, 0xBE, 0xC7, 0xCF, 0xD6, 0xC6, 0xBE, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xE3, 0xBA, 0xB6, + 0xBE, 0xC7, 0xCF, 0xD6, 0xCE, 0xC6, 0xB6, 0xAE, 0xA5, 0x9C, 0x96, 0x5D, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x5D, 0x94, 0x96, 0x9C, 0x9E, 0xA6, 0xAD, 0xB5, 0xBD, 0xC6, 0xCE, 0xCF, + 0xBE, 0xCB, 0xDF, 0xDB, 0xDF, 0xF7, 0xEB, 0xC7, 0xB5, 0xB6, 0xBE, 0xC7, 0xCE, 0xCF, 0xCE, 0xBE, + 0xB6, 0xAE, 0xA5, 0x9C, 0x94, 0x5D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5A, 0x8E, + 0x94, 0x96, 0x9C, 0xA5, 0xA6, 0xAE, 0xB6, 0xC6, 0xCE, 0xCE, 0xC6, 0xBE, 0xB5, 0xA2, 0xCF, 0xF3, + 0xCB, 0xAE, 0xAE, 0xB5, 0xBD, 0xC6, 0xC7, 0xCE, 0xC7, 0xBE, 0xB5, 0xAD, 0x9E, 0x96, 0x92, 0x5D, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5A, 0x8E, 0x8E, 0x94, 0x9C, 0x9E, 0xA6, 0xAE, + 0xB6, 0xBE, 0xC7, 0xC7, 0xBE, 0xB5, 0xAD, 0x9E, 0xDF, 0xD7, 0xA6, 0xA5, 0xAD, 0xB5, 0xBD, 0xC6, + 0xC7, 0xCE, 0xC7, 0xBE, 0xB5, 0xA6, 0x9E, 0x96, 0x8E, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x5A, 0x8C, 0x8C, 0x8E, 0x96, 0x9C, 0xA5, 0xAD, 0xB5, 0xBD, 0xC6, 0xC7, 0xBE, 0xB5, + 0xA6, 0xA6, 0xDF, 0xAE, 0x9C, 0x9E, 0xA6, 0xAE, 0xB6, 0xBE, 0xC7, 0xCE, 0xC6, 0xBD, 0xAE, 0xA6, + 0x9C, 0x94, 0x8C, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5A, 0x86, 0x8C, 0x8E, + 0x94, 0x9C, 0x9E, 0xA6, 0xAE, 0xB6, 0xC6, 0xC6, 0xBD, 0xB5, 0x9E, 0xB2, 0xBA, 0x96, 0x9C, 0x9E, + 0xA6, 0xAD, 0xB5, 0xBD, 0xC6, 0xC7, 0xC6, 0xB6, 0xAE, 0xA5, 0x9C, 0x94, 0x8C, 0x5A, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x86, 0x8C, 0x8E, 0x94, 0x96, 0x9E, 0xA6, 0xAE, 0xB6, + 0xBE, 0xC6, 0xBD, 0xAE, 0x9E, 0xAA, 0x96, 0x8E, 0x96, 0x9E, 0xA5, 0xAD, 0xB5, 0xBD, 0xBE, 0xC6, + 0xBE, 0xB6, 0xAD, 0xA5, 0x96, 0x8E, 0x8C, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x55, 0x84, 0x86, 0x8C, 0x8E, 0x94, 0x9C, 0xA5, 0xAE, 0xB5, 0xBD, 0xBE, 0xB6, 0xAD, 0x9E, 0x9E, + 0x8E, 0x8E, 0x94, 0x9C, 0xA5, 0xAD, 0xAE, 0xB6, 0xBE, 0xC6, 0xBD, 0xB5, 0xAD, 0x9E, 0x96, 0x8E, + 0x8C, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x75, 0x84, 0x86, 0x8A, 0x8E, 0x94, + 0x9C, 0xA5, 0xAD, 0xB5, 0xB6, 0xBD, 0xB5, 0xAD, 0xA5, 0x96, 0x8E, 0x8C, 0x94, 0x96, 0x9E, 0xA6, + 0xAE, 0xB6, 0xBD, 0xBE, 0xBD, 0xAE, 0xA6, 0x9E, 0x96, 0x8E, 0x86, 0x75, 0x4D, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x75, 0x84, 0x84, 0x84, 0x86, 0x8E, 0x94, 0x9C, 0xA5, 0xA6, 0xAE, 0xB6, 0xBD, + 0xB5, 0xAA, 0x9E, 0x94, 0x8E, 0x8C, 0x94, 0x96, 0x9E, 0xA5, 0xAD, 0xB5, 0xBD, 0xBE, 0xB6, 0xAE, + 0xA6, 0x9E, 0x94, 0x8C, 0x86, 0x84, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x6B, 0x6B, + 0x6D, 0x73, 0x75, 0x7B, 0x7D, 0x84, 0x86, 0x8E, 0x94, 0x96, 0x94, 0x86, 0x84, 0x7B, 0x75, 0x75, + 0x7B, 0x7D, 0x7D, 0x86, 0x8C, 0x8E, 0x94, 0x96, 0x94, 0x8E, 0x86, 0x7D, 0x7B, 0x75, 0x73, 0x6B, + 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00 }; // ==================================================== // Iconos 4 Cuadrantes HD Vectoriales (5px distancia exacta al arco) // ==================================================== -// Quad Icon: icon_temp_quad (38x37 px, 1406 elements, RGB565) +// Quad Icon: icon_temp_quad (1406 elements, RGB565 True Color) static const unsigned short icon_temp_quad[1406] PROGMEM = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -8499,89 +8959,181 @@ static const unsigned short icon_temp_quad[1406] PROGMEM = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x94B3, 0xEF9E, 0xEF7D, 0x7C10, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xF7BF, 0xF7DF, 0xFFFF, 0xEFDF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x634D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x4A69, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xEFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7FE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xA514, 0xCE7A, 0x5AEC, 0x5AED, 0xDEFC, - 0x8410, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFDF, 0xF7BF, 0xEF9F, 0xD6FF, 0xF7BF, + 0xFFDF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x9CF3, 0xAD76, 0x0000, 0x0001, 0xC65A, 0x8430, 0x2124, 0x2965, 0x2925, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xFFFF, 0xF7BF, 0x0000, 0x0000, 0xEF9F, 0xFFFF, 0xEFFD, 0xEFFD, 0xFF1F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9CF3, 0xAD97, 0x0042, 0x0883, 0xC639, 0xA534, 0xDF1C, 0xF7DF, 0xEFBF, - 0x2925, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9CF3, 0xAD97, 0x0022, - 0x0862, 0xCE7A, 0x8430, 0x2124, 0x2965, 0x2945, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xEF9F, 0x0000, 0x0000, 0xF7BF, 0xFFFF, 0xF7DF, 0xF7DF, 0xEFBF, + 0xFF1F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xEF9F, 0x0000, + 0x0000, 0xF7BF, 0xFFFF, 0xEFFD, 0xEFFD, 0xFFDF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x9CF3, 0xAD97, 0x0001, 0x0042, 0xCE7A, 0x7BEF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xFFFF, 0xEF9F, 0x0000, 0x0000, 0xF7BF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9CF3, 0xE5F7, 0xB8E3, 0xB924, 0xEEBB, 0x7BEF, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFE9A, 0xF924, 0xF985, 0xFF3D, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x94F3, - 0xFE18, 0xF944, 0xF984, 0xFE9A, 0x94F3, 0xB5D7, 0xCE79, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xEFFF, + 0xFE18, 0xF944, 0xF984, 0xFE9A, 0xEFFF, 0xF7DF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x94F3, 0xFDF8, 0xF144, 0xF164, 0xFE9A, 0x8CB2, 0x7BF0, 0x8C71, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xEFFF, 0xFDF8, 0xF944, 0xF964, 0xFE9A, 0xEFFF, 0xEF9F, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x94F3, 0xFDF8, 0xF944, 0xF964, 0xFEDB, - 0x73EF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xEFFF, 0xFDF8, 0xF944, 0xF964, 0xFEDB, + 0xEFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x94F3, 0xFDF8, 0xF944, 0xF964, 0xFEBB, 0x7BEF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xEFFF, 0xFDF8, 0xF944, 0xF964, 0xFEBB, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x94F3, 0xFDF8, 0xF944, 0xF964, 0xFEBB, 0x8451, 0x4208, 0x4A49, 0x4229, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xEFFF, 0xFDF8, 0xF944, 0xF964, 0xFEBB, 0xF7DF, 0xFFDF, 0xFFFF, 0xE77F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9D14, 0xFDF8, 0xF944, - 0xF984, 0xFE7A, 0xA554, 0xDEFC, 0xF7BE, 0xEF7E, 0x2125, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF7DF, 0xFDF8, 0xF944, + 0xF984, 0xFE7A, 0xFFFF, 0xF7BF, 0xFFFF, 0xF7BF, 0xCF1F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x94D2, 0xFDF8, 0xF944, 0xF964, 0xFEBB, 0x73CF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xF7FE, 0xFDF8, 0xF944, 0xF964, 0xFEBB, 0xEFDF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xCE99, 0xF5F7, 0xF944, 0xF964, 0xF6BB, 0xB5D7, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFE38, 0xF944, 0xF964, 0xFEFC, 0xF7DF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2925, 0xDF1C, 0xFE9A, - 0xF2CA, 0xF9A5, 0xF9A5, 0xF32B, 0xFF1C, 0xCE9A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFF1F, 0xF7DF, 0xFE9A, + 0xFAEA, 0xF9A5, 0xF9A5, 0xFB4B, 0xFF1C, 0xF7DF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0xC69A, 0xFE59, 0xF964, 0xF984, 0xF9C6, 0xF9C6, 0xF964, 0xF1A5, 0xFF1B, 0xADB6, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xEFDF, 0xFE59, 0xF964, 0xF984, 0xF9C6, 0xF9C6, 0xF964, 0xF9A5, 0xFF1B, 0xF7FF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4A8A, 0xFFFF, 0xF227, 0xF985, 0xF9E6, 0xF9C5, 0xF9C5, 0xF9E6, - 0xF964, 0xF2CA, 0xFFFF, 0x3186, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C92, 0xFE7A, - 0xF944, 0xF9C6, 0xF9C5, 0xF9C5, 0xF9C5, 0xF9C5, 0xF9C6, 0xF984, 0xFF1C, 0x6B8E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xE7FF, 0xFFFF, 0xFA27, 0xF985, 0xF9E6, 0xF9C5, 0xF9C5, 0xF9E6, + 0xF964, 0xFAEA, 0xFFFF, 0xFFDF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF7FF, 0xFE7A, + 0xF944, 0xF9C6, 0xF9C5, 0xF9C5, 0xF9C5, 0xF9C5, 0xF9C6, 0xF984, 0xFF1C, 0xEFDF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x9D14, 0xFDF7, 0xF923, 0xF9C6, 0xF9C5, 0xF9C5, 0xF9C5, 0xF9C5, 0xF9C6, 0xF944, 0xFEBA, 0x7C10, + 0x0000, 0x0000, 0x0000, 0x0000, 0xF7DF, 0xFDF7, 0xF923, 0xF9C6, 0xF9C5, 0xF9C5, 0xF9C5, 0xF9C5, 0xF9C6, 0xF944, 0xFEBA, 0xEFDF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7BEF, 0xFF1C, 0xF964, 0xF9C6, 0xF9C5, 0xF9C5, - 0xF9C5, 0xF9C6, 0xF9C5, 0xF9A5, 0xFF9E, 0x5AEC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFF1C, 0xF964, 0xF9C6, 0xF9C5, 0xF9C5, + 0xF9C5, 0xF9C6, 0xF9C5, 0xF9A5, 0xFF9E, 0xEF9F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x3166, 0xFFFF, 0xF34C, 0xF923, 0xF9E6, 0xF9C6, 0xF9C6, 0xF9E6, 0xF903, 0xFC10, 0xEFDE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xFF3F, 0xFFFF, 0xFB6C, 0xF923, 0xF9E6, 0xF9C6, 0xF9C6, 0xF9E6, 0xF903, 0xFC10, 0xEFDE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CB2, 0xFFDF, 0xF2CA, 0xF923, 0xF944, 0xF944, 0xF923, 0xF34C, 0xFFFF, - 0x6B6D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x08E5, 0x1147, 0x0000, 0x0000, 0x9D14, 0xFFFF, - 0xFE17, 0xFC51, 0xFC71, 0xFE59, 0xFFFF, 0x73AE, 0x0000, 0x1188, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x08C4, 0x1167, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x08C4, 0x3437, - 0x45DF, 0x4E1F, 0x3479, 0x11A9, 0x0000, 0x528A, 0xA555, 0xCE9A, 0xCEBA, 0x94B2, 0x4A8B, 0x1B11, 0x45BF, 0x4E3F, 0x3D1C, 0x19CA, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2B73, 0x45BF, 0x4E1F, 0x3D1C, 0x1A2C, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x11AA, 0x455D, 0x4E1F, 0x2BB5, 0x22F1, 0x45BF, 0x4DFF, 0x228E, 0x0000, 0x0000, 0x0000, 0x0000, 0x00C5, - 0x34BB, 0x4E5F, 0x2BB5, 0x22F1, 0x455E, 0x4DFF, 0x22D0, 0x0000, 0x0000, 0x0000, 0x0000, 0x1127, 0x3CDB, 0x4E5F, 0x3417, 0x22B0, - 0x453D, 0x4E7F, 0x228E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1A6D, 0x45DF, 0x459E, 0x1A4D, 0x0000, 0x0000, 0x1147, 0x3CDB, - 0x4E3F, 0x2B94, 0x0000, 0x0000, 0x1A6D, 0x4DDF, 0x459F, 0x1A2C, 0x0000, 0x0000, 0x08C4, 0x3CBA, 0x4E5F, 0x2B94, 0x0000, 0x0000, - 0x19CA, 0x457E, 0x4DFF, 0x22D0, 0x0000, 0x0000, 0x08C5, 0x2B93, 0x08E5, 0x0000, 0x0000, 0x22AF, 0x455C, 0x3CBB, 0x4E3F, 0x3D3C, - 0x1127, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3458, 0x4E5F, 0x3D1C, 0x3479, 0x4E3F, 0x3D3C, 0x1127, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x2BD5, 0x4E5F, 0x3D1D, 0x3458, 0x4DFF, 0x459E, 0x11AA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x226E, 0x3CFB, 0x3CDB, 0x2331, 0x0000, 0x0000, 0x1106, 0x22F0, 0x2B94, 0x1147, 0x0000, 0x0000, 0x22AF, 0x3CDA, 0x3D5D, - 0x2331, 0x0000, 0x0000, 0x0000, 0x22CF, 0x2B93, 0x19EB, 0x0000, 0x0000, 0x1A2C, 0x3C9A, 0x455D, 0x2BD5, 0x1127, 0x0000, 0x0000, - 0x22CF, 0x2B93, 0x19EA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x226E, 0x4DDF, 0x459F, 0x3D1D, - 0x4DFF, 0x2B94, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1A4D, 0x459E, 0x457F, 0x3D1D, 0x4E1F, 0x33F5, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x19CA, 0x457E, 0x45BF, 0x3D1C, 0x4E1F, 0x3458, 0x08C5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x2B94, 0x4E5F, 0x2BB5, 0x0000, 0x0000, 0x228E, 0x4E1F, 0x3478, 0x0000, 0x0000, 0x0000, 0x0000, 0x2B52, 0x4E3F, 0x33F6, - 0x0000, 0x0000, 0x1A2C, 0x4DFF, 0x3CFB, 0x08E5, 0x0000, 0x0000, 0x0000, 0x22F0, 0x4E3F, 0x3478, 0x08C4, 0x0000, 0x19EB, 0x459D, - 0x11CA, 0x0000, 0x0000, 0x08C4, 0x11A9, 0x1147, 0x3478, 0x4E1F, 0x228E, 0x0000, 0x0000, 0x0000, 0x0000, 0x11A9, 0x459E, 0x455D, - 0x19EB, 0x1127, 0x3478, 0x4E1F, 0x228E, 0x0000, 0x0000, 0x0000, 0x0000, 0x1147, 0x455C, 0x457E, 0x19EB, 0x0906, 0x2BB5, 0x4E3F, - 0x2331, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x22F1, 0x4E1F, 0x459F, 0x455D, 0x19EB, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x08E5, 0x3CDA, 0x45DF, 0x459F, 0x455D, 0x19EB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x08C5, 0x3457, 0x45BF, 0x457F, 0x45BF, 0x228E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xEFFF, 0xFFDF, 0xFAEA, 0xF923, 0xF944, 0xF944, 0xF923, 0xFB6C, 0xFFFF, + 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x357F, 0x4D9F, 0x0000, 0x0000, 0xF7DF, 0xFFFF, + 0xFE17, 0xFC51, 0xFC71, 0xFE59, 0xFFFF, 0xFFFF, 0x0000, 0x3DDF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x3DDF, 0x4E3F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3DDF, 0x45BF, + 0x45DF, 0x4E1F, 0x3D9F, 0x359F, 0x0000, 0xFFFF, 0xF7DF, 0xF7DF, 0xF7FF, 0xFFFF, 0xD73F, 0x2D9F, 0x45BF, 0x4E3F, 0x3D9F, 0x4D7F, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x459F, 0x45BF, 0x4E1F, 0x3D9F, 0x3D9F, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x351F, 0x45BF, 0x4E1F, 0x3D7F, 0x3D5F, 0x45BF, 0x4DFF, 0x4DBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x04BF, + 0x3D7F, 0x4E5F, 0x3D7F, 0x3D5F, 0x459F, 0x4DFF, 0x457F, 0x0000, 0x0000, 0x0000, 0x0000, 0x4D1F, 0x459F, 0x4E5F, 0x457F, 0x453F, + 0x459F, 0x4E7F, 0x4DBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3DDF, 0x45DF, 0x45DF, 0x3D7F, 0x0000, 0x0000, 0x4D9F, 0x459F, + 0x4E3F, 0x3D7F, 0x0000, 0x0000, 0x3DDF, 0x4DDF, 0x459F, 0x3D9F, 0x0000, 0x0000, 0x3DDF, 0x459F, 0x4E5F, 0x3D7F, 0x0000, 0x0000, + 0x4D7F, 0x45BF, 0x4DFF, 0x457F, 0x0000, 0x0000, 0x34BF, 0x45DF, 0x357F, 0x0000, 0x0000, 0x459F, 0x4DFF, 0x457F, 0x4E3F, 0x3DBF, + 0x4D1F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3D9F, 0x4E5F, 0x3D9F, 0x3D9F, 0x4E3F, 0x3DBF, 0x4D1F, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x3D9F, 0x4E5F, 0x3D7F, 0x3D9F, 0x4DFF, 0x45DF, 0x351F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x4D5F, 0x45BF, 0x459F, 0x3DDF, 0x0000, 0x0000, 0x553F, 0x45BF, 0x3D7F, 0x4D9F, 0x0000, 0x0000, 0x459F, 0x45DF, 0x3DBF, + 0x3DDF, 0x0000, 0x0000, 0x0000, 0x45DF, 0x45DF, 0x455F, 0x0000, 0x0000, 0x3D9F, 0x457F, 0x45BF, 0x3D9F, 0x4D1F, 0x0000, 0x0000, + 0x45DF, 0x45DF, 0x4DDF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4D5F, 0x4DDF, 0x459F, 0x3D7F, + 0x4DFF, 0x3D7F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3D7F, 0x45DF, 0x457F, 0x3D7F, 0x4E1F, 0x4DDF, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x4D7F, 0x45BF, 0x45BF, 0x3D9F, 0x4E1F, 0x3D9F, 0x34BF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x3D7F, 0x4E5F, 0x3D7F, 0x0000, 0x0000, 0x4DBF, 0x4E1F, 0x3DBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x45BF, 0x4E3F, 0x459F, + 0x0000, 0x0000, 0x3D9F, 0x4DFF, 0x45BF, 0x357F, 0x0000, 0x0000, 0x0000, 0x45BF, 0x4E3F, 0x3DBF, 0x3DDF, 0x0000, 0x455F, 0x45FF, + 0x357F, 0x0000, 0x0000, 0x3DDF, 0x359F, 0x4D9F, 0x3DBF, 0x4E1F, 0x4DBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x359F, 0x45DF, 0x45BF, + 0x455F, 0x4D1F, 0x3DBF, 0x4E1F, 0x4DBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x4D9F, 0x4DFF, 0x45BF, 0x455F, 0x2D3F, 0x3D7F, 0x4E3F, + 0x3DDF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3D5F, 0x4E1F, 0x459F, 0x45BF, 0x455F, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x357F, 0x45DF, 0x45DF, 0x459F, 0x45BF, 0x455F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x34BF, 0x45DF, 0x45BF, 0x457F, 0x45BF, 0x4DBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }; -// Quad Icon: icon_speed_quad (42x43 px, 1806 elements, RGB565) +// Quad Icon Alpha: icon_temp_quad_alpha (1406 elements, 8-bit Alpha Mask) +static const unsigned char icon_temp_quad_alpha[1406] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x9C, 0xF7, 0xEF, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xFF, 0xFF, 0xFF, 0xFF, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA5, 0xD6, 0x63, 0x6B, 0xE7, + 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x9E, 0xB5, 0x00, 0x00, 0xD6, 0x86, 0x24, 0x2C, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9E, 0xBD, 0x00, 0x00, 0xCE, 0xA6, 0xE7, 0xFF, 0xFF, + 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9E, 0xBD, 0x00, + 0x00, 0xD6, 0x86, 0x24, 0x2C, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x9E, 0xBD, 0x00, 0x00, 0xD6, 0x7D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9E, 0xE7, 0xBD, 0xBD, 0xEF, 0x7D, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9E, + 0xFF, 0xFF, 0xFF, 0xFF, 0x9E, 0xBD, 0xCF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x9E, 0xFF, 0xF7, 0xF7, 0xFF, 0x96, 0x84, 0x8E, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9E, 0xFF, 0xFF, 0xFF, 0xFF, + 0x7D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x9E, 0xFF, 0xFF, 0xFF, 0xFF, 0x7D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9E, 0xFF, 0xFF, 0xFF, 0xFF, 0x8C, 0x42, 0x4A, 0x4A, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA5, 0xFF, 0xFF, + 0xFF, 0xFF, 0xAA, 0xE7, 0xF7, 0xF7, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x9A, 0xFF, 0xFF, 0xFF, 0xFF, 0x7B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD3, 0xF7, 0xFF, 0xFF, 0xF7, 0xBD, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0xE7, 0xFF, + 0xF7, 0xFF, 0xFF, 0xF7, 0xFF, 0xD6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xD6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 0xB6, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xF7, 0xFF, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xA5, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x84, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x31, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x96, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, + 0x6D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x39, 0x00, 0x00, 0xA5, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x75, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x21, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0xBD, + 0xFF, 0xFF, 0xCE, 0x4A, 0x00, 0x52, 0xAD, 0xD6, 0xD7, 0x96, 0x5A, 0x8C, 0xFF, 0xFF, 0xE7, 0x52, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9C, 0xFF, 0xFF, 0xE7, 0x63, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x52, 0xEF, 0xFF, 0xAD, 0x8C, 0xFF, 0xFF, 0x73, 0x00, 0x00, 0x00, 0x00, 0x29, + 0xDE, 0xFF, 0xAD, 0x8C, 0xF7, 0xFF, 0x84, 0x00, 0x00, 0x00, 0x00, 0x39, 0xDE, 0xFF, 0xBD, 0x84, + 0xEF, 0xFF, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xFF, 0xF7, 0x6B, 0x00, 0x00, 0x39, 0xDE, + 0xFF, 0xA5, 0x00, 0x00, 0x6B, 0xFF, 0xFF, 0x63, 0x00, 0x00, 0x21, 0xD6, 0xFF, 0xA5, 0x00, 0x00, + 0x52, 0xF7, 0xFF, 0x84, 0x00, 0x00, 0x29, 0x9C, 0x29, 0x00, 0x00, 0x7B, 0xE7, 0xDE, 0xFF, 0xE7, + 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xFF, 0xE7, 0xCE, 0xFF, 0xE7, 0x39, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xAD, 0xFF, 0xEF, 0xC6, 0xFF, 0xF7, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x73, 0xDE, 0xDE, 0x8C, 0x00, 0x00, 0x31, 0x84, 0xA5, 0x39, 0x00, 0x00, 0x7B, 0xD6, 0xEF, + 0x8C, 0x00, 0x00, 0x00, 0x7B, 0x9C, 0x5A, 0x00, 0x00, 0x63, 0xD6, 0xEF, 0xAD, 0x39, 0x00, 0x00, + 0x7B, 0x9C, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0xFF, 0xFF, 0xEF, + 0xFF, 0xA5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xF7, 0xFF, 0xEF, 0xFF, 0xAD, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x52, 0xF7, 0xFF, 0xE7, 0xFF, 0xC6, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xA5, 0xFF, 0xAD, 0x00, 0x00, 0x73, 0xFF, 0xC6, 0x00, 0x00, 0x00, 0x00, 0x94, 0xFF, 0xB5, + 0x00, 0x00, 0x63, 0xFF, 0xDE, 0x29, 0x00, 0x00, 0x00, 0x84, 0xFF, 0xC6, 0x21, 0x00, 0x5A, 0xEF, + 0x52, 0x00, 0x00, 0x21, 0x4A, 0x39, 0xC6, 0xFF, 0x73, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xF7, 0xEF, + 0x5A, 0x39, 0xC6, 0xFF, 0x73, 0x00, 0x00, 0x00, 0x00, 0x39, 0xE7, 0xF7, 0x5A, 0x31, 0xAD, 0xFF, + 0x8C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8C, 0xFF, 0xFF, 0xEF, 0x5A, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x29, 0xD6, 0xFF, 0xFF, 0xEF, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x29, 0xBD, 0xFF, 0xFF, 0xFF, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +// Quad Icon: icon_speed_quad (1806 elements, RGB565 True Color) static const unsigned short icon_speed_quad[1806] PROGMEM = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -8594,92 +9146,90 @@ static const unsigned short icon_speed_quad[1806] PROGMEM = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x528A, 0x8431, 0xA555, 0xBE18, 0xCE7A, 0xCE7A, 0xC639, 0xAD76, - 0x8C51, 0x5ACB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4A69, - 0xA535, 0xE73D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF7E, 0xAD76, 0x5ACB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4A49, 0xBE18, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BF, 0xD69A, 0x6B4D, 0x528A, - 0x4208, 0x4208, 0x4A6A, 0x632D, 0xA535, 0xF7BE, 0xF7DF, 0xFFFF, 0xFFFF, 0xCE79, 0x52AB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x94D3, 0xFFFF, 0xFFFF, 0xE75D, 0x8451, 0x528A, 0xFFFF, 0xD69A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x73AE, 0xE73C, - 0x2965, 0x8410, 0xDF1C, 0xFFFF, 0xFFFF, 0xAD55, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2945, 0xCE9A, 0xFFFF, 0xF7BF, 0x8C72, 0x0000, 0x0000, 0x0000, - 0xD6BA, 0xFFDF, 0x2945, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x94B2, 0x9492, 0x0000, 0x0000, 0x0000, 0x7C10, 0xEF7E, 0xFFFF, - 0xDEFC, 0x39E8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x39C7, 0xDF1C, 0xFFFF, 0xD6DB, 0x4208, 0x0000, 0x0000, 0x0000, 0x0000, 0x94B2, 0xFFFF, 0x738E, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3186, 0xC639, 0xFFFF, 0xEF9E, 0x4A6A, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2945, 0xE71C, 0xFFFF, 0xC659, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x4A49, 0xA514, 0x39E7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0xD6DB, 0xFFFF, 0xEF9E, 0x39E8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0xCE9A, 0xFFFF, 0xC659, 0xEF7D, 0x7BEF, 0x0000, 0x0000, 0x0000, 0x6882, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xBDD7, 0xFFFF, 0xD6BB, - 0xFFFF, 0xE73D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x94B3, 0xFFFF, 0xDEFB, - 0x0000, 0x7BEF, 0xCE59, 0x0000, 0x0000, 0x0000, 0x90C3, 0x78A3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xBDD7, 0xFFFF, 0xBDF7, 0x0000, 0xBE19, 0xFFFF, 0xB5B7, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4208, 0xFFFF, 0xF7BE, 0x39E8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x2841, 0xF966, 0x4061, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x52AA, - 0xFFFF, 0xBDF7, 0x0000, 0x0000, 0x2945, 0xE75D, 0xFFFF, 0x5AEC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0xBE19, 0xFFFF, 0x8C92, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC104, 0xE965, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x52AA, 0x0000, 0x0000, 0x0000, 0x0000, 0x738E, - 0xFFFF, 0xD6DB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4A49, 0xFFFF, 0xE75D, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5882, 0xF986, 0xC924, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xD6DB, 0xFFFF, 0x632D, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0xA535, 0xFFFF, 0x8431, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0xE145, 0xF986, 0xA904, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x6B6E, 0xFFFF, 0xBE18, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xE73D, 0xF7DF, 0x4A49, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x98E3, 0xF986, 0xF986, 0x88E3, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xE77E, - 0xF7BF, 0x2945, 0x0000, 0x0000, 0x0000, 0x0000, 0x528A, 0xFFFF, 0xFFFF, 0xFFFF, 0xCE59, 0x8C51, 0x4228, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x4061, 0xF986, 0xF165, 0xF924, 0x6041, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x94B2, 0xD6BA, 0xEF7E, 0xFFFF, 0x6B6E, 0x0000, 0x0000, 0x0000, 0x0000, - 0x8431, 0xFFFF, 0xCE7A, 0xC658, 0xFFFF, 0xFFFF, 0xBDF7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xD924, - 0xF965, 0xEBAF, 0xE576, 0xA535, 0x634D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x94B2, 0x738E, 0x9492, 0xFFFF, 0x9D14, 0x0000, 0x0000, 0x0000, 0x0000, 0xA555, 0xFFFF, 0x632D, 0x0000, 0x0000, 0x5AEB, - 0x41E8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7882, 0xF555, 0xDFDF, 0xE7DF, 0xF7DF, 0xFFFF, 0xA556, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4A49, 0xFFFF, 0xC639, - 0x0000, 0x0000, 0x0000, 0x0000, 0xBE19, 0xFFFF, 0x4A8A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x5ACB, 0xEFFF, 0xD6BB, 0x73D0, 0x6B8F, 0xC65A, 0xFFFF, 0x73AF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x31A7, 0xFFFF, 0xDEFC, 0x0000, 0x0000, 0x0000, 0x0000, 0xCE9A, 0xFFFF, - 0x39E8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9D15, 0xF7DF, 0x73D0, - 0x2987, 0x2987, 0x632D, 0xEF9E, 0xB5F8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x2124, 0xF7DF, 0xE75D, 0x0000, 0x0000, 0x0000, 0x0000, 0xCE9A, 0xFFFF, 0x39E8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xA535, 0xF7DF, 0x6B8F, 0x2987, 0x31A8, 0x5AED, 0xEF7E, 0xBDF8, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2124, 0xF7DF, 0xE75D, 0x0000, 0x0000, - 0x0000, 0x0000, 0xC639, 0xFFFF, 0x4A69, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x632D, 0xFFFF, 0xC65A, 0x632D, 0x5AED, 0xB5F8, 0xFFFF, 0x8411, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3186, 0xFFFF, 0xDF1C, 0x0000, 0x0000, 0x0000, 0x0000, 0xAD56, 0xFFFF, 0x630C, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xA556, 0xFFFF, 0xEF9F, 0xEF9F, - 0xFFFF, 0xBE18, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x41E8, 0x5AEB, 0x0000, 0x0000, 0x4208, - 0xFFFF, 0xC659, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C51, 0xFFFF, 0xA535, 0x738E, 0x94B2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x73CF, 0xB5D8, 0xBDF8, 0x8431, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xBDF7, 0xFFFF, 0xFFFF, 0xC658, 0xB5D7, 0xFFFF, 0xA555, 0x0000, 0x0000, 0x0000, 0x0000, - 0x5ACB, 0xFFFF, 0xF7BF, 0xD6DA, 0x94B2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4228, - 0x8C51, 0xCE59, 0xFFDF, 0xE75D, 0xFFFF, 0x73AF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xEF7E, 0xF7BE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3166, 0xE75D, 0xF7DF, 0x3186, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xAD76, 0xFFFF, 0x7C10, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5ACB, 0xFFFF, 0xC65A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x52AB, - 0xFFFF, 0xDF1C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0xCE7A, 0xFFFF, 0x738E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xCE7A, 0xFFFF, 0x7BF0, 0x0000, 0x0000, 0x0000, - 0x0000, 0x52AA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5AEC, 0xFFFF, 0xE73D, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x528A, 0xFFFF, 0xEF7E, 0x2965, 0x0000, 0x0000, 0xBDF7, 0xFFFF, 0x52AA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0xDF1C, 0xFFFF, 0x6B8E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xAD56, - 0xFFFF, 0xC659, 0x0000, 0xBDD7, 0xFFFF, 0xBDD7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC638, 0x8410, 0x0000, 0xB5B7, 0xFFFF, 0xC639, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xDF1C, 0xFFFF, 0xDEFC, 0xFFFF, 0xBDF7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x8430, 0xE71C, 0x9D14, 0xFFFF, 0xEF7E, 0x2965, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x39C7, 0xF7BE, 0x9D14, 0x39E7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C72, - 0xF7DF, 0x528A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x31A7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x39C7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFBF, 0xFFFF, 0xFFDF, + 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BF, 0xFFDF, 0xFFFF, 0xFFBF, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DF, 0xF7DF, 0xF7BF, 0xF7BF, + 0xF7BF, 0xF7DF, 0xF7DF, 0xF7BF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFDF, + 0xFFFF, 0xFFFF, 0xF7DF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DF, 0xF7BF, 0xF7DF, 0xF7BF, 0xF7BF, 0xF7DF, + 0xF7BF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFBF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xF7DF, 0xF7BF, 0xF7DF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DF, 0xF7DF, 0xF7DF, 0xF7BF, 0xFFFF, 0xFFFF, 0xFFBF, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF7FE, + 0xFFFF, 0xFFFF, 0xF7DF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DF, 0xF7DF, 0xE77F, 0xCF5F, 0xCF7F, 0xEFBF, 0xEFBF, 0xCF7F, 0xCF1F, + 0xDF7F, 0xEF9F, 0xEF9F, 0xFFDF, 0xF7DF, 0xFFDF, 0xF7DF, 0xF7BF, 0xF7BF, 0xFFFF, 0xF7FE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFDF, 0xFFDF, 0xFFFF, 0xF7DF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DF, + 0xEF9F, 0xCF1F, 0x0000, 0x0000, 0x0000, 0x0000, 0xF7BF, 0xF7BF, 0x0000, 0x0000, 0x0000, 0xF7BF, 0xEFBF, 0xDF9F, 0xEF9F, 0xFFDF, + 0xF7BF, 0xF7BF, 0xF7DF, 0xF7DF, 0xFFDF, 0xFFDF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DF, 0xCF7F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xF7BF, 0xF7BF, 0x0000, 0x0000, 0xDFFB, 0xFFFF, 0xF7DF, 0x0000, 0xB6BF, 0xEF9F, 0xF7BF, 0xF7FF, 0xF7BF, 0xF7BF, 0xF7BF, 0xFFFF, + 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFDF, 0xFFFF, 0xF7BF, 0xF7DF, 0xFFDF, + 0xFFFF, 0xE7BF, 0x7DDF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xBFBF, 0xFFFF, + 0xEF9F, 0x0000, 0x0000, 0x7EDF, 0xE7BF, 0xF7FF, 0xFFDF, 0xF7DF, 0xF7BF, 0xF7BF, 0xFFDF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xF7DF, 0xF7BF, 0xF7BF, 0xFFFF, 0xDF5F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xD77F, + 0xF7BF, 0xF7BF, 0xF7BF, 0xF7BF, 0xFFDF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xF7BF, 0xFFDF, + 0xF7DF, 0xF7DF, 0xFFFF, 0xDF7F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFB8C, 0xFEB5, 0x0000, 0xDF5F, 0xF7DF, 0xF7BF, 0xFFDF, 0xF7BF, 0xF7DF, + 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xF7DF, 0xF7BF, 0xFFDF, 0xEFBF, 0x7EDF, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xFA88, 0xFAEA, 0x0000, 0x0000, 0x971F, 0xEF5F, 0xF7DF, 0xEFBF, 0xF7BF, 0xFF7D, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xFFFF, 0xF7BF, 0xFFDF, 0xF7BF, 0xF79F, 0xD73F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFA47, 0xFA08, 0x0000, 0x0000, 0x0000, 0x0000, 0xCF1F, + 0xFFDF, 0xFEDB, 0xFD95, 0xFBF0, 0xFF1C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFDF, 0xFFFF, 0xF7DF, 0xF7DF, 0xF7BF, 0xEF9F, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xF880, 0xFA28, 0xFA08, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xDF9F, 0xFE19, 0xFB6D, 0xFAAA, 0xF8E3, 0xFCB2, 0xFFDF, + 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xF7BF, 0xF7DF, 0xF7BF, 0xF7BF, 0xD79F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF942, 0xFA07, 0xF9C7, 0xF800, 0x0000, 0x0000, + 0x0000, 0xFFDF, 0xFFFF, 0xFFFF, 0xFEBC, 0xF8E4, 0xF8E3, 0xF861, 0xFA28, 0xFFDF, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xF7DF, + 0xF7DF, 0xF7DF, 0xEFBF, 0x963F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFDF, + 0xFFFF, 0xFF9D, 0xFF5B, 0xF8E1, 0xFA27, 0xF9E7, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFDF, 0xFFDF, 0x97DF, 0xF987, + 0xF882, 0xF8A2, 0xF8E3, 0xFE7A, 0x0000, 0x0000, 0x0000, 0xFFDF, 0xFFFF, 0xF7BF, 0xF7BF, 0xFFDF, 0xE77F, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF7DF, 0xEFBF, 0xE77F, 0xE77F, 0xEFBF, 0xFDD7, 0xF9C7, 0xF842, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFA8A, 0xF882, 0xF8C3, 0xF820, 0xFD55, 0xFFDF, 0x0000, + 0x0000, 0xFFFF, 0xFFDF, 0xF7BF, 0xF7FF, 0xF7BF, 0xDF9F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xF7FF, 0xEFDF, 0xCF5F, 0xC71F, 0xC71F, 0xCF5F, 0xD7BF, 0xFDF7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xFBB1, 0xF882, 0xF8C3, 0xF800, 0xFC92, 0xFFFF, 0x0000, 0x0000, 0xF7FE, 0xFFDF, 0xF7DF, 0xF7BF, 0xF7DF, + 0xD79F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xEFBF, 0xD73F, 0xD77F, 0xCF5F, 0xBF5F, + 0xD77F, 0xD73F, 0xEFDF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFA46, 0xFA8A, 0xFC32, 0xF8A2, 0xF8A2, + 0xF800, 0xFBEF, 0xF7FE, 0x0000, 0x0000, 0xF7FE, 0xF7BF, 0xF7BF, 0xF7BF, 0xF7BF, 0xC6FF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xFFDF, 0xE77F, 0xDF5F, 0xBF5F, 0xFCD5, 0xFCB4, 0xBF5F, 0xCF5F, 0xE79F, 0xFFDF, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFA08, 0xFA28, 0xFB2D, 0xF882, 0xF8A2, 0xF800, 0xFBEF, 0xF7FE, 0x0000, 0x0000, 0xF7FE, + 0xF7BF, 0xF7DF, 0xF7DF, 0xF7FF, 0xC73F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFDF, 0xEF9F, + 0xCF5F, 0xCF5F, 0xFEDE, 0xFEDE, 0xCF5F, 0xCF5F, 0xEF9F, 0xFFDF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF9E7, + 0xFA07, 0xFBB0, 0xF882, 0xF8A2, 0xF800, 0xFBCF, 0xF7FE, 0x0000, 0x0000, 0xF7FE, 0xFFFF, 0xF7BF, 0xF7BF, 0xF7BF, 0xDF5F, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF7DF, 0xDF5F, 0xD73F, 0xBF1F, 0xBF1F, 0xD73F, 0xDF5F, + 0xF7DF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFC33, 0xF882, 0xF882, 0xF800, 0xFC30, + 0xF7FE, 0x0000, 0x0000, 0xF7FE, 0xF7DF, 0xF7BF, 0xF7DF, 0xFFFF, 0xE7BF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xF7FE, 0xF7DF, 0xDF5F, 0xD73F, 0xD73F, 0xDF5F, 0xF7DF, 0xF7FE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFAED, 0xF841, 0xF882, 0xF800, 0xFCF3, 0xF7FE, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xF7DF, + 0xF7BF, 0xF7BF, 0xE7BF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF7FE, 0xFFDF, + 0xEFBF, 0xEFBF, 0xFFDF, 0xF7FE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3EDF, 0xF9C8, + 0xF840, 0xF882, 0xF820, 0xFDD7, 0xFFFF, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xF7BF, 0xF7DF, 0xF7BF, 0xF7DF, 0xBEDF, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xDEBF, 0xF8C3, 0xF841, 0xF820, 0xF924, 0xFF1C, 0x0000, 0x0000, + 0x0000, 0x0000, 0xFFFF, 0xF7BF, 0xF7DF, 0xF7DF, 0xF7BF, 0xDF5F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0xFB2D, 0xF820, 0xF882, 0xF800, 0xFB0C, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0xF7FE, 0xF7BF, 0xF7BF, 0xF7BF, + 0xFFDF, 0xEFBF, 0xD7DF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFA8A, 0xF925, 0xF861, 0xF861, 0xF800, + 0xFD75, 0xF7FE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFDF, 0xF7BF, 0xF7BF, 0xF7DF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF8E3, 0xF924, 0xF882, 0xF9C7, 0xFF9E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xF7FE, 0xFFFF, 0xF7FE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0xF860, 0xFB4C, 0xF7FE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -8695,127 +9245,363 @@ static const unsigned short icon_speed_quad[1806] PROGMEM = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }; -// Quad Icon: icon_rpm_quad (42x43 px, 1806 elements, RGB565) +// Quad Icon Alpha: icon_speed_quad_alpha (1806 elements, 8-bit Alpha Mask) +static const unsigned char icon_speed_quad_alpha[1806] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x42, 0x6B, 0x86, 0x8E, 0x8E, 0x86, 0x6B, 0x42, 0x18, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x75, 0xC6, + 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xC6, 0x75, 0x21, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x9E, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xF7, 0xF7, 0xFF, 0xFF, 0xFF, 0xEF, 0x9E, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xF7, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xF7, 0xF7, 0xEF, + 0xF7, 0xFF, 0xEF, 0x7D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0xC7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xEF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xEF, 0xEF, 0xE7, 0xEF, 0xFF, 0xC7, 0x21, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, + 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0x9C, 0x73, 0x52, 0xB5, 0xB5, 0x52, 0x73, + 0x9C, 0xC6, 0xE7, 0xF7, 0xEF, 0xE7, 0xE7, 0xDE, 0xF7, 0xE7, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xB5, 0x52, 0x00, 0x00, 0x00, 0x00, 0xF7, 0xF7, 0x00, 0x00, 0x00, 0x8C, 0xC6, 0xB5, 0xEF, 0xEF, + 0xE7, 0xE7, 0xD6, 0xE7, 0xF7, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x18, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xB5, 0xB5, 0x00, 0x00, 0x1C, 0xFF, 0xEF, 0x00, 0x52, 0xC6, 0xEF, 0xDE, 0xDE, 0xD6, 0xE7, 0xE7, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xA5, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0xAE, + 0x84, 0x00, 0x00, 0x21, 0x94, 0xDE, 0xD6, 0xD6, 0xCE, 0xEF, 0xC6, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x75, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x8C, + 0xDE, 0xD6, 0xD6, 0xC6, 0xF7, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xF7, 0xF7, + 0xF7, 0xF7, 0xFF, 0xAD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x18, 0x00, 0x9C, 0xD6, 0xCE, 0xC6, 0xCE, 0xEF, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8E, 0xFF, 0xEF, 0xF7, 0xFF, 0xD6, 0x21, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x94, 0x63, 0x00, 0x00, 0x29, 0xBD, 0xCE, 0xCE, 0xBD, 0xE7, 0x8E, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xEF, 0xF7, 0xEF, 0xF7, 0xFF, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x52, + 0xC6, 0xC6, 0xCE, 0xDE, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0xFF, 0xE7, 0xEF, 0xFF, 0xBD, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x39, 0xDE, 0xBD, 0x00, 0x00, 0x00, 0x00, 0x65, 0xBD, 0xA5, 0xE7, 0xE7, 0xEF, 0xFF, 0x63, + 0x00, 0x00, 0x00, 0x00, 0xAE, 0xFF, 0xE7, 0xEF, 0xF7, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0xF7, 0xCE, 0x18, 0x00, 0x00, + 0x00, 0x39, 0xFF, 0xFF, 0x8C, 0xF7, 0xFF, 0xFF, 0xFF, 0xAD, 0x00, 0x00, 0x00, 0x00, 0xDF, 0xEF, + 0xE7, 0xEF, 0xD6, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, + 0x75, 0x7B, 0x42, 0x94, 0xFF, 0xD6, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7B, 0x39, 0x29, 0xDE, + 0xFF, 0xF7, 0xFF, 0xE7, 0x00, 0x00, 0x00, 0x29, 0xF7, 0xE7, 0xE7, 0xEF, 0xAD, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA5, 0xFF, 0xF7, 0xF7, 0xFF, 0xFF, 0xD6, 0x73, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAD, 0xFF, 0xF7, 0xFF, 0xFF, 0x29, 0x00, + 0x00, 0x4A, 0xFF, 0xDE, 0xDE, 0xEF, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x94, 0xFF, 0xAD, 0x94, 0x94, 0xAD, 0xFF, 0xC6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7B, 0xFF, 0xF7, 0xF7, 0xFF, 0x4A, 0x00, 0x00, 0x5D, 0xFF, 0xD6, 0xDE, 0xE7, + 0x6B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xF7, 0xBD, 0x8C, 0xA5, 0xA5, + 0x8C, 0xBD, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x31, 0x73, 0xFF, 0xF7, + 0xF7, 0xFF, 0x5D, 0x00, 0x00, 0x5D, 0xFF, 0xD6, 0xDE, 0xE7, 0x6B, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x42, 0xFF, 0x9C, 0xA5, 0xB5, 0xB5, 0xA5, 0x9C, 0xFF, 0x42, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xAD, 0xEF, 0xFF, 0xF7, 0xFF, 0x5D, 0x00, 0x00, 0x5D, + 0xFF, 0xCE, 0xD6, 0xDE, 0x6B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xFF, + 0xA5, 0x9C, 0x9C, 0x9C, 0x9C, 0xA5, 0xFF, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA5, + 0xAD, 0x8C, 0xF7, 0xF7, 0xEF, 0xFF, 0x5D, 0x00, 0x00, 0x55, 0xF7, 0xCE, 0xD6, 0xDE, 0x73, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD6, 0xE7, 0x8C, 0x9C, 0x9C, 0x8C, 0xE7, + 0xD6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xFF, 0xF7, 0xEF, 0xFF, + 0x55, 0x00, 0x00, 0x34, 0xF7, 0xCE, 0xCE, 0xD7, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x3C, 0xF7, 0xEF, 0xBD, 0xBD, 0xEF, 0xF7, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x8C, 0xFF, 0xEF, 0xF7, 0xFF, 0x34, 0x00, 0x00, 0x18, 0xE7, 0xCE, + 0xCE, 0xD6, 0xAD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0xB5, + 0xE7, 0xE7, 0xB5, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0xBD, + 0xFF, 0xEF, 0xF7, 0xF7, 0x18, 0x00, 0x00, 0x00, 0xC7, 0xDE, 0xC6, 0xCE, 0xC6, 0x42, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0xE7, 0xF7, 0xEF, 0xFF, 0xCE, 0x00, 0x00, + 0x00, 0x00, 0x86, 0xEF, 0xBD, 0xC6, 0xCE, 0x7B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x84, 0xF7, 0xEF, 0xEF, 0xFF, 0x86, 0x00, 0x00, 0x00, 0x00, 0x34, 0xF7, 0xBD, 0xBD, + 0xCE, 0xE7, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xEF, 0xFF, 0xEF, 0xEF, + 0xFF, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xE7, 0xE7, 0xC6, 0x52, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xBD, 0xF7, 0xFF, 0xC6, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x45, 0xC7, 0x5D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x52, 0xBD, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +// Quad Icon: icon_rpm_quad (1806 elements, RGB565 True Color) static const unsigned short icon_rpm_quad[1806] PROGMEM = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF7FE, 0xF7FE, 0xF7BF, 0xF7DF, 0xF7DF, 0xEFDF, 0xF7DF, 0xF7DF, 0xF7FF, 0xFFFF, 0xF7DF, + 0xF7DF, 0xF7DF, 0xF7FF, 0xF7FF, 0xF7FF, 0xFFFF, 0xEFFF, 0xF7FE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF7FF, 0xDFBF, + 0xEFDF, 0xF7DF, 0xEFBF, 0xEFDF, 0xEFBF, 0xEFDF, 0xEFFF, 0xF7BF, 0xEF9F, 0xF7DF, 0xF7FF, 0xF7DF, 0xEFBF, 0xF7FF, 0xEFDF, 0xEFBF, + 0xE7FF, 0xE7BF, 0xF7DF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xEF9F, 0xD79F, 0xD79F, 0xEFDF, 0xF7DF, 0xEFDF, 0xEFDF, 0xDF9F, + 0xEFDF, 0xEFDF, 0xF7DF, 0xF7BF, 0xF7FF, 0xF7FF, 0xF7BF, 0xEFDF, 0xEFDF, 0xEFFF, 0xE7FF, 0xCF1F, 0xEFDF, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0xE77F, 0xEFDF, 0xFFFF, 0xEF9F, 0xFFFF, 0xEFDF, 0xEFDF, 0xEFDF, 0xFFFF, 0xEF9F, 0xFFDF, 0xFFFF, 0xF7BF, 0xFFFF, + 0xEF9F, 0xFFFF, 0xEF9F, 0xEFDF, 0xEFDF, 0xF7FE, 0xF7FE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xE77F, 0xF7FE, 0xE77F, 0xFFFF, + 0xFFFF, 0xEF9F, 0xEFDF, 0xEFDF, 0xEF9F, 0xEFDF, 0xFFDF, 0xEFDF, 0xFFDF, 0xEF9F, 0xEFDF, 0xEF9F, 0xE7FF, 0xEF9F, 0xE7FF, 0xE77F, + 0xE77F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xEF9F, 0xEFFF, 0xEF9F, 0xF7BF, 0xF7FF, 0xE7BF, 0xF7BF, 0xF7FF, 0xF7FF, 0xF7BF, + 0xF7DF, 0xF7DF, 0xF7DF, 0xF7DF, 0xF7BF, 0xF7BF, 0xFFFF, 0xEF9F, 0xEFDF, 0xEFDF, 0xEFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xF7FE, 0xDFDF, 0xFFDF, 0xE7FF, 0xEF9F, 0xEF9F, 0xE7FF, 0xEF9F, 0xEF9F, 0xEFDF, 0xFFDF, 0xEFDF, 0xEFDF, 0xEFDF, 0xEF9F, 0xEFFF, + 0xFFFF, 0xDFDF, 0xD7FE, 0xDF5F, 0xD7FE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xEFDF, 0xE7BF, 0xF7FF, 0xF7DF, 0xF7DF, 0xF7BF, + 0xF7FF, 0xE7BF, 0xF7BF, 0xF7BF, 0xF7FF, 0xF7BF, 0xF7DF, 0xF7DF, 0xF7DF, 0xF7DF, 0xF7DF, 0xF7FF, 0xE7BF, 0xE77F, 0xF7DF, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xF7FF, 0xDF7F, 0xDF7F, 0xF7DF, 0xE7FF, 0xD79F, 0xBF3F, 0xBF3F, 0xBF9F, 0xDFDF, 0xBF5F, 0xDFFE, + 0xBF3F, 0xBF3F, 0xBF3F, 0xD7FF, 0xDFDF, 0xE7BF, 0xCF5F, 0xCF5F, 0xE7DF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF7FF, 0xD7BF, + 0xDF7F, 0xEFBF, 0xE7BF, 0xE7BF, 0xDF7F, 0xE7DF, 0xDFDF, 0xBF5F, 0xDF5F, 0xDFDF, 0xDF9F, 0xDF7F, 0xDF7F, 0xE7DF, 0xE7DF, 0xDF7F, + 0xCF5F, 0xDFDF, 0xE7BF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF7FF, 0xD7BF, 0xE7BF, 0xF7DF, 0xEFBF, 0xEFBF, 0xEFDF, 0xF7DF, + 0xE7FE, 0xFFDF, 0x0000, 0xAFFD, 0xCF7F, 0xE7BF, 0xEFBF, 0xDF9F, 0xEFBF, 0xE7BF, 0xCF5F, 0xCF5F, 0xE7DF, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0xF7FF, 0xD7BF, 0xDF7F, 0xF7DF, 0xEFBF, 0xEFBF, 0xEFDF, 0xE7FF, 0xE77F, 0x0000, 0x0000, 0x0000, 0xCF1F, 0xDF7F, + 0xEFBF, 0xEFDF, 0xDF9F, 0xE7BF, 0xCF5F, 0xCF5F, 0xE7BF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF7FF, 0xD7BF, 0xDF7F, 0xF7DF, + 0xEFDF, 0xEF9F, 0xEF9F, 0xE7DF, 0xD79F, 0xD7DF, 0x0000, 0xDFDF, 0xD79F, 0xE7BF, 0xEFBF, 0xEFBF, 0xEFDF, 0xE7BF, 0xCF5F, 0xDFDF, + 0xE7BF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF7BF, 0xE7BF, 0xDF7F, 0xEFDF, 0xEFBF, 0xEF9F, 0xEF9F, 0xF7FF, 0xF7FF, 0xD79F, + 0xD79F, 0xD79F, 0xF7DF, 0xEFDF, 0xEFBF, 0xEFBF, 0xEF9F, 0xDF7F, 0xDF9F, 0xDF9F, 0xE7BF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xF7BF, 0xE7BF, 0xE7FF, 0xF7DF, 0xF7DF, 0xF7FF, 0xE7BF, 0xF7FF, 0xF7FF, 0xF7BF, 0xF7DF, 0xFFFF, 0xF7BF, 0xF7FF, 0xF7BF, 0xE7BF, + 0xEF9F, 0xDF7F, 0xDF9F, 0xDF9F, 0xE7BF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF7BF, 0xD7BF, 0xE7BF, 0xF7DF, 0xF7BF, 0xF7DF, + 0xF7DF, 0xE7BF, 0xE7BF, 0xFFFF, 0xF7BF, 0xF7DF, 0xFFFF, 0xF7BF, 0xF7DF, 0xEF9F, 0xEFBF, 0xDF5F, 0xCF1F, 0xDF9F, 0xE7BF, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xF7FF, 0xE7FF, 0xE7BF, 0xF7FF, 0xEFFF, 0xE7FF, 0xCFDF, 0x0000, 0xFFBF, 0xAFFF, 0x963F, 0xBFBF, + 0xBFFD, 0x0000, 0xCFDF, 0xDFDF, 0xEFDF, 0xDFDF, 0xDFDF, 0xCF9F, 0xE7BF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF7FF, 0xE7BF, + 0xDF5F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xD73F, 0xBFDF, 0xD7FF, 0xC77F, 0xEFDF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xEFFD, 0xDF5F, 0xE7DF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xDFFB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xEFFF, 0xC7FF, 0xBF3F, 0xDFDF, 0xDF9F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFBF, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xE7BF, 0xD79F, 0xCF5F, 0xEFFF, 0xF7BF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xF7BF, 0xD79F, 0xCF5F, 0xD7FF, 0xF7DF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF7DF, 0xEFFF, + 0xCF9F, 0xD7FF, 0xF7DF, 0xAFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF7FF, 0xEF9F, 0xD77F, 0xD7FF, 0xF7DF, 0xBFBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0xF7FF, 0xD79F, 0xC77F, 0xD7FF, 0xF7DF, 0xCFDF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xBEDF, 0xF7FF, 0xD79F, 0xD7BF, 0xD79F, + 0xF7DF, 0xFFDF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xEFFD, 0xF7DF, 0xD79F, 0xD7DF, 0xD7FF, 0xE7BF, 0xDFDF, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF7FE, + 0xE7BF, 0xD79F, 0xD7BF, 0xD79F, 0xF7BF, 0xEFDF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF7DF, 0xE7BF, 0xCF7F, 0xCF5F, 0xD73F, 0xDF5F, 0xEFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0xFFBF, 0xF7FF, 0xF7DF, 0xDF9F, 0xEFDF, 0xEF9F, 0xE77F, 0xEFBF, 0xD7DF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xEFFD, 0xF7BF, 0xF7DF, 0xF7FF, 0xF7FF, + 0xF7FF, 0xF7FF, 0xE7BF, 0xEFBF, 0xF7DF, 0xD7DF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xEFFF, 0xEFDF, 0xEFDF, 0xEFDF, 0xF7BF, 0xF7FF, 0xF7DF, 0xFFFF, 0xF7FE, 0xDF9F, 0xE77F, 0xEFBF, + 0xEFDF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xCFDF, 0xF7FF, 0xEFBF, + 0xEFDF, 0xE7BF, 0xE77F, 0x0000, 0x0000, 0x0000, 0xDFFB, 0xF7FF, 0xEFFF, 0xEFBF, 0xDFBF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFBF, 0xF7FF, 0xE7BF, 0xF7DF, 0xFFDF, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xFFDF, 0xF7DF, 0xDFDF, 0xDFBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xEFFD, 0xF7DF, 0xEFFF, 0xDF9F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xEFDF, 0xDF9F, 0xDF7F, 0xDFFB, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xEFDF, 0xDFDF, 0xD7DF, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFDF, 0xDF5F, 0xE7FF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xEFFD, 0xF7DF, 0xD79F, 0xE7FF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xF7FE, 0xEFDF, 0xE7BF, 0xAFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xEFFD, + 0xF7DF, 0xDF5F, 0xE77F, 0xEFFD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xE7BF, 0xDF5F, 0xDF7F, 0x97FB, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xCFDF, 0xEFBF, 0xDF7F, 0xD73F, 0xF7FF, 0xDFFB, 0x0000, + 0x0000, 0x0000, 0x0000, 0xF7BF, 0xEFDF, 0xE7BF, 0xDF5F, 0xBFBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xDFFB, 0xEFBF, 0xEFBF, 0xE7DF, 0xD79F, 0xF7FF, 0xEF9F, 0xEFFF, 0xEFDF, 0xFFFF, 0xDF5F, 0xF7DF, 0xDF9F, + 0xE7BF, 0xAFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xDFDF, 0xD7FE, + 0xEFDF, 0xEFFF, 0xEFDF, 0xEFDF, 0xF7FF, 0xF7BF, 0xEFDF, 0xE7BF, 0xDF9F, 0xDFDF, 0xC77F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xAFFF, 0xAFFF, 0x0000, 0xF7FE, 0xF7DF, 0xEFFF, 0xF7FF, 0xEFFF, + 0xF7DF, 0xDFDF, 0x0000, 0x0000, 0xBFBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4A6A, 0x8410, 0xA555, 0xBE18, 0xCE9A, 0xCE9A, 0xC639, 0xAD76, - 0x8451, 0x52AB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4A69, - 0xA555, 0xE73D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF7E, 0xAD96, 0x5ACB, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4A49, 0xC618, 0xFFFF, 0xFFFF, 0xFFFF, 0xCE7A, 0x94D3, 0x6B6D, 0x4A6A, - 0xD69A, 0xBDD7, 0x4A49, 0x6B4D, 0x94B2, 0xC639, 0xF7DF, 0xFFFF, 0xFFFF, 0xCE79, 0x52AB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x94D3, 0xFFFF, 0xFFFF, 0xF7BE, 0xAD76, 0x31A6, 0x0000, 0x0000, 0x0000, 0x0000, 0xD6BA, 0xB596, 0x0000, 0x0000, 0x0000, 0x0000, - 0x2965, 0x9CF4, 0xF7BE, 0xFFFF, 0xFFFF, 0xAD55, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2945, 0xCE7A, 0xFFFF, 0xEF9E, 0xAD76, 0xFFFF, 0xBDF7, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x94D2, 0x8C10, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xAD75, 0xFFFF, 0xAD96, 0xE73D, 0xFFFF, - 0xDEFB, 0x39E7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x39C7, 0xDF1C, 0xFFFF, 0xD6DB, 0x39E8, 0x0000, 0xD6BA, 0xFFFF, 0x4A69, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2800, - 0x70A2, 0x0000, 0x0000, 0x0000, 0x41E8, 0xFFFF, 0xDF1B, 0x0000, 0x2945, 0xC659, 0xFFFF, 0xEFBE, 0x51A6, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2945, 0xE73C, 0xFFFF, 0xB5D7, 0x0000, 0x0000, - 0x0000, 0x5AEB, 0xFFFF, 0xCE79, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x60A2, 0x90C3, 0x0000, 0x0000, 0x0000, 0xC638, 0xFFFF, - 0x6B6D, 0x0000, 0x0000, 0x0000, 0x9D14, 0xFD75, 0xF1C4, 0x4081, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0xCE9A, 0xFFFF, 0xB5D7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xDEFB, 0xF7BE, 0x2945, 0x0000, - 0x0000, 0x0000, 0x0000, 0xA0E3, 0xB104, 0x0000, 0x0000, 0x0000, 0xD69A, 0xE75C, 0x0000, 0x0000, 0x0000, 0x0000, 0x60A2, 0xF9E5, - 0xF9C4, 0xE9C4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x94D3, 0xFFFF, 0xEF7D, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x39C7, 0x2124, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xD945, 0xB104, 0x0000, - 0x0000, 0x0000, 0x0000, 0x2945, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xD184, 0xF1E5, 0xFA05, 0xB964, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4208, 0xFFFF, 0xE77E, 0xEF5D, 0xD69A, 0x39C7, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF966, 0xB904, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x3061, 0xD9A4, 0xFA05, 0xF1C5, 0xFA05, 0x60C2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0xBE19, 0xFFFF, 0x8C52, 0x0000, 0xCE79, 0x738E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x5082, 0xF986, 0xC924, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x78E2, 0xB964, 0x8903, 0xFA05, - 0xF9E5, 0xE1A4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4A49, 0xFFFF, 0xE75D, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x98E3, 0xF986, 0xD925, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xD1A4, 0xF9E5, 0xFA05, 0x68C2, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0xA535, 0xFFFF, 0x8C52, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0xD145, 0xF986, 0xE945, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x60C2, 0xFA05, 0xF9E5, 0xC984, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xE75D, 0xFFFF, 0x31A6, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2841, 0xF945, 0xF965, - 0xF166, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xE9C4, 0xF9E5, - 0xF9E5, 0x2841, 0x0000, 0x0000, 0x0000, 0x0000, 0x4A6A, 0xFFFF, 0xC639, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5820, 0xF9C7, 0xF1A7, 0xF924, 0x2800, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9923, 0xFA05, 0xFA05, 0x70E2, 0x0000, 0x0000, 0x0000, 0x0000, - 0x8431, 0xFFFF, 0xBDF7, 0x4A69, 0x3186, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x20E4, 0xBD14, 0xE69B, 0xDEBB, 0xF597, 0x4986, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x3061, 0x4881, 0xA143, 0xF9E5, 0xFA05, 0xA943, 0x0000, 0x0000, 0x0000, 0x0000, 0xAD76, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DE, - 0xC658, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xCE9B, 0xEFDF, 0xE79F, 0xE79F, 0xE7BF, 0xD71D, - 0x3186, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xD9A4, 0xFA05, 0xFA25, 0xFA05, 0xF9E5, 0xF9E5, 0xC984, - 0x0000, 0x0000, 0x0000, 0x0000, 0xC639, 0xFFFF, 0x9CF3, 0x94B2, 0xBDF7, 0xDF1B, 0xCE59, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x94D3, 0xF7DF, 0xCE9B, 0x7BD0, 0x6B8F, 0xC65A, 0xF7DF, 0xAD97, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0xB143, 0xC184, 0x9923, 0x8903, 0xF1C5, 0xF9E5, 0xE1A4, 0x0000, 0x0000, 0x0000, 0x0000, 0xCE9A, 0xFFFF, - 0x3186, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xCE7A, 0xEF9F, 0x73D0, - 0x2987, 0x2987, 0x634E, 0xE75E, 0xDEFC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0xE9C4, 0xF9E5, 0xE9C4, 0x0000, 0x0000, 0x0000, 0x0000, 0xCE9A, 0xFFFF, 0x4208, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xCE9B, 0xEF9F, 0x6B8F, 0x2987, 0x31A8, 0x5AED, 0xE75E, 0xDF1D, 0x2104, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xE9C4, 0xF9E5, 0xE9C4, 0x0000, 0x0000, - 0x0000, 0x0000, 0xC639, 0xFFFF, 0x4A69, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0xA535, 0xF7DF, 0xC65A, 0x634E, 0x5AED, 0xBDF9, 0xEFBF, 0xB5F8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF1C4, 0xF9E5, 0xE1A4, 0x0000, 0x0000, 0x0000, 0x0000, 0xAD56, 0xFFFF, 0x632D, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2966, 0xDF1D, 0xF7BF, 0xE75E, 0xE75E, - 0xEFBF, 0xE77E, 0x4208, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3061, 0xF9E5, - 0xF9E5, 0xD184, 0x0000, 0x0000, 0x0000, 0x0000, 0x8451, 0xFFFF, 0x8C92, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3186, 0xB5B7, 0xDF1C, 0xDF1D, 0xBDF8, 0x4229, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x58A2, 0xFA05, 0xFA05, 0xA943, 0x0000, 0x0000, 0x0000, 0x0000, - 0x52AB, 0xFFFF, 0xD6BB, 0xB596, 0xFFFF, 0x6B6D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x2104, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x68C2, 0xF9E5, 0xD9A4, 0xF9E5, 0xFA05, 0x78E2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xEF7E, 0xFFFF, 0xD69A, 0x73AE, 0x2124, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2041, 0x7903, 0xF9E5, 0xF9E5, 0xF9E5, 0x3061, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xAD76, 0xFFFF, 0x6B8E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4081, 0xFA05, 0xF9E5, 0xD184, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x52AB, - 0xFFFF, 0xE71C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC984, - 0xF9E5, 0xFA05, 0x78E2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xCE7A, 0xFFFF, 0x7BF0, 0x0000, 0x0000, 0x0000, - 0x0000, 0x94B2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x3061, 0xB164, 0x0000, 0x0000, 0x0000, 0x68C2, 0xFA05, 0xF9E5, 0xE9C4, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x528A, 0xFFFF, 0xEF7E, 0x2966, 0x0000, 0x0000, 0xCE79, 0xFFFF, 0x9CF3, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xB964, 0xFA26, 0xC984, - 0x0000, 0x0000, 0xE9E5, 0xF9C5, 0xFA05, 0x70E2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xAD56, - 0xFFFF, 0xC639, 0x3186, 0xD69A, 0xFFFF, 0xCE79, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC984, 0xFA25, 0xC984, 0xC984, 0xF9E5, 0xF9E5, 0xC984, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xDF1C, 0xFFFF, 0xF7DF, 0xFFFF, 0xD69A, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0xD1A4, 0xF9E5, 0xF9E5, 0xF9E5, 0xF1E5, 0x2841, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x39C7, 0xF7BE, 0x9CF4, 0x528A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2861, 0x8103, - 0xFA05, 0x50A2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x31A7, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3861, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }; -// Quad Icon: icon_battery_quad (46x35 px, 1610 elements, RGB565) +// Quad Icon Alpha: icon_rpm_quad_alpha (1806 elements, 8-bit Alpha Mask) +static const unsigned char icon_rpm_quad_alpha[1806] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x5D, 0x8C, 0xA5, 0xB5, 0xBD, 0xC6, 0xD6, 0xDF, 0xE7, 0xEF, + 0xEF, 0xE7, 0xCF, 0xB6, 0x9C, 0x75, 0x5A, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9C, 0xB5, + 0xBD, 0xF7, 0xFF, 0xE7, 0xD6, 0xCE, 0xDE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xDF, 0xCE, 0xB5, + 0x94, 0x9C, 0xAD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x5A, 0x63, 0x84, 0x8C, 0x84, 0x7B, 0x7B, + 0x7B, 0x84, 0x8C, 0x94, 0x94, 0x94, 0x8C, 0x7B, 0x6B, 0x5A, 0x4A, 0x52, 0x6B, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x4A, 0x63, 0x6D, 0x84, 0x86, 0x84, 0x7B, 0x7B, 0x7D, 0x84, 0x84, 0x86, 0x8C, 0x86, + 0x84, 0x7D, 0x7B, 0x73, 0x6B, 0x5D, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4A, 0x4D, 0x52, 0x6D, + 0x75, 0x73, 0x6B, 0x6B, 0x73, 0x73, 0x73, 0x7B, 0x7B, 0x7B, 0x73, 0x73, 0x65, 0x5A, 0x4A, 0x4A, + 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x75, 0x84, 0x9C, 0x9C, 0x9C, 0x94, 0x94, 0x9C, 0xA5, + 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0x9C, 0x8E, 0x84, 0x73, 0x73, 0x6D, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x34, 0x42, 0x42, 0x52, 0x5A, 0x5A, 0x52, 0x5A, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x5A, + 0x4A, 0x42, 0x3C, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7B, 0x94, 0x9C, 0xBD, 0xC6, 0xAD, + 0x9C, 0xA5, 0xAD, 0xB5, 0xB6, 0xBD, 0xB5, 0xB5, 0xAD, 0xAD, 0xAD, 0x9C, 0x8C, 0x8C, 0x8C, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x9C, 0x9C, 0xA5, 0xD6, 0x9C, 0x5A, 0x5A, 0x5A, 0x5A, 0x42, 0x42, 0x4D, + 0x63, 0x5A, 0x5A, 0x5A, 0x84, 0xA5, 0x84, 0x84, 0xAD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0x94, + 0xA5, 0xCE, 0xAD, 0xAD, 0xAD, 0xAD, 0x7B, 0x42, 0x42, 0x42, 0x73, 0xAD, 0xAD, 0xAD, 0xAD, 0xA5, + 0x84, 0x7B, 0xA5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0x94, 0xA5, 0xCE, 0xBD, 0xB5, 0xB5, 0xAD, + 0x5D, 0x29, 0x00, 0x24, 0x52, 0xAD, 0xBD, 0xBD, 0xBD, 0xA5, 0x84, 0x84, 0xA5, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x94, 0x94, 0xA5, 0xCE, 0xBD, 0xB5, 0xB5, 0x9C, 0x52, 0x00, 0x00, 0x00, 0x52, 0x9C, + 0xBD, 0xB5, 0xBD, 0xA5, 0x84, 0x84, 0xA5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0x94, 0xA5, 0xCE, + 0xB5, 0xB5, 0xB5, 0xAD, 0x5A, 0x31, 0x00, 0x39, 0x5A, 0xAD, 0xB5, 0xB5, 0xB5, 0xA5, 0x84, 0x7B, + 0xA5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0x94, 0xA5, 0xCE, 0xBD, 0xBD, 0xC6, 0xBE, 0xA6, 0x6B, + 0x63, 0x6B, 0xA5, 0xC6, 0xBD, 0xBD, 0xBD, 0xA5, 0x7B, 0x7B, 0xA5, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x94, 0x94, 0x9C, 0xCE, 0xC6, 0x94, 0x94, 0x94, 0x9C, 0x9C, 0x8C, 0x96, 0xA5, 0x9C, 0x9C, 0x9C, + 0xB5, 0xA5, 0x7B, 0x7B, 0xA5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0x94, 0x9C, 0xD6, 0xE7, 0xCE, + 0xB5, 0xAD, 0xAD, 0xAE, 0xBD, 0xBD, 0xBE, 0xD6, 0xD6, 0xD6, 0xC6, 0xAD, 0x84, 0x7B, 0xA5, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x94, 0x94, 0xA5, 0xAE, 0x7D, 0x4A, 0x29, 0x00, 0x21, 0x18, 0x29, 0x21, + 0x2C, 0x00, 0x29, 0x42, 0x63, 0x84, 0x84, 0x84, 0xA5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0x8C, + 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5A, 0x42, 0x5A, 0x4A, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x24, 0x73, 0xA5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x6D, 0x4A, 0x63, 0x42, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAD, 0x6B, 0x84, 0x5A, 0xAD, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xAD, 0x63, 0x84, 0x5A, 0xAD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAD, 0x5A, + 0x84, 0x5A, 0xAD, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAE, 0x5A, 0x8C, 0x5A, 0xAD, 0x21, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xAE, 0x5A, 0x8C, 0x5A, 0xAD, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0xAE, 0x5A, 0x8C, 0x5A, + 0xAD, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xAD, 0x5A, 0x8C, 0x5A, 0xAD, 0x42, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4D, + 0xAD, 0x5A, 0x94, 0x63, 0x9C, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8C, 0x94, 0x52, 0x7B, 0x5A, 0x7B, 0x9E, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x21, 0xCF, 0xB5, 0x73, 0x73, 0x6B, 0xA5, 0xD6, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xB5, 0xC6, 0x94, 0x94, + 0x9C, 0x94, 0x94, 0xBD, 0xB5, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x86, 0xC6, 0xB5, 0x6B, 0xA5, 0x9C, 0x8C, 0x96, 0xA2, 0x73, 0xAD, 0xCE, + 0x7B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0xDF, 0xBD, + 0x6B, 0xA5, 0x4A, 0x00, 0x00, 0x00, 0x38, 0x9C, 0x6D, 0xB5, 0xAD, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0xCF, 0x8C, 0x8C, 0x39, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x29, 0x8C, 0x7B, 0xA5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x24, 0xD6, 0x75, 0x7B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x7B, 0xAD, 0x1C, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x39, 0x31, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x42, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xBD, 0x6B, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5D, 0x6B, 0x8C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, + 0xD6, 0x7B, 0x8C, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8C, 0x7B, 0xAD, 0x1C, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0xCE, 0xA5, 0x6B, 0x94, 0x1C, 0x00, + 0x00, 0x00, 0x00, 0x94, 0x63, 0x9C, 0xAD, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x1C, 0xB5, 0xB5, 0xA5, 0x6B, 0x94, 0x73, 0x5A, 0x73, 0xA6, 0x7B, 0x8C, 0xB5, + 0x8C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x45, + 0x63, 0x9E, 0x73, 0x84, 0x94, 0x8C, 0x73, 0x9C, 0x73, 0x39, 0x4A, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x34, 0x8C, 0x96, 0x94, 0x96, + 0x8C, 0x42, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +// Quad Icon: icon_battery_quad (1610 elements, RGB565 True Color) static const unsigned short icon_battery_quad[1610] PROGMEM = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -8823,99 +9609,204 @@ static const unsigned short icon_battery_quad[1610] PROGMEM = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x2104, 0xBE18, 0xD6DC, 0xD6BB, 0xCEBB, 0xD6FC, 0x8451, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x738E, 0xD6FC, 0xCEBB, 0xD6BB, - 0xD6DB, 0xC65A, 0x3186, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x738F, 0xFFFF, 0xDF3D, 0xE75E, 0xE75E, 0xE75E, 0xE77E, 0x2104, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xD6FC, 0xEF7E, 0xE75E, 0xE75E, 0xDF3D, 0xF7FF, - 0x8C92, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x73AE, - 0xEF9E, 0xDEFC, 0xDF1C, 0xDF1C, 0xDF1D, 0xDF1C, 0x2924, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xCEBB, 0xE73D, 0xDF1C, 0xDF1C, 0xDEFC, 0xEF9E, 0x8C92, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x636E, 0xEFDF, 0xDF1F, - 0xDF5F, 0xDF3F, 0xDF5F, 0xDF5F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xCEDD, 0xE77F, 0xDF3F, 0xDF5F, 0xDF1F, 0xEFDF, 0x8472, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6AA1, 0x8301, 0x7AE1, 0xB4A9, 0xF6B1, 0xEE50, 0xEE70, 0xEE70, - 0xEE70, 0xEE70, 0x9363, 0x7AE1, 0x82E1, 0x7AE1, 0x7AE1, 0x7AE1, 0x7AE1, 0x7AE1, 0x7AE1, 0x7AE1, 0x7AE1, 0x7AE1, 0x7AE1, 0x7AE1, - 0x7AE1, 0x82E1, 0x7AE1, 0x8322, 0xE62F, 0xEE90, 0xEE70, 0xEE70, 0xEE50, 0xF6B1, 0xC52A, 0x7AE1, 0x82E1, 0x72A1, 0x28E0, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x3940, 0xED82, 0xFE23, 0xFE03, 0xFE03, 0xFDC1, 0xFD60, 0xFD80, 0xFD80, 0xFD80, 0xFD80, 0xFD80, - 0xFE02, 0xFE03, 0xFE03, 0xFE03, 0xFE03, 0xFE03, 0xFE03, 0xFE03, 0xFE03, 0xFE03, 0xFE03, 0xFE03, 0xFE03, 0xFE03, 0xFE03, 0xFE03, - 0xFE03, 0xFE02, 0xFD81, 0xFD80, 0xFD80, 0xFD80, 0xFD80, 0xFD60, 0xFDC1, 0xFE03, 0xFE03, 0xFE23, 0xF5C2, 0x49C1, 0x0000, 0x0000, - 0x0000, 0x0000, 0xC482, 0xFE23, 0xF582, 0xFE03, 0xFE03, 0xFE23, 0xFE23, 0xFE23, 0xFE23, 0xFE23, 0xFE23, 0xFE23, 0xFE03, 0xFE03, - 0xFE03, 0xFE03, 0xFE03, 0xFE03, 0xFE03, 0xFE03, 0xFE03, 0xFE03, 0xFE03, 0xFE03, 0xFE03, 0xFE03, 0xFE03, 0xFE03, 0xFE03, 0xFE03, - 0xFE23, 0xFE23, 0xFE23, 0xFE23, 0xFE23, 0xFE23, 0xFE23, 0xFE03, 0xFE03, 0xFDA2, 0xFE03, 0xE522, 0x0000, 0x0000, 0x0000, 0x0000, - 0xED42, 0xFDC2, 0xF582, 0x8B01, 0x7AE1, 0x82E1, 0x7AE1, 0x7AE1, 0x7AE1, 0x7AE1, 0x7AE1, 0x7AE1, 0x7AE1, 0x7AE1, 0x7AE1, 0x7AE1, - 0x7AE1, 0x7AE1, 0x7AE1, 0x7AE1, 0x7AE1, 0x7AE1, 0x7AE1, 0x7AE1, 0x7AE1, 0x7AE1, 0x7AE1, 0x7AE1, 0x7AE1, 0x7AE1, 0x7AE1, 0x7AE1, - 0x7AE1, 0x7AE1, 0x7AE1, 0x7AE1, 0x82E1, 0x7AE1, 0x7AE1, 0xED42, 0xFDC2, 0xFDC2, 0x28E0, 0x0000, 0x0000, 0x0000, 0xED42, 0xFDE3, - 0xED42, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xD4C2, 0xFE03, 0xFDA2, 0x28E0, 0x0000, 0x0000, 0x0000, 0xED42, 0xFDE3, 0xED42, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0xD4E2, 0xFDE3, 0xFDA2, 0x28E0, 0x0000, 0x0000, 0x0000, 0xED42, 0xFDE3, 0xED42, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0xD4E2, 0xFDE3, 0xFDA2, 0x28E0, 0x0000, 0x0000, 0x0000, 0xED42, 0xFDE3, 0xED42, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xD4E2, - 0xFDE3, 0xFDA2, 0x28E0, 0x0000, 0x0000, 0x0000, 0xED42, 0xFDE3, 0xED42, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xD4E2, 0xFDE3, 0xFDA2, - 0x28E0, 0x0000, 0x0000, 0x0000, 0xED42, 0xFDE3, 0xED42, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x3186, 0x630C, 0x39C7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xD4E2, 0xFDE3, 0xFDA2, 0x28E0, 0x0000, - 0x0000, 0x0000, 0xED42, 0xFDE3, 0xED42, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x8430, 0xFFFF, 0xA534, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xD4E2, 0xFDE3, 0xFDA2, 0x28E0, 0x0000, 0x0000, 0x0000, - 0xED42, 0xFDE3, 0xED42, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x738E, 0xFFDF, - 0x9492, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xD4E2, 0xFDE3, 0xFDA2, 0x28E0, 0x0000, 0x0000, 0x0000, 0xED42, 0xFDE3, - 0xED42, 0x0000, 0x0000, 0x0000, 0x2945, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x3186, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2945, 0x4228, 0x4208, 0x9CF3, 0xFFFF, 0xB596, 0x4208, - 0x4228, 0x3186, 0x0000, 0x0000, 0x0000, 0xD4E2, 0xFDE3, 0xFDA2, 0x28E0, 0x0000, 0x0000, 0x0000, 0xED42, 0xFDE3, 0xED42, 0x0000, - 0x0000, 0x0000, 0xAD55, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xCE59, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xAD55, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xCE59, - 0x0000, 0x0000, 0x0000, 0xD4E2, 0xFDE3, 0xFDA2, 0x28E0, 0x0000, 0x0000, 0x0000, 0xED42, 0xFDE3, 0xED42, 0x0000, 0x0000, 0x0000, - 0x8430, 0xD6BA, 0xD69A, 0xD6BA, 0xD6BA, 0xD6BA, 0xD69A, 0xD6BA, 0x9CF3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8430, 0xD6BA, 0xD69A, 0xE75C, 0xFFFF, 0xEF7D, 0xD69A, 0xD6BA, 0x9CF3, 0x0000, 0x0000, - 0x0000, 0xD4E2, 0xFDE3, 0xFDA2, 0x28E0, 0x0000, 0x0000, 0x0000, 0xED42, 0xFDE3, 0xED42, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7BEF, 0xFFFF, 0x9CD3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xD4E2, - 0xFDE3, 0xFDA2, 0x28E0, 0x0000, 0x0000, 0x0000, 0xED42, 0xFDE3, 0xED42, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x7BEF, 0xFFFF, 0x9CF3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xD4E2, 0xFDE3, 0xFDA2, - 0x28E0, 0x0000, 0x0000, 0x0000, 0xED42, 0xFDE3, 0xED42, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x73AE, 0xEF7D, 0x9492, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xD4E2, 0xFDE3, 0xFDA2, 0x28E0, 0x0000, - 0x0000, 0x0000, 0xED42, 0xFDE3, 0xED42, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xD4E2, 0xFDE3, 0xFDA2, 0x28E0, 0x0000, 0x0000, 0x0000, - 0xED42, 0xFDE3, 0xED42, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xD4E2, 0xFDE3, 0xFDA2, 0x28E0, 0x0000, 0x0000, 0x0000, 0xED42, 0xFDE3, - 0xED42, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xD4E2, 0xFDE3, 0xFDA2, 0x28E0, 0x0000, 0x0000, 0x0000, 0xED42, 0xFDE3, 0xED42, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0xD4E2, 0xFDE3, 0xFDA2, 0x28E0, 0x0000, 0x0000, 0x0000, 0xED42, 0xFDE3, 0xED42, 0x0000, 0x0000, 0x0000, + 0xEFFD, 0xFFFF, 0xFFDF, 0xF7FE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xEFFD, 0xF7FE, 0xFFFF, 0xEFFD, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xEFFD, 0xF7DF, + 0xFFDF, 0xEFFF, 0x0000, 0x0000, 0xDFFB, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xDFFB, 0xEFFD, 0xEFFD, 0xDFFB, 0xFFDF, + 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFFF, 0x0000, 0x0000, 0xEFFD, 0xFFDF, 0xFFFF, 0xEFFD, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, + 0x0000, 0x0000, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDE, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0x0000, 0x0000, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFDF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFBF, 0xEFFD, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFDF, 0xF7FE, 0xF7FE, 0xEFFD, + 0xFFDF, 0xFFDF, 0xFFFF, 0xFFDE, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFBE, 0xFFDF, + 0xFFFF, 0xFFFF, 0xEFFD, 0xF7FE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xEFFD, 0xFFBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, + 0xFFDF, 0xF7FE, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xEFFD, 0xF7FE, 0xDFDF, 0xFFDF, 0xF7FE, 0xF7FE, 0xF7FE, 0xF7FE, 0xDF5F, 0xFFDF, 0xFFDF, 0xF7FE, 0xFFDF, 0xFFDF, 0xFFDF, + 0xF7FE, 0xF7FE, 0xFFDF, 0xFFDF, 0xF7FE, 0xF7FE, 0xF7FE, 0xDFDF, 0xFFDF, 0xFFDF, 0xF7FE, 0xF7FE, 0xFFDF, 0xFFDF, 0xDFDF, 0xDFDF, + 0xF7FE, 0xFFDF, 0xDFDF, 0xF7FE, 0xEFFD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFDF, 0xFFFF, + 0xFFDF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFDF, + 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xE7FC, 0xDFFD, 0xE7FC, 0xF7FE, + 0xF7FE, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFDF, + 0xFFDF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x5FF1, 0x27EA, 0x27EA, 0x27EB, 0x9FF6, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xE7FC, 0x37EB, 0x1FE9, 0x1FE9, 0x37EC, 0xE7FC, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFDF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xA7F7, 0x1FE9, 0x1FE9, 0x1FE9, 0x87F4, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, + 0xFFDF, 0xF7FE, 0x67F0, 0x1FE9, 0x1FE9, 0x37EC, 0xDFFD, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEFDF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xE7FE, + 0x37EC, 0x1FE9, 0x1FE9, 0x6FF1, 0xEFFE, 0xF7FE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFDE, 0xFFFF, 0xFFDF, + 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xB7F7, 0x1FEA, 0x1FE9, + 0x1FE9, 0x27EA, 0x2FEB, 0x37EB, 0x97F6, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFDF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xEF9F, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFBE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0x67F0, 0x1FE9, 0x1FE9, 0x1FE9, 0x1FE9, + 0x1FE9, 0x4FED, 0xE7FD, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xF7FE, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF7FE, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0x87F4, 0x67F1, 0x6FF0, 0x2FEB, 0x1FE9, 0x2FEB, 0xBFF9, + 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xF7FE, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xF7DF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFDF, 0xF7FE, 0x3FEC, 0x1FE9, 0x87F4, 0xFFFF, 0xFFFF, 0xFFDF, + 0xFFDF, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xF7FE, 0xF7FE, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFE, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xC7FA, 0x27EA, 0x5FEF, 0xF7FE, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDE, + 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, + 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0x8FF4, 0x3FEC, 0xCFFB, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDE, + 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xEFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDE, 0xFFDF, + 0xFFDF, 0xFFBE, 0xFFFF, 0x5FF0, 0x9FF6, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFFF, + 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0xF7FE, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, + 0xE7FD, 0x97F5, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDE, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFBF, + 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xF7FE, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, 0xEFFD, 0xEFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFDF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xE7FF, 0xFFFF, 0xFFDF, + 0xFFFF, 0xF7FE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFBE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xF7FE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xEF9F, 0xEF9F, 0xFFDF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFFF, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xEF9F, 0xEFDF, 0xFFDF, 0xFFFF, 0xEFDF, 0xFFFF, 0xEFDF, + 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BF, 0xFFFF, 0xEF9F, 0xEFDF, 0xFFFF, 0xFFFF, 0xEFDF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xF7DF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEFDF, 0xFFFF, 0xEFDF, 0xFFDF, 0xEFDF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0xD4E2, 0xFDE3, 0xFDA2, 0x28E0, 0x0000, 0x0000, 0x0000, 0xED42, 0xFDE3, 0xED42, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xD4E2, - 0xFDE3, 0xFDA2, 0x28E0, 0x0000, 0x0000, 0x0000, 0xED42, 0xFDC2, 0xF5A2, 0xDCE2, 0xD4E2, 0xD4E2, 0xD4E2, 0xD4E2, 0xD4E2, 0xD4E2, - 0xD4E2, 0xD4E2, 0xD4E2, 0xD4E2, 0xD4E2, 0xD4E2, 0xD4E2, 0xD4E2, 0xD4E2, 0xD4E2, 0xD4E2, 0xD4E2, 0xD4E2, 0xD4E2, 0xD4E2, 0xD4E2, - 0xD4E2, 0xD4E2, 0xD4E2, 0xD4E2, 0xD4E2, 0xD4E2, 0xD4E2, 0xD4E2, 0xD4E2, 0xD4E2, 0xD4E2, 0xD4E2, 0xD4E2, 0xF582, 0xFDC2, 0xFDA2, - 0x0000, 0x0000, 0x0000, 0x0000, 0x9B81, 0xFE63, 0xFDC2, 0xFDE3, 0xFDE3, 0xFDE3, 0xFDE3, 0xFDE3, 0xFDE3, 0xFDE3, 0xFDE3, 0xFDE3, - 0xFDE3, 0xFDE3, 0xFDE3, 0xFDE3, 0xFDE3, 0xFDE3, 0xFDE3, 0xFDE3, 0xFDE3, 0xFDE3, 0xFDE3, 0xFDE3, 0xFDE3, 0xFDE3, 0xFDE3, 0xFDE3, - 0xFDE3, 0xFDE3, 0xFDE3, 0xFDE3, 0xFDE3, 0xFDE3, 0xFDE3, 0xFDE3, 0xFDE3, 0xFDE3, 0xFDE3, 0xFDC2, 0xFE43, 0xB422, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0xA3C2, 0xF5A2, 0xFDA2, 0xFDA2, 0xFDA2, 0xFDA2, 0xFDA2, 0xFDA2, 0xFDA2, 0xFDA2, 0xFDA2, 0xFDA2, 0xFDA2, - 0xFDA2, 0xFDA2, 0xFDA2, 0xFDA2, 0xFDA2, 0xFDA2, 0xFDA2, 0xFDA2, 0xFDA2, 0xFDA2, 0xFDA2, 0xFDA2, 0xFDA2, 0xFDA2, 0xFDA2, 0xFDA2, - 0xFDA2, 0xFDA2, 0xFDA2, 0xFDA2, 0xFDA2, 0xFDA2, 0xFDA2, 0xFDA2, 0xFDA2, 0xF5A2, 0xB422, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x28E0, 0x28E0, 0x28E0, 0x28E0, 0x28E0, 0x28E0, 0x28E0, 0x28E0, 0x28E0, 0x28E0, 0x28E0, 0x28E0, 0x28E0, - 0x28E0, 0x28E0, 0x28E0, 0x28E0, 0x28E0, 0x28E0, 0x28E0, 0x28E0, 0x28E0, 0x28E0, 0x28E0, 0x28E0, 0x28E0, 0x28E0, 0x28E0, 0x28E0, - 0x28E0, 0x28E0, 0x28E0, 0x28E0, 0x28E0, 0x28E0, 0x28E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 +}; + +// Quad Icon Alpha: icon_battery_quad_alpha (1610 elements, 8-bit Alpha Mask) +static const unsigned char icon_battery_quad_alpha[1610] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x24, 0xA6, 0xBD, 0x5D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0xC3, 0x9E, 0x24, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xA5, + 0xB5, 0x5A, 0x00, 0x00, 0x1C, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x30, 0x2C, 0x2C, 0x30, 0x31, + 0x31, 0x31, 0x31, 0x31, 0x31, 0x18, 0x00, 0x00, 0x61, 0xBD, 0x94, 0x24, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0xA5, 0xB6, 0x65, + 0x00, 0x00, 0x8C, 0xD7, 0xDE, 0xDE, 0xD7, 0xCF, 0xC6, 0xBD, 0xB5, 0xB5, 0xB6, 0xBD, 0xC6, 0xCE, + 0xCF, 0xD7, 0xDE, 0x8C, 0x00, 0x00, 0x6D, 0xBD, 0x96, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x24, 0x29, 0x52, 0x6B, 0x73, 0x5D, 0x3C, 0x2C, + 0xA5, 0xE7, 0xE7, 0xEF, 0xE7, 0xD7, 0xCE, 0xBE, 0xB5, 0xB5, 0xB6, 0xBE, 0xC7, 0xCF, 0xDE, 0xE7, + 0xE7, 0xA6, 0x2C, 0x3C, 0x65, 0x75, 0x65, 0x52, 0x29, 0x24, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x9C, 0xA6, 0xAD, 0xAE, 0xAE, 0xB5, 0xBD, 0xBE, 0xC7, 0xD6, 0xDF, + 0xE7, 0xEB, 0xE7, 0xD7, 0xCE, 0xBE, 0xB5, 0xB5, 0xB6, 0xBE, 0xC7, 0xCF, 0xD7, 0xDF, 0xE7, 0xE7, + 0xD7, 0xCF, 0xC7, 0xBE, 0xB6, 0xAE, 0xAD, 0xA6, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x96, 0xA5, 0xA6, 0xAD, 0xAE, 0xB5, 0xBD, 0xBE, 0xC7, 0xCF, 0xD7, 0xDE, 0xDE, + 0xD7, 0xCE, 0xBE, 0xB6, 0xAD, 0xAD, 0xB5, 0xBA, 0xBE, 0xC7, 0xCF, 0xD6, 0xDE, 0xDF, 0xDE, 0xD6, + 0xCE, 0xC3, 0xB6, 0xAD, 0xA5, 0x9E, 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x2C, 0x34, 0x39, 0x39, 0x3C, 0x3C, 0x3C, 0x3C, 0x42, 0x42, 0x42, 0x45, 0x42, 0x42, 0x42, + 0x3C, 0x3C, 0x39, 0x39, 0x3C, 0x3C, 0x3C, 0x42, 0x42, 0x42, 0x45, 0x45, 0x42, 0x42, 0x42, 0x42, + 0x3C, 0x39, 0x39, 0x34, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x65, 0x8E, 0x94, 0x94, 0x96, 0x96, 0x9C, 0x9C, 0x9E, 0xA5, 0xA6, 0xA5, 0xA5, 0x9E, 0x9C, 0x96, + 0x94, 0x8E, 0x94, 0x96, 0x96, 0x9C, 0x9E, 0xA5, 0xA5, 0xA6, 0xA5, 0x9E, 0x9C, 0x9C, 0x96, 0x94, + 0x8E, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0xAE, + 0xB5, 0xB6, 0xBD, 0xC6, 0xCE, 0xCF, 0xD7, 0xDF, 0xE7, 0xE7, 0xDF, 0xD6, 0xC7, 0xBE, 0xB5, 0xB5, + 0xB6, 0xBE, 0xC7, 0xCE, 0xD6, 0xDE, 0xE7, 0xE7, 0xE7, 0xDE, 0xCF, 0xC7, 0xBD, 0xB5, 0xAD, 0x84, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xAD, 0xAE, 0xB5, + 0xBD, 0xBE, 0xC7, 0xCE, 0xD6, 0xDE, 0xDF, 0xE7, 0xDE, 0xCF, 0xC6, 0xAA, 0xA6, 0xA2, 0xA6, 0xAE, + 0xC3, 0xCE, 0xD6, 0xD7, 0xDF, 0xE7, 0xDF, 0xD7, 0xCF, 0xC6, 0xB6, 0xAE, 0xAD, 0x7D, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xAD, 0xAE, 0xB5, 0xB6, 0xBD, + 0xC6, 0xCE, 0xD6, 0xDE, 0xDF, 0xDF, 0xD7, 0xCF, 0xBE, 0xB6, 0xDB, 0xDB, 0xD7, 0xBA, 0xBE, 0xC7, + 0xCF, 0xD7, 0xDF, 0xE7, 0xDF, 0xD7, 0xCE, 0xC6, 0xB6, 0xAE, 0xA6, 0x75, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0xA6, 0xAD, 0xAE, 0xB5, 0xBD, 0xBE, 0xC7, + 0xCF, 0xD7, 0xDE, 0xDF, 0xD7, 0xCE, 0xB6, 0xDB, 0xF7, 0xF7, 0xE7, 0xC3, 0xBE, 0xC7, 0xCF, 0xD7, + 0xDF, 0xDF, 0xDE, 0xD6, 0xC7, 0xBE, 0xB6, 0xAD, 0xA6, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6D, 0xA5, 0xA6, 0xAD, 0xB5, 0xB6, 0xBE, 0xC7, 0xCE, 0xD6, + 0xDE, 0xDE, 0xD7, 0xCB, 0xB2, 0xEF, 0xF7, 0xF3, 0xCF, 0xBA, 0xBE, 0xC6, 0xCE, 0xD6, 0xDE, 0xDF, + 0xDB, 0xCF, 0xC7, 0xBD, 0xB5, 0xAD, 0xA5, 0x6D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x6B, 0xA5, 0xA6, 0xAD, 0xAE, 0xB6, 0xBD, 0xC6, 0xCE, 0xD6, 0xD7, 0xDE, + 0xD6, 0xC3, 0xBE, 0xF7, 0xF7, 0xE7, 0xBE, 0xB6, 0xBD, 0xC6, 0xCE, 0xD3, 0xD7, 0xDE, 0xD7, 0xCF, + 0xC6, 0xBA, 0xAE, 0xA6, 0x9E, 0x6B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x65, 0x9E, 0xA5, 0xA6, 0xAD, 0xB2, 0xB6, 0xBE, 0xC7, 0xCF, 0xD7, 0xD7, 0xCF, 0xB6, + 0xD7, 0xF7, 0xF3, 0xC7, 0xA2, 0xA6, 0xAA, 0xBE, 0xC7, 0xCF, 0xD6, 0xD7, 0xD6, 0xCE, 0xBE, 0xB5, + 0xAD, 0xA5, 0x9C, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x63, 0x9C, 0x9E, 0xA5, 0xA6, 0xAE, 0xB5, 0xBD, 0xC6, 0xCE, 0xD6, 0xD6, 0xCE, 0xB2, 0xEB, 0xF7, + 0xF3, 0xDB, 0xCF, 0xCB, 0xBA, 0xBD, 0xC6, 0xCE, 0xD6, 0xD6, 0xCF, 0xC7, 0xBD, 0xB5, 0xA6, 0x9E, + 0x9C, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x96, + 0x9C, 0x9E, 0xA6, 0xAD, 0xB5, 0xB6, 0xBE, 0xC7, 0xCF, 0xD6, 0xC6, 0xBE, 0xF7, 0xF7, 0xF7, 0xF7, + 0xF7, 0xE3, 0xBA, 0xB6, 0xBE, 0xC7, 0xCF, 0xD6, 0xCE, 0xC6, 0xB6, 0xAE, 0xA5, 0x9C, 0x96, 0x5D, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5D, 0x94, 0x96, 0x9C, + 0x9E, 0xA6, 0xAD, 0xB5, 0xBD, 0xC6, 0xCE, 0xCF, 0xBE, 0xCB, 0xDF, 0xDB, 0xDF, 0xF7, 0xEB, 0xC7, + 0xB5, 0xB6, 0xBE, 0xC7, 0xCE, 0xCF, 0xCE, 0xBE, 0xB6, 0xAE, 0xA5, 0x9C, 0x94, 0x5D, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5A, 0x8E, 0x94, 0x96, 0x9C, 0xA5, + 0xA6, 0xAE, 0xB6, 0xC6, 0xCE, 0xCE, 0xC6, 0xBE, 0xB5, 0xA2, 0xCF, 0xF3, 0xCB, 0xAE, 0xAE, 0xB5, + 0xBD, 0xC6, 0xC7, 0xCE, 0xC7, 0xBE, 0xB5, 0xAD, 0x9E, 0x96, 0x92, 0x5D, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5A, 0x8E, 0x8E, 0x94, 0x9C, 0x9E, 0xA6, 0xAE, + 0xB6, 0xBE, 0xC7, 0xC7, 0xBE, 0xB5, 0xAD, 0x9E, 0xDF, 0xD7, 0xA6, 0xA5, 0xAD, 0xB5, 0xBD, 0xC6, + 0xC7, 0xCE, 0xC7, 0xBE, 0xB5, 0xA6, 0x9E, 0x96, 0x8E, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5A, 0x8C, 0x8C, 0x8E, 0x96, 0x9C, 0xA5, 0xAD, 0xB5, 0xBD, + 0xC6, 0xC7, 0xBE, 0xB5, 0xA6, 0xA6, 0xDF, 0xAE, 0x9C, 0x9E, 0xA6, 0xAE, 0xB6, 0xBE, 0xC7, 0xCE, + 0xC6, 0xBD, 0xAE, 0xA6, 0x9C, 0x94, 0x8C, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x5A, 0x86, 0x8C, 0x8E, 0x94, 0x9C, 0x9E, 0xA6, 0xAE, 0xB6, 0xC6, 0xC6, + 0xBD, 0xB5, 0x9E, 0xB2, 0xBA, 0x96, 0x9C, 0x9E, 0xA6, 0xAD, 0xB5, 0xBD, 0xC6, 0xC7, 0xC6, 0xB6, + 0xAE, 0xA5, 0x9C, 0x94, 0x8C, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x55, 0x86, 0x8C, 0x8E, 0x94, 0x96, 0x9E, 0xA6, 0xAE, 0xB6, 0xBE, 0xC6, 0xBD, 0xAE, + 0x9E, 0xAA, 0x96, 0x8E, 0x96, 0x9E, 0xA5, 0xAD, 0xB5, 0xBD, 0xBE, 0xC6, 0xBE, 0xB6, 0xAD, 0xA5, + 0x96, 0x8E, 0x8C, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x55, 0x84, 0x86, 0x8C, 0x8E, 0x94, 0x9C, 0xA5, 0xAE, 0xB5, 0xBD, 0xBE, 0xB6, 0xAD, 0x9E, 0x9E, + 0x8E, 0x8E, 0x94, 0x9C, 0xA5, 0xAD, 0xAE, 0xB6, 0xBE, 0xC6, 0xBD, 0xB5, 0xAD, 0x9E, 0x96, 0x8E, + 0x8C, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x75, 0x84, + 0x86, 0x8A, 0x8E, 0x94, 0x9C, 0xA5, 0xAD, 0xB5, 0xB6, 0xBD, 0xB5, 0xAD, 0xA5, 0x96, 0x8E, 0x8C, + 0x94, 0x96, 0x9E, 0xA6, 0xAE, 0xB6, 0xBD, 0xBE, 0xBD, 0xAE, 0xA6, 0x9E, 0x96, 0x8E, 0x86, 0x75, + 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x84, 0x84, 0x84, 0x86, + 0x8E, 0x94, 0x9C, 0xA5, 0xA6, 0xAE, 0xB6, 0xBD, 0xB5, 0xAA, 0x9E, 0x94, 0x8E, 0x8C, 0x94, 0x96, + 0x9E, 0xA5, 0xAD, 0xB5, 0xBD, 0xBE, 0xB6, 0xAE, 0xA6, 0x9E, 0x94, 0x8C, 0x86, 0x84, 0x75, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x6B, 0x6B, 0x6D, 0x73, 0x75, 0x7B, + 0x7D, 0x84, 0x86, 0x8E, 0x94, 0x96, 0x94, 0x86, 0x84, 0x7B, 0x75, 0x75, 0x7B, 0x7D, 0x7D, 0x86, + 0x8C, 0x8E, 0x94, 0x96, 0x94, 0x8E, 0x86, 0x7D, 0x7B, 0x75, 0x73, 0x6B, 0x63, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; diff --git a/sketch/obd2_gauge/meter.h b/sketch/obd2_gauge/meter.h index 5ee599d..0aa03c7 100644 --- a/sketch/obd2_gauge/meter.h +++ b/sketch/obd2_gauge/meter.h @@ -34,8 +34,15 @@ String pidList[maxpidIndex] = uint8_t pidReadSkip[maxpidIndex] = {}; // skip reading 0 - 3; 3 = max delay read uint8_t pidCurrentSkip[maxpidIndex] = {}; // current skip counter uint8_t engine_off_count = 0; // counter to indicate engine is off then sleep -float old_data[maxpidIndex] = {-999, -999, -999, -999}; // keep old data -float last_valid_data[maxpidIndex] = {-999, -999, -999, -999}; // keep last valid data for instant redraw +float old_data[maxpidIndex] = {-999, -999, -999, -999, -999}; // keep old data +float last_valid_data[maxpidIndex] = {-999, -999, -999, -999, -999}; // keep last valid data for instant redraw +float currentRpm = 0.0f; // Current engine RPM for sleep/inactivity tracking +float currentEngineLoad = 0.0f; // Current Engine Load % (PID 0104) +bool isEcoOptimal = false; // Flag: RPM 1900-2550 & Load 45-82% +bool badgeEcoDrawn = false; // Tracking rendered status on display +extern uint32_t lastActivityTime; // Activity timestamp for auto-sleep +bool ignitionOn = true; // True if ECU is actively communicating (contacto puesto) +uint8_t consecutiveEcuFails = 0; // Counter for consecutive ECU communication failures // Arc warning flash (blinking alarm when gauge is in TFT_RED) bool arcFlashVisible = true; @@ -53,77 +60,218 @@ const float factoryECUOff = 12.5; // default off voltage float ecu_off_volt = factoryECUOff; // turn engine off if voltage lower // than 12.4 -// Draw parameter icon for 4-quadrant view, individually scaled to sit exactly 5px from the arc -void drawPidIcon(int x, int y, const String &pidStr) { - tft.setSwapBytes(true); - if (pidStr == "0105") { - tft.pushImage(x, y, 38, 37, icon_temp_quad, TFT_BLACK); - } else if (pidStr == "010D") { - tft.pushImage(x, y, 42, 43, icon_speed_quad, TFT_BLACK); - } else if (pidStr == "010C") { - tft.pushImage(x, y, 42, 43, icon_rpm_quad, TFT_BLACK); - } else if (pidStr == "0142" || pidStr == "ATRV") { - tft.pushImage(x, y, 46, 35, icon_battery_quad, TFT_BLACK); +// Cache theme gradients to ensure 100% bit-for-bit identical background restoration +uint16_t cachedThemeColor = 0xFFFF; +uint16_t themeGradQuad[82]; +uint16_t themeGradHeader[145]; + +void checkUpdateThemeGradients() { + uint16_t currentTheme = getThemeBgColor(); + if (currentTheme == cachedThemeColor) return; + cachedThemeColor = currentTheme; + + float delta = -255.0f / 82.0f; + float alpha = 255.0f; + uint16_t col = currentTheme; + for (int i = 0; i < 82; i++) { + themeGradQuad[i] = col; + alpha += delta; + col = fastBlend((uint8_t)alpha, currentTheme, (uint16_t)TFT_BLACK); + } + + delta = -255.0f / 145.0f; + alpha = 255.0f; + col = currentTheme; + for (int i = 0; i < 145; i++) { + themeGradHeader[i] = col; + alpha += delta; + col = fastBlend((uint8_t)alpha, currentTheme, (uint16_t)TFT_BLACK); } } -// Clear parameter icon for 4-quadrant view -void clearPidIcon(int x, int y, const String &pidStr) { - if (pidStr == "0105") { - tft.fillRect(x, y, 38, 37, TFT_BLACK); - } else if (pidStr == "010D") { - tft.fillRect(x, y, 42, 43, TFT_BLACK); - } else if (pidStr == "010C") { - tft.fillRect(x, y, 42, 43, TFT_BLACK); - } else if (pidStr == "0142" || pidStr == "ATRV") { - tft.fillRect(x, y, 46, 35, TFT_BLACK); +inline uint16_t getInstrumentBgColor(int y, bool isQuad, int ry = 0) { + checkUpdateThemeGradients(); + if (isQuad) { + int k = y - ry; + if (k < 0) return themeGradQuad[0]; + if (k >= 82) return TFT_BLACK; + return themeGradQuad[k]; } else { - tft.fillRect(x, y, 42, 42, TFT_BLACK); + if (y < 0) return themeGradHeader[0]; + if (y >= 145) return TFT_BLACK; + return themeGradHeader[y]; } } -// Draw header icon (42x42 px, ~30% larger) for full screen mode -void drawPidIconHeader(int x, int y, const String &pidStr) { - tft.setSwapBytes(true); - if (pidStr == "0105") { - tft.pushImage(x, y, 42, 42, icon_temp_42, TFT_BLACK); - } else if (pidStr == "010D") { - tft.pushImage(x, y, 42, 42, icon_speed_42, TFT_BLACK); - } else if (pidStr == "010C") { - tft.pushImage(x, y, 42, 42, icon_rpm_42, TFT_BLACK); - } else if (pidStr == "0142" || pidStr == "ATRV") { - tft.pushImage(x, y, 42, 42, icon_battery_42, TFT_BLACK); - } -} +// Shared line/block buffer for fast SPI push (46x43 max icon size = 1978 pixels, ~3.9KB static RAM) +static uint16_t s_iconRenderBuf[46 * 43]; -// Restore blue header background over the 42x42 icon area during alarm blink OFF phase -void clearPidIconHeader(int x = 10, int y = 4, int w = 42, int h = 42) { - const float fade_w_left = 16.0f; - uint16_t lineBuf[64]; - if (w > 64) w = 64; - tft.startWrite(); - tft.setAddrWindow(x, y, w, h); - for (int16_t j = y; j < y + h; j++) { - float vy = 1.0f; - if (j >= 30) { - float t = (50.0f - (float)j) / 20.0f; - vy = t * t * (3.0f - 2.0f * t); - } - for (int16_t i = 0; i < w; i++) { - int16_t px = x + i; - float hx = 1.0f; - if (px < (int16_t)fade_w_left) { - float t = (float)px / fade_w_left; - hx = t * t * (3.0f - 2.0f * t); +// Draw icon with true 8-bit alpha channel blended dynamically against current instrument background +void drawIconWithAlpha(int x, int y, int w, int h, const unsigned short *colors, const unsigned char *alphas, bool isQuad, int ry = 0) { + if (w * h > 46 * 43) return; + + for (int j = 0; j < h; j++) { + int curY = y + j; + uint16_t bgCol = getInstrumentBgColor(curY, isQuad, ry); + int rowOffset = j * w; + for (int i = 0; i < w; i++) { + uint8_t a = pgm_read_byte(&alphas[rowOffset + i]); + if (a == 0) { + s_iconRenderBuf[rowOffset + i] = bgCol; + } else if (a >= 250) { + s_iconRenderBuf[rowOffset + i] = pgm_read_word(&colors[rowOffset + i]); + } else { + uint16_t fg = pgm_read_word(&colors[rowOffset + i]); + s_iconRenderBuf[rowOffset + i] = fastBlend(a, fg, bgCol); } - float b = vy * hx; - uint8_t g = (uint8_t)(140.0f * b); - uint8_t bl = (uint8_t)(255.0f * b); - lineBuf[i] = tft.color565(0, g, bl); } - tft.pushPixels(lineBuf, w); } - tft.endWrite(); + tft.setSwapBytes(true); + tft.pushImage(x, y, w, h, s_iconRenderBuf); +} + +// Draw parameter icon for 4-quadrant view with true alpha channel +void drawPidIcon(int x, int y, const String &pidStr) { + int ry = (y >= 120) ? 121 : 0; + if (pidStr == "0105") { + drawIconWithAlpha(x, y, 38, 37, icon_temp_quad, icon_temp_quad_alpha, true, ry); + } else if (pidStr == "010D") { + drawIconWithAlpha(x, y, 42, 43, icon_speed_quad, icon_speed_quad_alpha, true, ry); + } else if (pidStr == "010C") { + drawIconWithAlpha(x, y, 42, 43, icon_rpm_quad, icon_rpm_quad_alpha, true, ry); + } else if (pidStr == "0142" || pidStr == "ATRV") { + drawIconWithAlpha(x, y, 46, 35, icon_battery_quad, icon_battery_quad_alpha, true, ry); + } +} + +// Clear parameter icon for 4-quadrant view by restoring exact background lines (100% invisible restoration) +void clearPidIcon(int x, int y, const String &pidStr) { + int w = 42; + int h = 42; + if (pidStr == "0105") { + w = 38; + h = 37; + } else if (pidStr == "010D" || pidStr == "010C") { + w = 42; + h = 43; + } else if (pidStr == "0142" || pidStr == "ATRV") { + w = 46; + h = 35; + } + + int ry = (y >= 120) ? 121 : 0; + for (int j = 0; j < h; j++) { + int curY = y + j; + uint16_t bgCol = getInstrumentBgColor(curY, true, ry); + int rowOffset = j * w; + for (int i = 0; i < w; i++) { + s_iconRenderBuf[rowOffset + i] = bgCol; + } + } + tft.setSwapBytes(true); + tft.pushImage(x, y, w, h, s_iconRenderBuf); +} + +// Draw header icon (42x42 px) for full screen mode with true alpha channel +void drawPidIconHeader(int x, int y, const String &pidStr) { + if (pidStr == "0105") { + drawIconWithAlpha(x, y, 42, 42, icon_temp_42, icon_temp_42_alpha, false); + } else if (pidStr == "010D") { + drawIconWithAlpha(x, y, 42, 42, icon_speed_42, icon_speed_42_alpha, false); + } else if (pidStr == "010C") { + drawIconWithAlpha(x, y, 42, 42, icon_rpm_42, icon_rpm_42_alpha, false); + } else if (pidStr == "0142" || pidStr == "ATRV") { + drawIconWithAlpha(x, y, 42, 42, icon_battery_42, icon_battery_42_alpha, false); + } +} + +// Restore ambient vignette background over the 42x42 icon area during alarm blink OFF phase (100% invisible) +void clearPidIconHeader(int x = 10, int y = 4, int w = 42, int h = 42) { + for (int j = 0; j < h; j++) { + int curY = y + j; + uint16_t bgCol = getInstrumentBgColor(curY, false); + int rowOffset = j * w; + for (int i = 0; i < w; i++) { + s_iconRenderBuf[rowOffset + i] = bgCol; + } + } + tft.setSwapBytes(true); + tft.pushImage(x, y, w, h, s_iconRenderBuf); +} + +// Draw or clear full screen instrument title during normal display and alarm blinking +void drawFullScreenTitle(const String &label, uint16_t color) { + checkUpdateThemeGradients(); + for (int y = 10; y <= 40; y++) { + uint16_t bgCol = getInstrumentBgColor(y, false); + tft.drawFastHLine(60, y, 195, bgCol); + } + if (color != 0) { + tft.setTextColor(color); + tft.drawCentreString(label.c_str(), 175, 12, 4); + } +} + +// Tactical ECO / OPT Badge (Ford Ka Endura 1.3 Sweet Spot: 1900 - 2550 RPM & 45% - 82% Load) +void updateEcoBadge(bool forceRedraw = false) { + bool newEco = (ignitionOn && currentRpm >= 1900.0f && currentRpm <= 2550.0f && + currentEngineLoad >= 45.0f && currentEngineLoad <= 82.0f); + isEcoOptimal = newEco; + + if (forceRedraw) { + badgeEcoDrawn = !newEco; // Force redraw/re-erase + } + + if (newEco == badgeEcoDrawn) { + return; + } + + bool isQuad = (fullScreenCell < 0 || fullScreenCell >= 4); + int bx = 0, by = 0, bw = 0, bh = 0; + + if (isQuad) { + // 4-Quadrant View: Positioned in top-right of RPM Quadrant (Cell 2) + int rpmCell = 2; + for (int c = 0; c < 4; c++) { + if (pidConfig[pidInCell[c]][3].toInt() == 3) { + rpmCell = c; + break; + } + } + bx = cell4_x[rpmCell] + 100; + by = cell4_y[rpmCell] + 4; + bw = 48; + bh = 18; + } else { + // Full-Screen View: Positioned in top-right header band + bx = 260; + by = 11; + bw = 50; + bh = 20; + } + + if (newEco) { + // Elegant tactical pill badge [ ECO ] + const uint16_t bgFill = 0x0202; // Deep dark forest emerald green + const uint16_t borderCol = 0x07E0; // Vibrant emerald neon green + tft.fillRoundRect(bx, by, bw, bh, 4, bgFill); + tft.drawRoundRect(bx, by, bw, bh, 4, borderCol); + tft.setTextColor(TFT_WHITE, bgFill); + if (isQuad) { + tft.drawCentreString("ECO", bx + (bw / 2), by + 1, 2); + } else { + tft.drawCentreString("ECO", bx + (bw / 2), by + 2, 2); + } + } else { + // Cleanly restore background gradient lines with zero visual trace + int ry = (isQuad && by >= 120) ? 121 : 0; + for (int y = by; y < by + bh; y++) { + uint16_t bgCol = getInstrumentBgColor(y, isQuad, ry); + tft.drawFastHLine(bx, y, bw, bgCol); + } + } + + badgeEcoDrawn = newEco; } // Full Screen Exponential Segmented Block Bar Graph (20 blocks: 3mm width x 4mm height, 0.5mm gap, Anti-Aliased) @@ -736,132 +884,71 @@ void drawQuadHeaderGradient(uint8_t cell) { } // Forward declarations -void plotNumeric4(uint8_t cell, float data, int warn, bool digit, String unit); void plotArc4(uint8_t cell, float data, int warn, int min, int max, bool digit, String unit); void plotFullScreen(uint8_t cell, float data, int warn, int min, int max, bool digit, String unit); +void plotNoData(uint8_t cell); -// 4-quadrant divider styling (2px visible automotive slate grey) +// 4-quadrant divider styling const uint16_t QUAD_DIV_COLOR = 0x632C; inline void drawQuadrantDividers() { - tft.fillRect(159, 0, 2, 240, QUAD_DIV_COLOR); - tft.fillRect(0, 119, 320, 2, QUAD_DIV_COLOR); + uint16_t divCol = getThemeDivColor(); + tft.fillRect(159, 0, 2, 240, divCol); + tft.fillRect(0, 119, 320, 2, divCol); } // Determine display color for meter: -// ECT (PID 0): VERDE (< 98), AMARILLO (98-105), ROJO (>= 106) -// RPM (PID 1): VERDE (< 3500), AMARILLO (3500-5000), ROJO (5000-6000) -// Voltaje (PID 2): ROJO (< 12.0 o >= 15.3), AMARILLO (12.0-13.2 o 14.8-15.2), VERDE (13.3-14.7) -// Velocidad (PID 3): VERDE (< 110), AMARILLO (110-130), ROJO (>= 130) -// Otros instrumentos: VERDE / ROJO (según umbral de advertencia) +// Instrumentos: Color del tema activo (normal) o TFT_RED (alarma/peligro) inline uint16_t getMeterColor(uint8_t pidIdx, float data, int warn = -1) { - if (pidIdx >= 4) return TFT_GREEN; + if (pidIdx >= 4) return getThemePrimaryColor(); float warnVal = (warn > 0) ? (float)warn : warningValue[pidIdx].toFloat(); - bool isEnabled = alarmEnabled[pidIdx]; if (pidIdx == 0) { // 0 = Temperatura ECT (PID 0105) - if (warnVal <= 0) warnVal = 106.0f; - if (isEnabled && data >= warnVal) return TFT_RED; - if (data >= (warnVal - 8.0f)) return TFT_YELLOW; - return TFT_GREEN; + if (warnVal <= 0 || warnVal == 106.0f) warnVal = 110.0f; + if (data >= warnVal) return TFT_RED; + return getThemePrimaryColor(); } if (pidIdx == 1) { // 1 = RPM (PID 010C) if (warnVal <= 0) warnVal = 5000.0f; - if (isEnabled && data >= warnVal) return TFT_RED; - if (data >= (warnVal - 1500.0f)) return TFT_YELLOW; - return TFT_GREEN; + if (data >= warnVal) return TFT_RED; + return getThemePrimaryColor(); } if (pidIdx == 2) { // 2 = Voltaje (PID 0142) if (warnVal <= 0) warnVal = 15.0f; - if (isEnabled && (data < 12.0f || data >= warnVal)) return TFT_RED; - if (data < 13.3f || data >= (warnVal - 0.5f)) return TFT_YELLOW; - return TFT_GREEN; + // Si el dato es 0 (contacto apagado / desconectado) o motor detenido, no disparar alarma por < 12V + if (data <= 1.0f) return getThemePrimaryColor(); + if (currentRpm <= 0.0f) { + if (data >= warnVal) return TFT_RED; + return getThemePrimaryColor(); + } + if (data < 12.0f || data >= warnVal) return TFT_RED; + return getThemePrimaryColor(); } if (pidIdx == 3) { // 3 = Velocidad (PID 010D) if (warnVal <= 0) warnVal = 130.0f; - if (isEnabled && data >= warnVal) return TFT_RED; - if (data >= (warnVal - 20.0f)) return TFT_YELLOW; - return TFT_GREEN; + if (data >= warnVal) return TFT_RED; + return getThemePrimaryColor(); } - if (isEnabled && warnVal > 0 && data >= warnVal) return TFT_RED; - return TFT_GREEN; + if (warnVal > 0 && data >= warnVal) return TFT_RED; + return getThemePrimaryColor(); } // Compute block count (0..NUM_BAR_BLOCKS) with sub-integer floating point precision inline int calcMeterBlocks(float val, int min, int max) { float range = (float)(max - min); if (range <= 0.0f) return 0; + if (val <= (float)min) return 0; + if (val >= (float)max) return NUM_BAR_BLOCKS; int b = (int)(((val - (float)min) / range) * (float)NUM_BAR_BLOCKS + 0.5f); if (b < 0) b = 0; if (b > NUM_BAR_BLOCKS) b = NUM_BAR_BLOCKS; return b; } -// 4-quadrant Numeric Meter (160x120 px) -void numericMeter4(uint8_t cell, uint8_t pid, bool redrawHeader = true) { - int w = 160; - int h = 120; - int x = cell4_x[cell]; - int y = cell4_y[cell]; - int rx = (cell & 1) ? 161 : 0; - int ry = (cell & 2) ? 121 : 0; - tft.fillRect(rx, ry, 159, 119, TFT_BLACK); - drawPidIcon(x + 5, y + 3, pidConfig[pid][2]); - drawQuadrantDividers(); - - if (last_valid_data[cell] != -999) { - old_data[cell] = -999; - String unit = pidConfig[pid][1]; - bool digit = pidConfig[pid][7].toInt(); - int warn = warningValue[pid].toInt(); - plotNumeric4(cell, last_valid_data[cell], warn, digit, unit); - } else { - // Initial placeholder: right-aligned DSEG7 44pt number - tft.loadFont(DSEG7_Modern_BoldItalic_44); - tft.setTextColor(TFT_GREEN, TFT_BLACK); - tft.setTextPadding(w - 12); - tft.drawRightString("---", x + w - 10, y + 46, 1); - tft.setTextPadding(0); - tft.unloadFont(); - } -} - -void plotNumeric4(uint8_t cell, float data, int warn, bool digit, String unit) { - if (data == old_data[cell]) - return; - int x = cell4_x[cell]; - int y = cell4_y[cell]; - int w = 160; - uint8_t pidIdx = pidInCell[cell]; - uint16_t col = getMeterColor(pidIdx, data, warn); - - if (col == TFT_RED) { - if (!wasInRedAlarm[cell]) { - drawPidIcon(x + 5, y + 3, pidConfig[pidIdx][2]); - } - wasInRedAlarm[cell] = true; - } else { - if (wasInRedAlarm[cell]) { - drawPidIcon(x + 5, y + 3, pidConfig[pidIdx][2]); - } - wasInRedAlarm[cell] = false; - } - - uint16_t txtCol = (col == TFT_RED && !arcFlashVisible) ? TFT_BLACK : col; - - String numStr = String(data, digit); - tft.loadFont(DSEG7_Modern_BoldItalic_44); - tft.setTextColor(txtCol, TFT_BLACK); - tft.setTextPadding(w - 12); - tft.drawRightString(numStr.c_str(), x + w - 10, y + 46, 1); - tft.setTextPadding(0); - tft.unloadFont(); - old_data[cell] = data; -} // 4-quadrant Exponential Segmented Block Meter (160x120 px) - identical to full screen style void arcMeter4(uint8_t cell, uint8_t pid, bool redrawHeader = true) { @@ -870,7 +957,9 @@ void arcMeter4(uint8_t cell, uint8_t pid, bool redrawHeader = true) { int rx = (cell & 1) ? 161 : 0; int ry = (cell & 2) ? 121 : 0; - tft.fillRect(rx, ry, 159, 119, TFT_BLACK); + // Ambient vignette gradient (theme tint fading to black) + tft.fillRectVGradient(rx, ry, 159, 82, getThemeBgColor(), TFT_BLACK); + tft.fillRect(rx, ry + 82, 159, 37, TFT_BLACK); drawPidIcon(x + 5, y + 3, pidConfig[pid][2]); drawQuadrantDividers(); @@ -891,7 +980,7 @@ void arcMeter4(uint8_t cell, uint8_t pid, bool redrawHeader = true) { } else { // Value placeholder using DSEG7 Modern 34pt smooth font tft.loadFont(DSEG7_Modern_BoldItalic_34); - tft.setTextColor(TFT_GREEN, TFT_BLACK); + tft.setTextColor(getThemePrimaryColor(), TFT_BLACK); tft.setTextPadding(114); tft.drawRightString("---", x + 152, y + 74, 1); tft.setTextPadding(0); @@ -906,19 +995,15 @@ void plotArc4(uint8_t cell, float data, int warn, int min, int max, bool digit, return; int x = cell4_x[cell]; int y = cell4_y[cell]; - if (data < min) - data = min; - if (data > max) - data = max; uint8_t pidIdx = pidInCell[cell]; uint16_t col = getMeterColor(pidIdx, data, warn); - uint16_t oldCol = (old_data[cell] < min) ? 0 : getMeterColor(pidIdx, old_data[cell], warn); + uint16_t oldCol = (old_data[cell] <= -900) ? 0 : getMeterColor(pidIdx, old_data[cell], warn); String numStr = String(data, digit); int newBlocks = calcMeterBlocks(data, min, max); - int oldBlocks = (old_data[cell] < min) ? 0 : calcMeterBlocks(old_data[cell], min, max); + int oldBlocks = (old_data[cell] <= -900) ? 0 : calcMeterBlocks(old_data[cell], min, max); bool colorChanged = (col != oldCol); if (col == TFT_RED) { @@ -936,7 +1021,7 @@ void plotArc4(uint8_t cell, float data, int warn, int min, int max, bool digit, for (uint8_t i = newBlocks; i < NUM_BAR_BLOCKS; i++) { drawQuadBarBlock(cell, i, METER_INACTIVE_COLOR); } - } else if (arcFlashVisible) { + } else if (arcFlashVisible || !alarmEnabled[pidIdx]) { if (newBlocks > oldBlocks) { for (uint8_t i = oldBlocks; i < newBlocks; i++) { drawQuadBarBlock(cell, i, TFT_RED); @@ -952,7 +1037,7 @@ void plotArc4(uint8_t cell, float data, int warn, int min, int max, bool digit, drawPidIcon(x + 5, y + 3, pidConfig[pidIdx][2]); } wasInRedAlarm[cell] = false; - if (colorChanged || old_data[cell] < min) { + if (colorChanged || old_data[cell] <= -900) { for (uint8_t i = 0; i < newBlocks; i++) { drawQuadBarBlock(cell, i, col); } @@ -970,7 +1055,7 @@ void plotArc4(uint8_t cell, float data, int warn, int min, int max, bool digit, } } - uint16_t txtCol = (col == TFT_RED && !arcFlashVisible) ? TFT_BLACK : col; + uint16_t txtCol = getThemePrimaryColor(); tft.loadFont(DSEG7_Modern_BoldItalic_34); tft.setTextColor(txtCol, TFT_BLACK); @@ -981,44 +1066,6 @@ void plotArc4(uint8_t cell, float data, int warn, int min, int max, bool digit, old_data[cell] = data; } -// Draw blue header background with rich saturated body (top 30px full brightness) -// and compact lateral fades (16px), extended to 51px height without overlapping the original vumetro -void drawHeaderGradient() { - uint16_t lineBuf[320]; - const float fade_w_left = 16.0f; - const float fade_w_right = 16.0f; - const float x_right_start = 320.0f - fade_w_right; - - tft.startWrite(); - tft.setAddrWindow(0, 0, 320, 51); - for (int16_t y = 0; y < 51; y++) { - float vy; - if (y < 30) { - vy = 1.0f; - } else { - float t = (50.0f - (float)y) / 20.0f; - vy = t * t * (3.0f - 2.0f * t); - } - for (int16_t x = 0; x < 320; x++) { - float hx = 1.0f; - if (x < (int16_t)fade_w_left) { - float t = (float)x / fade_w_left; - hx = t * t * (3.0f - 2.0f * t); - } else if (x > (int16_t)x_right_start) { - float t = (319.0f - (float)x) / fade_w_right; - if (t < 0.0f) t = 0.0f; - hx = t * t * (3.0f - 2.0f * t); - } - float b = vy * hx; - uint8_t g = (uint8_t)(140.0f * b); - uint8_t bl = (uint8_t)(255.0f * b); - lineBuf[x] = tft.color565(0, g, bl); - } - tft.pushPixels(lineBuf, 320); - } - tft.endWrite(); -} - void fullScreenMeter(uint8_t cell, uint8_t pid, bool redrawHeader = true) { fullScreenCell = cell; String label = pidConfig[pid][0]; @@ -1027,13 +1074,18 @@ void fullScreenMeter(uint8_t cell, uint8_t pid, bool redrawHeader = true) { unit = "V"; if (redrawHeader) { - drawHeaderGradient(); + // Ambient vignette gradient from y=0 fading to black (matching 4 quadrants style) + tft.fillRectVGradient(0, 0, 320, 145, getThemeBgColor(), TFT_BLACK); + tft.fillRect(0, 145, 320, 95, TFT_BLACK); + drawPidIconHeader(10, 4, pidConfig[pid][2]); - tft.setTextColor(TFT_WHITE); + uint16_t titleCol = (getMeterColor(pid, last_valid_data[cell]) == TFT_RED && alarmEnabled[pid]) ? TFT_RED : TFT_WHITE; + tft.setTextColor(titleCol); tft.drawCentreString(label.c_str(), 175, 12, 4); + } else { + tft.fillRectVGradient(0, 51, 320, 94, tft.alphaBlend((uint8_t)(255 * (145 - 51) / 145), getThemeBgColor(), TFT_BLACK), TFT_BLACK); + tft.fillRect(0, 145, 320, 95, TFT_BLACK); } - // Clear only below header - tft.fillRect(0, 51, 320, 189, TFT_BLACK); int min = pidConfig[pid][4].toInt(); int max = pidConfig[pid][5].toInt(); @@ -1044,28 +1096,18 @@ void fullScreenMeter(uint8_t cell, uint8_t pid, bool redrawHeader = true) { old_data[cell] = -999; plotFullScreen(cell, last_valid_data[cell], warn, min, max, digit, unit); } else { - if (!cellIsNumeric[cell]) { - // Exponential segmented block mode full screen (18 discrete blocks, 3mm x 5mm, 1mm gap) - for (uint8_t i = 0; i < NUM_BAR_BLOCKS; i++) { - drawBarBlock(i, METER_INACTIVE_COLOR); - } - - tft.loadFont(DSEG7_Modern_BoldItalic_80); - tft.setTextColor(TFT_GREEN, TFT_BLACK); - tft.setTextPadding(240); - tft.drawRightString("---", 312, 148, 1); - tft.setTextPadding(0); - tft.unloadFont(); - old_data[cell] = -999; - } else { - // Digital numeric mode full screen with DSEG7 Smooth Font (Anti-Aliased) - tft.loadFont(DSEG7_Modern_BoldItalic_80); - tft.setTextColor(TFT_GREEN, TFT_BLACK); - tft.setTextPadding(295); - tft.drawRightString("---", 295, 98, 1); - tft.setTextPadding(0); - tft.unloadFont(); + // Exponential segmented block mode full screen (18 discrete blocks, 3mm x 5mm, 1mm gap) + for (uint8_t i = 0; i < NUM_BAR_BLOCKS; i++) { + drawBarBlock(i, METER_INACTIVE_COLOR); } + + tft.loadFont(DSEG7_Modern_BoldItalic_80); + tft.setTextColor(getThemePrimaryColor(), TFT_BLACK); + tft.setTextPadding(240); + tft.drawRightString("---", 312, 148, 1); + tft.setTextPadding(0); + tft.unloadFont(); + old_data[cell] = -999; } } @@ -1073,62 +1115,38 @@ void plotFullScreen(uint8_t cell, float data, int warn, int min, int max, bool digit, String unit) { if (data == old_data[cell]) return; - if (data < min) - data = min; - if (data > max) - data = max; uint8_t pidIdx = pidInCell[cell]; uint16_t col = getMeterColor(pidIdx, data, warn); - uint16_t oldCol = (old_data[cell] < min) ? 0 : getMeterColor(pidIdx, old_data[cell], warn); + uint16_t oldCol = (old_data[cell] <= -900) ? 0 : getMeterColor(pidIdx, old_data[cell], warn); String numStr = String(data, digit); - if (!cellIsNumeric[cell]) { - int newBlocks = calcMeterBlocks(data, min, max); - int oldBlocks = (old_data[cell] < min) ? 0 : calcMeterBlocks(old_data[cell], min, max); + int newBlocks = calcMeterBlocks(data, min, max); + int oldBlocks = (old_data[cell] <= -900) ? 0 : calcMeterBlocks(old_data[cell], min, max); - bool colorChanged = (col != oldCol); - if (col == TFT_RED) { - if (!wasInRedAlarm[cell]) { - drawPidIconHeader(10, 4, pidConfig[pidIdx][2]); + bool colorChanged = (col != oldCol); + if (col == TFT_RED) { + if (!wasInRedAlarm[cell]) { + drawPidIconHeader(10, 4, pidConfig[pidIdx][2]); + } + wasInRedAlarm[cell] = true; + if (colorChanged) { + arcFlashVisible = true; + lastArcFlashTime = millis(); + drawPidIconHeader(10, 4, pidConfig[pidIdx][2]); + if (alarmEnabled[pidIdx]) { + drawFullScreenTitle(pidConfig[pidIdx][0], TFT_RED); } - wasInRedAlarm[cell] = true; - if (colorChanged) { - arcFlashVisible = true; - lastArcFlashTime = millis(); - drawPidIconHeader(10, 4, pidConfig[pidIdx][2]); - for (uint8_t i = 0; i < newBlocks; i++) { - drawBarBlock(i, TFT_RED); - } - for (uint8_t i = newBlocks; i < NUM_BAR_BLOCKS; i++) { - drawBarBlock(i, METER_INACTIVE_COLOR); - } - } else if (arcFlashVisible) { - if (newBlocks > oldBlocks) { - for (uint8_t i = oldBlocks; i < newBlocks; i++) { - drawBarBlock(i, TFT_RED); - } - } else if (newBlocks < oldBlocks) { - for (uint8_t i = newBlocks; i < oldBlocks; i++) { - drawBarBlock(i, METER_INACTIVE_COLOR); - } - } + for (uint8_t i = 0; i < newBlocks; i++) { + drawBarBlock(i, TFT_RED); } - } else { - if (wasInRedAlarm[cell]) { - drawPidIconHeader(10, 4, pidConfig[pidIdx][2]); + for (uint8_t i = newBlocks; i < NUM_BAR_BLOCKS; i++) { + drawBarBlock(i, METER_INACTIVE_COLOR); } - wasInRedAlarm[cell] = false; - if (colorChanged || old_data[cell] < min) { - for (uint8_t i = 0; i < newBlocks; i++) { - drawBarBlock(i, col); - } - for (uint8_t i = newBlocks; i < NUM_BAR_BLOCKS; i++) { - drawBarBlock(i, METER_INACTIVE_COLOR); - } - } else if (newBlocks > oldBlocks) { + } else if (arcFlashVisible || !alarmEnabled[pidIdx]) { + if (newBlocks > oldBlocks) { for (uint8_t i = oldBlocks; i < newBlocks; i++) { - drawBarBlock(i, col); + drawBarBlock(i, TFT_RED); } } else if (newBlocks < oldBlocks) { for (uint8_t i = newBlocks; i < oldBlocks; i++) { @@ -1136,82 +1154,136 @@ void plotFullScreen(uint8_t cell, float data, int warn, int min, int max, } } } - - uint16_t txtCol = (col == TFT_RED && !arcFlashVisible) ? TFT_BLACK : col; - - // Value bottom-right using DSEG7 Modern smooth font - tft.loadFont(DSEG7_Modern_BoldItalic_80); - tft.setTextColor(txtCol, TFT_BLACK); - tft.setTextPadding(240); - tft.drawRightString(numStr.c_str(), 312, 148, 1); - tft.setTextPadding(0); - tft.unloadFont(); } else { - // Digital numeric mode full screen with DSEG7 Smooth Font (Anti-Aliased) - if (col == TFT_RED) { - if (!wasInRedAlarm[cell]) { - drawPidIconHeader(10, 4, pidConfig[pidIdx][2]); - } - wasInRedAlarm[cell] = true; - } else { - if (wasInRedAlarm[cell]) { - drawPidIconHeader(10, 4, pidConfig[pidIdx][2]); - } - wasInRedAlarm[cell] = false; + if (wasInRedAlarm[cell]) { + drawPidIconHeader(10, 4, pidConfig[pidIdx][2]); } - uint16_t txtCol = (col == TFT_RED && !arcFlashVisible) ? TFT_BLACK : col; + wasInRedAlarm[cell] = false; + if (colorChanged || old_data[cell] <= -900) { + for (uint8_t i = 0; i < newBlocks; i++) { + drawBarBlock(i, col); + } + for (uint8_t i = newBlocks; i < NUM_BAR_BLOCKS; i++) { + drawBarBlock(i, METER_INACTIVE_COLOR); + } + } else if (newBlocks > oldBlocks) { + for (uint8_t i = oldBlocks; i < newBlocks; i++) { + drawBarBlock(i, col); + } + } else if (newBlocks < oldBlocks) { + for (uint8_t i = newBlocks; i < oldBlocks; i++) { + drawBarBlock(i, METER_INACTIVE_COLOR); + } + } + } - tft.loadFont(DSEG7_Modern_BoldItalic_80); - tft.setTextColor(txtCol, TFT_BLACK); - tft.setTextPadding(295); - tft.drawRightString(numStr.c_str(), 295, 98, 1); + uint16_t txtCol = getThemePrimaryColor(); + + // Value bottom-right using DSEG7 Modern smooth font + tft.loadFont(DSEG7_Modern_BoldItalic_80); + tft.setTextColor(txtCol, TFT_BLACK); + tft.setTextPadding(240); + tft.drawRightString(numStr.c_str(), 312, 148, 1); + tft.setTextPadding(0); + tft.unloadFont(); + old_data[cell] = data; +} + +// Display "---" (no data) with all blocks inactive on specified quadrant or full screen +void plotNoData(uint8_t cell) { + if (cell >= 4) return; + if (old_data[cell] <= -900.0f && last_valid_data[cell] <= -900.0f) { + return; // Already showing no data, skip redraw to avoid SPI overhead + } + + old_data[cell] = -999.0f; + last_valid_data[cell] = -999.0f; + wasInRedAlarm[cell] = false; + + uint8_t pidIdx = pidInCell[cell]; + + if (fullScreenCell >= 0 && fullScreenCell < 4) { + if (cell == fullScreenCell) { + clearPidIconHeader(10, 4, 42, 42); + drawPidIconHeader(10, 4, pidConfig[pidIdx][2]); + for (uint8_t i = 0; i < NUM_BAR_BLOCKS; i++) { + drawBarBlock(i, METER_INACTIVE_COLOR); + } + tft.loadFont(DSEG7_Modern_BoldItalic_80); + tft.setTextColor(getThemePrimaryColor(), TFT_BLACK); + tft.setTextPadding(240); + tft.drawRightString("---", 312, 148, 1); + tft.setTextPadding(0); + tft.unloadFont(); + } + } else { + int x = cell4_x[cell]; + int y = cell4_y[cell]; + clearPidIcon(x + 5, y + 3, pidConfig[pidIdx][2]); + drawPidIcon(x + 5, y + 3, pidConfig[pidIdx][2]); + for (uint8_t i = 0; i < NUM_BAR_BLOCKS; i++) { + drawQuadBarBlock(cell, i, METER_INACTIVE_COLOR); + } + tft.loadFont(DSEG7_Modern_BoldItalic_34); + tft.setTextColor(getThemePrimaryColor(), TFT_BLACK); + tft.setTextPadding(114); + tft.drawRightString("---", x + 152, y + 74, 1); tft.setTextPadding(0); tft.unloadFont(); } - old_data[cell] = data; } /*-------------------*/ // initialize display void initScreen() { + terminalLineCount = 0; #ifdef SERIAL_DEBUG Serial.printf("Display init, fullScreenCell = %d\n", fullScreenCell); #endif - for (int i = 0; i < maxpidIndex; i++) { + for (int i = 0; i < 4; i++) { pidList[i] = pidConfig[pidInCell[i]][2]; // get PID to list pidReadSkip[i] = pidConfig[pidInCell[i]][6].toInt(); // get read skip pidCurrentSkip[i] = pidReadSkip[i]; // skip for skip reading pid old_data[i] = -999; // clear old data } + for (int i = 4; i < maxpidIndex; i++) { + pidList[i] = pidConfig[i][2]; // get background PIDs (e.g. 0104) + pidReadSkip[i] = pidConfig[i][6].toInt(); // get read skip + pidCurrentSkip[i] = pidReadSkip[i]; + old_data[i] = -999; + } if (fullScreenCell >= 0 && fullScreenCell < 4) { fullScreenMeter(fullScreenCell, pidInCell[fullScreenCell]); } else { tft.fillScreen(TFT_BLACK); // clear screen for (uint8_t c = 0; c < 4; c++) { uint8_t pid = pidInCell[c]; - if (cellIsNumeric[c]) { - numericMeter4(c, pid); - } else { - arcMeter4(c, pid); - } + arcMeter4(c, pid); } drawQuadrantDividers(); } + badgeEcoDrawn = false; + updateEcoBadge(true); } /*-------------------------------*/ -// get A B from response return in global A B variable -void getAB(String elm_rsp, String currentPid) { // 41 05 2A 3C 01> +// get A B from response return in global A B variable; returns true only if valid OBD2 data bytes were parsed +bool getAB(String elm_rsp, String currentPid) { // 41 05 2A 3C 01> A = 0; B = 0; if (currentPid == "ATRV") { - return; + return true; } if (elm_rsp.indexOf("NO DATA") != -1 || elm_rsp.indexOf("UNABLE") != -1 || elm_rsp.indexOf("ERROR") != -1 || - elm_rsp.indexOf("STOPPED") != -1) { - return; + elm_rsp.indexOf("STOPPED") != -1 || + elm_rsp.indexOf("BUS BUSY") != -1 || + elm_rsp.indexOf("TIMEOUT") != -1 || + elm_rsp.indexOf("SEARCHING") != -1 || + elm_rsp.indexOf("?") != -1 || + elm_rsp.indexOf("BUFFER FULL") != -1) { + return false; } // Normalize: replace carriage returns, newlines, and prompt chars with spaces @@ -1222,6 +1294,7 @@ void getAB(String elm_rsp, String currentPid) { // 41 05 2A 3C 01> // Extract expected PID hex byte (e.g. "0105" -> "05", "010C" -> "0C", "010D" -> "0D") String pidByte = (currentPid.length() >= 4) ? currentPid.substring(2) : currentPid; pidByte.toUpperCase(); + bool needB = (pidByte == "0C"); // RPM requires both A and B! // 1. Tokenized search: look for "41" followed by PID byte String tokens[16]; @@ -1244,13 +1317,19 @@ void getAB(String elm_rsp, String currentPid) { // 41 05 2A 3C 01> for (uint8_t i = 0; i + 1 < tokenCount; i++) { if (tokens[i] == "41" && tokens[i + 1] == pidByte) { - if (i + 2 < tokenCount) { - A = strtol(tokens[i + 2].c_str(), NULL, 16); + if (needB) { + if (i + 3 < tokenCount) { + A = strtol(tokens[i + 2].c_str(), NULL, 16); + B = strtol(tokens[i + 3].c_str(), NULL, 16); + return true; + } + } else { + if (i + 2 < tokenCount) { + A = strtol(tokens[i + 2].c_str(), NULL, 16); + B = 0; + return true; + } } - if (i + 3 < tokenCount) { - B = strtol(tokens[i + 3].c_str(), NULL, 16); - } - return; } } @@ -1264,28 +1343,58 @@ void getAB(String elm_rsp, String currentPid) { // 41 05 2A 3C 01> int fIdx = compact.indexOf(targetPrefix); if (fIdx != -1) { int dataIdx = fIdx + targetPrefix.length(); - if (dataIdx + 2 <= compact.length()) { - A = strtol(compact.substring(dataIdx, dataIdx + 2).c_str(), NULL, 16); + if (needB) { + if (dataIdx + 4 <= compact.length()) { + A = strtol(compact.substring(dataIdx, dataIdx + 2).c_str(), NULL, 16); + B = strtol(compact.substring(dataIdx + 2, dataIdx + 4).c_str(), NULL, 16); + return true; + } + } else { + if (dataIdx + 2 <= compact.length()) { + A = strtol(compact.substring(dataIdx, dataIdx + 2).c_str(), NULL, 16); + B = 0; + return true; + } } - if (dataIdx + 4 <= compact.length()) { - B = strtol(compact.substring(dataIdx + 2, dataIdx + 4).c_str(), NULL, 16); - } - return; } - // 3. Positional fallback as in original author code - uint8_t charcnt = currentPid.length() / 2; - if (tokenCount > charcnt + 1) { - A = strtol(tokens[charcnt].c_str(), NULL, 16); - B = strtol(tokens[charcnt + 1].c_str(), NULL, 16); - } else if (tokenCount > charcnt) { - A = strtol(tokens[charcnt].c_str(), NULL, 16); - B = 0; + // 3. Positional fallback ONLY if tokens[0] == "41" AND tokens[1] == pidByte + if (tokenCount >= 2 && tokens[0] == "41" && tokens[1] == pidByte) { + if (needB && tokenCount >= 4) { + A = strtol(tokens[2].c_str(), NULL, 16); + B = strtol(tokens[3].c_str(), NULL, 16); + return true; + } else if (!needB && tokenCount >= 3) { + A = strtol(tokens[2].c_str(), NULL, 16); + B = 0; + return true; + } } + + return false; } // getAB /*-------------------------------*/ void updateMeter(uint8_t pidNo, String response) { // update parameter on screen - if (pidNo >= maxpidIndex || pidNo >= 4) + if (pidNo >= maxpidIndex) + return; + + // Background PID 4: Carga de Motor (Calculated Engine Load % - PID 0104) + if (pidNo == 4) { + bool valid = getAB(response, pidList[4]); + if (valid) { + ignitionOn = true; + consecutiveEcuFails = 0; + float data = A * 100.0 / 255.0; // Formula 2: Engine Load % + if (data >= 0.0f && data <= 100.0f) { + currentEngineLoad = data; + updateEcoBadge(); + } + } + bt_message = ""; + return; + } + + if (pidNo >= 4) return; uint8_t pidIdx = pidInCell[pidNo]; if (pidIdx >= 4) @@ -1298,20 +1407,98 @@ void updateMeter(uint8_t pidNo, String response) { // update parameter on screen bool digit = pidConfig[pidIdx][7].toInt(); int warn = warningValue[pidIdx].toInt(); - getAB(response, pidList[pidNo]); + // Contador de fallos consecutivos por cada instrumento (debounce automotriz) + static uint8_t pidFailCount[4] = {0, 0, 0, 0}; + + bool valid = getAB(response, pidList[pidNo]); float data = 0.0; + bool isFailed = false; + + if (formula == 8) { + // Battery Voltage from ELM327 command "ATRV" (e.g. "14.2V\r\r>") + String s = response; + s.trim(); + int vIdx = s.indexOf('V'); + if (vIdx == -1) vIdx = s.indexOf('v'); + if (vIdx != -1) s = s.substring(0, vIdx); + int lastSpace = s.lastIndexOf(' '); + if (lastSpace != -1) s = s.substring(lastSpace + 1); + int lastCr = s.lastIndexOf('\r'); + if (lastCr != -1) s = s.substring(lastCr + 1); + int lastLf = s.lastIndexOf('\n'); + if (lastLf != -1) s = s.substring(lastLf + 1); + s.trim(); + data = s.toFloat(); + if (data <= 1.0f) { + isFailed = true; + } + + if (!ignitionOn || isFailed) { + plotNoData(pidNo); + bt_message = ""; + return; + } + } else { + if (!valid) { + isFailed = true; + } + } + + if (isFailed) { + pidFailCount[pidNo]++; + // Debounce automotriz: si un paquete cae por ruido en el bus J1850, NUNCA poner en cero la pantalla, + // simplemente mantener el valor anterior. Solo si falla 10 veces seguidas declarar perdida de contacto. + if (pidFailCount[pidNo] >= 10) { + if (formula == 3) { + currentRpm = 0.0f; // Motor detenido / sin RPM + updateEcoBadge(); + } + consecutiveEcuFails++; + if (consecutiveEcuFails >= 6) { + ignitionOn = false; + updateEcoBadge(); + // Contacto cerrado sostenido: limpiar todos los instrumentos a "---" (sin datos) + for (uint8_t c = 0; c < 4; c++) { + plotNoData(c); + } + } + } + bt_message = ""; + return; // SALE SIN TOCAR LA PANTALLA NI PONERLA EN CERO + } + + // Si la respuesta fue valida, reseteamos contadores de fallo y confirmamos contacto puesto + pidFailCount[pidNo] = 0; + consecutiveEcuFails = 0; + ignitionOn = true; + switch (formula) { case 0: data = A * 0.145; break; // psi case 1: data = A - 40; + // Filtro de rango realista para refrigerante (-20°C a 140°C) + if (data < -20 || data > 140) { + bt_message = ""; + return; + } break; // temp °C (ECT) case 2: data = A * 100.0 / 255; break; // % case 3: data = (256 * A + B) / 4.0; + // Filtro de rango realista para RPM (0 a 9000) + if (data < 0 || data > 9000) { + bt_message = ""; + return; + } + currentRpm = data; + if (data > 300.0f) { + lastActivityTime = millis(); + } + updateEcoBadge(); break; // rpm (ENG SPD) case 4: data = (256 * A + B) / 1000.0; @@ -1328,24 +1515,22 @@ void updateMeter(uint8_t pidNo, String response) { // update parameter on screen break; case 7: data = A; // km/h (PID 010D Vehicle Speed) + if (data > 0.0f) lastActivityTime = millis(); break; - case 8: { - // Battery Voltage from ELM327 command "ATRV" (e.g. "14.2V\r\r>") - String s = response; - s.trim(); - int vIdx = s.indexOf('V'); - if (vIdx == -1) vIdx = s.indexOf('v'); - if (vIdx != -1) s = s.substring(0, vIdx); - int lastSpace = s.lastIndexOf(' '); - if (lastSpace != -1) s = s.substring(lastSpace + 1); - int lastCr = s.lastIndexOf('\r'); - if (lastCr != -1) s = s.substring(lastCr + 1); - int lastLf = s.lastIndexOf('\n'); - if (lastLf != -1) s = s.substring(lastLf + 1); - s.trim(); - data = s.toFloat(); + case 8: + // Ya parseado y validado arriba en data break; + default: + return; } + + // Si el motor esta en contacto pero apagado (RPM == 0), mostrar "---" en RPM en vez de 0 + if (formula == 3 && data <= 0.0f) { + currentRpm = 0.0f; + updateEcoBadge(); + plotNoData(pidNo); + bt_message = ""; + return; } last_valid_data[pidNo] = data; @@ -1355,11 +1540,7 @@ void updateMeter(uint8_t pidNo, String response) { // update parameter on screen plotFullScreen(fullScreenCell, data, warn, min, max, digit, unit); } } else { - if (cellIsNumeric[pidNo]) { - plotNumeric4(pidNo, data, warn, digit, unit); - } else { - plotArc4(pidNo, data, warn, min, max, digit, unit); - } + plotArc4(pidNo, data, warn, min, max, digit, unit); } bt_message = ""; // reset } @@ -1383,7 +1564,124 @@ void handleAlarmSound(bool anyAlarmActive, bool flashTick = false) { uint16_t duty = VOL_DUTY_TABLE[alarmVolumeLevel > 5 ? 3 : alarmVolumeLevel]; if (alarmSoundType == 0) { - // Patrón 0: Casio Doble cada 1000ms + // 0: Chime BMW (Mi7 -> Do7, 2637 Hz -> 2093 Hz cada 1100ms) + if (alarmSoundStep == 0) { + if (now - lastAlarmSoundCycle >= 1100) { + lastAlarmSoundCycle = now; + alarmSoundStep = 1; + alarmSoundStepTime = now; + ledcSetup(buzzerChannel, 2637, 10); + ledcWrite(buzzerChannel, duty); + } + } else if (alarmSoundStep == 1) { // 60ms tono 1 + if (now - alarmSoundStepTime >= 60) { + ledcWrite(buzzerChannel, 0); + alarmSoundStep = 2; + alarmSoundStepTime = now; + } + } else if (alarmSoundStep == 2) { // 15ms pausa + if (now - alarmSoundStepTime >= 15) { + ledcSetup(buzzerChannel, 2093, 10); + ledcWrite(buzzerChannel, duty); + alarmSoundStep = 3; + alarmSoundStepTime = now; + } + } else if (alarmSoundStep == 3) { // 110ms tono 2 + if (now - alarmSoundStepTime >= 110) { + ledcWrite(buzzerChannel, 0); + alarmSoundStep = 0; + } + } + } else if (alarmSoundType == 1) { + // 1: Mercedes Gong (Re7 -> Fa#7, 2349 Hz -> 2960 Hz cada 1100ms) + if (alarmSoundStep == 0) { + if (now - lastAlarmSoundCycle >= 1100) { + lastAlarmSoundCycle = now; + alarmSoundStep = 1; + alarmSoundStepTime = now; + ledcSetup(buzzerChannel, 2349, 10); + ledcWrite(buzzerChannel, duty); + } + } else if (alarmSoundStep == 1) { // 45ms tono 1 + if (now - alarmSoundStepTime >= 45) { + ledcWrite(buzzerChannel, 0); + alarmSoundStep = 2; + alarmSoundStepTime = now; + } + } else if (alarmSoundStep == 2) { // 20ms pausa + if (now - alarmSoundStepTime >= 20) { + ledcSetup(buzzerChannel, 2960, 10); + ledcWrite(buzzerChannel, duty); + alarmSoundStep = 3; + alarmSoundStepTime = now; + } + } else if (alarmSoundStep == 3) { // 85ms tono 2 + if (now - alarmSoundStepTime >= 85) { + ledcWrite(buzzerChannel, 0); + alarmSoundStep = 0; + } + } + } else if (alarmSoundType == 2) { + // 2: Audi Cockpit (Do7 -> Mi7 -> Sol7, 2093 -> 2637 -> 3136 Hz cada 1100ms) + if (alarmSoundStep == 0) { + if (now - lastAlarmSoundCycle >= 1100) { + lastAlarmSoundCycle = now; + alarmSoundStep = 1; + alarmSoundStepTime = now; + ledcSetup(buzzerChannel, 2093, 10); + ledcWrite(buzzerChannel, duty); + } + } else if (alarmSoundStep == 1) { // 35ms nota 1 + if (now - alarmSoundStepTime >= 35) { + ledcSetup(buzzerChannel, 2637, 10); + ledcWrite(buzzerChannel, duty); + alarmSoundStep = 2; + alarmSoundStepTime = now; + } + } else if (alarmSoundStep == 2) { // 35ms nota 2 + if (now - alarmSoundStepTime >= 35) { + ledcSetup(buzzerChannel, 3136, 10); + ledcWrite(buzzerChannel, duty); + alarmSoundStep = 3; + alarmSoundStepTime = now; + } + } else if (alarmSoundStep == 3) { // 65ms nota 3 + if (now - alarmSoundStepTime >= 65) { + ledcWrite(buzzerChannel, 0); + alarmSoundStep = 0; + } + } + } else if (alarmSoundType == 3) { + // 3: Porsche Sport (Doble staccato rapido 3500 Hz cada 900ms) + if (alarmSoundStep == 0) { + if (now - lastAlarmSoundCycle >= 900) { + lastAlarmSoundCycle = now; + alarmSoundStep = 1; + alarmSoundStepTime = now; + ledcSetup(buzzerChannel, 3500, 10); + ledcWrite(buzzerChannel, duty); + } + } else if (alarmSoundStep == 1) { // 30ms pulso 1 + if (now - alarmSoundStepTime >= 30) { + ledcWrite(buzzerChannel, 0); + alarmSoundStep = 2; + alarmSoundStepTime = now; + } + } else if (alarmSoundStep == 2) { // 25ms pausa + if (now - alarmSoundStepTime >= 25) { + ledcSetup(buzzerChannel, 3500, 10); + ledcWrite(buzzerChannel, duty); + alarmSoundStep = 3; + alarmSoundStepTime = now; + } + } else if (alarmSoundStep == 3) { // 30ms pulso 2 + if (now - alarmSoundStepTime >= 30) { + ledcWrite(buzzerChannel, 0); + alarmSoundStep = 0; + } + } + } else if (alarmSoundType == 4) { + // 4: Casio Clasico (Doble chirp 4096 Hz cada 1000ms) if (alarmSoundStep == 0) { if (now - lastAlarmSoundCycle >= 1000) { lastAlarmSoundCycle = now; @@ -1392,8 +1690,8 @@ void handleAlarmSound(bool anyAlarmActive, bool flashTick = false) { ledcSetup(buzzerChannel, 4096, 10); ledcWrite(buzzerChannel, duty); } - } else if (alarmSoundStep == 1) { // 25ms chirp - if (now - alarmSoundStepTime >= 25) { + } else if (alarmSoundStep == 1) { // 24ms chirp 1 + if (now - alarmSoundStepTime >= 24) { ledcWrite(buzzerChannel, 0); alarmSoundStep = 2; alarmSoundStepTime = now; @@ -1405,54 +1703,14 @@ void handleAlarmSound(bool anyAlarmActive, bool flashTick = false) { alarmSoundStep = 3; alarmSoundStepTime = now; } - } else if (alarmSoundStep == 3) { // 25ms chirp - if (now - alarmSoundStepTime >= 25) { + } else if (alarmSoundStep == 3) { // 24ms chirp 2 + if (now - alarmSoundStepTime >= 24) { ledcWrite(buzzerChannel, 0); alarmSoundStep = 0; } } - } else if (alarmSoundType == 1) { - // Patrón 1: Sincronizado con el parpadeo del vúmetro - if (flashTick && arcFlashVisible) { - ledcSetup(buzzerChannel, 4096, 10); - ledcWrite(buzzerChannel, duty); - alarmSoundStep = 1; - alarmSoundStepTime = now; - } else if (alarmSoundStep == 1 && (now - alarmSoundStepTime >= 30)) { - ledcWrite(buzzerChannel, 0); - alarmSoundStep = 0; - } - } else if (alarmSoundType == 2) { - // Patrón 2: Bitonal Automotriz cada 1000ms (4096 Hz -> 3072 Hz) - if (alarmSoundStep == 0) { - if (now - lastAlarmSoundCycle >= 1000) { - lastAlarmSoundCycle = now; - alarmSoundStep = 1; - alarmSoundStepTime = now; - ledcSetup(buzzerChannel, 4096, 10); - ledcWrite(buzzerChannel, duty); - } - } else if (alarmSoundStep == 1) { // 40ms tono alto - if (now - alarmSoundStepTime >= 40) { - ledcWrite(buzzerChannel, 0); - alarmSoundStep = 2; - alarmSoundStepTime = now; - } - } else if (alarmSoundStep == 2) { // 20ms silencio - if (now - alarmSoundStepTime >= 20) { - ledcSetup(buzzerChannel, 3072, 10); - ledcWrite(buzzerChannel, duty); - alarmSoundStep = 3; - alarmSoundStepTime = now; - } - } else if (alarmSoundStep == 3) { // 40ms tono medio - if (now - alarmSoundStepTime >= 40) { - ledcWrite(buzzerChannel, 0); - alarmSoundStep = 0; - } - } - } else if (alarmSoundType == 3) { - // Patrón 3: Triple Urgente cada 1200ms + } else if (alarmSoundType == 5) { + // 5: Triple Urgente (3 pulsos rapidos 4096 Hz cada 1200ms) if (alarmSoundStep == 0) { if (now - lastAlarmSoundCycle >= 1200) { lastAlarmSoundCycle = now; @@ -1461,8 +1719,8 @@ void handleAlarmSound(bool anyAlarmActive, bool flashTick = false) { ledcSetup(buzzerChannel, 4096, 10); ledcWrite(buzzerChannel, duty); } - } else if (alarmSoundStep == 1) { // 20ms pulso 1 - if (now - alarmSoundStepTime >= 20) { + } else if (alarmSoundStep == 1) { // 22ms pulso 1 + if (now - alarmSoundStepTime >= 22) { ledcWrite(buzzerChannel, 0); alarmSoundStep = 2; alarmSoundStepTime = now; @@ -1474,8 +1732,8 @@ void handleAlarmSound(bool anyAlarmActive, bool flashTick = false) { alarmSoundStep = 3; alarmSoundStepTime = now; } - } else if (alarmSoundStep == 3) { // 20ms pulso 2 - if (now - alarmSoundStepTime >= 20) { + } else if (alarmSoundStep == 3) { // 22ms pulso 2 + if (now - alarmSoundStepTime >= 22) { ledcWrite(buzzerChannel, 0); alarmSoundStep = 4; alarmSoundStepTime = now; @@ -1487,8 +1745,8 @@ void handleAlarmSound(bool anyAlarmActive, bool flashTick = false) { alarmSoundStep = 5; alarmSoundStepTime = now; } - } else if (alarmSoundStep == 5) { // 20ms pulso 3 - if (now - alarmSoundStepTime >= 20) { + } else if (alarmSoundStep == 5) { // 22ms pulso 3 + if (now - alarmSoundStepTime >= 22) { ledcWrite(buzzerChannel, 0); alarmSoundStep = 0; } @@ -1516,48 +1774,42 @@ void handleArcAlarmFlash() { float data = last_valid_data[cell]; uint16_t col = getMeterColor(pidIdx, data, warn); bool inRed = (col == TFT_RED); - if (inRed) anyInRedAlarm = true; + bool isAlarmActive = alarmEnabled[pidIdx]; + if (inRed && isAlarmActive) anyInRedAlarm = true; bool digit = pidConfig[pidIdx][7].toInt(); String numStr = String(data, digit); if (wasInRedAlarm[cell] && !inRed) { - // Exited red alarm: restore steady arc, text, and icon + // Exited red alarm: restore steady arc, text, icon, and title wasInRedAlarm[cell] = false; drawPidIconHeader(10, 4, pidConfig[pidIdx][2]); - if (!cellIsNumeric[cell]) { - int min = pidConfig[pidIdx][4].toInt(); - int max = pidConfig[pidIdx][5].toInt(); - int newBlocks = calcMeterBlocks(data, min, max); - for (uint8_t i = 0; i < newBlocks; i++) { - drawBarBlock(i, col); - } - for (uint8_t i = newBlocks; i < NUM_BAR_BLOCKS; i++) { - drawBarBlock(i, METER_INACTIVE_COLOR); - } - tft.loadFont(DSEG7_Modern_BoldItalic_80); - tft.setTextColor(col, TFT_BLACK); - tft.setTextPadding(240); - tft.drawRightString(numStr.c_str(), 312, 148, 1); - tft.setTextPadding(0); - tft.unloadFont(); - } else { - tft.loadFont(DSEG7_Modern_BoldItalic_80); - tft.setTextColor(col, TFT_BLACK); - tft.setTextPadding(295); - tft.drawRightString(numStr.c_str(), 295, 98, 1); - tft.setTextPadding(0); - tft.unloadFont(); + drawFullScreenTitle(pidConfig[pidIdx][0], TFT_WHITE); + int min = pidConfig[pidIdx][4].toInt(); + int max = pidConfig[pidIdx][5].toInt(); + int newBlocks = calcMeterBlocks(data, min, max); + for (uint8_t i = 0; i < newBlocks; i++) { + drawBarBlock(i, col); } + for (uint8_t i = newBlocks; i < NUM_BAR_BLOCKS; i++) { + drawBarBlock(i, METER_INACTIVE_COLOR); + } + tft.loadFont(DSEG7_Modern_BoldItalic_80); + tft.setTextColor(getThemePrimaryColor(), TFT_BLACK); + tft.setTextPadding(240); + tft.drawRightString(numStr.c_str(), 312, 148, 1); + tft.setTextPadding(0); + tft.unloadFont(); } else if (inRed) { wasInRedAlarm[cell] = true; - if (toggleTick) { - uint16_t txtCol = arcFlashVisible ? TFT_RED : TFT_BLACK; - if (arcFlashVisible) { - drawPidIconHeader(10, 4, pidConfig[pidIdx][2]); - } else { - clearPidIconHeader(10, 4, 42, 42); - } - if (!cellIsNumeric[cell]) { + if (isAlarmActive) { + if (toggleTick) { + if (arcFlashVisible) { + drawPidIconHeader(10, 4, pidConfig[pidIdx][2]); + drawFullScreenTitle(pidConfig[pidIdx][0], TFT_RED); + } else { + clearPidIconHeader(10, 4, 42, 42); + drawFullScreenTitle(pidConfig[pidIdx][0], 0); + } int min = pidConfig[pidIdx][4].toInt(); int max = pidConfig[pidIdx][5].toInt(); int newBlocks = calcMeterBlocks(data, min, max); @@ -1574,19 +1826,6 @@ void handleArcAlarmFlash() { drawBarBlock(i, TFT_BLACK); } } - tft.loadFont(DSEG7_Modern_BoldItalic_80); - tft.setTextColor(txtCol, TFT_BLACK); - tft.setTextPadding(240); - tft.drawRightString(numStr.c_str(), 312, 148, 1); - tft.setTextPadding(0); - tft.unloadFont(); - } else { - tft.loadFont(DSEG7_Modern_BoldItalic_80); - tft.setTextColor(txtCol, TFT_BLACK); - tft.setTextPadding(295); - tft.drawRightString(numStr.c_str(), 295, 98, 1); - tft.setTextPadding(0); - tft.unloadFont(); } } } @@ -1600,7 +1839,8 @@ void handleArcAlarmFlash() { float data = last_valid_data[cell]; uint16_t col = getMeterColor(pidIdx, data, warn); bool inRed = (col == TFT_RED); - if (inRed) anyInRedAlarm = true; + bool isAlarmActive = alarmEnabled[pidIdx]; + if (inRed && isAlarmActive) anyInRedAlarm = true; bool digit = pidConfig[pidIdx][7].toInt(); String numStr = String(data, digit); int x = cell4_x[cell]; @@ -1610,40 +1850,30 @@ void handleArcAlarmFlash() { // Exited red alarm: restore steady arc, text, and icon wasInRedAlarm[cell] = false; drawPidIcon(x + 5, y + 3, pidConfig[pidIdx][2]); - if (!cellIsNumeric[cell]) { - int min = pidConfig[pidIdx][4].toInt(); - int max = pidConfig[pidIdx][5].toInt(); - int newBlocks = calcMeterBlocks(data, min, max); - for (uint8_t i = 0; i < newBlocks; i++) { - drawQuadBarBlock(cell, i, col); - } - for (uint8_t i = newBlocks; i < NUM_BAR_BLOCKS; i++) { - drawQuadBarBlock(cell, i, METER_INACTIVE_COLOR); - } - tft.loadFont(DSEG7_Modern_BoldItalic_34); - tft.setTextColor(col, TFT_BLACK); - tft.setTextPadding(114); - tft.drawRightString(numStr.c_str(), x + 152, y + 74, 1); - tft.setTextPadding(0); - tft.unloadFont(); - } else { - tft.loadFont(DSEG7_Modern_BoldItalic_44); - tft.setTextColor(col, TFT_BLACK); - tft.setTextPadding(160 - 12); - tft.drawRightString(numStr.c_str(), x + 160 - 10, y + 46, 1); - tft.setTextPadding(0); - tft.unloadFont(); + int min = pidConfig[pidIdx][4].toInt(); + int max = pidConfig[pidIdx][5].toInt(); + int newBlocks = calcMeterBlocks(data, min, max); + for (uint8_t i = 0; i < newBlocks; i++) { + drawQuadBarBlock(cell, i, col); } + for (uint8_t i = newBlocks; i < NUM_BAR_BLOCKS; i++) { + drawQuadBarBlock(cell, i, METER_INACTIVE_COLOR); + } + tft.loadFont(DSEG7_Modern_BoldItalic_34); + tft.setTextColor(getThemePrimaryColor(), TFT_BLACK); + tft.setTextPadding(114); + tft.drawRightString(numStr.c_str(), x + 152, y + 74, 1); + tft.setTextPadding(0); + tft.unloadFont(); } else if (inRed) { wasInRedAlarm[cell] = true; - if (toggleTick) { - uint16_t txtCol = arcFlashVisible ? TFT_RED : TFT_BLACK; - if (arcFlashVisible) { - drawPidIcon(x + 5, y + 3, pidConfig[pidIdx][2]); - } else { - clearPidIcon(x + 5, y + 3, pidConfig[pidIdx][2]); - } - if (!cellIsNumeric[cell]) { + if (isAlarmActive) { + if (toggleTick) { + if (arcFlashVisible) { + drawPidIcon(x + 5, y + 3, pidConfig[pidIdx][2]); + } else { + clearPidIcon(x + 5, y + 3, pidConfig[pidIdx][2]); + } int min = pidConfig[pidIdx][4].toInt(); int max = pidConfig[pidIdx][5].toInt(); int newBlocks = calcMeterBlocks(data, min, max); @@ -1660,19 +1890,6 @@ void handleArcAlarmFlash() { drawQuadBarBlock(cell, i, TFT_BLACK); } } - tft.loadFont(DSEG7_Modern_BoldItalic_34); - tft.setTextColor(txtCol, TFT_BLACK); - tft.setTextPadding(114); - tft.drawRightString(numStr.c_str(), x + 152, y + 74, 1); - tft.setTextPadding(0); - tft.unloadFont(); - } else { - tft.loadFont(DSEG7_Modern_BoldItalic_44); - tft.setTextColor(txtCol, TFT_BLACK); - tft.setTextPadding(160 - 12); - tft.drawRightString(numStr.c_str(), x + 160 - 10, y + 46, 1); - tft.setTextPadding(0); - tft.unloadFont(); } } } @@ -1708,16 +1925,24 @@ void updateBacklightFade() { // auto dim backlight function void autoDim() { + if (brightnessIndex > 0) { + uint8_t manualVal = BRIGHTNESS_PWM_TABLE[brightnessIndex > 5 ? 5 : brightnessIndex]; + if (targetBacklight != manualVal) { + targetBacklight = manualVal; + } + updateBacklightFade(); + return; + } int light = analogRead(LDR_PIN); // read light if (light > LIGHT_LEVEL) { // low light (dark) low_count++; if (low_count > 6) { low_count = 6; if (!dim) { - targetBacklight = 50; // smooth fade target: dim + targetBacklight = 15; // smooth fade target: dim dim = true; #ifdef SERIAL_DEBUG - Serial.println(F("Backlight -> target dim (50)")); + Serial.println(F("Backlight -> target dim (15)")); #endif } } diff --git a/sketch/obd2_gauge/obd2_gauge.ino b/sketch/obd2_gauge/obd2_gauge.ino index c89a9a5..21da688 100644 --- a/sketch/obd2_gauge/obd2_gauge.ino +++ b/sketch/obd2_gauge/obd2_gauge.ino @@ -49,9 +49,17 @@ Preferences pref; //create preference #define SCA_PIN 21 //not used same pin with TFT_BL #define SCL_PIN 22 //not used (avaialable) CAN_TX #define ADC_PIN 35 //not used (available) CAN_RX +// Verified Physical Hardware Mapping on ESP32-2432S028: +// GPIO 4 = RED LED +// GPIO 16 = GREEN LED +// GPIO 17 = BLUE LED #define LED_RED_PIN 4 #define LED_GREEN_PIN 16 #define LED_BLUE_PIN 17 +// PWM Channels 4, 5, 6 on Timers 2 & 3 (isolated from Timer 1 buzzer) +#define LED_RED_CH 4 +#define LED_GREEN_CH 5 +#define LED_BLUE_CH 6 #define LDR_PIN 34 //LDR sensor #define BUZZER_PIN 26 //speaker #define SELECTOR_PIN 27 //push button @@ -64,41 +72,126 @@ TFT_eSPI tft = TFT_eSPI(); #define TFT_GREY 0x5AEB -//ELM327 init https://www.elmelectronics.com/wp-content/uploads/2016/07/ELM327DS.pdf -const uint8_t elm327InitCount = 8; -const String elm327Init[elm327InitCount] = { "ATZ", "ATBRD23", "ATSP0", "ATAT2", "ATL0", "ATH0", "ATE0", "0100" }; //agressive wait response time from ECU -//const String elm327Init[elm327InitCount] = {"ATZ","ATPP0CSV35","ATPP0CON","ATSP0","ATAT2","ATL0","ATH0","ATE0","0100"};//agressive wait response time from ECU - -/*------ PIDS total 7 now ------------------- -Array data -> { Label , unit, pid, fomula, min, max, ,skip, digit, warn } +// ELM327 PIDs Configuration +/*------ PIDS total 4 ------------------- +Array data -> { Label , unit, pid, fomula, min, max, skip, digit, warn } label = Pid label show on meter unit = unit for pid -pid = string pid 0104 -formula = formula no to calculate +pid = string pid (e.g. 0105, 010C, 010D, ATRV) +formula = formula no to calculate (1: ECT, 3: RPM, 7: Speed, 8: ATRV) min = lowest value max = highest value skip = delay reading 0 - 3; 3 = max delay read digit = want to show digit or not warn = default warning value */ -const String pidConfig[4][9] = { +const String pidConfig[5][9] = { //[pid][data] - { "Temperatura", "`C", "0105", "1", "0", "120", "2", "0", "106" }, //0 = Temperatura (0105) + { "Temperatura", "`C", "0105", "1", "60", "120", "2", "0", "110" }, //0 = Temperatura (0105) { "RPM", "rpm", "010C", "3", "0", "6000", "0", "0", "5000" }, //1 = RPM (010C) - { "Voltaje", "V", "0142", "4", "10", "16", "1", "1", "15" }, //2 = Voltaje (0142) - { "Velocidad", "km/h", "010D", "7", "0", "160", "0", "0", "130" } //3 = Velocidad (010D) + { "Voltaje", "V", "ATRV", "8", "10", "16", "1", "1", "15" }, //2 = Voltaje Bateria (ATRV) + { "Velocidad", "km/h", "010D", "7", "0", "160", "0", "0", "130" }, //3 = Velocidad (010D) + { "Carga", "%", "0104", "2", "0", "100", "0", "0", "85" } //4 = Carga Motor (0104) }; //hold warning value -String warningValue[4] = { "106", "5000", "15.0", "130" }; -bool alarmEnabled[4] = { true, true, true, true }; +String warningValue[5] = { "110", "5000", "15.0", "130", "85" }; +bool alarmEnabled[5] = { true, true, true, true, false }; // Buzzer volume control table (0: Silencio, 1: Ultra Bajo, 2: Muy Bajo, 3: Bajo/Casio, 4: Medio, 5: Alto) const uint16_t VOL_DUTY_TABLE[6] = { 0, 2, 8, 25, 80, 250 }; const char* const VOL_NAME_TABLE[6] = { "SILENCIO", "ULTRA BAJO", "MUY BAJO", "BAJO (CASIO)", "MEDIO", "ALTO" }; uint8_t buzzerVolumeLevel = 3; // Default 3: Bajo (Casio suave) +uint8_t beepSoundType = 0; // Default 0: Casio Chirp (0: Casio Chirp, 1: Click Corto, 2: Tono Suave, 3: Tick Digital, 4: Doble Pip, 5: Campana Retro) uint8_t alarmVolumeLevel = 3; // Default 3: Bajo/Casio (Volumen independiente de alarma) uint8_t alarmSoundType = 0; // Default 0: Casio Doble (0: Casio Doble, 1: Sincronizado, 2: Bitonal, 3: Triple Urgente) +uint8_t autoSleepIndex = 2; // Default 2: 1 min (0: OFF, 1: 30s, 2: 1m, 3: 2m, 4: 5m) +uint32_t lastActivityTime = 0; // Inactivity tracker for auto-sleep +bool wokeFromSleep = false; // Flag set when waking from sleep to resume Bluetooth + +// Screen brightness settings (0: AUTO LDR, 1: 5%, 2: 15%, 3: 35%, 4: 65%, 5: 100%) +uint8_t brightnessIndex = 0; // Default 0: AUTO +const uint8_t BRIGHTNESS_PWM_TABLE[6] = { 255, 12, 40, 90, 165, 255 }; +const char* const BRIGHTNESS_NAME_TABLE[6] = { "AUTO", "5%", "15%", "35%", "65%", "100%" }; + +// Instrument Cluster & Menu Themes +struct GaugeTheme { + const char* name; + const char* desc; + uint16_t primaryColor; // Primary accent, borders, active glow, scroll thumb + uint16_t accentColor; // Header gradient start, button resting background + uint16_t divColor; // 4-Quadrant divider crosshair line + uint16_t darkColor; // Header gradient end / deep background + uint16_t bgColor; // Subtle desaturated ambient vignette background + uint8_t ledR; // Rear RGB LED Red (0..255) + uint8_t ledG; // Rear RGB LED Green (0..255) + uint8_t ledB; // Rear RGB LED Blue (0..255) +}; + +const GaugeTheme GAUGE_THEMES[6] = { + { "Azul Cian", "Digital Moderno", 0x07FF, 0x03B9, 0x0254, 0x0110, 0x01D3, 0, 180, 255 }, // 0: Vivid Electric Cyan + { "Verde Sport", "Cockpit Clasico", 0x07E0, 0x0446, 0x0283, 0x0141, 0x0205, 0, 255, 30 }, // 1: Vivid Emerald Green + { "Ambar BMW", "Nocturno M-Power", 0xFDE0, 0x93C0, 0x5240, 0x2120, 0x41E0, 255, 120, 0 }, // 2: Vivid M-Power Glowing Amber + { "Blanco Puro", "OLED Precision", 0xFFFF, 0x6B6D, 0x4228, 0x18E3, 0x2965, 220, 230, 255 }, // 3: Pure Crisp White + { "Naranja Sport","McLaren Papaya", 0xFD20, 0x9260, 0x5160, 0x20A0, 0x4140, 255, 80, 0 }, // 4: Vivid Papaya Orange (reemplaza rojo) + { "Cyber Violet", "Neon Nightrunner", 0xD1BF, 0x7119, 0x40CE, 0x1846, 0x2869, 200, 0, 255 } // 5: Vivid Electric Violet +}; + +uint8_t themeIndex = 0; // Default 0: Azul Cian + +inline uint16_t getThemePrimaryColor() { + if (themeIndex >= 6) return 0x07FF; + return GAUGE_THEMES[themeIndex].primaryColor; +} + +inline uint16_t getThemeAccentColor() { + if (themeIndex >= 6) return 0x234F; + return GAUGE_THEMES[themeIndex].accentColor; +} + +inline uint16_t getThemeDivColor() { + if (themeIndex >= 6) return 0x3412; + return GAUGE_THEMES[themeIndex].divColor; +} + +inline uint16_t getThemeDarkColor() { + if (themeIndex >= 6) return 0x1105; + return GAUGE_THEMES[themeIndex].darkColor; +} + +inline uint16_t getThemeBgColor() { + if (themeIndex >= 6) return 0x19C8; + return GAUGE_THEMES[themeIndex].bgColor; +} + +// Control functions for the Rear RGB LED (Active-LOW, Common Anode) +void setRearLedColor(uint8_t r, uint8_t g, uint8_t b) { + // Ensure pins are attached to LEDC + ledcAttachPin(LED_RED_PIN, LED_RED_CH); + ledcAttachPin(LED_GREEN_PIN, LED_GREEN_CH); + ledcAttachPin(LED_BLUE_PIN, LED_BLUE_CH); + // Duty cycle for 8-bit (0..255): 255 = 3.3V (OFF), 0 = 0V (FULL ON) + ledcWrite(LED_RED_CH, 255 - r); + ledcWrite(LED_GREEN_CH, 255 - g); + ledcWrite(LED_BLUE_CH, 255 - b); +} + +void setRearLedOff() { + ledcWrite(LED_RED_CH, 255); + ledcWrite(LED_GREEN_CH, 255); + ledcWrite(LED_BLUE_CH, 255); + // Drive pins directly HIGH as well for guaranteed zero leakage during sleep + digitalWrite(LED_RED_PIN, HIGH); + digitalWrite(LED_GREEN_PIN, HIGH); + digitalWrite(LED_BLUE_PIN, HIGH); +} + +void updateRearLedTheme() { + if (themeIndex >= 6) return; + setRearLedColor(GAUGE_THEMES[themeIndex].ledR, + GAUGE_THEMES[themeIndex].ledG, + GAUGE_THEMES[themeIndex].ledB); +} /* 0 - Refrigerante @@ -108,7 +201,6 @@ uint8_t alarmSoundType = 0; // Default 0: Casio Doble (0: Casio Doble, 1: Sin */ const uint8_t pidInCell[4] = { 0, 3, 1, 2 }; // 4 Cuadrantes: 0=Refrigerante, 1=Velocidad, 2=Revoluciones, 3=Voltaje -bool cellIsNumeric[4] = { false, false, false, false }; // false = Reloj (Arco), true = Solo Numero int8_t fullScreenCell = -1; // -1 = 4 cuadrantes, 0..3 = pantalla completa de ese cuadrante // User configuration here to change display > @@ -125,7 +217,9 @@ uint8_t B = 0; //get B //Global variable const uint32_t SLEEP_DURATION = 180 * 1000000; //180 sec* us = 3 min -String line[12] = { "", "", "", "", "", "", "", "", "", "", "", "" }; //buffer for each line in terminal function +const uint8_t MAX_TERMINAL_LINES = 13; +String line[MAX_TERMINAL_LINES]; //buffer for each line in terminal function +uint8_t terminalLineCount = 0; bool dim = false; //back light dim flag const uint8_t LIGHT_LEVEL = 40; //backlight control by light level Higher = darker light String serial_no = ""; //keep serial no. @@ -157,20 +251,88 @@ XPT2046_TouchscreenSOFTSPI ts(XPT2046_CS); /*------------------*/ -//TERMINAL terminal for debugging display text -void Terminal(String texts, uint16_t x, uint16_t y, uint16_t w, uint16_t h) { - uint8_t max_line = round((h - y) / 16.0); - tft.fillRect(x, y, x + w, y + h, TFT_BLACK); - tft.setTextColor(TFT_WHITE); - for (uint8_t i = 0; i < max_line; i++) { - if (i <= max_line - 2) { - line[i] = line[i + 1]; +// Draw a single console boot entry with authentic status badges +void drawTerminalEntry(int lineIdx, const String &rawText) { + int yPos = 6 + lineIdx * 18; + String text = rawText; + + // Clear that single line to prevent overlap if redrawn + tft.fillRect(0, yPos, 320, 18, TFT_BLACK); + + if (text.startsWith("[ OK ]")) { + tft.setTextColor(0x7BEF, TFT_BLACK); + tft.drawString("[", 6, yPos, 2); + tft.setTextColor(TFT_GREEN, TFT_BLACK); + tft.drawString(" OK ", 12, yPos, 2); + tft.setTextColor(0x7BEF, TFT_BLACK); + tft.drawString("]", 52, yPos, 2); + tft.setTextColor(TFT_WHITE, TFT_BLACK); + tft.drawString(text.substring(8).c_str(), 60, yPos, 2); + } else if (text.startsWith("[FAILED]")) { + tft.setTextColor(0x7BEF, TFT_BLACK); + tft.drawString("[", 6, yPos, 2); + tft.setTextColor(TFT_RED, TFT_BLACK); + tft.drawString("FAILED", 12, yPos, 2); + tft.setTextColor(0x7BEF, TFT_BLACK); + tft.drawString("]", 52, yPos, 2); + tft.setTextColor(TFT_WHITE, TFT_BLACK); + tft.drawString(text.substring(8).c_str(), 60, yPos, 2); + } else if (text.startsWith("[ INFO ]")) { + tft.setTextColor(0x7BEF, TFT_BLACK); + tft.drawString("[", 6, yPos, 2); + tft.setTextColor(TFT_CYAN, TFT_BLACK); + tft.drawString(" INFO ", 12, yPos, 2); + tft.setTextColor(0x7BEF, TFT_BLACK); + tft.drawString("]", 52, yPos, 2); + tft.setTextColor(TFT_WHITE, TFT_BLACK); + tft.drawString(text.substring(8).c_str(), 60, yPos, 2); + } else if (text.startsWith("[") && text.indexOf(']') != -1) { + int closeIdx = text.indexOf(']'); + String tag = text.substring(0, closeIdx + 1); + String rest = text.substring(closeIdx + 1); + tft.setTextColor(0x07E0, TFT_BLACK); // Green kernel timestamp + tft.drawString(tag.c_str(), 6, yPos, 2); + int tagW = tft.textWidth(tag.c_str(), 2); + tft.setTextColor(TFT_WHITE, TFT_BLACK); + tft.drawString(rest.c_str(), 6 + tagW + 4, yPos, 2); + } else { + tft.setTextColor(TFT_WHITE, TFT_BLACK); + tft.drawString(text.c_str(), 6, yPos, 2); + } +} + +// TERMINAL: Authentic system boot console style loading lines from top to bottom +void Terminal(String texts, uint16_t x = 0, uint16_t y = 0, uint16_t w = 320, uint16_t h = 240) { + if (texts.length() == 0) return; + + // Auto-format standard messages to console style if not already tagged + if (!texts.startsWith("[")) { + if (texts.indexOf("OK") != -1 || texts.indexOf("Success") != -1) { + texts = "[ OK ] " + texts; + } else if (texts.indexOf("error") != -1 || texts.indexOf("failed") != -1 || texts.indexOf("not found") != -1) { + texts = "[FAILED] " + texts; + } else if (texts.indexOf("Scanning") != -1 || texts.indexOf("Iniciando") != -1 || texts.indexOf("Conectando") != -1 || texts.indexOf("Insert") != -1) { + texts = "[ INFO ] " + texts; } else { - line[i] = texts; + texts = " " + texts; } - tft.drawString(line[i], x, i * 20 + y, 2); - } //for - bt_message = ""; //reset bt message + } + + if (terminalLineCount < MAX_TERMINAL_LINES) { + line[terminalLineCount] = texts; + drawTerminalEntry(terminalLineCount, texts); + terminalLineCount++; + } else { + // Reached screen bottom: scroll up by 1 line + tft.fillScreen(TFT_BLACK); + for (uint8_t i = 0; i < MAX_TERMINAL_LINES - 1; i++) { + line[i] = line[i + 1]; + drawTerminalEntry(i, line[i]); + } + line[MAX_TERMINAL_LINES - 1] = texts; + drawTerminalEntry(MAX_TERMINAL_LINES - 1, texts); + } + bt_message = ""; } /*------------------*/ @@ -185,10 +347,10 @@ void checkGenuine() { //check if genuine obd2 gauge - m Serial.println(F("Not genuine Va&Cob Gauge!")); while (true) { //beep ledcWriteTone(buzzerChannel, 2000); - digitalWrite(LED_RED_PIN, LOW); //red on + setRearLedColor(255, 0, 0); //red on delay(500); ledcWriteTone(buzzerChannel, 0); - digitalWrite(LED_RED_PIN, HIGH); //red off + setRearLedOff(); //red off delay(500); } } else { @@ -198,12 +360,80 @@ void checkGenuine() { //check if genuine obd2 gauge - m } //---------------------------------------------- +// Send AT command or PID and wait synchronously for '>' prompt character +String sendATCommand(const String &cmd, uint32_t timeoutMs = 2000) { + while (BTSerial.available() > 0) BTSerial.read(); // flush RX buffer + BTSerial.print(cmd + "\r"); + String resp = ""; + uint32_t start = millis(); + while (millis() - start < timeoutMs) { + if (BTSerial.available() > 0) { + char c = (char)BTSerial.read(); + if (c == '>') { + break; // Prompt character received, command finished + } + resp += c; + } else { + delay(5); + } + } + resp.trim(); +#ifdef SERIAL_DEBUG + Serial.printf("ELM CMD [%s] -> [%s]\n", cmd.c_str(), resp.c_str()); +#endif + return resp; +} + //---- Include Header File -------------------- //#include "image.h" #include "bluetooth.h" #include "meter.h" #include "config.h" +// Robust ELM327 and ECU connection routine +void initializeELM327() { + Terminal("[ INFO ] Iniciando comunicacion ELM327..."); + + // 1. Reset ELM327 (No ATBRD23! ATBRD breaks Bluetooth serial) + String rZ = sendATCommand("ATZ", 2500); + delay(300); // Allow ELM327 power and crystal stabilization + if (rZ.length() > 0) { + Terminal("[ OK ] Dispositivo: " + rZ); + } + + // 2. Base Configuration: Echo OFF, Linefeeds OFF, Headers OFF, Standard Adaptive Timing + sendATCommand("ATE0", 1000); // Echo OFF + sendATCommand("ATL0", 1000); // Linefeeds OFF + sendATCommand("ATH0", 1000); // Headers OFF + sendATCommand("ATAT1", 1000); // Adaptive timing normal (avoids timeouts on slower Ford ECUs) + + // 3. Test Battery Voltage via ATRV (direct from OBD pin 16) + String rVolt = sendATCommand("ATRV", 1500); + if (rVolt.length() > 0) { + Terminal("[ OK ] Bateria: " + rVolt); + } + + // 4. Conectar directamente al protocolo del auto (Ford J1850 PWM - Protocolo 1) + Terminal("[ INFO ] Conectando Ford J1850 PWM (SCP)..."); + sendATCommand("ATSP1", 1000); // Forzar protocolo 1 directamente (evita busqueda lenta) + String r0100 = sendATCommand("0100", 5000); + + if (r0100.indexOf("41 00") != -1) { + Terminal("[ OK ] ECU OK: Ford J1850 PWM!"); + ignitionOn = true; + delay(600); + } else { + Terminal("[ INFO ] Sin contacto (Poner en marcha)"); + ignitionOn = false; + delay(1000); + } + + initScreen(); + beepbeep(); + bt_message = ""; + prompt = true; +} + //----SET UP ----------------------------------- void setup() { //pin configuration @@ -211,12 +441,14 @@ void setup() { pinMode(LDR_PIN, ANALOG); //ldr analog input read brightness pinMode(BUZZER_PIN, OUTPUT); //speaker pinMode(SELECTOR_PIN, INPUT_PULLUP); //button - pinMode(LED_RED_PIN, OUTPUT); //red - pinMode(LED_GREEN_PIN, OUTPUT); //green - pinMode(LED_BLUE_PIN, OUTPUT); //blue - digitalWrite(LED_RED_PIN, LOW); //on - digitalWrite(LED_GREEN_PIN, HIGH); //off - digitalWrite(LED_BLUE_PIN, HIGH); //off + // Rear RGB LED PWM setup (Channels 4, 5, 6 - Timers 2 & 3) + ledcSetup(LED_RED_CH, 5000, 8); + ledcSetup(LED_GREEN_CH, 5000, 8); + ledcSetup(LED_BLUE_CH, 5000, 8); + ledcAttachPin(LED_RED_PIN, LED_RED_CH); + ledcAttachPin(LED_GREEN_PIN, LED_GREEN_CH); + ledcAttachPin(LED_BLUE_PIN, LED_BLUE_CH); + setRearLedOff(); //pwm setup ledcSetup(buzzerChannel, 1500, 10); //buzzer 10 bit ledcSetup(backlightChannel, 12000, 8); //backlight 8 bit @@ -259,16 +491,22 @@ void setup() { //backlight ledcAttachPin must be set after tft.init() ledcAttachPin(TFT_BL, backlightChannel); //attach backlight - for (uint8_t i = 255; i > 0; i--) { //fading effect - ledcWrite(backlightChannel, i); //full bright - delay(5); - } - digitalWrite(LED_RED_PIN, HIGH); //red off - tft.fillScreen(TFT_BLACK); //show start page - tft.fillRectVGradient(0, 0, 320, 26, 0x2104, TFT_BLACK); - tft.setTextColor(TFT_WHITE); - tft.drawString("OBDII GAUGE", 10, 5, 2); ledcWrite(backlightChannel, 255); //full bright + tft.fillScreen(TFT_BLACK); // Consola de arranque de sistema + + terminalLineCount = 0; + Terminal("[ 0.000000] ESP32-D0WD Xtensa LX6 Dual-Core @ 240MHz"); + delay(40); + Terminal("[ 0.012400] FreeRTOS Kernel v10.4.3 (ESP-IDF v4.4)"); + delay(40); + Terminal("[ 0.025800] Flash: 4MB QIO @ 80MHz | huge_app"); + delay(40); + Terminal("[ 0.041200] SRAM: 520KB | Core 0/1 Online"); + delay(40); + Terminal("[ OK ] Display: ILI9341 320x240 LCD Initialized"); + delay(40); + Terminal("[ OK ] Input: XPT2046 Resistive Touch Calibrated"); + delay(40); // checkGenuine();//check guniune //init variable @@ -285,26 +523,49 @@ recent_client_addr : {0x00,0x00,0x00,0x00,0x00,0x00} array of bytes[6] pref.putUShort("layout", 0); for (uint8_t i = 0; i < maxpidIndex; i++) { //read warning value from pid name if not found load from default warningValue[i] = pref.getString(pidConfig[i][0].c_str(), pidConfig[i][8]); + if (i == 0 && (warningValue[0] == "106" || warningValue[0] == "0" || warningValue[0] == "")) { + warningValue[0] = "110"; + pref.putString(pidConfig[0][0].c_str(), "110"); + } String almKey = "alm_" + String(i); - alarmEnabled[i] = pref.getBool(almKey.c_str(), true); + alarmEnabled[i] = pref.getBool(almKey.c_str(), (i < 4)); } buzzerVolumeLevel = pref.getUChar("b_vol", 3); if (buzzerVolumeLevel > 5) buzzerVolumeLevel = 3; + beepSoundType = pref.getUChar("b_type", 0); + if (beepSoundType > 5) beepSoundType = 0; alarmVolumeLevel = pref.getUChar("alm_vol", 3); if (alarmVolumeLevel > 5) alarmVolumeLevel = 3; alarmSoundType = pref.getUChar("alm_type", 0); - if (alarmSoundType > 3) alarmSoundType = 0; + if (alarmSoundType > 5) alarmSoundType = 0; + autoSleepIndex = pref.getUChar("auto_sleep", 2); + if (autoSleepIndex > 4) autoSleepIndex = 2; + brightnessIndex = pref.getUChar("b_bright", 0); + if (brightnessIndex > 5) brightnessIndex = 0; + themeIndex = pref.getUChar("theme_idx", 0); + if (themeIndex > 5) themeIndex = 0; + if (brightnessIndex > 0) { + targetBacklight = BRIGHTNESS_PWM_TABLE[brightnessIndex]; + currentBacklight = (float)targetBacklight; + ledcWrite(backlightChannel, targetBacklight); + } + lastActivityTime = millis(); pref.getBytes("recent_client", recent_client_addr, pref.getBytesLength("recent_client")); //read last bt address + updateRearLedTheme(); // Sync rear RGB LED with loaded theme + Terminal("[ OK ] Settings: Theme " + String(GAUGE_THEMES[themeIndex].name) + " (LED RGB)"); + delay(40); + //start bluetooth + Terminal("[ INFO ] Initializing Bluetooth Controller..."); if (!BTSerial.begin("Va&Cob OBDII Gauge", true)) { Serial.println(F("Bluetooth..error!")); - Terminal("Bluetooth..error!", 0, 48, 320, 191); + Terminal("[FAILED] Bluetooth controller initialization error!"); abort(); } else { Serial.println(F("Bluetooth..OK")); - Terminal("Bluetooth..OK", 0, 48, 320, 191); + Terminal("[ OK ] Bluetooth SPP Master stack online"); } #ifdef SKIP_CONNECTION @@ -321,38 +582,13 @@ recent_client_addr : {0x00,0x00,0x00,0x00,0x00,0x00} array of bytes[6] delay(50); if (digitalRead(SELECTOR_PIN) == LOW) { configMenu(); + waitForTouchRelease(); } } } //Initialize ELM327 - Terminal("Initializing...", 0, 48, 320, 191); - bt_message = ""; - for (uint8_t initIndex = 0; initIndex < elm327InitCount; initIndex++) { //send init ELM327 AT command - BTSerial.print(elm327Init[initIndex] + "\r"); - if (initIndex == elm327InitCount - 1) delay(2000); //wait for 0100 Searching..protocal - else delay(100); //must add delay , unless will skip BTSerial.avaialble>0 - while (BTSerial.available() > 0) { - char incomingChar = BTSerial.read(); - if (incomingChar == '>') { //check prompt - BTSerial.flush(); //clear buffer -#ifdef SERIAL_DEBUG - Serial.println(bt_message); -#endif -#ifdef TERMINAL - Terminal(bt_message, 0, 48, 320, 191); -#endif - if (initIndex == 1) BTSerial.print("\r"); //ATBRD23 response - bt_message = ""; - } else { - bt_message.concat(incomingChar); //keep elm327 respond - } - } //while - } //for - - initScreen(); - beepbeep(); - prompt = true; + initializeELM327(); //---------------------- } //setup @@ -361,103 +597,156 @@ void loop() { updateBacklightFade(); // non-blocking smooth backlight fade handler handleArcAlarmFlash(); // non-blocking arc alarm flash handler (blinks when in TFT_RED) + if (wokeFromSleep) { + wokeFromSleep = false; + lastActivityTime = millis(); + resumeBluetoothConnection(); + } + // SCAN TOUCHSCREEN & BUTTON - // - Single click on a quadrant: toggles between clock (arc) and number - // - Double click on a quadrant: puts that instrument in full screen (or exits full screen) + // - Single tap on a quadrant in 4-quadrant view: switches to full screen for that quadrant + // - Single tap anywhere in full screen view: returns to 4-quadrant view // - Long press (> 1s) on screen OR holding selector button: opens configuration menu uint16_t touchX = 0, touchY = 0; bool isTouched = getTouch(&touchX, &touchY); bool btnPressed = (digitalRead(SELECTOR_PIN) == LOW); + if (isTouched || btnPressed) { + lastActivityTime = millis(); + } + static bool isTouching = false; static uint32_t touchStartTime = 0; static uint16_t lastTouchX = 0, lastTouchY = 0; - static uint8_t clickCount = 0; - static uint32_t firstClickTime = 0; - static int8_t clickQuadrant = -1; static bool longPressHandled = false; - if (isTouched) { + if (btnPressed) { + delay(50); + if (digitalRead(SELECTOR_PIN) == LOW) { + touchBeep(); + configMenu(); + waitForTouchRelease(); + lastActivityTime = millis(); + initScreen(); + } + } else if (isTouched) { if (!isTouching) { isTouching = true; touchStartTime = millis(); lastTouchX = touchX; lastTouchY = touchY; longPressHandled = false; - casioBeep(4096, 25); // Crisp, bright Casio chirp on touch screen press! - } else if (!longPressHandled && (millis() - touchStartTime > 1000)) { - // Long press (> 1s): Open Config Menu! - longPressHandled = true; - clickCount = 0; - casioBeep(4096, 30); // High confirmation chirp - configMenu(); - if (foundOBD2) initScreen(); - isTouching = false; + touchBeep(); // Crisp acoustic feedback on touch screen press! + } else { + // Keep tracking coordinates while held to ensure stable quadrant detection + lastTouchX = touchX; + lastTouchY = touchY; + + if (!longPressHandled && (millis() - touchStartTime > 1000)) { + // Long press (> 1s): Open Config Menu immediately! + longPressHandled = true; + touchBeep(); // Confirmation chirp + configMenu(); + waitForTouchRelease(); + lastActivityTime = millis(); + initScreen(); + isTouching = false; + } } } else { // Touch / button released if (isTouching) { isTouching = false; - if (!longPressHandled && (millis() - touchStartTime >= 30)) { - // Valid tap detected! Determine quadrant - int quad = (lastTouchX < 160) ? ((lastTouchY < 120) ? 0 : 2) : ((lastTouchY < 120) ? 1 : 3); - - if (clickCount == 0) { - clickCount = 1; - firstClickTime = millis(); - clickQuadrant = quad; - } else if (clickCount == 1) { - if ((millis() - firstClickTime < 400) && (quad == clickQuadrant || fullScreenCell != -1)) { - // DOUBLE CLICK DETECTED! - clickCount = 0; - - if (fullScreenCell == -1) { - fullScreenCell = quad; - } else { - fullScreenCell = -1; - } - initScreen(); - } else { - clickCount = 1; - firstClickTime = millis(); - clickQuadrant = quad; - } + if (!longPressHandled) { + // Valid tap detected! + if (fullScreenCell == -1) { + // Switch to full screen for tapped quadrant + int quad = (lastTouchX < 160) ? ((lastTouchY < 120) ? 0 : 2) : ((lastTouchY < 120) ? 1 : 3); + fullScreenCell = quad; + } else { + // Return to 4 quadrants view + fullScreenCell = -1; } + initScreen(); + waitForTouchRelease(); // Clear mechanical bounce on release } } } - // Handle single click timeout (after 400ms without a second tap) - if (clickCount == 1 && (millis() - firstClickTime >= 400)) { - clickCount = 0; + // AUTO-SLEEP BY INACTIVITY + // If auto-sleep is enabled, and screen is not being held, and engine is stopped (RPM <= 300) + if (autoSleepIndex > 0 && !isTouching && !btnPressed && !longPressHandled && currentRpm <= 300.0f) { + uint32_t timeoutMs = (uint32_t)AUTO_SLEEP_SEC_TABLE[autoSleepIndex] * 1000UL; + if (millis() - lastActivityTime >= timeoutMs) { + enterLightSleep(); + wokeFromSleep = false; // handled directly here + lastActivityTime = millis(); + resumeBluetoothConnection(); + } + } - if (fullScreenCell != -1) { - // In full screen: single click toggles between arc and number mode without header flicker - cellIsNumeric[fullScreenCell] = !cellIsNumeric[fullScreenCell]; - fullScreenMeter(fullScreenCell, pidInCell[fullScreenCell], false); - } else if (clickQuadrant >= 0 && clickQuadrant < 4) { - // In 4 quadrants: single click toggles between arc and number for this quadrant without header flicker - cellIsNumeric[clickQuadrant] = !cellIsNumeric[clickQuadrant]; - uint8_t pid = pidInCell[clickQuadrant]; - if (cellIsNumeric[clickQuadrant]) { - numericMeter4(clickQuadrant, pid, false); +#ifndef SKIP_CONNECTION + // Check Bluetooth connection state: if adapter disconnected or lost power, show "---" (no data) + if (!BTSerial.connected() || !foundOBD2) { + static uint32_t lastBtReconnect = 0; + currentRpm = 0.0f; + ignitionOn = false; + for (uint8_t c = 0; c < 4; c++) { + plotNoData(c); + } + if (millis() - lastBtReconnect > 3000) { + lastBtReconnect = millis(); +#ifdef SERIAL_DEBUG + Serial.println(F("BT desconectado. Reintentando reconexion...")); +#endif + setRearLedColor(0, 0, 200); + BTSerial.disconnect(); + if (BTSerial.connect(recent_client_addr, 0, sec_mask, role)) { + uint8_t tries = 0; + while (!BTSerial.connected(500) && tries < 4) { + tries++; + } + if (BTSerial.connected()) { + sendATCommand("ATE0", 800); + sendATCommand("ATL0", 800); + sendATCommand("ATH0", 800); + sendATCommand("ATAT1", 800); + sendATCommand("ATSP1", 800); + String r0100 = sendATCommand("0100", 2500); + ignitionOn = (r0100.indexOf("41 00") != -1); + foundOBD2 = true; + prompt = true; + bt_message = ""; + updateRearLedTheme(); + initScreen(); + touchBeep(); + lastActivityTime = millis(); + } else { + BTSerial.disconnect(); + setRearLedOff(); + foundOBD2 = false; + } } else { - arcMeter4(clickQuadrant, pid, false); + setRearLedOff(); + foundOBD2 = false; } } + return; } - //---------------------- - //BLUETOOTH read +#endif + + //---------------------- + //BLUETOOTH read static uint32_t lastPidSendTime = 0; - // Watchdog: If waiting for prompt for more than 6000ms (standard OBD2 maximum ECU timeout), recover! - if (!prompt && (millis() - lastPidSendTime > 6000)) { + // Watchdog: If waiting for prompt for more than 5000ms, recover safely without touching screen + if (!prompt && (millis() - lastPidSendTime > 5000)) { #ifdef SERIAL_DEBUG Serial.printf("PID timeout for %s, recovering...\n", pidList[pidIndex].c_str()); #endif BTSerial.flush(); bt_message = ""; prompt = true; - skip = true; + skip = true; // IMPORTANT: skip updateMeter so timeout never puts zeros on screen! } while (BTSerial.available() > 0) { @@ -500,25 +789,57 @@ void loop() { //Send another PID to elm327 if (prompt) { //> ELM327 ready! -> request next PID - prompt = false; //no prompt from ELM327 - if (!skip) { + if (!skip && bt_message.length() > 0) { updateMeter(pidIndex, bt_message); //update meter screen } - pidIndex++; //point to next pid - if (pidIndex >= maxpidIndex) { - pidIndex = 0; //back to pid 0 - autoDim(); //auto backlight handle + bt_message = ""; + + if (!ignitionOn) { + // Contacto cerrado / Standby: + // No bombardear el bus OBD de la ECU continuamente (evita que parpadee la luz verde del scanner y drena bateria). + // Solo enviar una sonda suave de RPM cada 1500ms para detectar cuando se vuelve a poner en contacto. + static uint32_t lastIgnitionProbeTime = 0; + static uint32_t lastDimCheck = 0; + if (millis() - lastDimCheck >= 500) { + lastDimCheck = millis(); + autoDim(); + } + + if (millis() - lastIgnitionProbeTime >= 1500) { + lastIgnitionProbeTime = millis(); + prompt = false; + skip = false; + // Buscar el indice de RPM en pidList (dentro de los 4 cuadrantes) + uint8_t rpmPidNo = 2; // Default cell 2 = RPM + for (uint8_t i = 0; i < 4; i++) { + if (pidConfig[pidInCell[i]][3].toInt() == 3) { + rpmPidNo = i; + break; + } + } + pidIndex = rpmPidNo; + BTSerial.print(pidList[pidIndex] + "\r"); + lastPidSendTime = millis(); + } + } else { + // Operacion normal: ciclo continuo y veloz de PIDs + prompt = false; //no prompt from ELM327 + pidIndex++; //point to next pid + if (pidIndex >= maxpidIndex) { + pidIndex = 0; //back to pid 0 + autoDim(); //auto backlight handle + } + if (pidCurrentSkip[pidIndex] <= 0) { //end of skip loop , go next index + pidCurrentSkip[pidIndex] = pidReadSkip[pidIndex]; //read max delay loop to current + skip = false; + BTSerial.print(pidList[pidIndex] + "\r"); //send PID request + lastPidSendTime = millis(); + } else { //skip sending request + pidCurrentSkip[pidIndex] = pidCurrentSkip[pidIndex] - 1; //decrese loop count + prompt = true; + skip = true; + } //else } - if (pidCurrentSkip[pidIndex] <= 0) { //end of skip loop , go next index - pidCurrentSkip[pidIndex] = pidReadSkip[pidIndex]; //read max delay loop to current - skip = false; - BTSerial.print(pidList[pidIndex] + "\r"); //send PID request - lastPidSendTime = millis(); - } else { //skip sending request - pidCurrentSkip[pidIndex] = pidCurrentSkip[pidIndex] - 1; //decrese loop count - prompt = true; - skip = true; - } //else } //if prompt diff --git a/sketch/obd2_gauge/touchscreen.h b/sketch/obd2_gauge/touchscreen.h index 9695b6d..5615fa1 100644 --- a/sketch/obd2_gauge/touchscreen.h +++ b/sketch/obd2_gauge/touchscreen.h @@ -16,12 +16,6 @@ extern XPT2046_TouchscreenSOFTSPI ts; #define _height 240 #define _width 320 -// Direct touch check using pressure Z -inline bool isScreenPressed() { - if (!tsSoftSpi) return false; - return ts.touched(tsSoftSpi); -} - // Get mapped touchscreen coordinates in landscape (320x240) bool getTouch(uint16_t *x, uint16_t *y) { if (!tsSoftSpi) return false; @@ -29,8 +23,8 @@ bool getTouch(uint16_t *x, uint16_t *y) { if (ts.touched(tsSoftSpi)) { TS_Point p = ts.getPoint(tsSoftSpi); - // Filter noise: require solid touch pressure and coordinates within active screen - if (p.z < 600) return false; + // Filter noise: require valid touch pressure and coordinates within active screen + if (p.z < 350) return false; if (p.x < 150 || p.x > 3850 || p.y < 150 || p.y > 3850) return false; int16_t tx = map(p.x, 200, 3700, 0, 320); @@ -43,6 +37,27 @@ bool getTouch(uint16_t *x, uint16_t *y) { return false; } +// Direct touch check using pressure Z +inline bool isScreenPressed() { + if (!tsSoftSpi) return false; + return ts.touched(tsSoftSpi); +} + +// Wait until both touchscreen and selector button are completely released with 50ms continuous debounce +inline void waitForTouchRelease() { + uint16_t dummyX, dummyY; + uint8_t releaseCount = 0; + while (releaseCount < 5) { + if ((tsSoftSpi && ts.touched(tsSoftSpi)) || getTouch(&dummyX, &dummyY) || (digitalRead(SELECTOR_PIN) == LOW)) { + releaseCount = 0; + } else { + releaseCount++; + } + delay(10); + yield(); + } +} + void touch_calibrate() { // Calibration placeholder for backward compatibility } \ No newline at end of file