diff --git a/.github/workflows/test_native.yml b/.github/workflows/test_native.yml index 536d93665f..c3643dcbd3 100644 --- a/.github/workflows/test_native.yml +++ b/.github/workflows/test_native.yml @@ -143,7 +143,7 @@ jobs: merge-multiple: true - name: Test Report - uses: dorny/test-reporter@v2.1.0 + uses: dorny/test-reporter@v2.0.0 with: name: PlatformIO Tests path: testreport.xml diff --git a/.trunk/trunk.yaml b/.trunk/trunk.yaml index bcb75d5505..ca38c978a0 100644 --- a/.trunk/trunk.yaml +++ b/.trunk/trunk.yaml @@ -10,14 +10,15 @@ lint: enabled: - renovate@40.0.6 - prettier@3.5.3 - - trufflehog@3.88.32 + - trufflehog@3.88.28 - yamllint@1.37.1 - bandit@1.8.3 + - terrascan@1.19.9 - trivy@0.62.1 - taplo@0.9.3 - - ruff@0.11.10 + - ruff@0.11.8 - isort@6.0.1 - - markdownlint@0.45.0 + - markdownlint@0.44.0 - oxipng@9.1.5 - svgo@3.3.2 - actionlint@1.7.7 @@ -27,7 +28,7 @@ lint: - shellcheck@0.10.0 - black@25.1.0 - git-diff-check - - gitleaks@8.26.0 + - gitleaks@8.25.1 - clang-format@16.0.3 ignore: - linters: [ALL] diff --git a/Dockerfile b/Dockerfile index e033b1bba1..6c1b83653c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,3 +1,4 @@ +# trunk-ignore-all(terrascan/AC_DOCKER_0002): Known terrascan issue # trunk-ignore-all(trivy/DS002): We must run as root for this container # trunk-ignore-all(hadolint/DL3002): We must run as root for this container # trunk-ignore-all(hadolint/DL3008): Do not pin apt package versions @@ -37,13 +38,6 @@ RUN curl -L "https://github.com/meshtastic/web/releases/download/v$(cat /tmp/fir ##### PRODUCTION BUILD ############# FROM debian:bookworm-slim -LABEL org.opencontainers.image.title="Meshtastic" \ - org.opencontainers.image.description="Debian Meshtastic daemon and web interface" \ - org.opencontainers.image.url="https://meshtastic.org" \ - org.opencontainers.image.documentation="https://meshtastic.org/docs/" \ - org.opencontainers.image.authors="Meshtastic" \ - org.opencontainers.image.licenses="GPL-3.0-or-later" \ - org.opencontainers.image.source="https://github.com/meshtastic/firmware/" ENV DEBIAN_FRONTEND=noninteractive ENV TZ=Etc/UTC @@ -60,7 +54,7 @@ RUN apt-get update && apt-get --no-install-recommends -y install \ && mkdir -p /etc/meshtasticd/ssl # Fetch compiled binary from the builder -COPY --from=builder /tmp/firmware/release/meshtasticd /usr/bin/ +COPY --from=builder /tmp/firmware/release/meshtasticd /usr/sbin/ COPY --from=builder /tmp/web /usr/share/meshtasticd/ # Copy config templates COPY ./bin/config.d /etc/meshtasticd/available.d @@ -71,8 +65,8 @@ VOLUME /var/lib/meshtasticd # Expose Meshtastic TCP API port from the host EXPOSE 4403 # Expose Meshtastic Web UI port from the host -EXPOSE 9443 +EXPOSE 443 -CMD [ "sh", "-cx", "meshtasticd --fsdir=/var/lib/meshtasticd" ] +CMD [ "sh", "-cx", "meshtasticd -d /var/lib/meshtasticd" ] HEALTHCHECK NONE diff --git a/alpine.Dockerfile b/alpine.Dockerfile index bf7cad6d4d..3501290403 100644 --- a/alpine.Dockerfile +++ b/alpine.Dockerfile @@ -28,19 +28,12 @@ RUN bash ./bin/build-native.sh "$PIO_ENV" && \ # ##### PRODUCTION BUILD ############# FROM alpine:3.21 -LABEL org.opencontainers.image.title="Meshtastic" \ - org.opencontainers.image.description="Alpine Meshtastic daemon" \ - org.opencontainers.image.url="https://meshtastic.org" \ - org.opencontainers.image.documentation="https://meshtastic.org/docs/" \ - org.opencontainers.image.authors="Meshtastic" \ - org.opencontainers.image.licenses="GPL-3.0-or-later" \ - org.opencontainers.image.source="https://github.com/meshtastic/firmware/" # nosemgrep: dockerfile.security.last-user-is-root.last-user-is-root USER root RUN apk --no-cache add \ - shadow libstdc++ libgpiod yaml-cpp libusb i2c-tools libuv \ + libstdc++ libgpiod yaml-cpp libusb i2c-tools libuv \ libx11 libinput libxkbcommon \ && rm -rf /var/cache/apk/* \ && mkdir -p /var/lib/meshtasticd \ @@ -48,7 +41,7 @@ RUN apk --no-cache add \ && mkdir -p /etc/meshtasticd/ssl # Fetch compiled binary from the builder -COPY --from=builder /tmp/firmware/release/meshtasticd /usr/bin/ +COPY --from=builder /tmp/firmware/release/meshtasticd /usr/sbin/ # Copy config templates COPY ./bin/config.d /etc/meshtasticd/available.d diff --git a/bin/99-meshtasticd-udev.rules b/bin/99-meshtasticd-udev.rules deleted file mode 100644 index 69a468d7aa..0000000000 --- a/bin/99-meshtasticd-udev.rules +++ /dev/null @@ -1,4 +0,0 @@ -# Set spidev ownership to 'spi' group. -SUBSYSTEM=="spidev", KERNEL=="spidev*", GROUP="spi", MODE="0660" -# Allow access to USB CH341 devices -SUBSYSTEM=="usb", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="5512", MODE="0666" diff --git a/bin/config-dist.yaml b/bin/config-dist.yaml index 55e8648d9e..9238d0e56b 100644 --- a/bin/config-dist.yaml +++ b/bin/config-dist.yaml @@ -188,18 +188,11 @@ Logging: # AsciiLogs: true # default if not specified is !isatty() on stdout Webserver: -# Port: 9443 # Port for Webserver & Webservices +# Port: 443 # Port for Webserver & Webservices # RootPath: /usr/share/meshtasticd/web # Root Dir of WebServer # SSLKey: /etc/meshtasticd/ssl/private_key.pem # Path to SSL Key, generated if not present # SSLCert: /etc/meshtasticd/ssl/certificate.pem # Path to SSL Certificate, generated if not present - -HostMetrics: -# ReportInterval: 30 # Interval in minutes between HostMetrics report packets, or 0 for disabled -# Channel: 0 # channel to send Host Metrics over. Defaults to the primary channel. -# UserStringCommand: cat /sys/firmware/devicetree/base/serial-number # Command to execute, to send the results as the userString - - General: MaxNodes: 200 MaxMessageQueue: 100 diff --git a/bin/device-install.sh b/bin/device-install.sh index 7fa5ffdbbd..a43ccbdb40 100755 --- a/bin/device-install.sh +++ b/bin/device-install.sh @@ -43,16 +43,6 @@ S3_VARIANTS=( "wireless-tracker" "station-g2" "unphone" - "t-eth-elite" - "mesh-tab" - "dreamcatcher" - "ESP32-S3-Pico" - "seeed-sensecap-indicator" - "heltec_capsule_sensor_v3" - "vision-master" - "icarus" - "tracksenger" - "elecrow-adv" ) # Determine the correct esptool command to use diff --git a/bin/meshtasticd.service b/bin/meshtasticd.service index 63430bae89..1e8ee98b8a 100644 --- a/bin/meshtasticd.service +++ b/bin/meshtasticd.service @@ -5,11 +5,10 @@ StartLimitInterval=200 StartLimitBurst=5 [Service] -AmbientCapabilities=CAP_NET_BIND_SERVICE -User=meshtasticd -Group=meshtasticd +User=root +Group=root Type=simple -ExecStart=/usr/bin/meshtasticd +ExecStart=/usr/sbin/meshtasticd Restart=always RestartSec=3 diff --git a/bin/native-install.sh b/bin/native-install.sh index 18cd9205b9..a8fcc29a6a 100755 --- a/bin/native-install.sh +++ b/bin/native-install.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -cp "release/meshtasticd_linux_$(uname -m)" /usr/bin/meshtasticd +cp "release/meshtasticd_linux_$(uname -m)" /usr/sbin/meshtasticd mkdir -p /etc/meshtasticd if [[ -f "/etc/meshtasticd/config.yaml" ]]; then cp bin/config-dist.yaml /etc/meshtasticd/config-upgrade.yaml diff --git a/bin/org.meshtastic.meshtasticd.metainfo.xml b/bin/org.meshtastic.meshtasticd.metainfo.xml index 1a7ad284dd..b98b54dd43 100644 --- a/bin/org.meshtastic.meshtasticd.metainfo.xml +++ b/bin/org.meshtastic.meshtasticd.metainfo.xml @@ -87,9 +87,6 @@ - - https://github.com/meshtastic/firmware/releases?q=tag%3Av2.6.9 - https://github.com/meshtastic/firmware/releases?q=tag%3Av2.6.8 diff --git a/boards/seeed_solar_node.json b/boards/Seeed_Solar_Node.json similarity index 94% rename from boards/seeed_solar_node.json rename to boards/Seeed_Solar_Node.json index e77fbd0772..e1b502cfae 100644 --- a/boards/seeed_solar_node.json +++ b/boards/Seeed_Solar_Node.json @@ -10,7 +10,7 @@ "hwids": [["0x2886", "0x0059"]], "usb_product": "XIAO-BOOT", "mcu": "nrf52840", - "variant": "seeed_solar_node", + "variant": "Seeed_Solar_Node", "bsp": { "name": "adafruit" }, @@ -31,7 +31,7 @@ "openocd_target": "nrf52840-mdk-rs" }, "frameworks": ["arduino"], - "name": "seeed_solar_node", + "name": "Seeed_Solar_Node", "upload": { "maximum_ram_size": 248832, "maximum_size": 815104, diff --git a/boards/gat562_mesh_trial_tracker.json b/boards/gat562_mesh_trial_tracker.json new file mode 100644 index 0000000000..a3fb8a2647 --- /dev/null +++ b/boards/gat562_mesh_trial_tracker.json @@ -0,0 +1,52 @@ +{ + "build": { + "arduino": { + "ldscript": "nrf52840_s140_v6.ld" + }, + "core": "nRF5", + "cpu": "cortex-m4", + "extra_flags": "-DARDUINO_NRF52840_FEATHER -DNRF52840_XXAA", + "f_cpu": "64000000L", + "hwids": [ + ["0x239A", "0x8029"], + ["0x239A", "0x0029"], + ["0x239A", "0x002A"], + ["0x239A", "0x802A"] + ], + "usb_product": "GAT562 Mesh Trial Tracker", + "mcu": "nrf52840", + "variant": "gat562_mesh_trial_tracker", + "bsp": { + "name": "adafruit" + }, + "softdevice": { + "sd_flags": "-DS140", + "sd_name": "s140", + "sd_version": "6.1.1", + "sd_fwid": "0x00B6" + }, + "bootloader": { + "settings_addr": "0xFF000" + } + }, + "connectivity": ["bluetooth"], + "debug": { + "jlink_device": "nRF52840_xxAA", + "svd_path": "nrf52840.svd", + "openocd_target": "nrf52840-mdk-rs" + }, + "frameworks": ["arduino", "freertos"], + "name": "GAT562 Mesh Trial Tracker", + "upload": { + "maximum_ram_size": 248832, + "maximum_size": 815104, + "speed": 115200, + "protocol": "nrfutil", + "protocols": ["jlink", "nrfjprog", "nrfutil", "stlink"], + "use_1200bps_touch": true, + "require_upload_port": true, + "wait_for_upload_port": true + }, + "url": "http://www.gat-iot.com/", + "vendor": "GAT-IOT" +} diff --git a/debian/changelog b/debian/changelog index ae27bc3e97..8fce06c14a 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,4 +1,4 @@ -meshtasticd (2.6.9.0) UNRELEASED; urgency=medium +meshtasticd (2.6.8.0) UNRELEASED; urgency=medium [ Austin Lane ] * Initial packaging @@ -10,7 +10,4 @@ meshtasticd (2.6.9.0) UNRELEASED; urgency=medium [ ] * GitHub Actions Automatic version bump - [ ] - * GitHub Actions Automatic version bump - - -- Thu, 15 May 2025 11:13:30 +0000 + -- Tue, 06 May 2025 01:32:49 +0000 diff --git a/debian/control b/debian/control index 761383a5cc..9277f6f543 100644 --- a/debian/control +++ b/debian/control @@ -31,9 +31,7 @@ Rules-Requires-Root: no Package: meshtasticd Architecture: any -Depends: adduser, - ${misc:Depends}, - ${shlibs:Depends} +Depends: ${misc:Depends}, ${shlibs:Depends} Description: Meshtastic daemon for communicating with Meshtastic devices Meshtastic is an off-grid text communication platform that uses inexpensive - LoRa radios. + LoRa radios. \ No newline at end of file diff --git a/debian/meshtasticd.dirs b/debian/meshtasticd.dirs index a667768b27..45a1ca3db5 100644 --- a/debian/meshtasticd.dirs +++ b/debian/meshtasticd.dirs @@ -1,6 +1,5 @@ -var/lib/meshtasticd etc/meshtasticd etc/meshtasticd/config.d etc/meshtasticd/available.d usr/share/meshtasticd/web -etc/meshtasticd/ssl +etc/meshtasticd/ssl \ No newline at end of file diff --git a/debian/meshtasticd.install b/debian/meshtasticd.install index 3c68b42b15..6b6b5a361e 100644 --- a/debian/meshtasticd.install +++ b/debian/meshtasticd.install @@ -1,8 +1,8 @@ -.pio/build/native-tft/meshtasticd usr/bin +.pio/build/native-tft/meshtasticd usr/sbin bin/config.yaml etc/meshtasticd bin/config.d/* etc/meshtasticd/available.d bin/meshtasticd.service lib/systemd/system -web/* usr/share/meshtasticd/web +web/* usr/share/meshtasticd/web \ No newline at end of file diff --git a/debian/meshtasticd.postinst b/debian/meshtasticd.postinst deleted file mode 100755 index 324865718d..0000000000 --- a/debian/meshtasticd.postinst +++ /dev/null @@ -1,79 +0,0 @@ -#!/bin/sh -# postinst script for meshtasticd -# -# see: dh_installdeb(1) - -set -e - -# summary of how this script can be called: -# * `configure' -# * `abort-upgrade' -# * `abort-remove' `in-favour' -# -# * `abort-remove' -# * `abort-deconfigure' `in-favour' -# `removing' -# -# for details, see http://www.debian.org/doc/debian-policy/ or -# the debian-policy package - - -case "$1" in - configure|reconfigure) - # create spi group (for udev rules) - # this group already exists on Raspberry Pi OS - getent group spi >/dev/null 2>/dev/null || addgroup --system spi - # create a meshtasticd group and user - getent passwd meshtasticd >/dev/null 2>/dev/null || adduser --system --home /var/lib/meshtasticd --no-create-home meshtasticd - getent group meshtasticd >/dev/null 2>/dev/null || addgroup --system meshtasticd - adduser meshtasticd meshtasticd >/dev/null 2>/dev/null - adduser meshtasticd spi >/dev/null 2>/dev/null - # add meshtasticd user to appropriate groups (if they exist) - getent group gpio >/dev/null 2>/dev/null && adduser meshtasticd gpio >/dev/null 2>/dev/null - getent group plugdev >/dev/null 2>/dev/null && adduser meshtasticd plugdev >/dev/null 2>/dev/null - getent group dialout >/dev/null 2>/dev/null && adduser meshtasticd dialout >/dev/null 2>/dev/null - getent group i2c >/dev/null 2>/dev/null && adduser meshtasticd i2c >/dev/null 2>/dev/null - getent group video >/dev/null 2>/dev/null && adduser meshtasticd video >/dev/null 2>/dev/null - getent group audio >/dev/null 2>/dev/null && adduser meshtasticd audio >/dev/null 2>/dev/null - getent group input >/dev/null 2>/dev/null && adduser meshtasticd input >/dev/null 2>/dev/null - - - # migrate /root/.portduino to /var/lib/meshtasticd/.portduino - # should only run once, upon upgrade from < 2.6.9 - if [ -n "$2" ] && dpkg --compare-versions "$2" lt 2.6.9; then - if [ -d /root/.portduino ] && [ ! -e /var/lib/meshtasticd/.portduino ]; then - cp -r /root/.portduino /var/lib/meshtasticd/.portduino - echo "Migrated meshtasticd VFS from /root/.portduino to /var/lib/meshtasticd/.portduino" - echo "meshtasticd now runs as the 'meshtasticd' user, not 'root'." - echo "See https://github.com/meshtastic/firmware/pull/6718 for details" - fi - fi - - if [ -d /var/lib/meshtasticd ]; then - chown -R meshtasticd:meshtasticd /var/lib/meshtasticd - fi - - if [ -d /etc/meshtasticd ]; then - chown -R meshtasticd:meshtasticd /etc/meshtasticd - fi - - if [ -d /usr/share/meshtasticd ]; then - chown -R meshtasticd:meshtasticd /usr/share/meshtasticd - fi - ;; - - abort-upgrade|abort-remove|abort-deconfigure) - ;; - - *) - echo "postinst called with unknown argument \`$1'" >&2 - exit 1 - ;; -esac - -# dh_installdeb will replace this with shell code automatically -# generated by other debhelper scripts. - -#DEBHELPER# - -exit 0 diff --git a/debian/meshtasticd.postrm b/debian/meshtasticd.postrm deleted file mode 100755 index bb2c32a5bf..0000000000 --- a/debian/meshtasticd.postrm +++ /dev/null @@ -1,41 +0,0 @@ -#!/bin/sh -# postrm script for meshtasticd -# -# see: dh_installdeb(1) - -set -e - -# summary of how this script can be called: -# * `remove' -# * `purge' -# * `upgrade' -# * `failed-upgrade' -# * `abort-install' -# * `abort-install' -# * `abort-upgrade' -# * `disappear' -# -# for details, see http://www.debian.org/doc/debian-policy/ or -# the debian-policy package - - -case "$1" in - purge|remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear) - # Only remove /var/lib/meshtasticd on purge - if [ "${1}" = "purge" ] ; then - rm -rf /var/lib/meshtasticd - fi - ;; - - *) - echo "postrm called with unknown argument \`$1'" >&2 - exit 1 - ;; -esac - -# dh_installdeb will replace this with shell code automatically -# generated by other debhelper scripts. - -#DEBHELPER# - -exit 0 diff --git a/debian/meshtasticd.udev b/debian/meshtasticd.udev deleted file mode 100644 index 69a468d7aa..0000000000 --- a/debian/meshtasticd.udev +++ /dev/null @@ -1,4 +0,0 @@ -# Set spidev ownership to 'spi' group. -SUBSYSTEM=="spidev", KERNEL=="spidev*", GROUP="spi", MODE="0660" -# Allow access to USB CH341 devices -SUBSYSTEM=="usb", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="5512", MODE="0666" diff --git a/meshtasticd.spec.rpkg b/meshtasticd.spec.rpkg index eb4ab5ae71..2d777bc761 100644 --- a/meshtasticd.spec.rpkg +++ b/meshtasticd.spec.rpkg @@ -10,8 +10,6 @@ # - https://docs.pagure.org/rpkg-util/v3/index.html # - https://docs.fedoraproject.org/en-US/packaging-guidelines/Versioning/ -%global meshtasticd_user meshtasticd - Name: meshtasticd # Version Ex: 2.5.19 Version: {{{ meshtastic_version }}} @@ -49,8 +47,6 @@ BuildRequires: pkgconfig(x11) BuildRequires: pkgconfig(libinput) BuildRequires: pkgconfig(xkbcommon-x11) -Requires: systemd-udev - %description Meshtastic daemon for controlling Meshtastic devices. Meshtastic is an off-grid text communication platform that uses inexpensive LoRa radios. @@ -67,25 +63,15 @@ gzip -dr web platformio run -e native-tft %install -# Install meshtasticd binary -mkdir -p %{buildroot}%{_bindir} -install -m 0755 .pio/build/native-tft/program %{buildroot}%{_bindir}/meshtasticd - -# Install portduino VFS dir -install -p -d -m 0770 %{buildroot}%{_localstatedir}/lib/meshtasticd +mkdir -p %{buildroot}%{_sbindir} +install -m 0755 .pio/build/native-tft/program %{buildroot}%{_sbindir}/meshtasticd -# Install udev rules -mkdir -p %{buildroot}%{_udevrulesdir} -install -m 0644 bin/99-meshtasticd-udev.rules %{buildroot}%{_udevrulesdir}/99-meshtasticd-udev.rules - -# Install config dirs mkdir -p %{buildroot}%{_sysconfdir}/meshtasticd install -m 0644 bin/config-dist.yaml %{buildroot}%{_sysconfdir}/meshtasticd/config.yaml mkdir -p %{buildroot}%{_sysconfdir}/meshtasticd/config.d mkdir -p %{buildroot}%{_sysconfdir}/meshtasticd/available.d cp -r bin/config.d/* %{buildroot}%{_sysconfdir}/meshtasticd/available.d -# Install systemd service install -D -m 0644 bin/meshtasticd.service %{buildroot}%{_unitdir}/meshtasticd.service # Install the web files under /usr/share/meshtasticd/web @@ -94,54 +80,10 @@ cp -r web/* %{buildroot}%{_datadir}/meshtasticd/web # Install default SSL storage directory (for web) mkdir -p %{buildroot}%{_sysconfdir}/meshtasticd/ssl -%pre -# create spi group (for udev rules) -getent group spi > /dev/null || groupadd -r spi -# create a meshtasticd group and user -getent group %{meshtasticd_user} > /dev/null || groupadd -r %{meshtasticd_user} -getent passwd %{meshtasticd_user} > /dev/null || \ - useradd -r -d %{_localstatedir}/lib/meshtasticd -g %{meshtasticd_user} -G spi \ - -s /sbin/nologin -c "Meshtastic Daemon" %{meshtasticd_user} -# add meshtasticd user to appropriate groups (if they exist) -getent group gpio > /dev/null && usermod -a -G gpio %{meshtasticd_user} > /dev/null -getent group plugdev > /dev/null && usermod -a -G plugdev %{meshtasticd_user} > /dev/null -getent group dialout > /dev/null && usermod -a -G dialout %{meshtasticd_user} > /dev/null -getent group i2c > /dev/null && usermod -a -G i2c %{meshtasticd_user} > /dev/null -getent group video > /dev/null && usermod -a -G video %{meshtasticd_user} > /dev/null -getent group audio > /dev/null && usermod -a -G audio %{meshtasticd_user} > /dev/null -getent group input > /dev/null && usermod -a -G input %{meshtasticd_user} > /dev/null -exit 0 - -%triggerin -- meshtasticd < 2.6.9 -# migrate .portduino (if it exists and hasn’t already been copied) -if [ -d /root/.portduino ] && [ ! -e /var/lib/meshtasticd/.portduino ]; then - mkdir -p /var/lib/meshtasticd - cp -r /root/.portduino /var/lib/meshtasticd/.portduino - chown -R %{meshtasticd_user}:%{meshtasticd_user} \ - %{_localstatedir}/lib/meshtasticd || : - # Fix SELinux labels if present (no-op on non-SELinux systems) - restorecon -R /var/lib/meshtasticd/.portduino 2>/dev/null || : - echo "Migrated meshtasticd VFS from /root/.portduino to /var/lib/meshtasticd/.portduino" - echo "meshtasticd now runs as the 'meshtasticd' user, not 'root'." - echo "See https://github.com/meshtastic/firmware/pull/6718 for details" -fi - -%post -%systemd_post meshtasticd.service - -%preun -%systemd_preun meshtasticd.service - -%postun -%systemd_postun_with_restart meshtasticd.service - %files -%defattr(-,%{meshtasticd_user},%{meshtasticd_user}) %license LICENSE %doc README.md -%{_bindir}/meshtasticd -%dir %{_localstatedir}/lib/meshtasticd -%{_udevrulesdir}/99-meshtasticd-udev.rules +%{_sbindir}/meshtasticd %dir %{_sysconfdir}/meshtasticd %dir %{_sysconfdir}/meshtasticd/config.d %dir %{_sysconfdir}/meshtasticd/available.d @@ -154,4 +96,4 @@ fi %dir %{_sysconfdir}/meshtasticd/ssl %changelog -%autochangelog +%autochangelog \ No newline at end of file diff --git a/platformio.ini b/platformio.ini index c1012c8104..b78ecdc1af 100644 --- a/platformio.ini +++ b/platformio.ini @@ -108,7 +108,7 @@ lib_deps = [device-ui_base] lib_deps = # renovate: datasource=git-refs depName=meshtastic/device-ui packageName=https://github.com/meshtastic/device-ui gitBranch=master - https://github.com/meshtastic/device-ui/archive/2fba9def30b52bbfd13cc5b76f61f257428325e7.zip + https://github.com/meshtastic/device-ui/archive/7dee10ad31a0c6ea04880cba399e240be743d752.zip ; Common libs for environmental measurements in telemetry module [environmental_base] @@ -132,7 +132,7 @@ lib_deps = # renovate: datasource=custom.pio depName=Adafruit INA219 packageName=adafruit/library/Adafruit INA219 adafruit/Adafruit INA219@1.2.3 # renovate: datasource=custom.pio depName=Adafruit PM25 AQI Sensor packageName=adafruit/library/Adafruit PM25 AQI Sensor - adafruit/Adafruit PM25 AQI Sensor@2.0.0 + adafruit/Adafruit PM25 AQI Sensor@1.2.0 # renovate: datasource=custom.pio depName=Adafruit MPU6050 packageName=adafruit/library/Adafruit MPU6050 adafruit/Adafruit MPU6050@2.2.6 # renovate: datasource=custom.pio depName=Adafruit LIS3DH packageName=adafruit/library/Adafruit LIS3DH @@ -147,6 +147,8 @@ lib_deps = emotibit/EmotiBit MLX90632@1.0.8 # renovate: datasource=custom.pio depName=Adafruit MLX90614 packageName=adafruit/library/Adafruit MLX90614 Library adafruit/Adafruit MLX90614 Library@2.1.5 + # renovate: datasource=custom.pio depName=Bosch BME68x packageName=boschsensortec/library/BME68x Sensor Library + boschsensortec/BME68x Sensor Library@1.2.40408 # renovate: datasource=github-tags depName=INA3221 packageName=KodinLanewave/INA3221 https://github.com/KodinLanewave/INA3221/archive/1.0.1.zip # renovate: datasource=custom.pio depName=QMC5883L Compass packageName=mprograms/library/QMC5883LCompass @@ -183,9 +185,7 @@ lib_deps = sparkfun/SparkFun Qwiic Scale NAU7802 Arduino Library@1.0.6 # renovate: datasource=custom.pio depName=ClosedCube OPT3001 packageName=closedcube/library/ClosedCube OPT3001 ClosedCube OPT3001@1.1.2 - # renovate: datasource=custom.pio depName=Bosch BSEC2 packageName=boschsensortec/library/bsec2 - boschsensortec/bsec2@1.10.2610 - # renovate: datasource=custom.pio depName=Bosch BME68x packageName=boschsensortec/library/BME68x Sensor Library - boschsensortec/BME68x Sensor Library@1.3.40408 + # renovate: datasource=git-refs depName=Bosch BSEC2 packageName=https://github.com/meshtastic/Bosch-BSEC2-Library gitBranch=extra_script + https://github.com/meshtastic/Bosch-BSEC2-Library/archive/e16952dfe5addd4287e1eb8c4f6ecac0fa3dd3de.zip # renovate: datasource=git-refs depName=meshtastic-DFRobot_LarkWeatherStation packageName=https://github.com/meshtastic/DFRobot_LarkWeatherStation gitBranch=master https://github.com/meshtastic/DFRobot_LarkWeatherStation/archive/4de3a9cadef0f6a5220a8a906cf9775b02b0040d.zip diff --git a/protobufs b/protobufs index 0b32ce24f0..816595c8bb 160000 --- a/protobufs +++ b/protobufs @@ -1 +1 @@ -Subproject commit 0b32ce24f029f69635026aec9428b5c8176e2ce1 +Subproject commit 816595c8bbdfc3b4388e11348ccd043294d58705 diff --git a/src/ButtonThread.cpp b/src/ButtonThread.cpp index 8db52c074a..352885dbe5 100644 --- a/src/ButtonThread.cpp +++ b/src/ButtonThread.cpp @@ -300,23 +300,14 @@ int32_t ButtonThread::runOnce() #ifdef BUTTON_PIN_TOUCH case BUTTON_EVENT_TOUCH_LONG_PRESSED: { LOG_BUTTON("Touch press!"); - // Ignore if: no screen - if (!screen) - break; - -#ifdef TTGO_T_ECHO - // Ignore if: TX in progress - // Uncommon T-Echo hardware bug, LoRa TX triggers touch button - if (!RadioLibInterface::instance || RadioLibInterface::instance->isSending()) - break; -#endif - - // Wake if asleep - if (powerFSM.getState() == &stateDARK) - powerFSM.trigger(EVENT_PRESS); + if (screen) { + // Wake if asleep + if (powerFSM.getState() == &stateDARK) + powerFSM.trigger(EVENT_PRESS); - // Update display (legacy behaviour) - screen->forceDisplay(); + // Update display (legacy behaviour) + screen->forceDisplay(); + } break; } #endif // BUTTON_PIN_TOUCH diff --git a/src/configuration.h b/src/configuration.h index 5f6930646e..d319ddb0ac 100644 --- a/src/configuration.h +++ b/src/configuration.h @@ -80,10 +80,10 @@ along with this program. If not, see . // Override user saved region, for producing region-locked builds // #define REGULATORY_LORA_REGIONCODE meshtastic_Config_LoRaConfig_RegionCode_SG_923 -// Total system gain in dBm to subtract from Tx power to remain within regulatory and Tx PA limits -// This value should be set in variant.h and is PA gain + antenna gain (if variant has a non-removable antenna) -#ifndef TX_GAIN_LORA -#define TX_GAIN_LORA 0 +// Total system gain in dBm to subtract from Tx power to remain within regulatory ERP limit for non-licensed operators +// This value should be set in variant.h and is PA gain + antenna gain (if system ships with an antenna) +#ifndef REGULATORY_GAIN_LORA +#define REGULATORY_GAIN_LORA 0 #endif // ----------------------------------------------------------------------------- diff --git a/src/gps/GPS.cpp b/src/gps/GPS.cpp index 142241c432..e234fdb4a4 100644 --- a/src/gps/GPS.cpp +++ b/src/gps/GPS.cpp @@ -1250,10 +1250,11 @@ GnssModel_t GPS::probe(int serialSpeed) // Close all NMEA sentences, valid for MTK3333 and MTK3339 platforms _serial_gps->write("$PMTK514,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*2E\r\n"); delay(20); - std::vector mtk = {{"L76B", "Quectel-L76B", GNSS_MODEL_MTK_L76B}, {"PA1010D", "1010D", GNSS_MODEL_MTK_PA1010D}, - {"PA1616S", "1616S", GNSS_MODEL_MTK_PA1616S}, {"LS20031", "MC-1513", GNSS_MODEL_MTK_L76B}, - {"L96", "Quectel-L96", GNSS_MODEL_MTK_L76B}, {"L80-R", "_3337_", GNSS_MODEL_MTK_L76B}, - {"L80", "_3339_", GNSS_MODEL_MTK_L76B}}; + std::vector mtk = {{"L76B", "Quectel-L76B", GNSS_MODEL_MTK_L76B}, + {"PA1010D", "1010D", GNSS_MODEL_MTK_PA1010D}, + {"PA1616S", "1616S", GNSS_MODEL_MTK_PA1616S}, + {"LS20031", "MC-1513", GNSS_MODEL_MTK_L76B}, + {"L96", "Quectel-L96", GNSS_MODEL_MTK_L76B}}; PROBE_FAMILY("MTK Family", "$PMTK605*31", mtk, 500); diff --git a/src/graphics/Screen.cpp b/src/graphics/Screen.cpp index 61999ee797..1ee0c0fdd1 100644 --- a/src/graphics/Screen.cpp +++ b/src/graphics/Screen.cpp @@ -1612,9 +1612,6 @@ void Screen::handleSetOn(bool on, FrameCallback einkScreensaver) #ifdef T_WATCH_S3 PMU->enablePowerOutput(XPOWERS_ALDO2); #endif -#ifdef HELTEC_TRACKER_V1_X - uint8_t tft_vext_enabled = digitalRead(VEXT_ENABLE); -#endif #if !ARCH_PORTDUINO dispdev->displayOn(); #endif @@ -1625,12 +1622,6 @@ void Screen::handleSetOn(bool on, FrameCallback einkScreensaver) #endif dispdev->displayOn(); -#ifdef HELTEC_TRACKER_V1_X - // If the TFT VEXT power is not enabled, initialize the UI. - if (!tft_vext_enabled) { - ui->init(); - } -#endif #ifdef USE_ST7789 pinMode(VTFT_CTRL, OUTPUT); digitalWrite(VTFT_CTRL, LOW); diff --git a/src/graphics/niche/Drivers/EInk/GDEY0213B74.cpp b/src/graphics/niche/Drivers/EInk/GDEY0213B74.cpp deleted file mode 100644 index a0ff632587..0000000000 --- a/src/graphics/niche/Drivers/EInk/GDEY0213B74.cpp +++ /dev/null @@ -1,61 +0,0 @@ -#include "./GDEY0213B74.h" - -#ifdef MESHTASTIC_INCLUDE_NICHE_GRAPHICS - -using namespace NicheGraphics::Drivers; - -// Map the display controller IC's output to the connected panel -void GDEY0213B74::configScanning() -{ - // "Driver output control" - sendCommand(0x01); - sendData(0xF9); - sendData(0x00); - sendData(0x00); - - // To-do: delete this method? - // Values set here might be redundant: F9, 00, 00 seems to be default -} - -// Specify which information is used to control the sequence of voltages applied to move the pixels -// - For this display, configUpdateSequence() specifies that a suitable LUT will be loaded from -// the controller IC's OTP memory, when the update procedure begins. -void GDEY0213B74::configWaveform() -{ - sendCommand(0x3C); // Border waveform: - sendData(0x05); // Screen border should follow LUT1 waveform (actively drive pixels white) - - sendCommand(0x18); // Temperature sensor: - sendData(0x80); // Use internal temperature sensor to select an appropriate refresh waveform -} - -void GDEY0213B74::configUpdateSequence() -{ - switch (updateType) { - case FAST: - sendCommand(0x22); // Set "update sequence" - sendData(0xFF); // Will load LUT from OTP memory, Display mode 2 "differential refresh" - break; - - case FULL: - default: - sendCommand(0x22); // Set "update sequence" - sendData(0xF7); // Will load LUT from OTP memory - break; - } -} - -// Once the refresh operation has been started, -// begin periodically polling the display to check for completion, using the normal Meshtastic threading code -// Only used when refresh is "async" -void GDEY0213B74::detachFromUpdate() -{ - switch (updateType) { - case FAST: - return beginPolling(50, 500); // At least 500ms for fast refresh - case FULL: - default: - return beginPolling(100, 2000); // At least 2 seconds for full refresh - } -} -#endif // MESHTASTIC_INCLUDE_NICHE_GRAPHICS \ No newline at end of file diff --git a/src/graphics/niche/Drivers/EInk/GDEY0213B74.h b/src/graphics/niche/Drivers/EInk/GDEY0213B74.h deleted file mode 100644 index 2212fe92a5..0000000000 --- a/src/graphics/niche/Drivers/EInk/GDEY0213B74.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - -E-Ink display driver - - GDEY0213B74 - - Manufacturer: Goodisplay - - Size: 2.13 inch - - Resolution: 250px x 122px - - Flex connector marking: FPC-A002 - -*/ - -#pragma once - -#ifdef MESHTASTIC_INCLUDE_NICHE_GRAPHICS - -#include "configuration.h" - -#include "./SSD16XX.h" - -namespace NicheGraphics::Drivers -{ -class GDEY0213B74 : public SSD16XX -{ - // Display properties - private: - static constexpr uint32_t width = 122; - static constexpr uint32_t height = 250; - static constexpr UpdateTypes supported = (UpdateTypes)(FULL | FAST); - - public: - GDEY0213B74() : SSD16XX(width, height, supported) {} - - protected: - virtual void configScanning() override; - virtual void configWaveform() override; - virtual void configUpdateSequence() override; - void detachFromUpdate() override; -}; - -} // namespace NicheGraphics::Drivers - -#endif // MESHTASTIC_INCLUDE_NICHE_GRAPHICS \ No newline at end of file diff --git a/src/graphics/niche/Fonts/FreeSans6pt7b.h b/src/graphics/niche/Fonts/FreeSans6pt7b.h index 0b3e74b8f4..c5bcc32c45 100644 --- a/src/graphics/niche/Fonts/FreeSans6pt7b.h +++ b/src/graphics/niche/Fonts/FreeSans6pt7b.h @@ -1,198 +1,129 @@ #pragma once + const uint8_t FreeSans6pt7bBitmaps[] PROGMEM = { - /* ' ' 0x20 */ - /* '!' 0x21 */ 0xFE, 0x80, - /* '"' 0x22 */ 0xB6, 0x80, - /* '#' 0x23 */ 0x24, 0x49, 0xF9, 0x42, 0x9F, 0x92, 0x28, - /* '$' 0x24 */ 0x23, 0xAB, 0x5A, 0x38, 0xB5, 0xAB, 0x88, - /* '%' 0x25 */ 0x71, 0x22, 0x88, 0xA2, 0x30, 0x74, 0x02, 0x60, 0xA4, 0x49, 0x11, 0x80, - /* '&' 0x26 */ 0x31, 0x24, 0x8C, 0x72, 0x58, 0xA3, 0x74, - /* ''' 0x27 */ 0xE0, - /* '(' 0x28 */ 0x5A, 0xAA, 0x94, - /* ')' 0x29 */ 0x89, 0x12, 0x49, 0x49, 0x00, - /* '*' 0x2A */ 0x5E, 0x80, - /* '+' 0x2B */ 0x21, 0x3E, 0x42, 0x00, - /* ',' 0x2C */ 0xE0, - /* '-' 0x2D */ 0xE0, - /* '.' 0x2E */ 0x80, - /* '/' 0x2F */ 0x25, 0x24, 0xA4, 0x80, - /* '0' 0x30 */ 0x76, 0xE3, 0x18, 0xC6, 0x3B, 0x70, - /* '1' 0x31 */ 0x5D, 0x55, 0x40, - /* '2' 0x32 */ 0x74, 0x42, 0x11, 0x11, 0x10, 0xF8, - /* '3' 0x33 */ 0x74, 0x42, 0x13, 0x04, 0x31, 0x70, - /* '4' 0x34 */ 0x11, 0x8C, 0xA9, 0x4B, 0xE2, 0x10, - /* '5' 0x35 */ 0x7D, 0x04, 0x1E, 0x4C, 0x10, 0x63, 0x78, - /* '6' 0x36 */ 0x72, 0x61, 0xE8, 0xC6, 0x39, 0x70, - /* '7' 0x37 */ 0xF8, 0x44, 0x22, 0x11, 0x08, 0x40, - /* '8' 0x38 */ 0x7A, 0x18, 0x61, 0x7A, 0x18, 0x61, 0x78, - /* '9' 0x39 */ 0x7B, 0x28, 0x61, 0xCD, 0xD0, 0x62, 0x70, - /* ':' 0x3A */ 0x82, - /* ';' 0x3B */ 0x87, - /* '<' 0x3C */ 0x3E, 0x30, 0x60, 0x80, - /* '=' 0x3D */ 0xF8, 0x3E, - /* '>' 0x3E */ 0xE0, 0xC6, 0xC8, 0x00, - /* '?' 0x3F */ 0x74, 0x42, 0x11, 0x10, 0x80, 0x20, - /* '@' 0x40 */ 0x0F, 0x06, 0x19, 0x3B, 0xC4, 0x99, 0x13, 0x22, 0x64, 0x96, 0x6E, 0x40, 0x04, 0x00, 0x7C, 0x00, - /* 'A' 0x41 */ 0x18, 0x18, 0x3C, 0x24, 0x24, 0x7E, 0x42, 0x42, 0xC3, - /* 'B' 0x42 */ 0xFA, 0x18, 0x61, 0xFA, 0x18, 0x61, 0xF8, - /* 'C' 0x43 */ 0x3E, 0x41, 0x80, 0x80, 0x80, 0x80, 0x81, 0x43, 0x3E, - /* 'D' 0x44 */ 0xF9, 0x0A, 0x0C, 0x18, 0x30, 0x60, 0xC2, 0xF8, - /* 'E' 0x45 */ 0xFE, 0x08, 0x20, 0xFA, 0x08, 0x20, 0xFC, - /* 'F' 0x46 */ 0xFC, 0x21, 0x0F, 0xC2, 0x10, 0x80, - /* 'G' 0x47 */ 0x3E, 0x41, 0x80, 0x80, 0x87, 0x81, 0xC1, 0x43, 0x3D, - /* 'H' 0x48 */ 0x83, 0x06, 0x0C, 0x1F, 0xF0, 0x60, 0xC1, 0x82, - /* 'I' 0x49 */ 0xFF, 0x80, - /* 'J' 0x4A */ 0x08, 0x42, 0x10, 0x86, 0x31, 0x70, - /* 'K' 0x4B */ 0x86, 0x29, 0x28, 0xD2, 0x48, 0xA1, 0x84, - /* 'L' 0x4C */ 0x84, 0x21, 0x08, 0x42, 0x10, 0xF8, - /* 'M' 0x4D */ 0xC3, 0xC3, 0xC3, 0xA5, 0xA5, 0xA5, 0x99, 0x99, 0x99, - /* 'N' 0x4E */ 0xC3, 0x86, 0x8D, 0x19, 0x33, 0x62, 0xC3, 0x86, - /* 'O' 0x4F */ 0x3E, 0x31, 0xB0, 0x70, 0x18, 0x0C, 0x07, 0x06, 0xC6, 0x3E, 0x00, - /* 'P' 0x50 */ 0xFA, 0x18, 0x61, 0xFA, 0x08, 0x20, 0x80, - /* 'Q' 0x51 */ 0x3E, 0x31, 0xB0, 0x70, 0x18, 0x0C, 0x07, 0x06, 0xC6, 0x3F, 0x00, 0x40, - /* 'R' 0x52 */ 0xF9, 0x0A, 0x14, 0x2F, 0x90, 0xA1, 0x42, 0x86, - /* 'S' 0x53 */ 0x7A, 0x18, 0x30, 0x78, 0x38, 0x71, 0x78, - /* 'T' 0x54 */ 0xFC, 0x41, 0x04, 0x10, 0x41, 0x04, 0x10, - /* 'U' 0x55 */ 0x83, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xE3, 0x7C, - /* 'V' 0x56 */ 0xC2, 0x85, 0x0B, 0x22, 0x44, 0x8E, 0x0C, 0x18, - /* 'W' 0x57 */ 0x84, 0x38, 0xCD, 0x29, 0x25, 0x24, 0xA4, 0xD2, 0x8C, 0x61, 0x8C, 0x31, 0x80, - /* 'X' 0x58 */ 0x87, 0x34, 0x8C, 0x30, 0xC4, 0xA3, 0x84, - /* 'Y' 0x59 */ 0x82, 0x89, 0x11, 0x43, 0x82, 0x04, 0x08, 0x10, - /* 'Z' 0x5A */ 0x7E, 0x0C, 0x30, 0x41, 0x06, 0x18, 0x20, 0xFE, - /* '[' 0x5B */ 0xEA, 0xAA, 0xAB, - /* '\' 0x5C */ 0x92, 0x24, 0x91, 0x20, - /* ']' 0x5D */ 0xD5, 0x55, 0x57, - /* '^' 0x5E */ 0x46, 0xA9, 0x10, - /* '_' 0x5F */ 0xFE, - /* '`' 0x60 */ 0x80, - /* 'a' 0x61 */ 0x79, 0x08, 0x11, 0xEC, 0x51, 0x9D, 0x80, - /* 'b' 0x62 */ 0x84, 0x3D, 0xB8, 0xC6, 0x3B, 0xF0, - /* 'c' 0x63 */ 0x7B, 0x18, 0x20, 0x83, 0x17, 0x80, - /* 'd' 0x64 */ 0x04, 0x17, 0xF3, 0x86, 0x18, 0x73, 0x74, - /* 'e' 0x65 */ 0x7B, 0x38, 0x7F, 0x83, 0x17, 0x80, - /* 'f' 0x66 */ 0x6B, 0xA4, 0x92, 0x40, - /* 'g' 0x67 */ 0x77, 0x38, 0x61, 0x87, 0x37, 0x41, 0x8D, 0xE0, - /* 'h' 0x68 */ 0x84, 0x2D, 0x98, 0xC6, 0x31, 0x88, - /* 'i' 0x69 */ 0xBF, 0x80, - /* 'j' 0x6A */ 0x45, 0x55, 0x57, - /* 'k' 0x6B */ 0x84, 0x25, 0x6E, 0x72, 0x52, 0x88, - /* 'l' 0x6C */ 0xFF, 0x80, - /* 'm' 0x6D */ 0xFF, 0x99, 0x91, 0x91, 0x91, 0x91, 0x91, - /* 'n' 0x6E */ 0xB6, 0x63, 0x18, 0xC6, 0x20, - /* 'o' 0x6F */ 0x7B, 0x38, 0x61, 0x87, 0x37, 0x80, - /* 'p' 0x70 */ 0xF6, 0xE3, 0x18, 0xEF, 0xD0, 0x80, - /* 'q' 0x71 */ 0x77, 0x38, 0x61, 0x87, 0x37, 0x41, 0x04, - /* 'r' 0x72 */ 0xBA, 0x49, 0x20, - /* 's' 0x73 */ 0x69, 0x8E, 0x19, 0x60, - /* 't' 0x74 */ 0x5D, 0x24, 0x93, - /* 'u' 0x75 */ 0x8C, 0x63, 0x18, 0xCD, 0xA0, - /* 'v' 0x76 */ 0x85, 0x24, 0x92, 0x30, 0xC3, 0x00, - /* 'w' 0x77 */ 0x89, 0x99, 0x59, 0x55, 0x56, 0x66, 0x26, - /* 'x' 0x78 */ 0x4A, 0x4C, 0x43, 0x27, 0x20, - /* 'y' 0x79 */ 0x85, 0x24, 0x92, 0x30, 0xC3, 0x08, 0x21, 0x80, - /* 'z' 0x7A */ 0x78, 0x44, 0x46, 0x23, 0xE0, - /* '{' 0x7B */ 0x69, 0x25, 0xB2, 0x49, 0x30, - /* '|' 0x7C */ 0xFF, 0xE0, - /* '}' 0x7D */ 0xC9, 0x24, 0xDA, 0x49, 0x60, - /* '~' 0x7E */ 0x66, 0x70, -}; + 0xAA, 0xA8, 0xC0, 0xF6, 0xA0, 0x24, 0x51, 0xF9, 0x42, 0x9F, 0x92, 0x28, 0x10, 0xE5, 0x55, 0x50, 0xE1, 0x65, 0x55, 0xE1, 0x00, + 0x71, 0x24, 0x89, 0x22, 0x50, 0x74, 0x02, 0x70, 0xA4, 0x49, 0x11, 0xC0, 0x70, 0x91, 0x23, 0x86, 0x12, 0xA2, 0x4E, 0xF4, 0xE0, + 0x5A, 0xAA, 0x94, 0x89, 0x12, 0x49, 0x29, 0x00, 0x27, 0x50, 0x21, 0x3E, 0x42, 0x00, 0xE0, 0xC0, 0x80, 0x24, 0xA4, 0xA4, 0x80, + 0x74, 0xE3, 0x18, 0xC6, 0x33, 0x70, 0x27, 0x92, 0x49, 0x20, 0x79, 0x10, 0x41, 0x08, 0xC6, 0x10, 0xFC, 0x79, 0x30, 0x43, 0x18, + 0x10, 0x71, 0x78, 0x08, 0x61, 0x8A, 0x49, 0x2F, 0xC2, 0x08, 0x7D, 0x04, 0x1E, 0x44, 0x10, 0x51, 0x78, 0x74, 0x61, 0xE8, 0xC6, + 0x31, 0x70, 0xF8, 0x44, 0x22, 0x11, 0x08, 0x40, 0x39, 0x34, 0x53, 0x39, 0x1C, 0x51, 0x38, 0x39, 0x3C, 0x71, 0x4C, 0xF0, 0x53, + 0x78, 0x82, 0x87, 0x01, 0xF1, 0x83, 0x04, 0xF8, 0x3E, 0x07, 0x06, 0x36, 0x40, 0x74, 0x42, 0x11, 0x10, 0x80, 0x20, 0x0F, 0x86, + 0x19, 0x9A, 0xA4, 0xD9, 0x13, 0x22, 0x56, 0xDA, 0x6E, 0x60, 0x06, 0x00, 0x3C, 0x00, 0x18, 0x18, 0x3C, 0x24, 0x24, 0x7E, 0x42, + 0x42, 0xC3, 0xFA, 0x18, 0x61, 0xFA, 0x18, 0x61, 0xFC, 0x3E, 0x63, 0x40, 0x40, 0xC0, 0x40, 0x41, 0x63, 0x3E, 0xF9, 0x0A, 0x1C, + 0x18, 0x30, 0x61, 0xC2, 0xF8, 0xFE, 0x08, 0x20, 0xFE, 0x08, 0x20, 0xFC, 0xFE, 0x08, 0x20, 0xFA, 0x08, 0x20, 0x80, 0x1E, 0x61, + 0x40, 0x40, 0xC7, 0x41, 0x41, 0x63, 0x1D, 0x83, 0x06, 0x0C, 0x1F, 0xF0, 0x60, 0xC1, 0x82, 0xFF, 0x80, 0x08, 0x42, 0x10, 0x87, + 0x29, 0x70, 0x85, 0x12, 0x45, 0x0D, 0x13, 0x22, 0x42, 0x86, 0x84, 0x21, 0x08, 0x42, 0x10, 0xF8, 0xC3, 0xC3, 0xC3, 0xA5, 0xA5, + 0xA5, 0x99, 0x99, 0x99, 0x83, 0x86, 0x8D, 0x19, 0x33, 0x62, 0xC3, 0x86, 0x1E, 0x31, 0x90, 0x68, 0x1C, 0x0A, 0x05, 0x06, 0xC6, + 0x1E, 0x00, 0xFA, 0x18, 0x61, 0xFA, 0x08, 0x20, 0x80, 0x1E, 0x31, 0x90, 0x68, 0x1C, 0x0A, 0x05, 0x06, 0xC6, 0x1F, 0x00, 0x00, + 0xFD, 0x0E, 0x1C, 0x2F, 0x90, 0xA1, 0x42, 0x86, 0x7A, 0x18, 0x30, 0x78, 0x38, 0x61, 0x78, 0xFE, 0x20, 0x40, 0x81, 0x02, 0x04, + 0x08, 0x10, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xE2, 0x78, 0xC2, 0x42, 0x42, 0x64, 0x24, 0x24, 0x38, 0x18, 0x18, 0xC4, 0x28, + 0xCD, 0x29, 0x25, 0x24, 0xA4, 0x52, 0x8C, 0x61, 0x8C, 0x31, 0x80, 0x42, 0x66, 0x24, 0x18, 0x18, 0x18, 0x24, 0x46, 0x42, 0xC3, + 0x42, 0x24, 0x34, 0x18, 0x08, 0x08, 0x08, 0x08, 0x7E, 0x0C, 0x30, 0x41, 0x06, 0x18, 0x20, 0xFE, 0xEA, 0xAA, 0xAB, 0x92, 0x24, + 0x89, 0x20, 0xE9, 0x24, 0x92, 0x49, 0x70, 0x46, 0xA9, 0x10, 0xFE, 0x40, 0x79, 0x20, 0x4F, 0xC6, 0x37, 0x40, 0x84, 0x3D, 0x18, + 0xC6, 0x31, 0xF0, 0x39, 0x3C, 0x20, 0xC1, 0x33, 0x80, 0x04, 0x13, 0xD3, 0xC6, 0x1C, 0x53, 0x3C, 0x39, 0x38, 0x7F, 0x81, 0x13, + 0x80, 0x6B, 0xA4, 0x92, 0x40, 0x35, 0x3C, 0x61, 0xC5, 0x33, 0x41, 0x4D, 0xE0, 0x84, 0x3D, 0x38, 0xC6, 0x31, 0x88, 0xBF, 0x80, + 0x45, 0x55, 0x57, 0x84, 0x25, 0x4E, 0x52, 0xD2, 0x88, 0xFF, 0x80, 0xF7, 0x99, 0x91, 0x91, 0x91, 0x91, 0x91, 0xF4, 0x63, 0x18, + 0xC6, 0x20, 0x39, 0x3C, 0x61, 0xC5, 0x33, 0x80, 0xF4, 0x63, 0x18, 0xC7, 0xD0, 0x80, 0x3D, 0x3C, 0x61, 0xC5, 0x37, 0x41, 0x04, + 0xF2, 0x49, 0x20, 0x79, 0x24, 0x1C, 0x0B, 0x27, 0x80, 0x5D, 0x24, 0x93, 0x8C, 0x63, 0x18, 0xCF, 0xA0, 0x85, 0x24, 0x92, 0x30, + 0xC3, 0x00, 0x89, 0x2C, 0x96, 0x4A, 0xA5, 0x61, 0x30, 0x98, 0x49, 0x23, 0x08, 0x31, 0x2C, 0x80, 0x89, 0x24, 0x94, 0x50, 0xC2, + 0x08, 0x21, 0x00, 0x78, 0x44, 0x46, 0x23, 0xE0, 0x6A, 0xAA, 0xA9, 0xFF, 0xE0, 0x95, 0x55, 0x56, 0x66, 0x60}; -const GFXglyph FreeSans6pt7bGlyphs[] PROGMEM = { - /* ' ' 0x20 */ {0, 0, 0, 3, 0, 0}, - /* '!' 0x21 */ {0, 1, 9, 4, 2, -8}, - /* '"' 0x22 */ {2, 3, 3, 4, 0, -8}, - /* '#' 0x23 */ {4, 7, 8, 7, 0, -7}, - /* '$' 0x24 */ {11, 5, 11, 7, 1, -9}, - /* '%' 0x25 */ {18, 10, 9, 11, 0, -8}, - /* '&' 0x26 */ {30, 6, 9, 8, 1, -8}, - /* ''' 0x27 */ {37, 1, 3, 2, 1, -8}, - /* '(' 0x28 */ {38, 2, 11, 4, 1, -8}, - /* ')' 0x29 */ {41, 3, 11, 4, 0, -8}, - /* '*' 0x2A */ {46, 3, 3, 5, 1, -8}, - /* '+' 0x2B */ {48, 5, 5, 7, 1, -4}, - /* ',' 0x2C */ {52, 1, 3, 3, 1, 0}, - /* '-' 0x2D */ {53, 3, 1, 4, 1, -3}, - /* '.' 0x2E */ {54, 1, 1, 3, 1, 0}, - /* '/' 0x2F */ {55, 3, 9, 3, 0, -8}, - /* '0' 0x30 */ {59, 5, 9, 7, 1, -8}, - /* '1' 0x31 */ {65, 2, 9, 7, 2, -8}, - /* '2' 0x32 */ {68, 5, 9, 7, 1, -8}, - /* '3' 0x33 */ {74, 5, 9, 7, 1, -8}, - /* '4' 0x34 */ {80, 5, 9, 7, 1, -8}, - /* '5' 0x35 */ {86, 6, 9, 7, 0, -8}, - /* '6' 0x36 */ {93, 5, 9, 7, 1, -8}, - /* '7' 0x37 */ {99, 5, 9, 7, 1, -8}, - /* '8' 0x38 */ {105, 6, 9, 7, 0, -8}, - /* '9' 0x39 */ {112, 6, 9, 7, 0, -8}, - /* ':' 0x3A */ {119, 1, 7, 3, 1, -6}, - /* ';' 0x3B */ {120, 1, 8, 3, 1, -5}, - /* '<' 0x3C */ {121, 5, 5, 7, 1, -4}, - /* '=' 0x3D */ {125, 5, 3, 7, 1, -3}, - /* '>' 0x3E */ {127, 5, 5, 7, 1, -4}, - /* '?' 0x3F */ {131, 5, 9, 7, 1, -8}, - /* '@' 0x40 */ {137, 11, 11, 12, 0, -8}, - /* 'A' 0x41 */ {153, 8, 9, 8, 0, -8}, - /* 'B' 0x42 */ {162, 6, 9, 8, 1, -8}, - /* 'C' 0x43 */ {169, 8, 9, 9, 0, -8}, - /* 'D' 0x44 */ {178, 7, 9, 8, 1, -8}, - /* 'E' 0x45 */ {186, 6, 9, 8, 1, -8}, - /* 'F' 0x46 */ {193, 5, 9, 7, 1, -8}, - /* 'G' 0x47 */ {199, 8, 9, 9, 0, -8}, - /* 'H' 0x48 */ {208, 7, 9, 9, 1, -8}, - /* 'I' 0x49 */ {216, 1, 9, 3, 1, -8}, - /* 'J' 0x4A */ {218, 5, 9, 6, 0, -8}, - /* 'K' 0x4B */ {224, 6, 9, 8, 1, -8}, - /* 'L' 0x4C */ {231, 5, 9, 7, 1, -8}, - /* 'M' 0x4D */ {237, 8, 9, 10, 1, -8}, - /* 'N' 0x4E */ {246, 7, 9, 9, 1, -8}, - /* 'O' 0x4F */ {254, 9, 9, 9, 0, -8}, - /* 'P' 0x50 */ {265, 6, 9, 8, 1, -8}, - /* 'Q' 0x51 */ {272, 9, 10, 9, 0, -8}, - /* 'R' 0x52 */ {284, 7, 9, 9, 1, -8}, - /* 'S' 0x53 */ {292, 6, 9, 8, 1, -8}, - /* 'T' 0x54 */ {299, 6, 9, 8, 0, -8}, - /* 'U' 0x55 */ {306, 7, 9, 9, 1, -8}, - /* 'V' 0x56 */ {314, 7, 9, 8, 0, -8}, - /* 'W' 0x57 */ {322, 11, 9, 11, 0, -8}, - /* 'X' 0x58 */ {335, 6, 9, 8, 1, -8}, - /* 'Y' 0x59 */ {342, 7, 9, 8, 1, -8}, - /* 'Z' 0x5A */ {350, 7, 9, 7, 0, -8}, - /* '[' 0x5B */ {358, 2, 12, 3, 1, -8}, - /* '\' 0x5C */ {361, 3, 9, 3, 0, -8}, - /* ']' 0x5D */ {365, 2, 12, 3, 0, -8}, - /* '^' 0x5E */ {368, 4, 5, 6, 1, -8}, - /* '_' 0x5F */ {371, 7, 1, 7, 0, 2}, - /* '`' 0x60 */ {372, 1, 1, 3, 1, -8}, - /* 'a' 0x61 */ {373, 7, 7, 7, 0, -6}, - /* 'b' 0x62 */ {380, 5, 9, 7, 1, -8}, - /* 'c' 0x63 */ {386, 6, 7, 6, 0, -6}, - /* 'd' 0x64 */ {392, 6, 9, 7, 0, -8}, - /* 'e' 0x65 */ {399, 6, 7, 6, 0, -6}, - /* 'f' 0x66 */ {405, 3, 9, 3, 0, -8}, - /* 'g' 0x67 */ {409, 6, 10, 7, 0, -6}, - /* 'h' 0x68 */ {417, 5, 9, 6, 1, -8}, - /* 'i' 0x69 */ {423, 1, 9, 3, 1, -8}, - /* 'j' 0x6A */ {425, 2, 12, 3, 0, -8}, - /* 'k' 0x6B */ {428, 5, 9, 6, 1, -8}, - /* 'l' 0x6C */ {434, 1, 9, 3, 1, -8}, - /* 'm' 0x6D */ {436, 8, 7, 10, 1, -6}, - /* 'n' 0x6E */ {443, 5, 7, 6, 1, -6}, - /* 'o' 0x6F */ {448, 6, 7, 6, 0, -6}, - /* 'p' 0x70 */ {454, 5, 9, 7, 1, -6}, - /* 'q' 0x71 */ {460, 6, 9, 7, 0, -6}, - /* 'r' 0x72 */ {467, 3, 7, 4, 1, -6}, - /* 's' 0x73 */ {470, 4, 7, 6, 1, -6}, - /* 't' 0x74 */ {474, 3, 8, 3, 0, -7}, - /* 'u' 0x75 */ {477, 5, 7, 6, 1, -6}, - /* 'v' 0x76 */ {482, 6, 7, 6, 0, -6}, - /* 'w' 0x77 */ {488, 8, 7, 9, 0, -6}, - /* 'x' 0x78 */ {495, 5, 7, 6, 0, -6}, - /* 'y' 0x79 */ {500, 6, 10, 6, 0, -6}, - /* 'z' 0x7A */ {508, 5, 7, 6, 0, -6}, - /* '{' 0x7B */ {513, 3, 12, 4, 0, -8}, - /* '|' 0x7C */ {518, 1, 11, 3, 1, -8}, - /* '}' 0x7D */ {520, 3, 12, 4, 1, -8}, - /* '~' 0x7E */ {525, 6, 2, 6, 0, -4}, -}; +const GFXglyph FreeSans6pt7bGlyphs[] PROGMEM = {{0, 0, 0, 3, 0, 1}, // 0x20 ' ' + {0, 2, 9, 4, 1, -8}, // 0x21 '!' + {3, 4, 3, 4, 0, -8}, // 0x22 '"' + {5, 7, 8, 7, 0, -7}, // 0x23 '#' + {12, 6, 11, 7, 0, -9}, // 0x24 '$' + {21, 10, 9, 11, 0, -8}, // 0x25 '%' + {33, 7, 9, 8, 1, -8}, // 0x26 '&' + {41, 1, 3, 2, 1, -8}, // 0x27 ''' + {42, 2, 11, 4, 1, -8}, // 0x28 '(' + {45, 3, 11, 4, 0, -8}, // 0x29 ')' + {50, 4, 3, 5, 0, -8}, // 0x2A '*' + {52, 5, 5, 7, 1, -4}, // 0x2B '+' + {56, 1, 3, 3, 1, 0}, // 0x2C ',' + {57, 2, 1, 4, 1, -3}, // 0x2D '-' + {58, 1, 1, 3, 1, 0}, // 0x2E '.' + {59, 3, 9, 3, 0, -8}, // 0x2F '/' + {63, 5, 9, 7, 1, -8}, // 0x30 '0' + {69, 3, 9, 7, 1, -8}, // 0x31 '1' + {73, 6, 9, 7, 0, -8}, // 0x32 '2' + {80, 6, 9, 7, 0, -8}, // 0x33 '3' + {87, 6, 9, 7, 0, -8}, // 0x34 '4' + {94, 6, 9, 7, 0, -8}, // 0x35 '5' + {101, 5, 9, 7, 1, -8}, // 0x36 '6' + {107, 5, 9, 7, 1, -8}, // 0x37 '7' + {113, 6, 9, 7, 0, -8}, // 0x38 '8' + {120, 6, 9, 7, 0, -8}, // 0x39 '9' + {127, 1, 7, 3, 1, -6}, // 0x3A ':' + {128, 1, 8, 3, 1, -5}, // 0x3B ';' + {129, 5, 6, 7, 1, -5}, // 0x3C '<' + {133, 5, 3, 7, 1, -3}, // 0x3D '=' + {135, 5, 6, 7, 1, -5}, // 0x3E '>' + {139, 5, 9, 7, 1, -8}, // 0x3F '?' + {145, 11, 11, 12, 0, -8}, // 0x40 '@' + {161, 8, 9, 8, 0, -8}, // 0x41 'A' + {170, 6, 9, 8, 1, -8}, // 0x42 'B' + {177, 8, 9, 9, 0, -8}, // 0x43 'C' + {186, 7, 9, 8, 1, -8}, // 0x44 'D' + {194, 6, 9, 8, 1, -8}, // 0x45 'E' + {201, 6, 9, 7, 1, -8}, // 0x46 'F' + {208, 8, 9, 9, 0, -8}, // 0x47 'G' + {217, 7, 9, 9, 1, -8}, // 0x48 'H' + {225, 1, 9, 3, 1, -8}, // 0x49 'I' + {227, 5, 9, 6, 0, -8}, // 0x4A 'J' + {233, 7, 9, 8, 1, -8}, // 0x4B 'K' + {241, 5, 9, 7, 1, -8}, // 0x4C 'L' + {247, 8, 9, 10, 1, -8}, // 0x4D 'M' + {256, 7, 9, 9, 1, -8}, // 0x4E 'N' + {264, 9, 9, 9, 0, -8}, // 0x4F 'O' + {275, 6, 9, 8, 1, -8}, // 0x50 'P' + {282, 9, 10, 9, 0, -8}, // 0x51 'Q' + {294, 7, 9, 9, 1, -8}, // 0x52 'R' + {302, 6, 9, 8, 1, -8}, // 0x53 'S' + {309, 7, 9, 8, 0, -8}, // 0x54 'T' + {317, 7, 9, 9, 1, -8}, // 0x55 'U' + {325, 8, 9, 8, 0, -8}, // 0x56 'V' + {334, 11, 9, 11, 0, -8}, // 0x57 'W' + {347, 8, 9, 8, 0, -8}, // 0x58 'X' + {356, 8, 9, 8, 0, -8}, // 0x59 'Y' + {365, 7, 9, 7, 0, -8}, // 0x5A 'Z' + {373, 2, 12, 3, 1, -8}, // 0x5B '[' + {376, 3, 9, 3, 0, -8}, // 0x5C '\' + {380, 3, 12, 3, 0, -8}, // 0x5D ']' + {385, 4, 5, 6, 1, -8}, // 0x5E '^' + {388, 7, 1, 7, 0, 2}, // 0x5F '_' + {389, 3, 1, 3, 0, -8}, // 0x60 '`' + {390, 6, 7, 7, 0, -6}, // 0x61 'a' + {396, 5, 9, 7, 1, -8}, // 0x62 'b' + {402, 6, 7, 6, 0, -6}, // 0x63 'c' + {408, 6, 9, 7, 0, -8}, // 0x64 'd' + {415, 6, 7, 6, 0, -6}, // 0x65 'e' + {421, 3, 9, 3, 0, -8}, // 0x66 'f' + {425, 6, 10, 7, 0, -6}, // 0x67 'g' + {433, 5, 9, 6, 1, -8}, // 0x68 'h' + {439, 1, 9, 3, 1, -8}, // 0x69 'i' + {441, 2, 12, 3, 0, -8}, // 0x6A 'j' + {444, 5, 9, 6, 1, -8}, // 0x6B 'k' + {450, 1, 9, 3, 1, -8}, // 0x6C 'l' + {452, 8, 7, 10, 1, -6}, // 0x6D 'm' + {459, 5, 7, 6, 1, -6}, // 0x6E 'n' + {464, 6, 7, 6, 0, -6}, // 0x6F 'o' + {470, 5, 9, 7, 1, -6}, // 0x70 'p' + {476, 6, 9, 7, 0, -6}, // 0x71 'q' + {483, 3, 7, 4, 1, -6}, // 0x72 'r' + {486, 6, 7, 6, 0, -6}, // 0x73 's' + {492, 3, 8, 3, 0, -7}, // 0x74 't' + {495, 5, 7, 6, 1, -6}, // 0x75 'u' + {500, 6, 7, 6, 0, -6}, // 0x76 'v' + {506, 9, 7, 9, 0, -6}, // 0x77 'w' + {514, 6, 7, 6, 0, -6}, // 0x78 'x' + {520, 6, 10, 6, 0, -6}, // 0x79 'y' + {528, 5, 7, 6, 0, -6}, // 0x7A 'z' + {533, 2, 12, 4, 1, -8}, // 0x7B '{' + {536, 1, 11, 3, 1, -8}, // 0x7C '|' + {538, 2, 12, 4, 1, -8}, // 0x7D '}' + {541, 6, 2, 6, 0, -4}}; // 0x7E '~' const GFXfont FreeSans6pt7b PROGMEM = {(uint8_t *)FreeSans6pt7bBitmaps, (GFXglyph *)FreeSans6pt7bGlyphs, 0x20, 0x7E, 14}; + +// Approx. 1215 bytes diff --git a/src/graphics/niche/Fonts/FreeSans6pt8bCyrillic.h b/src/graphics/niche/Fonts/FreeSans6pt8bCyrillic.h new file mode 100644 index 0000000000..d222cd1c38 --- /dev/null +++ b/src/graphics/niche/Fonts/FreeSans6pt8bCyrillic.h @@ -0,0 +1,302 @@ +/* + +Uses Windows-1251 encoding to map translingual Cyrillic characters to range between (uint8_t)127 and (uint8_t)255 +https://en.wikipedia.org/wiki/Windows-1251 + +Cyrillic characters present to the firmware as UTF8. +A NicheGraphics implementation needs to identify these, and substitute the appropriate Windows-1251 char value. + +*/ + +#pragma once + +const uint8_t FreeSans6pt8bCyrillicBitmaps[] PROGMEM = { + 0xFF, 0xA0, 0xC0, 0xFF, 0xA0, 0xC0, 0xB6, 0x80, 0x24, 0x51, 0xF9, 0x42, 0x9F, 0x92, 0x28, 0x31, 0x75, 0x54, 0x78, 0x79, 0x75, + 0x7C, 0x41, 0x00, 0x01, 0x1C, 0x49, 0x22, 0x50, 0x74, 0x02, 0x60, 0xA4, 0x49, 0x11, 0xC0, 0x21, 0x44, 0x94, 0x62, 0x59, 0xE2, + 0xF4, 0xE0, 0x6A, 0xAA, 0x90, 0x48, 0x92, 0x49, 0x4A, 0x00, 0x5D, 0x40, 0x21, 0x09, 0xF2, 0x10, 0xE0, 0xC0, 0x80, 0x25, 0x25, + 0x24, 0x26, 0xA3, 0x18, 0xC6, 0x31, 0xF0, 0x27, 0x92, 0x49, 0x20, 0x11, 0xB4, 0x41, 0x0C, 0xC6, 0x10, 0xFC, 0x26, 0xA2, 0x13, + 0x04, 0x31, 0xF0, 0x08, 0x61, 0x8A, 0x49, 0x2F, 0xC2, 0x08, 0xFF, 0xE1, 0x4D, 0x84, 0x31, 0xF0, 0x26, 0xE3, 0x0F, 0x46, 0x31, + 0xF0, 0xFF, 0xC4, 0x22, 0x11, 0x08, 0x40, 0x11, 0xA4, 0x51, 0x39, 0x1C, 0x51, 0x78, 0x11, 0xA4, 0x71, 0x45, 0xF0, 0x51, 0x78, + 0xC0, 0x30, 0xC0, 0x36, 0x1F, 0x20, 0xE0, 0x80, 0xF8, 0x3E, 0xC1, 0xC2, 0xE8, 0x00, 0x74, 0x62, 0x11, 0x10, 0x80, 0x20, 0x0F, + 0x06, 0x18, 0x81, 0xA7, 0xD4, 0x93, 0x22, 0x64, 0x4A, 0x7E, 0x60, 0x06, 0x00, 0x3C, 0x00, 0x18, 0x18, 0x1C, 0x24, 0x24, 0x7E, + 0x42, 0x42, 0xC3, 0xFA, 0x38, 0x61, 0xFA, 0x18, 0x61, 0xFC, 0x38, 0x8A, 0x0C, 0x08, 0x10, 0x20, 0xE3, 0x7C, 0xF9, 0x1A, 0x1C, + 0x18, 0x30, 0x60, 0xC2, 0xF8, 0xFE, 0x08, 0x20, 0xFE, 0x08, 0x20, 0xFC, 0xFE, 0x08, 0x20, 0xFA, 0x08, 0x20, 0x80, 0x3C, 0x46, + 0x82, 0x80, 0x8F, 0x81, 0x83, 0xC3, 0x7D, 0x83, 0x06, 0x0C, 0x1F, 0xF0, 0x60, 0xC1, 0x82, 0xFF, 0x80, 0x08, 0x42, 0x10, 0x86, + 0x31, 0x78, 0x87, 0x1A, 0x65, 0x8F, 0x1A, 0x22, 0x42, 0x86, 0x84, 0x21, 0x08, 0x42, 0x10, 0xF8, 0xC3, 0xC3, 0xC3, 0xA5, 0xA5, + 0xA5, 0x99, 0x99, 0x99, 0x83, 0x87, 0x8D, 0x19, 0x32, 0x62, 0xC3, 0x86, 0x1E, 0x11, 0x90, 0x48, 0x1C, 0x0A, 0x05, 0x06, 0xC2, + 0x3E, 0x00, 0xFA, 0x18, 0x61, 0xFE, 0x08, 0x20, 0x80, 0x1E, 0x11, 0x90, 0x48, 0x1C, 0x0A, 0x05, 0x06, 0xC6, 0x3F, 0x00, 0xFD, + 0x0E, 0x0C, 0x1F, 0xD0, 0xA0, 0xC1, 0x82, 0x7A, 0x18, 0x70, 0x78, 0x38, 0x61, 0x7C, 0xFE, 0x20, 0x40, 0x81, 0x02, 0x04, 0x08, + 0x10, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC3, 0x7C, 0xC3, 0x42, 0x42, 0x26, 0x24, 0x24, 0x14, 0x18, 0x18, 0xC4, 0x28, 0xC5, + 0x39, 0xA5, 0x24, 0xA4, 0x52, 0x8C, 0x71, 0x8C, 0x30, 0x80, 0x87, 0x34, 0x8C, 0x30, 0xC4, 0xB3, 0x84, 0xC3, 0x42, 0x26, 0x24, + 0x18, 0x18, 0x08, 0x08, 0x08, 0x7E, 0x0C, 0x10, 0x41, 0x06, 0x08, 0x20, 0xFE, 0xEA, 0xAA, 0xAB, 0x92, 0x24, 0x89, 0x20, 0xED, + 0xB6, 0xDB, 0x6D, 0xF0, 0x46, 0xAA, 0x90, 0xFC, 0x90, 0xFC, 0x4F, 0x98, 0xFC, 0x84, 0x21, 0xF8, 0xC6, 0x31, 0xF0, 0x79, 0x18, + 0x20, 0x45, 0xE0, 0x04, 0x10, 0x5F, 0xC6, 0x18, 0x51, 0x7C, 0xFC, 0x7F, 0x08, 0xF8, 0x29, 0x74, 0x92, 0x40, 0x7D, 0x18, 0x61, + 0x45, 0xF0, 0x52, 0x30, 0x84, 0x21, 0xF8, 0xC6, 0x31, 0x88, 0xDF, 0x80, 0x51, 0x55, 0x56, 0x84, 0x21, 0x2A, 0x72, 0x92, 0x98, + 0xFF, 0x80, 0xFF, 0x99, 0x99, 0x99, 0x99, 0x99, 0xFC, 0x63, 0x18, 0xC4, 0x79, 0x18, 0x71, 0x45, 0xE0, 0xFC, 0x63, 0x18, 0xFA, + 0x10, 0x80, 0x7D, 0x18, 0x61, 0x45, 0xF0, 0x41, 0x04, 0xF2, 0x49, 0x00, 0x79, 0x07, 0x02, 0xCD, 0xE0, 0x4B, 0xA4, 0x93, 0x8C, + 0x63, 0x18, 0xFC, 0xCD, 0x24, 0x94, 0x30, 0xC0, 0x99, 0x59, 0x55, 0x56, 0x66, 0x26, 0x96, 0x66, 0x99, 0xCA, 0x52, 0x63, 0x18, + 0x84, 0x40, 0x78, 0xC4, 0x44, 0x7C, 0x6A, 0xAA, 0xA9, 0xFF, 0xF0, 0xC9, 0x24, 0x4A, 0x49, 0x40, 0xE8, 0xC0, 0xFE, 0x18, 0x61, + 0x86, 0x18, 0x61, 0xFC, 0xFC, 0x08, 0x04, 0x02, 0x01, 0xF0, 0x8C, 0x46, 0x23, 0x11, 0x80, 0xC0, 0xC0, 0x10, 0x8F, 0xE0, 0x82, + 0x08, 0x20, 0x82, 0x08, 0x00, 0x64, 0x0F, 0x88, 0x88, 0x80, 0x3D, 0x0C, 0x2E, 0xF9, 0x04, 0x0F, 0x7C, 0x08, 0x81, 0x10, 0x22, + 0x04, 0x7C, 0x88, 0x51, 0x0A, 0x21, 0x87, 0xC0, 0x84, 0x10, 0x82, 0x10, 0x42, 0x0F, 0xFD, 0x08, 0xA1, 0x0C, 0x23, 0x87, 0xC0, + 0x10, 0x88, 0xE6, 0xB3, 0x8C, 0x28, 0x92, 0x28, 0xC0, 0xFC, 0x08, 0x04, 0x02, 0x01, 0xF0, 0x8C, 0x46, 0x23, 0x11, 0x80, 0x83, + 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0xFE, 0x20, 0x40, 0x43, 0xC4, 0x1F, 0x45, 0x14, 0x51, 0x44, 0x11, 0x80, 0x78, 0x24, 0x13, + 0xC9, 0x14, 0x8E, 0x7C, 0x88, 0x44, 0x3F, 0xD1, 0x38, 0x8C, 0x78, 0x60, 0x9A, 0xCC, 0xA9, 0x43, 0xC4, 0x1F, 0x45, 0x14, 0x51, + 0x44, 0x8C, 0x63, 0x18, 0xFC, 0x80, 0x24, 0x33, 0x0A, 0x36, 0x45, 0x8E, 0x0C, 0x10, 0x60, 0x80, 0x70, 0x22, 0x95, 0xA8, 0xC4, + 0x23, 0x10, 0x08, 0x42, 0x10, 0x86, 0x31, 0x78, 0x07, 0xF8, 0x20, 0x82, 0x08, 0x20, 0x82, 0x00, 0x28, 0x0F, 0xE0, 0x82, 0x0F, + 0xE0, 0x82, 0x0F, 0xC0, 0x38, 0x8A, 0x0C, 0x0F, 0x90, 0x20, 0xE3, 0x7C, 0x51, 0x55, 0x56, 0xA1, 0x24, 0x92, 0x49, 0x00, 0xFF, + 0x80, 0xDF, 0x80, 0x27, 0xC9, 0x24, 0x8A, 0x28, 0xA2, 0x8B, 0xF8, 0x20, 0x80, 0x28, 0xA0, 0x1E, 0x47, 0xFC, 0x11, 0x78, 0x88, + 0x44, 0x32, 0x59, 0xDA, 0xCD, 0x66, 0x6B, 0x32, 0x89, 0x80, 0x79, 0x1F, 0x30, 0x45, 0xE0, 0x7A, 0x18, 0x70, 0x78, 0x38, 0x61, + 0x7C, 0x79, 0x07, 0x02, 0xCD, 0xE0, 0xB4, 0x24, 0x92, 0x40, 0x18, 0x18, 0x3C, 0x24, 0x24, 0x7E, 0x42, 0x42, 0xC3, 0xFE, 0x08, + 0x20, 0xFE, 0x18, 0x61, 0xFC, 0xFA, 0x38, 0x61, 0xFA, 0x18, 0x61, 0xFC, 0xFE, 0x08, 0x20, 0x82, 0x08, 0x20, 0x80, 0x1F, 0x08, + 0x84, 0x42, 0x21, 0x10, 0x88, 0x44, 0x42, 0xFF, 0xC0, 0x60, 0x20, 0xFE, 0x08, 0x20, 0xFE, 0x08, 0x20, 0xFC, 0x88, 0xA4, 0x9A, + 0x87, 0xC1, 0xC1, 0xF1, 0xAD, 0x92, 0x88, 0x80, 0x7A, 0x18, 0x41, 0x38, 0x18, 0x61, 0x7C, 0x87, 0x0E, 0x2C, 0x59, 0x34, 0x68, + 0xE1, 0xC2, 0x28, 0x22, 0x1C, 0x38, 0xB1, 0x64, 0xD1, 0xA3, 0x87, 0x08, 0x8E, 0x6B, 0x38, 0xC2, 0x89, 0x22, 0x8C, 0x3E, 0x44, + 0x89, 0x12, 0x24, 0x58, 0xA1, 0xC2, 0xC3, 0xC3, 0xC3, 0xA5, 0xA5, 0xA5, 0x99, 0x99, 0x99, 0x83, 0x06, 0x0C, 0x1F, 0xF0, 0x60, + 0xC1, 0x82, 0x3C, 0x46, 0x83, 0x81, 0x81, 0x81, 0x81, 0xC2, 0x7C, 0xFF, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x82, 0xFA, 0x18, + 0x61, 0xFE, 0x08, 0x20, 0x80, 0x38, 0x8A, 0x0C, 0x08, 0x10, 0x20, 0xE3, 0x7C, 0xFE, 0x20, 0x40, 0x81, 0x02, 0x04, 0x08, 0x10, + 0xC2, 0x8D, 0x91, 0x63, 0x83, 0x04, 0x18, 0x20, 0x08, 0x1E, 0x32, 0xD1, 0x38, 0x8C, 0x4F, 0x2C, 0xFC, 0x08, 0x00, 0x87, 0x34, + 0x8C, 0x30, 0xC4, 0xB3, 0x84, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0xFF, 0x01, 0x01, 0x8E, 0x38, 0xE3, 0x8D, 0xF0, + 0xC3, 0x0C, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0xFF, 0x99, 0x4C, 0xA6, 0x53, 0x29, 0x94, 0xCA, 0x65, 0x32, 0xFF, + 0x80, 0x40, 0x20, 0xF0, 0x04, 0x01, 0x00, 0x40, 0x1F, 0x84, 0x21, 0x0C, 0x42, 0x1F, 0x00, 0x81, 0xC0, 0xE0, 0x70, 0x3F, 0xDC, + 0x2E, 0x17, 0x0B, 0xF9, 0x80, 0x82, 0x08, 0x20, 0xFE, 0x18, 0x61, 0xF8, 0x79, 0x8A, 0x18, 0x13, 0xE0, 0x60, 0xC2, 0x7C, 0x87, + 0x26, 0x39, 0x06, 0x41, 0xF0, 0x64, 0x19, 0x06, 0x63, 0x8F, 0x80, 0x7E, 0x18, 0x61, 0x7C, 0xD6, 0x71, 0x84, 0x79, 0x11, 0xD9, + 0xCD, 0xD0, 0x0D, 0xC4, 0x1E, 0x47, 0x1C, 0x51, 0x78, 0xF4, 0xBD, 0x29, 0xF8, 0xF8, 0x88, 0x88, 0x3C, 0x48, 0x91, 0x22, 0x5F, + 0xE0, 0x80, 0x79, 0x1F, 0xF0, 0x45, 0xE0, 0x92, 0x54, 0x38, 0x3C, 0x56, 0x93, 0x78, 0x23, 0x82, 0xCD, 0xE0, 0x9C, 0xEB, 0x5C, + 0xC4, 0x70, 0x27, 0x3A, 0xD7, 0x31, 0x9A, 0xCC, 0xA9, 0x7A, 0x52, 0x94, 0xE4, 0x8F, 0x3D, 0x6D, 0xA6, 0x90, 0x8C, 0x7F, 0x18, + 0xC4, 0x79, 0x1C, 0x71, 0x45, 0xE0, 0xFC, 0x63, 0x18, 0xC4, 0xFC, 0x63, 0x18, 0xFA, 0x10, 0x80, 0x79, 0x1C, 0x30, 0x45, 0xE0, + 0xF9, 0x08, 0x42, 0x10, 0x8A, 0x56, 0xA3, 0x10, 0x8C, 0x40, 0x04, 0x01, 0x07, 0xF9, 0x31, 0xC4, 0x71, 0x14, 0xC5, 0xFE, 0x04, + 0x01, 0x00, 0x40, 0x4B, 0x8C, 0x65, 0xE4, 0x8A, 0x28, 0xA2, 0x8B, 0xF0, 0x40, 0x99, 0x97, 0x11, 0x96, 0x59, 0x65, 0x97, 0xF0, + 0x95, 0x2A, 0x54, 0xA9, 0x5F, 0xC0, 0x80, 0xF0, 0x20, 0x78, 0x91, 0x23, 0xC0, 0x86, 0x1F, 0x63, 0x8F, 0xD0, 0x84, 0x3D, 0x18, + 0xF8, 0xF4, 0xDE, 0x19, 0xF8, 0x9E, 0xA2, 0xE1, 0xA1, 0xA2, 0x9E, 0xFC, 0x7E, 0xD4, 0xC4, +}; + +const GFXglyph FreeSans6pt8bCyrillicGlyphs[] PROGMEM = { + {0, 0, 0, 3, 0, 0}, // 0x20 ' ' + {3, 2, 9, 3, 1, -8}, // 0x21 '!' + {6, 3, 3, 4, 1, -8}, // 0x22 '"' + {8, 7, 8, 7, 0, -7}, // 0x23 '#' + {15, 6, 11, 7, 0, -8}, // 0x24 '$' + {24, 10, 9, 11, 0, -8}, // 0x25 '%' + {36, 6, 9, 8, 1, -8}, // 0x26 '&' + {43, 1, 3, 2, 1, -8}, // 0x27 ''' + {44, 2, 10, 4, 1, -7}, // 0x28 '(' + {47, 3, 11, 4, 0, -7}, // 0x29 ')' + {52, 3, 4, 5, 1, -8}, // 0x2A '*' + {54, 5, 6, 7, 1, -5}, // 0x2B '+' + {58, 1, 3, 3, 1, 0}, // 0x2C ',' + {59, 2, 1, 4, 1, -3}, // 0x2D '-' + {60, 1, 1, 3, 1, 0}, // 0x2E '.' + {61, 3, 8, 3, 0, -7}, // 0x2F '/' + {64, 5, 9, 7, 1, -8}, // 0x30 '0' + {70, 3, 9, 7, 1, -8}, // 0x31 '1' + {74, 6, 9, 7, 0, -8}, // 0x32 '2' + {81, 5, 9, 7, 1, -8}, // 0x33 '3' + {87, 6, 9, 7, 0, -8}, // 0x34 '4' + {94, 5, 9, 7, 1, -8}, // 0x35 '5' + {100, 5, 9, 7, 1, -8}, // 0x36 '6' + {106, 5, 9, 7, 1, -8}, // 0x37 '7' + {112, 6, 9, 7, 0, -8}, // 0x38 '8' + {119, 6, 9, 7, 0, -8}, // 0x39 '9' + {126, 2, 6, 3, 1, -5}, // 0x3A ':' + {128, 2, 8, 3, 1, -5}, // 0x3B ';' + {130, 5, 5, 7, 1, -4}, // 0x3C '<' + {134, 5, 3, 7, 1, -3}, // 0x3D '=' + {136, 5, 5, 7, 1, -4}, // 0x3E '>' + {140, 5, 9, 7, 1, -8}, // 0x3F '?' + {146, 11, 11, 12, 0, -8}, // 0x40 '@' + {162, 8, 9, 8, 0, -8}, // 0x41 'A' + {171, 6, 9, 8, 1, -8}, // 0x42 'B' + {178, 7, 9, 9, 1, -8}, // 0x43 'C' + {186, 7, 9, 9, 1, -8}, // 0x44 'D' + {194, 6, 9, 8, 1, -8}, // 0x45 'E' + {201, 6, 9, 7, 1, -8}, // 0x46 'F' + {208, 8, 9, 9, 1, -8}, // 0x47 'G' + {217, 7, 9, 9, 1, -8}, // 0x48 'H' + {225, 1, 9, 3, 1, -8}, // 0x49 'I' + {227, 5, 9, 6, 0, -8}, // 0x4A 'J' + {233, 7, 9, 8, 1, -8}, // 0x4B 'K' + {241, 5, 9, 7, 1, -8}, // 0x4C 'L' + {247, 8, 9, 10, 1, -8}, // 0x4D 'M' + {256, 7, 9, 9, 1, -8}, // 0x4E 'N' + {264, 9, 9, 9, 0, -8}, // 0x4F 'O' + {275, 6, 9, 8, 1, -8}, // 0x50 'P' + {282, 9, 9, 9, 0, -8}, // 0x51 'Q' + {293, 7, 9, 9, 1, -8}, // 0x52 'R' + {301, 6, 9, 8, 1, -8}, // 0x53 'S' + {308, 7, 9, 7, 0, -8}, // 0x54 'T' + {316, 7, 9, 9, 1, -8}, // 0x55 'U' + {324, 8, 9, 8, 0, -8}, // 0x56 'V' + {333, 11, 9, 11, 0, -8}, // 0x57 'W' + {346, 6, 9, 8, 1, -8}, // 0x58 'X' + {353, 8, 9, 8, 0, -8}, // 0x59 'Y' + {362, 7, 9, 7, 0, -8}, // 0x5A 'Z' + {370, 2, 12, 3, 1, -8}, // 0x5B '[' + {373, 3, 9, 3, 0, -8}, // 0x5C '\' + {377, 3, 12, 3, 0, -8}, // 0x5D ']' + {382, 4, 5, 6, 1, -8}, // 0x5E '^' + {385, 6, 1, 7, 0, 2}, // 0x5F '_' + {386, 2, 2, 4, 1, -8}, // 0x60 '`' + {387, 5, 6, 7, 1, -5}, // 0x61 'a' + {391, 5, 9, 7, 1, -8}, // 0x62 'b' + {397, 6, 6, 6, 0, -5}, // 0x63 'c' + {402, 6, 9, 7, 0, -8}, // 0x64 'd' + {409, 5, 6, 7, 1, -5}, // 0x65 'e' + {413, 3, 9, 3, 0, -8}, // 0x66 'f' + {417, 6, 9, 7, 0, -5}, // 0x67 'g' + {424, 5, 9, 7, 1, -8}, // 0x68 'h' + {430, 1, 9, 3, 1, -8}, // 0x69 'i' + {432, 2, 12, 3, 0, -8}, // 0x6A 'j' + {435, 5, 9, 6, 1, -8}, // 0x6B 'k' + {441, 1, 9, 3, 1, -8}, // 0x6C 'l' + {443, 8, 6, 10, 1, -5}, // 0x6D 'm' + {449, 5, 6, 7, 1, -5}, // 0x6E 'n' + {453, 6, 6, 7, 0, -5}, // 0x6F 'o' + {458, 5, 9, 7, 1, -5}, // 0x70 'p' + {464, 6, 9, 7, 0, -5}, // 0x71 'q' + {471, 3, 6, 4, 1, -5}, // 0x72 'r' + {474, 6, 6, 6, 0, -5}, // 0x73 's' + {479, 3, 8, 3, 0, -7}, // 0x74 't' + {482, 5, 6, 7, 1, -5}, // 0x75 'u' + {486, 6, 6, 6, 0, -5}, // 0x76 'v' + {491, 8, 6, 9, 0, -5}, // 0x77 'w' + {497, 4, 6, 6, 1, -5}, // 0x78 'x' + {500, 5, 9, 6, 0, -5}, // 0x79 'y' + {506, 5, 6, 6, 0, -5}, // 0x7A 'z' + {510, 2, 12, 4, 1, -8}, // 0x7B '{' + {513, 1, 12, 3, 1, -8}, // 0x7C '|' + {515, 3, 12, 4, 0, -8}, // 0x7D '}' + {520, 5, 2, 7, 1, -4}, // 0x7E '~' + {522, 6, 9, 8, 1, -8}, // + {529, 9, 11, 9, 0, -8}, // + {542, 6, 11, 7, 1, -10}, // + {551, 0, 0, 8, 0, 0}, // + {551, 4, 9, 5, 1, -8}, // + {556, 0, 0, 8, 0, 0}, // + {556, 0, 0, 8, 0, 0}, // + {556, 0, 0, 8, 0, 0}, // + {556, 0, 0, 8, 0, 0}, // + {556, 6, 8, 8, 1, -7}, // + {562, 0, 0, 8, 0, 0}, // + {562, 11, 9, 13, 1, -8}, // + {575, 0, 0, 8, 0, 0}, // + {575, 11, 9, 12, 1, -8}, // + {588, 6, 11, 8, 1, -10}, // + {597, 9, 9, 9, 0, -8}, // + {608, 7, 11, 9, 1, -8}, // + {618, 6, 11, 7, 0, -8}, // + {627, 0, 0, 8, 0, 0}, // + {627, 0, 0, 8, 0, 0}, // + {627, 0, 0, 8, 0, 0}, // + {627, 0, 0, 8, 0, 0}, // + {627, 0, 0, 8, 0, 0}, // + {627, 0, 0, 8, 0, 0}, // + {627, 0, 0, 8, 0, 0}, // + {627, 0, 0, 8, 0, 0}, // + {627, 0, 0, 8, 0, 0}, // + {627, 9, 6, 10, 0, -5}, // + {634, 0, 0, 8, 0, 0}, // + {634, 9, 6, 10, 1, -5}, // + {641, 4, 8, 6, 1, -7}, // + {645, 6, 9, 7, 0, -8}, // + {652, 5, 7, 7, 1, -5}, // + {657, 0, 0, 8, 0, 0}, // + {657, 7, 11, 7, 0, -10}, // + {667, 5, 11, 6, 0, -7}, // + {674, 5, 9, 6, 0, -8}, // + {680, 0, 0, 8, 0, 0}, // + {680, 6, 10, 7, 1, -9}, // + {688, 0, 0, 8, 0, 0}, // + {688, 0, 0, 8, 0, 0}, // + {688, 6, 11, 8, 1, -10}, // + {697, 7, 9, 9, 1, -8}, // + {705, 0, 0, 8, 0, 0}, // + {705, 0, 0, 8, 0, 0}, // + {705, 2, 12, 3, 0, -8}, // + {708, 0, 0, 8, 0, 0}, // + {708, 0, 0, 8, 0, 0}, // + {708, 3, 11, 3, 0, -10}, // + {713, 0, 0, 8, 0, 0}, // + {713, 0, 0, 8, 0, 0}, // + {713, 1, 9, 3, 1, -8}, // + {715, 1, 9, 3, 1, -8}, // + {717, 3, 8, 5, 1, -7}, // + {720, 6, 9, 7, 1, -5}, // + {727, 0, 0, 8, 0, 0}, // + {727, 0, 0, 8, 0, 0}, // + {727, 6, 9, 7, 0, -8}, // + {734, 9, 9, 11, 1, -8}, // + {745, 6, 6, 6, 0, -5}, // + {750, 0, 0, 8, 0, 0}, // + {750, 0, 0, 8, 0, 0}, // + {750, 6, 9, 8, 1, -8}, // + {757, 6, 6, 6, 0, -5}, // + {762, 3, 9, 3, 0, -8}, // + {766, 8, 9, 8, 0, -8}, // + {775, 6, 9, 8, 1, -8}, // + {782, 6, 9, 8, 1, -8}, // + {789, 6, 9, 7, 1, -8}, // + {796, 9, 11, 10, 0, -8}, // + {809, 6, 9, 8, 1, -8}, // + {816, 9, 9, 11, 1, -8}, // + {827, 6, 9, 8, 1, -8}, // + {834, 7, 9, 9, 1, -8}, // + {842, 7, 11, 9, 1, -10}, // + {852, 6, 9, 8, 1, -8}, // + {859, 7, 9, 8, 0, -8}, // + {867, 8, 9, 10, 1, -8}, // + {876, 7, 9, 9, 1, -8}, // + {884, 8, 9, 10, 1, -8}, // + {893, 7, 9, 9, 1, -8}, // + {901, 6, 9, 8, 1, -8}, // + {908, 7, 9, 9, 1, -8}, // + {916, 7, 9, 7, 0, -8}, // + {924, 7, 9, 7, 0, -8}, // + {932, 9, 9, 10, 1, -8}, // + {943, 6, 9, 8, 1, -8}, // + {950, 8, 11, 9, 1, -8}, // + {961, 6, 9, 8, 1, -8}, // + {968, 8, 9, 10, 1, -8}, // + {977, 9, 11, 10, 1, -8}, // + {990, 10, 9, 10, 0, -8}, // + {1002, 9, 9, 10, 1, -8}, // + {1013, 6, 9, 8, 1, -8}, // + {1020, 7, 9, 9, 1, -8}, // + {1028, 10, 9, 12, 1, -8}, // + {1040, 6, 9, 8, 1, -8}, // + {1047, 6, 6, 7, 0, -5}, // + {1052, 6, 9, 7, 0, -8}, // + {1059, 5, 6, 6, 1, -5}, // + {1063, 4, 6, 5, 1, -5}, // + {1066, 7, 7, 7, 0, -5}, // + {1073, 6, 6, 7, 0, -5}, // + {1078, 8, 6, 9, 1, -5}, // + {1084, 6, 6, 6, 0, -5}, // + {1089, 5, 6, 7, 1, -5}, // + {1093, 5, 8, 7, 1, -7}, // + {1098, 4, 6, 6, 1, -5}, // + {1101, 5, 6, 6, 0, -5}, // + {1105, 6, 6, 7, 1, -5}, // + {1110, 5, 6, 7, 1, -5}, // + {1114, 6, 6, 7, 0, -5}, // + {1119, 5, 6, 7, 1, -5}, // + {1123, 5, 9, 7, 1, -5}, // + {1129, 6, 6, 6, 0, -5}, // + {1134, 5, 6, 5, 0, -5}, // + {1138, 5, 9, 6, 0, -5}, // + {1144, 10, 11, 10, 0, -7}, // + {1158, 5, 6, 6, 0, -5}, // + {1162, 6, 7, 7, 1, -5}, // + {1168, 4, 6, 6, 1, -5}, // + {1171, 6, 6, 8, 1, -5}, // + {1176, 7, 7, 9, 1, -5}, // + {1183, 7, 6, 8, 0, -5}, // + {1189, 6, 6, 8, 1, -5}, // + {1194, 5, 6, 6, 1, -5}, // + {1198, 5, 6, 6, 1, -5}, // + {1202, 8, 6, 9, 1, -5}, // + {1208, 5, 6, 7, 1, -5} // +}; + +const GFXfont FreeSans6pt8bCyrillic PROGMEM = {(uint8_t *)FreeSans6pt8bCyrillicBitmaps, (GFXglyph *)FreeSans6pt8bCyrillicGlyphs, + 0x20, 0xFF, 16}; diff --git a/src/graphics/niche/Fonts/FreeSans6pt_Win1250.h b/src/graphics/niche/Fonts/FreeSans6pt_Win1250.h deleted file mode 100644 index aee7777835..0000000000 --- a/src/graphics/niche/Fonts/FreeSans6pt_Win1250.h +++ /dev/null @@ -1,457 +0,0 @@ -#pragma once -const uint8_t FreeSans6pt_Win1250Bitmaps[] PROGMEM = { - /* ' ' 0x20 */ - 0xFC, 0x80, /* '!' 0x21 */ - 0xB6, 0x80, /* '"' 0x22 */ - 0x24, 0x51, 0xF9, 0x42, 0x9F, 0x92, 0x28, /* '#' 0x23 */ - 0x10, 0xE5, 0x55, 0x50, 0xE1, 0x65, 0x55, 0xE1, 0x00, /* '$' 0x24 */ - 0x71, 0x24, 0x89, 0x22, 0x50, 0x74, 0x02, 0x70, 0xA4, 0x49, 0x11, 0xC0, /* '%' 0x25 */ - 0x71, 0x24, 0x9C, 0x62, 0x58, 0xA7, 0xF4, /* '&' 0x26 */ - 0xE0, /* ''' 0x27 */ - 0x5A, 0xAA, 0x94, /* '(' 0x28 */ - 0x89, 0x12, 0x49, 0x29, 0x00, /* ')' 0x29 */ - 0x5E, 0x80, /* '*' 0x2A */ - 0x21, 0x3E, 0x42, 0x00, /* '+' 0x2B */ - 0xE0, /* ',' 0x2C */ - 0xC0, /* '-' 0x2D */ - 0x80, /* '.' 0x2E */ - 0x24, 0xA4, 0xA4, 0x80, /* '/' 0x2F */ - 0x76, 0xE3, 0x18, 0xC6, 0x3B, 0x70, /* '0' 0x30 */ - 0x27, 0x92, 0x49, 0x20, /* '1' 0x31 */ - 0x79, 0x10, 0x41, 0x08, 0xC6, 0x10, 0xFC, /* '2' 0x32 */ - 0x79, 0x30, 0x43, 0x18, 0x10, 0x71, 0x78, /* '3' 0x33 */ - 0x08, 0x61, 0x8A, 0x49, 0x2F, 0xC2, 0x08, /* '4' 0x34 */ - 0xFC, 0x21, 0xE8, 0x84, 0x31, 0xF0, /* '5' 0x35 */ - 0x74, 0x61, 0xE8, 0xC6, 0x31, 0x70, /* '6' 0x36 */ - 0xF8, 0x44, 0x22, 0x11, 0x08, 0x40, /* '7' 0x37 */ - 0x39, 0x34, 0x53, 0x39, 0x1C, 0x51, 0x38, /* '8' 0x38 */ - 0x39, 0x3C, 0x71, 0x4C, 0xF0, 0x53, 0x78, /* '9' 0x39 */ - 0x82, /* ':' 0x3A */ - 0x87, /* ';' 0x3B */ - 0x3E, 0x30, 0x60, 0x80, /* '<' 0x3C */ - 0xF8, 0x3E, /* '=' 0x3D */ - 0xE0, 0xC6, 0xC8, 0x00, /* '>' 0x3E */ - 0x74, 0x42, 0x11, 0x10, 0x80, 0x20, /* '?' 0x3F */ - 0x0F, 0x86, 0x19, 0x9A, 0xA4, 0xD9, 0x13, 0x22, 0x56, 0xDA, 0x6E, 0x60, 0x06, 0x00, 0x3C, 0x00, /* '@' 0x40 */ - 0x18, 0x18, 0x24, 0x24, 0x24, 0x7E, 0x42, 0x42, 0xC3, /* 'A' 0x41 */ - 0xFA, 0x18, 0x61, 0xFA, 0x18, 0x61, 0xFC, /* 'B' 0x42 */ - 0x3E, 0x63, 0x40, 0x40, 0xC0, 0x40, 0x41, 0x63, 0x3E, /* 'C' 0x43 */ - 0xF9, 0x0A, 0x1C, 0x18, 0x30, 0x61, 0xC2, 0xF8, /* 'D' 0x44 */ - 0xFE, 0x08, 0x20, 0xFE, 0x08, 0x20, 0xFC, /* 'E' 0x45 */ - 0xFE, 0x08, 0x20, 0xFA, 0x08, 0x20, 0x80, /* 'F' 0x46 */ - 0x1E, 0x61, 0x40, 0x40, 0xC7, 0x41, 0x41, 0x63, 0x1D, /* 'G' 0x47 */ - 0x83, 0x06, 0x0C, 0x1F, 0xF0, 0x60, 0xC1, 0x82, /* 'H' 0x48 */ - 0xFF, 0x80, /* 'I' 0x49 */ - 0x08, 0x42, 0x10, 0x87, 0x29, 0x70, /* 'J' 0x4A */ - 0x85, 0x12, 0x45, 0x0D, 0x13, 0x22, 0x42, 0x86, /* 'K' 0x4B */ - 0x84, 0x21, 0x08, 0x42, 0x10, 0xF8, /* 'L' 0x4C */ - 0xC3, 0xC3, 0xC3, 0xA5, 0xA5, 0xA5, 0x99, 0x99, 0x99, /* 'M' 0x4D */ - 0x83, 0x86, 0x8D, 0x19, 0x33, 0x62, 0xC3, 0x86, /* 'N' 0x4E */ - 0x1E, 0x31, 0x90, 0x68, 0x1C, 0x0A, 0x05, 0x06, 0xC6, 0x1E, 0x00, /* 'O' 0x4F */ - 0xFA, 0x18, 0x61, 0xFA, 0x08, 0x20, 0x80, /* 'P' 0x50 */ - 0x1E, 0x31, 0x90, 0x68, 0x1C, 0x0A, 0x05, 0x16, 0xC6, 0x1F, 0x00, 0x40, /* 'Q' 0x51 */ - 0xFD, 0x0E, 0x1C, 0x2F, 0x90, 0xA1, 0x42, 0x86, /* 'R' 0x52 */ - 0x7A, 0x18, 0x30, 0x78, 0x38, 0x61, 0x78, /* 'S' 0x53 */ - 0xFE, 0x20, 0x40, 0x81, 0x02, 0x04, 0x08, 0x10, /* 'T' 0x54 */ - 0x83, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xE2, 0x78, /* 'U' 0x55 */ - 0xC2, 0x85, 0x0B, 0x22, 0x44, 0x8E, 0x0C, 0x18, /* 'V' 0x56 */ - 0xC4, 0x28, 0xCD, 0x29, 0x25, 0x24, 0xA4, 0x52, 0x8C, 0x61, 0x8C, 0x31, 0x80, /* 'W' 0x57 */ - 0x87, 0x34, 0x8C, 0x30, 0xC4, 0xA3, 0x84, /* 'X' 0x58 */ - 0xC3, 0x42, 0x24, 0x34, 0x18, 0x08, 0x08, 0x08, 0x08, /* 'Y' 0x59 */ - 0x7E, 0x0C, 0x30, 0x41, 0x06, 0x18, 0x20, 0xFE, /* 'Z' 0x5A */ - 0xEA, 0xAA, 0xAB, /* '[' 0x5B */ - 0x92, 0x24, 0x89, 0x20, /* '\' 0x5C */ - 0xD5, 0x55, 0x57, /* ']' 0x5D */ - 0x46, 0xA9, /* '^' 0x5E */ - 0xFE, /* '_' 0x5F */ - 0x80, /* '`' 0x60 */ - 0x79, 0x20, 0x4F, 0xC6, 0x37, 0x40, /* 'a' 0x61 */ - 0x84, 0x3D, 0x18, 0xC6, 0x31, 0xF0, /* 'b' 0x62 */ - 0x39, 0x3C, 0x20, 0xC1, 0x33, 0x80, /* 'c' 0x63 */ - 0x04, 0x13, 0xD3, 0xC6, 0x1C, 0x53, 0x3C, /* 'd' 0x64 */ - 0x39, 0x38, 0x7F, 0x81, 0x13, 0x80, /* 'e' 0x65 */ - 0x6B, 0xA4, 0x92, 0x40, /* 'f' 0x66 */ - 0x35, 0x3C, 0x61, 0xC5, 0x33, 0x41, 0x4D, 0xE0, /* 'g' 0x67 */ - 0x84, 0x3D, 0x38, 0xC6, 0x31, 0x88, /* 'h' 0x68 */ - 0xBF, 0x80, /* 'i' 0x69 */ - 0x45, 0x55, 0x57, /* 'j' 0x6A */ - 0x84, 0x25, 0x4E, 0x52, 0xD2, 0x88, /* 'k' 0x6B */ - 0xFF, 0x80, /* 'l' 0x6C */ - 0xF7, 0x99, 0x91, 0x91, 0x91, 0x91, 0x91, /* 'm' 0x6D */ - 0xF4, 0x63, 0x18, 0xC6, 0x20, /* 'n' 0x6E */ - 0x39, 0x3C, 0x61, 0xC5, 0x33, 0x80, /* 'o' 0x6F */ - 0xF4, 0x63, 0x18, 0xC7, 0xD0, 0x80, /* 'p' 0x70 */ - 0x3D, 0x3C, 0x61, 0xC5, 0x37, 0x41, 0x04, /* 'q' 0x71 */ - 0xF2, 0x49, 0x20, /* 'r' 0x72 */ - 0x7A, 0x50, 0xE0, 0xE5, 0xE0, /* 's' 0x73 */ - 0x5D, 0x24, 0x93, /* 't' 0x74 */ - 0x8C, 0x63, 0x18, 0xCF, 0xA0, /* 'u' 0x75 */ - 0x85, 0x24, 0x92, 0x30, 0xC3, 0x00, /* 'v' 0x76 */ - 0x89, 0x59, 0x59, 0x55, 0x56, 0x26, 0x26, /* 'w' 0x77 */ - 0x4A, 0x4C, 0x43, 0x27, 0x20, /* 'x' 0x78 */ - 0x8A, 0x52, 0xA5, 0x18, 0x84, 0x22, 0x00, /* 'y' 0x79 */ - 0x78, 0x44, 0x46, 0x23, 0xE0, /* 'z' 0x7A */ - 0x6A, 0xAA, 0xA9, /* '{' 0x7B */ - 0xFF, 0xE0, /* '|' 0x7C */ - 0x95, 0x55, 0x56, /* '}' 0x7D */ - 0x66, 0x60, /* '~' 0x7E */ - 0xFF, 0xC0, 0x67, 0x34, 0x58, 0x4C, 0x46, 0x03, 0x11, 0x80, 0xFF, 0xC0, /* 0x7F */ - 0x1C, 0x45, 0x07, 0xE4, 0x1F, 0x10, 0x10, 0x1E, /* 0x80 */ - /* 0x81 */ - 0xE0, /* 0x82 */ - /* 0x83 */ - 0xB6, 0x80, /* 0x84 */ - 0xA8, /* 0x85 */ - 0x21, 0x09, 0xF2, 0x10, 0x84, 0x21, 0x08, /* 0x86 */ - 0x21, 0x09, 0xF2, 0x10, 0x84, 0xF9, 0x08, /* 0x87 */ - /* 0x88 */ - 0x62, 0x09, 0x40, 0x98, 0x06, 0x80, 0x10, 0x01, 0x66, 0x29, 0x92, 0x99, 0x06, 0x60, /* 0x89 */ - 0x28, 0x47, 0xA1, 0x83, 0x07, 0x83, 0x87, 0x17, 0x80, /* 0x8A */ - 0x64, /* 0x8B */ - 0x10, 0x87, 0xA1, 0x83, 0x07, 0x83, 0x87, 0x17, 0x80, /* 0x8C */ - 0x28, 0x4F, 0xC4, 0x10, 0x41, 0x04, 0x10, 0x40, /* 0x8D */ - 0x14, 0x11, 0xF8, 0x30, 0xC1, 0x04, 0x18, 0x61, 0xFC, /* 0x8E */ - 0x08, 0x21, 0xF8, 0x30, 0xC1, 0x04, 0x18, 0x61, 0xFC, /* 0x8F */ - /* 0x90 */ - 0xE0, /* 0x91 */ - 0xE0, /* 0x92 */ - 0xB6, 0x80, /* 0x93 */ - 0xB6, 0x80, /* 0x94 */ - 0xFF, 0x80, /* 0x95 */ - 0xFC, /* 0x96 */ - 0xFF, 0xF0, /* 0x97 */ - /* 0x98 */ - 0xE6, 0x28, 0xCD, 0x19, 0xA3, 0x34, 0x6A, 0x8B, 0x51, 0x68, /* 0x99 */ - 0x52, 0x69, 0x8E, 0x19, 0x60, /* 0x9A */ - 0x98, /* 0x9B */ - 0x24, 0x06, 0x98, 0xE1, 0x96, /* 0x9C */ - 0x15, 0xE4, 0x44, 0x44, 0x60, /* 0x9D */ - 0x51, 0x00, 0xF0, 0x88, 0x8C, 0x47, 0xC0, /* 0x9E */ - 0x11, 0x00, 0xF0, 0x88, 0x8C, 0x47, 0xC0, /* 0x9F */ - /* 0xA0 */ - 0xA8, /* 0xA1 */ - 0x96, /* 0xA2 */ - 0x41, 0x05, 0x18, 0x43, 0x04, 0x10, 0x7C, /* 0xA3 */ - 0xFC, 0x63, 0xF0, /* 0xA4 */ - 0x30, 0x38, 0x28, 0x48, 0x4C, 0x7C, 0x84, 0x86, 0x82, 0x04, 0x07, /* 0xA5 */ - 0xF9, 0xF0, /* 0xA6 */ - 0x32, 0x91, 0xC9, 0x47, 0x26, 0x14, 0xA4, 0xC0, /* 0xA7 */ - 0xA0, /* 0xA8 */ - 0x3E, 0x3F, 0xB8, 0xF4, 0x1A, 0x0D, 0x17, 0x76, 0xC6, 0x3E, 0x00, /* 0xA9 */ - 0x7A, 0x18, 0x30, 0x78, 0x38, 0x61, 0x78, 0xC1, 0x0C, /* 0xAA */ - 0x5A, 0xA5, /* 0xAB */ - 0xFC, 0x10, 0x40, /* 0xAC */ - /* 0xAD */ - 0x3E, 0x31, 0xB7, 0x72, 0x99, 0xCC, 0xC7, 0x56, 0xC6, 0x3E, 0x00, /* 0xAE */ - 0x18, 0x31, 0xF8, 0x30, 0xC1, 0x04, 0x18, 0x61, 0xFC, /* 0xAF */ - 0x69, 0x96, /* 0xB0 */ - 0x21, 0x3E, 0x42, 0x03, 0xE0, /* 0xB1 */ - 0x9C, /* 0xB2 */ - 0x49, 0x35, 0x92, 0x40, /* 0xB3 */ - 0x80, /* 0xB4 */ - 0x8A, 0x28, 0xA2, 0x8A, 0x6E, 0xE0, 0x80, /* 0xB5 */ - 0x7F, 0xAE, 0xBA, 0x68, 0xA2, 0x8A, 0x28, 0xA0, /* 0xB6 */ - 0x80, /* 0xB7 */ - 0x67, 0x80, /* 0xB8 */ - 0x78, 0x84, 0x04, 0x3C, 0xC4, 0x8C, 0x76, 0x04, 0x07, /* 0xB9 */ - 0x69, 0x8E, 0x19, 0x66, 0x26, /* 0xBA */ - 0xA5, 0x5A, /* 0xBB */ - 0xA5, 0x21, 0x08, 0x42, 0x10, 0xF8, /* 0xBC */ - 0xA0, /* 0xBD */ - 0xBA, 0x49, 0x24, 0x90, /* 0xBE */ - 0x31, 0x9E, 0x11, 0x11, 0x88, 0xF8, /* 0xBF */ - 0x10, 0x43, 0xE4, 0x28, 0x50, 0xBE, 0x42, 0x85, 0x0C, /* 0xC0 */ - 0x08, 0x10, 0x00, 0x18, 0x3C, 0x24, 0x24, 0x7E, 0x42, 0xC3, /* 0xC1 */ - 0x18, 0x24, 0x00, 0x18, 0x3C, 0x24, 0x24, 0x7E, 0x42, 0xC3, /* 0xC2 */ - 0x24, 0x18, 0x00, 0x18, 0x3C, 0x24, 0x24, 0x7E, 0x42, 0xC3, /* 0xC3 */ - 0x24, 0x00, 0x18, 0x3C, 0x24, 0x24, 0x7E, 0x42, 0x42, 0xC3, /* 0xC4 */ - 0x11, 0x21, 0x08, 0x42, 0x10, 0x87, 0xC0, /* 0xC5 */ - 0x08, 0x20, 0x01, 0xE4, 0x30, 0x20, 0x40, 0x82, 0x8C, 0xF0, /* 0xC6 */ - 0x3E, 0x61, 0xC0, 0x80, 0x80, 0x80, 0xC1, 0x63, 0x3E, 0x0C, 0x04, 0x1C, /* 0xC7 */ - 0x28, 0x20, 0x01, 0xE4, 0x30, 0x20, 0x40, 0x82, 0x8C, 0xF0, /* 0xC8 */ - 0x08, 0x40, 0x3F, 0x82, 0x0F, 0xA0, 0x83, 0xF0, /* 0xC9 */ - 0xFD, 0x02, 0x04, 0x0F, 0xD0, 0x20, 0x40, 0xFC, 0x10, 0x38, /* 0xCA */ - 0x28, 0x0F, 0xE0, 0x83, 0xE8, 0x20, 0x83, 0xF0, /* 0xCB */ - 0x28, 0x40, 0x3F, 0x82, 0x0F, 0xA0, 0x82, 0x0F, 0xC0, /* 0xCC */ - 0x62, 0xAA, 0xA0, /* 0xCD */ - 0x54, 0x24, 0x92, 0x48, /* 0xCE */ - 0x50, 0x43, 0xE4, 0x28, 0x30, 0x60, 0xC1, 0x85, 0xF0, /* 0xCF */ - 0x7C, 0x42, 0x41, 0x41, 0xF1, 0x41, 0x41, 0x42, 0x7C, /* 0xD0 */ - 0x08, 0x23, 0x0F, 0x1B, 0x32, 0x66, 0xC7, 0x87, 0x04, /* 0xD1 */ - 0x28, 0x23, 0x0F, 0x1B, 0x32, 0x66, 0xC7, 0x87, 0x04, /* 0xD2 */ - 0x04, 0x04, 0x0F, 0x8C, 0x6C, 0x1C, 0x06, 0x03, 0x83, 0x63, 0x1F, 0x00, /* 0xD3 */ - 0x08, 0x0A, 0x00, 0x07, 0xC6, 0x36, 0x0E, 0x03, 0x01, 0xC1, 0xB1, 0x8F, 0x80, /* 0xD4 */ - 0x0A, 0x0A, 0x00, 0x07, 0xC6, 0x36, 0x0E, 0x03, 0x01, 0xC1, 0xB1, 0x8F, 0x80, /* 0xD5 */ - 0x14, 0x00, 0x00, 0x07, 0xC6, 0x36, 0x0E, 0x03, 0x01, 0xC1, 0xB1, 0x8F, 0x80, /* 0xD6 */ - 0x8A, 0x88, 0xA8, 0x80, /* 0xD7 */ - 0x50, 0x43, 0xE4, 0x28, 0x50, 0xBE, 0x42, 0x85, 0x0C, /* 0xD8 */ - 0x10, 0x52, 0x4C, 0x18, 0x30, 0x60, 0xC1, 0xC6, 0xF8, /* 0xD9 */ - 0x08, 0x22, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0xC6, 0xF8, /* 0xDA */ - 0x14, 0x52, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0xC6, 0xF8, /* 0xDB */ - 0x29, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0xC6, 0xF8, /* 0xDC */ - 0x09, 0x25, 0x12, 0x22, 0x87, 0x04, 0x08, 0x10, 0x20, /* 0xDD */ - 0xFC, 0x41, 0x04, 0x10, 0x41, 0x04, 0x10, 0x60, 0x8E, /* 0xDE */ - 0x7A, 0x18, 0x61, 0x8A, 0x18, 0x61, 0xB8, /* 0xDF */ - 0x42, 0xE9, 0x24, 0x80, /* 0xE0 */ - 0x10, 0x40, 0x03, 0xC8, 0x40, 0x8F, 0x62, 0x8C, 0xEC, /* 0xE1 */ - 0x10, 0x50, 0x03, 0xC8, 0x40, 0x8F, 0x62, 0x8C, 0xEC, /* 0xE2 */ - 0x48, 0x60, 0x03, 0xC8, 0x40, 0x8F, 0x62, 0x8C, 0xEC, /* 0xE3 */ - 0x28, 0x01, 0xE4, 0x20, 0x47, 0xB1, 0x46, 0x76, /* 0xE4 */ - 0x62, 0xAA, 0xA0, /* 0xE5 */ - 0x10, 0x80, 0x1E, 0xC6, 0x08, 0x20, 0xC5, 0xE0, /* 0xE6 */ - 0x7B, 0x18, 0x20, 0x83, 0x17, 0x8C, 0x11, 0xC0, /* 0xE7 */ - 0x28, 0x40, 0x1E, 0xC6, 0x08, 0x20, 0xC5, 0xE0, /* 0xE8 */ - 0x10, 0x80, 0x1E, 0xCE, 0x1F, 0xE0, 0xC5, 0xE0, /* 0xE9 */ - 0x7B, 0x38, 0x7F, 0x83, 0x37, 0x84, 0x1C, /* 0xEA */ - 0x28, 0x07, 0xB3, 0x87, 0xF8, 0x31, 0x78, /* 0xEB */ - 0x28, 0x40, 0x1E, 0xCE, 0x1F, 0xE0, 0xC5, 0xE0, /* 0xEC */ - 0x62, 0xAA, 0xA0, /* 0xED */ - 0x54, 0x24, 0x92, 0x48, /* 0xEE */ - 0x02, 0x0C, 0x13, 0xEC, 0xD0, 0xA1, 0x42, 0xCC, 0xE8, /* 0xEF */ - 0x04, 0x1D, 0xD6, 0x68, 0x50, 0xA1, 0x66, 0x74, /* 0xF0 */ - 0x11, 0x01, 0x6C, 0xC6, 0x31, 0x8C, 0x40, /* 0xF1 */ - 0x20, 0x81, 0x6C, 0xC6, 0x31, 0x8C, 0x40, /* 0xF2 */ - 0x10, 0x80, 0x1E, 0xCE, 0x18, 0x61, 0xCD, 0xE0, /* 0xF3 */ - 0x10, 0xA0, 0x1E, 0xCE, 0x18, 0x61, 0xCD, 0xE0, /* 0xF4 */ - 0x29, 0x40, 0x1E, 0xCE, 0x18, 0x61, 0xCD, 0xE0, /* 0xF5 */ - 0x28, 0x07, 0xB3, 0x86, 0x18, 0x73, 0x78, /* 0xF6 */ - 0x20, 0x3E, 0x02, 0x00, /* 0xF7 */ - 0xA8, 0x5D, 0x24, 0x90, /* 0xF8 */ - 0x22, 0x89, 0x18, 0xC6, 0x31, 0x9B, 0x40, /* 0xF9 */ - 0x11, 0x23, 0x18, 0xC6, 0x33, 0x68, /* 0xFA */ - 0x2A, 0x81, 0x18, 0xC6, 0x31, 0x9B, 0x40, /* 0xFB */ - 0x50, 0x23, 0x18, 0xC6, 0x33, 0x68, /* 0xFC */ - 0x10, 0x88, 0x52, 0x49, 0x23, 0x0C, 0x30, 0x82, 0x18, /* 0xFD */ - 0x4E, 0x44, 0x44, 0x46, 0x31, 0x70, /* 0xFE */ - 0x80, /* 0xFF */ -}; - -const GFXglyph FreeSans6pt_Win1250Glyphs[] PROGMEM = { - /* ' ' 0x20 */ {0, 0, 0, 3, 0, 0}, - /* '!' 0x21 */ {0, 1, 9, 4, 2, -8}, - /* '"' 0x22 */ {2, 3, 3, 4, 0, -8}, - /* '#' 0x23 */ {4, 7, 8, 7, 0, -7}, - /* '$' 0x24 */ {11, 6, 11, 7, 0, -9}, - /* '%' 0x25 */ {20, 10, 9, 11, 0, -8}, - /* '&' 0x26 */ {32, 6, 9, 8, 1, -8}, - /* ''' 0x27 */ {39, 1, 3, 2, 1, -8}, - /* '(' 0x28 */ {40, 2, 11, 4, 1, -8}, - /* ')' 0x29 */ {43, 3, 11, 4, 0, -8}, - /* '*' 0x2A */ {48, 3, 3, 5, 1, -8}, - /* '+' 0x2B */ {50, 5, 5, 7, 1, -4}, - /* ',' 0x2C */ {54, 1, 3, 3, 1, 0}, - /* '-' 0x2D */ {55, 2, 1, 4, 1, -3}, - /* '.' 0x2E */ {56, 1, 1, 3, 1, 0}, - /* '/' 0x2F */ {57, 3, 9, 3, 0, -8}, - /* '0' 0x30 */ {61, 5, 9, 7, 1, -8}, - /* '1' 0x31 */ {67, 3, 9, 7, 1, -8}, - /* '2' 0x32 */ {71, 6, 9, 7, 0, -8}, - /* '3' 0x33 */ {78, 6, 9, 7, 0, -8}, - /* '4' 0x34 */ {85, 6, 9, 7, 0, -8}, - /* '5' 0x35 */ {92, 5, 9, 7, 1, -8}, - /* '6' 0x36 */ {98, 5, 9, 7, 1, -8}, - /* '7' 0x37 */ {104, 5, 9, 7, 1, -8}, - /* '8' 0x38 */ {110, 6, 9, 7, 0, -8}, - /* '9' 0x39 */ {117, 6, 9, 7, 0, -8}, - /* ':' 0x3A */ {124, 1, 7, 3, 1, -6}, - /* ';' 0x3B */ {125, 1, 8, 3, 1, -5}, - /* '<' 0x3C */ {126, 5, 5, 7, 1, -4}, - /* '=' 0x3D */ {130, 5, 3, 7, 1, -3}, - /* '>' 0x3E */ {132, 5, 5, 7, 1, -4}, - /* '?' 0x3F */ {136, 5, 9, 7, 1, -8}, - /* '@' 0x40 */ {142, 11, 11, 12, 0, -8}, - /* 'A' 0x41 */ {158, 8, 9, 8, 0, -8}, - /* 'B' 0x42 */ {167, 6, 9, 8, 1, -8}, - /* 'C' 0x43 */ {174, 8, 9, 9, 0, -8}, - /* 'D' 0x44 */ {183, 7, 9, 8, 1, -8}, - /* 'E' 0x45 */ {191, 6, 9, 8, 1, -8}, - /* 'F' 0x46 */ {198, 6, 9, 7, 1, -8}, - /* 'G' 0x47 */ {205, 8, 9, 9, 0, -8}, - /* 'H' 0x48 */ {214, 7, 9, 9, 1, -8}, - /* 'I' 0x49 */ {222, 1, 9, 3, 1, -8}, - /* 'J' 0x4A */ {224, 5, 9, 6, 0, -8}, - /* 'K' 0x4B */ {230, 7, 9, 8, 1, -8}, - /* 'L' 0x4C */ {238, 5, 9, 7, 1, -8}, - /* 'M' 0x4D */ {244, 8, 9, 10, 1, -8}, - /* 'N' 0x4E */ {253, 7, 9, 9, 1, -8}, - /* 'O' 0x4F */ {261, 9, 9, 9, 0, -8}, - /* 'P' 0x50 */ {272, 6, 9, 8, 1, -8}, - /* 'Q' 0x51 */ {279, 9, 10, 9, 0, -8}, - /* 'R' 0x52 */ {291, 7, 9, 9, 1, -8}, - /* 'S' 0x53 */ {299, 6, 9, 8, 1, -8}, - /* 'T' 0x54 */ {306, 7, 9, 8, 0, -8}, - /* 'U' 0x55 */ {314, 7, 9, 9, 1, -8}, - /* 'V' 0x56 */ {322, 7, 9, 8, 0, -8}, - /* 'W' 0x57 */ {330, 11, 9, 11, 0, -8}, - /* 'X' 0x58 */ {343, 6, 9, 8, 1, -8}, - /* 'Y' 0x59 */ {350, 8, 9, 8, 0, -8}, - /* 'Z' 0x5A */ {359, 7, 9, 7, 0, -8}, - /* '[' 0x5B */ {367, 2, 12, 3, 1, -8}, - /* '\' 0x5C */ {370, 3, 9, 3, 0, -8}, - /* ']' 0x5D */ {374, 2, 12, 3, 0, -8}, - /* '^' 0x5E */ {377, 4, 4, 6, 1, -8}, - /* '_' 0x5F */ {379, 7, 1, 7, 0, 2}, - /* '`' 0x60 */ {380, 1, 1, 3, 1, -8}, - /* 'a' 0x61 */ {381, 6, 7, 7, 0, -6}, - /* 'b' 0x62 */ {387, 5, 9, 7, 1, -8}, - /* 'c' 0x63 */ {393, 6, 7, 6, 0, -6}, - /* 'd' 0x64 */ {399, 6, 9, 7, 0, -8}, - /* 'e' 0x65 */ {406, 6, 7, 6, 0, -6}, - /* 'f' 0x66 */ {412, 3, 9, 3, 0, -8}, - /* 'g' 0x67 */ {416, 6, 10, 7, 0, -6}, - /* 'h' 0x68 */ {424, 5, 9, 6, 1, -8}, - /* 'i' 0x69 */ {430, 1, 9, 3, 1, -8}, - /* 'j' 0x6A */ {432, 2, 12, 3, 0, -8}, - /* 'k' 0x6B */ {435, 5, 9, 6, 1, -8}, - /* 'l' 0x6C */ {441, 1, 9, 3, 1, -8}, - /* 'm' 0x6D */ {443, 8, 7, 10, 1, -6}, - /* 'n' 0x6E */ {450, 5, 7, 6, 1, -6}, - /* 'o' 0x6F */ {455, 6, 7, 6, 0, -6}, - /* 'p' 0x70 */ {461, 5, 9, 7, 1, -6}, - /* 'q' 0x71 */ {467, 6, 9, 7, 0, -6}, - /* 'r' 0x72 */ {474, 3, 7, 4, 1, -6}, - /* 's' 0x73 */ {477, 5, 7, 6, 0, -6}, - /* 't' 0x74 */ {482, 3, 8, 3, 0, -7}, - /* 'u' 0x75 */ {485, 5, 7, 6, 1, -6}, - /* 'v' 0x76 */ {490, 6, 7, 6, 0, -6}, - /* 'w' 0x77 */ {496, 8, 7, 9, 0, -6}, - /* 'x' 0x78 */ {503, 5, 7, 6, 0, -6}, - /* 'y' 0x79 */ {508, 5, 10, 6, 0, -6}, - /* 'z' 0x7A */ {515, 5, 7, 6, 0, -6}, - /* '{' 0x7B */ {520, 2, 12, 4, 1, -8}, - /* '|' 0x7C */ {523, 1, 11, 3, 1, -8}, - /* '}' 0x7D */ {525, 2, 12, 4, 1, -8}, - /* '~' 0x7E */ {528, 6, 2, 6, 0, -4}, - /* 0x7F */ {530, 9, 10, 11, 1, -8}, - /* 0x80 */ {542, 7, 9, 8, 0, -8}, - /* 0x81 */ {550, 0, 0, 8, 0, 0}, - /* 0x82 */ {550, 1, 3, 3, 1, 0}, - /* 0x83 */ {551, 0, 0, 8, 0, 0}, - /* 0x84 */ {551, 3, 3, 5, 1, 0}, - /* 0x85 */ {553, 5, 1, 7, 1, 0}, - /* 0x86 */ {554, 5, 11, 7, 1, -8}, - /* 0x87 */ {561, 5, 11, 7, 1, -8}, - /* 0x88 */ {568, 0, 0, 8, 0, 0}, - /* 0x89 */ {568, 12, 9, 12, 0, -8}, - /* 0x8A */ {582, 6, 11, 8, 1, -9}, - /* 0x8B */ {591, 2, 3, 4, 1, -4}, - /* 0x8C */ {592, 6, 11, 8, 1, -10}, - /* 0x8D */ {601, 6, 10, 8, 0, -9}, - /* 0x8E */ {609, 7, 10, 7, 0, -9}, - /* 0x8F */ {618, 7, 10, 7, 0, -9}, - /* 0x90 */ {627, 0, 0, 8, 0, 0}, - /* 0x91 */ {627, 1, 3, 3, 1, -8}, - /* 0x92 */ {628, 1, 3, 2, 1, -8}, - /* 0x93 */ {629, 3, 3, 5, 1, -8}, - /* 0x94 */ {631, 3, 3, 5, 1, -8}, - /* 0x95 */ {633, 3, 3, 5, 1, -5}, - /* 0x96 */ {635, 6, 1, 6, 0, -3}, - /* 0x97 */ {636, 12, 1, 12, 0, -3}, - /* 0x98 */ {638, 0, 0, 8, 0, 0}, - /* 0x99 */ {638, 11, 7, 12, 1, -8}, - /* 0x9A */ {648, 4, 9, 6, 1, -8}, - /* 0x9B */ {653, 2, 3, 3, 1, -4}, - /* 0x9C */ {654, 4, 10, 6, 1, -9}, - /* 0x9D */ {659, 4, 9, 5, 0, -8}, - /* 0x9E */ {664, 5, 10, 6, 0, -9}, - /* 0x9F */ {671, 5, 10, 6, 0, -9}, - /* 0xA0 */ {678, 0, 0, 3, 0, 0}, - /* 0xA1 */ {678, 3, 2, 4, 0, -8}, - /* 0xA2 */ {679, 4, 2, 4, 0, -8}, - /* 0xA3 */ {680, 6, 9, 7, 0, -8}, - /* 0xA4 */ {687, 5, 4, 7, 1, -5}, - /* 0xA5 */ {690, 8, 11, 8, 1, -8}, - /* 0xA6 */ {701, 1, 12, 3, 1, -8}, - /* 0xA7 */ {703, 5, 12, 7, 1, -8}, - /* 0xA8 */ {711, 3, 1, 4, 0, -7}, - /* 0xA9 */ {712, 9, 9, 10, 0, -8}, - /* 0xAA */ {723, 6, 12, 8, 1, -8}, - /* 0xAB */ {732, 4, 4, 6, 1, -4}, - /* 0xAC */ {734, 6, 3, 7, 1, -4}, - /* 0xAD */ {737, 0, 0, 0, 0, 0}, - /* 0xAE */ {737, 9, 9, 10, 0, -8}, - /* 0xAF */ {748, 7, 10, 7, 0, -9}, - /* 0xB0 */ {757, 4, 4, 7, 2, -8}, - /* 0xB1 */ {759, 5, 7, 7, 1, -6}, - /* 0xB2 */ {764, 3, 2, 4, 1, 1}, - /* 0xB3 */ {765, 3, 9, 3, 0, -8}, - /* 0xB4 */ {769, 1, 1, 4, 1, -8}, - /* 0xB5 */ {770, 6, 9, 7, 1, -6}, - /* 0xB6 */ {777, 6, 10, 6, 1, -8}, - /* 0xB7 */ {785, 1, 1, 3, 1, -2}, - /* 0xB8 */ {786, 3, 3, 4, 1, 1}, - /* 0xB9 */ {788, 8, 9, 7, 0, -6}, - /* 0xBA */ {797, 4, 10, 6, 1, -6}, - /* 0xBB */ {802, 4, 4, 6, 1, -5}, - /* 0xBC */ {804, 5, 9, 7, 1, -8}, - /* 0xBD */ {810, 3, 1, 4, 0, -8}, - /* 0xBE */ {811, 3, 10, 3, 1, -9}, - /* 0xBF */ {815, 5, 9, 6, 0, -8}, - /* 0xC0 */ {821, 7, 10, 9, 1, -9}, - /* 0xC1 */ {830, 8, 10, 8, 0, -9}, - /* 0xC2 */ {840, 8, 10, 8, 0, -9}, - /* 0xC3 */ {850, 8, 10, 8, 0, -9}, - /* 0xC4 */ {860, 8, 10, 8, 0, -9}, - /* 0xC5 */ {870, 5, 10, 7, 1, -9}, - /* 0xC6 */ {877, 7, 11, 9, 0, -10}, - /* 0xC7 */ {887, 8, 12, 9, 0, -8}, - /* 0xC8 */ {899, 7, 11, 9, 0, -10}, - /* 0xC9 */ {909, 6, 10, 8, 1, -9}, - /* 0xCA */ {917, 7, 11, 8, 1, -8}, - /* 0xCB */ {927, 6, 10, 8, 1, -9}, - /* 0xCC */ {935, 6, 11, 8, 1, -10}, - /* 0xCD */ {944, 2, 10, 3, 1, -9}, - /* 0xCE */ {947, 3, 10, 4, 0, -9}, - /* 0xCF */ {951, 7, 10, 8, 1, -9}, - /* 0xD0 */ {960, 8, 9, 8, 0, -8}, - /* 0xD1 */ {969, 7, 10, 9, 1, -9}, - /* 0xD2 */ {978, 7, 10, 9, 1, -9}, - /* 0xD3 */ {987, 9, 10, 9, 0, -9}, - /* 0xD4 */ {999, 9, 11, 9, 0, -10}, - /* 0xD5 */ {1012, 9, 11, 9, 0, -10}, - /* 0xD6 */ {1025, 9, 11, 9, 0, -10}, - /* 0xD7 */ {1038, 5, 5, 7, 1, -5}, - /* 0xD8 */ {1042, 7, 10, 9, 1, -9}, - /* 0xD9 */ {1051, 7, 10, 9, 1, -9}, - /* 0xDA */ {1060, 7, 10, 9, 1, -9}, - /* 0xDB */ {1069, 7, 10, 9, 1, -9}, - /* 0xDC */ {1078, 7, 10, 9, 1, -9}, - /* 0xDD */ {1087, 7, 10, 8, 1, -9}, - /* 0xDE */ {1096, 6, 12, 7, 0, -8}, - /* 0xDF */ {1105, 6, 9, 7, 1, -8}, - /* 0xE0 */ {1112, 3, 9, 4, 1, -8}, - /* 0xE1 */ {1116, 7, 10, 7, 0, -9}, - /* 0xE2 */ {1125, 7, 10, 7, 0, -9}, - /* 0xE3 */ {1134, 7, 10, 7, 0, -9}, - /* 0xE4 */ {1143, 7, 9, 7, 0, -8}, - /* 0xE5 */ {1151, 2, 10, 3, 1, -9}, - /* 0xE6 */ {1154, 6, 10, 6, 0, -9}, - /* 0xE7 */ {1162, 6, 10, 6, 0, -6}, - /* 0xE8 */ {1170, 6, 10, 6, 0, -9}, - /* 0xE9 */ {1178, 6, 10, 6, 0, -9}, - /* 0xEA */ {1186, 6, 9, 6, 0, -6}, - /* 0xEB */ {1193, 6, 9, 6, 0, -8}, - /* 0xEC */ {1200, 6, 10, 6, 0, -9}, - /* 0xED */ {1208, 2, 10, 3, 1, -9}, - /* 0xEE */ {1211, 3, 10, 3, 0, -9}, - /* 0xEF */ {1215, 7, 10, 7, 0, -9}, - /* 0xF0 */ {1224, 7, 9, 7, 0, -8}, - /* 0xF1 */ {1232, 5, 10, 6, 1, -9}, - /* 0xF2 */ {1239, 5, 10, 6, 1, -9}, - /* 0xF3 */ {1246, 6, 10, 6, 0, -9}, - /* 0xF4 */ {1254, 6, 10, 6, 0, -9}, - /* 0xF5 */ {1262, 6, 10, 6, 0, -9}, - /* 0xF6 */ {1270, 6, 9, 6, 0, -8}, - /* 0xF7 */ {1277, 5, 5, 7, 1, -5}, - /* 0xF8 */ {1281, 3, 10, 4, 1, -9}, - /* 0xF9 */ {1285, 5, 10, 6, 1, -9}, - /* 0xFA */ {1292, 5, 9, 6, 1, -8}, - /* 0xFB */ {1298, 5, 10, 6, 1, -9}, - /* 0xFC */ {1305, 5, 9, 6, 1, -8}, - /* 0xFD */ {1311, 6, 12, 6, 0, -8}, - /* 0xFE */ {1320, 4, 11, 3, 0, -7}, - /* 0xFF */ {1326, 1, 1, 4, 1, -7}, -}; - -const GFXfont FreeSans6pt_Win1250 PROGMEM = {(uint8_t *)FreeSans6pt_Win1250Bitmaps, (GFXglyph *)FreeSans6pt_Win1250Glyphs, 0x20, - 0xFF, 14}; diff --git a/src/graphics/niche/Fonts/FreeSans6pt_Win1251.h b/src/graphics/niche/Fonts/FreeSans6pt_Win1251.h deleted file mode 100644 index 4d3ad1705f..0000000000 --- a/src/graphics/niche/Fonts/FreeSans6pt_Win1251.h +++ /dev/null @@ -1,457 +0,0 @@ -#pragma once -const uint8_t FreeSans6pt_Win1251Bitmaps[] PROGMEM = { - /* ' ' 0x20 */ - 0xFC, 0x80, /* '!' 0x21 */ - 0xB6, 0x80, /* '"' 0x22 */ - 0x24, 0x51, 0xF9, 0x42, 0x9F, 0x92, 0x28, /* '#' 0x23 */ - 0x10, 0xE5, 0x55, 0x50, 0xE1, 0x65, 0x55, 0xE1, 0x00, /* '$' 0x24 */ - 0x71, 0x24, 0x89, 0x22, 0x50, 0x74, 0x02, 0x70, 0xA4, 0x49, 0x11, 0xC0, /* '%' 0x25 */ - 0x71, 0x24, 0x9C, 0x62, 0x58, 0xA7, 0xF4, /* '&' 0x26 */ - 0xE0, /* ''' 0x27 */ - 0x5A, 0xAA, 0x94, /* '(' 0x28 */ - 0x89, 0x12, 0x49, 0x29, 0x00, /* ')' 0x29 */ - 0x5E, 0x80, /* '*' 0x2A */ - 0x21, 0x3E, 0x42, 0x00, /* '+' 0x2B */ - 0xE0, /* ',' 0x2C */ - 0xC0, /* '-' 0x2D */ - 0x80, /* '.' 0x2E */ - 0x24, 0xA4, 0xA4, 0x80, /* '/' 0x2F */ - 0x76, 0xE3, 0x18, 0xC6, 0x3B, 0x70, /* '0' 0x30 */ - 0x27, 0x92, 0x49, 0x20, /* '1' 0x31 */ - 0x79, 0x10, 0x41, 0x08, 0xC6, 0x10, 0xFC, /* '2' 0x32 */ - 0x79, 0x30, 0x43, 0x18, 0x10, 0x71, 0x78, /* '3' 0x33 */ - 0x08, 0x61, 0x8A, 0x49, 0x2F, 0xC2, 0x08, /* '4' 0x34 */ - 0xFC, 0x21, 0xE8, 0x84, 0x31, 0xF0, /* '5' 0x35 */ - 0x74, 0x61, 0xE8, 0xC6, 0x31, 0x70, /* '6' 0x36 */ - 0xF8, 0x44, 0x22, 0x11, 0x08, 0x40, /* '7' 0x37 */ - 0x39, 0x34, 0x53, 0x39, 0x1C, 0x51, 0x38, /* '8' 0x38 */ - 0x39, 0x3C, 0x71, 0x4C, 0xF0, 0x53, 0x78, /* '9' 0x39 */ - 0x82, /* ':' 0x3A */ - 0x87, /* ';' 0x3B */ - 0x3E, 0x30, 0x60, 0x80, /* '<' 0x3C */ - 0xF8, 0x3E, /* '=' 0x3D */ - 0xE0, 0xC6, 0xC8, 0x00, /* '>' 0x3E */ - 0x74, 0x42, 0x11, 0x10, 0x80, 0x20, /* '?' 0x3F */ - 0x0F, 0x86, 0x19, 0x9A, 0xA4, 0xD9, 0x13, 0x22, 0x56, 0xDA, 0x6E, 0x60, 0x06, 0x00, 0x3C, 0x00, /* '@' 0x40 */ - 0x18, 0x18, 0x24, 0x24, 0x24, 0x7E, 0x42, 0x42, 0xC3, /* 'A' 0x41 */ - 0xFA, 0x18, 0x61, 0xFA, 0x18, 0x61, 0xFC, /* 'B' 0x42 */ - 0x3E, 0x63, 0x40, 0x40, 0xC0, 0x40, 0x41, 0x63, 0x3E, /* 'C' 0x43 */ - 0xF9, 0x0A, 0x1C, 0x18, 0x30, 0x61, 0xC2, 0xF8, /* 'D' 0x44 */ - 0xFE, 0x08, 0x20, 0xFE, 0x08, 0x20, 0xFC, /* 'E' 0x45 */ - 0xFE, 0x08, 0x20, 0xFA, 0x08, 0x20, 0x80, /* 'F' 0x46 */ - 0x1E, 0x61, 0x40, 0x40, 0xC7, 0x41, 0x41, 0x63, 0x1D, /* 'G' 0x47 */ - 0x83, 0x06, 0x0C, 0x1F, 0xF0, 0x60, 0xC1, 0x82, /* 'H' 0x48 */ - 0xFF, 0x80, /* 'I' 0x49 */ - 0x08, 0x42, 0x10, 0x87, 0x29, 0x70, /* 'J' 0x4A */ - 0x85, 0x12, 0x45, 0x0D, 0x13, 0x22, 0x42, 0x86, /* 'K' 0x4B */ - 0x84, 0x21, 0x08, 0x42, 0x10, 0xF8, /* 'L' 0x4C */ - 0xC3, 0xC3, 0xC3, 0xA5, 0xA5, 0xA5, 0x99, 0x99, 0x99, /* 'M' 0x4D */ - 0x83, 0x86, 0x8D, 0x19, 0x33, 0x62, 0xC3, 0x86, /* 'N' 0x4E */ - 0x1E, 0x31, 0x90, 0x68, 0x1C, 0x0A, 0x05, 0x06, 0xC6, 0x1E, 0x00, /* 'O' 0x4F */ - 0xFA, 0x18, 0x61, 0xFA, 0x08, 0x20, 0x80, /* 'P' 0x50 */ - 0x1E, 0x31, 0x90, 0x68, 0x1C, 0x0A, 0x05, 0x16, 0xC6, 0x1F, 0x00, 0x40, /* 'Q' 0x51 */ - 0xFD, 0x0E, 0x1C, 0x2F, 0x90, 0xA1, 0x42, 0x86, /* 'R' 0x52 */ - 0x7A, 0x18, 0x30, 0x78, 0x38, 0x61, 0x78, /* 'S' 0x53 */ - 0xFE, 0x20, 0x40, 0x81, 0x02, 0x04, 0x08, 0x10, /* 'T' 0x54 */ - 0x83, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xE2, 0x78, /* 'U' 0x55 */ - 0xC2, 0x85, 0x0B, 0x22, 0x44, 0x8E, 0x0C, 0x18, /* 'V' 0x56 */ - 0xC4, 0x28, 0xCD, 0x29, 0x25, 0x24, 0xA4, 0x52, 0x8C, 0x61, 0x8C, 0x31, 0x80, /* 'W' 0x57 */ - 0x87, 0x34, 0x8C, 0x30, 0xC4, 0xA3, 0x84, /* 'X' 0x58 */ - 0xC3, 0x42, 0x24, 0x34, 0x18, 0x08, 0x08, 0x08, 0x08, /* 'Y' 0x59 */ - 0x7E, 0x0C, 0x30, 0x41, 0x06, 0x18, 0x20, 0xFE, /* 'Z' 0x5A */ - 0xEA, 0xAA, 0xAB, /* '[' 0x5B */ - 0x92, 0x24, 0x89, 0x20, /* '\' 0x5C */ - 0xD5, 0x55, 0x57, /* ']' 0x5D */ - 0x46, 0xA9, /* '^' 0x5E */ - 0xFE, /* '_' 0x5F */ - 0x80, /* '`' 0x60 */ - 0x79, 0x20, 0x4F, 0xC6, 0x37, 0x40, /* 'a' 0x61 */ - 0x84, 0x3D, 0x18, 0xC6, 0x31, 0xF0, /* 'b' 0x62 */ - 0x39, 0x3C, 0x20, 0xC1, 0x33, 0x80, /* 'c' 0x63 */ - 0x04, 0x13, 0xD3, 0xC6, 0x1C, 0x53, 0x3C, /* 'd' 0x64 */ - 0x39, 0x38, 0x7F, 0x81, 0x13, 0x80, /* 'e' 0x65 */ - 0x6B, 0xA4, 0x92, 0x40, /* 'f' 0x66 */ - 0x35, 0x3C, 0x61, 0xC5, 0x33, 0x41, 0x4D, 0xE0, /* 'g' 0x67 */ - 0x84, 0x3D, 0x38, 0xC6, 0x31, 0x88, /* 'h' 0x68 */ - 0xBF, 0x80, /* 'i' 0x69 */ - 0x45, 0x55, 0x57, /* 'j' 0x6A */ - 0x84, 0x25, 0x4E, 0x52, 0xD2, 0x88, /* 'k' 0x6B */ - 0xFF, 0x80, /* 'l' 0x6C */ - 0xF7, 0x99, 0x91, 0x91, 0x91, 0x91, 0x91, /* 'm' 0x6D */ - 0xF4, 0x63, 0x18, 0xC6, 0x20, /* 'n' 0x6E */ - 0x39, 0x3C, 0x61, 0xC5, 0x33, 0x80, /* 'o' 0x6F */ - 0xF4, 0x63, 0x18, 0xC7, 0xD0, 0x80, /* 'p' 0x70 */ - 0x3D, 0x3C, 0x61, 0xC5, 0x37, 0x41, 0x04, /* 'q' 0x71 */ - 0xF2, 0x49, 0x20, /* 'r' 0x72 */ - 0x7A, 0x50, 0xE0, 0xE5, 0xE0, /* 's' 0x73 */ - 0x5D, 0x24, 0x93, /* 't' 0x74 */ - 0x8C, 0x63, 0x18, 0xCF, 0xA0, /* 'u' 0x75 */ - 0x85, 0x24, 0x92, 0x30, 0xC3, 0x00, /* 'v' 0x76 */ - 0x89, 0x59, 0x59, 0x55, 0x56, 0x26, 0x26, /* 'w' 0x77 */ - 0x4A, 0x4C, 0x43, 0x27, 0x20, /* 'x' 0x78 */ - 0x8A, 0x52, 0xA5, 0x18, 0x84, 0x22, 0x00, /* 'y' 0x79 */ - 0x78, 0x44, 0x46, 0x23, 0xE0, /* 'z' 0x7A */ - 0x6A, 0xAA, 0xA9, /* '{' 0x7B */ - 0xFF, 0xE0, /* '|' 0x7C */ - 0x95, 0x55, 0x56, /* '}' 0x7D */ - 0x66, 0x60, /* '~' 0x7E */ - 0xFF, 0xC0, 0x67, 0x34, 0x58, 0x4C, 0x46, 0x03, 0x11, 0x80, 0xFF, 0xC0, /* 0x7F */ - 0xFC, 0x08, 0x04, 0x02, 0x01, 0xF0, 0x8C, 0x46, 0x23, 0x11, 0x80, 0xC0, 0xC0, /* 0x80 */ - 0x10, 0x8F, 0xE0, 0x82, 0x08, 0x20, 0x82, 0x00, /* 0x81 */ - 0xE0, /* 0x82 */ - 0x24, 0x0F, 0x88, 0x88, 0x80, /* 0x83 */ - 0xB6, 0x80, /* 0x84 */ - 0xA8, /* 0x85 */ - 0x21, 0x09, 0xF2, 0x10, 0x84, 0x21, 0x08, /* 0x86 */ - 0x21, 0x09, 0xF2, 0x10, 0x84, 0xF9, 0x08, /* 0x87 */ - 0x1C, 0x45, 0x07, 0xE4, 0x1F, 0x10, 0x10, 0x1E, /* 0x88 */ - 0x62, 0x09, 0x40, 0x98, 0x06, 0x80, 0x10, 0x01, 0x66, 0x29, 0x92, 0x99, 0x06, 0x60, /* 0x89 */ - 0x7C, 0x08, 0x81, 0x10, 0x22, 0x04, 0x7C, 0x88, 0x51, 0x0A, 0x21, 0x87, 0xC0, /* 0x8A */ - 0x64, /* 0x8B */ - 0x84, 0x10, 0x82, 0x10, 0x42, 0x0F, 0xFD, 0x08, 0xA1, 0x0C, 0x23, 0x87, 0xC0, /* 0x8C */ - 0x10, 0x88, 0xE6, 0xB3, 0x8C, 0x28, 0x92, 0x28, 0xC0, /* 0x8D */ - 0xFC, 0x08, 0x04, 0x02, 0x01, 0xF0, 0x8C, 0x46, 0x23, 0x11, 0x80, /* 0x8E */ - 0x83, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0xFE, 0x20, 0x40, /* 0x8F */ - 0x43, 0xC4, 0x1F, 0x45, 0x14, 0x51, 0x44, 0x11, 0x80, /* 0x90 */ - 0xE0, /* 0x91 */ - 0xE0, /* 0x92 */ - 0xB6, 0x80, /* 0x93 */ - 0xB6, 0x80, /* 0x94 */ - 0xFF, 0x80, /* 0x95 */ - 0xFC, /* 0x96 */ - 0xFF, 0xF0, /* 0x97 */ - /* 0x98 */ - 0xE6, 0x28, 0xCD, 0x19, 0xA3, 0x34, 0x6A, 0x8B, 0x51, 0x68, /* 0x99 */ - 0x78, 0x24, 0x13, 0xC9, 0x14, 0x8E, 0x7C, /* 0x9A */ - 0x98, /* 0x9B */ - 0x88, 0x44, 0x3F, 0xD1, 0x38, 0x8C, 0x78, /* 0x9C */ - 0x24, 0x09, 0xAC, 0xCA, 0x90, /* 0x9D */ - 0x43, 0xC4, 0x1F, 0x45, 0x14, 0x51, 0x44, /* 0x9E */ - 0x8C, 0x63, 0x18, 0xFC, 0x80, /* 0x9F */ - /* 0xA0 */ - 0x24, 0x33, 0x0A, 0x36, 0x45, 0x8E, 0x0C, 0x10, 0x60, 0x80, /* 0xA1 */ - 0x51, 0x22, 0x95, 0xA8, 0xC4, 0x23, 0x10, /* 0xA2 */ - 0x08, 0x42, 0x10, 0x86, 0x31, 0x78, /* 0xA3 */ - 0xFC, 0x63, 0xF0, /* 0xA4 */ - 0x07, 0xF8, 0x20, 0x82, 0x08, 0x20, 0x82, 0x00, /* 0xA5 */ - 0xF9, 0xF0, /* 0xA6 */ - 0x32, 0x91, 0xC9, 0x47, 0x26, 0x14, 0xA4, 0xC0, /* 0xA7 */ - 0x28, 0x0F, 0xE0, 0x82, 0x0F, 0xE0, 0x82, 0x0F, 0xC0, /* 0xA8 */ - 0x3E, 0x3F, 0xB8, 0xF4, 0x1A, 0x0D, 0x17, 0x76, 0xC6, 0x3E, 0x00, /* 0xA9 */ - 0x38, 0x8A, 0x0C, 0x0F, 0x90, 0x20, 0xE3, 0x7C, /* 0xAA */ - 0x5A, 0xA5, /* 0xAB */ - 0x51, 0x55, 0x56, /* 0xAC */ - /* 0xAD */ - 0x3E, 0x31, 0xB7, 0x72, 0x99, 0xCC, 0xC7, 0x56, 0xC6, 0x3E, 0x00, /* 0xAE */ - 0xA1, 0x24, 0x92, 0x49, 0x00, /* 0xAF */ - 0x69, 0x96, /* 0xB0 */ - 0x21, 0x3E, 0x42, 0x03, 0xE0, /* 0xB1 */ - 0xFF, 0x80, /* 0xB2 */ - 0xDF, 0x80, /* 0xB3 */ - 0x27, 0xC9, 0x24, /* 0xB4 */ - 0x8A, 0x28, 0xA2, 0x8A, 0x6E, 0xE0, 0x80, /* 0xB5 */ - 0x7F, 0xAE, 0xBA, 0x68, 0xA2, 0x8A, 0x28, 0xA0, /* 0xB6 */ - 0x80, /* 0xB7 */ - 0x28, 0xA0, 0x1E, 0x47, 0xFC, 0x11, 0x78, /* 0xB8 */ - 0x88, 0x44, 0x32, 0x59, 0xDA, 0xCD, 0x66, 0x6B, 0x32, 0x8B, 0x80, /* 0xB9 */ - 0x79, 0x1F, 0x30, 0x45, 0xE0, /* 0xBA */ - 0xA5, 0x5A, /* 0xBB */ - 0x45, 0x55, 0x57, /* 0xBC */ - 0x7A, 0x18, 0x70, 0x78, 0x38, 0x61, 0x7C, /* 0xBD */ - 0x7A, 0x1C, 0x1C, 0xBC, /* 0xBE */ - 0xB4, 0x24, 0x92, 0x40, /* 0xBF */ - 0x18, 0x18, 0x3C, 0x24, 0x24, 0x7E, 0x42, 0x42, 0xC3, /* 0xC0 */ - 0xFE, 0x08, 0x20, 0xFA, 0x18, 0x61, 0xF8, /* 0xC1 */ - 0xFA, 0x18, 0x61, 0xFA, 0x18, 0x61, 0xFC, /* 0xC2 */ - 0xFE, 0x08, 0x20, 0x82, 0x08, 0x20, 0x80, /* 0xC3 */ - 0x1F, 0x08, 0x84, 0x42, 0x21, 0x10, 0x88, 0x44, 0x42, 0xFF, 0xC0, 0x60, 0x20, /* 0xC4 */ - 0xFE, 0x08, 0x20, 0xFE, 0x08, 0x20, 0xFC, /* 0xC5 */ - 0x88, 0xA4, 0x9A, 0x87, 0xC1, 0xC1, 0xF1, 0xAD, 0x92, 0x88, 0x80, /* 0xC6 */ - 0x7A, 0x18, 0x41, 0x38, 0x18, 0x61, 0x7C, /* 0xC7 */ - 0x87, 0x0E, 0x2C, 0x59, 0x34, 0x68, 0xE1, 0xC2, /* 0xC8 */ - 0x28, 0x22, 0x1C, 0x38, 0xB1, 0x64, 0xD1, 0xA3, 0x87, 0x08, /* 0xC9 */ - 0x8E, 0x6B, 0x38, 0xC2, 0x89, 0x22, 0x8C, /* 0xCA */ - 0x3E, 0x44, 0x89, 0x12, 0x24, 0x58, 0xA1, 0xC2, /* 0xCB */ - 0xC3, 0xC3, 0xC3, 0xA5, 0xA5, 0xA5, 0x99, 0x99, 0x99, /* 0xCC */ - 0x83, 0x06, 0x0C, 0x1F, 0xF0, 0x60, 0xC1, 0x82, /* 0xCD */ - 0x3C, 0x42, 0x81, 0x81, 0x81, 0x81, 0x81, 0xC2, 0x7C, /* 0xCE */ - 0xFF, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x82, /* 0xCF */ - 0xFA, 0x18, 0x61, 0xFE, 0x08, 0x20, 0x80, /* 0xD0 */ - 0x38, 0x8A, 0x0C, 0x08, 0x10, 0x20, 0xE3, 0x7C, /* 0xD1 */ - 0xFE, 0x20, 0x40, 0x81, 0x02, 0x04, 0x08, 0x10, /* 0xD2 */ - 0xC2, 0x8D, 0x91, 0x63, 0x83, 0x04, 0x18, 0x20, /* 0xD3 */ - 0x08, 0x1F, 0x32, 0x71, 0x18, 0x8C, 0x47, 0x26, 0xFE, 0x08, 0x00, /* 0xD4 */ - 0x87, 0x34, 0x8C, 0x30, 0xC4, 0xB3, 0x84, /* 0xD5 */ - 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0xFF, 0x01, 0x01, /* 0xD6 */ - 0x8E, 0x38, 0xE3, 0x8D, 0xF0, 0xC3, 0x0C, /* 0xD7 */ - 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0xFF, /* 0xD8 */ - 0x99, 0x4C, 0xA6, 0x53, 0x29, 0x94, 0xCA, 0x65, 0x32, 0xFF, 0x80, 0x40, 0x20, /* 0xD9 */ - 0xF0, 0x04, 0x01, 0x00, 0x40, 0x1F, 0x84, 0x21, 0x0C, 0x42, 0x1F, 0x00, /* 0xDA */ - 0x81, 0xC0, 0xE0, 0x70, 0x3F, 0xDC, 0x2E, 0x17, 0x0B, 0xF9, 0x80, /* 0xDB */ - 0x82, 0x08, 0x20, 0xFE, 0x18, 0x61, 0xF8, /* 0xDC */ - 0x79, 0x8A, 0x18, 0x13, 0xE0, 0x60, 0xC2, 0x7C, /* 0xDD */ - 0x87, 0x26, 0x39, 0x06, 0x41, 0xF0, 0x64, 0x19, 0x06, 0x63, 0x8F, 0x80, /* 0xDE */ - 0x7E, 0x18, 0x61, 0x7C, 0xD6, 0x71, 0x84, /* 0xDF */ - 0x79, 0x11, 0xD9, 0xCD, 0xD0, /* 0xE0 */ - 0x0D, 0xC4, 0x1E, 0x47, 0x1C, 0x51, 0x78, /* 0xE1 */ - 0xF4, 0xBD, 0x29, 0xF8, /* 0xE2 */ - 0xF8, 0x88, 0x88, /* 0xE3 */ - 0x3C, 0x48, 0x91, 0x22, 0x5F, 0xE0, 0x80, /* 0xE4 */ - 0x79, 0x1F, 0xF0, 0x45, 0xE0, /* 0xE5 */ - 0x92, 0x54, 0x38, 0x3C, 0x56, 0x93, /* 0xE6 */ - 0x78, 0x23, 0x82, 0xCD, 0xE0, /* 0xE7 */ - 0x9C, 0xEB, 0x5C, 0xC4, /* 0xE8 */ - 0x70, 0x27, 0x3A, 0xD7, 0x31, /* 0xE9 */ - 0x9A, 0xCC, 0xA9, /* 0xEA */ - 0x7A, 0x52, 0x94, 0xE4, /* 0xEB */ - 0x8F, 0x3D, 0x6D, 0xA6, 0x90, /* 0xEC */ - 0x8C, 0x7F, 0x18, 0xC4, /* 0xED */ - 0x79, 0x1C, 0x71, 0x45, 0xE0, /* 0xEE */ - 0xFC, 0x63, 0x18, 0xC4, /* 0xEF */ - 0xFC, 0x63, 0x18, 0xFA, 0x10, 0x80, /* 0xF0 */ - 0x79, 0x1C, 0x30, 0x45, 0xE0, /* 0xF1 */ - 0xF9, 0x08, 0x42, 0x10, /* 0xF2 */ - 0x8A, 0x56, 0xA3, 0x10, 0x8C, 0x40, /* 0xF3 */ - 0x04, 0x01, 0x07, 0xF9, 0x31, 0xC4, 0x71, 0x14, 0xC5, 0xFE, 0x04, 0x01, 0x00, 0x40, /* 0xF4 */ - 0x4B, 0x8C, 0x65, 0xE4, /* 0xF5 */ - 0x8A, 0x28, 0xA2, 0x8B, 0xF0, 0x40, /* 0xF6 */ - 0x99, 0x97, 0x11, /* 0xF7 */ - 0x96, 0x59, 0x65, 0x97, 0xF0, /* 0xF8 */ - 0x95, 0x2A, 0x54, 0xA9, 0x5F, 0xC0, 0x80, /* 0xF9 */ - 0xF0, 0x20, 0x78, 0x91, 0x23, 0xC0, /* 0xFA */ - 0x86, 0x1F, 0x63, 0x8F, 0xD0, /* 0xFB */ - 0x84, 0x3D, 0x18, 0xF8, /* 0xFC */ - 0xF4, 0xDE, 0x19, 0xF8, /* 0xFD */ - 0x9E, 0xA2, 0xE1, 0xA1, 0xA2, 0x9E, /* 0xFE */ - 0xFC, 0x7E, 0xD4, 0xC4, /* 0xFF */ -}; - -const GFXglyph FreeSans6pt_Win1251Glyphs[] PROGMEM = { - /* ' ' 0x20 */ {0, 0, 0, 3, 0, 0}, - /* '!' 0x21 */ {0, 1, 9, 4, 2, -8}, - /* '"' 0x22 */ {2, 3, 3, 4, 0, -8}, - /* '#' 0x23 */ {4, 7, 8, 7, 0, -7}, - /* '$' 0x24 */ {11, 6, 11, 7, 0, -9}, - /* '%' 0x25 */ {20, 10, 9, 11, 0, -8}, - /* '&' 0x26 */ {32, 6, 9, 8, 1, -8}, - /* ''' 0x27 */ {39, 1, 3, 2, 1, -8}, - /* '(' 0x28 */ {40, 2, 11, 4, 1, -8}, - /* ')' 0x29 */ {43, 3, 11, 4, 0, -8}, - /* '*' 0x2A */ {48, 3, 3, 5, 1, -8}, - /* '+' 0x2B */ {50, 5, 5, 7, 1, -4}, - /* ',' 0x2C */ {54, 1, 3, 3, 1, 0}, - /* '-' 0x2D */ {55, 2, 1, 4, 1, -3}, - /* '.' 0x2E */ {56, 1, 1, 3, 1, 0}, - /* '/' 0x2F */ {57, 3, 9, 3, 0, -8}, - /* '0' 0x30 */ {61, 5, 9, 7, 1, -8}, - /* '1' 0x31 */ {67, 3, 9, 7, 1, -8}, - /* '2' 0x32 */ {71, 6, 9, 7, 0, -8}, - /* '3' 0x33 */ {78, 6, 9, 7, 0, -8}, - /* '4' 0x34 */ {85, 6, 9, 7, 0, -8}, - /* '5' 0x35 */ {92, 5, 9, 7, 1, -8}, - /* '6' 0x36 */ {98, 5, 9, 7, 1, -8}, - /* '7' 0x37 */ {104, 5, 9, 7, 1, -8}, - /* '8' 0x38 */ {110, 6, 9, 7, 0, -8}, - /* '9' 0x39 */ {117, 6, 9, 7, 0, -8}, - /* ':' 0x3A */ {124, 1, 7, 3, 1, -6}, - /* ';' 0x3B */ {125, 1, 8, 3, 1, -5}, - /* '<' 0x3C */ {126, 5, 5, 7, 1, -4}, - /* '=' 0x3D */ {130, 5, 3, 7, 1, -3}, - /* '>' 0x3E */ {132, 5, 5, 7, 1, -4}, - /* '?' 0x3F */ {136, 5, 9, 7, 1, -8}, - /* '@' 0x40 */ {142, 11, 11, 12, 0, -8}, - /* 'A' 0x41 */ {158, 8, 9, 8, 0, -8}, - /* 'B' 0x42 */ {167, 6, 9, 8, 1, -8}, - /* 'C' 0x43 */ {174, 8, 9, 9, 0, -8}, - /* 'D' 0x44 */ {183, 7, 9, 8, 1, -8}, - /* 'E' 0x45 */ {191, 6, 9, 8, 1, -8}, - /* 'F' 0x46 */ {198, 6, 9, 7, 1, -8}, - /* 'G' 0x47 */ {205, 8, 9, 9, 0, -8}, - /* 'H' 0x48 */ {214, 7, 9, 9, 1, -8}, - /* 'I' 0x49 */ {222, 1, 9, 3, 1, -8}, - /* 'J' 0x4A */ {224, 5, 9, 6, 0, -8}, - /* 'K' 0x4B */ {230, 7, 9, 8, 1, -8}, - /* 'L' 0x4C */ {238, 5, 9, 7, 1, -8}, - /* 'M' 0x4D */ {244, 8, 9, 10, 1, -8}, - /* 'N' 0x4E */ {253, 7, 9, 9, 1, -8}, - /* 'O' 0x4F */ {261, 9, 9, 9, 0, -8}, - /* 'P' 0x50 */ {272, 6, 9, 8, 1, -8}, - /* 'Q' 0x51 */ {279, 9, 10, 9, 0, -8}, - /* 'R' 0x52 */ {291, 7, 9, 9, 1, -8}, - /* 'S' 0x53 */ {299, 6, 9, 8, 1, -8}, - /* 'T' 0x54 */ {306, 7, 9, 8, 0, -8}, - /* 'U' 0x55 */ {314, 7, 9, 9, 1, -8}, - /* 'V' 0x56 */ {322, 7, 9, 8, 0, -8}, - /* 'W' 0x57 */ {330, 11, 9, 11, 0, -8}, - /* 'X' 0x58 */ {343, 6, 9, 8, 1, -8}, - /* 'Y' 0x59 */ {350, 8, 9, 8, 0, -8}, - /* 'Z' 0x5A */ {359, 7, 9, 7, 0, -8}, - /* '[' 0x5B */ {367, 2, 12, 3, 1, -8}, - /* '\' 0x5C */ {370, 3, 9, 3, 0, -8}, - /* ']' 0x5D */ {374, 2, 12, 3, 0, -8}, - /* '^' 0x5E */ {377, 4, 4, 6, 1, -8}, - /* '_' 0x5F */ {379, 7, 1, 7, 0, 2}, - /* '`' 0x60 */ {380, 1, 1, 3, 1, -8}, - /* 'a' 0x61 */ {381, 6, 7, 7, 0, -6}, - /* 'b' 0x62 */ {387, 5, 9, 7, 1, -8}, - /* 'c' 0x63 */ {393, 6, 7, 6, 0, -6}, - /* 'd' 0x64 */ {399, 6, 9, 7, 0, -8}, - /* 'e' 0x65 */ {406, 6, 7, 6, 0, -6}, - /* 'f' 0x66 */ {412, 3, 9, 3, 0, -8}, - /* 'g' 0x67 */ {416, 6, 10, 7, 0, -6}, - /* 'h' 0x68 */ {424, 5, 9, 6, 1, -8}, - /* 'i' 0x69 */ {430, 1, 9, 3, 1, -8}, - /* 'j' 0x6A */ {432, 2, 12, 3, 0, -8}, - /* 'k' 0x6B */ {435, 5, 9, 6, 1, -8}, - /* 'l' 0x6C */ {441, 1, 9, 3, 1, -8}, - /* 'm' 0x6D */ {443, 8, 7, 10, 1, -6}, - /* 'n' 0x6E */ {450, 5, 7, 6, 1, -6}, - /* 'o' 0x6F */ {455, 6, 7, 6, 0, -6}, - /* 'p' 0x70 */ {461, 5, 9, 7, 1, -6}, - /* 'q' 0x71 */ {467, 6, 9, 7, 0, -6}, - /* 'r' 0x72 */ {474, 3, 7, 4, 1, -6}, - /* 's' 0x73 */ {477, 5, 7, 6, 0, -6}, - /* 't' 0x74 */ {482, 3, 8, 3, 0, -7}, - /* 'u' 0x75 */ {485, 5, 7, 6, 1, -6}, - /* 'v' 0x76 */ {490, 6, 7, 6, 0, -6}, - /* 'w' 0x77 */ {496, 8, 7, 9, 0, -6}, - /* 'x' 0x78 */ {503, 5, 7, 6, 0, -6}, - /* 'y' 0x79 */ {508, 5, 10, 6, 0, -6}, - /* 'z' 0x7A */ {515, 5, 7, 6, 0, -6}, - /* '{' 0x7B */ {520, 2, 12, 4, 1, -8}, - /* '|' 0x7C */ {523, 1, 11, 3, 1, -8}, - /* '}' 0x7D */ {525, 2, 12, 4, 1, -8}, - /* '~' 0x7E */ {528, 6, 2, 6, 0, -4}, - /* 0x7F */ {530, 9, 10, 11, 1, -8}, - /* 0x80 */ {542, 9, 11, 9, 0, -8}, - /* 0x81 */ {555, 6, 10, 7, 1, -9}, - /* 0x82 */ {563, 1, 3, 3, 1, 0}, - /* 0x83 */ {564, 4, 9, 5, 1, -8}, - /* 0x84 */ {569, 3, 3, 5, 1, 0}, - /* 0x85 */ {571, 5, 1, 7, 1, 0}, - /* 0x86 */ {572, 5, 11, 7, 1, -8}, - /* 0x87 */ {579, 5, 11, 7, 1, -8}, - /* 0x88 */ {586, 7, 9, 8, 0, -8}, - /* 0x89 */ {594, 12, 9, 12, 0, -8}, - /* 0x8A */ {608, 11, 9, 13, 1, -8}, - /* 0x8B */ {621, 2, 3, 4, 1, -4}, - /* 0x8C */ {622, 11, 9, 12, 1, -8}, - /* 0x8D */ {635, 6, 11, 8, 1, -10}, - /* 0x8E */ {644, 9, 9, 9, 0, -8}, - /* 0x8F */ {655, 7, 11, 9, 1, -8}, - /* 0x90 */ {665, 6, 11, 7, 0, -8}, - /* 0x91 */ {674, 1, 3, 3, 1, -8}, - /* 0x92 */ {675, 1, 3, 2, 1, -8}, - /* 0x93 */ {676, 3, 3, 5, 1, -8}, - /* 0x94 */ {678, 3, 3, 5, 1, -8}, - /* 0x95 */ {680, 3, 3, 5, 1, -5}, - /* 0x96 */ {682, 6, 1, 6, 0, -3}, - /* 0x97 */ {683, 12, 1, 12, 0, -3}, - /* 0x98 */ {685, 0, 0, 8, 0, 0}, - /* 0x99 */ {685, 11, 7, 12, 1, -8}, - /* 0x9A */ {695, 9, 6, 10, 0, -5}, - /* 0x9B */ {702, 2, 3, 3, 1, -4}, - /* 0x9C */ {703, 9, 6, 10, 1, -5}, - /* 0x9D */ {710, 4, 9, 6, 1, -8}, - /* 0x9E */ {715, 6, 9, 7, 0, -8}, - /* 0x9F */ {722, 5, 7, 7, 1, -5}, - /* 0xA0 */ {727, 0, 0, 3, 0, 0}, - /* 0xA1 */ {727, 7, 11, 7, 0, -10}, - /* 0xA2 */ {737, 5, 11, 6, 0, -7}, - /* 0xA3 */ {744, 5, 9, 6, 0, -8}, - /* 0xA4 */ {750, 5, 4, 7, 1, -5}, - /* 0xA5 */ {753, 6, 10, 7, 1, -9}, - /* 0xA6 */ {761, 1, 12, 3, 1, -8}, - /* 0xA7 */ {763, 5, 12, 7, 1, -8}, - /* 0xA8 */ {771, 6, 11, 8, 1, -10}, - /* 0xA9 */ {780, 9, 9, 10, 0, -8}, - /* 0xAA */ {791, 7, 9, 9, 1, -8}, - /* 0xAB */ {799, 4, 4, 6, 1, -4}, - /* 0xAC */ {801, 2, 12, 3, 0, -8}, - /* 0xAD */ {804, 0, 0, 0, 0, 0}, - /* 0xAE */ {804, 9, 9, 10, 0, -8}, - /* 0xAF */ {815, 3, 11, 3, 0, -10}, - /* 0xB0 */ {820, 4, 4, 7, 2, -8}, - /* 0xB1 */ {822, 5, 7, 7, 1, -6}, - /* 0xB2 */ {827, 1, 9, 3, 1, -8}, - /* 0xB3 */ {829, 1, 9, 3, 1, -8}, - /* 0xB4 */ {831, 3, 8, 5, 1, -7}, - /* 0xB5 */ {834, 6, 9, 7, 1, -6}, - /* 0xB6 */ {841, 6, 10, 6, 1, -8}, - /* 0xB7 */ {849, 1, 1, 3, 1, -2}, - /* 0xB8 */ {850, 6, 9, 7, 0, -8}, - /* 0xB9 */ {857, 9, 9, 11, 1, -8}, - /* 0xBA */ {868, 6, 6, 6, 0, -5}, - /* 0xBB */ {873, 4, 4, 6, 1, -5}, - /* 0xBC */ {875, 2, 12, 3, 0, -8}, - /* 0xBD */ {878, 6, 9, 8, 1, -8}, - /* 0xBE */ {885, 5, 6, 6, 0, -5}, - /* 0xBF */ {889, 3, 9, 3, 0, -8}, - /* 0xC0 */ {893, 8, 9, 8, 0, -8}, - /* 0xC1 */ {902, 6, 9, 8, 1, -8}, - /* 0xC2 */ {909, 6, 9, 8, 1, -8}, - /* 0xC3 */ {916, 6, 9, 7, 1, -8}, - /* 0xC4 */ {923, 9, 11, 10, 0, -8}, - /* 0xC5 */ {936, 6, 9, 8, 1, -8}, - /* 0xC6 */ {943, 9, 9, 11, 1, -8}, - /* 0xC7 */ {954, 6, 9, 8, 1, -8}, - /* 0xC8 */ {961, 7, 9, 9, 1, -8}, - /* 0xC9 */ {969, 7, 11, 9, 1, -10}, - /* 0xCA */ {979, 6, 9, 8, 1, -8}, - /* 0xCB */ {986, 7, 9, 8, 0, -8}, - /* 0xCC */ {994, 8, 9, 10, 1, -8}, - /* 0xCD */ {1003, 7, 9, 9, 1, -8}, - /* 0xCE */ {1011, 8, 9, 10, 1, -8}, - /* 0xCF */ {1020, 7, 9, 9, 1, -8}, - /* 0xD0 */ {1028, 6, 9, 8, 1, -8}, - /* 0xD1 */ {1035, 7, 9, 9, 1, -8}, - /* 0xD2 */ {1043, 7, 9, 7, 0, -8}, - /* 0xD3 */ {1051, 7, 9, 7, 0, -8}, - /* 0xD4 */ {1059, 9, 9, 10, 1, -8}, - /* 0xD5 */ {1070, 6, 9, 8, 1, -8}, - /* 0xD6 */ {1077, 8, 11, 9, 1, -8}, - /* 0xD7 */ {1088, 6, 9, 8, 1, -8}, - /* 0xD8 */ {1095, 8, 9, 10, 1, -8}, - /* 0xD9 */ {1104, 9, 11, 10, 1, -8}, - /* 0xDA */ {1117, 10, 9, 10, 0, -8}, - /* 0xDB */ {1129, 9, 9, 10, 1, -8}, - /* 0xDC */ {1140, 6, 9, 8, 1, -8}, - /* 0xDD */ {1147, 7, 9, 9, 1, -8}, - /* 0xDE */ {1155, 10, 9, 12, 1, -8}, - /* 0xDF */ {1167, 6, 9, 8, 1, -8}, - /* 0xE0 */ {1174, 6, 6, 7, 0, -5}, - /* 0xE1 */ {1179, 6, 9, 7, 0, -8}, - /* 0xE2 */ {1186, 5, 6, 6, 1, -5}, - /* 0xE3 */ {1190, 4, 6, 5, 1, -5}, - /* 0xE4 */ {1193, 7, 7, 7, 0, -5}, - /* 0xE5 */ {1200, 6, 6, 7, 0, -5}, - /* 0xE6 */ {1205, 8, 6, 9, 1, -5}, - /* 0xE7 */ {1211, 6, 6, 6, 0, -5}, - /* 0xE8 */ {1216, 5, 6, 7, 1, -5}, - /* 0xE9 */ {1220, 5, 8, 7, 1, -7}, - /* 0xEA */ {1225, 4, 6, 6, 1, -5}, - /* 0xEB */ {1228, 5, 6, 6, 0, -5}, - /* 0xEC */ {1232, 6, 6, 7, 1, -5}, - /* 0xED */ {1237, 5, 6, 7, 1, -5}, - /* 0xEE */ {1241, 6, 6, 7, 0, -5}, - /* 0xEF */ {1246, 5, 6, 7, 1, -5}, - /* 0xF0 */ {1250, 5, 9, 7, 1, -5}, - /* 0xF1 */ {1256, 6, 6, 6, 0, -5}, - /* 0xF2 */ {1261, 5, 6, 5, 0, -5}, - /* 0xF3 */ {1265, 5, 9, 6, 0, -5}, - /* 0xF4 */ {1271, 10, 11, 10, 0, -7}, - /* 0xF5 */ {1285, 5, 6, 6, 0, -5}, - /* 0xF6 */ {1289, 6, 7, 7, 1, -5}, - /* 0xF7 */ {1295, 4, 6, 6, 1, -5}, - /* 0xF8 */ {1298, 6, 6, 8, 1, -5}, - /* 0xF9 */ {1303, 7, 7, 9, 1, -5}, - /* 0xFA */ {1310, 7, 6, 8, 0, -5}, - /* 0xFB */ {1316, 6, 6, 8, 1, -5}, - /* 0xFC */ {1321, 5, 6, 6, 1, -5}, - /* 0xFD */ {1325, 5, 6, 6, 1, -5}, - /* 0xFE */ {1329, 8, 6, 9, 1, -5}, - /* 0xFF */ {1335, 5, 6, 7, 1, -5}, -}; - -const GFXfont FreeSans6pt_Win1251 PROGMEM = {(uint8_t *)FreeSans6pt_Win1251Bitmaps, (GFXglyph *)FreeSans6pt_Win1251Glyphs, 0x20, - 0xFF, 14}; diff --git a/src/graphics/niche/Fonts/FreeSans6pt_Win1252.h b/src/graphics/niche/Fonts/FreeSans6pt_Win1252.h deleted file mode 100644 index 32f9952703..0000000000 --- a/src/graphics/niche/Fonts/FreeSans6pt_Win1252.h +++ /dev/null @@ -1,457 +0,0 @@ -#pragma once -const uint8_t FreeSans6pt_Win1252Bitmaps[] PROGMEM = { - /* ' ' 0x20 */ - 0xFC, 0x80, /* '!' 0x21 */ - 0xB6, 0x80, /* '"' 0x22 */ - 0x24, 0x51, 0xF9, 0x42, 0x9F, 0x92, 0x28, /* '#' 0x23 */ - 0x10, 0xE5, 0x55, 0x50, 0xE1, 0x65, 0x55, 0xE1, 0x00, /* '$' 0x24 */ - 0x71, 0x24, 0x89, 0x22, 0x50, 0x74, 0x02, 0x70, 0xA4, 0x49, 0x11, 0xC0, /* '%' 0x25 */ - 0x71, 0x24, 0x9C, 0x62, 0x58, 0xA7, 0xF4, /* '&' 0x26 */ - 0xE0, /* ''' 0x27 */ - 0x5A, 0xAA, 0x94, /* '(' 0x28 */ - 0x89, 0x12, 0x49, 0x29, 0x00, /* ')' 0x29 */ - 0x5E, 0x80, /* '*' 0x2A */ - 0x21, 0x3E, 0x42, 0x00, /* '+' 0x2B */ - 0xE0, /* ',' 0x2C */ - 0xC0, /* '-' 0x2D */ - 0x80, /* '.' 0x2E */ - 0x24, 0xA4, 0xA4, 0x80, /* '/' 0x2F */ - 0x76, 0xE3, 0x18, 0xC6, 0x3B, 0x70, /* '0' 0x30 */ - 0x27, 0x92, 0x49, 0x20, /* '1' 0x31 */ - 0x79, 0x10, 0x41, 0x08, 0xC6, 0x10, 0xFC, /* '2' 0x32 */ - 0x79, 0x30, 0x43, 0x18, 0x10, 0x71, 0x78, /* '3' 0x33 */ - 0x08, 0x61, 0x8A, 0x49, 0x2F, 0xC2, 0x08, /* '4' 0x34 */ - 0xFC, 0x21, 0xE8, 0x84, 0x31, 0xF0, /* '5' 0x35 */ - 0x74, 0x61, 0xE8, 0xC6, 0x31, 0x70, /* '6' 0x36 */ - 0xF8, 0x44, 0x22, 0x11, 0x08, 0x40, /* '7' 0x37 */ - 0x39, 0x34, 0x53, 0x39, 0x1C, 0x51, 0x38, /* '8' 0x38 */ - 0x39, 0x3C, 0x71, 0x4C, 0xF0, 0x53, 0x78, /* '9' 0x39 */ - 0x82, /* ':' 0x3A */ - 0x87, /* ';' 0x3B */ - 0x3E, 0x30, 0x60, 0x80, /* '<' 0x3C */ - 0xF8, 0x3E, /* '=' 0x3D */ - 0xE0, 0xC6, 0xC8, 0x00, /* '>' 0x3E */ - 0x74, 0x42, 0x11, 0x10, 0x80, 0x20, /* '?' 0x3F */ - 0x0F, 0x86, 0x19, 0x9A, 0xA4, 0xD9, 0x13, 0x22, 0x56, 0xDA, 0x6E, 0x60, 0x06, 0x00, 0x3C, 0x00, /* '@' 0x40 */ - 0x18, 0x18, 0x24, 0x24, 0x24, 0x7E, 0x42, 0x42, 0xC3, /* 'A' 0x41 */ - 0xFA, 0x18, 0x61, 0xFA, 0x18, 0x61, 0xFC, /* 'B' 0x42 */ - 0x3E, 0x63, 0x40, 0x40, 0xC0, 0x40, 0x41, 0x63, 0x3E, /* 'C' 0x43 */ - 0xF9, 0x0A, 0x1C, 0x18, 0x30, 0x61, 0xC2, 0xF8, /* 'D' 0x44 */ - 0xFE, 0x08, 0x20, 0xFE, 0x08, 0x20, 0xFC, /* 'E' 0x45 */ - 0xFE, 0x08, 0x20, 0xFA, 0x08, 0x20, 0x80, /* 'F' 0x46 */ - 0x1E, 0x61, 0x40, 0x40, 0xC7, 0x41, 0x41, 0x63, 0x1D, /* 'G' 0x47 */ - 0x83, 0x06, 0x0C, 0x1F, 0xF0, 0x60, 0xC1, 0x82, /* 'H' 0x48 */ - 0xFF, 0x80, /* 'I' 0x49 */ - 0x08, 0x42, 0x10, 0x87, 0x29, 0x70, /* 'J' 0x4A */ - 0x85, 0x12, 0x45, 0x0D, 0x13, 0x22, 0x42, 0x86, /* 'K' 0x4B */ - 0x84, 0x21, 0x08, 0x42, 0x10, 0xF8, /* 'L' 0x4C */ - 0xC3, 0xC3, 0xC3, 0xA5, 0xA5, 0xA5, 0x99, 0x99, 0x99, /* 'M' 0x4D */ - 0x83, 0x86, 0x8D, 0x19, 0x33, 0x62, 0xC3, 0x86, /* 'N' 0x4E */ - 0x1E, 0x31, 0x90, 0x68, 0x1C, 0x0A, 0x05, 0x06, 0xC6, 0x1E, 0x00, /* 'O' 0x4F */ - 0xFA, 0x18, 0x61, 0xFA, 0x08, 0x20, 0x80, /* 'P' 0x50 */ - 0x1E, 0x31, 0x90, 0x68, 0x1C, 0x0A, 0x05, 0x16, 0xC6, 0x1F, 0x00, 0x40, /* 'Q' 0x51 */ - 0xFD, 0x0E, 0x1C, 0x2F, 0x90, 0xA1, 0x42, 0x86, /* 'R' 0x52 */ - 0x7A, 0x18, 0x30, 0x78, 0x38, 0x61, 0x78, /* 'S' 0x53 */ - 0xFE, 0x20, 0x40, 0x81, 0x02, 0x04, 0x08, 0x10, /* 'T' 0x54 */ - 0x83, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xE2, 0x78, /* 'U' 0x55 */ - 0xC2, 0x85, 0x0B, 0x22, 0x44, 0x8E, 0x0C, 0x18, /* 'V' 0x56 */ - 0xC4, 0x28, 0xCD, 0x29, 0x25, 0x24, 0xA4, 0x52, 0x8C, 0x61, 0x8C, 0x31, 0x80, /* 'W' 0x57 */ - 0x87, 0x34, 0x8C, 0x30, 0xC4, 0xA3, 0x84, /* 'X' 0x58 */ - 0xC3, 0x42, 0x24, 0x34, 0x18, 0x08, 0x08, 0x08, 0x08, /* 'Y' 0x59 */ - 0x7E, 0x0C, 0x30, 0x41, 0x06, 0x18, 0x20, 0xFE, /* 'Z' 0x5A */ - 0xEA, 0xAA, 0xAB, /* '[' 0x5B */ - 0x92, 0x24, 0x89, 0x20, /* '\' 0x5C */ - 0xD5, 0x55, 0x57, /* ']' 0x5D */ - 0x46, 0xA9, /* '^' 0x5E */ - 0xFE, /* '_' 0x5F */ - 0x80, /* '`' 0x60 */ - 0x79, 0x20, 0x4F, 0xC6, 0x37, 0x40, /* 'a' 0x61 */ - 0x84, 0x3D, 0x18, 0xC6, 0x31, 0xF0, /* 'b' 0x62 */ - 0x39, 0x3C, 0x20, 0xC1, 0x33, 0x80, /* 'c' 0x63 */ - 0x04, 0x13, 0xD3, 0xC6, 0x1C, 0x53, 0x3C, /* 'd' 0x64 */ - 0x39, 0x38, 0x7F, 0x81, 0x13, 0x80, /* 'e' 0x65 */ - 0x6B, 0xA4, 0x92, 0x40, /* 'f' 0x66 */ - 0x35, 0x3C, 0x61, 0xC5, 0x33, 0x41, 0x4D, 0xE0, /* 'g' 0x67 */ - 0x84, 0x3D, 0x38, 0xC6, 0x31, 0x88, /* 'h' 0x68 */ - 0xBF, 0x80, /* 'i' 0x69 */ - 0x45, 0x55, 0x57, /* 'j' 0x6A */ - 0x84, 0x25, 0x4E, 0x52, 0xD2, 0x88, /* 'k' 0x6B */ - 0xFF, 0x80, /* 'l' 0x6C */ - 0xF7, 0x99, 0x91, 0x91, 0x91, 0x91, 0x91, /* 'm' 0x6D */ - 0xF4, 0x63, 0x18, 0xC6, 0x20, /* 'n' 0x6E */ - 0x39, 0x3C, 0x61, 0xC5, 0x33, 0x80, /* 'o' 0x6F */ - 0xF4, 0x63, 0x18, 0xC7, 0xD0, 0x80, /* 'p' 0x70 */ - 0x3D, 0x3C, 0x61, 0xC5, 0x37, 0x41, 0x04, /* 'q' 0x71 */ - 0xF2, 0x49, 0x20, /* 'r' 0x72 */ - 0x7A, 0x50, 0xE0, 0xE5, 0xE0, /* 's' 0x73 */ - 0x5D, 0x24, 0x93, /* 't' 0x74 */ - 0x8C, 0x63, 0x18, 0xCF, 0xA0, /* 'u' 0x75 */ - 0x85, 0x24, 0x92, 0x30, 0xC3, 0x00, /* 'v' 0x76 */ - 0x89, 0x59, 0x59, 0x55, 0x56, 0x26, 0x26, /* 'w' 0x77 */ - 0x4A, 0x4C, 0x43, 0x27, 0x20, /* 'x' 0x78 */ - 0x8A, 0x52, 0xA5, 0x18, 0x84, 0x22, 0x00, /* 'y' 0x79 */ - 0x78, 0x44, 0x46, 0x23, 0xE0, /* 'z' 0x7A */ - 0x6A, 0xAA, 0xA9, /* '{' 0x7B */ - 0xFF, 0xE0, /* '|' 0x7C */ - 0x95, 0x55, 0x56, /* '}' 0x7D */ - 0x66, 0x60, /* '~' 0x7E */ - 0xFF, 0xC0, 0x67, 0x34, 0x58, 0x4C, 0x46, 0x03, 0x11, 0x80, 0xFF, 0xC0, /* 0x7F */ - 0x1C, 0x45, 0x07, 0xE4, 0x1F, 0x10, 0x10, 0x1E, /* 0x80 */ - /* 0x81 */ - 0xE0, /* 0x82 */ - 0x6B, 0xA4, 0x92, 0x49, 0x60, /* 0x83 */ - 0xB6, 0x80, /* 0x84 */ - 0xA8, /* 0x85 */ - 0x21, 0x09, 0xF2, 0x10, 0x84, 0x21, 0x08, /* 0x86 */ - 0x21, 0x09, 0xF2, 0x10, 0x84, 0xF9, 0x08, /* 0x87 */ - 0x54, /* 0x88 */ - 0x62, 0x09, 0x40, 0x98, 0x06, 0x80, 0x10, 0x01, 0x66, 0x29, 0x92, 0x99, 0x06, 0x60, /* 0x89 */ - 0x28, 0x47, 0xA1, 0x83, 0x07, 0x83, 0x87, 0x17, 0x80, /* 0x8A */ - 0x64, /* 0x8B */ - 0x3B, 0xE8, 0xC2, 0x08, 0x41, 0x08, 0x3F, 0x04, 0x20, 0x82, 0x30, 0x3B, 0xE0, /* 0x8C */ - /* 0x8D */ - 0x14, 0x11, 0xF8, 0x30, 0xC1, 0x04, 0x18, 0x61, 0xFC, /* 0x8E */ - /* 0x8F */ - /* 0x90 */ - 0xE0, /* 0x91 */ - 0xE0, /* 0x92 */ - 0xB6, 0x80, /* 0x93 */ - 0xB6, 0x80, /* 0x94 */ - 0xFF, 0x80, /* 0x95 */ - 0xFC, /* 0x96 */ - 0xFF, 0xF0, /* 0x97 */ - 0xDB, /* 0x98 */ - 0xE6, 0x28, 0xCD, 0x19, 0xA3, 0x34, 0x6A, 0x8B, 0x51, 0x68, /* 0x99 */ - 0x52, 0x69, 0x8E, 0x19, 0x60, /* 0x9A */ - 0x98, /* 0x9B */ - 0x7B, 0xD9, 0xCE, 0x10, 0xC3, 0xF8, 0x41, 0x9C, 0x5E, 0xF0, /* 0x9C */ - /* 0x9D */ - 0x51, 0x1E, 0x11, 0x11, 0x88, 0xF8, /* 0x9E */ - 0x29, 0x05, 0x12, 0x22, 0x87, 0x04, 0x08, 0x10, 0x20, /* 0x9F */ - /* 0xA0 */ - 0xBF, 0x80, /* 0xA1 */ - 0x23, 0xAB, 0x4A, 0x52, 0xAE, 0x20, /* 0xA2 */ - 0x39, 0x14, 0x10, 0xF0, 0x82, 0x1C, 0x4C, /* 0xA3 */ - 0xFC, 0x63, 0xF0, /* 0xA4 */ - 0x8C, 0x54, 0xAF, 0x93, 0xE4, 0x20, /* 0xA5 */ - 0xF9, 0xF0, /* 0xA6 */ - 0x32, 0x91, 0xC9, 0x47, 0x26, 0x14, 0xA4, 0xC0, /* 0xA7 */ - 0xA0, /* 0xA8 */ - 0x3E, 0x3F, 0xB8, 0xF4, 0x1A, 0x0D, 0x17, 0x76, 0xC6, 0x3E, 0x00, /* 0xA9 */ - 0x61, 0x79, 0x60, /* 0xAA */ - 0x5A, 0xA5, /* 0xAB */ - 0xFC, 0x10, 0x40, /* 0xAC */ - /* 0xAD */ - 0x3E, 0x31, 0xB7, 0x72, 0x99, 0xCC, 0xC7, 0x56, 0xC6, 0x3E, 0x00, /* 0xAE */ - 0xE0, /* 0xAF */ - 0x69, 0x96, /* 0xB0 */ - 0x21, 0x3E, 0x42, 0x03, 0xE0, /* 0xB1 */ - 0x69, 0x3C, 0xF0, /* 0xB2 */ - 0x79, 0x29, 0x70, /* 0xB3 */ - 0x80, /* 0xB4 */ - 0x8A, 0x28, 0xA2, 0x8A, 0x6E, 0xE0, 0x80, /* 0xB5 */ - 0x7F, 0xAE, 0xBA, 0x68, 0xA2, 0x8A, 0x28, 0xA0, /* 0xB6 */ - 0x80, /* 0xB7 */ - 0x67, 0x80, /* 0xB8 */ - 0x75, 0x50, /* 0xB9 */ - 0x69, 0x96, 0xF0, /* 0xBA */ - 0xA5, 0x5A, /* 0xBB */ - 0x42, 0x30, 0x84, 0x41, 0x10, 0x48, 0x82, 0x61, 0x28, 0x8F, 0x20, 0x80, /* 0xBC */ - 0x40, 0x63, 0x11, 0x09, 0x74, 0xA8, 0x84, 0x44, 0x44, 0x43, 0x80, /* 0xBD */ - 0x71, 0x24, 0x82, 0x20, 0x50, 0x98, 0x9A, 0x61, 0x28, 0x4F, 0x20, 0x80, /* 0xBE */ - 0x20, 0x08, 0x44, 0x42, 0x11, 0x70, /* 0xBF */ - 0x10, 0x08, 0x00, 0x18, 0x3C, 0x24, 0x24, 0x7E, 0x42, 0xC3, /* 0xC0 */ - 0x08, 0x10, 0x00, 0x18, 0x3C, 0x24, 0x24, 0x7E, 0x42, 0xC3, /* 0xC1 */ - 0x18, 0x24, 0x00, 0x18, 0x3C, 0x24, 0x24, 0x7E, 0x42, 0xC3, /* 0xC2 */ - 0x34, 0x2C, 0x00, 0x18, 0x3C, 0x24, 0x24, 0x7E, 0x42, 0xC3, /* 0xC3 */ - 0x24, 0x00, 0x18, 0x3C, 0x24, 0x24, 0x7E, 0x42, 0x42, 0xC3, /* 0xC4 */ - 0x18, 0x24, 0x18, 0x18, 0x3C, 0x24, 0x24, 0x7E, 0x42, 0xC3, /* 0xC5 */ - 0x1F, 0xC5, 0x02, 0x40, 0x90, 0x47, 0xDF, 0x04, 0x42, 0x10, 0x87, 0xC0, /* 0xC6 */ - 0x3E, 0x61, 0xC0, 0x80, 0x80, 0x80, 0xC1, 0x63, 0x3E, 0x0C, 0x04, 0x1C, /* 0xC7 */ - 0x20, 0x40, 0x3F, 0x82, 0x0F, 0xA0, 0x83, 0xF0, /* 0xC8 */ - 0x08, 0x40, 0x3F, 0x82, 0x0F, 0xA0, 0x83, 0xF0, /* 0xC9 */ - 0x10, 0xA0, 0x3F, 0x82, 0x0F, 0xA0, 0x83, 0xF0, /* 0xCA */ - 0x28, 0x0F, 0xE0, 0x83, 0xE8, 0x20, 0x83, 0xF0, /* 0xCB */ - 0x91, 0x55, 0x50, /* 0xCC */ - 0x62, 0xAA, 0xA0, /* 0xCD */ - 0x54, 0x24, 0x92, 0x48, /* 0xCE */ - 0xA1, 0x24, 0x92, 0x48, /* 0xCF */ - 0x7C, 0x42, 0x41, 0x41, 0xF1, 0x41, 0x41, 0x42, 0x7C, /* 0xD0 */ - 0x14, 0x53, 0x0F, 0x1B, 0x32, 0x66, 0xC7, 0x87, 0x04, /* 0xD1 */ - 0x10, 0x04, 0x0F, 0x8C, 0x6C, 0x1C, 0x06, 0x03, 0x83, 0x63, 0x1F, 0x00, /* 0xD2 */ - 0x04, 0x04, 0x0F, 0x8C, 0x6C, 0x1C, 0x06, 0x03, 0x83, 0x63, 0x1F, 0x00, /* 0xD3 */ - 0x08, 0x0A, 0x00, 0x07, 0xC6, 0x36, 0x0E, 0x03, 0x01, 0xC1, 0xB1, 0x8F, 0x80, /* 0xD4 */ - 0x1A, 0x0B, 0x00, 0x07, 0xC6, 0x36, 0x0E, 0x03, 0x01, 0xC1, 0xB1, 0x8F, 0x80, /* 0xD5 */ - 0x14, 0x00, 0x00, 0x07, 0xC6, 0x36, 0x0E, 0x03, 0x01, 0xC1, 0xB1, 0x8F, 0x80, /* 0xD6 */ - 0x8A, 0x88, 0xA8, 0x80, /* 0xD7 */ - 0x3E, 0xB1, 0xB0, 0xF0, 0x98, 0x8C, 0x87, 0x86, 0xC6, 0xBE, 0x00, /* 0xD8 */ - 0x20, 0x22, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0xC6, 0xF8, /* 0xD9 */ - 0x08, 0x22, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0xC6, 0xF8, /* 0xDA */ - 0x10, 0x52, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0xC6, 0xF8, /* 0xDB */ - 0x29, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0xC6, 0xF8, /* 0xDC */ - 0x09, 0x25, 0x12, 0x22, 0x87, 0x04, 0x08, 0x10, 0x20, /* 0xDD */ - 0x83, 0xE8, 0x61, 0x87, 0xE8, 0x20, 0x80, /* 0xDE */ - 0x7A, 0x18, 0x61, 0x8A, 0x18, 0x61, 0xB8, /* 0xDF */ - 0x20, 0x20, 0x03, 0xC8, 0x40, 0x8F, 0x62, 0x8C, 0xEC, /* 0xE0 */ - 0x10, 0x40, 0x03, 0xC8, 0x40, 0x8F, 0x62, 0x8C, 0xEC, /* 0xE1 */ - 0x10, 0x50, 0x03, 0xC8, 0x40, 0x8F, 0x62, 0x8C, 0xEC, /* 0xE2 */ - 0x68, 0xB0, 0x03, 0xC8, 0x40, 0x8F, 0x62, 0x8C, 0xEC, /* 0xE3 */ - 0x28, 0x01, 0xE4, 0x20, 0x47, 0xB1, 0x46, 0x76, /* 0xE4 */ - 0x10, 0x50, 0x43, 0xC8, 0x40, 0x8F, 0x62, 0x8C, 0xEC, /* 0xE5 */ - 0x7B, 0xA1, 0x90, 0x45, 0xFF, 0x84, 0x23, 0x17, 0x38, /* 0xE6 */ - 0x7B, 0x18, 0x20, 0x83, 0x17, 0x8C, 0x11, 0xC0, /* 0xE7 */ - 0x20, 0x40, 0x1E, 0xCE, 0x1F, 0xE0, 0xC5, 0xE0, /* 0xE8 */ - 0x10, 0x80, 0x1E, 0xCE, 0x1F, 0xE0, 0xC5, 0xE0, /* 0xE9 */ - 0x10, 0xA0, 0x1E, 0xCE, 0x1F, 0xE0, 0xC5, 0xE0, /* 0xEA */ - 0x28, 0x07, 0xB3, 0x87, 0xF8, 0x31, 0x78, /* 0xEB */ - 0x91, 0x55, 0x50, /* 0xEC */ - 0x62, 0xAA, 0xA0, /* 0xED */ - 0x54, 0x24, 0x92, 0x48, /* 0xEE */ - 0xA1, 0x24, 0x92, 0x40, /* 0xEF */ - 0x28, 0x42, 0x8F, 0x46, 0x18, 0x52, 0x30, /* 0xF0 */ - 0x6A, 0xC1, 0x6C, 0xC6, 0x31, 0x8C, 0x40, /* 0xF1 */ - 0x20, 0x40, 0x1E, 0xCE, 0x18, 0x61, 0xCD, 0xE0, /* 0xF2 */ - 0x10, 0x80, 0x1E, 0xCE, 0x18, 0x61, 0xCD, 0xE0, /* 0xF3 */ - 0x10, 0xA0, 0x1E, 0xCE, 0x18, 0x61, 0xCD, 0xE0, /* 0xF4 */ - 0x69, 0x60, 0x1E, 0xCE, 0x18, 0x61, 0xCD, 0xE0, /* 0xF5 */ - 0x28, 0x07, 0xB3, 0x86, 0x18, 0x73, 0x78, /* 0xF6 */ - 0x20, 0x3E, 0x02, 0x00, /* 0xF7 */ - 0x7F, 0x39, 0x69, 0xC7, 0x3F, 0x80, /* 0xF8 */ - 0x41, 0x23, 0x18, 0xC6, 0x33, 0x68, /* 0xF9 */ - 0x11, 0x23, 0x18, 0xC6, 0x33, 0x68, /* 0xFA */ - 0x22, 0x81, 0x18, 0xC6, 0x31, 0x9B, 0x40, /* 0xFB */ - 0x50, 0x23, 0x18, 0xC6, 0x33, 0x68, /* 0xFC */ - 0x10, 0x88, 0x52, 0x49, 0x23, 0x0C, 0x30, 0x82, 0x18, /* 0xFD */ - 0x84, 0x3D, 0xB8, 0xC6, 0x3B, 0xF4, 0x20, /* 0xFE */ - 0x28, 0x08, 0x52, 0x49, 0x23, 0x0C, 0x30, 0x82, 0x18, /* 0xFF */ -}; - -const GFXglyph FreeSans6pt_Win1252Glyphs[] PROGMEM = { - /* ' ' 0x20 */ {0, 0, 0, 3, 0, 0}, - /* '!' 0x21 */ {0, 1, 9, 4, 2, -8}, - /* '"' 0x22 */ {2, 3, 3, 4, 0, -8}, - /* '#' 0x23 */ {4, 7, 8, 7, 0, -7}, - /* '$' 0x24 */ {11, 6, 11, 7, 0, -9}, - /* '%' 0x25 */ {20, 10, 9, 11, 0, -8}, - /* '&' 0x26 */ {32, 6, 9, 8, 1, -8}, - /* ''' 0x27 */ {39, 1, 3, 2, 1, -8}, - /* '(' 0x28 */ {40, 2, 11, 4, 1, -8}, - /* ')' 0x29 */ {43, 3, 11, 4, 0, -8}, - /* '*' 0x2A */ {48, 3, 3, 5, 1, -8}, - /* '+' 0x2B */ {50, 5, 5, 7, 1, -4}, - /* ',' 0x2C */ {54, 1, 3, 3, 1, 0}, - /* '-' 0x2D */ {55, 2, 1, 4, 1, -3}, - /* '.' 0x2E */ {56, 1, 1, 3, 1, 0}, - /* '/' 0x2F */ {57, 3, 9, 3, 0, -8}, - /* '0' 0x30 */ {61, 5, 9, 7, 1, -8}, - /* '1' 0x31 */ {67, 3, 9, 7, 1, -8}, - /* '2' 0x32 */ {71, 6, 9, 7, 0, -8}, - /* '3' 0x33 */ {78, 6, 9, 7, 0, -8}, - /* '4' 0x34 */ {85, 6, 9, 7, 0, -8}, - /* '5' 0x35 */ {92, 5, 9, 7, 1, -8}, - /* '6' 0x36 */ {98, 5, 9, 7, 1, -8}, - /* '7' 0x37 */ {104, 5, 9, 7, 1, -8}, - /* '8' 0x38 */ {110, 6, 9, 7, 0, -8}, - /* '9' 0x39 */ {117, 6, 9, 7, 0, -8}, - /* ':' 0x3A */ {124, 1, 7, 3, 1, -6}, - /* ';' 0x3B */ {125, 1, 8, 3, 1, -5}, - /* '<' 0x3C */ {126, 5, 5, 7, 1, -4}, - /* '=' 0x3D */ {130, 5, 3, 7, 1, -3}, - /* '>' 0x3E */ {132, 5, 5, 7, 1, -4}, - /* '?' 0x3F */ {136, 5, 9, 7, 1, -8}, - /* '@' 0x40 */ {142, 11, 11, 12, 0, -8}, - /* 'A' 0x41 */ {158, 8, 9, 8, 0, -8}, - /* 'B' 0x42 */ {167, 6, 9, 8, 1, -8}, - /* 'C' 0x43 */ {174, 8, 9, 9, 0, -8}, - /* 'D' 0x44 */ {183, 7, 9, 8, 1, -8}, - /* 'E' 0x45 */ {191, 6, 9, 8, 1, -8}, - /* 'F' 0x46 */ {198, 6, 9, 7, 1, -8}, - /* 'G' 0x47 */ {205, 8, 9, 9, 0, -8}, - /* 'H' 0x48 */ {214, 7, 9, 9, 1, -8}, - /* 'I' 0x49 */ {222, 1, 9, 3, 1, -8}, - /* 'J' 0x4A */ {224, 5, 9, 6, 0, -8}, - /* 'K' 0x4B */ {230, 7, 9, 8, 1, -8}, - /* 'L' 0x4C */ {238, 5, 9, 7, 1, -8}, - /* 'M' 0x4D */ {244, 8, 9, 10, 1, -8}, - /* 'N' 0x4E */ {253, 7, 9, 9, 1, -8}, - /* 'O' 0x4F */ {261, 9, 9, 9, 0, -8}, - /* 'P' 0x50 */ {272, 6, 9, 8, 1, -8}, - /* 'Q' 0x51 */ {279, 9, 10, 9, 0, -8}, - /* 'R' 0x52 */ {291, 7, 9, 9, 1, -8}, - /* 'S' 0x53 */ {299, 6, 9, 8, 1, -8}, - /* 'T' 0x54 */ {306, 7, 9, 8, 0, -8}, - /* 'U' 0x55 */ {314, 7, 9, 9, 1, -8}, - /* 'V' 0x56 */ {322, 7, 9, 8, 0, -8}, - /* 'W' 0x57 */ {330, 11, 9, 11, 0, -8}, - /* 'X' 0x58 */ {343, 6, 9, 8, 1, -8}, - /* 'Y' 0x59 */ {350, 8, 9, 8, 0, -8}, - /* 'Z' 0x5A */ {359, 7, 9, 7, 0, -8}, - /* '[' 0x5B */ {367, 2, 12, 3, 1, -8}, - /* '\' 0x5C */ {370, 3, 9, 3, 0, -8}, - /* ']' 0x5D */ {374, 2, 12, 3, 0, -8}, - /* '^' 0x5E */ {377, 4, 4, 6, 1, -8}, - /* '_' 0x5F */ {379, 7, 1, 7, 0, 2}, - /* '`' 0x60 */ {380, 1, 1, 3, 1, -8}, - /* 'a' 0x61 */ {381, 6, 7, 7, 0, -6}, - /* 'b' 0x62 */ {387, 5, 9, 7, 1, -8}, - /* 'c' 0x63 */ {393, 6, 7, 6, 0, -6}, - /* 'd' 0x64 */ {399, 6, 9, 7, 0, -8}, - /* 'e' 0x65 */ {406, 6, 7, 6, 0, -6}, - /* 'f' 0x66 */ {412, 3, 9, 3, 0, -8}, - /* 'g' 0x67 */ {416, 6, 10, 7, 0, -6}, - /* 'h' 0x68 */ {424, 5, 9, 6, 1, -8}, - /* 'i' 0x69 */ {430, 1, 9, 3, 1, -8}, - /* 'j' 0x6A */ {432, 2, 12, 3, 0, -8}, - /* 'k' 0x6B */ {435, 5, 9, 6, 1, -8}, - /* 'l' 0x6C */ {441, 1, 9, 3, 1, -8}, - /* 'm' 0x6D */ {443, 8, 7, 10, 1, -6}, - /* 'n' 0x6E */ {450, 5, 7, 6, 1, -6}, - /* 'o' 0x6F */ {455, 6, 7, 6, 0, -6}, - /* 'p' 0x70 */ {461, 5, 9, 7, 1, -6}, - /* 'q' 0x71 */ {467, 6, 9, 7, 0, -6}, - /* 'r' 0x72 */ {474, 3, 7, 4, 1, -6}, - /* 's' 0x73 */ {477, 5, 7, 6, 0, -6}, - /* 't' 0x74 */ {482, 3, 8, 3, 0, -7}, - /* 'u' 0x75 */ {485, 5, 7, 6, 1, -6}, - /* 'v' 0x76 */ {490, 6, 7, 6, 0, -6}, - /* 'w' 0x77 */ {496, 8, 7, 9, 0, -6}, - /* 'x' 0x78 */ {503, 5, 7, 6, 0, -6}, - /* 'y' 0x79 */ {508, 5, 10, 6, 0, -6}, - /* 'z' 0x7A */ {515, 5, 7, 6, 0, -6}, - /* '{' 0x7B */ {520, 2, 12, 4, 1, -8}, - /* '|' 0x7C */ {523, 1, 11, 3, 1, -8}, - /* '}' 0x7D */ {525, 2, 12, 4, 1, -8}, - /* '~' 0x7E */ {528, 6, 2, 6, 0, -4}, - /* 0x7F */ {530, 9, 10, 11, 1, -8}, - /* 0x80 */ {542, 7, 9, 8, 0, -8}, - /* 0x81 */ {550, 0, 0, 8, 0, 0}, - /* 0x82 */ {550, 1, 3, 3, 1, 0}, - /* 0x83 */ {551, 3, 12, 3, 0, -8}, - /* 0x84 */ {556, 3, 3, 5, 1, 0}, - /* 0x85 */ {558, 5, 1, 7, 1, 0}, - /* 0x86 */ {559, 5, 11, 7, 1, -8}, - /* 0x87 */ {566, 5, 11, 7, 1, -8}, - /* 0x88 */ {573, 3, 2, 4, 0, -9}, - /* 0x89 */ {574, 12, 9, 12, 0, -8}, - /* 0x8A */ {588, 6, 11, 8, 1, -9}, - /* 0x8B */ {597, 2, 3, 4, 1, -4}, - /* 0x8C */ {598, 11, 9, 12, 0, -8}, - /* 0x8D */ {611, 0, 0, 8, 0, 0}, - /* 0x8E */ {611, 7, 10, 7, 0, -9}, - /* 0x8F */ {620, 0, 0, 8, 0, 0}, - /* 0x90 */ {620, 0, 0, 8, 0, 0}, - /* 0x91 */ {620, 1, 3, 3, 1, -8}, - /* 0x92 */ {621, 1, 3, 2, 1, -8}, - /* 0x93 */ {622, 3, 3, 5, 1, -8}, - /* 0x94 */ {624, 3, 3, 5, 1, -8}, - /* 0x95 */ {626, 3, 3, 5, 1, -5}, - /* 0x96 */ {628, 6, 1, 6, 0, -3}, - /* 0x97 */ {629, 12, 1, 12, 0, -3}, - /* 0x98 */ {631, 4, 2, 4, 0, -8}, - /* 0x99 */ {632, 11, 7, 12, 1, -8}, - /* 0x9A */ {642, 4, 9, 6, 1, -8}, - /* 0x9B */ {647, 2, 3, 3, 1, -4}, - /* 0x9C */ {648, 11, 7, 11, 0, -6}, - /* 0x9D */ {658, 0, 0, 8, 0, 0}, - /* 0x9E */ {658, 5, 9, 6, 0, -8}, - /* 0x9F */ {664, 7, 10, 8, 1, -9}, - /* 0xA0 */ {673, 0, 0, 3, 0, 0}, - /* 0xA1 */ {673, 1, 9, 4, 1, -5}, - /* 0xA2 */ {675, 5, 9, 7, 1, -7}, - /* 0xA3 */ {681, 6, 9, 7, 0, -8}, - /* 0xA4 */ {688, 5, 4, 7, 1, -5}, - /* 0xA5 */ {691, 5, 9, 7, 1, -8}, - /* 0xA6 */ {697, 1, 12, 3, 1, -8}, - /* 0xA7 */ {699, 5, 12, 7, 1, -8}, - /* 0xA8 */ {707, 3, 1, 4, 0, -7}, - /* 0xA9 */ {708, 9, 9, 10, 0, -8}, - /* 0xAA */ {719, 4, 5, 4, 0, -8}, - /* 0xAB */ {722, 4, 4, 6, 1, -4}, - /* 0xAC */ {724, 6, 3, 7, 1, -4}, - /* 0xAD */ {727, 0, 0, 0, 0, 0}, - /* 0xAE */ {727, 9, 9, 10, 0, -8}, - /* 0xAF */ {738, 3, 1, 4, 0, -8}, - /* 0xB0 */ {739, 4, 4, 7, 2, -8}, - /* 0xB1 */ {741, 5, 7, 7, 1, -6}, - /* 0xB2 */ {746, 4, 5, 4, 0, -9}, - /* 0xB3 */ {749, 4, 5, 4, 0, -9}, - /* 0xB4 */ {752, 1, 1, 4, 1, -8}, - /* 0xB5 */ {753, 6, 9, 7, 1, -6}, - /* 0xB6 */ {760, 6, 10, 6, 1, -8}, - /* 0xB7 */ {768, 1, 1, 3, 1, -2}, - /* 0xB8 */ {769, 3, 3, 4, 1, 1}, - /* 0xB9 */ {771, 2, 6, 4, 1, -9}, - /* 0xBA */ {773, 4, 5, 4, 0, -8}, - /* 0xBB */ {776, 4, 4, 6, 1, -5}, - /* 0xBC */ {778, 10, 9, 10, 1, -8}, - /* 0xBD */ {790, 9, 9, 10, 1, -8}, - /* 0xBE */ {801, 10, 9, 11, 0, -8}, - /* 0xBF */ {813, 5, 9, 7, 1, -5}, - /* 0xC0 */ {819, 8, 10, 8, 0, -9}, - /* 0xC1 */ {829, 8, 10, 8, 0, -9}, - /* 0xC2 */ {839, 8, 10, 8, 0, -9}, - /* 0xC3 */ {849, 8, 10, 8, 0, -9}, - /* 0xC4 */ {859, 8, 10, 8, 0, -9}, - /* 0xC5 */ {869, 8, 10, 8, 0, -9}, - /* 0xC6 */ {879, 10, 9, 12, 1, -8}, - /* 0xC7 */ {891, 8, 12, 9, 0, -8}, - /* 0xC8 */ {903, 6, 10, 8, 1, -9}, - /* 0xC9 */ {911, 6, 10, 8, 1, -9}, - /* 0xCA */ {919, 6, 10, 8, 1, -9}, - /* 0xCB */ {927, 6, 10, 8, 1, -9}, - /* 0xCC */ {935, 2, 10, 3, 0, -9}, - /* 0xCD */ {938, 2, 10, 3, 1, -9}, - /* 0xCE */ {941, 3, 10, 4, 0, -9}, - /* 0xCF */ {945, 3, 10, 4, 0, -9}, - /* 0xD0 */ {949, 8, 9, 8, 0, -8}, - /* 0xD1 */ {958, 7, 10, 9, 1, -9}, - /* 0xD2 */ {967, 9, 10, 9, 0, -9}, - /* 0xD3 */ {979, 9, 10, 9, 0, -9}, - /* 0xD4 */ {991, 9, 11, 9, 0, -10}, - /* 0xD5 */ {1004, 9, 11, 9, 0, -10}, - /* 0xD6 */ {1017, 9, 11, 9, 0, -10}, - /* 0xD7 */ {1030, 5, 5, 7, 1, -5}, - /* 0xD8 */ {1034, 9, 9, 9, 0, -8}, - /* 0xD9 */ {1045, 7, 10, 9, 1, -9}, - /* 0xDA */ {1054, 7, 10, 9, 1, -9}, - /* 0xDB */ {1063, 7, 10, 9, 1, -9}, - /* 0xDC */ {1072, 7, 10, 9, 1, -9}, - /* 0xDD */ {1081, 7, 10, 8, 1, -9}, - /* 0xDE */ {1090, 6, 9, 8, 1, -8}, - /* 0xDF */ {1097, 6, 9, 7, 1, -8}, - /* 0xE0 */ {1104, 7, 10, 7, 0, -9}, - /* 0xE1 */ {1113, 7, 10, 7, 0, -9}, - /* 0xE2 */ {1122, 7, 10, 7, 0, -9}, - /* 0xE3 */ {1131, 7, 10, 7, 0, -9}, - /* 0xE4 */ {1140, 7, 9, 7, 0, -8}, - /* 0xE5 */ {1148, 7, 10, 7, 0, -9}, - /* 0xE6 */ {1157, 10, 7, 10, 0, -6}, - /* 0xE7 */ {1166, 6, 10, 6, 0, -6}, - /* 0xE8 */ {1174, 6, 10, 6, 0, -9}, - /* 0xE9 */ {1182, 6, 10, 6, 0, -9}, - /* 0xEA */ {1190, 6, 10, 6, 0, -9}, - /* 0xEB */ {1198, 6, 9, 6, 0, -8}, - /* 0xEC */ {1205, 2, 10, 3, 0, -9}, - /* 0xED */ {1208, 2, 10, 3, 1, -9}, - /* 0xEE */ {1211, 3, 10, 3, 0, -9}, - /* 0xEF */ {1215, 3, 9, 3, 0, -8}, - /* 0xF0 */ {1219, 6, 9, 6, 0, -8}, - /* 0xF1 */ {1226, 5, 10, 6, 1, -9}, - /* 0xF2 */ {1233, 6, 10, 6, 0, -9}, - /* 0xF3 */ {1241, 6, 10, 6, 0, -9}, - /* 0xF4 */ {1249, 6, 10, 6, 0, -9}, - /* 0xF5 */ {1257, 6, 10, 6, 0, -9}, - /* 0xF6 */ {1265, 6, 9, 6, 0, -8}, - /* 0xF7 */ {1272, 5, 5, 7, 1, -5}, - /* 0xF8 */ {1276, 6, 7, 6, 0, -6}, - /* 0xF9 */ {1282, 5, 9, 6, 1, -8}, - /* 0xFA */ {1288, 5, 9, 6, 1, -8}, - /* 0xFB */ {1294, 5, 10, 6, 1, -9}, - /* 0xFC */ {1301, 5, 9, 6, 1, -8}, - /* 0xFD */ {1307, 6, 12, 6, 0, -8}, - /* 0xFE */ {1316, 5, 11, 7, 1, -8}, - /* 0xFF */ {1323, 6, 12, 6, 0, -8}, -}; - -const GFXfont FreeSans6pt_Win1252 PROGMEM = {(uint8_t *)FreeSans6pt_Win1252Bitmaps, (GFXglyph *)FreeSans6pt_Win1252Glyphs, 0x20, - 0xFF, 14}; diff --git a/src/graphics/niche/Fonts/FreeSans9pt_Win1250.h b/src/graphics/niche/Fonts/FreeSans9pt_Win1250.h deleted file mode 100644 index 7022939a09..0000000000 --- a/src/graphics/niche/Fonts/FreeSans9pt_Win1250.h +++ /dev/null @@ -1,494 +0,0 @@ -#pragma once -const uint8_t FreeSans9pt_Win1250Bitmaps[] PROGMEM = { - /* ' ' 0x20 */ - 0xFF, 0xFF, 0xF0, 0xC0, /* '!' 0x21 */ - 0xDE, 0xF7, 0x20, /* '"' 0x22 */ - 0x09, 0x86, 0x41, 0x91, 0xFF, 0x13, 0x04, 0xC3, 0x20, 0xC8, 0xFF, 0x89, 0x82, 0x61, 0x90, /* '#' 0x23 */ - 0x10, 0x1F, 0x14, 0xDA, 0x3D, 0x1E, 0x83, 0x40, 0x78, 0x17, 0x08, 0xF4, 0x7A, 0x35, 0x33, 0xF0, 0x40, 0x20, /* '$' 0x24 */ - 0x38, 0x10, 0xEC, 0x20, 0xC6, 0x20, 0xC6, 0x40, 0xC6, 0x40, 0x6C, 0x80, 0x39, 0x00, 0x01, 0x3C, 0x02, 0x77, 0x02, 0x63, 0x04, - 0x63, 0x04, 0x77, 0x08, 0x3C, /* '%' 0x25 */ - 0x0E, 0x0C, 0xC3, 0x30, 0xCC, 0x1E, 0x03, 0x03, 0xC1, 0x9B, 0xC2, 0xF0, 0xEC, 0x19, 0x8F, 0x3C, 0x40, /* '&' 0x26 */ - 0xFE, /* ''' 0x27 */ - 0x13, 0x26, 0x6C, 0xCC, 0xCC, 0xC4, 0x66, 0x23, 0x10, /* '(' 0x28 */ - 0x8C, 0x46, 0x63, 0x33, 0x33, 0x32, 0x66, 0x4C, 0x80, /* ')' 0x29 */ - 0x25, 0x7E, 0xA5, 0x00, /* '*' 0x2A */ - 0x30, 0xC3, 0x3F, 0x30, 0xC3, 0x0C, /* '+' 0x2B */ - 0xD6, /* ',' 0x2C */ - 0xF0, /* '-' 0x2D */ - 0xC0, /* '.' 0x2E */ - 0x08, 0x44, 0x21, 0x10, 0x84, 0x42, 0x11, 0x08, 0x00, /* '/' 0x2F */ - 0x3C, 0x66, 0x42, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x42, 0x66, 0x3C, /* '0' 0x30 */ - 0x11, 0x3F, 0x33, 0x33, 0x33, 0x33, 0x30, /* '1' 0x31 */ - 0x3E, 0x31, 0xB0, 0x78, 0x30, 0x18, 0x1C, 0x1C, 0x1C, 0x18, 0x18, 0x10, 0x08, 0x07, 0xF8, /* '2' 0x32 */ - 0x3C, 0x66, 0xC3, 0xC3, 0x03, 0x06, 0x1C, 0x07, 0x03, 0xC3, 0xC3, 0x66, 0x3C, /* '3' 0x33 */ - 0x0C, 0x18, 0x71, 0x62, 0xC9, 0xA3, 0x46, 0xFE, 0x18, 0x30, 0x60, 0xC0, /* '4' 0x34 */ - 0x7F, 0x20, 0x10, 0x08, 0x08, 0x07, 0xF3, 0x8C, 0x03, 0x01, 0x80, 0xF0, 0x6C, 0x63, 0xE0, /* '5' 0x35 */ - 0x1E, 0x31, 0x98, 0x78, 0x0C, 0x06, 0xF3, 0x8D, 0x83, 0xC1, 0xE0, 0xD0, 0x6C, 0x63, 0xE0, /* '6' 0x36 */ - 0xFF, 0x03, 0x02, 0x06, 0x04, 0x0C, 0x08, 0x18, 0x18, 0x18, 0x10, 0x30, 0x30, /* '7' 0x37 */ - 0x3E, 0x31, 0xB0, 0x78, 0x3C, 0x1B, 0x18, 0xF8, 0xC6, 0xC1, 0xE0, 0xF0, 0x6C, 0x63, 0xE0, /* '8' 0x38 */ - 0x3C, 0x66, 0xC2, 0xC3, 0xC3, 0xC3, 0x67, 0x3B, 0x03, 0x03, 0xC2, 0x66, 0x3C, /* '9' 0x39 */ - 0xC0, 0x00, 0x30, /* ':' 0x3A */ - 0xC0, 0x00, 0x00, 0x64, 0xA0, /* ';' 0x3B */ - 0x00, 0x81, 0xC7, 0x8E, 0x0C, 0x07, 0x80, 0x70, 0x0E, 0x01, 0x80, /* '<' 0x3C */ - 0xFF, 0x80, 0x00, 0x1F, 0xF0, /* '=' 0x3D */ - 0xE0, 0x1C, 0x03, 0x80, 0x30, 0x70, 0xE3, 0x81, 0x00, /* '>' 0x3E */ - 0x3E, 0x31, 0xB0, 0x78, 0x30, 0x18, 0x18, 0x38, 0x18, 0x18, 0x0C, 0x00, 0x00, 0x01, 0x80, /* '?' 0x3F */ - 0x03, 0xF0, 0x06, 0x0E, 0x06, 0x01, 0x86, 0x00, 0x66, 0x1D, 0xBB, 0x31, 0xCF, 0x18, 0xC7, 0x98, 0x63, 0xCC, 0x31, 0xE6, 0x11, - 0xB3, 0x99, 0xCC, 0xF7, 0x86, 0x00, 0x01, 0x80, 0x00, 0x70, 0x40, 0x0F, 0xE0, /* '@' 0x40 */ - 0x06, 0x00, 0xF0, 0x0F, 0x00, 0x90, 0x19, 0x81, 0x98, 0x10, 0x83, 0x0C, 0x3F, 0xC2, 0x04, 0x60, 0x66, 0x06, 0xC0, - 0x30, /* 'A' 0x41 */ - 0xFF, 0x18, 0x33, 0x03, 0x60, 0x6C, 0x0D, 0x83, 0x3F, 0xC6, 0x06, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x6F, 0xF8, /* 'B' 0x42 */ - 0x1F, 0x86, 0x19, 0x81, 0xA0, 0x3C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x68, 0x0D, 0x83, 0x18, 0x61, 0xF0, /* 'C' 0x43 */ - 0xFF, 0x18, 0x33, 0x03, 0x60, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x03, 0x60, 0xCF, 0xF0, /* 'D' 0x44 */ - 0xFF, 0xE0, 0x30, 0x18, 0x0C, 0x06, 0x03, 0xFD, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0F, 0xF8, /* 'E' 0x45 */ - 0xFF, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xFE, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, /* 'F' 0x46 */ - 0x0F, 0x83, 0x0E, 0x60, 0x66, 0x03, 0xC0, 0x0C, 0x00, 0xC1, 0xFC, 0x03, 0xC0, 0x36, 0x03, 0x60, 0x73, 0x0F, 0x0F, - 0x10, /* 'G' 0x47 */ - 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xFF, 0xFE, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x06, /* 'H' 0x48 */ - 0xFF, 0xFF, 0xFF, 0xC0, /* 'I' 0x49 */ - 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x07, 0x8F, 0x1E, 0x27, 0x80, /* 'J' 0x4A */ - 0xC0, 0xF0, 0x6C, 0x33, 0x18, 0xCC, 0x37, 0x0F, 0xC3, 0x98, 0xC3, 0x30, 0xCC, 0x1B, 0x03, 0xC0, 0xC0, /* 'K' 0x4B */ - 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xFF, /* 'L' 0x4C */ - 0xE0, 0x3F, 0x01, 0xFC, 0x1F, 0xE0, 0xFD, 0x05, 0xEC, 0x6F, 0x63, 0x79, 0x13, 0xCD, 0x9E, 0x6C, 0xF1, 0x47, 0x8E, 0x3C, 0x71, - 0x80, /* 'M' 0x4D */ - 0xE0, 0x7C, 0x0F, 0xC1, 0xE8, 0x3D, 0x87, 0x98, 0xF1, 0x1E, 0x33, 0xC3, 0x78, 0x6F, 0x07, 0xE0, 0x7C, 0x0E, /* 'N' 0x4E */ - 0x0F, 0x81, 0x83, 0x18, 0x0C, 0xC0, 0x6C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1B, 0x01, 0x98, 0x0C, 0x60, 0xC0, 0xF8, - 0x00, /* 'O' 0x4F */ - 0xFF, 0x30, 0x6C, 0x0F, 0x03, 0xC0, 0xF0, 0x6F, 0xF3, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x00, /* 'P' 0x50 */ - 0x0F, 0x81, 0x83, 0x18, 0x0C, 0xC0, 0x6C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1B, 0x01, 0x98, 0x6C, 0x60, 0xC0, 0xFB, - 0x00, 0x08, /* 'Q' 0x51 */ - 0xFF, 0x8C, 0x0E, 0xC0, 0x6C, 0x06, 0xC0, 0x6C, 0x0C, 0xFF, 0x8C, 0x0E, 0xC0, 0x6C, 0x06, 0xC0, 0x6C, 0x06, 0xC0, - 0x70, /* 'R' 0x52 */ - 0x3F, 0x18, 0x6C, 0x0F, 0x03, 0xC0, 0x1E, 0x01, 0xF0, 0x0E, 0x00, 0xF0, 0x3C, 0x0D, 0x86, 0x3F, 0x00, /* 'S' 0x53 */ - 0xFF, 0x86, 0x03, 0x01, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xC0, /* 'T' 0x54 */ - 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xB0, 0x61, 0xF0, /* 'U' 0x55 */ - 0xC0, 0x6C, 0x0D, 0x81, 0x10, 0x63, 0x0C, 0x61, 0x04, 0x60, 0xCC, 0x19, 0x01, 0x60, 0x3C, 0x07, 0x00, 0x60, /* 'V' 0x56 */ - 0xC1, 0x81, 0x61, 0xC3, 0x61, 0xC3, 0x61, 0x43, 0x62, 0x62, 0x22, 0x66, 0x32, 0x26, 0x36, 0x26, 0x14, 0x34, 0x14, 0x34, 0x1C, - 0x1C, 0x18, 0x1C, 0x08, 0x18, /* 'W' 0x57 */ - 0xC0, 0xD8, 0x66, 0x18, 0xCC, 0x1E, 0x07, 0x00, 0xC0, 0x78, 0x32, 0x0C, 0xC6, 0x1B, 0x07, 0xC0, 0xC0, /* 'X' 0x58 */ - 0xC0, 0x36, 0x06, 0x30, 0xC3, 0x0C, 0x19, 0x81, 0xD8, 0x0F, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, - 0x00, /* 'Y' 0x59 */ - 0xFF, 0xC0, 0x60, 0x30, 0x0C, 0x06, 0x03, 0x01, 0xC0, 0x60, 0x30, 0x18, 0x06, 0x03, 0x00, 0xFF, 0xC0, /* 'Z' 0x5A */ - 0xFB, 0x6D, 0xB6, 0xDB, 0x6D, 0xB6, 0xE0, /* '[' 0x5B */ - 0x84, 0x10, 0x84, 0x10, 0x84, 0x10, 0x84, 0x10, 0x80, /* '\' 0x5C */ - 0xED, 0xB6, 0xDB, 0x6D, 0xB6, 0xDB, 0xE0, /* ']' 0x5D */ - 0x30, 0x60, 0xA2, 0x44, 0xD8, 0xA1, 0x80, /* '^' 0x5E */ - 0xFF, 0xC0, /* '_' 0x5F */ - 0xC6, 0x30, /* '`' 0x60 */ - 0x7E, 0x71, 0xB0, 0xC0, 0x60, 0xF3, 0xDB, 0x0D, 0x86, 0xC7, 0x3D, 0xC0, /* 'a' 0x61 */ - 0xC0, 0x60, 0x30, 0x1B, 0xCE, 0x36, 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x7C, 0x6D, 0xE0, /* 'b' 0x62 */ - 0x3C, 0x66, 0xC3, 0xC0, 0xC0, 0xC0, 0xC0, 0xC3, 0x66, 0x3C, /* 'c' 0x63 */ - 0x03, 0x03, 0x03, 0x3B, 0x67, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x67, 0x3B, /* 'd' 0x64 */ - 0x3C, 0x66, 0xC3, 0xC3, 0xFF, 0xC0, 0xC0, 0xC3, 0x66, 0x3C, /* 'e' 0x65 */ - 0x36, 0x6F, 0x66, 0x66, 0x66, 0x66, 0x60, /* 'f' 0x66 */ - 0x3B, 0x67, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x67, 0x3B, 0x03, 0x03, 0xC6, 0x7C, /* 'g' 0x67 */ - 0xC0, 0xC0, 0xC0, 0xDE, 0xE3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, /* 'h' 0x68 */ - 0xC3, 0xFF, 0xFF, 0xC0, /* 'i' 0x69 */ - 0x30, 0x03, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0xE0, /* 'j' 0x6A */ - 0xC0, 0xC0, 0xC0, 0xC2, 0xC4, 0xCC, 0xD8, 0xF8, 0xEC, 0xC4, 0xC6, 0xC3, 0xC3, /* 'k' 0x6B */ - 0xFF, 0xFF, 0xFF, 0xC0, /* 'l' 0x6C */ - 0xDE, 0xF7, 0x1C, 0xF0, 0xC7, 0x86, 0x3C, 0x31, 0xE1, 0x8F, 0x0C, 0x78, 0x63, 0xC3, 0x1E, 0x18, 0xC0, /* 'm' 0x6D */ - 0xDE, 0xE3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, /* 'n' 0x6E */ - 0x3C, 0x66, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x66, 0x3C, /* 'o' 0x6F */ - 0xDE, 0x71, 0xB0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xE3, 0x6F, 0x30, 0x18, 0x0C, 0x00, /* 'p' 0x70 */ - 0x3B, 0x67, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x67, 0x3B, 0x03, 0x03, 0x03, /* 'q' 0x71 */ - 0xDF, 0x31, 0x8C, 0x63, 0x18, 0xC6, 0x00, /* 'r' 0x72 */ - 0x3E, 0xE3, 0xC0, 0xC0, 0xE0, 0x3C, 0x07, 0xC3, 0xE3, 0x7E, /* 's' 0x73 */ - 0x66, 0xF6, 0x66, 0x66, 0x66, 0x67, /* 't' 0x74 */ - 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC7, 0x7B, /* 'u' 0x75 */ - 0xC1, 0xA0, 0x98, 0xCC, 0x42, 0x21, 0xB0, 0xD0, 0x28, 0x1C, 0x0C, 0x00, /* 'v' 0x76 */ - 0xC6, 0x1E, 0x38, 0x91, 0xC4, 0xCA, 0x66, 0xD3, 0x16, 0xD0, 0xA6, 0x87, 0x1C, 0x38, 0xC0, 0xC6, 0x00, /* 'w' 0x77 */ - 0x87, 0x89, 0xB1, 0xC3, 0x07, 0x1E, 0x26, 0xC5, 0x0C, /* 'x' 0x78 */ - 0xC1, 0x43, 0x63, 0x62, 0x26, 0x36, 0x34, 0x1C, 0x1C, 0x18, 0x18, 0x18, 0x10, 0x60, /* 'y' 0x79 */ - 0xFE, 0x0C, 0x30, 0xC1, 0x86, 0x18, 0x20, 0xC1, 0xFC, /* 'z' 0x7A */ - 0x36, 0x66, 0x66, 0x6E, 0xCE, 0x66, 0x66, 0x66, 0x30, /* '{' 0x7B */ - 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, /* '|' 0x7C */ - 0xC6, 0x66, 0x66, 0x67, 0x37, 0x66, 0x66, 0x66, 0xC0, /* '}' 0x7D */ - 0x61, 0x24, 0x38, /* '~' 0x7E */ - 0xFF, 0xFC, 0x00, 0x63, 0xE3, 0x31, 0x99, 0x04, 0xC8, 0x66, 0x06, 0x30, 0x61, 0x83, 0x0C, 0x18, 0x60, 0x03, 0x06, 0x18, 0x00, - 0xFF, 0xFC, /* 0x7F */ - 0x07, 0xC6, 0x13, 0x00, 0xC0, 0x60, 0x3F, 0xE6, 0x03, 0xFC, 0x60, 0x0C, 0x03, 0x00, 0x61, 0x07, 0xC0, /* 0x80 */ - /* 0x81 */ - 0xDC, /* 0x82 */ - /* 0x83 */ - 0xDA, 0x76, /* 0x84 */ - 0xCC, 0xC0, /* 0x85 */ - 0x18, 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, /* 0x86 */ - 0x18, 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18, 0x18, /* 0x87 */ - /* 0x88 */ - 0x70, 0x80, 0x22, 0x20, 0x08, 0x90, 0x02, 0x24, 0x00, 0x72, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x10, 0x00, 0x09, 0xC7, 0x84, - 0x8B, 0x31, 0x22, 0x84, 0x88, 0xB3, 0x21, 0xC7, 0x80, /* 0x89 */ - 0x1B, 0x03, 0x83, 0xF1, 0x86, 0xC0, 0xF0, 0x3C, 0x01, 0xE0, 0x1F, 0x00, 0xE0, 0x0F, 0x03, 0xC0, 0xD8, 0x63, 0xF0, /* 0x8A */ - 0x69, /* 0x8B */ - 0x06, 0x03, 0x03, 0xF1, 0x86, 0xC0, 0xF0, 0x3C, 0x01, 0xE0, 0x1F, 0x00, 0xE0, 0x0F, 0x03, 0xC0, 0xD8, 0x63, 0xF0, /* 0x8C */ - 0x33, 0x0F, 0x3F, 0xE1, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xC0, 0x60, 0x30, /* 0x8D */ - 0x1B, 0x03, 0x8F, 0xFC, 0x06, 0x03, 0x00, 0xC0, 0x60, 0x30, 0x1C, 0x06, 0x03, 0x01, 0x80, 0x60, 0x30, 0x0F, 0xFC, /* 0x8E */ - 0x0C, 0x06, 0x0F, 0xFC, 0x06, 0x03, 0x00, 0xC0, 0x60, 0x30, 0x1C, 0x06, 0x03, 0x01, 0x80, 0x60, 0x30, 0x0F, 0xFC, /* 0x8F */ - /* 0x90 */ - 0x6B, /* 0x91 */ - 0xD6, /* 0x92 */ - 0x4C, 0xA5, 0xB0, /* 0x93 */ - 0xDA, 0x53, 0x20, /* 0x94 */ - 0x6F, 0xFF, 0x60, /* 0x95 */ - 0xFE, /* 0x96 */ - 0xFF, 0xFF, /* 0x97 */ - /* 0x98 */ - 0xFC, 0xE1, 0xCC, 0x38, 0x73, 0x0E, 0x1C, 0xC3, 0x8F, 0x30, 0xD2, 0xCC, 0x34, 0xB3, 0x0D, 0x6C, 0xC3, 0x53, 0x30, 0xCC, 0xCC, - 0x33, 0x30, /* 0x99 */ - 0x24, 0x3C, 0x18, 0x7E, 0xE3, 0xC0, 0xC0, 0x60, 0x3C, 0x07, 0xC3, 0xE3, 0x7E, /* 0x9A */ - 0x96, /* 0x9B */ - 0x0C, 0x18, 0x10, 0x3E, 0xE3, 0xC0, 0xC0, 0xE0, 0x3C, 0x07, 0xC3, 0xE3, 0x7E, /* 0x9C */ - 0x0D, 0xA7, 0x3C, 0x61, 0x86, 0x18, 0x61, 0x86, 0x18, 0x70, /* 0x9D */ - 0x48, 0xF0, 0xC7, 0xF0, 0x61, 0x86, 0x0C, 0x30, 0xC1, 0x06, 0x0F, 0xE0, /* 0x9E */ - 0x0C, 0x10, 0x47, 0xF0, 0x61, 0x86, 0x0C, 0x30, 0xC1, 0x06, 0x0F, 0xE0, /* 0x9F */ - /* 0xA0 */ - 0x8A, 0x9C, /* 0xA1 */ - 0x85, 0xE0, /* 0xA2 */ - 0x60, 0x30, 0x18, 0x0C, 0x86, 0xC3, 0xC1, 0xC1, 0xC0, 0xE0, 0x30, 0x18, 0x0C, 0x07, 0xF8, /* 0xA3 */ - 0xFF, 0xDF, 0x1E, 0x3E, 0xFF, 0xC0, /* 0xA4 */ - 0x06, 0x00, 0xF0, 0x0F, 0x01, 0x30, 0x13, 0x81, 0x38, 0x21, 0x82, 0x1C, 0x3F, 0xC6, 0x04, 0x60, 0x66, 0x06, 0xC0, 0x30, 0x06, - 0x00, 0xC0, 0x0C, 0x00, 0x70, /* 0xA5 */ - 0xFF, 0xFC, 0x0F, 0xFF, 0xC0, /* 0xA6 */ - 0x0C, 0x09, 0x0C, 0xC6, 0x63, 0x81, 0xE3, 0x19, 0x87, 0xE1, 0xB8, 0xC6, 0x41, 0xC0, 0x73, 0x19, 0x8C, 0x66, 0x1E, - 0x00, /* 0xA7 */ - 0xCC, /* 0xA8 */ - 0x0F, 0xC0, 0x61, 0x87, 0x03, 0x9B, 0xC6, 0xD9, 0x8F, 0x60, 0x3D, 0x00, 0xF4, 0x03, 0xD8, 0x0D, 0xE6, 0x67, 0xF3, 0x86, 0x18, - 0x0F, 0xC0, /* 0xA9 */ - 0x3F, 0x18, 0x6C, 0x0F, 0x03, 0xC0, 0x1E, 0x01, 0xF0, 0x0E, 0x00, 0xF0, 0x3C, 0x0D, 0x86, 0x3F, 0x02, 0x00, 0xE0, 0x18, 0x1C, - 0x00, /* 0xAA */ - 0x22, 0xCF, 0x26, 0x46, 0x64, 0x40, /* 0xAB */ - 0xFF, 0x80, 0xC0, 0x60, 0x30, 0x18, /* 0xAC */ - /* 0xAD */ - 0x0F, 0xC0, 0x61, 0x87, 0x03, 0x9F, 0xE6, 0xD0, 0x8F, 0x42, 0x3D, 0xF0, 0xF4, 0x23, 0xD0, 0x8D, 0xC2, 0x67, 0x0B, 0x86, 0x18, - 0x0F, 0xC0, /* 0xAE */ - 0x0C, 0x00, 0x0F, 0xFC, 0x06, 0x03, 0x00, 0xC0, 0x60, 0x30, 0x1C, 0x06, 0x03, 0x01, 0x80, 0x60, 0x30, 0x0F, 0xFC, /* 0xAF */ - 0x74, 0x63, 0x17, 0x00, /* 0xB0 */ - 0x0C, 0x06, 0x03, 0x07, 0xE0, 0xC0, 0x60, 0x30, 0x18, 0x00, 0x00, 0x3F, 0xE0, /* 0xB1 */ - 0x6C, 0xC7, /* 0xB2 */ - 0x66, 0x66, 0x67, 0x6E, 0x66, 0x66, 0x60, /* 0xB3 */ - 0x36, 0xC0, /* 0xB4 */ - 0xC3, 0x61, 0xB0, 0xD8, 0x6C, 0x36, 0x1B, 0x0D, 0x86, 0xE7, 0x7D, 0xF0, 0x18, 0x0C, 0x00, /* 0xB5 */ - 0x3F, 0x7E, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0x72, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, /* 0xB6 */ - 0xE0, /* 0xB7 */ - 0x21, 0xC7, 0xE0, /* 0xB8 */ - 0x7E, 0x38, 0xCC, 0x30, 0x0C, 0x0F, 0x1E, 0xCC, 0x33, 0x0C, 0xC7, 0x1E, 0xE0, 0x10, 0x0C, 0x03, 0x00, 0x70, /* 0xB9 */ - 0x3E, 0xE3, 0xC0, 0xC0, 0xE0, 0x3C, 0x07, 0xC3, 0xC3, 0x7E, 0x10, 0x1C, 0x0C, 0x38, /* 0xBA */ - 0x89, 0x98, 0x99, 0x3C, 0xD1, 0x00, /* 0xBB */ - 0xC6, 0xC4, 0xC8, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xFF, /* 0xBC */ - 0x6F, 0x69, 0x00, /* 0xBD */ - 0xDE, 0xB9, 0x8C, 0x63, 0x18, 0xC6, 0x31, 0x8C, 0x00, /* 0xBE */ - 0x30, 0x03, 0xF8, 0x30, 0xC3, 0x06, 0x18, 0x60, 0x83, 0x07, 0xF0, /* 0xBF */ - 0x06, 0x00, 0xC0, 0xFF, 0x8C, 0x0E, 0xC0, 0x6C, 0x06, 0xC0, 0x6C, 0x0C, 0xFF, 0x8C, 0x0E, 0xC0, 0x6C, 0x06, 0xC0, 0x6C, 0x06, - 0xC0, 0x70, /* 0xC0 */ - 0x06, 0x03, 0x00, 0x00, 0x30, 0x1E, 0x07, 0x81, 0x20, 0xCC, 0x33, 0x0F, 0xC6, 0x19, 0x86, 0x40, 0xB0, 0x30, /* 0xC1 */ - 0x0C, 0x04, 0x80, 0x00, 0x30, 0x1E, 0x07, 0x81, 0x20, 0xCC, 0x33, 0x0F, 0xC6, 0x19, 0x86, 0x40, 0xB0, 0x30, /* 0xC2 */ - 0x21, 0x07, 0x80, 0x00, 0x30, 0x1E, 0x07, 0x81, 0x20, 0xCC, 0x33, 0x0F, 0xC6, 0x19, 0x86, 0x40, 0xB0, 0x30, /* 0xC3 */ - 0x33, 0x00, 0x00, 0xC0, 0x78, 0x1E, 0x04, 0x83, 0x30, 0xCC, 0x33, 0x1F, 0xE6, 0x19, 0x02, 0xC0, 0xF0, 0x30, /* 0xC4 */ - 0x30, 0x60, 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xFF, /* 0xC5 */ - 0x06, 0x01, 0x80, 0x00, 0x0F, 0xC3, 0x0C, 0xC0, 0xD0, 0x1E, 0x00, 0xC0, 0x18, 0x03, 0x01, 0xA0, 0x36, 0x0C, 0x61, 0x87, - 0xC0, /* 0xC6 */ - 0x1F, 0x06, 0x19, 0x83, 0xA0, 0x3C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x68, 0x0D, 0x83, 0x18, 0xE1, 0xF0, 0x08, 0x01, 0xC0, - 0x18, 0x0E, 0x00, /* 0xC7 */ - 0x19, 0x81, 0xE0, 0x00, 0x0F, 0xC3, 0x0C, 0xC0, 0xF0, 0x1E, 0x00, 0xC0, 0x18, 0x03, 0x01, 0xA0, 0x36, 0x0C, 0x61, 0x87, - 0xC0, /* 0xC8 */ - 0x0C, 0x0C, 0x00, 0x1F, 0xFC, 0x06, 0x03, 0x01, 0x80, 0xFF, 0x60, 0x30, 0x18, 0x0C, 0x07, 0xFC, /* 0xC9 */ - 0xFF, 0xD8, 0x03, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x3F, 0xF6, 0x00, 0xC0, 0x18, 0x03, 0x00, 0x60, 0x0F, 0xFC, 0x01, 0x80, 0x60, - 0x0C, 0x00, 0xE0, /* 0xCA */ - 0x33, 0x00, 0x3F, 0xF8, 0x0C, 0x06, 0x03, 0x01, 0xFE, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x07, 0xFC, /* 0xCB */ - 0x33, 0x0F, 0x00, 0x1F, 0xFC, 0x06, 0x03, 0x01, 0x80, 0xFF, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0xFE, /* 0xCC */ - 0x78, 0x36, 0xDB, 0x6D, 0xB6, 0xC0, /* 0xCD */ - 0x76, 0xC0, 0x63, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x18, /* 0xCE */ - 0x66, 0x0F, 0x00, 0x03, 0xF8, 0xC3, 0x30, 0x6C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC1, 0xB0, 0xEF, 0xE0, /* 0xCF */ - 0x7F, 0x0C, 0x31, 0x83, 0x30, 0x36, 0x06, 0xC0, 0xFE, 0x1B, 0x03, 0x60, 0x6C, 0x0D, 0x83, 0x30, 0xE7, 0xF0, /* 0xD0 */ - 0x03, 0x01, 0x83, 0x81, 0xF0, 0x3F, 0x07, 0xA0, 0xF6, 0x1E, 0x63, 0xC4, 0x78, 0xCF, 0x0D, 0xE1, 0xBC, 0x1F, 0x81, - 0xC0, /* 0xD1 */ - 0x19, 0x81, 0xE3, 0x81, 0xF0, 0x3F, 0x07, 0xA0, 0xF6, 0x1E, 0x63, 0xC4, 0x78, 0xCF, 0x0D, 0xE1, 0xBC, 0x1F, 0x81, - 0xC0, /* 0xD2 */ - 0x03, 0x00, 0x60, 0x00, 0x00, 0xF0, 0x39, 0xC6, 0x06, 0x60, 0x6C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x36, 0x06, 0x60, 0x63, 0x9C, - 0x0F, 0x00, /* 0xD3 */ - 0x0F, 0x01, 0x98, 0x00, 0x00, 0xF0, 0x39, 0xC6, 0x06, 0x60, 0x6C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x36, 0x06, 0x60, 0x63, 0x9C, - 0x0F, 0x00, /* 0xD4 */ - 0x0D, 0x81, 0xB0, 0x00, 0x00, 0xF0, 0x39, 0xC6, 0x06, 0x60, 0x6C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x36, 0x06, 0x60, 0x63, 0x9C, - 0x0F, 0x00, /* 0xD5 */ - 0x19, 0x81, 0x98, 0x00, 0x00, 0xF0, 0x39, 0xC6, 0x06, 0x60, 0x6C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x36, 0x06, 0x60, 0x63, 0x9C, - 0x0F, 0x00, /* 0xD6 */ - 0x83, 0x89, 0xA1, 0x83, 0x89, 0xA1, 0x80, /* 0xD7 */ - 0x33, 0x01, 0xE0, 0xFF, 0x8C, 0x0E, 0xC0, 0x6C, 0x06, 0xC0, 0x6C, 0x0C, 0xFF, 0x8C, 0x0E, 0xC0, 0x6C, 0x06, 0xC0, 0x6C, 0x06, - 0xC0, 0x70, /* 0xD8 */ - 0x04, 0x01, 0x43, 0x11, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x36, 0x0C, 0x3E, - 0x00, /* 0xD9 */ - 0x06, 0x01, 0x83, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x36, 0x0C, 0x3E, - 0x00, /* 0xDA */ - 0x0D, 0x83, 0x63, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x36, 0x0C, 0x3E, - 0x00, /* 0xDB */ - 0x1B, 0x00, 0x03, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x36, 0x0C, 0x3E, - 0x00, /* 0xDC */ - 0x03, 0x0C, 0x63, 0x60, 0x63, 0x0C, 0x30, 0xC1, 0x98, 0x1D, 0x80, 0xF0, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, - 0x60, /* 0xDD */ - 0xFF, 0x86, 0x03, 0x01, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xC0, 0x40, 0x3C, 0x06, 0x1E, - 0x00, /* 0xDE */ - 0x3C, 0x33, 0x30, 0xD8, 0x6C, 0x36, 0x33, 0x39, 0x86, 0xC1, 0xE0, 0xF0, 0x78, 0x6D, 0xE0, /* 0xDF */ - 0x19, 0x89, 0xBE, 0x63, 0x18, 0xC6, 0x31, 0x8C, 0x00, /* 0xE0 */ - 0x0C, 0x04, 0x04, 0x0F, 0xCE, 0x36, 0x18, 0x0C, 0x1E, 0x7B, 0x61, 0xB0, 0xD8, 0xE7, 0xB8, /* 0xE1 */ - 0x10, 0x14, 0x1B, 0x0F, 0xCE, 0x36, 0x18, 0x0C, 0x1E, 0x7B, 0x61, 0xB0, 0xD8, 0xE7, 0xB8, /* 0xE2 */ - 0x66, 0x1E, 0x00, 0x0F, 0xCE, 0x36, 0x18, 0x0C, 0x1E, 0x7B, 0x61, 0xB0, 0xD8, 0xE7, 0xB8, /* 0xE3 */ - 0x66, 0x00, 0x1F, 0x9C, 0x6C, 0x30, 0x18, 0x3C, 0xF6, 0xC3, 0x61, 0xB1, 0xCF, 0x70, /* 0xE4 */ - 0x78, 0x36, 0xDB, 0x6D, 0xB6, 0xD8, /* 0xE5 */ - 0x0C, 0x08, 0x10, 0x3C, 0x66, 0xC3, 0xC0, 0xC0, 0xC0, 0xC0, 0xC3, 0x66, 0x3C, /* 0xE6 */ - 0x3C, 0x66, 0xC3, 0xC0, 0xC0, 0xC0, 0xC0, 0xC3, 0x66, 0x3C, 0x10, 0x1C, 0x0C, 0x38, /* 0xE7 */ - 0x44, 0x28, 0x38, 0x3C, 0x66, 0xC3, 0xC0, 0xC0, 0xC0, 0xC0, 0xC3, 0x66, 0x3C, /* 0xE8 */ - 0x0C, 0x08, 0x18, 0x3C, 0x66, 0xC3, 0xC3, 0xFF, 0xC0, 0xC0, 0xC3, 0x66, 0x3C, /* 0xE9 */ - 0x3C, 0x62, 0xC3, 0xC3, 0xFF, 0xC0, 0xC0, 0xC3, 0x66, 0x3E, 0x04, 0x0C, 0x0C, 0x06, /* 0xEA */ - 0x66, 0x00, 0x3C, 0x66, 0xC3, 0xC3, 0xFF, 0xC0, 0xC0, 0xC3, 0x66, 0x3C, /* 0xEB */ - 0x64, 0x2C, 0x18, 0x3C, 0x66, 0xC3, 0xC3, 0xFF, 0xC0, 0xC0, 0xC3, 0x66, 0x3C, /* 0xEC */ - 0x7A, 0x6D, 0xB6, 0xDB, 0x6C, /* 0xED */ - 0x69, 0x06, 0x66, 0x66, 0x66, 0x66, 0x60, /* 0xEE */ - 0x03, 0x30, 0x32, 0x03, 0x43, 0xB0, 0x67, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x06, 0x70, 0x3B, - 0x00, /* 0xEF */ - 0x03, 0x07, 0xC0, 0xC7, 0x66, 0x76, 0x1B, 0x0D, 0x86, 0xC3, 0x61, 0xB0, 0xCC, 0xE3, 0xB0, /* 0xF0 */ - 0x0C, 0x18, 0x00, 0xDE, 0xE3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, /* 0xF1 */ - 0x66, 0x3C, 0x00, 0xDE, 0xE3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, /* 0xF2 */ - 0x0C, 0x18, 0x00, 0x3C, 0x66, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x66, 0x3C, /* 0xF3 */ - 0x18, 0x24, 0x00, 0x3C, 0x66, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x66, 0x3C, /* 0xF4 */ - 0x36, 0x6C, 0x00, 0x3C, 0x66, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x66, 0x3C, /* 0xF5 */ - 0x66, 0x00, 0x3C, 0x66, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x66, 0x3C, /* 0xF6 */ - 0x18, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x00, 0x30, /* 0xF7 */ - 0xDB, 0x81, 0xBE, 0x63, 0x18, 0xC6, 0x31, 0x8C, 0x00, /* 0xF8 */ - 0x10, 0x28, 0x10, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC7, 0x7B, /* 0xF9 */ - 0x06, 0x0C, 0x18, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC7, 0x7B, /* 0xFA */ - 0x36, 0x6C, 0x00, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC7, 0x7B, /* 0xFB */ - 0x66, 0x00, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC7, 0x7B, /* 0xFC */ - 0x06, 0x04, 0x08, 0xC1, 0x43, 0x63, 0x62, 0x26, 0x36, 0x34, 0x1C, 0x1C, 0x18, 0x18, 0x18, 0x10, 0x60, /* 0xFD */ - 0x63, 0x3C, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0xE2, 0x1C, 0x6F, /* 0xFE */ - 0xC0, /* 0xFF */ -}; - -const GFXglyph FreeSans9pt_Win1250Glyphs[] PROGMEM = { - /* ' ' 0x20 */ {0, 0, 0, 5, 0, 0}, - /* '!' 0x21 */ {0, 2, 13, 6, 2, -12}, - /* '"' 0x22 */ {4, 5, 4, 6, 1, -12}, - /* '#' 0x23 */ {7, 10, 12, 10, 0, -11}, - /* '$' 0x24 */ {22, 9, 16, 10, 1, -13}, - /* '%' 0x25 */ {40, 16, 13, 16, 1, -12}, - /* '&' 0x26 */ {66, 10, 13, 12, 1, -12}, - /* ''' 0x27 */ {83, 2, 4, 4, 1, -12}, - /* '(' 0x28 */ {84, 4, 17, 6, 1, -12}, - /* ')' 0x29 */ {93, 4, 17, 6, 1, -12}, - /* '*' 0x2A */ {102, 5, 5, 7, 1, -12}, - /* '+' 0x2B */ {106, 6, 8, 11, 3, -7}, - /* ',' 0x2C */ {112, 2, 4, 5, 2, 0}, - /* '-' 0x2D */ {113, 4, 1, 6, 1, -4}, - /* '.' 0x2E */ {114, 2, 1, 5, 1, 0}, - /* '/' 0x2F */ {115, 5, 13, 5, 0, -12}, - /* '0' 0x30 */ {124, 8, 13, 10, 1, -12}, - /* '1' 0x31 */ {137, 4, 13, 10, 3, -12}, - /* '2' 0x32 */ {144, 9, 13, 10, 1, -12}, - /* '3' 0x33 */ {159, 8, 13, 10, 1, -12}, - /* '4' 0x34 */ {172, 7, 13, 10, 2, -12}, - /* '5' 0x35 */ {184, 9, 13, 10, 1, -12}, - /* '6' 0x36 */ {199, 9, 13, 10, 1, -12}, - /* '7' 0x37 */ {214, 8, 13, 10, 0, -12}, - /* '8' 0x38 */ {227, 9, 13, 10, 1, -12}, - /* '9' 0x39 */ {242, 8, 13, 10, 1, -12}, - /* ':' 0x3A */ {255, 2, 10, 5, 1, -9}, - /* ';' 0x3B */ {258, 3, 12, 5, 1, -8}, - /* '<' 0x3C */ {263, 9, 9, 11, 1, -8}, - /* '=' 0x3D */ {274, 9, 4, 11, 1, -5}, - /* '>' 0x3E */ {279, 9, 8, 11, 1, -7}, - /* '?' 0x3F */ {288, 9, 13, 10, 1, -12}, - /* '@' 0x40 */ {303, 17, 16, 18, 1, -12}, - /* 'A' 0x41 */ {337, 12, 13, 12, 0, -12}, - /* 'B' 0x42 */ {357, 11, 13, 12, 1, -12}, - /* 'C' 0x43 */ {375, 11, 13, 13, 1, -12}, - /* 'D' 0x44 */ {393, 11, 13, 13, 1, -12}, - /* 'E' 0x45 */ {411, 9, 13, 11, 1, -12}, - /* 'F' 0x46 */ {426, 8, 13, 11, 1, -12}, - /* 'G' 0x47 */ {439, 12, 13, 14, 1, -12}, - /* 'H' 0x48 */ {459, 11, 13, 13, 1, -12}, - /* 'I' 0x49 */ {477, 2, 13, 5, 2, -12}, - /* 'J' 0x4A */ {481, 7, 13, 10, 1, -12}, - /* 'K' 0x4B */ {493, 10, 13, 12, 1, -12}, - /* 'L' 0x4C */ {510, 8, 13, 10, 1, -12}, - /* 'M' 0x4D */ {523, 13, 13, 15, 1, -12}, - /* 'N' 0x4E */ {545, 11, 13, 13, 1, -12}, - /* 'O' 0x4F */ {563, 13, 13, 14, 1, -12}, - /* 'P' 0x50 */ {585, 10, 13, 12, 1, -12}, - /* 'Q' 0x51 */ {602, 13, 14, 14, 1, -12}, - /* 'R' 0x52 */ {625, 12, 13, 13, 1, -12}, - /* 'S' 0x53 */ {645, 10, 13, 12, 1, -12}, - /* 'T' 0x54 */ {662, 9, 13, 11, 1, -12}, - /* 'U' 0x55 */ {677, 11, 13, 13, 1, -12}, - /* 'V' 0x56 */ {695, 11, 13, 11, 0, -12}, - /* 'W' 0x57 */ {713, 16, 13, 17, 0, -12}, - /* 'X' 0x58 */ {739, 10, 13, 12, 1, -12}, - /* 'Y' 0x59 */ {756, 12, 13, 12, 0, -12}, - /* 'Z' 0x5A */ {776, 10, 13, 11, 1, -12}, - /* '[' 0x5B */ {793, 3, 17, 5, 1, -12}, - /* '\' 0x5C */ {800, 5, 13, 5, 0, -12}, - /* ']' 0x5D */ {809, 3, 17, 5, 0, -12}, - /* '^' 0x5E */ {816, 7, 7, 8, 1, -12}, - /* '_' 0x5F */ {823, 10, 1, 10, 0, 3}, - /* '`' 0x60 */ {825, 4, 3, 5, 0, -12}, - /* 'a' 0x61 */ {827, 9, 10, 10, 1, -9}, - /* 'b' 0x62 */ {839, 9, 13, 10, 1, -12}, - /* 'c' 0x63 */ {854, 8, 10, 9, 1, -9}, - /* 'd' 0x64 */ {864, 8, 13, 10, 1, -12}, - /* 'e' 0x65 */ {877, 8, 10, 10, 1, -9}, - /* 'f' 0x66 */ {887, 4, 13, 5, 1, -12}, - /* 'g' 0x67 */ {894, 8, 14, 10, 1, -9}, - /* 'h' 0x68 */ {908, 8, 13, 10, 1, -12}, - /* 'i' 0x69 */ {921, 2, 13, 4, 1, -12}, - /* 'j' 0x6A */ {925, 4, 17, 4, 0, -12}, - /* 'k' 0x6B */ {934, 8, 13, 9, 1, -12}, - /* 'l' 0x6C */ {947, 2, 13, 4, 1, -12}, - /* 'm' 0x6D */ {951, 13, 10, 15, 1, -9}, - /* 'n' 0x6E */ {968, 8, 10, 10, 1, -9}, - /* 'o' 0x6F */ {978, 8, 10, 10, 1, -9}, - /* 'p' 0x70 */ {988, 9, 13, 10, 1, -9}, - /* 'q' 0x71 */ {1003, 8, 13, 10, 1, -9}, - /* 'r' 0x72 */ {1016, 5, 10, 6, 1, -9}, - /* 's' 0x73 */ {1023, 8, 10, 9, 1, -9}, - /* 't' 0x74 */ {1033, 4, 12, 5, 1, -11}, - /* 'u' 0x75 */ {1039, 8, 10, 10, 1, -9}, - /* 'v' 0x76 */ {1049, 9, 10, 9, 0, -9}, - /* 'w' 0x77 */ {1061, 13, 10, 13, 0, -9}, - /* 'x' 0x78 */ {1078, 7, 10, 9, 1, -9}, - /* 'y' 0x79 */ {1087, 8, 14, 9, 0, -9}, - /* 'z' 0x7A */ {1101, 7, 10, 9, 1, -9}, - /* '{' 0x7B */ {1110, 4, 17, 6, 1, -12}, - /* '|' 0x7C */ {1119, 2, 17, 4, 2, -12}, - /* '}' 0x7D */ {1124, 4, 17, 6, 1, -12}, - /* '~' 0x7E */ {1133, 7, 3, 9, 1, -7}, - /* 0x7F */ {1136, 13, 14, 15, 1, -12}, - /* 0x80 */ {1159, 10, 13, 12, 1, -12}, - /* 0x81 */ {1176, 0, 0, 0, 0, 0}, - /* 0x82 */ {1176, 2, 3, 5, 1, 0}, - /* 0x83 */ {1177, 0, 0, 0, 0, 0}, - /* 0x84 */ {1177, 5, 3, 7, 1, 0}, - /* 0x85 */ {1179, 10, 1, 12, 1, 0}, - /* 0x86 */ {1181, 8, 16, 10, 1, -12}, - /* 0x87 */ {1197, 8, 16, 10, 1, -12}, - /* 0x88 */ {1213, 0, 0, 0, 0, 0}, - /* 0x89 */ {1213, 18, 13, 18, 0, -12}, - /* 0x8A */ {1243, 10, 15, 12, 1, -14}, - /* 0x8B */ {1262, 2, 4, 4, 1, -6}, - /* 0x8C */ {1263, 10, 15, 12, 1, -14}, - /* 0x8D */ {1282, 9, 15, 11, 1, -14}, - /* 0x8E */ {1299, 10, 15, 11, 1, -14}, - /* 0x8F */ {1318, 10, 15, 11, 1, -14}, - /* 0x90 */ {1337, 0, 0, 0, 0, 0}, - /* 0x91 */ {1337, 2, 4, 4, 2, -12}, - /* 0x92 */ {1338, 2, 4, 4, 1, -12}, - /* 0x93 */ {1339, 5, 4, 7, 2, -12}, - /* 0x94 */ {1342, 5, 4, 7, 1, -12}, - /* 0x95 */ {1345, 4, 5, 7, 1, -8}, - /* 0x96 */ {1348, 7, 1, 9, 1, -4}, - /* 0x97 */ {1349, 16, 1, 18, 1, -4}, - /* 0x98 */ {1351, 0, 0, 0, 0, 0}, - /* 0x99 */ {1351, 18, 10, 18, 1, -13}, - /* 0x9A */ {1374, 8, 13, 9, 1, -12}, - /* 0x9B */ {1387, 2, 4, 5, 2, -6}, - /* 0x9C */ {1388, 8, 13, 9, 1, -12}, - /* 0x9D */ {1401, 6, 13, 8, 1, -12}, - /* 0x9E */ {1411, 7, 13, 9, 1, -12}, - /* 0x9F */ {1423, 7, 13, 9, 1, -12}, - /* 0xA0 */ {1435, 0, 0, 5, 0, 0}, - /* 0xA1 */ {1435, 5, 3, 6, 0, -12}, - /* 0xA2 */ {1437, 6, 2, 6, 0, -12}, - /* 0xA3 */ {1439, 9, 13, 11, 1, -12}, - /* 0xA4 */ {1454, 7, 6, 10, 2, -8}, - /* 0xA5 */ {1460, 12, 17, 12, 1, -12}, - /* 0xA6 */ {1486, 2, 17, 5, 2, -12}, - /* 0xA7 */ {1491, 9, 17, 10, 1, -12}, - /* 0xA8 */ {1511, 6, 1, 6, 0, -11}, - /* 0xA9 */ {1512, 14, 13, 14, 1, -12}, - /* 0xAA */ {1535, 10, 17, 12, 1, -12}, - /* 0xAB */ {1557, 7, 6, 9, 1, -7}, - /* 0xAC */ {1563, 9, 5, 11, 2, -5}, - /* 0xAD */ {1569, 0, 0, 0, 0, 0}, - /* 0xAE */ {1569, 14, 13, 14, 1, -12}, - /* 0xAF */ {1592, 10, 15, 11, 1, -14}, - /* 0xB0 */ {1611, 5, 5, 11, 3, -11}, - /* 0xB1 */ {1615, 9, 11, 11, 1, -10}, - /* 0xB2 */ {1628, 4, 4, 6, 1, 1}, - /* 0xB3 */ {1630, 4, 13, 5, 1, -12}, - /* 0xB4 */ {1637, 4, 3, 6, 2, -12}, - /* 0xB5 */ {1639, 9, 13, 10, 1, -9}, - /* 0xB6 */ {1654, 8, 16, 10, 2, -12}, - /* 0xB7 */ {1670, 3, 1, 5, 1, -4}, - /* 0xB8 */ {1671, 5, 4, 6, 1, 1}, - /* 0xB9 */ {1674, 10, 14, 10, 1, -9}, - /* 0xBA */ {1692, 8, 14, 9, 1, -9}, - /* 0xBB */ {1706, 7, 6, 9, 1, -7}, - /* 0xBC */ {1712, 8, 13, 10, 1, -12}, - /* 0xBD */ {1725, 6, 3, 6, 0, -12}, - /* 0xBE */ {1728, 5, 13, 7, 1, -12}, - /* 0xBF */ {1737, 7, 12, 9, 1, -11}, - /* 0xC0 */ {1748, 12, 15, 13, 1, -14}, - /* 0xC1 */ {1771, 10, 14, 12, 1, -13}, - /* 0xC2 */ {1789, 10, 14, 12, 1, -13}, - /* 0xC3 */ {1807, 10, 14, 12, 1, -13}, - /* 0xC4 */ {1825, 10, 14, 12, 1, -13}, - /* 0xC5 */ {1843, 8, 14, 10, 1, -13}, - /* 0xC6 */ {1857, 11, 15, 13, 1, -14}, - /* 0xC7 */ {1878, 11, 17, 13, 1, -12}, - /* 0xC8 */ {1902, 11, 15, 13, 1, -14}, - /* 0xC9 */ {1923, 9, 14, 11, 1, -13}, - /* 0xCA */ {1939, 11, 17, 12, 1, -12}, - /* 0xCB */ {1963, 9, 14, 11, 1, -13}, - /* 0xCC */ {1979, 9, 15, 11, 1, -14}, - /* 0xCD */ {1996, 3, 14, 5, 1, -13}, - /* 0xCE */ {2002, 5, 14, 5, 0, -13}, - /* 0xCF */ {2011, 10, 15, 13, 2, -14}, - /* 0xD0 */ {2030, 11, 13, 13, 1, -12}, - /* 0xD1 */ {2048, 11, 14, 13, 1, -13}, - /* 0xD2 */ {2068, 11, 14, 13, 1, -13}, - /* 0xD3 */ {2088, 12, 15, 13, 1, -14}, - /* 0xD4 */ {2111, 12, 15, 13, 1, -14}, - /* 0xD5 */ {2134, 12, 15, 13, 1, -14}, - /* 0xD6 */ {2157, 12, 15, 13, 1, -14}, - /* 0xD7 */ {2180, 7, 7, 11, 2, -7}, - /* 0xD8 */ {2187, 12, 15, 13, 1, -14}, - /* 0xD9 */ {2210, 11, 14, 13, 1, -13}, - /* 0xDA */ {2230, 11, 14, 13, 1, -13}, - /* 0xDB */ {2250, 11, 14, 13, 1, -13}, - /* 0xDC */ {2270, 11, 14, 13, 1, -13}, - /* 0xDD */ {2290, 12, 14, 12, 0, -13}, - /* 0xDE */ {2311, 9, 17, 11, 1, -12}, - /* 0xDF */ {2331, 9, 13, 11, 1, -12}, - /* 0xE0 */ {2346, 5, 13, 6, 1, -12}, - /* 0xE1 */ {2355, 9, 13, 10, 1, -12}, - /* 0xE2 */ {2370, 9, 13, 10, 1, -12}, - /* 0xE3 */ {2385, 9, 13, 10, 1, -12}, - /* 0xE4 */ {2400, 9, 12, 10, 1, -11}, - /* 0xE5 */ {2414, 3, 15, 4, 0, -14}, - /* 0xE6 */ {2420, 8, 13, 9, 1, -12}, - /* 0xE7 */ {2433, 8, 14, 9, 1, -9}, - /* 0xE8 */ {2447, 8, 13, 9, 1, -12}, - /* 0xE9 */ {2460, 8, 13, 10, 1, -12}, - /* 0xEA */ {2473, 8, 14, 10, 1, -9}, - /* 0xEB */ {2487, 8, 12, 10, 1, -11}, - /* 0xEC */ {2499, 8, 13, 10, 1, -12}, - /* 0xED */ {2512, 3, 13, 4, 1, -12}, - /* 0xEE */ {2517, 4, 13, 5, 0, -12}, - /* 0xEF */ {2524, 12, 13, 12, 1, -12}, - /* 0xF0 */ {2544, 9, 13, 10, 1, -12}, - /* 0xF1 */ {2559, 8, 13, 10, 1, -12}, - /* 0xF2 */ {2572, 8, 13, 10, 1, -12}, - /* 0xF3 */ {2585, 8, 13, 10, 1, -12}, - /* 0xF4 */ {2598, 8, 13, 10, 1, -12}, - /* 0xF5 */ {2611, 8, 13, 10, 1, -12}, - /* 0xF6 */ {2624, 8, 12, 10, 1, -11}, - /* 0xF7 */ {2636, 9, 8, 11, 1, -7}, - /* 0xF8 */ {2645, 5, 13, 6, 1, -12}, - /* 0xF9 */ {2654, 8, 13, 10, 1, -12}, - /* 0xFA */ {2667, 8, 13, 10, 1, -12}, - /* 0xFB */ {2680, 8, 13, 10, 1, -12}, - /* 0xFC */ {2693, 8, 12, 10, 1, -11}, - /* 0xFD */ {2705, 8, 17, 9, 0, -12}, - /* 0xFE */ {2722, 5, 16, 5, 1, -11}, - /* 0xFF */ {2732, 2, 1, 6, 2, -11}, -}; - -const GFXfont FreeSans9pt_Win1250 PROGMEM = {(uint8_t *)FreeSans9pt_Win1250Bitmaps, (GFXglyph *)FreeSans9pt_Win1250Glyphs, 0x20, - 0xFF, 21}; diff --git a/src/graphics/niche/Fonts/FreeSans9pt_Win1251.h b/src/graphics/niche/Fonts/FreeSans9pt_Win1251.h deleted file mode 100644 index 82857cb91b..0000000000 --- a/src/graphics/niche/Fonts/FreeSans9pt_Win1251.h +++ /dev/null @@ -1,493 +0,0 @@ -#pragma once -const uint8_t FreeSans9pt_Win1251Bitmaps[] PROGMEM = { - /* ' ' 0x20 */ - 0xFF, 0xFF, 0xF0, 0xC0, /* '!' 0x21 */ - 0xDE, 0xF7, 0x20, /* '"' 0x22 */ - 0x09, 0x86, 0x41, 0x91, 0xFF, 0x13, 0x04, 0xC3, 0x20, 0xC8, 0xFF, 0x89, 0x82, 0x61, 0x90, /* '#' 0x23 */ - 0x10, 0x1F, 0x14, 0xDA, 0x3D, 0x1E, 0x83, 0x40, 0x78, 0x17, 0x08, 0xF4, 0x7A, 0x35, 0x33, 0xF0, 0x40, 0x20, /* '$' 0x24 */ - 0x38, 0x10, 0xEC, 0x20, 0xC6, 0x20, 0xC6, 0x40, 0xC6, 0x40, 0x6C, 0x80, 0x39, 0x00, 0x01, 0x3C, 0x02, 0x77, 0x02, 0x63, 0x04, - 0x63, 0x04, 0x77, 0x08, 0x3C, /* '%' 0x25 */ - 0x0E, 0x0C, 0xC3, 0x30, 0xCC, 0x1E, 0x03, 0x03, 0xC1, 0x9B, 0xC2, 0xF0, 0xEC, 0x19, 0x8F, 0x3C, 0x40, /* '&' 0x26 */ - 0xFE, /* ''' 0x27 */ - 0x13, 0x26, 0x6C, 0xCC, 0xCC, 0xC4, 0x66, 0x23, 0x10, /* '(' 0x28 */ - 0x8C, 0x46, 0x63, 0x33, 0x33, 0x32, 0x66, 0x4C, 0x80, /* ')' 0x29 */ - 0x25, 0x7E, 0xA5, 0x00, /* '*' 0x2A */ - 0x30, 0xC3, 0x3F, 0x30, 0xC3, 0x0C, /* '+' 0x2B */ - 0xD6, /* ',' 0x2C */ - 0xF0, /* '-' 0x2D */ - 0xC0, /* '.' 0x2E */ - 0x08, 0x44, 0x21, 0x10, 0x84, 0x42, 0x11, 0x08, 0x00, /* '/' 0x2F */ - 0x3C, 0x66, 0x42, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x42, 0x66, 0x3C, /* '0' 0x30 */ - 0x11, 0x3F, 0x33, 0x33, 0x33, 0x33, 0x30, /* '1' 0x31 */ - 0x3E, 0x31, 0xB0, 0x78, 0x30, 0x18, 0x1C, 0x1C, 0x1C, 0x18, 0x18, 0x10, 0x08, 0x07, 0xF8, /* '2' 0x32 */ - 0x3C, 0x66, 0xC3, 0xC3, 0x03, 0x06, 0x1C, 0x07, 0x03, 0xC3, 0xC3, 0x66, 0x3C, /* '3' 0x33 */ - 0x0C, 0x18, 0x71, 0x62, 0xC9, 0xA3, 0x46, 0xFE, 0x18, 0x30, 0x60, 0xC0, /* '4' 0x34 */ - 0x7F, 0x20, 0x10, 0x08, 0x08, 0x07, 0xF3, 0x8C, 0x03, 0x01, 0x80, 0xF0, 0x6C, 0x63, 0xE0, /* '5' 0x35 */ - 0x1E, 0x31, 0x98, 0x78, 0x0C, 0x06, 0xF3, 0x8D, 0x83, 0xC1, 0xE0, 0xD0, 0x6C, 0x63, 0xE0, /* '6' 0x36 */ - 0xFF, 0x03, 0x02, 0x06, 0x04, 0x0C, 0x08, 0x18, 0x18, 0x18, 0x10, 0x30, 0x30, /* '7' 0x37 */ - 0x3E, 0x31, 0xB0, 0x78, 0x3C, 0x1B, 0x18, 0xF8, 0xC6, 0xC1, 0xE0, 0xF0, 0x6C, 0x63, 0xE0, /* '8' 0x38 */ - 0x3C, 0x66, 0xC2, 0xC3, 0xC3, 0xC3, 0x67, 0x3B, 0x03, 0x03, 0xC2, 0x66, 0x3C, /* '9' 0x39 */ - 0xC0, 0x00, 0x30, /* ':' 0x3A */ - 0xC0, 0x00, 0x00, 0x64, 0xA0, /* ';' 0x3B */ - 0x00, 0x81, 0xC7, 0x8E, 0x0C, 0x07, 0x80, 0x70, 0x0E, 0x01, 0x80, /* '<' 0x3C */ - 0xFF, 0x80, 0x00, 0x1F, 0xF0, /* '=' 0x3D */ - 0xE0, 0x1C, 0x03, 0x80, 0x30, 0x70, 0xE3, 0x81, 0x00, /* '>' 0x3E */ - 0x3E, 0x31, 0xB0, 0x78, 0x30, 0x18, 0x18, 0x38, 0x18, 0x18, 0x0C, 0x00, 0x00, 0x01, 0x80, /* '?' 0x3F */ - 0x03, 0xF0, 0x06, 0x0E, 0x06, 0x01, 0x86, 0x00, 0x66, 0x1D, 0xBB, 0x31, 0xCF, 0x18, 0xC7, 0x98, 0x63, 0xCC, 0x31, 0xE6, 0x11, - 0xB3, 0x99, 0xCC, 0xF7, 0x86, 0x00, 0x01, 0x80, 0x00, 0x70, 0x40, 0x0F, 0xE0, /* '@' 0x40 */ - 0x06, 0x00, 0xF0, 0x0F, 0x00, 0x90, 0x19, 0x81, 0x98, 0x10, 0x83, 0x0C, 0x3F, 0xC2, 0x04, 0x60, 0x66, 0x06, 0xC0, - 0x30, /* 'A' 0x41 */ - 0xFF, 0x18, 0x33, 0x03, 0x60, 0x6C, 0x0D, 0x83, 0x3F, 0xC6, 0x06, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x6F, 0xF8, /* 'B' 0x42 */ - 0x1F, 0x86, 0x19, 0x81, 0xA0, 0x3C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x68, 0x0D, 0x83, 0x18, 0x61, 0xF0, /* 'C' 0x43 */ - 0xFF, 0x18, 0x33, 0x03, 0x60, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x03, 0x60, 0xCF, 0xF0, /* 'D' 0x44 */ - 0xFF, 0xE0, 0x30, 0x18, 0x0C, 0x06, 0x03, 0xFD, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0F, 0xF8, /* 'E' 0x45 */ - 0xFF, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xFE, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, /* 'F' 0x46 */ - 0x0F, 0x83, 0x0E, 0x60, 0x66, 0x03, 0xC0, 0x0C, 0x00, 0xC1, 0xFC, 0x03, 0xC0, 0x36, 0x03, 0x60, 0x73, 0x0F, 0x0F, - 0x10, /* 'G' 0x47 */ - 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xFF, 0xFE, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x06, /* 'H' 0x48 */ - 0xFF, 0xFF, 0xFF, 0xC0, /* 'I' 0x49 */ - 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x07, 0x8F, 0x1E, 0x27, 0x80, /* 'J' 0x4A */ - 0xC0, 0xF0, 0x6C, 0x33, 0x18, 0xCC, 0x37, 0x0F, 0xC3, 0x98, 0xC3, 0x30, 0xCC, 0x1B, 0x03, 0xC0, 0xC0, /* 'K' 0x4B */ - 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xFF, /* 'L' 0x4C */ - 0xE0, 0x3F, 0x01, 0xFC, 0x1F, 0xE0, 0xFD, 0x05, 0xEC, 0x6F, 0x63, 0x79, 0x13, 0xCD, 0x9E, 0x6C, 0xF1, 0x47, 0x8E, 0x3C, 0x71, - 0x80, /* 'M' 0x4D */ - 0xE0, 0x7C, 0x0F, 0xC1, 0xE8, 0x3D, 0x87, 0x98, 0xF1, 0x1E, 0x33, 0xC3, 0x78, 0x6F, 0x07, 0xE0, 0x7C, 0x0E, /* 'N' 0x4E */ - 0x0F, 0x81, 0x83, 0x18, 0x0C, 0xC0, 0x6C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1B, 0x01, 0x98, 0x0C, 0x60, 0xC0, 0xF8, - 0x00, /* 'O' 0x4F */ - 0xFF, 0x30, 0x6C, 0x0F, 0x03, 0xC0, 0xF0, 0x6F, 0xF3, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x00, /* 'P' 0x50 */ - 0x0F, 0x81, 0x83, 0x18, 0x0C, 0xC0, 0x6C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1B, 0x01, 0x98, 0x6C, 0x60, 0xC0, 0xFB, - 0x00, 0x08, /* 'Q' 0x51 */ - 0xFF, 0x8C, 0x0E, 0xC0, 0x6C, 0x06, 0xC0, 0x6C, 0x0C, 0xFF, 0x8C, 0x0E, 0xC0, 0x6C, 0x06, 0xC0, 0x6C, 0x06, 0xC0, - 0x70, /* 'R' 0x52 */ - 0x3F, 0x18, 0x6C, 0x0F, 0x03, 0xC0, 0x1E, 0x01, 0xF0, 0x0E, 0x00, 0xF0, 0x3C, 0x0D, 0x86, 0x3F, 0x00, /* 'S' 0x53 */ - 0xFF, 0x86, 0x03, 0x01, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xC0, /* 'T' 0x54 */ - 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xB0, 0x61, 0xF0, /* 'U' 0x55 */ - 0xC0, 0x6C, 0x0D, 0x81, 0x10, 0x63, 0x0C, 0x61, 0x04, 0x60, 0xCC, 0x19, 0x01, 0x60, 0x3C, 0x07, 0x00, 0x60, /* 'V' 0x56 */ - 0xC1, 0x81, 0x61, 0xC3, 0x61, 0xC3, 0x61, 0x43, 0x62, 0x62, 0x22, 0x66, 0x32, 0x26, 0x36, 0x26, 0x14, 0x34, 0x14, 0x34, 0x1C, - 0x1C, 0x18, 0x1C, 0x08, 0x18, /* 'W' 0x57 */ - 0xC0, 0xD8, 0x66, 0x18, 0xCC, 0x1E, 0x07, 0x00, 0xC0, 0x78, 0x32, 0x0C, 0xC6, 0x1B, 0x07, 0xC0, 0xC0, /* 'X' 0x58 */ - 0xC0, 0x36, 0x06, 0x30, 0xC3, 0x0C, 0x19, 0x81, 0xD8, 0x0F, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, - 0x00, /* 'Y' 0x59 */ - 0xFF, 0xC0, 0x60, 0x30, 0x0C, 0x06, 0x03, 0x01, 0xC0, 0x60, 0x30, 0x18, 0x06, 0x03, 0x00, 0xFF, 0xC0, /* 'Z' 0x5A */ - 0xFB, 0x6D, 0xB6, 0xDB, 0x6D, 0xB6, 0xE0, /* '[' 0x5B */ - 0x84, 0x10, 0x84, 0x10, 0x84, 0x10, 0x84, 0x10, 0x80, /* '\' 0x5C */ - 0xED, 0xB6, 0xDB, 0x6D, 0xB6, 0xDB, 0xE0, /* ']' 0x5D */ - 0x30, 0x60, 0xA2, 0x44, 0xD8, 0xA1, 0x80, /* '^' 0x5E */ - 0xFF, 0xC0, /* '_' 0x5F */ - 0xC6, 0x30, /* '`' 0x60 */ - 0x7E, 0x71, 0xB0, 0xC0, 0x60, 0xF3, 0xDB, 0x0D, 0x86, 0xC7, 0x3D, 0xC0, /* 'a' 0x61 */ - 0xC0, 0x60, 0x30, 0x1B, 0xCE, 0x36, 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x7C, 0x6D, 0xE0, /* 'b' 0x62 */ - 0x3C, 0x66, 0xC3, 0xC0, 0xC0, 0xC0, 0xC0, 0xC3, 0x66, 0x3C, /* 'c' 0x63 */ - 0x03, 0x03, 0x03, 0x3B, 0x67, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x67, 0x3B, /* 'd' 0x64 */ - 0x3C, 0x66, 0xC3, 0xC3, 0xFF, 0xC0, 0xC0, 0xC3, 0x66, 0x3C, /* 'e' 0x65 */ - 0x36, 0x6F, 0x66, 0x66, 0x66, 0x66, 0x60, /* 'f' 0x66 */ - 0x3B, 0x67, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x67, 0x3B, 0x03, 0x03, 0xC6, 0x7C, /* 'g' 0x67 */ - 0xC0, 0xC0, 0xC0, 0xDE, 0xE3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, /* 'h' 0x68 */ - 0xC3, 0xFF, 0xFF, 0xC0, /* 'i' 0x69 */ - 0x30, 0x03, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0xE0, /* 'j' 0x6A */ - 0xC0, 0xC0, 0xC0, 0xC2, 0xC4, 0xCC, 0xD8, 0xF8, 0xEC, 0xC4, 0xC6, 0xC3, 0xC3, /* 'k' 0x6B */ - 0xFF, 0xFF, 0xFF, 0xC0, /* 'l' 0x6C */ - 0xDE, 0xF7, 0x1C, 0xF0, 0xC7, 0x86, 0x3C, 0x31, 0xE1, 0x8F, 0x0C, 0x78, 0x63, 0xC3, 0x1E, 0x18, 0xC0, /* 'm' 0x6D */ - 0xDE, 0xE3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, /* 'n' 0x6E */ - 0x3C, 0x66, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x66, 0x3C, /* 'o' 0x6F */ - 0xDE, 0x71, 0xB0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xE3, 0x6F, 0x30, 0x18, 0x0C, 0x00, /* 'p' 0x70 */ - 0x3B, 0x67, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x67, 0x3B, 0x03, 0x03, 0x03, /* 'q' 0x71 */ - 0xDF, 0x31, 0x8C, 0x63, 0x18, 0xC6, 0x00, /* 'r' 0x72 */ - 0x3E, 0xE3, 0xC0, 0xC0, 0xE0, 0x3C, 0x07, 0xC3, 0xE3, 0x7E, /* 's' 0x73 */ - 0x66, 0xF6, 0x66, 0x66, 0x66, 0x67, /* 't' 0x74 */ - 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC7, 0x7B, /* 'u' 0x75 */ - 0xC1, 0xA0, 0x98, 0xCC, 0x42, 0x21, 0xB0, 0xD0, 0x28, 0x1C, 0x0C, 0x00, /* 'v' 0x76 */ - 0xC6, 0x1E, 0x38, 0x91, 0xC4, 0xCA, 0x66, 0xD3, 0x16, 0xD0, 0xA6, 0x87, 0x1C, 0x38, 0xC0, 0xC6, 0x00, /* 'w' 0x77 */ - 0x87, 0x89, 0xB1, 0xC3, 0x07, 0x1E, 0x26, 0xC5, 0x0C, /* 'x' 0x78 */ - 0xC1, 0x43, 0x63, 0x62, 0x26, 0x36, 0x34, 0x1C, 0x1C, 0x18, 0x18, 0x18, 0x10, 0x60, /* 'y' 0x79 */ - 0xFE, 0x0C, 0x30, 0xC1, 0x86, 0x18, 0x20, 0xC1, 0xFC, /* 'z' 0x7A */ - 0x36, 0x66, 0x66, 0x6E, 0xCE, 0x66, 0x66, 0x66, 0x30, /* '{' 0x7B */ - 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, /* '|' 0x7C */ - 0xC6, 0x66, 0x66, 0x67, 0x37, 0x66, 0x66, 0x66, 0xC0, /* '}' 0x7D */ - 0x61, 0x24, 0x38, /* '~' 0x7E */ - 0xFF, 0xFC, 0x00, 0x63, 0xE3, 0x31, 0x99, 0x04, 0xC8, 0x66, 0x06, 0x30, 0x61, 0x83, 0x0C, 0x18, 0x60, 0x03, 0x06, 0x18, 0x00, - 0xFF, 0xFC, /* 0x7F */ - 0xFF, 0x01, 0x80, 0x18, 0x01, 0x80, 0x18, 0x01, 0xFE, 0x18, 0x31, 0x83, 0x18, 0x31, 0x83, 0x18, 0x31, 0x83, 0x18, 0x30, 0x03, - 0x00, 0x30, 0x0E, /* 0x80 */ - 0x0C, 0x18, 0x00, 0xFF, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, /* 0x81 */ - 0xDC, /* 0x82 */ - 0x18, 0x89, 0xFC, 0x63, 0x18, 0xC6, 0x31, 0x8C, 0x00, /* 0x83 */ - 0xDA, 0x76, /* 0x84 */ - 0xCC, 0xC0, /* 0x85 */ - 0x18, 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, /* 0x86 */ - 0x18, 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18, 0x18, /* 0x87 */ - 0x07, 0xC6, 0x13, 0x00, 0xC0, 0x60, 0x3F, 0xE6, 0x03, 0xFC, 0x60, 0x0C, 0x03, 0x00, 0x61, 0x07, 0xC0, /* 0x88 */ - 0x70, 0x80, 0x22, 0x20, 0x08, 0x90, 0x02, 0x24, 0x00, 0x72, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x10, 0x00, 0x09, 0xC7, 0x84, - 0x8B, 0x31, 0x22, 0x84, 0x88, 0xB3, 0x21, 0xC7, 0x80, /* 0x89 */ - 0x3F, 0x80, 0x18, 0xC0, 0x0C, 0x60, 0x06, 0x30, 0x03, 0x18, 0x01, 0x8C, 0x00, 0xC7, 0xF8, 0x63, 0x06, 0x31, 0x81, 0x90, 0xC0, - 0xD8, 0x60, 0x6C, 0x30, 0x6C, 0x1F, 0xE0, /* 0x8A */ - 0x69, /* 0x8B */ - 0xC0, 0xC0, 0x60, 0x60, 0x30, 0x30, 0x18, 0x18, 0x0C, 0x0C, 0x06, 0x06, 0x03, 0xFF, 0xF9, 0x81, 0x86, 0xC0, 0xC1, 0xE0, 0x60, - 0xF0, 0x30, 0x78, 0x18, 0x6C, 0x0F, 0xE0, /* 0x8C */ - 0x0C, 0x06, 0x0C, 0x1B, 0x0C, 0xC6, 0x33, 0x0D, 0x83, 0xC0, 0xF0, 0x3E, 0x0D, 0xC3, 0x38, 0xC7, 0x30, 0xEC, 0x1C, /* 0x8D */ - 0xFF, 0x01, 0x80, 0x18, 0x01, 0x80, 0x18, 0x01, 0xFE, 0x18, 0x31, 0x83, 0x18, 0x31, 0x83, 0x18, 0x31, 0x83, 0x18, - 0x30, /* 0x8E */ - 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3F, 0xFE, 0x0C, 0x01, - 0x80, /* 0x8F */ - 0x60, 0x7C, 0x18, 0x0D, 0xE7, 0x1B, 0x0D, 0x86, 0xC3, 0x61, 0xB0, 0xD8, 0x6C, 0x36, 0x18, 0x18, 0x08, 0x08, /* 0x90 */ - 0x6B, /* 0x91 */ - 0xD6, /* 0x92 */ - 0x4C, 0xA5, 0xB0, /* 0x93 */ - 0xDA, 0x53, 0x20, /* 0x94 */ - 0x6F, 0xFF, 0x60, /* 0x95 */ - 0xFE, /* 0x96 */ - 0xFF, 0xFF, /* 0x97 */ - /* 0x98 */ - 0xFC, 0xE1, 0xCC, 0x38, 0x73, 0x0E, 0x1C, 0xC3, 0x8F, 0x30, 0xD2, 0xCC, 0x34, 0xB3, 0x0D, 0x6C, 0xC3, 0x53, 0x30, 0xCC, 0xCC, - 0x33, 0x30, /* 0x99 */ - 0x7E, 0x03, 0x30, 0x19, 0x80, 0xCC, 0x06, 0x60, 0x33, 0xF9, 0x98, 0x6C, 0xC3, 0x46, 0x1E, 0x3F, 0x80, /* 0x9A */ - 0x96, /* 0x9B */ - 0xC3, 0x03, 0x0C, 0x0C, 0x30, 0x30, 0xC0, 0xC3, 0x03, 0xFF, 0xEC, 0x30, 0xF0, 0xC3, 0xC3, 0x0F, 0x0F, 0xE0, /* 0x9C */ - 0x0C, 0x30, 0x46, 0x3C, 0xDB, 0x34, 0x70, 0xF1, 0xB3, 0x36, 0x3C, 0x20, /* 0x9D */ - 0x60, 0x7C, 0x18, 0x0D, 0xE7, 0x3B, 0x0D, 0x86, 0xC3, 0x61, 0xB0, 0xD8, 0x6C, 0x36, 0x18, /* 0x9E */ - 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xFF, 0x18, 0x18, /* 0x9F */ - /* 0xA0 */ - 0x21, 0x07, 0x8C, 0x0F, 0x06, 0x61, 0x98, 0xC3, 0x30, 0xD8, 0x1E, 0x07, 0x00, 0xC0, 0x60, 0x18, 0x0C, 0x03, 0x00, /* 0xA1 */ - 0x66, 0x18, 0xC1, 0x43, 0x63, 0x62, 0x26, 0x36, 0x34, 0x1C, 0x1C, 0x18, 0x18, 0x18, 0x10, 0x60, /* 0xA2 */ - 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x07, 0x8F, 0x1E, 0x27, 0x80, /* 0xA3 */ - 0xFF, 0xDF, 0x1E, 0x3E, 0xFF, 0xC0, /* 0xA4 */ - 0x00, 0xC0, 0x3F, 0xFF, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x00, /* 0xA5 */ - 0xFF, 0xFC, 0x0F, 0xFF, 0xC0, /* 0xA6 */ - 0x0C, 0x09, 0x0C, 0xC6, 0x63, 0x81, 0xE3, 0x19, 0x87, 0xE1, 0xB8, 0xC6, 0x41, 0xC0, 0x73, 0x19, 0x8C, 0x66, 0x1E, - 0x00, /* 0xA7 */ - 0x33, 0x00, 0x3F, 0xF8, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xFF, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0xFE, /* 0xA8 */ - 0x0F, 0xC0, 0x61, 0x87, 0x03, 0x9B, 0xC6, 0xD9, 0x8F, 0x60, 0x3D, 0x00, 0xF4, 0x03, 0xD8, 0x0D, 0xE6, 0x67, 0xF3, 0x86, 0x18, - 0x0F, 0xC0, /* 0xA9 */ - 0x1F, 0x86, 0x19, 0x81, 0xB0, 0x3C, 0x01, 0x80, 0x3F, 0xC6, 0x00, 0xC0, 0x68, 0x0D, 0x83, 0x18, 0x61, 0xF0, /* 0xAA */ - 0x22, 0xCF, 0x26, 0x46, 0x64, 0x40, /* 0xAB */ - 0xFF, 0x80, 0xC0, 0x60, 0x30, 0x18, /* 0xAC */ - /* 0xAD */ - 0x0F, 0xC0, 0x61, 0x87, 0x03, 0x9F, 0xE6, 0xD0, 0x8F, 0x42, 0x3D, 0xF0, 0xF4, 0x23, 0xD0, 0x8D, 0xC2, 0x67, 0x0B, 0x86, 0x18, - 0x0F, 0xC0, /* 0xAE */ - 0xCC, 0x03, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x00, /* 0xAF */ - 0x74, 0x63, 0x17, 0x00, /* 0xB0 */ - 0x0C, 0x06, 0x03, 0x07, 0xE0, 0xC0, 0x60, 0x30, 0x18, 0x00, 0x00, 0x3F, 0xE0, /* 0xB1 */ - 0xFF, 0xFF, 0xFF, 0xC0, /* 0xB2 */ - 0xC3, 0xFF, 0xFF, 0xC0, /* 0xB3 */ - 0x0C, 0x3F, 0xF0, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, /* 0xB4 */ - 0xC3, 0x61, 0xB0, 0xD8, 0x6C, 0x36, 0x1B, 0x0D, 0x86, 0xE7, 0x7D, 0xF0, 0x18, 0x0C, 0x00, /* 0xB5 */ - 0x3F, 0x7E, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0x72, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, /* 0xB6 */ - 0xE0, /* 0xB7 */ - 0x66, 0x00, 0x3C, 0x66, 0xC3, 0xC3, 0xFF, 0xC0, 0xC0, 0xC3, 0x66, 0x3C, /* 0xB8 */ - 0xC1, 0x81, 0x83, 0x03, 0x86, 0x05, 0x0C, 0xEB, 0x1A, 0x32, 0x34, 0x66, 0x68, 0xC4, 0xD1, 0x8D, 0xB3, 0x0B, 0x3A, 0x1E, 0x04, - 0x1C, 0x08, 0x1B, 0xC0, /* 0xB9 */ - 0x3C, 0x46, 0xC3, 0x80, 0xF8, 0x80, 0x80, 0xC3, 0x46, 0x3C, /* 0xBA */ - 0x89, 0x98, 0x99, 0x3C, 0xD1, 0x00, /* 0xBB */ - 0x30, 0x03, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0xE0, /* 0xBC */ - 0x3F, 0x18, 0x6C, 0x0F, 0x03, 0xC0, 0x1E, 0x01, 0xF0, 0x0E, 0x00, 0xF0, 0x3C, 0x0D, 0x86, 0x3F, 0x00, /* 0xBD */ - 0x3E, 0xE3, 0xC0, 0xC0, 0x60, 0x3C, 0x07, 0xC3, 0xE3, 0x7E, /* 0xBE */ - 0xCC, 0x03, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, /* 0xBF */ - 0x06, 0x00, 0xF0, 0x0F, 0x00, 0x90, 0x19, 0x81, 0x98, 0x10, 0x83, 0x0C, 0x3F, 0xC2, 0x04, 0x60, 0x66, 0x06, 0xC0, - 0x30, /* 0xC0 */ - 0xFF, 0x18, 0x03, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x3F, 0xE6, 0x06, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x6F, 0xF8, /* 0xC1 */ - 0xFF, 0x18, 0x33, 0x03, 0x60, 0x6C, 0x0D, 0x83, 0x3F, 0xC6, 0x06, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x6F, 0xF8, /* 0xC2 */ - 0xFF, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, /* 0xC3 */ - 0x1F, 0xF0, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x03, 0x0C, 0x0C, - 0xFF, 0xFF, 0x00, 0x3C, 0x00, 0xF0, 0x03, /* 0xC4 */ - 0xFF, 0xE0, 0x30, 0x18, 0x0C, 0x06, 0x03, 0xFD, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0F, 0xF8, /* 0xC5 */ - 0x61, 0x86, 0x31, 0x8C, 0x19, 0x98, 0x19, 0x98, 0x0D, 0xB0, 0x07, 0xE0, 0x03, 0xC0, 0x07, 0xE0, 0x0D, 0xB0, 0x19, 0x98, 0x31, - 0x8C, 0x61, 0x86, 0xC1, 0x83, /* 0xC6 */ - 0x3F, 0x18, 0x6C, 0x0F, 0x03, 0x00, 0xC0, 0x60, 0xF0, 0x06, 0x00, 0xF0, 0x3C, 0x0D, 0x86, 0x3F, 0x00, /* 0xC7 */ - 0xC0, 0xF8, 0x1F, 0x07, 0xE0, 0xBC, 0x37, 0x8C, 0xF1, 0x1E, 0x63, 0xD8, 0x7A, 0x0F, 0xC1, 0xF0, 0x3E, 0x06, /* 0xC8 */ - 0x11, 0x03, 0xE0, 0x00, 0x60, 0x7C, 0x0F, 0x83, 0xF0, 0x5E, 0x1B, 0xC6, 0x78, 0x8F, 0x31, 0xEC, 0x3D, 0x07, 0xE0, 0xF8, 0x1F, - 0x03, /* 0xC9 */ - 0xC1, 0xB0, 0xCC, 0x63, 0x30, 0xD8, 0x3C, 0x0F, 0x03, 0xE0, 0xDC, 0x33, 0x8C, 0x73, 0x0E, 0xC1, 0xC0, /* 0xCA */ - 0x3F, 0xCC, 0x33, 0x0C, 0xC3, 0x30, 0xCC, 0x33, 0x0C, 0xC3, 0x30, 0xC8, 0x36, 0x0D, 0x83, 0xC0, 0xC0, /* 0xCB */ - 0xE0, 0x3F, 0x01, 0xFC, 0x1F, 0xE0, 0xFD, 0x05, 0xEC, 0x6F, 0x63, 0x79, 0x13, 0xCD, 0x9E, 0x6C, 0xF1, 0x47, 0x8E, 0x3C, 0x71, - 0x80, /* 0xCC */ - 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xFF, 0xFE, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x06, /* 0xCD */ - 0x0F, 0x81, 0x83, 0x18, 0x0C, 0xC0, 0x6C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1B, 0x01, 0x98, 0x0C, 0x60, 0xC0, 0xF8, - 0x00, /* 0xCE */ - 0xFF, 0xF8, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x06, /* 0xCF */ - 0xFF, 0x30, 0x6C, 0x0F, 0x03, 0xC0, 0xF0, 0x6F, 0xF3, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x00, /* 0xD0 */ - 0x1F, 0x86, 0x19, 0x81, 0xA0, 0x3C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x68, 0x0D, 0x83, 0x18, 0x61, 0xF0, /* 0xD1 */ - 0xFF, 0x86, 0x03, 0x01, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xC0, /* 0xD2 */ - 0xC0, 0xF0, 0x66, 0x19, 0x8C, 0x33, 0x0D, 0x81, 0xE0, 0x70, 0x0C, 0x06, 0x01, 0x80, 0xC0, 0x30, 0x00, /* 0xD3 */ - 0x03, 0x00, 0x0C, 0x01, 0xFE, 0x1C, 0xCE, 0xE3, 0x1F, 0x0C, 0x3C, 0x30, 0xF0, 0xC3, 0xE3, 0x1D, 0xCC, 0xE3, 0xFF, 0x00, 0xC0, - 0x03, 0x00, /* 0xD4 */ - 0xC0, 0xD8, 0x66, 0x18, 0xCC, 0x1E, 0x07, 0x00, 0xC0, 0x78, 0x32, 0x0C, 0xC6, 0x1B, 0x07, 0xC0, 0xC0, /* 0xD5 */ - 0xC0, 0x66, 0x03, 0x30, 0x19, 0x80, 0xCC, 0x06, 0x60, 0x33, 0x01, 0x98, 0x0C, 0xC0, 0x66, 0x03, 0x30, 0x19, 0x80, 0xCF, 0xFF, - 0x80, 0x0C, 0x00, 0x60, /* 0xD6 */ - 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x06, 0xFF, 0x01, 0x80, 0xC0, 0x60, 0x30, 0x18, /* 0xD7 */ - 0xC3, 0x1E, 0x18, 0xF0, 0xC7, 0x86, 0x3C, 0x31, 0xE1, 0x8F, 0x0C, 0x78, 0x63, 0xC3, 0x1E, 0x18, 0xF0, 0xC7, 0x86, 0x3F, 0xFF, - 0x80, /* 0xD8 */ - 0xC3, 0x19, 0x86, 0x33, 0x0C, 0x66, 0x18, 0xCC, 0x31, 0x98, 0x63, 0x30, 0xC6, 0x61, 0x8C, 0xC3, 0x19, 0x86, 0x33, 0x0C, 0x66, - 0x18, 0xCF, 0xFF, 0xE0, 0x00, 0xC0, 0x01, 0x80, /* 0xD9 */ - 0xF8, 0x00, 0xC0, 0x06, 0x00, 0x30, 0x01, 0x80, 0x0F, 0xF0, 0x60, 0xC3, 0x03, 0x18, 0x18, 0xC0, 0xC6, 0x06, 0x30, 0x61, 0xFE, - 0x00, /* 0xDA */ - 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0xFE, 0x3C, 0x0C, 0xF0, 0x1B, 0xC0, 0x6F, 0x01, 0xBC, 0x06, 0xF0, 0x33, - 0xFF, 0x8C, /* 0xDB */ - 0xC0, 0x18, 0x03, 0x00, 0x60, 0x0C, 0x01, 0xFF, 0x30, 0x36, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x6F, 0xF8, /* 0xDC */ - 0x3F, 0x0C, 0x33, 0x83, 0x60, 0x20, 0x06, 0x00, 0x47, 0xF8, 0x01, 0xC0, 0x78, 0x0D, 0x81, 0x30, 0xC1, 0xF0, /* 0xDD */ - 0xC0, 0xF8, 0x61, 0x83, 0x31, 0x80, 0xD8, 0xC0, 0x6C, 0xC0, 0x1E, 0x60, 0x0F, 0xF0, 0x07, 0x98, 0x03, 0xCC, 0x01, 0xE3, 0x01, - 0xB1, 0x80, 0xD8, 0x60, 0xCC, 0x0F, 0x80, /* 0xDE */ - 0x3F, 0xD8, 0x3C, 0x0F, 0x03, 0xC0, 0xD8, 0x33, 0xFC, 0x33, 0x18, 0xCC, 0x36, 0x0D, 0x83, 0xC0, 0xC0, /* 0xDF */ - 0x7E, 0x71, 0xB0, 0xC0, 0x60, 0xF3, 0xDB, 0x0D, 0x86, 0xC7, 0x3D, 0xC0, /* 0xE0 */ - 0x03, 0x1F, 0x78, 0x40, 0xFC, 0xE6, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x66, 0x3C, /* 0xE1 */ - 0xFD, 0x8F, 0x0E, 0x3F, 0xDF, 0xB1, 0xE1, 0xC7, 0xF8, /* 0xE2 */ - 0xFE, 0x31, 0x8C, 0x63, 0x18, 0xC6, 0x00, /* 0xE3 */ - 0x1F, 0x83, 0x30, 0x66, 0x0C, 0xC1, 0x98, 0x33, 0x06, 0x61, 0x8C, 0x31, 0x9F, 0xFF, 0x01, 0xE0, 0x30, /* 0xE4 */ - 0x3C, 0x66, 0xC3, 0xC3, 0xFF, 0xC0, 0xC0, 0xC3, 0x66, 0x3C, /* 0xE5 */ - 0xC6, 0x36, 0x66, 0x36, 0xC1, 0xF8, 0x0F, 0x01, 0xF8, 0x36, 0xC6, 0x66, 0xC6, 0x38, 0x61, /* 0xE6 */ - 0x79, 0x8C, 0x18, 0x30, 0x43, 0x01, 0xE3, 0xC6, 0xF8, /* 0xE7 */ - 0xC7, 0xC7, 0xCF, 0xCB, 0xCB, 0xD3, 0xD3, 0xF3, 0xE3, 0xE3, /* 0xE8 */ - 0x66, 0x18, 0xC7, 0xC7, 0xCF, 0xCB, 0xCB, 0xD3, 0xD3, 0xF3, 0xE3, 0xE3, /* 0xE9 */ - 0xC7, 0x9B, 0x66, 0x8E, 0x1E, 0x36, 0x66, 0xC7, 0x84, /* 0xEA */ - 0x7E, 0xCD, 0x9B, 0x36, 0x6C, 0xD9, 0xA3, 0xC7, 0x0C, /* 0xEB */ - 0xE3, 0xF1, 0xF8, 0xFE, 0xFF, 0x7E, 0xAF, 0x77, 0x93, 0xC9, 0xE0, 0xC0, /* 0xEC */ - 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xFF, 0xC3, 0xC3, 0xC3, 0xC3, /* 0xED */ - 0x3C, 0x66, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x66, 0x3C, /* 0xEE */ - 0xFF, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, /* 0xEF */ - 0xDE, 0x71, 0xB0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xE3, 0x6F, 0x30, 0x18, 0x0C, 0x00, /* 0xF0 */ - 0x3C, 0x66, 0xC3, 0xC0, 0xC0, 0xC0, 0xC0, 0xC3, 0x66, 0x3C, /* 0xF1 */ - 0xFC, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC0, /* 0xF2 */ - 0xC1, 0x43, 0x63, 0x62, 0x26, 0x36, 0x34, 0x1C, 0x1C, 0x18, 0x18, 0x18, 0x10, 0x60, /* 0xF3 */ - 0x03, 0x00, 0x0C, 0x03, 0xB7, 0x19, 0xE6, 0xC3, 0x0F, 0x0C, 0x3C, 0x30, 0xF0, 0xC3, 0xC3, 0x0F, 0x0C, 0x36, 0x79, 0x8E, 0xDC, - 0x03, 0x00, 0x0C, 0x00, 0x30, 0x00, /* 0xF4 */ - 0x87, 0x89, 0xB1, 0xC3, 0x07, 0x1E, 0x26, 0xC5, 0x0C, /* 0xF5 */ - 0xC3, 0x30, 0xCC, 0x33, 0x0C, 0xC3, 0x30, 0xCC, 0x33, 0x0C, 0xC3, 0x3F, 0xF0, 0x0C, 0x03, /* 0xF6 */ - 0xC7, 0x8F, 0x1E, 0x3C, 0x6F, 0xC1, 0x83, 0x06, 0x0C, /* 0xF7 */ - 0xCC, 0xF3, 0x3C, 0xCF, 0x33, 0xCC, 0xF3, 0x3C, 0xCF, 0x33, 0xCC, 0xFF, 0xF0, /* 0xF8 */ - 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCF, 0xFF, 0x00, 0x30, 0x03, /* 0xF9 */ - 0xF0, 0x18, 0x0C, 0x06, 0x03, 0xF1, 0x8C, 0xC6, 0x63, 0x31, 0x9F, 0x80, /* 0xFA */ - 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xFE, 0xF0, 0xFC, 0x3F, 0x0F, 0xC3, 0xFF, 0xB0, /* 0xFB */ - 0xC0, 0xC0, 0xC0, 0xC0, 0xFE, 0xC3, 0xC3, 0xC3, 0xC3, 0xFE, /* 0xFC */ - 0x3C, 0x62, 0xC3, 0x01, 0x1F, 0x01, 0x01, 0xC3, 0x62, 0x3C, /* 0xFD */ - 0xC7, 0xCC, 0xC6, 0xD8, 0x3D, 0x83, 0xF8, 0x3D, 0x83, 0xD8, 0x3C, 0xC2, 0xCC, 0x6C, 0x7C, /* 0xFE */ - 0x7F, 0xC3, 0xC3, 0xC3, 0x7F, 0x13, 0x33, 0x63, 0xC3, 0x83, /* 0xFF */ -}; - -const GFXglyph FreeSans9pt_Win1251Glyphs[] PROGMEM = { - /* ' ' 0x20 */ {0, 0, 0, 5, 0, 0}, - /* '!' 0x21 */ {0, 2, 13, 6, 2, -12}, - /* '"' 0x22 */ {4, 5, 4, 6, 1, -12}, - /* '#' 0x23 */ {7, 10, 12, 10, 0, -11}, - /* '$' 0x24 */ {22, 9, 16, 10, 1, -13}, - /* '%' 0x25 */ {40, 16, 13, 16, 1, -12}, - /* '&' 0x26 */ {66, 10, 13, 12, 1, -12}, - /* ''' 0x27 */ {83, 2, 4, 4, 1, -12}, - /* '(' 0x28 */ {84, 4, 17, 6, 1, -12}, - /* ')' 0x29 */ {93, 4, 17, 6, 1, -12}, - /* '*' 0x2A */ {102, 5, 5, 7, 1, -12}, - /* '+' 0x2B */ {106, 6, 8, 11, 3, -7}, - /* ',' 0x2C */ {112, 2, 4, 5, 2, 0}, - /* '-' 0x2D */ {113, 4, 1, 6, 1, -4}, - /* '.' 0x2E */ {114, 2, 1, 5, 1, 0}, - /* '/' 0x2F */ {115, 5, 13, 5, 0, -12}, - /* '0' 0x30 */ {124, 8, 13, 10, 1, -12}, - /* '1' 0x31 */ {137, 4, 13, 10, 3, -12}, - /* '2' 0x32 */ {144, 9, 13, 10, 1, -12}, - /* '3' 0x33 */ {159, 8, 13, 10, 1, -12}, - /* '4' 0x34 */ {172, 7, 13, 10, 2, -12}, - /* '5' 0x35 */ {184, 9, 13, 10, 1, -12}, - /* '6' 0x36 */ {199, 9, 13, 10, 1, -12}, - /* '7' 0x37 */ {214, 8, 13, 10, 0, -12}, - /* '8' 0x38 */ {227, 9, 13, 10, 1, -12}, - /* '9' 0x39 */ {242, 8, 13, 10, 1, -12}, - /* ':' 0x3A */ {255, 2, 10, 5, 1, -9}, - /* ';' 0x3B */ {258, 3, 12, 5, 1, -8}, - /* '<' 0x3C */ {263, 9, 9, 11, 1, -8}, - /* '=' 0x3D */ {274, 9, 4, 11, 1, -5}, - /* '>' 0x3E */ {279, 9, 8, 11, 1, -7}, - /* '?' 0x3F */ {288, 9, 13, 10, 1, -12}, - /* '@' 0x40 */ {303, 17, 16, 18, 1, -12}, - /* 'A' 0x41 */ {337, 12, 13, 12, 0, -12}, - /* 'B' 0x42 */ {357, 11, 13, 12, 1, -12}, - /* 'C' 0x43 */ {375, 11, 13, 13, 1, -12}, - /* 'D' 0x44 */ {393, 11, 13, 13, 1, -12}, - /* 'E' 0x45 */ {411, 9, 13, 11, 1, -12}, - /* 'F' 0x46 */ {426, 8, 13, 11, 1, -12}, - /* 'G' 0x47 */ {439, 12, 13, 14, 1, -12}, - /* 'H' 0x48 */ {459, 11, 13, 13, 1, -12}, - /* 'I' 0x49 */ {477, 2, 13, 5, 2, -12}, - /* 'J' 0x4A */ {481, 7, 13, 10, 1, -12}, - /* 'K' 0x4B */ {493, 10, 13, 12, 1, -12}, - /* 'L' 0x4C */ {510, 8, 13, 10, 1, -12}, - /* 'M' 0x4D */ {523, 13, 13, 15, 1, -12}, - /* 'N' 0x4E */ {545, 11, 13, 13, 1, -12}, - /* 'O' 0x4F */ {563, 13, 13, 14, 1, -12}, - /* 'P' 0x50 */ {585, 10, 13, 12, 1, -12}, - /* 'Q' 0x51 */ {602, 13, 14, 14, 1, -12}, - /* 'R' 0x52 */ {625, 12, 13, 13, 1, -12}, - /* 'S' 0x53 */ {645, 10, 13, 12, 1, -12}, - /* 'T' 0x54 */ {662, 9, 13, 11, 1, -12}, - /* 'U' 0x55 */ {677, 11, 13, 13, 1, -12}, - /* 'V' 0x56 */ {695, 11, 13, 11, 0, -12}, - /* 'W' 0x57 */ {713, 16, 13, 17, 0, -12}, - /* 'X' 0x58 */ {739, 10, 13, 12, 1, -12}, - /* 'Y' 0x59 */ {756, 12, 13, 12, 0, -12}, - /* 'Z' 0x5A */ {776, 10, 13, 11, 1, -12}, - /* '[' 0x5B */ {793, 3, 17, 5, 1, -12}, - /* '\' 0x5C */ {800, 5, 13, 5, 0, -12}, - /* ']' 0x5D */ {809, 3, 17, 5, 0, -12}, - /* '^' 0x5E */ {816, 7, 7, 8, 1, -12}, - /* '_' 0x5F */ {823, 10, 1, 10, 0, 3}, - /* '`' 0x60 */ {825, 4, 3, 5, 0, -12}, - /* 'a' 0x61 */ {827, 9, 10, 10, 1, -9}, - /* 'b' 0x62 */ {839, 9, 13, 10, 1, -12}, - /* 'c' 0x63 */ {854, 8, 10, 9, 1, -9}, - /* 'd' 0x64 */ {864, 8, 13, 10, 1, -12}, - /* 'e' 0x65 */ {877, 8, 10, 10, 1, -9}, - /* 'f' 0x66 */ {887, 4, 13, 5, 1, -12}, - /* 'g' 0x67 */ {894, 8, 14, 10, 1, -9}, - /* 'h' 0x68 */ {908, 8, 13, 10, 1, -12}, - /* 'i' 0x69 */ {921, 2, 13, 4, 1, -12}, - /* 'j' 0x6A */ {925, 4, 17, 4, 0, -12}, - /* 'k' 0x6B */ {934, 8, 13, 9, 1, -12}, - /* 'l' 0x6C */ {947, 2, 13, 4, 1, -12}, - /* 'm' 0x6D */ {951, 13, 10, 15, 1, -9}, - /* 'n' 0x6E */ {968, 8, 10, 10, 1, -9}, - /* 'o' 0x6F */ {978, 8, 10, 10, 1, -9}, - /* 'p' 0x70 */ {988, 9, 13, 10, 1, -9}, - /* 'q' 0x71 */ {1003, 8, 13, 10, 1, -9}, - /* 'r' 0x72 */ {1016, 5, 10, 6, 1, -9}, - /* 's' 0x73 */ {1023, 8, 10, 9, 1, -9}, - /* 't' 0x74 */ {1033, 4, 12, 5, 1, -11}, - /* 'u' 0x75 */ {1039, 8, 10, 10, 1, -9}, - /* 'v' 0x76 */ {1049, 9, 10, 9, 0, -9}, - /* 'w' 0x77 */ {1061, 13, 10, 13, 0, -9}, - /* 'x' 0x78 */ {1078, 7, 10, 9, 1, -9}, - /* 'y' 0x79 */ {1087, 8, 14, 9, 0, -9}, - /* 'z' 0x7A */ {1101, 7, 10, 9, 1, -9}, - /* '{' 0x7B */ {1110, 4, 17, 6, 1, -12}, - /* '|' 0x7C */ {1119, 2, 17, 4, 2, -12}, - /* '}' 0x7D */ {1124, 4, 17, 6, 1, -12}, - /* '~' 0x7E */ {1133, 7, 3, 9, 1, -7}, - /* 0x7F */ {1136, 13, 14, 15, 1, -12}, - /* 0x80 */ {1159, 12, 16, 14, 1, -12}, - /* 0x81 */ {1183, 8, 15, 11, 1, -14}, - /* 0x82 */ {1198, 2, 3, 5, 1, 0}, - /* 0x83 */ {1199, 5, 13, 7, 1, -12}, - /* 0x84 */ {1208, 5, 3, 7, 1, 0}, - /* 0x85 */ {1210, 10, 1, 12, 1, 0}, - /* 0x86 */ {1212, 8, 16, 10, 1, -12}, - /* 0x87 */ {1228, 8, 16, 10, 1, -12}, - /* 0x88 */ {1244, 10, 13, 12, 1, -12}, - /* 0x89 */ {1261, 18, 13, 18, 0, -12}, - /* 0x8A */ {1291, 17, 13, 18, 1, -12}, - /* 0x8B */ {1319, 2, 4, 4, 1, -6}, - /* 0x8C */ {1320, 17, 13, 18, 1, -12}, - /* 0x8D */ {1348, 10, 15, 11, 1, -14}, - /* 0x8E */ {1367, 12, 13, 14, 1, -12}, - /* 0x8F */ {1387, 11, 15, 13, 1, -12}, - /* 0x90 */ {1408, 9, 16, 10, 1, -12}, - /* 0x91 */ {1426, 2, 4, 4, 2, -12}, - /* 0x92 */ {1427, 2, 4, 4, 1, -12}, - /* 0x93 */ {1428, 5, 4, 7, 2, -12}, - /* 0x94 */ {1431, 5, 4, 7, 1, -12}, - /* 0x95 */ {1434, 4, 5, 7, 1, -8}, - /* 0x96 */ {1437, 7, 1, 9, 1, -4}, - /* 0x97 */ {1438, 16, 1, 18, 1, -4}, - /* 0x98 */ {1440, 0, 0, 0, 0, 0}, - /* 0x99 */ {1440, 18, 10, 18, 1, -13}, - /* 0x9A */ {1463, 13, 10, 14, 1, -9}, - /* 0x9B */ {1480, 2, 4, 5, 2, -6}, - /* 0x9C */ {1481, 14, 10, 15, 1, -9}, - /* 0x9D */ {1499, 7, 13, 9, 1, -12}, - /* 0x9E */ {1511, 9, 13, 10, 1, -12}, - /* 0x9F */ {1526, 8, 12, 10, 1, -9}, - /* 0xA0 */ {1538, 0, 0, 5, 0, 0}, - /* 0xA1 */ {1538, 10, 15, 11, 1, -14}, - /* 0xA2 */ {1557, 8, 16, 9, 0, -11}, - /* 0xA3 */ {1573, 7, 13, 10, 1, -12}, - /* 0xA4 */ {1585, 7, 6, 10, 2, -8}, - /* 0xA5 */ {1591, 10, 14, 11, 1, -13}, - /* 0xA6 */ {1609, 2, 17, 5, 2, -12}, - /* 0xA7 */ {1614, 9, 17, 10, 1, -12}, - /* 0xA8 */ {1634, 9, 15, 12, 1, -14}, - /* 0xA9 */ {1651, 14, 13, 14, 1, -12}, - /* 0xAA */ {1674, 11, 13, 13, 1, -12}, - /* 0xAB */ {1692, 7, 6, 9, 1, -7}, - /* 0xAC */ {1698, 9, 5, 11, 2, -5}, - /* 0xAD */ {1704, 0, 0, 0, 0, 0}, - /* 0xAE */ {1704, 14, 13, 14, 1, -12}, - /* 0xAF */ {1727, 6, 15, 5, 0, -14}, - /* 0xB0 */ {1739, 5, 5, 11, 3, -11}, - /* 0xB1 */ {1743, 9, 11, 11, 1, -10}, - /* 0xB2 */ {1756, 2, 13, 4, 1, -12}, - /* 0xB3 */ {1760, 2, 13, 4, 1, -12}, - /* 0xB4 */ {1764, 6, 12, 7, 1, -11}, - /* 0xB5 */ {1773, 9, 13, 10, 1, -9}, - /* 0xB6 */ {1788, 8, 16, 10, 2, -12}, - /* 0xB7 */ {1804, 3, 1, 5, 1, -4}, - /* 0xB8 */ {1805, 8, 12, 10, 1, -11}, - /* 0xB9 */ {1817, 15, 13, 17, 1, -12}, - /* 0xBA */ {1842, 8, 10, 9, 1, -9}, - /* 0xBB */ {1852, 7, 6, 9, 1, -7}, - /* 0xBC */ {1858, 4, 17, 4, 0, -12}, - /* 0xBD */ {1867, 10, 13, 12, 1, -12}, - /* 0xBE */ {1884, 8, 10, 9, 1, -9}, - /* 0xBF */ {1894, 6, 12, 5, -1, -11}, - /* 0xC0 */ {1903, 12, 13, 12, 0, -12}, - /* 0xC1 */ {1923, 11, 13, 12, 1, -12}, - /* 0xC2 */ {1941, 11, 13, 12, 1, -12}, - /* 0xC3 */ {1959, 8, 13, 8, 1, -12}, - /* 0xC4 */ {1972, 14, 16, 15, 1, -12}, - /* 0xC5 */ {2000, 9, 13, 12, 1, -12}, - /* 0xC6 */ {2015, 16, 13, 16, 0, -12}, - /* 0xC7 */ {2041, 10, 13, 12, 1, -12}, - /* 0xC8 */ {2058, 11, 13, 13, 1, -12}, - /* 0xC9 */ {2076, 11, 16, 13, 1, -15}, - /* 0xCA */ {2098, 10, 13, 11, 1, -12}, - /* 0xCB */ {2115, 10, 13, 12, 1, -12}, - /* 0xCC */ {2132, 13, 13, 15, 1, -12}, - /* 0xCD */ {2154, 11, 13, 13, 1, -12}, - /* 0xCE */ {2172, 13, 13, 14, 1, -12}, - /* 0xCF */ {2194, 11, 13, 13, 1, -12}, - /* 0xD0 */ {2212, 10, 13, 12, 1, -12}, - /* 0xD1 */ {2229, 11, 13, 13, 1, -12}, - /* 0xD2 */ {2247, 9, 13, 11, 1, -12}, - /* 0xD3 */ {2262, 10, 13, 11, 1, -12}, - /* 0xD4 */ {2279, 14, 13, 15, 1, -12}, - /* 0xD5 */ {2302, 10, 13, 12, 1, -12}, - /* 0xD6 */ {2319, 13, 15, 13, 1, -12}, - /* 0xD7 */ {2344, 9, 13, 11, 1, -12}, - /* 0xD8 */ {2359, 13, 13, 15, 1, -12}, - /* 0xD9 */ {2381, 15, 15, 15, 1, -12}, - /* 0xDA */ {2410, 13, 13, 15, 2, -12}, - /* 0xDB */ {2432, 14, 13, 16, 1, -12}, - /* 0xDC */ {2455, 11, 13, 12, 1, -12}, - /* 0xDD */ {2473, 11, 13, 13, 1, -12}, - /* 0xDE */ {2491, 17, 13, 18, 1, -12}, - /* 0xDF */ {2519, 10, 13, 12, 1, -12}, - /* 0xE0 */ {2536, 9, 10, 10, 1, -9}, - /* 0xE1 */ {2548, 8, 14, 10, 1, -13}, - /* 0xE2 */ {2562, 7, 10, 9, 1, -9}, - /* 0xE3 */ {2571, 5, 10, 7, 1, -9}, - /* 0xE4 */ {2578, 11, 12, 10, 0, -9}, - /* 0xE5 */ {2595, 8, 10, 10, 1, -9}, - /* 0xE6 */ {2605, 12, 10, 14, 1, -9}, - /* 0xE7 */ {2620, 7, 10, 9, 1, -9}, - /* 0xE8 */ {2629, 8, 10, 10, 1, -9}, - /* 0xE9 */ {2639, 8, 12, 10, 1, -11}, - /* 0xEA */ {2651, 7, 10, 9, 1, -9}, - /* 0xEB */ {2660, 7, 10, 8, 0, -9}, - /* 0xEC */ {2669, 9, 10, 11, 1, -9}, - /* 0xED */ {2681, 8, 10, 10, 1, -9}, - /* 0xEE */ {2691, 8, 10, 10, 1, -9}, - /* 0xEF */ {2701, 8, 10, 10, 1, -9}, - /* 0xF0 */ {2711, 9, 13, 10, 1, -9}, - /* 0xF1 */ {2726, 8, 10, 9, 1, -9}, - /* 0xF2 */ {2736, 6, 10, 7, 1, -9}, - /* 0xF3 */ {2744, 8, 14, 9, 0, -9}, - /* 0xF4 */ {2758, 14, 15, 15, 1, -11}, - /* 0xF5 */ {2785, 7, 10, 9, 1, -9}, - /* 0xF6 */ {2794, 10, 12, 10, 1, -9}, - /* 0xF7 */ {2809, 7, 10, 9, 1, -9}, - /* 0xF8 */ {2818, 10, 10, 12, 1, -9}, - /* 0xF9 */ {2831, 12, 12, 13, 1, -9}, - /* 0xFA */ {2849, 9, 10, 12, 2, -9}, - /* 0xFB */ {2861, 10, 10, 12, 1, -9}, - /* 0xFC */ {2874, 8, 10, 9, 1, -9}, - /* 0xFD */ {2884, 8, 10, 9, 1, -9}, - /* 0xFE */ {2894, 12, 10, 13, 1, -9}, - /* 0xFF */ {2909, 8, 10, 10, 1, -9}, -}; - -const GFXfont FreeSans9pt_Win1251 PROGMEM = {(uint8_t *)FreeSans9pt_Win1251Bitmaps, (GFXglyph *)FreeSans9pt_Win1251Glyphs, 0x20, - 0xFF, 21}; diff --git a/src/graphics/niche/Fonts/FreeSans9pt_Win1252.h b/src/graphics/niche/Fonts/FreeSans9pt_Win1252.h deleted file mode 100644 index 20f2ddc2ff..0000000000 --- a/src/graphics/niche/Fonts/FreeSans9pt_Win1252.h +++ /dev/null @@ -1,494 +0,0 @@ -#pragma once -const uint8_t FreeSans9pt_Win1252Bitmaps[] PROGMEM = { - /* ' ' 0x20 */ - 0xFF, 0xFF, 0xF0, 0xC0, /* '!' 0x21 */ - 0xDE, 0xF7, 0x20, /* '"' 0x22 */ - 0x09, 0x86, 0x41, 0x91, 0xFF, 0x13, 0x04, 0xC3, 0x20, 0xC8, 0xFF, 0x89, 0x82, 0x61, 0x90, /* '#' 0x23 */ - 0x10, 0x1F, 0x14, 0xDA, 0x3D, 0x1E, 0x83, 0x40, 0x78, 0x17, 0x08, 0xF4, 0x7A, 0x35, 0x33, 0xF0, 0x40, 0x20, /* '$' 0x24 */ - 0x38, 0x10, 0xEC, 0x20, 0xC6, 0x20, 0xC6, 0x40, 0xC6, 0x40, 0x6C, 0x80, 0x39, 0x00, 0x01, 0x3C, 0x02, 0x77, 0x02, 0x63, 0x04, - 0x63, 0x04, 0x77, 0x08, 0x3C, /* '%' 0x25 */ - 0x0E, 0x0C, 0xC3, 0x30, 0xCC, 0x1E, 0x03, 0x03, 0xC1, 0x9B, 0xC2, 0xF0, 0xEC, 0x19, 0x8F, 0x3C, 0x40, /* '&' 0x26 */ - 0xFE, /* ''' 0x27 */ - 0x13, 0x26, 0x6C, 0xCC, 0xCC, 0xC4, 0x66, 0x23, 0x10, /* '(' 0x28 */ - 0x8C, 0x46, 0x63, 0x33, 0x33, 0x32, 0x66, 0x4C, 0x80, /* ')' 0x29 */ - 0x25, 0x7E, 0xA5, 0x00, /* '*' 0x2A */ - 0x30, 0xC3, 0x3F, 0x30, 0xC3, 0x0C, /* '+' 0x2B */ - 0xD6, /* ',' 0x2C */ - 0xF0, /* '-' 0x2D */ - 0xC0, /* '.' 0x2E */ - 0x08, 0x44, 0x21, 0x10, 0x84, 0x42, 0x11, 0x08, 0x00, /* '/' 0x2F */ - 0x3C, 0x66, 0x42, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x42, 0x66, 0x3C, /* '0' 0x30 */ - 0x11, 0x3F, 0x33, 0x33, 0x33, 0x33, 0x30, /* '1' 0x31 */ - 0x3E, 0x31, 0xB0, 0x78, 0x30, 0x18, 0x1C, 0x1C, 0x1C, 0x18, 0x18, 0x10, 0x08, 0x07, 0xF8, /* '2' 0x32 */ - 0x3C, 0x66, 0xC3, 0xC3, 0x03, 0x06, 0x1C, 0x07, 0x03, 0xC3, 0xC3, 0x66, 0x3C, /* '3' 0x33 */ - 0x0C, 0x18, 0x71, 0x62, 0xC9, 0xA3, 0x46, 0xFE, 0x18, 0x30, 0x60, 0xC0, /* '4' 0x34 */ - 0x7F, 0x20, 0x10, 0x08, 0x08, 0x07, 0xF3, 0x8C, 0x03, 0x01, 0x80, 0xF0, 0x6C, 0x63, 0xE0, /* '5' 0x35 */ - 0x1E, 0x31, 0x98, 0x78, 0x0C, 0x06, 0xF3, 0x8D, 0x83, 0xC1, 0xE0, 0xD0, 0x6C, 0x63, 0xE0, /* '6' 0x36 */ - 0xFF, 0x03, 0x02, 0x06, 0x04, 0x0C, 0x08, 0x18, 0x18, 0x18, 0x10, 0x30, 0x30, /* '7' 0x37 */ - 0x3E, 0x31, 0xB0, 0x78, 0x3C, 0x1B, 0x18, 0xF8, 0xC6, 0xC1, 0xE0, 0xF0, 0x6C, 0x63, 0xE0, /* '8' 0x38 */ - 0x3C, 0x66, 0xC2, 0xC3, 0xC3, 0xC3, 0x67, 0x3B, 0x03, 0x03, 0xC2, 0x66, 0x3C, /* '9' 0x39 */ - 0xC0, 0x00, 0x30, /* ':' 0x3A */ - 0xC0, 0x00, 0x00, 0x64, 0xA0, /* ';' 0x3B */ - 0x00, 0x81, 0xC7, 0x8E, 0x0C, 0x07, 0x80, 0x70, 0x0E, 0x01, 0x80, /* '<' 0x3C */ - 0xFF, 0x80, 0x00, 0x1F, 0xF0, /* '=' 0x3D */ - 0xE0, 0x1C, 0x03, 0x80, 0x30, 0x70, 0xE3, 0x81, 0x00, /* '>' 0x3E */ - 0x3E, 0x31, 0xB0, 0x78, 0x30, 0x18, 0x18, 0x38, 0x18, 0x18, 0x0C, 0x00, 0x00, 0x01, 0x80, /* '?' 0x3F */ - 0x03, 0xF0, 0x06, 0x0E, 0x06, 0x01, 0x86, 0x00, 0x66, 0x1D, 0xBB, 0x31, 0xCF, 0x18, 0xC7, 0x98, 0x63, 0xCC, 0x31, 0xE6, 0x11, - 0xB3, 0x99, 0xCC, 0xF7, 0x86, 0x00, 0x01, 0x80, 0x00, 0x70, 0x40, 0x0F, 0xE0, /* '@' 0x40 */ - 0x06, 0x00, 0xF0, 0x0F, 0x00, 0x90, 0x19, 0x81, 0x98, 0x10, 0x83, 0x0C, 0x3F, 0xC2, 0x04, 0x60, 0x66, 0x06, 0xC0, - 0x30, /* 'A' 0x41 */ - 0xFF, 0x18, 0x33, 0x03, 0x60, 0x6C, 0x0D, 0x83, 0x3F, 0xC6, 0x06, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x6F, 0xF8, /* 'B' 0x42 */ - 0x1F, 0x86, 0x19, 0x81, 0xA0, 0x3C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x68, 0x0D, 0x83, 0x18, 0x61, 0xF0, /* 'C' 0x43 */ - 0xFF, 0x18, 0x33, 0x03, 0x60, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x03, 0x60, 0xCF, 0xF0, /* 'D' 0x44 */ - 0xFF, 0xE0, 0x30, 0x18, 0x0C, 0x06, 0x03, 0xFD, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0F, 0xF8, /* 'E' 0x45 */ - 0xFF, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xFE, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, /* 'F' 0x46 */ - 0x0F, 0x83, 0x0E, 0x60, 0x66, 0x03, 0xC0, 0x0C, 0x00, 0xC1, 0xFC, 0x03, 0xC0, 0x36, 0x03, 0x60, 0x73, 0x0F, 0x0F, - 0x10, /* 'G' 0x47 */ - 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xFF, 0xFE, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x06, /* 'H' 0x48 */ - 0xFF, 0xFF, 0xFF, 0xC0, /* 'I' 0x49 */ - 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x07, 0x8F, 0x1E, 0x27, 0x80, /* 'J' 0x4A */ - 0xC0, 0xF0, 0x6C, 0x33, 0x18, 0xCC, 0x37, 0x0F, 0xC3, 0x98, 0xC3, 0x30, 0xCC, 0x1B, 0x03, 0xC0, 0xC0, /* 'K' 0x4B */ - 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xFF, /* 'L' 0x4C */ - 0xE0, 0x3F, 0x01, 0xFC, 0x1F, 0xE0, 0xFD, 0x05, 0xEC, 0x6F, 0x63, 0x79, 0x13, 0xCD, 0x9E, 0x6C, 0xF1, 0x47, 0x8E, 0x3C, 0x71, - 0x80, /* 'M' 0x4D */ - 0xE0, 0x7C, 0x0F, 0xC1, 0xE8, 0x3D, 0x87, 0x98, 0xF1, 0x1E, 0x33, 0xC3, 0x78, 0x6F, 0x07, 0xE0, 0x7C, 0x0E, /* 'N' 0x4E */ - 0x0F, 0x81, 0x83, 0x18, 0x0C, 0xC0, 0x6C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1B, 0x01, 0x98, 0x0C, 0x60, 0xC0, 0xF8, - 0x00, /* 'O' 0x4F */ - 0xFF, 0x30, 0x6C, 0x0F, 0x03, 0xC0, 0xF0, 0x6F, 0xF3, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x00, /* 'P' 0x50 */ - 0x0F, 0x81, 0x83, 0x18, 0x0C, 0xC0, 0x6C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1B, 0x01, 0x98, 0x6C, 0x60, 0xC0, 0xFB, - 0x00, 0x08, /* 'Q' 0x51 */ - 0xFF, 0x8C, 0x0E, 0xC0, 0x6C, 0x06, 0xC0, 0x6C, 0x0C, 0xFF, 0x8C, 0x0E, 0xC0, 0x6C, 0x06, 0xC0, 0x6C, 0x06, 0xC0, - 0x70, /* 'R' 0x52 */ - 0x3F, 0x18, 0x6C, 0x0F, 0x03, 0xC0, 0x1E, 0x01, 0xF0, 0x0E, 0x00, 0xF0, 0x3C, 0x0D, 0x86, 0x3F, 0x00, /* 'S' 0x53 */ - 0xFF, 0x86, 0x03, 0x01, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xC0, /* 'T' 0x54 */ - 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xB0, 0x61, 0xF0, /* 'U' 0x55 */ - 0xC0, 0x6C, 0x0D, 0x81, 0x10, 0x63, 0x0C, 0x61, 0x04, 0x60, 0xCC, 0x19, 0x01, 0x60, 0x3C, 0x07, 0x00, 0x60, /* 'V' 0x56 */ - 0xC1, 0x81, 0x61, 0xC3, 0x61, 0xC3, 0x61, 0x43, 0x62, 0x62, 0x22, 0x66, 0x32, 0x26, 0x36, 0x26, 0x14, 0x34, 0x14, 0x34, 0x1C, - 0x1C, 0x18, 0x1C, 0x08, 0x18, /* 'W' 0x57 */ - 0xC0, 0xD8, 0x66, 0x18, 0xCC, 0x1E, 0x07, 0x00, 0xC0, 0x78, 0x32, 0x0C, 0xC6, 0x1B, 0x07, 0xC0, 0xC0, /* 'X' 0x58 */ - 0xC0, 0x36, 0x06, 0x30, 0xC3, 0x0C, 0x19, 0x81, 0xD8, 0x0F, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, - 0x00, /* 'Y' 0x59 */ - 0xFF, 0xC0, 0x60, 0x30, 0x0C, 0x06, 0x03, 0x01, 0xC0, 0x60, 0x30, 0x18, 0x06, 0x03, 0x00, 0xFF, 0xC0, /* 'Z' 0x5A */ - 0xFB, 0x6D, 0xB6, 0xDB, 0x6D, 0xB6, 0xE0, /* '[' 0x5B */ - 0x84, 0x10, 0x84, 0x10, 0x84, 0x10, 0x84, 0x10, 0x80, /* '\' 0x5C */ - 0xED, 0xB6, 0xDB, 0x6D, 0xB6, 0xDB, 0xE0, /* ']' 0x5D */ - 0x30, 0x60, 0xA2, 0x44, 0xD8, 0xA1, 0x80, /* '^' 0x5E */ - 0xFF, 0xC0, /* '_' 0x5F */ - 0xC6, 0x30, /* '`' 0x60 */ - 0x7E, 0x71, 0xB0, 0xC0, 0x60, 0xF3, 0xDB, 0x0D, 0x86, 0xC7, 0x3D, 0xC0, /* 'a' 0x61 */ - 0xC0, 0x60, 0x30, 0x1B, 0xCE, 0x36, 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x7C, 0x6D, 0xE0, /* 'b' 0x62 */ - 0x3C, 0x66, 0xC3, 0xC0, 0xC0, 0xC0, 0xC0, 0xC3, 0x66, 0x3C, /* 'c' 0x63 */ - 0x03, 0x03, 0x03, 0x3B, 0x67, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x67, 0x3B, /* 'd' 0x64 */ - 0x3C, 0x66, 0xC3, 0xC3, 0xFF, 0xC0, 0xC0, 0xC3, 0x66, 0x3C, /* 'e' 0x65 */ - 0x36, 0x6F, 0x66, 0x66, 0x66, 0x66, 0x60, /* 'f' 0x66 */ - 0x3B, 0x67, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x67, 0x3B, 0x03, 0x03, 0xC6, 0x7C, /* 'g' 0x67 */ - 0xC0, 0xC0, 0xC0, 0xDE, 0xE3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, /* 'h' 0x68 */ - 0xC3, 0xFF, 0xFF, 0xC0, /* 'i' 0x69 */ - 0x30, 0x03, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0xE0, /* 'j' 0x6A */ - 0xC0, 0xC0, 0xC0, 0xC2, 0xC4, 0xCC, 0xD8, 0xF8, 0xEC, 0xC4, 0xC6, 0xC3, 0xC3, /* 'k' 0x6B */ - 0xFF, 0xFF, 0xFF, 0xC0, /* 'l' 0x6C */ - 0xDE, 0xF7, 0x1C, 0xF0, 0xC7, 0x86, 0x3C, 0x31, 0xE1, 0x8F, 0x0C, 0x78, 0x63, 0xC3, 0x1E, 0x18, 0xC0, /* 'm' 0x6D */ - 0xDE, 0xE3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, /* 'n' 0x6E */ - 0x3C, 0x66, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x66, 0x3C, /* 'o' 0x6F */ - 0xDE, 0x71, 0xB0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xE3, 0x6F, 0x30, 0x18, 0x0C, 0x00, /* 'p' 0x70 */ - 0x3B, 0x67, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x67, 0x3B, 0x03, 0x03, 0x03, /* 'q' 0x71 */ - 0xDF, 0x31, 0x8C, 0x63, 0x18, 0xC6, 0x00, /* 'r' 0x72 */ - 0x3E, 0xE3, 0xC0, 0xC0, 0xE0, 0x3C, 0x07, 0xC3, 0xE3, 0x7E, /* 's' 0x73 */ - 0x66, 0xF6, 0x66, 0x66, 0x66, 0x67, /* 't' 0x74 */ - 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC7, 0x7B, /* 'u' 0x75 */ - 0xC1, 0xA0, 0x98, 0xCC, 0x42, 0x21, 0xB0, 0xD0, 0x28, 0x1C, 0x0C, 0x00, /* 'v' 0x76 */ - 0xC6, 0x1E, 0x38, 0x91, 0xC4, 0xCA, 0x66, 0xD3, 0x16, 0xD0, 0xA6, 0x87, 0x1C, 0x38, 0xC0, 0xC6, 0x00, /* 'w' 0x77 */ - 0x87, 0x89, 0xB1, 0xC3, 0x07, 0x1E, 0x26, 0xC5, 0x0C, /* 'x' 0x78 */ - 0xC1, 0x43, 0x63, 0x62, 0x26, 0x36, 0x34, 0x1C, 0x1C, 0x18, 0x18, 0x18, 0x10, 0x60, /* 'y' 0x79 */ - 0xFE, 0x0C, 0x30, 0xC1, 0x86, 0x18, 0x20, 0xC1, 0xFC, /* 'z' 0x7A */ - 0x36, 0x66, 0x66, 0x6E, 0xCE, 0x66, 0x66, 0x66, 0x30, /* '{' 0x7B */ - 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, /* '|' 0x7C */ - 0xC6, 0x66, 0x66, 0x67, 0x37, 0x66, 0x66, 0x66, 0xC0, /* '}' 0x7D */ - 0x61, 0x24, 0x38, /* '~' 0x7E */ - 0xFF, 0xFC, 0x00, 0x63, 0xE3, 0x31, 0x99, 0x04, 0xC8, 0x66, 0x06, 0x30, 0x61, 0x83, 0x0C, 0x18, 0x60, 0x03, 0x06, 0x18, 0x00, - 0xFF, 0xFC, /* 0x7F */ - 0x07, 0xC6, 0x13, 0x00, 0xC0, 0x60, 0x3F, 0xE6, 0x03, 0xFC, 0x60, 0x0C, 0x03, 0x00, 0x61, 0x07, 0xC0, /* 0x80 */ - /* 0x81 */ - 0xDC, /* 0x82 */ - 0x19, 0x8C, 0xF3, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0xC6, 0xE0, /* 0x83 */ - 0xDA, 0x76, /* 0x84 */ - 0xCC, 0xC0, /* 0x85 */ - 0x18, 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, /* 0x86 */ - 0x18, 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18, 0x18, /* 0x87 */ - 0x72, 0xA2, /* 0x88 */ - 0x70, 0x80, 0x22, 0x20, 0x08, 0x90, 0x02, 0x24, 0x00, 0x72, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x10, 0x00, 0x09, 0xC7, 0x84, - 0x8B, 0x31, 0x22, 0x84, 0x88, 0xB3, 0x21, 0xC7, 0x80, /* 0x89 */ - 0x1B, 0x03, 0x80, 0x00, 0xFC, 0x61, 0xB0, 0x3C, 0x0F, 0x00, 0x78, 0x07, 0xC0, 0x38, 0x03, 0xC0, 0xF0, 0x36, 0x18, - 0xFC, /* 0x8A */ - 0x69, /* 0x8B */ - 0x1E, 0xFE, 0x43, 0x81, 0x83, 0x06, 0x06, 0x0C, 0x0C, 0x18, 0x18, 0x30, 0x3F, 0xE0, 0x60, 0xC0, 0xC1, 0x81, 0x81, 0x83, 0x01, - 0x8E, 0x01, 0xEF, 0xE0, /* 0x8C */ - /* 0x8D */ - 0x1B, 0x03, 0x80, 0x03, 0xFF, 0x01, 0x80, 0xC0, 0x30, 0x18, 0x0C, 0x07, 0x01, 0x80, 0xC0, 0x60, 0x18, 0x0C, 0x03, - 0xFF, /* 0x8E */ - /* 0x8F */ - /* 0x90 */ - 0x6B, /* 0x91 */ - 0xD6, /* 0x92 */ - 0x4C, 0xA5, 0xB0, /* 0x93 */ - 0xDA, 0x53, 0x20, /* 0x94 */ - 0x6F, 0xFF, 0x60, /* 0x95 */ - 0xFE, /* 0x96 */ - 0xFF, 0xFF, /* 0x97 */ - 0x4D, 0xC0, /* 0x98 */ - 0xFC, 0xE1, 0xCC, 0x38, 0x73, 0x0E, 0x1C, 0xC3, 0x8F, 0x30, 0xD2, 0xCC, 0x34, 0xB3, 0x0D, 0x6C, 0xC3, 0x53, 0x30, 0xCC, 0xCC, - 0x33, 0x30, /* 0x99 */ - 0x24, 0x3C, 0x18, 0x7E, 0xE3, 0xC0, 0xC0, 0x60, 0x3C, 0x07, 0xC3, 0xE3, 0x7E, /* 0x9A */ - 0x96, /* 0x9B */ - 0x3C, 0xF8, 0xCF, 0x1B, 0x0C, 0x1E, 0x18, 0x3C, 0x3F, 0xF8, 0x60, 0x30, 0xC0, 0x61, 0x83, 0x67, 0x8C, 0x79, 0xF0, /* 0x9C */ - /* 0x9D */ - 0x48, 0xF0, 0xC7, 0xF0, 0x61, 0x86, 0x0C, 0x30, 0xC1, 0x06, 0x0F, 0xE0, /* 0x9E */ - 0x19, 0x80, 0x00, 0xC0, 0x36, 0x06, 0x30, 0xC3, 0x0C, 0x19, 0x81, 0xD8, 0x0F, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, - 0x60, /* 0x9F */ - /* 0xA0 */ - 0xCF, 0xFF, 0xFF, 0xC0, /* 0xA1 */ - 0x08, 0x04, 0x0F, 0x8D, 0x6C, 0x9E, 0x43, 0x21, 0x90, 0xC8, 0x64, 0xDA, 0xC7, 0xC0, 0x80, 0x40, /* 0xA2 */ - 0x1F, 0x0C, 0x66, 0x0D, 0x83, 0x60, 0x0C, 0x0F, 0xC0, 0x60, 0x18, 0x06, 0x03, 0x01, 0xF1, 0x43, 0xC0, /* 0xA3 */ - 0xFF, 0xDF, 0x1E, 0x3E, 0xFF, 0xC0, /* 0xA4 */ - 0xC3, 0x42, 0x42, 0x24, 0x24, 0x3C, 0x18, 0x7E, 0x18, 0x7E, 0x18, 0x18, 0x18, /* 0xA5 */ - 0xFF, 0xFC, 0x0F, 0xFF, 0xC0, /* 0xA6 */ - 0x0C, 0x09, 0x0C, 0xC6, 0x63, 0x81, 0xE3, 0x19, 0x87, 0xE1, 0xB8, 0xC6, 0x41, 0xC0, 0x73, 0x19, 0x8C, 0x66, 0x1E, - 0x00, /* 0xA7 */ - 0xCC, /* 0xA8 */ - 0x0F, 0xC0, 0x61, 0x87, 0x03, 0x9B, 0xC6, 0xD9, 0x8F, 0x60, 0x3D, 0x00, 0xF4, 0x03, 0xD8, 0x0D, 0xE6, 0x67, 0xF3, 0x86, 0x18, - 0x0F, 0xC0, /* 0xA9 */ - 0x74, 0x8D, 0xA9, 0x7C, 0x1F, /* 0xAA */ - 0x22, 0xCF, 0x26, 0x46, 0x64, 0x40, /* 0xAB */ - 0xFF, 0x80, 0xC0, 0x60, 0x30, 0x18, /* 0xAC */ - /* 0xAD */ - 0x0F, 0xC0, 0x61, 0x87, 0x03, 0x9F, 0xE6, 0xD0, 0x8F, 0x42, 0x3D, 0xF0, 0xF4, 0x23, 0xD0, 0x8D, 0xC2, 0x67, 0x0B, 0x86, 0x18, - 0x0F, 0xC0, /* 0xAE */ - 0xF8, /* 0xAF */ - 0x74, 0x63, 0x17, 0x00, /* 0xB0 */ - 0x0C, 0x06, 0x03, 0x07, 0xE0, 0xC0, 0x60, 0x30, 0x18, 0x00, 0x00, 0x3F, 0xE0, /* 0xB1 */ - 0x7B, 0x30, 0xC3, 0x11, 0x84, 0x3F, /* 0xB2 */ - 0x7D, 0x8C, 0x18, 0xC0, 0x60, 0xF1, 0xBE, /* 0xB3 */ - 0x36, 0xC0, /* 0xB4 */ - 0xC3, 0x61, 0xB0, 0xD8, 0x6C, 0x36, 0x1B, 0x0D, 0x86, 0xE7, 0x7D, 0xF0, 0x18, 0x0C, 0x00, /* 0xB5 */ - 0x3F, 0x7E, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0x72, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, /* 0xB6 */ - 0xE0, /* 0xB7 */ - 0x21, 0xC7, 0xE0, /* 0xB8 */ - 0x3D, 0xB6, 0xD8, /* 0xB9 */ - 0x74, 0x63, 0x18, 0xB8, 0x1F, /* 0xBA */ - 0x89, 0x98, 0x99, 0x3C, 0xD1, 0x00, /* 0xBB */ - 0x20, 0x43, 0x81, 0x06, 0x08, 0x18, 0x20, 0x61, 0x01, 0x84, 0x06, 0x21, 0x80, 0x86, 0x04, 0x78, 0x32, 0x60, 0x87, 0xC4, 0x06, - 0x10, 0x18, /* 0xBC */ - 0x20, 0x43, 0x81, 0x06, 0x08, 0x18, 0x20, 0x61, 0x01, 0x8D, 0xE6, 0x2C, 0xC1, 0x03, 0x0C, 0x0C, 0x20, 0x41, 0x86, 0x0C, 0x30, - 0x20, 0xFC, /* 0xBD */ - 0x78, 0x11, 0x98, 0x40, 0x31, 0x00, 0x82, 0x00, 0xC8, 0x01, 0x90, 0x33, 0x43, 0x3D, 0x06, 0x02, 0x3C, 0x08, 0x98, 0x10, 0xF8, - 0x40, 0x61, 0x00, 0xC0, /* 0xBE */ - 0x0C, 0x00, 0x00, 0x01, 0x80, 0xC0, 0xC0, 0xE0, 0xC0, 0xC0, 0x60, 0xF0, 0x6C, 0x63, 0xE0, /* 0xBF */ - 0x18, 0x03, 0x00, 0x00, 0x30, 0x1E, 0x07, 0x81, 0x20, 0xCC, 0x33, 0x0F, 0xC6, 0x19, 0x86, 0x40, 0xB0, 0x30, /* 0xC0 */ - 0x06, 0x03, 0x00, 0x00, 0x30, 0x1E, 0x07, 0x81, 0x20, 0xCC, 0x33, 0x0F, 0xC6, 0x19, 0x86, 0x40, 0xB0, 0x30, /* 0xC1 */ - 0x0C, 0x04, 0x80, 0x00, 0x30, 0x1E, 0x07, 0x81, 0x20, 0xCC, 0x33, 0x0F, 0xC6, 0x19, 0x86, 0x40, 0xB0, 0x30, /* 0xC2 */ - 0x19, 0x09, 0x80, 0x00, 0x30, 0x1E, 0x07, 0x81, 0x20, 0xCC, 0x33, 0x0F, 0xC6, 0x19, 0x86, 0x40, 0xB0, 0x30, /* 0xC3 */ - 0x33, 0x00, 0x00, 0xC0, 0x78, 0x1E, 0x04, 0x83, 0x30, 0xCC, 0x33, 0x1F, 0xE6, 0x19, 0x02, 0xC0, 0xF0, 0x30, /* 0xC4 */ - 0x0C, 0x04, 0x81, 0x20, 0x30, 0x1E, 0x07, 0x81, 0x20, 0xCC, 0x33, 0x0F, 0xC6, 0x19, 0x86, 0x40, 0xB0, 0x30, /* 0xC5 */ - 0x07, 0xFF, 0x04, 0xC0, 0x0C, 0xC0, 0x08, 0xC0, 0x18, 0xC0, 0x18, 0xC0, 0x30, 0xFF, 0x30, 0xC0, 0x3F, 0xC0, 0x60, 0xC0, 0x60, - 0xC0, 0xC0, 0xC0, 0xC0, 0xFF, /* 0xC6 */ - 0x1F, 0x06, 0x19, 0x83, 0xA0, 0x3C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x68, 0x0D, 0x83, 0x18, 0xE1, 0xF0, 0x08, 0x01, 0xC0, - 0x18, 0x0E, 0x00, /* 0xC7 */ - 0x18, 0x06, 0x00, 0x1F, 0xFC, 0x06, 0x03, 0x01, 0x80, 0xFF, 0x60, 0x30, 0x18, 0x0C, 0x07, 0xFC, /* 0xC8 */ - 0x0C, 0x0C, 0x00, 0x1F, 0xFC, 0x06, 0x03, 0x01, 0x80, 0xFF, 0x60, 0x30, 0x18, 0x0C, 0x07, 0xFC, /* 0xC9 */ - 0x1C, 0x1B, 0x00, 0x1F, 0xFC, 0x06, 0x03, 0x01, 0x80, 0xFF, 0x60, 0x30, 0x18, 0x0C, 0x07, 0xFC, /* 0xCA */ - 0x33, 0x00, 0x3F, 0xF8, 0x0C, 0x06, 0x03, 0x01, 0xFE, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x07, 0xFC, /* 0xCB */ - 0xCC, 0x36, 0xDB, 0x6D, 0xB6, 0xD8, /* 0xCC */ - 0x78, 0x36, 0xDB, 0x6D, 0xB6, 0xC0, /* 0xCD */ - 0x76, 0xC0, 0x63, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x18, /* 0xCE */ - 0xCC, 0x03, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC0, /* 0xCF */ - 0x7F, 0x0C, 0x31, 0x83, 0x30, 0x36, 0x06, 0xC0, 0xFE, 0x1B, 0x03, 0x60, 0x6C, 0x0D, 0x83, 0x30, 0xE7, 0xF0, /* 0xD0 */ - 0x19, 0x02, 0xC3, 0x81, 0xF0, 0x3F, 0x07, 0xA0, 0xF6, 0x1E, 0x63, 0xC4, 0x78, 0xCF, 0x0D, 0xE1, 0xBC, 0x1F, 0x81, - 0xC0, /* 0xD1 */ - 0x0C, 0x00, 0x60, 0x00, 0x00, 0xF0, 0x39, 0xC6, 0x06, 0x60, 0x6C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x36, 0x06, 0x60, 0x63, 0x9C, - 0x0F, 0x00, /* 0xD2 */ - 0x03, 0x00, 0x60, 0x00, 0x00, 0xF0, 0x39, 0xC6, 0x06, 0x60, 0x6C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x36, 0x06, 0x60, 0x63, 0x9C, - 0x0F, 0x00, /* 0xD3 */ - 0x0F, 0x01, 0x98, 0x00, 0x00, 0xF0, 0x39, 0xC6, 0x06, 0x60, 0x6C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x36, 0x06, 0x60, 0x63, 0x9C, - 0x0F, 0x00, /* 0xD4 */ - 0x1C, 0x81, 0x38, 0x00, 0x00, 0xF0, 0x39, 0xC6, 0x06, 0x60, 0x6C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x36, 0x06, 0x60, 0x63, 0x9C, - 0x0F, 0x00, /* 0xD5 */ - 0x19, 0x81, 0x98, 0x00, 0x00, 0xF0, 0x39, 0xC6, 0x06, 0x60, 0x6C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x36, 0x06, 0x60, 0x63, 0x9C, - 0x0F, 0x00, /* 0xD6 */ - 0x83, 0x89, 0xA1, 0x83, 0x89, 0xA1, 0x80, /* 0xD7 */ - 0x0F, 0xD9, 0x83, 0x18, 0x1C, 0xC1, 0xEC, 0x19, 0xE0, 0x8F, 0x08, 0x78, 0x83, 0xC8, 0x1B, 0x81, 0x98, 0x0C, 0xE0, 0xC8, 0xF8, - 0x00, /* 0xD8 */ - 0x0C, 0x00, 0xC3, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x36, 0x0C, 0x3E, - 0x00, /* 0xD9 */ - 0x06, 0x01, 0x83, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x36, 0x0C, 0x3E, - 0x00, /* 0xDA */ - 0x0E, 0x03, 0x63, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x36, 0x0C, 0x3E, - 0x00, /* 0xDB */ - 0x1B, 0x00, 0x03, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x36, 0x0C, 0x3E, - 0x00, /* 0xDC */ - 0x03, 0x0C, 0x63, 0x60, 0x63, 0x0C, 0x30, 0xC1, 0x98, 0x1D, 0x80, 0xF0, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, - 0x60, /* 0xDD */ - 0xC0, 0x30, 0x0F, 0xF3, 0x06, 0xC0, 0xF0, 0x3C, 0x0F, 0x06, 0xFF, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x00, /* 0xDE */ - 0x3C, 0x33, 0x30, 0xD8, 0x6C, 0x36, 0x33, 0x39, 0x86, 0xC1, 0xE0, 0xF0, 0x78, 0x6D, 0xE0, /* 0xDF */ - 0x60, 0x18, 0x06, 0x0F, 0xCE, 0x36, 0x18, 0x0C, 0x1E, 0x7B, 0x61, 0xB0, 0xD8, 0xE7, 0xB8, /* 0xE0 */ - 0x0C, 0x04, 0x04, 0x0F, 0xCE, 0x36, 0x18, 0x0C, 0x1E, 0x7B, 0x61, 0xB0, 0xD8, 0xE7, 0xB8, /* 0xE1 */ - 0x10, 0x14, 0x1B, 0x0F, 0xCE, 0x36, 0x18, 0x0C, 0x1E, 0x7B, 0x61, 0xB0, 0xD8, 0xE7, 0xB8, /* 0xE2 */ - 0x24, 0x2E, 0x00, 0x0F, 0xCE, 0x36, 0x18, 0x0C, 0x1E, 0x7B, 0x61, 0xB0, 0xD8, 0xE7, 0xB8, /* 0xE3 */ - 0x66, 0x00, 0x1F, 0x9C, 0x6C, 0x30, 0x18, 0x3C, 0xF6, 0xC3, 0x61, 0xB1, 0xCF, 0x70, /* 0xE4 */ - 0x1C, 0x1B, 0x0D, 0x83, 0x87, 0xE7, 0x1B, 0x0C, 0x06, 0x0F, 0x3D, 0xB0, 0xD8, 0x6C, 0x73, 0xDC, /* 0xE5 */ - 0x7E, 0xF9, 0xC7, 0x1B, 0x0C, 0x18, 0x18, 0x33, 0xFF, 0xFC, 0x60, 0x30, 0xC0, 0x61, 0x83, 0xC7, 0x8C, 0xF1, 0xF0, /* 0xE6 */ - 0x3C, 0x66, 0xC3, 0xC0, 0xC0, 0xC0, 0xC0, 0xC3, 0x66, 0x3C, 0x10, 0x1C, 0x0C, 0x38, /* 0xE7 */ - 0x60, 0x30, 0x18, 0x3C, 0x66, 0xC3, 0xC3, 0xFF, 0xC0, 0xC0, 0xC3, 0x66, 0x3C, /* 0xE8 */ - 0x0C, 0x08, 0x18, 0x3C, 0x66, 0xC3, 0xC3, 0xFF, 0xC0, 0xC0, 0xC3, 0x66, 0x3C, /* 0xE9 */ - 0x10, 0x28, 0x6C, 0x3C, 0x66, 0xC3, 0xC3, 0xFF, 0xC0, 0xC0, 0xC3, 0x66, 0x3C, /* 0xEA */ - 0x66, 0x00, 0x3C, 0x66, 0xC3, 0xC3, 0xFF, 0xC0, 0xC0, 0xC3, 0x66, 0x3C, /* 0xEB */ - 0xCC, 0xB6, 0xDB, 0x6D, 0xB6, /* 0xEC */ - 0x7A, 0x6D, 0xB6, 0xDB, 0x6C, /* 0xED */ - 0x6E, 0x96, 0x66, 0x66, 0x66, 0x66, 0x60, /* 0xEE */ - 0xCC, 0x03, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, /* 0xEF */ - 0x34, 0x0C, 0x16, 0x03, 0x3F, 0x67, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x66, 0x3C, /* 0xF0 */ - 0x24, 0x5C, 0x00, 0xDE, 0xE3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, /* 0xF1 */ - 0x30, 0x18, 0x00, 0x3C, 0x66, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x66, 0x3C, /* 0xF2 */ - 0x0C, 0x18, 0x00, 0x3C, 0x66, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x66, 0x3C, /* 0xF3 */ - 0x18, 0x24, 0x00, 0x3C, 0x66, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x66, 0x3C, /* 0xF4 */ - 0x34, 0x2C, 0x00, 0x3C, 0x66, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x66, 0x3C, /* 0xF5 */ - 0x66, 0x00, 0x3C, 0x66, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x66, 0x3C, /* 0xF6 */ - 0x18, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x00, 0x30, /* 0xF7 */ - 0x3D, 0x66, 0xC7, 0xCB, 0xCB, 0xD3, 0xD3, 0xE3, 0x66, 0xBC, /* 0xF8 */ - 0x60, 0x30, 0x18, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC7, 0x7B, /* 0xF9 */ - 0x06, 0x0C, 0x18, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC7, 0x7B, /* 0xFA */ - 0x3C, 0x66, 0x00, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC7, 0x7B, /* 0xFB */ - 0x66, 0x00, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC7, 0x7B, /* 0xFC */ - 0x06, 0x04, 0x08, 0xC1, 0x43, 0x63, 0x62, 0x26, 0x36, 0x34, 0x1C, 0x1C, 0x18, 0x18, 0x18, 0x10, 0x60, /* 0xFD */ - 0xC0, 0x60, 0x30, 0x1B, 0xCE, 0x36, 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x7C, 0x6D, 0xE6, 0x03, 0x01, 0x80, /* 0xFE */ - 0x33, 0x00, 0xC1, 0x43, 0x63, 0x62, 0x26, 0x36, 0x34, 0x1C, 0x1C, 0x18, 0x18, 0x18, 0x10, 0x60, /* 0xFF */ -}; - -const GFXglyph FreeSans9pt_Win1252Glyphs[] PROGMEM = { - /* ' ' 0x20 */ {0, 0, 0, 5, 0, 0}, - /* '!' 0x21 */ {0, 2, 13, 6, 2, -12}, - /* '"' 0x22 */ {4, 5, 4, 6, 1, -12}, - /* '#' 0x23 */ {7, 10, 12, 10, 0, -11}, - /* '$' 0x24 */ {22, 9, 16, 10, 1, -13}, - /* '%' 0x25 */ {40, 16, 13, 16, 1, -12}, - /* '&' 0x26 */ {66, 10, 13, 12, 1, -12}, - /* ''' 0x27 */ {83, 2, 4, 4, 1, -12}, - /* '(' 0x28 */ {84, 4, 17, 6, 1, -12}, - /* ')' 0x29 */ {93, 4, 17, 6, 1, -12}, - /* '*' 0x2A */ {102, 5, 5, 7, 1, -12}, - /* '+' 0x2B */ {106, 6, 8, 11, 3, -7}, - /* ',' 0x2C */ {112, 2, 4, 5, 2, 0}, - /* '-' 0x2D */ {113, 4, 1, 6, 1, -4}, - /* '.' 0x2E */ {114, 2, 1, 5, 1, 0}, - /* '/' 0x2F */ {115, 5, 13, 5, 0, -12}, - /* '0' 0x30 */ {124, 8, 13, 10, 1, -12}, - /* '1' 0x31 */ {137, 4, 13, 10, 3, -12}, - /* '2' 0x32 */ {144, 9, 13, 10, 1, -12}, - /* '3' 0x33 */ {159, 8, 13, 10, 1, -12}, - /* '4' 0x34 */ {172, 7, 13, 10, 2, -12}, - /* '5' 0x35 */ {184, 9, 13, 10, 1, -12}, - /* '6' 0x36 */ {199, 9, 13, 10, 1, -12}, - /* '7' 0x37 */ {214, 8, 13, 10, 0, -12}, - /* '8' 0x38 */ {227, 9, 13, 10, 1, -12}, - /* '9' 0x39 */ {242, 8, 13, 10, 1, -12}, - /* ':' 0x3A */ {255, 2, 10, 5, 1, -9}, - /* ';' 0x3B */ {258, 3, 12, 5, 1, -8}, - /* '<' 0x3C */ {263, 9, 9, 11, 1, -8}, - /* '=' 0x3D */ {274, 9, 4, 11, 1, -5}, - /* '>' 0x3E */ {279, 9, 8, 11, 1, -7}, - /* '?' 0x3F */ {288, 9, 13, 10, 1, -12}, - /* '@' 0x40 */ {303, 17, 16, 18, 1, -12}, - /* 'A' 0x41 */ {337, 12, 13, 12, 0, -12}, - /* 'B' 0x42 */ {357, 11, 13, 12, 1, -12}, - /* 'C' 0x43 */ {375, 11, 13, 13, 1, -12}, - /* 'D' 0x44 */ {393, 11, 13, 13, 1, -12}, - /* 'E' 0x45 */ {411, 9, 13, 11, 1, -12}, - /* 'F' 0x46 */ {426, 8, 13, 11, 1, -12}, - /* 'G' 0x47 */ {439, 12, 13, 14, 1, -12}, - /* 'H' 0x48 */ {459, 11, 13, 13, 1, -12}, - /* 'I' 0x49 */ {477, 2, 13, 5, 2, -12}, - /* 'J' 0x4A */ {481, 7, 13, 10, 1, -12}, - /* 'K' 0x4B */ {493, 10, 13, 12, 1, -12}, - /* 'L' 0x4C */ {510, 8, 13, 10, 1, -12}, - /* 'M' 0x4D */ {523, 13, 13, 15, 1, -12}, - /* 'N' 0x4E */ {545, 11, 13, 13, 1, -12}, - /* 'O' 0x4F */ {563, 13, 13, 14, 1, -12}, - /* 'P' 0x50 */ {585, 10, 13, 12, 1, -12}, - /* 'Q' 0x51 */ {602, 13, 14, 14, 1, -12}, - /* 'R' 0x52 */ {625, 12, 13, 13, 1, -12}, - /* 'S' 0x53 */ {645, 10, 13, 12, 1, -12}, - /* 'T' 0x54 */ {662, 9, 13, 11, 1, -12}, - /* 'U' 0x55 */ {677, 11, 13, 13, 1, -12}, - /* 'V' 0x56 */ {695, 11, 13, 11, 0, -12}, - /* 'W' 0x57 */ {713, 16, 13, 17, 0, -12}, - /* 'X' 0x58 */ {739, 10, 13, 12, 1, -12}, - /* 'Y' 0x59 */ {756, 12, 13, 12, 0, -12}, - /* 'Z' 0x5A */ {776, 10, 13, 11, 1, -12}, - /* '[' 0x5B */ {793, 3, 17, 5, 1, -12}, - /* '\' 0x5C */ {800, 5, 13, 5, 0, -12}, - /* ']' 0x5D */ {809, 3, 17, 5, 0, -12}, - /* '^' 0x5E */ {816, 7, 7, 8, 1, -12}, - /* '_' 0x5F */ {823, 10, 1, 10, 0, 3}, - /* '`' 0x60 */ {825, 4, 3, 5, 0, -12}, - /* 'a' 0x61 */ {827, 9, 10, 10, 1, -9}, - /* 'b' 0x62 */ {839, 9, 13, 10, 1, -12}, - /* 'c' 0x63 */ {854, 8, 10, 9, 1, -9}, - /* 'd' 0x64 */ {864, 8, 13, 10, 1, -12}, - /* 'e' 0x65 */ {877, 8, 10, 10, 1, -9}, - /* 'f' 0x66 */ {887, 4, 13, 5, 1, -12}, - /* 'g' 0x67 */ {894, 8, 14, 10, 1, -9}, - /* 'h' 0x68 */ {908, 8, 13, 10, 1, -12}, - /* 'i' 0x69 */ {921, 2, 13, 4, 1, -12}, - /* 'j' 0x6A */ {925, 4, 17, 4, 0, -12}, - /* 'k' 0x6B */ {934, 8, 13, 9, 1, -12}, - /* 'l' 0x6C */ {947, 2, 13, 4, 1, -12}, - /* 'm' 0x6D */ {951, 13, 10, 15, 1, -9}, - /* 'n' 0x6E */ {968, 8, 10, 10, 1, -9}, - /* 'o' 0x6F */ {978, 8, 10, 10, 1, -9}, - /* 'p' 0x70 */ {988, 9, 13, 10, 1, -9}, - /* 'q' 0x71 */ {1003, 8, 13, 10, 1, -9}, - /* 'r' 0x72 */ {1016, 5, 10, 6, 1, -9}, - /* 's' 0x73 */ {1023, 8, 10, 9, 1, -9}, - /* 't' 0x74 */ {1033, 4, 12, 5, 1, -11}, - /* 'u' 0x75 */ {1039, 8, 10, 10, 1, -9}, - /* 'v' 0x76 */ {1049, 9, 10, 9, 0, -9}, - /* 'w' 0x77 */ {1061, 13, 10, 13, 0, -9}, - /* 'x' 0x78 */ {1078, 7, 10, 9, 1, -9}, - /* 'y' 0x79 */ {1087, 8, 14, 9, 0, -9}, - /* 'z' 0x7A */ {1101, 7, 10, 9, 1, -9}, - /* '{' 0x7B */ {1110, 4, 17, 6, 1, -12}, - /* '|' 0x7C */ {1119, 2, 17, 4, 2, -12}, - /* '}' 0x7D */ {1124, 4, 17, 6, 1, -12}, - /* '~' 0x7E */ {1133, 7, 3, 9, 1, -7}, - /* 0x7F */ {1136, 13, 14, 15, 1, -12}, - /* 0x80 */ {1159, 10, 13, 12, 1, -12}, - /* 0x81 */ {1176, 0, 0, 8, 0, 0}, - /* 0x82 */ {1176, 2, 3, 5, 1, 0}, - /* 0x83 */ {1177, 5, 17, 5, 0, -12}, - /* 0x84 */ {1188, 5, 3, 7, 1, 0}, - /* 0x85 */ {1190, 10, 1, 12, 1, 0}, - /* 0x86 */ {1192, 8, 16, 10, 1, -12}, - /* 0x87 */ {1208, 8, 16, 10, 1, -12}, - /* 0x88 */ {1224, 5, 3, 6, 0, -12}, - /* 0x89 */ {1226, 18, 13, 18, 0, -12}, - /* 0x8A */ {1256, 10, 16, 12, 1, -15}, - /* 0x8B */ {1276, 2, 4, 4, 1, -6}, - /* 0x8C */ {1277, 15, 13, 18, 1, -12}, - /* 0x8D */ {1302, 0, 0, 8, 0, 0}, - /* 0x8E */ {1302, 10, 16, 11, 1, -15}, - /* 0x8F */ {1322, 0, 0, 8, 0, 0}, - /* 0x90 */ {1322, 0, 0, 8, 0, 0}, - /* 0x91 */ {1322, 2, 4, 4, 2, -12}, - /* 0x92 */ {1323, 2, 4, 4, 1, -12}, - /* 0x93 */ {1324, 5, 4, 7, 2, -12}, - /* 0x94 */ {1327, 5, 4, 7, 1, -12}, - /* 0x95 */ {1330, 4, 5, 7, 1, -8}, - /* 0x96 */ {1333, 7, 1, 9, 1, -4}, - /* 0x97 */ {1334, 16, 1, 18, 1, -4}, - /* 0x98 */ {1336, 5, 2, 6, 0, -12}, - /* 0x99 */ {1338, 18, 10, 18, 1, -13}, - /* 0x9A */ {1361, 8, 13, 9, 1, -12}, - /* 0x9B */ {1374, 2, 4, 5, 2, -6}, - /* 0x9C */ {1375, 15, 10, 17, 1, -9}, - /* 0x9D */ {1394, 0, 0, 8, 0, 0}, - /* 0x9E */ {1394, 7, 13, 9, 1, -12}, - /* 0x9F */ {1406, 12, 14, 12, 0, -13}, - /* 0xA0 */ {1427, 0, 0, 5, 0, 0}, - /* 0xA1 */ {1427, 2, 13, 6, 2, -8}, - /* 0xA2 */ {1431, 9, 14, 10, 1, -11}, - /* 0xA3 */ {1447, 10, 13, 10, 0, -12}, - /* 0xA4 */ {1464, 7, 6, 10, 2, -8}, - /* 0xA5 */ {1470, 8, 13, 10, 1, -12}, - /* 0xA6 */ {1483, 2, 17, 5, 2, -12}, - /* 0xA7 */ {1488, 9, 17, 10, 1, -12}, - /* 0xA8 */ {1508, 6, 1, 6, 0, -11}, - /* 0xA9 */ {1509, 14, 13, 14, 1, -12}, - /* 0xAA */ {1532, 5, 8, 7, 1, -12}, - /* 0xAB */ {1537, 7, 6, 9, 1, -7}, - /* 0xAC */ {1543, 9, 5, 11, 2, -5}, - /* 0xAD */ {1549, 0, 0, 0, 0, 0}, - /* 0xAE */ {1549, 14, 13, 14, 1, -12}, - /* 0xAF */ {1572, 5, 1, 6, 0, -12}, - /* 0xB0 */ {1573, 5, 5, 11, 3, -11}, - /* 0xB1 */ {1577, 9, 11, 11, 1, -10}, - /* 0xB2 */ {1590, 6, 8, 6, 1, -13}, - /* 0xB3 */ {1596, 7, 8, 6, 0, -13}, - /* 0xB4 */ {1603, 4, 3, 6, 2, -12}, - /* 0xB5 */ {1605, 9, 13, 10, 1, -9}, - /* 0xB6 */ {1620, 8, 16, 10, 2, -12}, - /* 0xB7 */ {1636, 3, 1, 5, 1, -4}, - /* 0xB8 */ {1637, 5, 4, 6, 1, 1}, - /* 0xB9 */ {1640, 3, 7, 6, 2, -13}, - /* 0xBA */ {1643, 5, 8, 7, 1, -12}, - /* 0xBB */ {1648, 7, 6, 9, 1, -7}, - /* 0xBC */ {1654, 14, 13, 16, 2, -12}, - /* 0xBD */ {1677, 14, 13, 16, 2, -12}, - /* 0xBE */ {1700, 15, 13, 16, 1, -12}, - /* 0xBF */ {1725, 9, 13, 10, 1, -8}, - /* 0xC0 */ {1740, 10, 14, 12, 1, -13}, - /* 0xC1 */ {1758, 10, 14, 12, 1, -13}, - /* 0xC2 */ {1776, 10, 14, 12, 1, -13}, - /* 0xC3 */ {1794, 10, 14, 12, 1, -13}, - /* 0xC4 */ {1812, 10, 14, 12, 1, -13}, - /* 0xC5 */ {1830, 10, 14, 12, 1, -13}, - /* 0xC6 */ {1848, 16, 13, 18, 1, -12}, - /* 0xC7 */ {1874, 11, 17, 13, 1, -12}, - /* 0xC8 */ {1898, 9, 14, 11, 1, -13}, - /* 0xC9 */ {1914, 9, 14, 11, 1, -13}, - /* 0xCA */ {1930, 9, 14, 11, 1, -13}, - /* 0xCB */ {1946, 9, 14, 11, 1, -13}, - /* 0xCC */ {1962, 3, 15, 5, 1, -13}, - /* 0xCD */ {1968, 3, 14, 5, 1, -13}, - /* 0xCE */ {1974, 5, 14, 5, 0, -13}, - /* 0xCF */ {1983, 6, 14, 5, 0, -13}, - /* 0xD0 */ {1994, 11, 13, 13, 1, -12}, - /* 0xD1 */ {2012, 11, 14, 13, 1, -13}, - /* 0xD2 */ {2032, 12, 15, 13, 1, -14}, - /* 0xD3 */ {2055, 12, 15, 13, 1, -14}, - /* 0xD4 */ {2078, 12, 15, 13, 1, -14}, - /* 0xD5 */ {2101, 12, 15, 13, 1, -14}, - /* 0xD6 */ {2124, 12, 15, 13, 1, -14}, - /* 0xD7 */ {2147, 7, 7, 11, 2, -7}, - /* 0xD8 */ {2154, 13, 13, 14, 1, -12}, - /* 0xD9 */ {2176, 11, 14, 13, 1, -13}, - /* 0xDA */ {2196, 11, 14, 13, 1, -13}, - /* 0xDB */ {2216, 11, 14, 13, 1, -13}, - /* 0xDC */ {2236, 11, 14, 13, 1, -13}, - /* 0xDD */ {2256, 12, 14, 12, 0, -13}, - /* 0xDE */ {2277, 10, 13, 12, 1, -12}, - /* 0xDF */ {2294, 9, 13, 11, 1, -12}, - /* 0xE0 */ {2309, 9, 13, 10, 1, -12}, - /* 0xE1 */ {2324, 9, 13, 10, 1, -12}, - /* 0xE2 */ {2339, 9, 13, 10, 1, -12}, - /* 0xE3 */ {2354, 9, 13, 10, 1, -12}, - /* 0xE4 */ {2369, 9, 12, 10, 1, -11}, - /* 0xE5 */ {2383, 9, 14, 10, 1, -13}, - /* 0xE6 */ {2399, 15, 10, 16, 1, -9}, - /* 0xE7 */ {2418, 8, 14, 9, 1, -9}, - /* 0xE8 */ {2432, 8, 13, 10, 1, -12}, - /* 0xE9 */ {2445, 8, 13, 10, 1, -12}, - /* 0xEA */ {2458, 8, 13, 10, 1, -12}, - /* 0xEB */ {2471, 8, 12, 10, 1, -11}, - /* 0xEC */ {2483, 3, 13, 4, 0, -12}, - /* 0xED */ {2488, 3, 13, 4, 1, -12}, - /* 0xEE */ {2493, 4, 13, 5, 0, -12}, - /* 0xEF */ {2500, 6, 12, 5, -1, -11}, - /* 0xF0 */ {2509, 8, 13, 10, 1, -12}, - /* 0xF1 */ {2522, 8, 13, 10, 1, -12}, - /* 0xF2 */ {2535, 8, 13, 10, 1, -12}, - /* 0xF3 */ {2548, 8, 13, 10, 1, -12}, - /* 0xF4 */ {2561, 8, 13, 10, 1, -12}, - /* 0xF5 */ {2574, 8, 13, 10, 1, -12}, - /* 0xF6 */ {2587, 8, 12, 10, 1, -11}, - /* 0xF7 */ {2599, 9, 8, 11, 1, -7}, - /* 0xF8 */ {2608, 8, 10, 10, 1, -9}, - /* 0xF9 */ {2618, 8, 13, 10, 1, -12}, - /* 0xFA */ {2631, 8, 13, 10, 1, -12}, - /* 0xFB */ {2644, 8, 13, 10, 1, -12}, - /* 0xFC */ {2657, 8, 12, 10, 1, -11}, - /* 0xFD */ {2669, 8, 17, 9, 0, -12}, - /* 0xFE */ {2686, 9, 16, 10, 1, -12}, - /* 0xFF */ {2704, 8, 16, 9, 0, -11}, -}; - -const GFXfont FreeSans9pt_Win1252 PROGMEM = {(uint8_t *)FreeSans9pt_Win1252Bitmaps, (GFXglyph *)FreeSans9pt_Win1252Glyphs, 0x20, - 0xFF, 21}; diff --git a/src/graphics/niche/InkHUD/Applet.cpp b/src/graphics/niche/InkHUD/Applet.cpp index f63bd4bbeb..6c6245ec31 100644 --- a/src/graphics/niche/InkHUD/Applet.cpp +++ b/src/graphics/niche/InkHUD/Applet.cpp @@ -263,10 +263,22 @@ uint16_t InkHUD::Applet::Y(float f) // Print text, specifying the position of any edge / corner of the textbox void InkHUD::Applet::printAt(int16_t x, int16_t y, const char *text, HorizontalAlignment ha, VerticalAlignment va) { + printAt(x, y, std::string(text), ha, va); +} + +// Print text, specifying the position of any edge / corner of the textbox +void InkHUD::Applet::printAt(int16_t x, int16_t y, std::string text, HorizontalAlignment ha, VerticalAlignment va) +{ + // Custom font + // - set with AppletFont::addSubstitution + // - find certain UTF8 chars + // - replace with glyph from custom font (or suitable ASCII addSubstitution?) + getFont().applySubstitutions(&text); + // We do still have to run getTextBounds to find the width int16_t textOffsetX, textOffsetY; uint16_t textWidth, textHeight; - getTextBounds(text, 0, 0, &textOffsetX, &textOffsetY, &textWidth, &textHeight); + getTextBounds(text.c_str(), 0, 0, &textOffsetX, &textOffsetY, &textWidth, &textHeight); int16_t cursorX = 0; int16_t cursorY = 0; @@ -298,13 +310,7 @@ void InkHUD::Applet::printAt(int16_t x, int16_t y, const char *text, HorizontalA } setCursor(cursorX, cursorY); - print(text); -} - -// Print text, specifying the position of any edge / corner of the textbox -void InkHUD::Applet::printAt(int16_t x, int16_t y, std::string text, HorizontalAlignment ha, VerticalAlignment va) -{ - printAt(x, y, text.c_str(), ha, va); + print(text.c_str()); } // Set which font should be used for subsequent drawing @@ -322,52 +328,11 @@ InkHUD::AppletFont InkHUD::Applet::getFont() return currentFont; } -// Parse any text which might have "special characters" -// Re-encodes UTF-8 characters to match our 8-bit encoded fonts -std::string InkHUD::Applet::parse(std::string text) -{ - return getFont().decodeUTF8(text); -} - -// Get the best version of a node's short name available to us -// Parses any non-ascii chars -// Swaps for last-four of node-id if the real short name is unknown or can't be rendered (emoji) -std::string InkHUD::Applet::parseShortName(meshtastic_NodeInfoLite *node) -{ - assert(node); - - // Use the true shortname if known, and doesn't contain any unprintable characters (emoji, etc.) - if (node->has_user) { - std::string parsed = parse(node->user.short_name); - if (isPrintable(parsed)) - return parsed; - } - - // Otherwise, use the "last 4" of node id - // - if short name unknown, or - // - if short name is emoji (we can't render this) - std::string nodeID = hexifyNodeNum(node->num); - return nodeID.substr(nodeID.length() - 4); -} - -// Determine if all characters of a string are printable using the current font -bool InkHUD::Applet::isPrintable(std::string text) -{ - // Scan for DEL (0x7F), which is the value assigned by AppletFont::applyEncoding if a unicode character is not handled - // Todo: move this to from DEL to SUB, once the fonts have been changed for this - for (char &c : text) { - if (c == '\x7F') - return false; - } - - // No unprintable characters found - return true; -} - // Gets rendered width of a string // Wrapper for getTextBounds uint16_t InkHUD::Applet::getTextWidth(const char *text) { + // We do still have to run getTextBounds to find the width int16_t textOffsetX, textOffsetY; uint16_t textWidth, textHeight; @@ -380,6 +345,8 @@ uint16_t InkHUD::Applet::getTextWidth(const char *text) // Wrapper for getTextBounds uint16_t InkHUD::Applet::getTextWidth(std::string text) { + getFont().applySubstitutions(&text); + return getTextWidth(text.c_str()); } @@ -428,6 +395,12 @@ std::string InkHUD::Applet::hexifyNodeNum(NodeNum num) // Avoids splitting words in half, instead moving the entire word to a new line wherever possible void InkHUD::Applet::printWrapped(int16_t left, int16_t top, uint16_t width, std::string text) { + // Custom font glyphs + // - set with AppletFont::addSubstitution + // - find certain UTF8 chars + // - replace with glyph from custom font (or suitable ASCII addSubstitution?) + getFont().applySubstitutions(&text); + // Place the AdafruitGFX cursor to suit our "top" coord setCursor(left, top + getFont().heightAboveCursor()); diff --git a/src/graphics/niche/InkHUD/Applet.h b/src/graphics/niche/InkHUD/Applet.h index c6a8a8aade..8f4466647a 100644 --- a/src/graphics/niche/InkHUD/Applet.h +++ b/src/graphics/niche/InkHUD/Applet.h @@ -133,15 +133,12 @@ class Applet : public GFX void drawLogo(int16_t centerX, int16_t centerY, uint16_t width, uint16_t height, Color color = BLACK); // Draw the Meshtastic logo - std::string hexifyNodeNum(NodeNum num); // Style as !0123abdc - SignalStrength getSignalStrength(float snr, float rssi); // Interpret SNR and RSSI, as an easy to understand value - std::string getTimeString(uint32_t epochSeconds); // Human readable - std::string getTimeString(); // Current time, human readable - uint16_t getActiveNodeCount(); // Duration determined by user, in onscreen menu - std::string localizeDistance(uint32_t meters); // Human readable distance, imperial or metric - std::string parse(std::string text); // Handle text which might contain special chars - std::string parseShortName(meshtastic_NodeInfoLite *node); // Get the shortname, or a substitute if has unprintable chars - bool isPrintable(std::string); // Check for characters which the font can't print + std::string hexifyNodeNum(NodeNum num); // Style as !0123abdc + SignalStrength getSignalStrength(float snr, float rssi); // Interpret SNR and RSSI, as an easy to understand value + std::string getTimeString(uint32_t epochSeconds); // Human readable + std::string getTimeString(); // Current time, human readable + uint16_t getActiveNodeCount(); // Duration determined by user, in onscreen menu + std::string localizeDistance(uint32_t meters); // Human readable distance, imperial or metric // Convenient references diff --git a/src/graphics/niche/InkHUD/AppletFont.cpp b/src/graphics/niche/InkHUD/AppletFont.cpp index 88fb4054b4..25597c9b90 100644 --- a/src/graphics/niche/InkHUD/AppletFont.cpp +++ b/src/graphics/niche/InkHUD/AppletFont.cpp @@ -2,17 +2,14 @@ #include "./AppletFont.h" -#include - using namespace NicheGraphics; InkHUD::AppletFont::AppletFont() { - // Default constructor uses the in-built AdafruitGFX font (not recommended) + // Default constructor uses the in-built AdafruitGFX font } -InkHUD::AppletFont::AppletFont(const GFXfont &adafruitGFXFont, Encoding encoding, int8_t paddingTop, int8_t paddingBottom) - : gfxFont(&adafruitGFXFont), encoding(encoding) +InkHUD::AppletFont::AppletFont(const GFXfont &adafruitGFXFont) : gfxFont(&adafruitGFXFont) { // AdafruitGFX fonts are drawn relative to a "cursor line"; // they print as if the glyphs are resting on the line of piece of ruled paper. @@ -25,10 +22,6 @@ InkHUD::AppletFont::AppletFont(const GFXfont &adafruitGFXFont, Encoding encoding // AdafruitGFX fonts do declare a line-height, but this seems to include a certain amount of padding, // which we'd rather not deal with. If we want padding, we'll add it manually. - this->ascenderHeight = 0; - this->descenderHeight = 0; - this->height = 0; - // Scan each glyph in the AdafruitGFX font for (uint16_t i = 0; i <= (gfxFont->last - gfxFont->first); i++) { uint8_t glyphHeight = gfxFont->glyph[i].height; // Height of glyph @@ -40,16 +33,10 @@ InkHUD::AppletFont::AppletFont(const GFXfont &adafruitGFXFont, Encoding encoding int8_t glyphAscender = 0 - gfxFont->glyph[i].yOffset; if (glyphAscender > 0) this->ascenderHeight = max(this->ascenderHeight, (uint8_t)glyphAscender); - - int8_t glyphDescender = gfxFont->glyph[i].height + gfxFont->glyph[i].yOffset; - if (glyphDescender > 0) - this->descenderHeight = max(this->descenderHeight, (uint8_t)glyphDescender); } - // Apply any manual padding to grow or shrink the line size - // Helpful if a font has one or two exceptionally large characters, which would make the lines ridiculously tall - ascenderHeight += paddingTop; - descenderHeight += paddingBottom; + // Determine how far characters may hang "below the line" + descenderHeight = height - ascenderHeight; // Find how far the cursor advances when we "print" a space character spaceCharWidth = gfxFont->glyph[(uint8_t)' ' - gfxFont->first].xAdvance; @@ -96,533 +83,139 @@ uint8_t InkHUD::AppletFont::widthBetweenWords() return this->spaceCharWidth; } -// Convert a unicode char from set of UTF-8 bytes to UTF-32 -// Used by AppletFont::applyEncoding, which remaps unicode chars for extended ASCII fonts, based on their UTF-32 value -uint32_t InkHUD::AppletFont::toUtf32(std::string utf8) +// Add to the list of substituted glyphs +// This "find and replace" operation will be run before text is printed +// Used to swap out UTF8 special characters, either with a custom font, or with a suitable ASCII approximation +void InkHUD::AppletFont::addSubstitution(const char *from, const char *to) { - uint32_t utf32 = 0; - - switch (utf8.length()) { - case 2: - // 5 bits + 6 bits - utf32 |= (utf8.at(0) & 0b00011111) << 6; - utf32 |= (utf8.at(1) & 0b00111111); - break; - - case 3: - // 4 bits + 6 bits + 6 bits - utf32 |= (utf8.at(0) & 0b00001111) << (6 + 6); - utf32 |= (utf8.at(1) & 0b00111111) << 6; - utf32 |= (utf8.at(2) & 0b00111111); - break; - - case 4: - // 3 bits + 6 bits + 6 bits + 6 bits - utf32 |= (utf8.at(0) & 0b00000111) << (6 + 6 + 6); - utf32 |= (utf8.at(1) & 0b00111111) << (6 + 6); - utf32 |= (utf8.at(2) & 0b00111111) << 6; - utf32 |= (utf8.at(3) & 0b00111111); - break; - default: - assert(false); - } - - return utf32; + substitutions.push_back({.from = from, .to = to}); } -// Process a string, collating UTF-8 bytes, and sending them off for re-encoding to extended ASCII -// Not all InkHUD text is passed through here, only text which could potentially contain non-ASCII chars -std::string InkHUD::AppletFont::decodeUTF8(std::string encoded) +// Run all registered substitutions on a string +// Used to swap out UTF8 special chars +void InkHUD::AppletFont::applySubstitutions(std::string *text) { - // Final processed output - std::string decoded; - - // Holds bytes for one UTF-8 char during parsing - std::string utf8Char; - uint8_t utf8CharSize = 0; - - for (char &c : encoded) { - - // If first byte - if (utf8Char.empty()) { - // If MSB is unset, byte is an ASCII char - // If MSB is set, byte is part of a UTF-8 char. Counting number of higher-order bits tells how many bytes in char - if ((c & 0x80)) { - char c1 = c; - while (c1 & 0x80) { - c1 <<= 1; - utf8CharSize++; - } - } + // For each substitution + for (Substitution s : substitutions) { + + // Find and replace + // - search for Substitution::from + // - replace with Substitution::to + size_t i = text->find(s.from); + while (i != std::string::npos) { + text->replace(i, strlen(s.from), s.to); + i = text->find(s.from, i); // Continue looking from last position } - - // Append the byte to the UTF-8 char we're building - utf8Char += c; - - // More bytes left to collect. Iterate. - if (utf8Char.length() < utf8CharSize) - continue; - - // Now collected all bytes for this char - // Remap the value to match the encoding of our 8-bit AppletFont - decoded += applyEncoding(utf8Char); - - // Reset, ready to build next UTF-8 char from the encoded bytes - utf8Char.clear(); - utf8CharSize = 0; - } // For each char - - // All chars processed, return result - return decoded; + } } -// Re-encode a single UTF-8 character to extended ASCII -// Target encoding depends on the font -char InkHUD::AppletFont::applyEncoding(std::string utf8) +// Apply a set of substitutions which remap UTF8 for a Windows-1251 font +// Windows-1251 is an 8-bit character encoding, suitable for several languages which use the Cyrillic script +void InkHUD::AppletFont::addSubstitutionsWin1251() { - // ##################################################### Syntactic Sugar ##################################################### -#define REMAP(in, out) \ - case in: \ - return out; - // ########################################################################################################################### - - // Latin - Central Europe - // https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1250.TXT - if (encoding == WINDOWS_1250) { - // 1-Byte chars: no remapping - if (utf8.length() == 1) - return utf8.at(0); - - // Multi-byte chars: - switch (toUtf32(utf8)) { - REMAP(0x20AC, 0x80); // EURO SIGN - REMAP(0x201A, 0x82); // SINGLE LOW-9 QUOTATION MARK - REMAP(0x201E, 0x84); // DOUBLE LOW-9 QUOTATION MARK - REMAP(0x2026, 0x85); // HORIZONTAL ELLIPSIS - REMAP(0x2020, 0x86); // DAGGER - REMAP(0x2021, 0x87); // DOUBLE DAGGER - REMAP(0x2030, 0x89); // PER MILLE SIGN - REMAP(0x0160, 0x8A); // LATIN CAPITAL LETTER S WITH CARON - REMAP(0x2039, 0x8B); // SINGLE LEFT-POINTING ANGLE QUOTATION MARK - REMAP(0x015A, 0x8C); // LATIN CAPITAL LETTER S WITH ACUTE - REMAP(0x0164, 0x8D); // LATIN CAPITAL LETTER T WITH CARON - REMAP(0x017D, 0x8E); // LATIN CAPITAL LETTER Z WITH CARON - REMAP(0x0179, 0x8F); // LATIN CAPITAL LETTER Z WITH ACUTE - - REMAP(0x2018, 0x91); // LEFT SINGLE QUOTATION MARK - REMAP(0x2019, 0x92); // RIGHT SINGLE QUOTATION MARK - REMAP(0x201C, 0x93); // LEFT DOUBLE QUOTATION MARK - REMAP(0x201D, 0x94); // RIGHT DOUBLE QUOTATION MARK - REMAP(0x2022, 0x95); // BULLET - REMAP(0x2013, 0x96); // EN DASH - REMAP(0x2014, 0x97); // EM DASH - REMAP(0x2122, 0x99); // TRADE MARK SIGN - REMAP(0x0161, 0x9A); // LATIN SMALL LETTER S WITH CARON - REMAP(0x203A, 0x9B); // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK - REMAP(0x015B, 0x9C); // LATIN SMALL LETTER S WITH ACUTE - REMAP(0x0165, 0x9D); // LATIN SMALL LETTER T WITH CARON - REMAP(0x017E, 0x9E); // LATIN SMALL LETTER Z WITH CARON - REMAP(0x017A, 0x9F); // LATIN SMALL LETTER Z WITH ACUTE - - REMAP(0x00A0, 0xA0); // NO-BREAK SPACE - REMAP(0x02C7, 0xA1); // CARON - REMAP(0x02D8, 0xA2); // BREVE - REMAP(0x0141, 0xA3); // LATIN CAPITAL LETTER L WITH STROKE - REMAP(0x00A4, 0xA4); // CURRENCY SIGN - REMAP(0x0104, 0xA5); // LATIN CAPITAL LETTER A WITH OGONEK - REMAP(0x00A6, 0xA6); // BROKEN BAR - REMAP(0x00A7, 0xA7); // SECTION SIGN - REMAP(0x00A8, 0xA8); // DIAERESIS - REMAP(0x00A9, 0xA9); // COPYRIGHT SIGN - REMAP(0x015E, 0xAA); // LATIN CAPITAL LETTER S WITH CEDILLA - REMAP(0x00AB, 0xAB); // LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - REMAP(0x00AC, 0xAC); // NOT SIGN - REMAP(0x00AD, 0xAD); // SOFT HYPHEN - REMAP(0x00AE, 0xAE); // REGISTERED SIGN - REMAP(0x017B, 0xAF); // LATIN CAPITAL LETTER Z WITH DOT ABOVE - - REMAP(0x00B0, 0xB0); // DEGREE SIGN - REMAP(0x00B1, 0xB1); // PLUS-MINUS SIGN - REMAP(0x02DB, 0xB2); // OGONEK - REMAP(0x0142, 0xB3); // LATIN SMALL LETTER L WITH STROKE - REMAP(0x00B4, 0xB4); // ACUTE ACCENT - REMAP(0x00B5, 0xB5); // MICRO SIGN - REMAP(0x00B6, 0xB6); // PILCROW SIGN - REMAP(0x00B7, 0xB7); // MIDDLE DOT - REMAP(0x00B8, 0xB8); // CEDILLA - REMAP(0x0105, 0xB9); // LATIN SMALL LETTER A WITH OGONEK - REMAP(0x015F, 0xBA); // LATIN SMALL LETTER S WITH CEDILLA - REMAP(0x00BB, 0xBB); // RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - REMAP(0x013D, 0xBC); // LATIN CAPITAL LETTER L WITH CARON - REMAP(0x02DD, 0xBD); // DOUBLE ACUTE ACCENT - REMAP(0x013E, 0xBE); // LATIN SMALL LETTER L WITH CARON - REMAP(0x017C, 0xBF); // LATIN SMALL LETTER Z WITH DOT ABOVE - - REMAP(0x0154, 0xC0); // LATIN CAPITAL LETTER R WITH ACUTE - REMAP(0x00C1, 0xC1); // LATIN CAPITAL LETTER A WITH ACUTE - REMAP(0x00C2, 0xC2); // LATIN CAPITAL LETTER A WITH CIRCUMFLEX - REMAP(0x0102, 0xC3); // LATIN CAPITAL LETTER A WITH BREVE - REMAP(0x00C4, 0xC4); // LATIN CAPITAL LETTER A WITH DIAERESIS - REMAP(0x0139, 0xC5); // LATIN CAPITAL LETTER L WITH ACUTE - REMAP(0x0106, 0xC6); // LATIN CAPITAL LETTER C WITH ACUTE - REMAP(0x00C7, 0xC7); // LATIN CAPITAL LETTER C WITH CEDILLA - REMAP(0x010C, 0xC8); // LATIN CAPITAL LETTER C WITH CARON - REMAP(0x00C9, 0xC9); // LATIN CAPITAL LETTER E WITH ACUTE - REMAP(0x0118, 0xCA); // LATIN CAPITAL LETTER E WITH OGONEK - REMAP(0x00CB, 0xCB); // LATIN CAPITAL LETTER E WITH DIAERESIS - REMAP(0x011A, 0xCC); // LATIN CAPITAL LETTER E WITH CARON - REMAP(0x00CD, 0xCD); // LATIN CAPITAL LETTER I WITH ACUTE - REMAP(0x00CE, 0xCE); // LATIN CAPITAL LETTER I WITH CIRCUMFLEX - REMAP(0x010E, 0xCF); // LATIN CAPITAL LETTER D WITH CARON - - REMAP(0x0110, 0xD0); // LATIN CAPITAL LETTER D WITH STROKE - REMAP(0x0143, 0xD1); // LATIN CAPITAL LETTER N WITH ACUTE - REMAP(0x0147, 0xD2); // LATIN CAPITAL LETTER N WITH CARON - REMAP(0x00D3, 0xD3); // LATIN CAPITAL LETTER O WITH ACUTE - REMAP(0x00D4, 0xD4); // LATIN CAPITAL LETTER O WITH CIRCUMFLEX - REMAP(0x0150, 0xD5); // LATIN CAPITAL LETTER O WITH DOUBLE ACUTE - REMAP(0x00D6, 0xD6); // LATIN CAPITAL LETTER O WITH DIAERESIS - REMAP(0x00D7, 0xD7); // MULTIPLICATION SIGN - REMAP(0x0158, 0xD8); // LATIN CAPITAL LETTER R WITH CARON - REMAP(0x016E, 0xD9); // LATIN CAPITAL LETTER U WITH RING ABOVE - REMAP(0x00DA, 0xDA); // LATIN CAPITAL LETTER U WITH ACUTE - REMAP(0x0170, 0xDB); // LATIN CAPITAL LETTER U WITH DOUBLE ACUTE - REMAP(0x00DC, 0xDC); // LATIN CAPITAL LETTER U WITH DIAERESIS - REMAP(0x00DD, 0xDD); // LATIN CAPITAL LETTER Y WITH ACUTE - REMAP(0x0162, 0xDE); // LATIN CAPITAL LETTER T WITH CEDILLA - REMAP(0x00DF, 0xDF); // LATIN SMALL LETTER SHARP S - - REMAP(0x0155, 0xE0); // LATIN SMALL LETTER R WITH ACUTE - REMAP(0x00E1, 0xE1); // LATIN SMALL LETTER A WITH ACUTE - REMAP(0x00E2, 0xE2); // LATIN SMALL LETTER A WITH CIRCUMFLEX - REMAP(0x0103, 0xE3); // LATIN SMALL LETTER A WITH BREVE - REMAP(0x00E4, 0xE4); // LATIN SMALL LETTER A WITH DIAERESIS - REMAP(0x013A, 0xE5); // LATIN SMALL LETTER L WITH ACUTE - REMAP(0x0107, 0xE6); // LATIN SMALL LETTER C WITH ACUTE - REMAP(0x00E7, 0xE7); // LATIN SMALL LETTER C WITH CEDILLA - REMAP(0x010D, 0xE8); // LATIN SMALL LETTER C WITH CARON - REMAP(0x00E9, 0xE9); // LATIN SMALL LETTER E WITH ACUTE - REMAP(0x0119, 0xEA); // LATIN SMALL LETTER E WITH OGONEK - REMAP(0x00EB, 0xEB); // LATIN SMALL LETTER E WITH DIAERESIS - REMAP(0x011B, 0xEC); // LATIN SMALL LETTER E WITH CARON - REMAP(0x00ED, 0xED); // LATIN SMALL LETTER I WITH ACUTE - REMAP(0x00EE, 0xEE); // LATIN SMALL LETTER I WITH CIRCUMFLEX - REMAP(0x010F, 0xEF); // LATIN SMALL LETTER D WITH CARON - - REMAP(0x0111, 0xF0); // LATIN SMALL LETTER D WITH STROKE - REMAP(0x0144, 0xF1); // LATIN SMALL LETTER N WITH ACUTE - REMAP(0x0148, 0xF2); // LATIN SMALL LETTER N WITH CARON - REMAP(0x00F3, 0xF3); // LATIN SMALL LETTER O WITH ACUTE - REMAP(0x00F4, 0xF4); // LATIN SMALL LETTER O WITH CIRCUMFLEX - REMAP(0x0151, 0xF5); // LATIN SMALL LETTER O WITH DOUBLE ACUTE - REMAP(0x00F6, 0xF6); // LATIN SMALL LETTER O WITH DIAERESIS - REMAP(0x00F7, 0xF7); // DIVISION SIGN - REMAP(0x0159, 0xF8); // LATIN SMALL LETTER R WITH CARON - REMAP(0x016F, 0xF9); // LATIN SMALL LETTER U WITH RING ABOVE - REMAP(0x00FA, 0xFA); // LATIN SMALL LETTER U WITH ACUTE - REMAP(0x0171, 0xFB); // LATIN SMALL LETTER U WITH DOUBLE ACUTE - REMAP(0x00FC, 0xFC); // LATIN SMALL LETTER U WITH DIAERESIS - REMAP(0x00FD, 0xFD); // LATIN SMALL LETTER Y WITH ACUTE - REMAP(0x0163, 0xFE); // LATIN SMALL LETTER T WITH CEDILLA - REMAP(0x02D9, 0xFF); // DOT ABOVE - } - } - - // Latin - Cyrillic - // https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1251.TXT - else if (encoding == WINDOWS_1251) { - // 1-Byte chars: no remapping - if (utf8.length() == 1) - return utf8.at(0); - - // Multi-byte chars: - switch (toUtf32(utf8)) { - REMAP(0x0402, 0x80); // CYRILLIC CAPITAL LETTER DJE - REMAP(0x0403, 0x81); // CYRILLIC CAPITAL LETTER GJE - REMAP(0x201A, 0x82); // SINGLE LOW-9 QUOTATION MARK - REMAP(0x0453, 0x83); // CYRILLIC SMALL LETTER GJE - REMAP(0x201E, 0x84); // DOUBLE LOW-9 QUOTATION MARK - REMAP(0x2026, 0x85); // HORIZONTAL ELLIPSIS - REMAP(0x2020, 0x86); // DAGGER - REMAP(0x2021, 0x87); // DOUBLE DAGGER - REMAP(0x20AC, 0x88); // EURO SIGN - REMAP(0x2030, 0x89); // PER MILLE SIGN - REMAP(0x0409, 0x8A); // CYRILLIC CAPITAL LETTER LJE - REMAP(0x2039, 0x8B); // SINGLE LEFT-POINTING ANGLE QUOTATION MARK - REMAP(0x040A, 0x8C); // CYRILLIC CAPITAL LETTER NJE - REMAP(0x040C, 0x8D); // CYRILLIC CAPITAL LETTER KJE - REMAP(0x040B, 0x8E); // CYRILLIC CAPITAL LETTER TSHE - REMAP(0x040F, 0x8F); // CYRILLIC CAPITAL LETTER DZHE - - REMAP(0x0452, 0x90); // CYRILLIC SMALL LETTER DJE - REMAP(0x2018, 0x91); // LEFT SINGLE QUOTATION MARK - REMAP(0x2019, 0x92); // RIGHT SINGLE QUOTATION MARK - REMAP(0x201C, 0x93); // LEFT DOUBLE QUOTATION MARK - REMAP(0x201D, 0x94); // RIGHT DOUBLE QUOTATION MARK - REMAP(0x2022, 0x95); // BULLET - REMAP(0x2013, 0x96); // EN DASH - REMAP(0x2014, 0x97); // EM DASH - REMAP(0x2122, 0x99); // TRADE MARK SIGN - REMAP(0x0459, 0x9A); // CYRILLIC SMALL LETTER LJE - REMAP(0x203A, 0x9B); // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK - REMAP(0x045A, 0x9C); // CYRILLIC SMALL LETTER NJE - REMAP(0x045C, 0x9D); // CYRILLIC SMALL LETTER KJE - REMAP(0x045B, 0x9E); // CYRILLIC SMALL LETTER TSHE - REMAP(0x045F, 0x9F); // CYRILLIC SMALL LETTER DZHE - - REMAP(0x00A0, 0xA0); // NO-BREAK SPACE - REMAP(0x040E, 0xA1); // CYRILLIC CAPITAL LETTER SHORT U - REMAP(0x045E, 0xA2); // CYRILLIC SMALL LETTER SHORT U - REMAP(0x0408, 0xA3); // CYRILLIC CAPITAL LETTER JE - REMAP(0x00A4, 0xA4); // CURRENCY SIGN - REMAP(0x0490, 0xA5); // CYRILLIC CAPITAL LETTER GHE WITH UPTURN - REMAP(0x00A6, 0xA6); // BROKEN BAR - REMAP(0x00A7, 0xA7); // SECTION SIGN - REMAP(0x0401, 0xA8); // CYRILLIC CAPITAL LETTER IO - REMAP(0x00A9, 0xA9); // COPYRIGHT SIGN - REMAP(0x0404, 0xAA); // CYRILLIC CAPITAL LETTER UKRAINIAN IE - REMAP(0x00AB, 0xAB); // LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - REMAP(0x00AC, 0xAC); // NOT SIGN - REMAP(0x00AD, 0xAD); // SOFT HYPHEN - REMAP(0x00AE, 0xAE); // REGISTERED SIGN - REMAP(0x0407, 0xAF); // CYRILLIC CAPITAL LETTER YI - - REMAP(0x00B0, 0xB0); // DEGREE SIGN - REMAP(0x00B1, 0xB1); // PLUS-MINUS SIGN - REMAP(0x0406, 0xB2); // CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I - REMAP(0x0456, 0xB3); // CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I - REMAP(0x0491, 0xB4); // CYRILLIC SMALL LETTER GHE WITH UPTURN - REMAP(0x00B5, 0xB5); // MICRO SIGN - REMAP(0x00B6, 0xB6); // PILCROW SIGN - REMAP(0x00B7, 0xB7); // MIDDLE DOT - REMAP(0x0451, 0xB8); // CYRILLIC SMALL LETTER IO - REMAP(0x2116, 0xB9); // NUMERO SIGN - REMAP(0x0454, 0xBA); // CYRILLIC SMALL LETTER UKRAINIAN IE - REMAP(0x00BB, 0xBB); // RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - REMAP(0x0458, 0xBC); // CYRILLIC SMALL LETTER JE - REMAP(0x0405, 0xBD); // CYRILLIC CAPITAL LETTER DZE - REMAP(0x0455, 0xBE); // CYRILLIC SMALL LETTER DZE - REMAP(0x0457, 0xBF); // CYRILLIC SMALL LETTER YI - - REMAP(0x0410, 0xC0); // CYRILLIC CAPITAL LETTER A - REMAP(0x0411, 0xC1); // CYRILLIC CAPITAL LETTER BE - REMAP(0x0412, 0xC2); // CYRILLIC CAPITAL LETTER VE - REMAP(0x0413, 0xC3); // CYRILLIC CAPITAL LETTER GHE - REMAP(0x0414, 0xC4); // CYRILLIC CAPITAL LETTER DE - REMAP(0x0415, 0xC5); // CYRILLIC CAPITAL LETTER IE - REMAP(0x0416, 0xC6); // CYRILLIC CAPITAL LETTER ZHE - REMAP(0x0417, 0xC7); // CYRILLIC CAPITAL LETTER ZE - REMAP(0x0418, 0xC8); // CYRILLIC CAPITAL LETTER I - REMAP(0x0419, 0xC9); // CYRILLIC CAPITAL LETTER SHORT I - REMAP(0x041A, 0xCA); // CYRILLIC CAPITAL LETTER KA - REMAP(0x041B, 0xCB); // CYRILLIC CAPITAL LETTER EL - REMAP(0x041C, 0xCC); // CYRILLIC CAPITAL LETTER EM - REMAP(0x041D, 0xCD); // CYRILLIC CAPITAL LETTER EN - REMAP(0x041E, 0xCE); // CYRILLIC CAPITAL LETTER O - REMAP(0x041F, 0xCF); // CYRILLIC CAPITAL LETTER PE - - REMAP(0x0420, 0xD0); // CYRILLIC CAPITAL LETTER ER - REMAP(0x0421, 0xD1); // CYRILLIC CAPITAL LETTER ES - REMAP(0x0422, 0xD2); // CYRILLIC CAPITAL LETTER TE - REMAP(0x0423, 0xD3); // CYRILLIC CAPITAL LETTER U - REMAP(0x0424, 0xD4); // CYRILLIC CAPITAL LETTER EF - REMAP(0x0425, 0xD5); // CYRILLIC CAPITAL LETTER HA - REMAP(0x0426, 0xD6); // CYRILLIC CAPITAL LETTER TSE - REMAP(0x0427, 0xD7); // CYRILLIC CAPITAL LETTER CHE - REMAP(0x0428, 0xD8); // CYRILLIC CAPITAL LETTER SHA - REMAP(0x0429, 0xD9); // CYRILLIC CAPITAL LETTER SHCHA - REMAP(0x042A, 0xDA); // CYRILLIC CAPITAL LETTER HARD SIGN - REMAP(0x042B, 0xDB); // CYRILLIC CAPITAL LETTER YERU - REMAP(0x042C, 0xDC); // CYRILLIC CAPITAL LETTER SOFT SIGN - REMAP(0x042D, 0xDD); // CYRILLIC CAPITAL LETTER E - REMAP(0x042E, 0xDE); // CYRILLIC CAPITAL LETTER YU - REMAP(0x042F, 0xDF); // CYRILLIC CAPITAL LETTER YA - - REMAP(0x0430, 0xE0); // CYRILLIC SMALL LETTER A - REMAP(0x0431, 0xE1); // CYRILLIC SMALL LETTER BE - REMAP(0x0432, 0xE2); // CYRILLIC SMALL LETTER VE - REMAP(0x0433, 0xE3); // CYRILLIC SMALL LETTER GHE - REMAP(0x0434, 0xE4); // CYRILLIC SMALL LETTER DE - REMAP(0x0435, 0xE5); // CYRILLIC SMALL LETTER IE - REMAP(0x0436, 0xE6); // CYRILLIC SMALL LETTER ZHE - REMAP(0x0437, 0xE7); // CYRILLIC SMALL LETTER ZE - REMAP(0x0438, 0xE8); // CYRILLIC SMALL LETTER I - REMAP(0x0439, 0xE9); // CYRILLIC SMALL LETTER SHORT I - REMAP(0x043A, 0xEA); // CYRILLIC SMALL LETTER KA - REMAP(0x043B, 0xEB); // CYRILLIC SMALL LETTER EL - REMAP(0x043C, 0xEC); // CYRILLIC SMALL LETTER EM - REMAP(0x043D, 0xED); // CYRILLIC SMALL LETTER EN - REMAP(0x043E, 0xEE); // CYRILLIC SMALL LETTER O - REMAP(0x043F, 0xEF); // CYRILLIC SMALL LETTER PE - - REMAP(0x0440, 0xF0); // CYRILLIC SMALL LETTER ER - REMAP(0x0441, 0xF1); // CYRILLIC SMALL LETTER ES - REMAP(0x0442, 0xF2); // CYRILLIC SMALL LETTER TE - REMAP(0x0443, 0xF3); // CYRILLIC SMALL LETTER U - REMAP(0x0444, 0xF4); // CYRILLIC SMALL LETTER EF - REMAP(0x0445, 0xF5); // CYRILLIC SMALL LETTER HA - REMAP(0x0446, 0xF6); // CYRILLIC SMALL LETTER TSE - REMAP(0x0447, 0xF7); // CYRILLIC SMALL LETTER CHE - REMAP(0x0448, 0xF8); // CYRILLIC SMALL LETTER SHA - REMAP(0x0449, 0xF9); // CYRILLIC SMALL LETTER SHCHA - REMAP(0x044A, 0xFA); // CYRILLIC SMALL LETTER HARD SIGN - REMAP(0x044B, 0xFB); // CYRILLIC SMALL LETTER YERU - REMAP(0x044C, 0xFC); // CYRILLIC SMALL LETTER SOFT SIGN - REMAP(0x044D, 0xFD); // CYRILLIC SMALL LETTER E - REMAP(0x044E, 0xFE); // CYRILLIC SMALL LETTER YU - REMAP(0x044F, 0xFF); // CYRILLIC SMALL LETTER YA - } - } - - // Latin - Western Europe - // https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1252.TXT - else if (encoding == WINDOWS_1252) { - // 1-Byte chars: no remapping - if (utf8.length() == 1) - return utf8.at(0); - - // Multi-byte chars: - switch (toUtf32(utf8)) { - REMAP(0x20AC, 0x80) // EURO SIGN - REMAP(0x201A, 0x82) // SINGLE LOW-9 QUOTATION MARK - REMAP(0x0192, 0x83) // LATIN SMALL LETTER F WITH HOOK - REMAP(0x201E, 0x84) // DOUBLE LOW-9 QUOTATION MARK - REMAP(0x2026, 0x85) // HORIZONTAL ELLIPSIS - REMAP(0x2020, 0x86) // DAGGER - REMAP(0x2021, 0x87) // DOUBLE DAGGER - REMAP(0x02C6, 0x88) // MODIFIER LETTER CIRCUMFLEX ACCENT - REMAP(0x2030, 0x89) // PER MILLE SIGN - REMAP(0x0160, 0x8A) // LATIN CAPITAL LETTER S WITH CARON - REMAP(0x2039, 0x8B) // SINGLE LEFT-POINTING ANGLE QUOTATION MARK - REMAP(0x0152, 0x8C) // LATIN CAPITAL LIGATURE OE - REMAP(0x017D, 0x8E) // LATIN CAPITAL LETTER Z WITH CARON - - REMAP(0x2018, 0x91) // LEFT SINGLE QUOTATION MARK - REMAP(0x2019, 0x92) // RIGHT SINGLE QUOTATION MARK - REMAP(0x201C, 0x93) // LEFT DOUBLE QUOTATION MARK - REMAP(0x201D, 0x94) // RIGHT DOUBLE QUOTATION MARK - REMAP(0x2022, 0x95) // BULLET - REMAP(0x2013, 0x96) // EN DASH - REMAP(0x2014, 0x97) // EM DASH - REMAP(0x02DC, 0x98) // SMALL TILDE - REMAP(0x2122, 0x99) // TRADE MARK SIGN - REMAP(0x0161, 0x9A) // LATIN SMALL LETTER S WITH CARON - REMAP(0x203A, 0x9B) // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK - REMAP(0x0153, 0x9C) // LATIN SMALL LIGATURE OE - REMAP(0x017E, 0x9E) // LATIN SMALL LETTER Z WITH CARON - REMAP(0x0178, 0x9F) // LATIN CAPITAL LETTER Y WITH DIAERESIS - - REMAP(0x00A0, 0xA0) // NO-BREAK SPACE - REMAP(0x00A1, 0xA1) // INVERTED EXCLAMATION MARK - REMAP(0x00A2, 0xA2) // CENT SIGN - REMAP(0x00A3, 0xA3) // POUND SIGN - REMAP(0x00A4, 0xA4) // CURRENCY SIGN - REMAP(0x00A5, 0xA5) // YEN SIGN - REMAP(0x00A6, 0xA6) // BROKEN BAR - REMAP(0x00A7, 0xA7) // SECTION SIGN - REMAP(0x00A8, 0xA8) // DIAERESIS - REMAP(0x00A9, 0xA9) // COPYRIGHT SIGN - REMAP(0x00AA, 0xAA) // FEMININE ORDINAL INDICATOR - REMAP(0x00AB, 0xAB) // LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - REMAP(0x00AC, 0xAC) // NOT SIGN - REMAP(0x00AD, 0xAD) // SOFT HYPHEN - REMAP(0x00AE, 0xAE) // REGISTERED SIGN - REMAP(0x00AF, 0xAF) // MACRON - - REMAP(0x00B0, 0xB0) // DEGREE SIGN - REMAP(0x00B1, 0xB1) // PLUS-MINUS SIGN - REMAP(0x00B2, 0xB2) // SUPERSCRIPT TWO - REMAP(0x00B3, 0xB3) // SUPERSCRIPT THREE - REMAP(0x00B4, 0xB4) // ACUTE ACCENT - REMAP(0x00B5, 0xB5) // MICRO SIGN - REMAP(0x00B6, 0xB6) // PILCROW SIGN - REMAP(0x00B7, 0xB7) // MIDDLE DOT - REMAP(0x00B8, 0xB8) // CEDILLA - REMAP(0x00B9, 0xB9) // SUPERSCRIPT ONE - REMAP(0x00BA, 0xBA) // MASCULINE ORDINAL INDICATOR - REMAP(0x00BB, 0xBB) // RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - REMAP(0x00BC, 0xBC) // VULGAR FRACTION ONE QUARTER - REMAP(0x00BD, 0xBD) // VULGAR FRACTION ONE HALF - REMAP(0x00BE, 0xBE) // VULGAR FRACTION THREE QUARTERS - REMAP(0x00BF, 0xBF) // INVERTED QUESTION MARK - - REMAP(0x00C0, 0xC0) // LATIN CAPITAL LETTER A WITH GRAVE - REMAP(0x00C1, 0xC1) // LATIN CAPITAL LETTER A WITH ACUTE - REMAP(0x00C2, 0xC2) // LATIN CAPITAL LETTER A WITH CIRCUMFLEX - REMAP(0x00C3, 0xC3) // LATIN CAPITAL LETTER A WITH TILDE - REMAP(0x00C4, 0xC4) // LATIN CAPITAL LETTER A WITH DIAERESIS - REMAP(0x00C5, 0xC5) // LATIN CAPITAL LETTER A WITH RING ABOVE - REMAP(0x00C6, 0xC6) // LATIN CAPITAL LETTER AE - REMAP(0x00C7, 0xC7) // LATIN CAPITAL LETTER C WITH CEDILLA - REMAP(0x00C8, 0xC8) // LATIN CAPITAL LETTER E WITH GRAVE - REMAP(0x00C9, 0xC9) // LATIN CAPITAL LETTER E WITH ACUTE - REMAP(0x00CA, 0xCA) // LATIN CAPITAL LETTER E WITH CIRCUMFLEX - REMAP(0x00CB, 0xCB) // LATIN CAPITAL LETTER E WITH DIAERESIS - REMAP(0x00CC, 0xCC) // LATIN CAPITAL LETTER I WITH GRAVE - REMAP(0x00CD, 0xCD) // LATIN CAPITAL LETTER I WITH ACUTE - REMAP(0x00CE, 0xCE) // LATIN CAPITAL LETTER I WITH CIRCUMFLEX - REMAP(0x00CF, 0xCF) // LATIN CAPITAL LETTER I WITH DIAERESIS - - REMAP(0x00D0, 0xD0) // LATIN CAPITAL LETTER ETH - REMAP(0x00D1, 0xD1) // LATIN CAPITAL LETTER N WITH TILDE - REMAP(0x00D2, 0xD2) // LATIN CAPITAL LETTER O WITH GRAVE - REMAP(0x00D3, 0xD3) // LATIN CAPITAL LETTER O WITH ACUTE - REMAP(0x00D4, 0xD4) // LATIN CAPITAL LETTER O WITH CIRCUMFLEX - REMAP(0x00D5, 0xD5) // LATIN CAPITAL LETTER O WITH TILDE - REMAP(0x00D6, 0xD6) // LATIN CAPITAL LETTER O WITH DIAERESIS - REMAP(0x00D7, 0xD7) // MULTIPLICATION SIGN - REMAP(0x00D8, 0xD8) // LATIN CAPITAL LETTER O WITH STROKE - REMAP(0x00D9, 0xD9) // LATIN CAPITAL LETTER U WITH GRAVE - REMAP(0x00DA, 0xDA) // LATIN CAPITAL LETTER U WITH ACUTE - REMAP(0x00DB, 0xDB) // LATIN CAPITAL LETTER U WITH CIRCUMFLEX - REMAP(0x00DC, 0xDC) // LATIN CAPITAL LETTER U WITH DIAERESIS - REMAP(0x00DD, 0xDD) // LATIN CAPITAL LETTER Y WITH ACUTE - REMAP(0x00DE, 0xDE) // LATIN CAPITAL LETTER THORN - REMAP(0x00DF, 0xDF) // LATIN SMALL LETTER SHARP S - - REMAP(0x00E0, 0xE0) // LATIN SMALL LETTER A WITH GRAVE - REMAP(0x00E1, 0xE1) // LATIN SMALL LETTER A WITH ACUTE - REMAP(0x00E2, 0xE2) // LATIN SMALL LETTER A WITH CIRCUMFLEX - REMAP(0x00E3, 0xE3) // LATIN SMALL LETTER A WITH TILDE - REMAP(0x00E4, 0xE4) // LATIN SMALL LETTER A WITH DIAERESIS - REMAP(0x00E5, 0xE5) // LATIN SMALL LETTER A WITH RING ABOVE - REMAP(0x00E6, 0xE6) // LATIN SMALL LETTER AE - REMAP(0x00E7, 0xE7) // LATIN SMALL LETTER C WITH CEDILLA - REMAP(0x00E8, 0xE8) // LATIN SMALL LETTER E WITH GRAVE - REMAP(0x00E9, 0xE9) // LATIN SMALL LETTER E WITH ACUTE - REMAP(0x00EA, 0xEA) // LATIN SMALL LETTER E WITH CIRCUMFLEX - REMAP(0x00EB, 0xEB) // LATIN SMALL LETTER E WITH DIAERESIS - REMAP(0x00EC, 0xEC) // LATIN SMALL LETTER I WITH GRAVE - REMAP(0x00ED, 0xED) // LATIN SMALL LETTER I WITH ACUTE - REMAP(0x00EE, 0xEE) // LATIN SMALL LETTER I WITH CIRCUMFLEX - REMAP(0x00EF, 0xEF) // LATIN SMALL LETTER I WITH DIAERESIS - - REMAP(0x00F0, 0xF0) // LATIN SMALL LETTER ETH - REMAP(0x00F1, 0xF1) // LATIN SMALL LETTER N WITH TILDE - REMAP(0x00F2, 0xF2) // LATIN SMALL LETTER O WITH GRAVE - REMAP(0x00F3, 0xF3) // LATIN SMALL LETTER O WITH ACUTE - REMAP(0x00F4, 0xF4) // LATIN SMALL LETTER O WITH CIRCUMFLEX - REMAP(0x00F5, 0xF5) // LATIN SMALL LETTER O WITH TILDE - REMAP(0x00F6, 0xF6) // LATIN SMALL LETTER O WITH DIAERESIS - REMAP(0x00F7, 0xF7) // DIVISION SIGN - REMAP(0x00F8, 0xF8) // LATIN SMALL LETTER O WITH STROKE - REMAP(0x00F9, 0xF9) // LATIN SMALL LETTER U WITH GRAVE - REMAP(0x00FA, 0xFA) // LATIN SMALL LETTER U WITH ACUTE - REMAP(0x00FB, 0xFB) // LATIN SMALL LETTER U WITH CIRCUMFLEX - REMAP(0x00FC, 0xFC) // LATIN SMALL LETTER U WITH DIAERESIS - REMAP(0x00FD, 0xFD) // LATIN SMALL LETTER Y WITH ACUTE - REMAP(0x00FE, 0xFE) // LATIN SMALL LETTER THORN - REMAP(0x00FF, 0xFF) // LATIN SMALL LETTER Y WITH DIAERESIS - } - } - - // If not handled, return DEL - // Todo: swap this to SUB, and modify the fonts - return '\x7F'; - -// Sweep up the syntactic sugar -// Don't want ants in the house -#undef REMAP + addSubstitution("Ђ", "\x80"); + addSubstitution("Ѓ", "\x81"); + addSubstitution("ѓ", "\x83"); + addSubstitution("€", "\x88"); + addSubstitution("Љ", "\x8A"); + addSubstitution("Њ", "\x8C"); + addSubstitution("Ќ", "\x8D"); + addSubstitution("Ћ", "\x8E"); + addSubstitution("Џ", "\x8F"); + + addSubstitution("ђ", "\x90"); + addSubstitution("љ", "\x9A"); + addSubstitution("њ", "\x9C"); + addSubstitution("ќ", "\x9D"); + addSubstitution("ћ", "\x9E"); + addSubstitution("џ", "\x9F"); + + addSubstitution("Ў", "\xA1"); + addSubstitution("ў", "\xA2"); + addSubstitution("Ј", "\xA3"); + addSubstitution("Ґ", "\xA5"); + addSubstitution("Ё", "\xA8"); + addSubstitution("Є", "\xAA"); + addSubstitution("Ї", "\xAF"); + + addSubstitution("І", "\xB2"); + addSubstitution("і", "\xB3"); + addSubstitution("ґ", "\xB4"); + addSubstitution("ё", "\xB8"); + addSubstitution("№", "\xB9"); + addSubstitution("є", "\xBA"); + addSubstitution("ј", "\xBC"); + addSubstitution("Ѕ", "\xBD"); + addSubstitution("ѕ", "\xBE"); + addSubstitution("ї", "\xBF"); + + addSubstitution("А", "\xC0"); + addSubstitution("Б", "\xC1"); + addSubstitution("В", "\xC2"); + addSubstitution("Г", "\xC3"); + addSubstitution("Д", "\xC4"); + addSubstitution("Е", "\xC5"); + addSubstitution("Ж", "\xC6"); + addSubstitution("З", "\xC7"); + addSubstitution("И", "\xC8"); + addSubstitution("Й", "\xC9"); + addSubstitution("К", "\xCA"); + addSubstitution("Л", "\xCB"); + addSubstitution("М", "\xCC"); + addSubstitution("Н", "\xCD"); + addSubstitution("О", "\xCE"); + addSubstitution("П", "\xCF"); + + addSubstitution("Р", "\xD0"); + addSubstitution("С", "\xD1"); + addSubstitution("Т", "\xD2"); + addSubstitution("У", "\xD3"); + addSubstitution("Ф", "\xD4"); + addSubstitution("Х", "\xD5"); + addSubstitution("Ц", "\xD6"); + addSubstitution("Ч", "\xD7"); + addSubstitution("Ш", "\xD8"); + addSubstitution("Щ", "\xD9"); + addSubstitution("Ъ", "\xDA"); + addSubstitution("Ы", "\xDB"); + addSubstitution("Ь", "\xDC"); + addSubstitution("Э", "\xDD"); + addSubstitution("Ю", "\xDE"); + addSubstitution("Я", "\xDF"); + + addSubstitution("а", "\xE0"); + addSubstitution("б", "\xE1"); + addSubstitution("в", "\xE2"); + addSubstitution("г", "\xE3"); + addSubstitution("д", "\xE4"); + addSubstitution("е", "\xE5"); + addSubstitution("ж", "\xE6"); + addSubstitution("з", "\xE7"); + addSubstitution("и", "\xE8"); + addSubstitution("й", "\xE9"); + addSubstitution("к", "\xEA"); + addSubstitution("л", "\xEB"); + addSubstitution("м", "\xEC"); + addSubstitution("н", "\xED"); + addSubstitution("о", "\xEE"); + addSubstitution("п", "\xEF"); + + addSubstitution("р", "\xF0"); + addSubstitution("с", "\xF1"); + addSubstitution("т", "\xF2"); + addSubstitution("у", "\xF3"); + addSubstitution("ф", "\xF4"); + addSubstitution("х", "\xF5"); + addSubstitution("ц", "\xF6"); + addSubstitution("ч", "\xF7"); + addSubstitution("ш", "\xF8"); + addSubstitution("щ", "\xF9"); + addSubstitution("ъ", "\xFA"); + addSubstitution("ы", "\xFB"); + addSubstitution("ь", "\xFC"); + addSubstitution("э", "\xFD"); + addSubstitution("ю", "\xFE"); + addSubstitution("я", "\xFF"); } #endif \ No newline at end of file diff --git a/src/graphics/niche/InkHUD/AppletFont.h b/src/graphics/niche/InkHUD/AppletFont.h index 67348b8d3d..504bd12b37 100644 --- a/src/graphics/niche/InkHUD/AppletFont.h +++ b/src/graphics/niche/InkHUD/AppletFont.h @@ -4,7 +4,10 @@ Wrapper class for an AdafruitGFX font Pre-calculates some font dimension info which InkHUD uses repeatedly - Re-encodes UTF-8 characters to suit extended ASCII AdafruitGFX fonts + + Also contains an optional set of "substitutions". + These can be used to detect special UTF8 chars, and replace occurrences with a remapped char val to suit a custom font + These can also be used to swap UTF8 chars for a suitable ASCII substitution (e.g. German ö -> oe, etc) */ @@ -21,61 +24,36 @@ namespace NicheGraphics::InkHUD class AppletFont { public: - enum Encoding { - ASCII, - WINDOWS_1250, - WINDOWS_1251, - WINDOWS_1252, - }; - AppletFont(); - AppletFont(const GFXfont &adafruitGFXFont, Encoding encoding = ASCII, int8_t paddingTop = 0, int8_t paddingBottom = 0); + explicit AppletFont(const GFXfont &adafruitGFXFont); uint8_t lineHeight(); uint8_t heightAboveCursor(); uint8_t heightBelowCursor(); uint8_t widthBetweenWords(); // Width of the space character - std::string decodeUTF8(std::string encoded); + void applySubstitutions(std::string *text); // Run all char-substitution operations, prior to printing + void addSubstitution(const char *from, const char *to); // Register a find-replace action, for remapping UTF8 chars + void addSubstitutionsWin1251(); // Cyrillic fonts: remap UTF8 values to their Win-1251 equivalent + // Todo: Polish font const GFXfont *gfxFont = NULL; // Default value: in-built AdafruitGFX font private: - uint32_t toUtf32(std::string utf8); - char applyEncoding(std::string utf8); - uint8_t height = 8; // Default value: in-built AdafruitGFX font uint8_t ascenderHeight = 0; // Default value: in-built AdafruitGFX font uint8_t descenderHeight = 8; // Default value: in-built AdafruitGFX font uint8_t spaceCharWidth = 8; // Default value: in-built AdafruitGFX font - Encoding encoding = ASCII; + // One pair of find-replace values, for substituting or remapping UTF8 chars + struct Substitution { + const char *from; + const char *to; + }; + + std::vector substitutions; // List of all character substitutions to run, prior to printing a string }; } // namespace NicheGraphics::InkHUD -// Macros for InkHUD's standard fonts -// -------------------------------------- - -// Use these once only, passing them to InkHUD::Applet::fontLarge and InkHUD::Applet:fontSmall -// Line padding has been adjusted manually, to compensate for a few *extra tall* diacritics - -// Central European -#include "graphics/niche/Fonts/FreeSans6pt_Win1250.h" -#include "graphics/niche/Fonts/FreeSans9pt_Win1250.h" -#define FREESANS_9PT_WIN1250 InkHUD::AppletFont(FreeSans9pt_Win1250, InkHUD::AppletFont::WINDOWS_1250, -1, -1) -#define FREESANS_6PT_WIN1250 InkHUD::AppletFont(FreeSans6pt_Win1250, InkHUD::AppletFont::WINDOWS_1250, -1, -2) - -// Cyrillic -#include "graphics/niche/Fonts/FreeSans6pt_Win1251.h" -#include "graphics/niche/Fonts/FreeSans9pt_Win1251.h" -#define FREESANS_9PT_WIN1251 InkHUD::AppletFont(FreeSans9pt_Win1251, InkHUD::AppletFont::WINDOWS_1251, -2, -1) -#define FREESANS_6PT_WIN1251 InkHUD::AppletFont(FreeSans6pt_Win1251, InkHUD::AppletFont::WINDOWS_1251, -1, -2) - -// Western European -#include "graphics/niche/Fonts/FreeSans6pt_Win1252.h" -#include "graphics/niche/Fonts/FreeSans9pt_Win1252.h" -#define FREESANS_9PT_WIN1252 InkHUD::AppletFont(FreeSans9pt_Win1252, InkHUD::AppletFont::WINDOWS_1252, -2, -1) -#define FREESANS_6PT_WIN1252 InkHUD::AppletFont(FreeSans6pt_Win1252, InkHUD::AppletFont::WINDOWS_1252, -1, -2) - #endif \ No newline at end of file diff --git a/src/graphics/niche/InkHUD/Applets/Bases/Map/MapApplet.cpp b/src/graphics/niche/InkHUD/Applets/Bases/Map/MapApplet.cpp index db0805f4e5..ea7b742621 100644 --- a/src/graphics/niche/InkHUD/Applets/Bases/Map/MapApplet.cpp +++ b/src/graphics/niche/InkHUD/Applets/Bases/Map/MapApplet.cpp @@ -286,10 +286,6 @@ void InkHUD::MapApplet::drawLabeledMarker(meshtastic_NodeInfoLite *node) bool isOurNode = node->num == nodeDB->getNodeNum(); bool unknownHops = !node->has_hops_away && !isOurNode; - // Parse any non-ascii chars in the short name, - // and use last 4 instead if unknown / can't render - std::string shortName = parseShortName(node); - // We will draw a left or right hand variant, to place text towards screen center // Hopefully avoid text spilling off screen // Most values are the same, regardless of left-right handedness @@ -303,7 +299,7 @@ void InkHUD::MapApplet::drawLabeledMarker(meshtastic_NodeInfoLite *node) markerSize = map(node->hops_away, 0, config.lora.hop_limit, markerSizeMax, markerSizeMin); // Common dimensions (left or right variant) - textW = getTextWidth(shortName); + textW = getTextWidth(node->user.short_name); if (textW == 0) paddingInnerW = 0; // If no text, no padding for text textH = fontSmall.lineHeight(); @@ -329,7 +325,7 @@ void InkHUD::MapApplet::drawLabeledMarker(meshtastic_NodeInfoLite *node) drawRect(labelX, labelY, labelW, labelH, BLACK); // Short name - printAt(textX, textY, shortName, LEFT, MIDDLE); + printAt(textX, textY, node->user.short_name, LEFT, MIDDLE); // If the label is for our own node, // fade it by overdrawing partially with white diff --git a/src/graphics/niche/InkHUD/Applets/Bases/NodeList/NodeListApplet.cpp b/src/graphics/niche/InkHUD/Applets/Bases/NodeList/NodeListApplet.cpp index 7fa31b2444..8ede407801 100644 --- a/src/graphics/niche/InkHUD/Applets/Bases/NodeList/NodeListApplet.cpp +++ b/src/graphics/niche/InkHUD/Applets/Bases/NodeList/NodeListApplet.cpp @@ -142,18 +142,16 @@ void InkHUD::NodeListApplet::onRender() meshtastic_NodeInfoLite *node = nodeDB->getMeshNode(nodeNum); // -- Shortname -- - // Parse special chars in the short name - // Use "?" if unknown - if (node) - shortName = parseShortName(node); + // use "?" if unknown + if (node && node->has_user) + shortName = node->user.short_name; else shortName = "?"; // -- Longname -- - // Parse special chars in long name - // Use node id if unknown + // use node id if unknown if (node && node->has_user) - longName = parse(node->user.long_name); // Found in nodeDB + longName = node->user.long_name; // Found in nodeDB else { // Not found in nodeDB, show a hex nodeid instead longName = hexifyNodeNum(nodeNum); diff --git a/src/graphics/niche/InkHUD/Applets/Examples/BasicExample/BasicExampleApplet.cpp b/src/graphics/niche/InkHUD/Applets/Examples/BasicExample/BasicExampleApplet.cpp index c52719e55c..b12ea48090 100644 --- a/src/graphics/niche/InkHUD/Applets/Examples/BasicExample/BasicExampleApplet.cpp +++ b/src/graphics/niche/InkHUD/Applets/Examples/BasicExample/BasicExampleApplet.cpp @@ -9,12 +9,6 @@ using namespace NicheGraphics; void InkHUD::BasicExampleApplet::onRender() { printAt(0, 0, "Hello, World!"); - - // If text might contain "special characters", is needs parsing first - // This applies to data such as text-messages and and node names - - // std::string greeting = parse("Grüezi mitenand!"); - // printAt(0, 0, greeting); } #endif \ No newline at end of file diff --git a/src/graphics/niche/InkHUD/Applets/Examples/NewMsgExample/NewMsgExampleApplet.h b/src/graphics/niche/InkHUD/Applets/Examples/NewMsgExample/NewMsgExampleApplet.h index 22670a0f09..f280afcdae 100644 --- a/src/graphics/niche/InkHUD/Applets/Examples/NewMsgExample/NewMsgExampleApplet.h +++ b/src/graphics/niche/InkHUD/Applets/Examples/NewMsgExample/NewMsgExampleApplet.h @@ -5,7 +5,7 @@ An example of an InkHUD applet. Tells us when a new text message arrives. -This applet makes use of the Module API to detect new messages, +This applet makes use of the MeshModule API to detect new messages, which is a general part of the Meshtastic firmware, and not part of InkHUD. In variants//nicheGraphics.h: diff --git a/src/graphics/niche/InkHUD/Applets/System/Menu/MenuApplet.cpp b/src/graphics/niche/InkHUD/Applets/System/Menu/MenuApplet.cpp index 9fdfad8eed..5ca9692c84 100644 --- a/src/graphics/niche/InkHUD/Applets/System/Menu/MenuApplet.cpp +++ b/src/graphics/niche/InkHUD/Applets/System/Menu/MenuApplet.cpp @@ -244,7 +244,6 @@ void InkHUD::MenuApplet::execute(MenuItem item) void InkHUD::MenuApplet::showPage(MenuPage page) { items.clear(); - items.shrink_to_fit(); switch (page) { case ROOT: diff --git a/src/graphics/niche/InkHUD/Applets/System/Notification/NotificationApplet.cpp b/src/graphics/niche/InkHUD/Applets/System/Notification/NotificationApplet.cpp index f9439fab8e..aa702c032b 100644 --- a/src/graphics/niche/InkHUD/Applets/System/Notification/NotificationApplet.cpp +++ b/src/graphics/niche/InkHUD/Applets/System/Notification/NotificationApplet.cpp @@ -33,6 +33,11 @@ int InkHUD::NotificationApplet::onReceiveTextMessage(const meshtastic_MeshPacket if (getFrom(p) == nodeDB->getNodeNum()) return 0; + // Abort if message was only an "emoji reaction" + // Possibly some implementation of this in future? + if (p->decoded.emoji) + return 0; + Notification n; n.timestamp = getValidTime(RTCQuality::RTCQualityDevice, true); // Current RTC time @@ -117,7 +122,7 @@ void InkHUD::NotificationApplet::onRender() int16_t textM = divX + padW + (getTextWidth(text) / 2); // Restrict area for printing - // - don't overlap border, or divider + // - don't overlap border, or diveder setCrop(divX + 1, 1, (width() - (divX + 1) - 1), height() - 2); // Drop shadow @@ -236,8 +241,7 @@ std::string InkHUD::NotificationApplet::getNotificationText(uint16_t widthAvaila } } - // Parse any non-ascii characters and return - return parse(text); + return text; } #endif \ No newline at end of file diff --git a/src/graphics/niche/InkHUD/Applets/System/Pairing/PairingApplet.cpp b/src/graphics/niche/InkHUD/Applets/System/Pairing/PairingApplet.cpp index 3f51c7f88b..81de05b303 100644 --- a/src/graphics/niche/InkHUD/Applets/System/Pairing/PairingApplet.cpp +++ b/src/graphics/niche/InkHUD/Applets/System/Pairing/PairingApplet.cpp @@ -23,9 +23,9 @@ void InkHUD::PairingApplet::onRender() // Device's bluetooth name, if it will fit setFont(fontSmall); - std::string name = "Name: " + parse(getDeviceName()); + std::string name = "Name: " + std::string(getDeviceName()); if (getTextWidth(name) > width()) // Too wide, try without the leading "Name: " - name = parse(getDeviceName()); + name = std::string(getDeviceName()); if (getTextWidth(name) < width()) // Does it fit? printAt(X(0.5), Y(0.75), name, CENTER, MIDDLE); } diff --git a/src/graphics/niche/InkHUD/Applets/User/AllMessage/AllMessageApplet.cpp b/src/graphics/niche/InkHUD/Applets/User/AllMessage/AllMessageApplet.cpp index 9687753028..f7e2a8e9df 100644 --- a/src/graphics/niche/InkHUD/Applets/User/AllMessage/AllMessageApplet.cpp +++ b/src/graphics/niche/InkHUD/Applets/User/AllMessage/AllMessageApplet.cpp @@ -27,6 +27,11 @@ int InkHUD::AllMessageApplet::onReceiveTextMessage(const meshtastic_MeshPacket * if (getFrom(p) == nodeDB->getNodeNum()) return 0; + // Abort if message was only an "emoji reaction" + // Possibly some implemetation of this in future? + if (p->decoded.emoji) + return 0; + requestAutoshow(); // Want to become foreground, if permitted requestUpdate(); // Want to update display, if applet is foreground @@ -95,22 +100,19 @@ void InkHUD::AllMessageApplet::onRender() // Print message text // =================== - // Parse any non-ascii chars in the message - std::string text = parse(message->text); - // Extra gap below the header int16_t textTop = headerDivY + padDivH; // Determine size if printed large setFont(fontLarge); - uint32_t textHeight = getWrappedTextHeight(0, width(), text); + uint32_t textHeight = getWrappedTextHeight(0, width(), message->text); // If too large, swap to small font if (textHeight + textTop > (uint32_t)height()) // (compare signed and unsigned) setFont(fontSmall); // Print text - printWrapped(0, textTop, width(), text); + printWrapped(0, textTop, width(), message->text); } // Don't show notifications for text messages when our applet is displayed diff --git a/src/graphics/niche/InkHUD/Applets/User/DM/DMApplet.cpp b/src/graphics/niche/InkHUD/Applets/User/DM/DMApplet.cpp index 3c69495ede..7a1d14f32a 100644 --- a/src/graphics/niche/InkHUD/Applets/User/DM/DMApplet.cpp +++ b/src/graphics/niche/InkHUD/Applets/User/DM/DMApplet.cpp @@ -23,6 +23,11 @@ int InkHUD::DMApplet::onReceiveTextMessage(const meshtastic_MeshPacket *p) if (!isActive()) return 0; + // Abort if only an "emoji reactions" + // Possibly some implemetation of this in future? + if (p->decoded.emoji) + return 0; + // If DM (not broadcast) if (!isBroadcast(p->to)) { // Want to update display, if applet is foreground @@ -91,22 +96,19 @@ void InkHUD::DMApplet::onRender() // Print message text // =================== - // Parse any non-ascii chars in the message - std::string text = parse(latestMessage->dm.text); - // Extra gap below the header int16_t textTop = headerDivY + padDivH; // Determine size if printed large setFont(fontLarge); - uint32_t textHeight = getWrappedTextHeight(0, width(), text); + uint32_t textHeight = getWrappedTextHeight(0, width(), latestMessage->dm.text); // If too large, swap to small font if (textHeight + textTop > (uint32_t)height()) // (compare signed and unsigned) setFont(fontSmall); // Print text - printWrapped(0, textTop, width(), text); + printWrapped(0, textTop, width(), latestMessage->dm.text); } // Don't show notifications for direct messages when our applet is displayed diff --git a/src/graphics/niche/InkHUD/Applets/User/Heard/HeardApplet.cpp b/src/graphics/niche/InkHUD/Applets/User/Heard/HeardApplet.cpp index 5a659c6067..ceb9c01fea 100644 --- a/src/graphics/niche/InkHUD/Applets/User/Heard/HeardApplet.cpp +++ b/src/graphics/niche/InkHUD/Applets/User/Heard/HeardApplet.cpp @@ -16,7 +16,7 @@ void InkHUD::HeardApplet::onActivate() void InkHUD::HeardApplet::onDeactivate() { - // Avoid an unlikely situation where frequent activation / deactivation populates duplicate info from node DB + // Avoid an unlikely situation where frquent activation / deactivation populated duplicate info from node DB cards.clear(); } @@ -41,7 +41,6 @@ void InkHUD::HeardApplet::handleParsed(CardInfo c) cards.push_front(c); // Insert into base class' card collection cards.resize(min(maxCards(), (uint8_t)cards.size())); // Don't keep more cards than we could *ever* fit on screen - cards.shrink_to_fit(); // Our rendered image needs to change if: if (previous.nodeNum != c.nodeNum // Different node @@ -55,7 +54,7 @@ void InkHUD::HeardApplet::handleParsed(CardInfo c) } // When applet is activated, pre-fill with stale data from NodeDB -// We're sorting using the last_heard value. Susceptible to weirdness if node's RTC changes. +// We're sorting using the last_heard value. Succeptible to weirdness if node's RTC changes. // No SNR is available in node db, so we can't calculate signal either // These initial cards from node db will be gradually pushed out by new packets which originate from out base applet instead void InkHUD::HeardApplet::populateFromNodeDB() @@ -73,7 +72,7 @@ void InkHUD::HeardApplet::populateFromNodeDB() return (top->last_heard > bottom->last_heard); }); - // Keep the most recent entries only + // Keep the most recent entries onlyt // Just enough to fill the screen if (ordered.size() > maxCards()) ordered.resize(maxCards()); diff --git a/src/graphics/niche/InkHUD/Applets/User/RecentsList/RecentsListApplet.cpp b/src/graphics/niche/InkHUD/Applets/User/RecentsList/RecentsListApplet.cpp index 1ccf7fc142..02aa4a7214 100644 --- a/src/graphics/niche/InkHUD/Applets/User/RecentsList/RecentsListApplet.cpp +++ b/src/graphics/niche/InkHUD/Applets/User/RecentsList/RecentsListApplet.cpp @@ -53,7 +53,6 @@ void InkHUD::RecentsListApplet::handleParsed(CardInfo c) cards.push_front(c); // Store this CardInfo cards.resize(min(maxCards(), (uint8_t)cards.size())); // Don't keep more cards than we could *ever* fit on screen - cards.shrink_to_fit(); // Record the time of this observation // Used to count active nodes, and to know when to prune inactive nodes @@ -100,12 +99,10 @@ void InkHUD::RecentsListApplet::prune() if (!isActive(ages.at(i).seenAtMs)) { // Drop this item, and all others behind it ages.resize(i); - ages.shrink_to_fit(); cards.resize(i); - cards.shrink_to_fit(); // Request an update, if pruning did modify our data - // Required if pruning was scheduled. Redundant if pruning was prior to rendering. + // Required if pruning was scheduled. Redundent if pruning was prior to rendering. requestAutoshow(); requestUpdate(); diff --git a/src/graphics/niche/InkHUD/Applets/User/ThreadedMessage/ThreadedMessageApplet.cpp b/src/graphics/niche/InkHUD/Applets/User/ThreadedMessage/ThreadedMessageApplet.cpp index d5d7f77f81..d7d2e79c8d 100644 --- a/src/graphics/niche/InkHUD/Applets/User/ThreadedMessage/ThreadedMessageApplet.cpp +++ b/src/graphics/niche/InkHUD/Applets/User/ThreadedMessage/ThreadedMessageApplet.cpp @@ -71,28 +71,27 @@ void InkHUD::ThreadedMessageApplet::onRender() MessageStore::Message &m = store->messages.at(i); bool outgoing = (m.sender == 0); meshtastic_NodeInfoLite *sender = nodeDB->getMeshNode(m.sender); - std::string bodyText = parse(m.text); // Parse any non-ascii chars in the message // Cache bottom Y of message text // - Used when drawing vertical line alongside const int16_t dotsB = msgB; // Get dimensions for message text - uint16_t bodyH = getWrappedTextHeight(msgL, msgW, bodyText); + uint16_t bodyH = getWrappedTextHeight(msgL, msgW, m.text); int16_t bodyT = msgB - bodyH; // Print message // - if incoming if (!outgoing) - printWrapped(msgL, bodyT, msgW, bodyText); + printWrapped(msgL, bodyT, msgW, m.text); // Print message // - if outgoing else { - if (getTextWidth(bodyText) < width()) // If short, - printAt(msgR, bodyT, bodyText, RIGHT); // print right align - else // If long, - printWrapped(msgL, bodyT, msgW, bodyText); // need printWrapped(), which doesn't support right align + if (getTextWidth(m.text) < width()) // If short, + printAt(msgR, bodyT, m.text, RIGHT); // print right align + else // If long, + printWrapped(msgL, bodyT, msgW, m.text); // need printWrapped(), which doesn't support right align } // Move cursor up @@ -104,16 +103,12 @@ void InkHUD::ThreadedMessageApplet::onRender() // - shortname, if possible, or "me" // - time received, if possible std::string info; - if (outgoing) + if (sender && sender->has_user) + info += sender->user.short_name; + else if (outgoing) info += "Me"; - else { - // Check if sender is node db - meshtastic_NodeInfoLite *sender = nodeDB->getMeshNode(m.sender); - if (sender) - info += parseShortName(sender); // Handle any unprintable chars in short name - else - info += hexifyNodeNum(m.sender); // No node info at all. Print the node num - } + else + info += hexifyNodeNum(m.sender); std::string timeString = getTimeString(m.timestamp); if (timeString.length() > 0) { @@ -200,6 +195,11 @@ int InkHUD::ThreadedMessageApplet::onReceiveTextMessage(const meshtastic_MeshPac if (p->to != NODENUM_BROADCAST) return 0; + // Abort if messages was an "emoji reaction" + // Possibly some implemetation of this in future? + if (p->decoded.emoji) + return 0; + // Extract info into our slimmed-down "StoredMessage" type MessageStore::Message newMessage; newMessage.timestamp = getValidTime(RTCQuality::RTCQualityDevice, true); // Current RTC time diff --git a/src/graphics/niche/InkHUD/Events.cpp b/src/graphics/niche/InkHUD/Events.cpp index ee6c04938f..d0bd352502 100644 --- a/src/graphics/niche/InkHUD/Events.cpp +++ b/src/graphics/niche/InkHUD/Events.cpp @@ -146,6 +146,11 @@ int InkHUD::Events::onReceiveTextMessage(const meshtastic_MeshPacket *packet) if (getFrom(packet) == nodeDB->getNodeNum()) return 0; + // Short circuit: don't store "emoji reactions" + // Possibly some implementation of this in future? + if (packet->decoded.emoji) + return 0; + // Determine whether the message is broadcast or a DM // Store this info to prevent confusion after a reboot // Avoids need to compare timestamps, because of situation where "future" messages block newly received, if time not set diff --git a/src/graphics/niche/InkHUD/docs/README.md b/src/graphics/niche/InkHUD/docs/README.md index b504d46c18..c3082add1b 100644 --- a/src/graphics/niche/InkHUD/docs/README.md +++ b/src/graphics/niche/InkHUD/docs/README.md @@ -13,7 +13,7 @@ This document is intended as a reference for maintainers. A haphazard collection - [Non-interactive](#non-interactive) - [Customizable](#customizable) - [Event-Driven Rendering](#event-driven-rendering) - - [Avoid the Preprocessor](#avoid-the-preprocessor) + - [No `#ifdef` spaghetti](#no-ifdef-spaghetti) - [The Implementation](#the-implementation) - [The Rendering Process](#the-rendering-process) - [Concepts](#concepts) @@ -23,10 +23,6 @@ This document is intended as a reference for maintainers. A haphazard collection - [Adding a Variant](#adding-a-variant) - [platformio.ini](#platformioini) - [nicheGraphics.h](#nichegraphicsh) -- [Fonts](#fonts) - - [Parsing Unicode Text](#parsing-unicode-text) - - [Localization](#localization) - - [Creating / Modifying](#creating--modifying) - [Class Notes](#class-notes) - [`InkHUD::InkHUD`](#inkhudinkhud) - [`InkHUD::Persistence`](#inkhudpersistence) @@ -77,11 +73,9 @@ The user should be given the choice to decide which information they would like The display image does not update "automatically". Individual applets are responsible for deciding when they have new information to show, and then requesting a display update. -### Avoid the Preprocessor +### No `#ifdef` spaghetti -**Don't** use preprocessor macros to write code which targets individual devices. - -**Do** configure InkHUD to suit each device in [`nicheGraphics.h`](#nichegraphicsh). +**Don't** use preprocessor macros for device-specific configuration. This should be achieved with config methods, in [`nicheGraphics.h`](#nichegraphicsh). **Do** use preprocessor macros to guard all files @@ -109,7 +103,7 @@ The display image does not update "automatically". Individual applets are respon (animated diagram) -animated process diagram of InkHUD rendering +animated process diagram of InkHUD rendering An overview: @@ -287,14 +281,11 @@ ${esp32s3_base.lib_deps} ### nicheGraphics.h -Should contain a `setupNicheGraphics` method, which creates and configures the various components for InkHUD. - -For well commented examples, see: +⚠ Wrap this file in `#ifdef MESHTASTIC_INCLUDE_NICHE_GRAPHICS` -- `/variants/heltec_vision_master_e290/nicheGraphics.h` (ESP32) -- `/variants/ELECROW-ThinkNode-M1/nicheGraphics.h` (NRF52) +`nicheGraphics.h` should be placed in the same folder as your variant's `platformio.ini`. If this is not possible, modify `build_src_filter`. -As a general overview: +`nicheGraphics.h` should contain a `setupNicheGraphics` method, which creates and configures the various components for InkHUD. - Display - Start SPI @@ -310,80 +301,10 @@ As a general overview: - Setup `TwoButton` driver (user button, optional "auxiliary" button) - Connect to InkHUD handlers (use lambdas) -## Fonts - -InkHUD uses AdafruitGFX fonts. The large and small font which are shared by all applets are set in nicheGraphics.h. - -```cpp -// Prepare fonts -InkHUD::Applet::fontLarge = FREESANS_9PT_WIN1252; -InkHUD::Applet::fontSmall = FREESANS_6PT_WIN1252; - -// Using a generic AdafruitGFX font instead: -// InkHUD::Applet::fontLarge = FreeSerif9pt7b; -``` - -Any generic AdafruitGFX font may be used, but the fonts which are bundled with InkHUD have been customized with extended-ASCII character sets. - -### Parsing Unicode Text - -Text received by the firmware is encoded as UTF-8. - -Applets must manually parse any text which may contain non-ASCII characters. Strings like text-messages and node names should be parsed. - -```cpp -std::string greeting = "Góðan daginn!"; -std::string parsed = parse(greeting); -``` - -This will re-encode the characters to match whichever extended-ASCII font InkHUD has been built with. - -### Localization - -InkHUD is bundled with extended-ASCII fonts for: - -- Windows-1250 (Central European) -- Windows-1251 (Cyrillic) -- Windows-1252 (Western European) - -The default builds use Windows-1252 encoding. This can be changed in nicheGraphics.h. - -```cpp -InkHUD::Applet::fontLarge = FREESANS_9PT_WIN1250; -InkHUD::Applet::fontSmall = FREESANS_6PT_WIN1250; - -InkHUD::Applet::fontLarge = FREESANS_9PT_WIN1251; -InkHUD::Applet::fontSmall = FREESANS_6PT_WIN1251; -``` - -### Creating / Modifying - -For basic conversion and editing, online tools might be sufficient: - -- [https://rop.nl/truetype2gfx/](https://rop.nl/truetype2gfx/) - converting from ttf -- [https://tchapi.github.io/Adafruit-GFX-Font-Customiser/](https://tchapi.github.io/Adafruit-GFX-Font-Customiser/) - editing glyphs - -For heavy editing, this offline workflow is suggested: - -- [FontForge](https://fontforge.org/en-US/) - - re-ordering glyphs - - Encoding > Load Encoding - - Encoding > Reencode - - .ttf to .bdf conversion - - Element > Bitmap Strikes Available.. - - File > Generate Fonts -- [GFXFontEditor](https://github.com/ScottFerg56/GFXFontEditor) - - manual glyph correction - - .bdf to AdafruitGFX .h conversion - - File > Edit Font Properties - - right-click glyph list, flatten font - - File > Save As - - manually edit exported .h - - remove `#include ` - -If possible, custom Extended-ASCII fonts should use one of the encodings which InkHUD already supports. If this is not possible, a mapping for the new encoding will need to be added. +For well commented examples, see: -See [Encoding](#encoding) for details on using an extended-ASCII font. +- `variants/heltec_vision_master_e290/nicheGraphics.h` (ESP32) +- `variants/t-echo/nicheGraphics.h` (NRF52) ## Class Notes @@ -707,30 +628,17 @@ The default AdafruitGFX text handling places characters "upon a line", as if han The height of this box is `AppletFont::lineHeight`, which is the height of the tallest character in the font. This gives us a fixed-height for text, which is much tighter than with AdafruitGFX's default line spacing. -#### Encoding - -An AppletFont may be constructed from a standard 7bit ASCII AdafruitGFX font, however InkHUD also supports 8bit extended-ASCII fonts. +#### UTF-8 Substitutions -For this, the encoding must be specified when instantiating the AppletFont. +To enable non-English text, the `AppletFont` class includes a mechanism to detect specific UTF-8 characters, and replace them with alternative glyphs from the AdafruitGFX font. This can be used to remap characters for a custom font, or to offer a suitable ASCII replacement. ```cpp -InkHUD::AppletFont(FreeSans9pt_Win1250, InkHUD::AppletFont::WINDOWS_1250); -``` - -Currently supported encodings are: - -- ASCII -- Windows-1250 (Central European) -- Windows-1251 (Cyrillic) -- Windows-1252 (Western European) +// With a custom font +// ї is ASCII 0xBF, in Windows-1251 encoding +addSubstitution("ї", "\xBF"); -To add support for additional encodings, add to the `AppletFont::Encodings` enum, and then define the mapping from unicode in `AppletFont::applyEncoding`. - -#### Custom Line Height - -Some fonts may have a handful of especially tall characters, especially extended-ASCII fonts with diacritcs. Ideally, the font should be modified to help resolve this, but if the problem remains, manual offsets to the automatically determined line height can be specified in the constructor. - -```cpp -// -2 px of padding above, +1 px of padding below -InkHUD::AppletFont(FreeSans9pt7b, ASCII, -2, 1); +// Substitution (with a default font) +addSubstitution("ö", "oe"); ``` + +These substitutions should be performed in a variant's `setupNicheGraphics` method. For convenience, some common ASCII encodings have ready-to-go sets of substitutions you can apply, for example `AppletFont::addSubstitutionsWin1251` diff --git a/src/main.cpp b/src/main.cpp index 1e46d9db17..452cb3526c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1300,6 +1300,10 @@ void setup() LOG_DEBUG("Free heap : %7d bytes", ESP.getFreeHeap()); LOG_DEBUG("Free PSRAM : %7d bytes", ESP.getFreePsram()); #endif +#if !defined(ARCH_STM32WL) + if (accelerometerThread) + accelerometerThread->calibrate(30); +#endif } #endif diff --git a/src/mesh/Channels.cpp b/src/mesh/Channels.cpp index 70e4127d83..2ba3499f1b 100644 --- a/src/mesh/Channels.cpp +++ b/src/mesh/Channels.cpp @@ -347,7 +347,7 @@ bool Channels::anyMqttEnabled() { #if USERPREFS_EVENT_MODE && !MESHTASTIC_EXCLUDE_MQTT // Don't publish messages on the public MQTT broker if we are in event mode - if (mqtt && mqtt->isUsingDefaultServer() && mqtt->isUsingDefaultRootTopic()) { + if (mqtt && mqtt->isUsingDefaultServer()) { return false; } #endif diff --git a/src/mesh/Default.h b/src/mesh/Default.h index 208f992c83..0daccbb6f4 100644 --- a/src/mesh/Default.h +++ b/src/mesh/Default.h @@ -21,14 +21,11 @@ #define default_neighbor_info_broadcast_secs 6 * 60 * 60 #define min_node_info_broadcast_secs 60 * 60 // No regular broadcasts of more than once an hour #define min_neighbor_info_broadcast_secs 4 * 60 * 60 -#define default_map_publish_interval_secs 60 * 60 #define default_mqtt_address "mqtt.meshtastic.org" #define default_mqtt_username "meshdev" #define default_mqtt_password "large4cats" #define default_mqtt_root "msh" -#define default_mqtt_encryption_enabled true -#define default_mqtt_tls_enabled false #define IF_ROUTER(routerVal, normalVal) \ ((config.device.role == meshtastic_Config_DeviceConfig_Role_ROUTER) ? (routerVal) : (normalVal)) diff --git a/src/mesh/LR11x0Interface.cpp b/src/mesh/LR11x0Interface.cpp index 8cc05994c3..aecc8f7221 100644 --- a/src/mesh/LR11x0Interface.cpp +++ b/src/mesh/LR11x0Interface.cpp @@ -71,8 +71,6 @@ template bool LR11x0Interface::init() RadioLibInterface::init(); - limitPower(); - if (power > LR1110_MAX_POWER) // Clamp power to maximum defined level power = LR1110_MAX_POWER; @@ -82,6 +80,8 @@ template bool LR11x0Interface::init() preambleLength = 12; // 12 is the default for operation above 2GHz } + limitPower(); + #ifdef LR11X0_RF_SWITCH_SUBGHZ pinMode(LR11X0_RF_SWITCH_SUBGHZ, OUTPUT); digitalWrite(LR11X0_RF_SWITCH_SUBGHZ, getFreq() < 1e9 ? HIGH : LOW); diff --git a/src/mesh/NodeDB.cpp b/src/mesh/NodeDB.cpp index 28af7d308a..b64cb0fe12 100644 --- a/src/mesh/NodeDB.cpp +++ b/src/mesh/NodeDB.cpp @@ -328,11 +328,6 @@ NodeDB::NodeDB() moduleConfig.telemetry.health_update_interval = Default::getConfiguredOrMinimumValue( moduleConfig.telemetry.health_update_interval, min_default_telemetry_interval_secs); } - if (moduleConfig.mqtt.has_map_report_settings && - moduleConfig.mqtt.map_report_settings.publish_interval_secs < default_map_publish_interval_secs) { - moduleConfig.mqtt.map_report_settings.publish_interval_secs = default_map_publish_interval_secs; - } - // Ensure that the neighbor info update interval is coerced to the minimum moduleConfig.neighbor_info.update_interval = Default::getConfiguredOrMinimumValue(moduleConfig.neighbor_info.update_interval, min_neighbor_info_broadcast_secs); @@ -766,39 +761,11 @@ void NodeDB::installDefaultModuleConfig() moduleConfig.has_canned_message = true; -#if USERPREFS_MQTT_ENABLED && !MESHTASTIC_EXCLUDE_MQTT - moduleConfig.mqtt.enabled = true; -#endif -#ifdef USERPREFS_MQTT_ADDRESS - strncpy(moduleConfig.mqtt.address, USERPREFS_MQTT_ADDRESS, sizeof(moduleConfig.mqtt.address)); -#else strncpy(moduleConfig.mqtt.address, default_mqtt_address, sizeof(moduleConfig.mqtt.address)); -#endif -#ifdef USERPREFS_MQTT_USERNAME - strncpy(moduleConfig.mqtt.username, USERPREFS_MQTT_USERNAME, sizeof(moduleConfig.mqtt.username)); -#else strncpy(moduleConfig.mqtt.username, default_mqtt_username, sizeof(moduleConfig.mqtt.username)); -#endif -#ifdef USERPREFS_MQTT_PASSWORD - strncpy(moduleConfig.mqtt.password, USERPREFS_MQTT_PASSWORD, sizeof(moduleConfig.mqtt.password)); -#else strncpy(moduleConfig.mqtt.password, default_mqtt_password, sizeof(moduleConfig.mqtt.password)); -#endif -#ifdef USERPREFS_MQTT_ROOT_TOPIC - strncpy(moduleConfig.mqtt.root, USERPREFS_MQTT_ROOT_TOPIC, sizeof(moduleConfig.mqtt.root)); -#else strncpy(moduleConfig.mqtt.root, default_mqtt_root, sizeof(moduleConfig.mqtt.root)); -#endif -#ifdef USERPREFS_MQTT_ENCRYPTION_ENABLED - moduleConfig.mqtt.encryption_enabled = USERPREFS_MQTT_ENCRYPTION_ENABLED; -#else - moduleConfig.mqtt.encryption_enabled = default_mqtt_encryption_enabled; -#endif -#ifdef USERPREFS_MQTT_TLS_ENABLED - moduleConfig.mqtt.tls_enabled = USERPREFS_MQTT_TLS_ENABLED; -#else - moduleConfig.mqtt.tls_enabled = default_mqtt_tls_enabled; -#endif + moduleConfig.mqtt.encryption_enabled = true; moduleConfig.has_neighbor_info = true; moduleConfig.neighbor_info.enabled = false; @@ -824,19 +791,10 @@ void NodeDB::installRoleDefaults(meshtastic_Config_DeviceConfig_Role role) initConfigIntervals(); initModuleConfigIntervals(); config.device.rebroadcast_mode = meshtastic_Config_DeviceConfig_RebroadcastMode_CORE_PORTNUMS_ONLY; - owner.has_is_unmessagable = true; - owner.is_unmessagable = true; - } else if (role == meshtastic_Config_DeviceConfig_Role_ROUTER_LATE) { - owner.has_is_unmessagable = true; - owner.is_unmessagable = true; } else if (role == meshtastic_Config_DeviceConfig_Role_REPEATER) { - owner.has_is_unmessagable = true; - owner.is_unmessagable = true; config.display.screen_on_secs = 1; config.device.rebroadcast_mode = meshtastic_Config_DeviceConfig_RebroadcastMode_CORE_PORTNUMS_ONLY; } else if (role == meshtastic_Config_DeviceConfig_Role_SENSOR) { - owner.has_is_unmessagable = true; - owner.is_unmessagable = true; moduleConfig.telemetry.environment_measurement_enabled = true; moduleConfig.telemetry.environment_update_interval = 300; } else if (role == meshtastic_Config_DeviceConfig_Role_LOST_AND_FOUND) { @@ -851,12 +809,7 @@ void NodeDB::installRoleDefaults(meshtastic_Config_DeviceConfig_Role role) (meshtastic_Config_PositionConfig_PositionFlags_ALTITUDE | meshtastic_Config_PositionConfig_PositionFlags_SPEED | meshtastic_Config_PositionConfig_PositionFlags_HEADING | meshtastic_Config_PositionConfig_PositionFlags_DOP); moduleConfig.telemetry.device_update_interval = ONE_DAY; - } else if (role == meshtastic_Config_DeviceConfig_Role_TRACKER) { - owner.has_is_unmessagable = true; - owner.is_unmessagable = true; } else if (role == meshtastic_Config_DeviceConfig_Role_TAK_TRACKER) { - owner.has_is_unmessagable = true; - owner.is_unmessagable = true; config.device.node_info_broadcast_secs = ONE_DAY; config.position.position_broadcast_smart_enabled = true; config.position.position_broadcast_secs = 3 * 60; // Every 3 minutes @@ -989,8 +942,6 @@ void NodeDB::installDefaultDeviceState() #endif snprintf(owner.id, sizeof(owner.id), "!%08x", getNodeNum()); // Default node ID now based on nodenum memcpy(owner.macaddr, ourMacAddr, sizeof(owner.macaddr)); - owner.has_is_unmessagable = true; - owner.is_unmessagable = false; } // We reserve a few nodenums for future use @@ -1504,28 +1455,6 @@ void NodeDB::updateTelemetry(uint32_t nodeId, const meshtastic_Telemetry &t, RxS notifyObservers(true); // Force an update whether or not our node counts have changed } -/** - * Update the node database with a new contact - */ -void NodeDB::addFromContact(meshtastic_SharedContact contact) -{ - meshtastic_NodeInfoLite *info = getOrCreateMeshNode(contact.node_num); - if (!info) { - return; - } - info->num = contact.node_num; - info->last_heard = getValidTime(RTCQualityNTP); - info->has_user = true; - info->user = TypeConversions::ConvertToUserLite(contact.user); - info->is_favorite = true; - // Mark the node's key as manually verified to indicate trustworthiness. - info->bitfield |= NODEINFO_BITFIELD_IS_KEY_MANUALLY_VERIFIED_MASK; - updateGUIforNode = info; - powerFSM.trigger(EVENT_NODEDB_UPDATED); - notifyObservers(true); // Force an update whether or not our node counts have changed - saveNodeDatabaseToDisk(); -} - /** Update user info and channel for this node based on received user data */ bool NodeDB::updateUser(uint32_t nodeId, meshtastic_User &p, uint8_t channelIndex) @@ -1655,10 +1584,8 @@ meshtastic_NodeInfoLite *NodeDB::getOrCreateMeshNode(NodeNum n) int oldestIndex = -1; int oldestBoringIndex = -1; for (int i = 1; i < numMeshNodes; i++) { - // Simply the oldest non-favorite, non-ignored, non-verified node - if (!meshNodes->at(i).is_favorite && !meshNodes->at(i).is_ignored && - !(meshNodes->at(i).bitfield & NODEINFO_BITFIELD_IS_KEY_MANUALLY_VERIFIED_MASK) && - meshNodes->at(i).last_heard < oldest) { + // Simply the oldest non-favorite node + if (!meshNodes->at(i).is_favorite && !meshNodes->at(i).is_ignored && meshNodes->at(i).last_heard < oldest) { oldest = meshNodes->at(i).last_heard; oldestIndex = i; } diff --git a/src/mesh/NodeDB.h b/src/mesh/NodeDB.h index 16159d3806..291c3804be 100644 --- a/src/mesh/NodeDB.h +++ b/src/mesh/NodeDB.h @@ -110,8 +110,6 @@ class NodeDB /// we updateGUI and updateGUIforNode if we think our this change is big enough for a redraw void updateFrom(const meshtastic_MeshPacket &p); - void addFromContact(const meshtastic_SharedContact); - /** Update position info for this node based on received position data */ void updatePosition(uint32_t nodeId, const meshtastic_Position &p, RxSource src = RX_SRC_RADIO); @@ -274,8 +272,6 @@ extern meshtastic_CriticalErrorCode error_code; * A numeric error address (nonzero if available) */ extern uint32_t error_address; -#define NODEINFO_BITFIELD_IS_KEY_MANUALLY_VERIFIED_SHIFT 0 -#define NODEINFO_BITFIELD_IS_KEY_MANUALLY_VERIFIED_MASK (1 << NODEINFO_BITFIELD_IS_KEY_MANUALLY_VERIFIED_SHIFT) #define Module_Config_size \ (ModuleConfig_CannedMessageConfig_size + ModuleConfig_ExternalNotificationConfig_size + ModuleConfig_MQTTConfig_size + \ diff --git a/src/mesh/RF95Interface.cpp b/src/mesh/RF95Interface.cpp index 943a79a5f4..1dfc727083 100644 --- a/src/mesh/RF95Interface.cpp +++ b/src/mesh/RF95Interface.cpp @@ -122,11 +122,11 @@ bool RF95Interface::init() power = dacDbValues.db; #endif - limitPower(); - if (power > RF95_MAX_POWER) // This chip has lower power limits than some power = RF95_MAX_POWER; + limitPower(); + iface = lora = new RadioLibRF95(&module); #ifdef RF95_TCXO diff --git a/src/mesh/RadioInterface.cpp b/src/mesh/RadioInterface.cpp index 06398e6c36..86903153b0 100644 --- a/src/mesh/RadioInterface.cpp +++ b/src/mesh/RadioInterface.cpp @@ -528,8 +528,8 @@ void RadioInterface::applyModemConfig() power = loraConfig.tx_power; - if ((power == 0) || ((power > myRegion->powerLimit) && !devicestate.owner.is_licensed)) - power = myRegion->powerLimit; + if ((power == 0) || ((power + REGULATORY_GAIN_LORA > myRegion->powerLimit) && !devicestate.owner.is_licensed)) + power = myRegion->powerLimit - REGULATORY_GAIN_LORA; if (power == 0) power = 17; // Default to this power level if we don't have a valid regional power limit (powerLimit of myRegion defaults @@ -616,12 +616,7 @@ void RadioInterface::limitPower() power = maxPower; } - if (TX_GAIN_LORA > 0) { - LOG_INFO("Requested Tx power: %d dBm; Device LoRa Tx gain: %d dB", power, TX_GAIN_LORA); - power -= TX_GAIN_LORA; - } - - LOG_INFO("Final Tx power: %d dBm", power); + LOG_INFO("Set radio: final power level=%d", power); } void RadioInterface::deliverToReceiver(meshtastic_MeshPacket *p) diff --git a/src/mesh/STM32WLE5JCInterface.cpp b/src/mesh/STM32WLE5JCInterface.cpp index 3c8bf89c33..6a340dd281 100644 --- a/src/mesh/STM32WLE5JCInterface.cpp +++ b/src/mesh/STM32WLE5JCInterface.cpp @@ -25,11 +25,11 @@ bool STM32WLE5JCInterface::init() lora.setRfSwitchTable(rfswitch_pins, rfswitch_table); - limitPower(); - if (power > STM32WLx_MAX_POWER) // This chip has lower power limits than some power = STM32WLx_MAX_POWER; + limitPower(); + int res = lora.begin(getFreq(), bw, sf, cr, syncWord, power, preambleLength, tcxoVoltage); LOG_INFO("STM32WLx init result %d", res); diff --git a/src/mesh/SX126xInterface.cpp b/src/mesh/SX126xInterface.cpp index e5ecd9302f..c867466b72 100644 --- a/src/mesh/SX126xInterface.cpp +++ b/src/mesh/SX126xInterface.cpp @@ -69,11 +69,11 @@ template bool SX126xInterface::init() RadioLibInterface::init(); - limitPower(); - if (power > SX126X_MAX_POWER) // Clamp power to maximum defined level power = SX126X_MAX_POWER; + limitPower(); + int res = lora.begin(getFreq(), bw, sf, cr, syncWord, power, preambleLength, tcxoVoltage, useRegulatorLDO); // \todo Display actual typename of the adapter, not just `SX126x` LOG_INFO("SX126x init result %d", res); diff --git a/src/mesh/SX128xInterface.cpp b/src/mesh/SX128xInterface.cpp index 2b17543fc7..23a023d3f1 100644 --- a/src/mesh/SX128xInterface.cpp +++ b/src/mesh/SX128xInterface.cpp @@ -62,11 +62,11 @@ template bool SX128xInterface::init() RadioLibInterface::init(); - limitPower(); - if (power > SX128X_MAX_POWER) // This chip has lower power limits than some power = SX128X_MAX_POWER; + limitPower(); + preambleLength = 12; // 12 is the default for this chip, 32 does not RX at all int res = lora.begin(getFreq(), bw, sf, cr, syncWord, power, preambleLength); diff --git a/src/mesh/TypeConversions.cpp b/src/mesh/TypeConversions.cpp index c47a67e680..5fc6b8a646 100644 --- a/src/mesh/TypeConversions.cpp +++ b/src/mesh/TypeConversions.cpp @@ -13,7 +13,6 @@ meshtastic_NodeInfo TypeConversions::ConvertToNodeInfo(const meshtastic_NodeInfo info.via_mqtt = lite->via_mqtt; info.is_favorite = lite->is_favorite; info.is_ignored = lite->is_ignored; - info.is_key_manually_verified = lite->bitfield & NODEINFO_BITFIELD_IS_KEY_MANUALLY_VERIFIED_MASK; if (lite->has_hops_away) { info.has_hops_away = true; diff --git a/src/mesh/generated/meshtastic/admin.pb.h b/src/mesh/generated/meshtastic/admin.pb.h index 0a46e62758..09499b0757 100644 --- a/src/mesh/generated/meshtastic/admin.pb.h +++ b/src/mesh/generated/meshtastic/admin.pb.h @@ -446,7 +446,7 @@ extern const pb_msgdesc_t meshtastic_SharedContact_msg; #define meshtastic_AdminMessage_size 511 #define meshtastic_HamParameters_size 31 #define meshtastic_NodeRemoteHardwarePinsResponse_size 496 -#define meshtastic_SharedContact_size 123 +#define meshtastic_SharedContact_size 121 #ifdef __cplusplus } /* extern "C" */ diff --git a/src/mesh/generated/meshtastic/deviceonly.pb.h b/src/mesh/generated/meshtastic/deviceonly.pb.h index 2436098dac..83563a9fc8 100644 --- a/src/mesh/generated/meshtastic/deviceonly.pb.h +++ b/src/mesh/generated/meshtastic/deviceonly.pb.h @@ -58,9 +58,6 @@ typedef struct _meshtastic_UserLite { /* The public key of the user's device. This is sent out to other nodes on the mesh to allow them to compute a shared secret key. */ meshtastic_UserLite_public_key_t public_key; - /* Whether or not the node can be messaged */ - bool has_is_unmessagable; - bool is_unmessagable; } meshtastic_UserLite; typedef struct _meshtastic_NodeInfoLite { @@ -96,9 +93,6 @@ typedef struct _meshtastic_NodeInfoLite { bool is_ignored; /* Last byte of the node number of the node that should be used as the next hop to reach this node. */ uint8_t next_hop; - /* Bitfield for storing booleans. - LSB 0 is_key_manually_verified */ - uint32_t bitfield; } meshtastic_NodeInfoLite; /* This message is never sent over the wire, but it is used for serializing DB @@ -189,15 +183,15 @@ extern "C" { /* Initializer values for message structs */ #define meshtastic_PositionLite_init_default {0, 0, 0, 0, _meshtastic_Position_LocSource_MIN} -#define meshtastic_UserLite_init_default {{0}, "", "", _meshtastic_HardwareModel_MIN, 0, _meshtastic_Config_DeviceConfig_Role_MIN, {0, {0}}, false, 0} -#define meshtastic_NodeInfoLite_init_default {0, false, meshtastic_UserLite_init_default, false, meshtastic_PositionLite_init_default, 0, 0, false, meshtastic_DeviceMetrics_init_default, 0, 0, false, 0, 0, 0, 0, 0} +#define meshtastic_UserLite_init_default {{0}, "", "", _meshtastic_HardwareModel_MIN, 0, _meshtastic_Config_DeviceConfig_Role_MIN, {0, {0}}} +#define meshtastic_NodeInfoLite_init_default {0, false, meshtastic_UserLite_init_default, false, meshtastic_PositionLite_init_default, 0, 0, false, meshtastic_DeviceMetrics_init_default, 0, 0, false, 0, 0, 0, 0} #define meshtastic_DeviceState_init_default {false, meshtastic_MyNodeInfo_init_default, false, meshtastic_User_init_default, 0, {meshtastic_MeshPacket_init_default}, false, meshtastic_MeshPacket_init_default, 0, 0, 0, false, meshtastic_MeshPacket_init_default, 0, {meshtastic_NodeRemoteHardwarePin_init_default, meshtastic_NodeRemoteHardwarePin_init_default, meshtastic_NodeRemoteHardwarePin_init_default, meshtastic_NodeRemoteHardwarePin_init_default, meshtastic_NodeRemoteHardwarePin_init_default, meshtastic_NodeRemoteHardwarePin_init_default, meshtastic_NodeRemoteHardwarePin_init_default, meshtastic_NodeRemoteHardwarePin_init_default, meshtastic_NodeRemoteHardwarePin_init_default, meshtastic_NodeRemoteHardwarePin_init_default, meshtastic_NodeRemoteHardwarePin_init_default, meshtastic_NodeRemoteHardwarePin_init_default}} #define meshtastic_NodeDatabase_init_default {0, {0}} #define meshtastic_ChannelFile_init_default {0, {meshtastic_Channel_init_default, meshtastic_Channel_init_default, meshtastic_Channel_init_default, meshtastic_Channel_init_default, meshtastic_Channel_init_default, meshtastic_Channel_init_default, meshtastic_Channel_init_default, meshtastic_Channel_init_default}, 0} #define meshtastic_BackupPreferences_init_default {0, 0, false, meshtastic_LocalConfig_init_default, false, meshtastic_LocalModuleConfig_init_default, false, meshtastic_ChannelFile_init_default, false, meshtastic_User_init_default} #define meshtastic_PositionLite_init_zero {0, 0, 0, 0, _meshtastic_Position_LocSource_MIN} -#define meshtastic_UserLite_init_zero {{0}, "", "", _meshtastic_HardwareModel_MIN, 0, _meshtastic_Config_DeviceConfig_Role_MIN, {0, {0}}, false, 0} -#define meshtastic_NodeInfoLite_init_zero {0, false, meshtastic_UserLite_init_zero, false, meshtastic_PositionLite_init_zero, 0, 0, false, meshtastic_DeviceMetrics_init_zero, 0, 0, false, 0, 0, 0, 0, 0} +#define meshtastic_UserLite_init_zero {{0}, "", "", _meshtastic_HardwareModel_MIN, 0, _meshtastic_Config_DeviceConfig_Role_MIN, {0, {0}}} +#define meshtastic_NodeInfoLite_init_zero {0, false, meshtastic_UserLite_init_zero, false, meshtastic_PositionLite_init_zero, 0, 0, false, meshtastic_DeviceMetrics_init_zero, 0, 0, false, 0, 0, 0, 0} #define meshtastic_DeviceState_init_zero {false, meshtastic_MyNodeInfo_init_zero, false, meshtastic_User_init_zero, 0, {meshtastic_MeshPacket_init_zero}, false, meshtastic_MeshPacket_init_zero, 0, 0, 0, false, meshtastic_MeshPacket_init_zero, 0, {meshtastic_NodeRemoteHardwarePin_init_zero, meshtastic_NodeRemoteHardwarePin_init_zero, meshtastic_NodeRemoteHardwarePin_init_zero, meshtastic_NodeRemoteHardwarePin_init_zero, meshtastic_NodeRemoteHardwarePin_init_zero, meshtastic_NodeRemoteHardwarePin_init_zero, meshtastic_NodeRemoteHardwarePin_init_zero, meshtastic_NodeRemoteHardwarePin_init_zero, meshtastic_NodeRemoteHardwarePin_init_zero, meshtastic_NodeRemoteHardwarePin_init_zero, meshtastic_NodeRemoteHardwarePin_init_zero, meshtastic_NodeRemoteHardwarePin_init_zero}} #define meshtastic_NodeDatabase_init_zero {0, {0}} #define meshtastic_ChannelFile_init_zero {0, {meshtastic_Channel_init_zero, meshtastic_Channel_init_zero, meshtastic_Channel_init_zero, meshtastic_Channel_init_zero, meshtastic_Channel_init_zero, meshtastic_Channel_init_zero, meshtastic_Channel_init_zero, meshtastic_Channel_init_zero}, 0} @@ -216,7 +210,6 @@ extern "C" { #define meshtastic_UserLite_is_licensed_tag 5 #define meshtastic_UserLite_role_tag 6 #define meshtastic_UserLite_public_key_tag 7 -#define meshtastic_UserLite_is_unmessagable_tag 9 #define meshtastic_NodeInfoLite_num_tag 1 #define meshtastic_NodeInfoLite_user_tag 2 #define meshtastic_NodeInfoLite_position_tag 3 @@ -229,7 +222,6 @@ extern "C" { #define meshtastic_NodeInfoLite_is_favorite_tag 10 #define meshtastic_NodeInfoLite_is_ignored_tag 11 #define meshtastic_NodeInfoLite_next_hop_tag 12 -#define meshtastic_NodeInfoLite_bitfield_tag 13 #define meshtastic_DeviceState_my_node_tag 2 #define meshtastic_DeviceState_owner_tag 3 #define meshtastic_DeviceState_receive_queue_tag 5 @@ -267,8 +259,7 @@ X(a, STATIC, SINGULAR, STRING, short_name, 3) \ X(a, STATIC, SINGULAR, UENUM, hw_model, 4) \ X(a, STATIC, SINGULAR, BOOL, is_licensed, 5) \ X(a, STATIC, SINGULAR, UENUM, role, 6) \ -X(a, STATIC, SINGULAR, BYTES, public_key, 7) \ -X(a, STATIC, OPTIONAL, BOOL, is_unmessagable, 9) +X(a, STATIC, SINGULAR, BYTES, public_key, 7) #define meshtastic_UserLite_CALLBACK NULL #define meshtastic_UserLite_DEFAULT NULL @@ -284,8 +275,7 @@ X(a, STATIC, SINGULAR, BOOL, via_mqtt, 8) \ X(a, STATIC, OPTIONAL, UINT32, hops_away, 9) \ X(a, STATIC, SINGULAR, BOOL, is_favorite, 10) \ X(a, STATIC, SINGULAR, BOOL, is_ignored, 11) \ -X(a, STATIC, SINGULAR, UINT32, next_hop, 12) \ -X(a, STATIC, SINGULAR, UINT32, bitfield, 13) +X(a, STATIC, SINGULAR, UINT32, next_hop, 12) #define meshtastic_NodeInfoLite_CALLBACK NULL #define meshtastic_NodeInfoLite_DEFAULT NULL #define meshtastic_NodeInfoLite_user_MSGTYPE meshtastic_UserLite @@ -360,12 +350,12 @@ extern const pb_msgdesc_t meshtastic_BackupPreferences_msg; /* Maximum encoded size of messages (where known) */ /* meshtastic_NodeDatabase_size depends on runtime parameters */ #define MESHTASTIC_MESHTASTIC_DEVICEONLY_PB_H_MAX_SIZE meshtastic_BackupPreferences_size -#define meshtastic_BackupPreferences_size 2267 +#define meshtastic_BackupPreferences_size 2263 #define meshtastic_ChannelFile_size 718 -#define meshtastic_DeviceState_size 1722 -#define meshtastic_NodeInfoLite_size 196 +#define meshtastic_DeviceState_size 1720 +#define meshtastic_NodeInfoLite_size 188 #define meshtastic_PositionLite_size 28 -#define meshtastic_UserLite_size 98 +#define meshtastic_UserLite_size 96 #ifdef __cplusplus } /* extern "C" */ diff --git a/src/mesh/generated/meshtastic/localonly.pb.h b/src/mesh/generated/meshtastic/localonly.pb.h index 53d8d7d800..6a59b8eb0d 100644 --- a/src/mesh/generated/meshtastic/localonly.pb.h +++ b/src/mesh/generated/meshtastic/localonly.pb.h @@ -188,7 +188,7 @@ extern const pb_msgdesc_t meshtastic_LocalModuleConfig_msg; /* Maximum encoded size of messages (where known) */ #define MESHTASTIC_MESHTASTIC_LOCALONLY_PB_H_MAX_SIZE meshtastic_LocalConfig_size #define meshtastic_LocalConfig_size 743 -#define meshtastic_LocalModuleConfig_size 669 +#define meshtastic_LocalModuleConfig_size 667 #ifdef __cplusplus } /* extern "C" */ diff --git a/src/mesh/generated/meshtastic/mesh.pb.h b/src/mesh/generated/meshtastic/mesh.pb.h index d6816eeef1..6fa0b60b0d 100644 --- a/src/mesh/generated/meshtastic/mesh.pb.h +++ b/src/mesh/generated/meshtastic/mesh.pb.h @@ -609,9 +609,6 @@ typedef struct _meshtastic_User { /* The public key of the user's device. This is sent out to other nodes on the mesh to allow them to compute a shared secret key. */ meshtastic_User_public_key_t public_key; - /* Whether or not the node can be messaged */ - bool has_is_unmessagable; - bool is_unmessagable; } meshtastic_User; /* A message used in a traceroute */ @@ -854,10 +851,6 @@ typedef struct _meshtastic_NodeInfo { /* True if node is in our ignored list Persists between NodeDB internal clean ups */ bool is_ignored; - /* True if node public key has been verified. - Persists between NodeDB internal clean ups - LSB 0 of the bitfield */ - bool is_key_manually_verified; } meshtastic_NodeInfo; typedef PB_BYTES_ARRAY_T(16) meshtastic_MyNodeInfo_device_id_t; @@ -1211,14 +1204,14 @@ extern "C" { /* Initializer values for message structs */ #define meshtastic_Position_init_default {false, 0, false, 0, false, 0, 0, _meshtastic_Position_LocSource_MIN, _meshtastic_Position_AltSource_MIN, 0, 0, false, 0, false, 0, 0, 0, 0, 0, false, 0, false, 0, 0, 0, 0, 0, 0, 0, 0} -#define meshtastic_User_init_default {"", "", "", {0}, _meshtastic_HardwareModel_MIN, 0, _meshtastic_Config_DeviceConfig_Role_MIN, {0, {0}}, false, 0} +#define meshtastic_User_init_default {"", "", "", {0}, _meshtastic_HardwareModel_MIN, 0, _meshtastic_Config_DeviceConfig_Role_MIN, {0, {0}}} #define meshtastic_RouteDiscovery_init_default {0, {0, 0, 0, 0, 0, 0, 0, 0}, 0, {0, 0, 0, 0, 0, 0, 0, 0}, 0, {0, 0, 0, 0, 0, 0, 0, 0}, 0, {0, 0, 0, 0, 0, 0, 0, 0}} #define meshtastic_Routing_init_default {0, {meshtastic_RouteDiscovery_init_default}} #define meshtastic_Data_init_default {_meshtastic_PortNum_MIN, {0, {0}}, 0, 0, 0, 0, 0, 0, false, 0} #define meshtastic_Waypoint_init_default {0, false, 0, false, 0, 0, 0, "", "", 0} #define meshtastic_MqttClientProxyMessage_init_default {"", 0, {{0, {0}}}, 0} #define meshtastic_MeshPacket_init_default {0, 0, 0, 0, {meshtastic_Data_init_default}, 0, 0, 0, 0, 0, _meshtastic_MeshPacket_Priority_MIN, 0, _meshtastic_MeshPacket_Delayed_MIN, 0, 0, {0, {0}}, 0, 0, 0, 0} -#define meshtastic_NodeInfo_init_default {0, false, meshtastic_User_init_default, false, meshtastic_Position_init_default, 0, 0, false, meshtastic_DeviceMetrics_init_default, 0, 0, false, 0, 0, 0, 0} +#define meshtastic_NodeInfo_init_default {0, false, meshtastic_User_init_default, false, meshtastic_Position_init_default, 0, 0, false, meshtastic_DeviceMetrics_init_default, 0, 0, false, 0, 0, 0} #define meshtastic_MyNodeInfo_init_default {0, 0, 0, {0, {0}}, ""} #define meshtastic_LogRecord_init_default {"", 0, "", _meshtastic_LogRecord_Level_MIN} #define meshtastic_QueueStatus_init_default {0, 0, 0, 0} @@ -1236,14 +1229,14 @@ extern "C" { #define meshtastic_resend_chunks_init_default {{{NULL}, NULL}} #define meshtastic_ChunkedPayloadResponse_init_default {0, 0, {0}} #define meshtastic_Position_init_zero {false, 0, false, 0, false, 0, 0, _meshtastic_Position_LocSource_MIN, _meshtastic_Position_AltSource_MIN, 0, 0, false, 0, false, 0, 0, 0, 0, 0, false, 0, false, 0, 0, 0, 0, 0, 0, 0, 0} -#define meshtastic_User_init_zero {"", "", "", {0}, _meshtastic_HardwareModel_MIN, 0, _meshtastic_Config_DeviceConfig_Role_MIN, {0, {0}}, false, 0} +#define meshtastic_User_init_zero {"", "", "", {0}, _meshtastic_HardwareModel_MIN, 0, _meshtastic_Config_DeviceConfig_Role_MIN, {0, {0}}} #define meshtastic_RouteDiscovery_init_zero {0, {0, 0, 0, 0, 0, 0, 0, 0}, 0, {0, 0, 0, 0, 0, 0, 0, 0}, 0, {0, 0, 0, 0, 0, 0, 0, 0}, 0, {0, 0, 0, 0, 0, 0, 0, 0}} #define meshtastic_Routing_init_zero {0, {meshtastic_RouteDiscovery_init_zero}} #define meshtastic_Data_init_zero {_meshtastic_PortNum_MIN, {0, {0}}, 0, 0, 0, 0, 0, 0, false, 0} #define meshtastic_Waypoint_init_zero {0, false, 0, false, 0, 0, 0, "", "", 0} #define meshtastic_MqttClientProxyMessage_init_zero {"", 0, {{0, {0}}}, 0} #define meshtastic_MeshPacket_init_zero {0, 0, 0, 0, {meshtastic_Data_init_zero}, 0, 0, 0, 0, 0, _meshtastic_MeshPacket_Priority_MIN, 0, _meshtastic_MeshPacket_Delayed_MIN, 0, 0, {0, {0}}, 0, 0, 0, 0} -#define meshtastic_NodeInfo_init_zero {0, false, meshtastic_User_init_zero, false, meshtastic_Position_init_zero, 0, 0, false, meshtastic_DeviceMetrics_init_zero, 0, 0, false, 0, 0, 0, 0} +#define meshtastic_NodeInfo_init_zero {0, false, meshtastic_User_init_zero, false, meshtastic_Position_init_zero, 0, 0, false, meshtastic_DeviceMetrics_init_zero, 0, 0, false, 0, 0, 0} #define meshtastic_MyNodeInfo_init_zero {0, 0, 0, {0, {0}}, ""} #define meshtastic_LogRecord_init_zero {"", 0, "", _meshtastic_LogRecord_Level_MIN} #define meshtastic_QueueStatus_init_zero {0, 0, 0, 0} @@ -1293,7 +1286,6 @@ extern "C" { #define meshtastic_User_is_licensed_tag 6 #define meshtastic_User_role_tag 7 #define meshtastic_User_public_key_tag 8 -#define meshtastic_User_is_unmessagable_tag 9 #define meshtastic_RouteDiscovery_route_tag 1 #define meshtastic_RouteDiscovery_snr_towards_tag 2 #define meshtastic_RouteDiscovery_route_back_tag 3 @@ -1353,7 +1345,6 @@ extern "C" { #define meshtastic_NodeInfo_hops_away_tag 9 #define meshtastic_NodeInfo_is_favorite_tag 10 #define meshtastic_NodeInfo_is_ignored_tag 11 -#define meshtastic_NodeInfo_is_key_manually_verified_tag 12 #define meshtastic_MyNodeInfo_my_node_num_tag 1 #define meshtastic_MyNodeInfo_reboot_count_tag 8 #define meshtastic_MyNodeInfo_min_app_version_tag 11 @@ -1466,8 +1457,7 @@ X(a, STATIC, SINGULAR, FIXED_LENGTH_BYTES, macaddr, 4) \ X(a, STATIC, SINGULAR, UENUM, hw_model, 5) \ X(a, STATIC, SINGULAR, BOOL, is_licensed, 6) \ X(a, STATIC, SINGULAR, UENUM, role, 7) \ -X(a, STATIC, SINGULAR, BYTES, public_key, 8) \ -X(a, STATIC, OPTIONAL, BOOL, is_unmessagable, 9) +X(a, STATIC, SINGULAR, BYTES, public_key, 8) #define meshtastic_User_CALLBACK NULL #define meshtastic_User_DEFAULT NULL @@ -1557,8 +1547,7 @@ X(a, STATIC, SINGULAR, UINT32, channel, 7) \ X(a, STATIC, SINGULAR, BOOL, via_mqtt, 8) \ X(a, STATIC, OPTIONAL, UINT32, hops_away, 9) \ X(a, STATIC, SINGULAR, BOOL, is_favorite, 10) \ -X(a, STATIC, SINGULAR, BOOL, is_ignored, 11) \ -X(a, STATIC, SINGULAR, BOOL, is_key_manually_verified, 12) +X(a, STATIC, SINGULAR, BOOL, is_ignored, 11) #define meshtastic_NodeInfo_CALLBACK NULL #define meshtastic_NodeInfo_DEFAULT NULL #define meshtastic_NodeInfo_user_MSGTYPE meshtastic_User @@ -1797,14 +1786,14 @@ extern const pb_msgdesc_t meshtastic_ChunkedPayloadResponse_msg; #define meshtastic_MyNodeInfo_size 77 #define meshtastic_NeighborInfo_size 258 #define meshtastic_Neighbor_size 22 -#define meshtastic_NodeInfo_size 323 +#define meshtastic_NodeInfo_size 319 #define meshtastic_NodeRemoteHardwarePin_size 29 #define meshtastic_Position_size 144 #define meshtastic_QueueStatus_size 23 #define meshtastic_RouteDiscovery_size 256 #define meshtastic_Routing_size 259 #define meshtastic_ToRadio_size 504 -#define meshtastic_User_size 115 +#define meshtastic_User_size 113 #define meshtastic_Waypoint_size 165 #ifdef __cplusplus diff --git a/src/mesh/generated/meshtastic/module_config.pb.h b/src/mesh/generated/meshtastic/module_config.pb.h index e8ae480720..dbf6ddb2e1 100644 --- a/src/mesh/generated/meshtastic/module_config.pb.h +++ b/src/mesh/generated/meshtastic/module_config.pb.h @@ -112,8 +112,6 @@ typedef struct _meshtastic_ModuleConfig_MapReportSettings { uint32_t publish_interval_secs; /* Bits of precision for the location sent (default of 32 is full precision). */ uint32_t position_precision; - /* Whether we have opted-in to report our location to the map */ - bool should_report_location; } meshtastic_ModuleConfig_MapReportSettings; /* MQTT Client Config */ @@ -507,7 +505,7 @@ extern "C" { /* Initializer values for message structs */ #define meshtastic_ModuleConfig_init_default {0, {meshtastic_ModuleConfig_MQTTConfig_init_default}} #define meshtastic_ModuleConfig_MQTTConfig_init_default {0, "", "", "", 0, 0, 0, "", 0, 0, false, meshtastic_ModuleConfig_MapReportSettings_init_default} -#define meshtastic_ModuleConfig_MapReportSettings_init_default {0, 0, 0} +#define meshtastic_ModuleConfig_MapReportSettings_init_default {0, 0} #define meshtastic_ModuleConfig_RemoteHardwareConfig_init_default {0, 0, 0, {meshtastic_RemoteHardwarePin_init_default, meshtastic_RemoteHardwarePin_init_default, meshtastic_RemoteHardwarePin_init_default, meshtastic_RemoteHardwarePin_init_default}} #define meshtastic_ModuleConfig_NeighborInfoConfig_init_default {0, 0, 0} #define meshtastic_ModuleConfig_DetectionSensorConfig_init_default {0, 0, 0, 0, "", 0, _meshtastic_ModuleConfig_DetectionSensorConfig_TriggerType_MIN, 0} @@ -523,7 +521,7 @@ extern "C" { #define meshtastic_RemoteHardwarePin_init_default {0, "", _meshtastic_RemoteHardwarePinType_MIN} #define meshtastic_ModuleConfig_init_zero {0, {meshtastic_ModuleConfig_MQTTConfig_init_zero}} #define meshtastic_ModuleConfig_MQTTConfig_init_zero {0, "", "", "", 0, 0, 0, "", 0, 0, false, meshtastic_ModuleConfig_MapReportSettings_init_zero} -#define meshtastic_ModuleConfig_MapReportSettings_init_zero {0, 0, 0} +#define meshtastic_ModuleConfig_MapReportSettings_init_zero {0, 0} #define meshtastic_ModuleConfig_RemoteHardwareConfig_init_zero {0, 0, 0, {meshtastic_RemoteHardwarePin_init_zero, meshtastic_RemoteHardwarePin_init_zero, meshtastic_RemoteHardwarePin_init_zero, meshtastic_RemoteHardwarePin_init_zero}} #define meshtastic_ModuleConfig_NeighborInfoConfig_init_zero {0, 0, 0} #define meshtastic_ModuleConfig_DetectionSensorConfig_init_zero {0, 0, 0, 0, "", 0, _meshtastic_ModuleConfig_DetectionSensorConfig_TriggerType_MIN, 0} @@ -541,7 +539,6 @@ extern "C" { /* Field tags (for use in manual encoding/decoding) */ #define meshtastic_ModuleConfig_MapReportSettings_publish_interval_secs_tag 1 #define meshtastic_ModuleConfig_MapReportSettings_position_precision_tag 2 -#define meshtastic_ModuleConfig_MapReportSettings_should_report_location_tag 3 #define meshtastic_ModuleConfig_MQTTConfig_enabled_tag 1 #define meshtastic_ModuleConfig_MQTTConfig_address_tag 2 #define meshtastic_ModuleConfig_MQTTConfig_username_tag 3 @@ -705,8 +702,7 @@ X(a, STATIC, OPTIONAL, MESSAGE, map_report_settings, 11) #define meshtastic_ModuleConfig_MapReportSettings_FIELDLIST(X, a) \ X(a, STATIC, SINGULAR, UINT32, publish_interval_secs, 1) \ -X(a, STATIC, SINGULAR, UINT32, position_precision, 2) \ -X(a, STATIC, SINGULAR, BOOL, should_report_location, 3) +X(a, STATIC, SINGULAR, UINT32, position_precision, 2) #define meshtastic_ModuleConfig_MapReportSettings_CALLBACK NULL #define meshtastic_ModuleConfig_MapReportSettings_DEFAULT NULL @@ -894,8 +890,8 @@ extern const pb_msgdesc_t meshtastic_RemoteHardwarePin_msg; #define meshtastic_ModuleConfig_CannedMessageConfig_size 49 #define meshtastic_ModuleConfig_DetectionSensorConfig_size 44 #define meshtastic_ModuleConfig_ExternalNotificationConfig_size 42 -#define meshtastic_ModuleConfig_MQTTConfig_size 224 -#define meshtastic_ModuleConfig_MapReportSettings_size 14 +#define meshtastic_ModuleConfig_MQTTConfig_size 222 +#define meshtastic_ModuleConfig_MapReportSettings_size 12 #define meshtastic_ModuleConfig_NeighborInfoConfig_size 10 #define meshtastic_ModuleConfig_PaxcounterConfig_size 30 #define meshtastic_ModuleConfig_RangeTestConfig_size 10 @@ -903,7 +899,7 @@ extern const pb_msgdesc_t meshtastic_RemoteHardwarePin_msg; #define meshtastic_ModuleConfig_SerialConfig_size 28 #define meshtastic_ModuleConfig_StoreForwardConfig_size 24 #define meshtastic_ModuleConfig_TelemetryConfig_size 46 -#define meshtastic_ModuleConfig_size 227 +#define meshtastic_ModuleConfig_size 225 #define meshtastic_RemoteHardwarePin_size 21 #ifdef __cplusplus diff --git a/src/mesh/generated/meshtastic/mqtt.pb.h b/src/mesh/generated/meshtastic/mqtt.pb.h index c5b10f1f58..1726bc470c 100644 --- a/src/mesh/generated/meshtastic/mqtt.pb.h +++ b/src/mesh/generated/meshtastic/mqtt.pb.h @@ -54,9 +54,6 @@ typedef struct _meshtastic_MapReport { uint32_t position_precision; /* Number of online nodes (heard in the last 2 hours) this node has in its list that were received locally (not via MQTT) */ uint16_t num_online_local_nodes; - /* User has opted in to share their location (map report) with the mqtt server - Controlled by map_report.should_report_location */ - bool has_opted_report_location; } meshtastic_MapReport; @@ -66,9 +63,9 @@ extern "C" { /* Initializer values for message structs */ #define meshtastic_ServiceEnvelope_init_default {NULL, NULL, NULL} -#define meshtastic_MapReport_init_default {"", "", _meshtastic_Config_DeviceConfig_Role_MIN, _meshtastic_HardwareModel_MIN, "", _meshtastic_Config_LoRaConfig_RegionCode_MIN, _meshtastic_Config_LoRaConfig_ModemPreset_MIN, 0, 0, 0, 0, 0, 0, 0} +#define meshtastic_MapReport_init_default {"", "", _meshtastic_Config_DeviceConfig_Role_MIN, _meshtastic_HardwareModel_MIN, "", _meshtastic_Config_LoRaConfig_RegionCode_MIN, _meshtastic_Config_LoRaConfig_ModemPreset_MIN, 0, 0, 0, 0, 0, 0} #define meshtastic_ServiceEnvelope_init_zero {NULL, NULL, NULL} -#define meshtastic_MapReport_init_zero {"", "", _meshtastic_Config_DeviceConfig_Role_MIN, _meshtastic_HardwareModel_MIN, "", _meshtastic_Config_LoRaConfig_RegionCode_MIN, _meshtastic_Config_LoRaConfig_ModemPreset_MIN, 0, 0, 0, 0, 0, 0, 0} +#define meshtastic_MapReport_init_zero {"", "", _meshtastic_Config_DeviceConfig_Role_MIN, _meshtastic_HardwareModel_MIN, "", _meshtastic_Config_LoRaConfig_RegionCode_MIN, _meshtastic_Config_LoRaConfig_ModemPreset_MIN, 0, 0, 0, 0, 0, 0} /* Field tags (for use in manual encoding/decoding) */ #define meshtastic_ServiceEnvelope_packet_tag 1 @@ -87,7 +84,6 @@ extern "C" { #define meshtastic_MapReport_altitude_tag 11 #define meshtastic_MapReport_position_precision_tag 12 #define meshtastic_MapReport_num_online_local_nodes_tag 13 -#define meshtastic_MapReport_has_opted_report_location_tag 14 /* Struct field encoding specification for nanopb */ #define meshtastic_ServiceEnvelope_FIELDLIST(X, a) \ @@ -111,8 +107,7 @@ X(a, STATIC, SINGULAR, SFIXED32, latitude_i, 9) \ X(a, STATIC, SINGULAR, SFIXED32, longitude_i, 10) \ X(a, STATIC, SINGULAR, INT32, altitude, 11) \ X(a, STATIC, SINGULAR, UINT32, position_precision, 12) \ -X(a, STATIC, SINGULAR, UINT32, num_online_local_nodes, 13) \ -X(a, STATIC, SINGULAR, BOOL, has_opted_report_location, 14) +X(a, STATIC, SINGULAR, UINT32, num_online_local_nodes, 13) #define meshtastic_MapReport_CALLBACK NULL #define meshtastic_MapReport_DEFAULT NULL @@ -126,7 +121,7 @@ extern const pb_msgdesc_t meshtastic_MapReport_msg; /* Maximum encoded size of messages (where known) */ /* meshtastic_ServiceEnvelope_size depends on runtime parameters */ #define MESHTASTIC_MESHTASTIC_MQTT_PB_H_MAX_SIZE meshtastic_MapReport_size -#define meshtastic_MapReport_size 110 +#define meshtastic_MapReport_size 108 #ifdef __cplusplus } /* extern "C" */ diff --git a/src/mesh/generated/meshtastic/telemetry.pb.cpp b/src/mesh/generated/meshtastic/telemetry.pb.cpp index 345d7a1572..c79941fa5d 100644 --- a/src/mesh/generated/meshtastic/telemetry.pb.cpp +++ b/src/mesh/generated/meshtastic/telemetry.pb.cpp @@ -24,10 +24,7 @@ PB_BIND(meshtastic_LocalStats, meshtastic_LocalStats, AUTO) PB_BIND(meshtastic_HealthMetrics, meshtastic_HealthMetrics, AUTO) -PB_BIND(meshtastic_HostMetrics, meshtastic_HostMetrics, 2) - - -PB_BIND(meshtastic_Telemetry, meshtastic_Telemetry, 2) +PB_BIND(meshtastic_Telemetry, meshtastic_Telemetry, AUTO) PB_BIND(meshtastic_Nau7802Config, meshtastic_Nau7802Config, AUTO) diff --git a/src/mesh/generated/meshtastic/telemetry.pb.h b/src/mesh/generated/meshtastic/telemetry.pb.h index 4071c611e0..dcc511ea69 100644 --- a/src/mesh/generated/meshtastic/telemetry.pb.h +++ b/src/mesh/generated/meshtastic/telemetry.pb.h @@ -87,11 +87,7 @@ typedef enum _meshtastic_TelemetrySensorType { /* Infineon DPS310 High accuracy pressure and temperature */ meshtastic_TelemetrySensorType_DPS310 = 36, /* RAKWireless RAK12035 Soil Moisture Sensor Module */ - meshtastic_TelemetrySensorType_RAK12035 = 37, - /* MAX17261 lipo battery gauge */ - meshtastic_TelemetrySensorType_MAX17261 = 38, - /* PCT2075 Temperature Sensor */ - meshtastic_TelemetrySensorType_PCT2075 = 39 + meshtastic_TelemetrySensorType_RAK12035 = 37 } meshtastic_TelemetrySensorType; /* Struct definitions */ @@ -292,32 +288,6 @@ typedef struct _meshtastic_HealthMetrics { float temperature; } meshtastic_HealthMetrics; -/* Linux host metrics */ -typedef struct _meshtastic_HostMetrics { - /* Host system uptime */ - uint32_t uptime_seconds; - /* Host system free memory */ - uint64_t freemem_bytes; - /* Host system disk space free for / */ - uint64_t diskfree1_bytes; - /* Secondary system disk space free */ - bool has_diskfree2_bytes; - uint64_t diskfree2_bytes; - /* Tertiary disk space free */ - bool has_diskfree3_bytes; - uint64_t diskfree3_bytes; - /* Host system one minute load in 1/100ths */ - uint16_t load1; - /* Host system five minute load in 1/100ths */ - uint16_t load5; - /* Host system fifteen minute load in 1/100ths */ - uint16_t load15; - /* Optional User-provided string for arbitrary host system information - that doesn't make sense as a dedicated entry. */ - bool has_user_string; - char user_string[200]; -} meshtastic_HostMetrics; - /* Types of Measurements the telemetry module is equipped to handle */ typedef struct _meshtastic_Telemetry { /* Seconds since 1970 - or 0 for unknown/unset */ @@ -336,8 +306,6 @@ typedef struct _meshtastic_Telemetry { meshtastic_LocalStats local_stats; /* Health telemetry metrics */ meshtastic_HealthMetrics health_metrics; - /* Linux host metrics */ - meshtastic_HostMetrics host_metrics; } variant; } meshtastic_Telemetry; @@ -356,9 +324,8 @@ extern "C" { /* Helper constants for enums */ #define _meshtastic_TelemetrySensorType_MIN meshtastic_TelemetrySensorType_SENSOR_UNSET -#define _meshtastic_TelemetrySensorType_MAX meshtastic_TelemetrySensorType_PCT2075 -#define _meshtastic_TelemetrySensorType_ARRAYSIZE ((meshtastic_TelemetrySensorType)(meshtastic_TelemetrySensorType_PCT2075+1)) - +#define _meshtastic_TelemetrySensorType_MAX meshtastic_TelemetrySensorType_RAK12035 +#define _meshtastic_TelemetrySensorType_ARRAYSIZE ((meshtastic_TelemetrySensorType)(meshtastic_TelemetrySensorType_RAK12035+1)) @@ -376,7 +343,6 @@ extern "C" { #define meshtastic_AirQualityMetrics_init_default {false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0} #define meshtastic_LocalStats_init_default {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} #define meshtastic_HealthMetrics_init_default {false, 0, false, 0, false, 0} -#define meshtastic_HostMetrics_init_default {0, 0, 0, false, 0, false, 0, 0, 0, 0, false, ""} #define meshtastic_Telemetry_init_default {0, 0, {meshtastic_DeviceMetrics_init_default}} #define meshtastic_Nau7802Config_init_default {0, 0} #define meshtastic_DeviceMetrics_init_zero {false, 0, false, 0, false, 0, false, 0, false, 0} @@ -385,7 +351,6 @@ extern "C" { #define meshtastic_AirQualityMetrics_init_zero {false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0} #define meshtastic_LocalStats_init_zero {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} #define meshtastic_HealthMetrics_init_zero {false, 0, false, 0, false, 0} -#define meshtastic_HostMetrics_init_zero {0, 0, 0, false, 0, false, 0, 0, 0, 0, false, ""} #define meshtastic_Telemetry_init_zero {0, 0, {meshtastic_DeviceMetrics_init_zero}} #define meshtastic_Nau7802Config_init_zero {0, 0} @@ -450,15 +415,6 @@ extern "C" { #define meshtastic_HealthMetrics_heart_bpm_tag 1 #define meshtastic_HealthMetrics_spO2_tag 2 #define meshtastic_HealthMetrics_temperature_tag 3 -#define meshtastic_HostMetrics_uptime_seconds_tag 1 -#define meshtastic_HostMetrics_freemem_bytes_tag 2 -#define meshtastic_HostMetrics_diskfree1_bytes_tag 3 -#define meshtastic_HostMetrics_diskfree2_bytes_tag 4 -#define meshtastic_HostMetrics_diskfree3_bytes_tag 5 -#define meshtastic_HostMetrics_load1_tag 6 -#define meshtastic_HostMetrics_load5_tag 7 -#define meshtastic_HostMetrics_load15_tag 8 -#define meshtastic_HostMetrics_user_string_tag 9 #define meshtastic_Telemetry_time_tag 1 #define meshtastic_Telemetry_device_metrics_tag 2 #define meshtastic_Telemetry_environment_metrics_tag 3 @@ -466,7 +422,6 @@ extern "C" { #define meshtastic_Telemetry_power_metrics_tag 5 #define meshtastic_Telemetry_local_stats_tag 6 #define meshtastic_Telemetry_health_metrics_tag 7 -#define meshtastic_Telemetry_host_metrics_tag 8 #define meshtastic_Nau7802Config_zeroOffset_tag 1 #define meshtastic_Nau7802Config_calibrationFactor_tag 2 @@ -555,19 +510,6 @@ X(a, STATIC, OPTIONAL, FLOAT, temperature, 3) #define meshtastic_HealthMetrics_CALLBACK NULL #define meshtastic_HealthMetrics_DEFAULT NULL -#define meshtastic_HostMetrics_FIELDLIST(X, a) \ -X(a, STATIC, SINGULAR, UINT32, uptime_seconds, 1) \ -X(a, STATIC, SINGULAR, UINT64, freemem_bytes, 2) \ -X(a, STATIC, SINGULAR, UINT64, diskfree1_bytes, 3) \ -X(a, STATIC, OPTIONAL, UINT64, diskfree2_bytes, 4) \ -X(a, STATIC, OPTIONAL, UINT64, diskfree3_bytes, 5) \ -X(a, STATIC, SINGULAR, UINT32, load1, 6) \ -X(a, STATIC, SINGULAR, UINT32, load5, 7) \ -X(a, STATIC, SINGULAR, UINT32, load15, 8) \ -X(a, STATIC, OPTIONAL, STRING, user_string, 9) -#define meshtastic_HostMetrics_CALLBACK NULL -#define meshtastic_HostMetrics_DEFAULT NULL - #define meshtastic_Telemetry_FIELDLIST(X, a) \ X(a, STATIC, SINGULAR, FIXED32, time, 1) \ X(a, STATIC, ONEOF, MESSAGE, (variant,device_metrics,variant.device_metrics), 2) \ @@ -575,8 +517,7 @@ X(a, STATIC, ONEOF, MESSAGE, (variant,environment_metrics,variant.environm X(a, STATIC, ONEOF, MESSAGE, (variant,air_quality_metrics,variant.air_quality_metrics), 4) \ X(a, STATIC, ONEOF, MESSAGE, (variant,power_metrics,variant.power_metrics), 5) \ X(a, STATIC, ONEOF, MESSAGE, (variant,local_stats,variant.local_stats), 6) \ -X(a, STATIC, ONEOF, MESSAGE, (variant,health_metrics,variant.health_metrics), 7) \ -X(a, STATIC, ONEOF, MESSAGE, (variant,host_metrics,variant.host_metrics), 8) +X(a, STATIC, ONEOF, MESSAGE, (variant,health_metrics,variant.health_metrics), 7) #define meshtastic_Telemetry_CALLBACK NULL #define meshtastic_Telemetry_DEFAULT NULL #define meshtastic_Telemetry_variant_device_metrics_MSGTYPE meshtastic_DeviceMetrics @@ -585,7 +526,6 @@ X(a, STATIC, ONEOF, MESSAGE, (variant,host_metrics,variant.host_metrics), #define meshtastic_Telemetry_variant_power_metrics_MSGTYPE meshtastic_PowerMetrics #define meshtastic_Telemetry_variant_local_stats_MSGTYPE meshtastic_LocalStats #define meshtastic_Telemetry_variant_health_metrics_MSGTYPE meshtastic_HealthMetrics -#define meshtastic_Telemetry_variant_host_metrics_MSGTYPE meshtastic_HostMetrics #define meshtastic_Nau7802Config_FIELDLIST(X, a) \ X(a, STATIC, SINGULAR, INT32, zeroOffset, 1) \ @@ -599,7 +539,6 @@ extern const pb_msgdesc_t meshtastic_PowerMetrics_msg; extern const pb_msgdesc_t meshtastic_AirQualityMetrics_msg; extern const pb_msgdesc_t meshtastic_LocalStats_msg; extern const pb_msgdesc_t meshtastic_HealthMetrics_msg; -extern const pb_msgdesc_t meshtastic_HostMetrics_msg; extern const pb_msgdesc_t meshtastic_Telemetry_msg; extern const pb_msgdesc_t meshtastic_Nau7802Config_msg; @@ -610,7 +549,6 @@ extern const pb_msgdesc_t meshtastic_Nau7802Config_msg; #define meshtastic_AirQualityMetrics_fields &meshtastic_AirQualityMetrics_msg #define meshtastic_LocalStats_fields &meshtastic_LocalStats_msg #define meshtastic_HealthMetrics_fields &meshtastic_HealthMetrics_msg -#define meshtastic_HostMetrics_fields &meshtastic_HostMetrics_msg #define meshtastic_Telemetry_fields &meshtastic_Telemetry_msg #define meshtastic_Nau7802Config_fields &meshtastic_Nau7802Config_msg @@ -620,11 +558,10 @@ extern const pb_msgdesc_t meshtastic_Nau7802Config_msg; #define meshtastic_DeviceMetrics_size 27 #define meshtastic_EnvironmentMetrics_size 113 #define meshtastic_HealthMetrics_size 11 -#define meshtastic_HostMetrics_size 264 #define meshtastic_LocalStats_size 60 #define meshtastic_Nau7802Config_size 16 #define meshtastic_PowerMetrics_size 30 -#define meshtastic_Telemetry_size 272 +#define meshtastic_Telemetry_size 120 #ifdef __cplusplus } /* extern "C" */ diff --git a/src/mesh/mesh-pb-constants.h b/src/mesh/mesh-pb-constants.h index 08c03dc6bb..f748d295eb 100644 --- a/src/mesh/mesh-pb-constants.h +++ b/src/mesh/mesh-pb-constants.h @@ -20,7 +20,7 @@ /// Verify baseline assumption of node size. If it increases, we need to reevaluate /// the impact of its memory footprint, notably on MAX_NUM_NODES. -static_assert(sizeof(meshtastic_NodeInfoLite) <= 200, "NodeInfoLite size increased. Reconsider impact on MAX_NUM_NODES."); +static_assert(sizeof(meshtastic_NodeInfoLite) <= 192, "NodeInfoLite size increased. Reconsider impact on MAX_NUM_NODES."); /// max number of nodes allowed in the nodeDB #ifndef MAX_NUM_NODES diff --git a/src/mesh/raspihttp/PiWebServer.cpp b/src/mesh/raspihttp/PiWebServer.cpp index 7d3542e831..4fae0bc3dd 100644 --- a/src/mesh/raspihttp/PiWebServer.cpp +++ b/src/mesh/raspihttp/PiWebServer.cpp @@ -462,8 +462,8 @@ PiWebServerThread::PiWebServerThread() webservport = settingsMap[webserverport]; LOG_INFO("Use webserver port from yaml config %i ", webservport); } else { - LOG_INFO("Webserver port in yaml config set to 0, defaulting to port 9443"); - webservport = 9443; + LOG_INFO("Webserver port in yaml config set to 0, defaulting to port 443"); + webservport = 443; } // Web Content Service Instance diff --git a/src/modules/AdminModule.cpp b/src/modules/AdminModule.cpp index 3ff4fa74db..0e1e1555b5 100644 --- a/src/modules/AdminModule.cpp +++ b/src/modules/AdminModule.cpp @@ -286,11 +286,6 @@ bool AdminModule::handleReceivedProtobuf(const meshtastic_MeshPacket &mp, meshta nodeDB->removeNodeByNum(r->remove_by_nodenum); break; } - case meshtastic_AdminMessage_add_contact_tag: { - LOG_INFO("Client received add_contact command"); - nodeDB->addFromContact(r->add_contact); - break; - } case meshtastic_AdminMessage_set_favorite_node_tag: { LOG_INFO("Client received set_favorite_node command"); meshtastic_NodeInfoLite *node = nodeDB->getMeshNode(r->set_favorite_node); @@ -504,12 +499,6 @@ void AdminModule::handleSetOwner(const meshtastic_User &o) sendWarning(licensedModeMessage); } } - if (owner.has_is_unmessagable != o.has_is_unmessagable || - (o.has_is_unmessagable && owner.is_unmessagable != o.is_unmessagable)) { - changed = 1; - owner.has_is_unmessagable = o.has_is_unmessagable || o.has_is_unmessagable; - owner.is_unmessagable = o.is_unmessagable; - } if (changed) { // If nothing really changed, don't broadcast on the network or write to flash service->reloadOwner(!hasOpenEditTransaction); @@ -559,10 +548,8 @@ void AdminModule::handleSetConfig(const meshtastic_Config &c) sendWarning(warning); } // If we're setting router role for the first time, install its intervals - if (existingRole != c.payload_variant.device.role) { + if (existingRole != c.payload_variant.device.role) nodeDB->installRoleDefaults(c.payload_variant.device.role); - changes |= SEGMENT_NODEDATABASE | SEGMENT_DEVICESTATE; // Some role defaults affect owner - } if (config.device.node_info_broadcast_secs < min_node_info_broadcast_secs) { LOG_DEBUG("Tried to set node_info_broadcast_secs too low, setting to %d", min_node_info_broadcast_secs); config.device.node_info_broadcast_secs = min_node_info_broadcast_secs; diff --git a/src/modules/Modules.cpp b/src/modules/Modules.cpp index fac2ca9764..1f2b500571 100644 --- a/src/modules/Modules.cpp +++ b/src/modules/Modules.cpp @@ -49,7 +49,6 @@ #endif #if ARCH_PORTDUINO #include "input/LinuxInputImpl.h" -#include "modules/Telemetry/HostMetrics.h" #if !MESHTASTIC_EXCLUDE_STOREFORWARD #include "modules/StoreForwardModule.h" #endif @@ -197,9 +196,6 @@ void setupModules() #if HAS_SCREEN && !MESHTASTIC_EXCLUDE_CANNEDMESSAGES cannedMessageModule = new CannedMessageModule(); #endif -#if ARCH_PORTDUINO - new HostMetricsModule(); -#endif #if HAS_TELEMETRY new DeviceTelemetryModule(); #endif diff --git a/src/modules/NodeInfoModule.cpp b/src/modules/NodeInfoModule.cpp index 5142f2db05..ce4a6bd066 100644 --- a/src/modules/NodeInfoModule.cpp +++ b/src/modules/NodeInfoModule.cpp @@ -86,11 +86,6 @@ meshtastic_MeshPacket *NodeInfoModule::allocReply() u.public_key.bytes[0] = 0; u.public_key.size = 0; } - // Coerce unmessagable for Repeater role - if (u.role == meshtastic_Config_DeviceConfig_Role_REPEATER) { - u.has_is_unmessagable = true; - u.is_unmessagable = true; - } LOG_INFO("Send owner %s/%s/%s", u.id, u.long_name, u.short_name); lastSentToMesh = millis(); diff --git a/src/modules/Telemetry/HostMetrics.cpp b/src/modules/Telemetry/HostMetrics.cpp deleted file mode 100644 index dc4315efad..0000000000 --- a/src/modules/Telemetry/HostMetrics.cpp +++ /dev/null @@ -1,138 +0,0 @@ -#include "HostMetrics.h" -#include "../mesh/generated/meshtastic/telemetry.pb.h" -#include "MeshService.h" -#if ARCH_PORTDUINO -#include "PortduinoGlue.h" -#include -#endif - -int32_t HostMetricsModule::runOnce() -{ -#if ARCH_PORTDUINO - if (settingsMap[hostMetrics_interval] == 0) { - return disable(); - } else { - sendMetrics(); - return 60 * 1000 * settingsMap[hostMetrics_interval]; - } -#else - return disable(); -#endif -} - -bool HostMetricsModule::handleReceivedProtobuf(const meshtastic_MeshPacket &mp, meshtastic_Telemetry *t) -{ - // Don't worry about storing telemetry in NodeDB if we're a repeater - if (config.device.role == meshtastic_Config_DeviceConfig_Role_REPEATER) - return false; - - if (t->which_variant == meshtastic_Telemetry_host_metrics_tag) { -#ifdef DEBUG_PORT - const char *sender = getSenderShortName(mp); - - LOG_INFO("(Received Host Metrics from %s): uptime=%u, diskfree=%lu, memory free=%lu, load=%04.2f, %04.2f, %04.2f, %s", - sender, t->variant.host_metrics.uptime_seconds, t->variant.host_metrics.diskfree1_bytes, - t->variant.host_metrics.freemem_bytes, static_cast(t->variant.host_metrics.load1) / 100, - static_cast(t->variant.host_metrics.load5) / 100, - static_cast(t->variant.host_metrics.load15) / 100, t->variant.host_metrics.user_string); -#endif - } - return false; // Let others look at this message also if they want -} - -/* -meshtastic_MeshPacket *HostMetricsModule::allocReply() -{ - if (currentRequest) { - auto req = *currentRequest; - const auto &p = req.decoded; - meshtastic_Telemetry scratch; - meshtastic_Telemetry *decoded = NULL; - memset(&scratch, 0, sizeof(scratch)); - if (pb_decode_from_bytes(p.payload.bytes, p.payload.size, &meshtastic_HostMetrics_msg, &scratch)) { - decoded = &scratch; - } else { - LOG_ERROR("Error decoding HostMetrics module!"); - return NULL; - } - // Check for a request for device metrics - if (decoded->which_variant == meshtastic_Telemetry_host_metrics_tag) { - LOG_INFO("Device telemetry reply to request"); - return allocDataProtobuf(getHostMetrics()); - } - } - return NULL; -} - */ - -#if ARCH_PORTDUINO -meshtastic_Telemetry HostMetricsModule::getHostMetrics() -{ - std::string file_line; - meshtastic_Telemetry t = meshtastic_Telemetry_init_zero; - t.which_variant = meshtastic_Telemetry_host_metrics_tag; - t.variant.host_metrics = meshtastic_HostMetrics_init_zero; - - if (access("/proc/uptime", R_OK) == 0) { - std::ifstream proc_uptime("/proc/uptime"); - if (proc_uptime.is_open()) { - std::getline(proc_uptime, file_line, ' '); - proc_uptime.close(); - t.variant.host_metrics.uptime_seconds = stoul(file_line); - } - } - - std::filesystem::space_info root = std::filesystem::space("/"); - t.variant.host_metrics.diskfree1_bytes = root.available; - - if (access("/proc/meminfo", R_OK) == 0) { - std::ifstream proc_meminfo("/proc/meminfo"); - if (proc_meminfo.is_open()) { - do { - std::getline(proc_meminfo, file_line); - } while (file_line.find("MemAvailable") == std::string::npos); - proc_meminfo.close(); - t.variant.host_metrics.freemem_bytes = stoull(file_line.substr(file_line.find_first_of("0123456789"))) * 1024; - } - } - if (access("/proc/loadavg", R_OK) == 0) { - std::ifstream proc_loadavg("/proc/loadavg"); - if (proc_loadavg.is_open()) { - std::getline(proc_loadavg, file_line, ' '); - t.variant.host_metrics.load1 = stof(file_line) * 100; - std::getline(proc_loadavg, file_line, ' '); - t.variant.host_metrics.load5 = stof(file_line) * 100; - std::getline(proc_loadavg, file_line, ' '); - t.variant.host_metrics.load15 = stof(file_line) * 100; - proc_loadavg.close(); - } - } - if (settingsStrings[hostMetrics_user_command] != "") { - std::string userCommandResult = exec(settingsStrings[hostMetrics_user_command].c_str()); - if (userCommandResult.length() > 1) { - strncpy(t.variant.host_metrics.user_string, userCommandResult.c_str(), 200); - t.variant.host_metrics.has_user_string = true; - } - } - return t; -} - -bool HostMetricsModule::sendMetrics() -{ - meshtastic_Telemetry telemetry = getHostMetrics(); - LOG_INFO("Send: uptime=%u, diskfree=%lu, memory free=%lu, load=%04.2f, %04.2f, %04.2f %s", - telemetry.variant.host_metrics.uptime_seconds, telemetry.variant.host_metrics.diskfree1_bytes, - telemetry.variant.host_metrics.freemem_bytes, static_cast(telemetry.variant.host_metrics.load1) / 100, - static_cast(telemetry.variant.host_metrics.load5) / 100, - static_cast(telemetry.variant.host_metrics.load15) / 100, telemetry.variant.host_metrics.user_string); - - meshtastic_MeshPacket *p = allocDataProtobuf(telemetry); - p->to = NODENUM_BROADCAST; - p->decoded.want_response = false; - p->priority = meshtastic_MeshPacket_Priority_BACKGROUND; - p->channel = settingsMap[hostMetrics_channel]; - LOG_INFO("Send packet to mesh"); - service->sendToMesh(p, RX_SRC_LOCAL, true); - return true; -} -#endif \ No newline at end of file diff --git a/src/modules/Telemetry/HostMetrics.h b/src/modules/Telemetry/HostMetrics.h deleted file mode 100644 index 99ee631c15..0000000000 --- a/src/modules/Telemetry/HostMetrics.h +++ /dev/null @@ -1,40 +0,0 @@ -#pragma once -#include "../mesh/generated/meshtastic/telemetry.pb.h" -#include "ProtobufModule.h" - -class HostMetricsModule : private concurrency::OSThread, public ProtobufModule -{ - CallbackObserver nodeStatusObserver = - CallbackObserver(this, &HostMetricsModule::handleStatusUpdate); - - public: - HostMetricsModule() - : concurrency::OSThread("HostMetrics"), - ProtobufModule("HostMetrics", meshtastic_PortNum_TELEMETRY_APP, &meshtastic_Telemetry_msg) - { - uptimeWrapCount = 0; - uptimeLastMs = millis(); - nodeStatusObserver.observe(&nodeStatus->onNewStatus); - setIntervalFromNow(setStartDelay()); // Wait until NodeInfo is sent - } - virtual bool wantUIFrame() { return false; } - - protected: - /** Called to handle a particular incoming message - @return true if you've guaranteed you've handled this message and no other handlers should be considered for it - */ - virtual bool handleReceivedProtobuf(const meshtastic_MeshPacket &mp, meshtastic_Telemetry *p) override; - // virtual meshtastic_MeshPacket *allocReply() override; - virtual int32_t runOnce() override; - /** - * Send our Telemetry into the mesh - */ - bool sendMetrics(); - - private: - meshtastic_Telemetry getHostMetrics(); - - uint32_t lastSentToMesh = 0; - uint32_t uptimeWrapCount; - uint32_t uptimeLastMs; -}; \ No newline at end of file diff --git a/src/modules/Telemetry/Sensor/SHTC3Sensor.cpp b/src/modules/Telemetry/Sensor/SHTC3Sensor.cpp index e9c4d2a0b2..dbebec9d38 100644 --- a/src/modules/Telemetry/Sensor/SHTC3Sensor.cpp +++ b/src/modules/Telemetry/Sensor/SHTC3Sensor.cpp @@ -15,7 +15,7 @@ int32_t SHTC3Sensor::runOnce() if (!hasSensor()) { return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS; } - status = shtc3.begin(nodeTelemetrySensorsMap[sensorType].second); + status = shtc3.begin(); return initI2CSensor(); } diff --git a/src/motion/ICM20948Sensor.cpp b/src/motion/ICM20948Sensor.cpp index ecc48d39bc..d03633124f 100755 --- a/src/motion/ICM20948Sensor.cpp +++ b/src/motion/ICM20948Sensor.cpp @@ -189,19 +189,13 @@ bool ICM20948Singleton::init(ScanI2C::FoundDevice device) enableDebugging(); #endif - // startup -#if defined(WIRE_INTERFACES_COUNT) && (WIRE_INTERFACES_COUNT > 1) - TwoWire &bus = (device.address.port == ScanI2C::I2CPort::WIRE1 ? Wire1 : Wire); +// startup +#ifdef Wire1 + ICM_20948_Status_e status = + begin(device.address.port == ScanI2C::I2CPort::WIRE1 ? Wire1 : Wire, device.address.address == ICM20948_ADDR ? 1 : 0); #else - TwoWire &bus = Wire; // fallback if only one I2C interface + ICM_20948_Status_e status = begin(Wire, device.address.address == ICM20948_ADDR ? 1 : 0); #endif - - bool bAddr = (device.address.address == 0x69); - delay(100); - - LOG_DEBUG("ICM20948 begin on addr 0x%02X (port=%d, bAddr=%d)", device.address.address, device.address.port, bAddr); - - ICM_20948_Status_e status = begin(bus, bAddr); if (status != ICM_20948_Stat_Ok) { LOG_DEBUG("ICM20948 init begin - %s", statusString()); return false; diff --git a/src/mqtt/MQTT.cpp b/src/mqtt/MQTT.cpp index dca8a3b44f..fb92789ee0 100644 --- a/src/mqtt/MQTT.cpp +++ b/src/mqtt/MQTT.cpp @@ -256,11 +256,6 @@ bool isDefaultServer(const String &host) return host.length() == 0 || host == default_mqtt_address; } -bool isDefaultRootTopic(const String &root) -{ - return root.length() == 0 || root == default_mqtt_root; -} - struct PubSubConfig { explicit PubSubConfig(const meshtastic_ModuleConfig_MQTTConfig &config) { @@ -392,12 +387,10 @@ MQTT::MQTT() : concurrency::OSThread("mqtt"), mqttQueue(MAX_MQTT_QUEUE) cryptTopic = moduleConfig.mqtt.root + cryptTopic; jsonTopic = moduleConfig.mqtt.root + jsonTopic; mapTopic = moduleConfig.mqtt.root + mapTopic; - isConfiguredForDefaultRootTopic = isDefaultRootTopic(moduleConfig.mqtt.root); } else { cryptTopic = "msh" + cryptTopic; jsonTopic = "msh" + jsonTopic; mapTopic = "msh" + mapTopic; - isConfiguredForDefaultRootTopic = true; } if (moduleConfig.mqtt.map_reporting_enabled && moduleConfig.mqtt.has_map_report_settings) { @@ -769,24 +762,18 @@ void MQTT::onSend(const meshtastic_MeshPacket &mp_encrypted, const meshtastic_Me void MQTT::perhapsReportToMap() { - if (!moduleConfig.mqtt.map_reporting_enabled || !moduleConfig.mqtt.map_report_settings.should_report_location || - !(moduleConfig.mqtt.proxy_to_client_enabled || isConnectedDirectly())) + if (!moduleConfig.mqtt.map_reporting_enabled || !(moduleConfig.mqtt.proxy_to_client_enabled || isConnectedDirectly())) return; - // Coerce the map position precision to be within the valid range - // This removes obtusely large radius and privacy problematic ones from the map - if (map_position_precision < 12 || map_position_precision > 15) { - LOG_WARN("MQTT Map report position precision %u is out of range, using default %u", map_position_precision, - default_map_position_precision); - map_position_precision = default_map_position_precision; - } - if (Throttle::isWithinTimespanMs(last_report_to_map, map_publish_interval_msecs)) return; - if (localPosition.latitude_i == 0 && localPosition.longitude_i == 0) { + if (map_position_precision == 0 || (localPosition.latitude_i == 0 && localPosition.longitude_i == 0)) { last_report_to_map = millis(); - LOG_WARN("MQTT Map report enabled, but no position available"); + if (map_position_precision == 0) + LOG_WARN("MQTT Map report enabled, but precision is 0"); + if (localPosition.latitude_i == 0 && localPosition.longitude_i == 0) + LOG_WARN("MQTT Map report enabled, but no position available"); return; } @@ -807,14 +794,17 @@ void MQTT::perhapsReportToMap() mapReport.region = config.lora.region; mapReport.modem_preset = config.lora.modem_preset; mapReport.has_default_channel = channels.hasDefaultChannel(); - mapReport.has_opted_report_location = true; // Set position with precision (same as in PositionModule) - mapReport.latitude_i = localPosition.latitude_i & (UINT32_MAX << (32 - map_position_precision)); - mapReport.longitude_i = localPosition.longitude_i & (UINT32_MAX << (32 - map_position_precision)); - mapReport.latitude_i += (1 << (31 - map_position_precision)); - mapReport.longitude_i += (1 << (31 - map_position_precision)); - + if (map_position_precision < 32 && map_position_precision > 0) { + mapReport.latitude_i = localPosition.latitude_i & (UINT32_MAX << (32 - map_position_precision)); + mapReport.longitude_i = localPosition.longitude_i & (UINT32_MAX << (32 - map_position_precision)); + mapReport.latitude_i += (1 << (31 - map_position_precision)); + mapReport.longitude_i += (1 << (31 - map_position_precision)); + } else { + mapReport.latitude_i = localPosition.latitude_i; + mapReport.longitude_i = localPosition.longitude_i; + } mapReport.altitude = localPosition.altitude; mapReport.position_precision = map_position_precision; diff --git a/src/mqtt/MQTT.h b/src/mqtt/MQTT.h index 7d57156026..0c260dc9cd 100644 --- a/src/mqtt/MQTT.h +++ b/src/mqtt/MQTT.h @@ -1,6 +1,5 @@ #pragma once -#include "Default.h" #include "configuration.h" #include "concurrency/OSThread.h" @@ -59,7 +58,6 @@ class MQTT : private concurrency::OSThread void start() { setIntervalFromNow(0); }; bool isUsingDefaultServer() { return isConfiguredForDefaultServer; } - bool isUsingDefaultRootTopic() { return isConfiguredForDefaultRootTopic; } /// Validate the meshtastic_ModuleConfig_MQTTConfig. static bool isValidConfig(const meshtastic_ModuleConfig_MQTTConfig &config) { return isValidConfig(config, nullptr); } @@ -73,7 +71,6 @@ class MQTT : private concurrency::OSThread int reconnectCount = 0; bool isConfiguredForDefaultServer = true; - bool isConfiguredForDefaultRootTopic = true; virtual int32_t runOnce() override; @@ -106,7 +103,8 @@ class MQTT : private concurrency::OSThread std::string mapTopic = "/2/map/"; // For protobuf-encoded MapReport messages // For map reporting (only applies when enabled) - const uint32_t default_map_position_precision = 14; // defaults to max. offset of ~1459m + const uint32_t default_map_position_precision = 14; // defaults to max. offset of ~1459m + const uint32_t default_map_publish_interval_secs = 60 * 15; // defaults to 15 minutes uint32_t last_report_to_map = 0; uint32_t map_position_precision = default_map_position_precision; uint32_t map_publish_interval_msecs = default_map_publish_interval_secs * 1000; diff --git a/src/platform/portduino/PortduinoGlue.cpp b/src/platform/portduino/PortduinoGlue.cpp index cc0c417d32..4b96e662ad 100644 --- a/src/platform/portduino/PortduinoGlue.cpp +++ b/src/platform/portduino/PortduinoGlue.cpp @@ -600,12 +600,6 @@ bool loadConfig(const char *configPath) (yamlConfig["Webserver"]["SSLCert"]).as("/etc/meshtasticd/ssl/certificate.pem"); } - if (yamlConfig["HostMetrics"]) { - settingsMap[hostMetrics_channel] = (yamlConfig["HostMetrics"]["Channel"]).as(0); - settingsMap[hostMetrics_interval] = (yamlConfig["HostMetrics"]["ReportInterval"]).as(0); - settingsStrings[hostMetrics_user_command] = (yamlConfig["HostMetrics"]["UserStringCommand"]).as(""); - } - if (yamlConfig["General"]) { settingsMap[maxnodes] = (yamlConfig["General"]["MaxNodes"]).as(200); settingsMap[maxtophone] = (yamlConfig["General"]["MaxMessageQueue"]).as(100); @@ -656,18 +650,4 @@ bool MAC_from_string(std::string mac_str, uint8_t *dmac) } else { return false; } -} - -std::string exec(const char *cmd) -{ // https://stackoverflow.com/a/478960 - std::array buffer; - std::string result; - std::unique_ptr pipe(popen(cmd, "r"), pclose); - if (!pipe) { - throw std::runtime_error("popen() failed!"); - } - while (fgets(buffer.data(), static_cast(buffer.size()), pipe.get()) != nullptr) { - result += buffer.data(); - } - return result; } \ No newline at end of file diff --git a/src/platform/portduino/PortduinoGlue.h b/src/platform/portduino/PortduinoGlue.h index d324aaf47a..6393d72947 100644 --- a/src/platform/portduino/PortduinoGlue.h +++ b/src/platform/portduino/PortduinoGlue.h @@ -100,10 +100,7 @@ enum configNames { ascii_logs, config_directory, available_directory, - mac_address, - hostMetrics_interval, - hostMetrics_channel, - hostMetrics_user_command + mac_address }; enum { no_screen, x11, fb, st7789, st7735, st7735s, st7796, ili9341, ili9342, ili9486, ili9488, hx8357d }; enum { no_touchscreen, xpt2046, stmpe610, gt911, ft5x06 }; @@ -117,5 +114,4 @@ int initGPIOPin(int pinNum, std::string gpioChipname, int line); bool loadConfig(const char *configPath); static bool ends_with(std::string_view str, std::string_view suffix); void getMacAddr(uint8_t *dmac); -bool MAC_from_string(std::string mac_str, uint8_t *dmac); -std::string exec(const char *cmd); \ No newline at end of file +bool MAC_from_string(std::string mac_str, uint8_t *dmac); \ No newline at end of file diff --git a/test/test_mqtt/MQTT.cpp b/test/test_mqtt/MQTT.cpp index 8047079ba1..50a98001a5 100644 --- a/test/test_mqtt/MQTT.cpp +++ b/test/test_mqtt/MQTT.cpp @@ -310,8 +310,6 @@ void setUp(void) { moduleConfig.mqtt = meshtastic_ModuleConfig_MQTTConfig{.enabled = true, .map_reporting_enabled = true, .has_map_report_settings = true}; - moduleConfig.mqtt.map_report_settings = meshtastic_ModuleConfig_MapReportSettings{ - .publish_interval_secs = 0, .position_precision = 14, .should_report_location = true}; channelFile.channels[0] = meshtastic_Channel{ .index = 0, .has_settings = true, @@ -708,21 +706,42 @@ void test_reportToMapDefaultImprecise(void) TEST_ASSERT_EQUAL(1, pubsub->published_.size()); const auto &[topic, payload] = pubsub->published_.front(); TEST_ASSERT_EQUAL_STRING("msh/2/map/", topic.c_str()); + verifyLatLong(std::get(payload), 70123520, 30015488); +} + +// Precise location is reported when configured. +void test_reportToMapPrecise(void) +{ + unitTest->reportToMap(/*precision=*/32); + + TEST_ASSERT_EQUAL(1, pubsub->published_.size()); + const auto &[topic, payload] = pubsub->published_.front(); + TEST_ASSERT_EQUAL_STRING("msh/2/map/", topic.c_str()); + verifyLatLong(std::get(payload), localPosition.latitude_i, localPosition.longitude_i); } // Location is sent over the phone proxy. -void test_reportToMapImpreciseProxied(void) +void test_reportToMapPreciseProxied(void) { moduleConfig.mqtt.proxy_to_client_enabled = true; MQTTUnitTest::restart(); - unitTest->reportToMap(/*precision=*/14); + unitTest->reportToMap(/*precision=*/32); TEST_ASSERT_EQUAL(1, mockMeshService->messages_.size()); const meshtastic_MqttClientProxyMessage &message = mockMeshService->messages_.front(); TEST_ASSERT_EQUAL_STRING("msh/2/map/", message.topic); TEST_ASSERT_EQUAL(meshtastic_MqttClientProxyMessage_data_tag, message.which_payload_variant); const DecodedServiceEnvelope env(message.payload_variant.data.bytes, message.payload_variant.data.size); + verifyLatLong(env, localPosition.latitude_i, localPosition.longitude_i); +} + +// No location is reported when the precision is invalid. +void test_reportToMapInvalidPrecision(void) +{ + unitTest->reportToMap(/*precision=*/0); + + TEST_ASSERT_TRUE(pubsub->published_.empty()); } // isUsingDefaultServer returns true when using the default server. @@ -899,7 +918,9 @@ void setup() RUN_TEST(test_publishTextMessageDirect); RUN_TEST(test_publishTextMessageWithProxy); RUN_TEST(test_reportToMapDefaultImprecise); - RUN_TEST(test_reportToMapImpreciseProxied); + RUN_TEST(test_reportToMapPrecise); + RUN_TEST(test_reportToMapPreciseProxied); + RUN_TEST(test_reportToMapInvalidPrecision); RUN_TEST(test_usingDefaultServer); RUN_TEST(test_usingDefaultServerWithPort); RUN_TEST(test_usingDefaultServerWithInvalidPort); diff --git a/userPrefs.jsonc b/userPrefs.jsonc index a349a57006..06c4a7eec3 100644 --- a/userPrefs.jsonc +++ b/userPrefs.jsonc @@ -44,12 +44,5 @@ // "USERPREFS_NETWORK_WIFI_ENABLED": "true", // "USERPREFS_NETWORK_WIFI_SSID": "wifi_ssid", // "USERPREFS_NETWORK_WIFI_PSK": "wifi_psk", - // "USERPREFS_MQTT_ENABLED": "1", - // "USERPREFS_MQTT_ADDRESS": "'mqtt.meshtastic.org'", - // "USERPREFS_MQTT_USERNAME": "meshdev", - // "USERPREFS_MQTT_PASSWORD": "large4cats", - // "USERPREFS_MQTT_ENCRYPTION_ENABLED": "true", - // "USERPREFS_MQTT_TLS_ENABLED": "false", - // "USERPREFS_MQTT_ROOT_TOPIC": "event/REPLACEME", "USERPREFS_TZ_STRING": "tzplaceholder " } diff --git a/variants/ELECROW-ThinkNode-M1/nicheGraphics.h b/variants/ELECROW-ThinkNode-M1/nicheGraphics.h index c2c3519257..f68ac9eddf 100644 --- a/variants/ELECROW-ThinkNode-M1/nicheGraphics.h +++ b/variants/ELECROW-ThinkNode-M1/nicheGraphics.h @@ -22,6 +22,10 @@ #include "graphics/niche/Drivers/EInk/GDEY0154D67.h" #include "graphics/niche/Inputs/TwoButton.h" +#include "graphics/niche/Fonts/FreeSans6pt7b.h" +#include "graphics/niche/Fonts/FreeSans6pt8bCyrillic.h" +#include + void setupNicheGraphics() { using namespace NicheGraphics; @@ -29,13 +33,14 @@ void setupNicheGraphics() // SPI // ----------------------------- - // For NRF52 platforms, SPI pins are defined in variant.h + // For NRF52 platforms, SPI pins are defined in variant.h, not passed to begin() SPI1.begin(); - // E-Ink Driver + // Driver // ----------------------------- - Drivers::EInk *driver = new Drivers::GDEY0154D67; + // Use E-Ink driver + Drivers::EInk *driver = new Drivers::GDEY0154D67; // Todo: confirm display model driver->begin(&SPI1, PIN_EINK_DC, PIN_EINK_CS, PIN_EINK_BUSY, PIN_EINK_RES); // InkHUD @@ -43,7 +48,7 @@ void setupNicheGraphics() InkHUD::InkHUD *inkhud = InkHUD::InkHUD::getInstance(); - // Set the E-Ink driver + // Set the driver inkhud->setDriver(driver); // Set how many FAST updates per FULL update @@ -52,27 +57,33 @@ void setupNicheGraphics() // Currently set to the values given by Elecrow for EInkDynamicDisplay. inkhud->setDisplayResilience(10, 1.5); - // Select fonts - InkHUD::Applet::fontLarge = FREESANS_9PT_WIN1252; - InkHUD::Applet::fontSmall = FREESANS_6PT_WIN1252; + // Prepare fonts + InkHUD::Applet::fontLarge = InkHUD::AppletFont(FreeSans9pt7b); + InkHUD::Applet::fontSmall = InkHUD::AppletFont(FreeSans6pt7b); + /* + // Font localization demo: Cyrillic + InkHUD::Applet::fontSmall = InkHUD::AppletFont(FreeSans6pt8bCyrillic); + InkHUD::Applet::fontSmall.addSubstitutionsWin1251(); + */ // Customize default settings inkhud->persistence->settings.userTiles.maxCount = 2; // Two applets side-by-side + inkhud->persistence->settings.rotation = 0; // To be confirmed? inkhud->persistence->settings.optionalFeatures.batteryIcon = true; // Device definitely has a battery - // Setup backlight controller - // Note: button is attached further down + // Setup backlight + // Note: button mapping for this configured further down Drivers::LatchingBacklight *backlight = Drivers::LatchingBacklight::getInstance(); backlight->setPin(PIN_EINK_EN); // Pick applets // Note: order of applets determines priority of "auto-show" feature inkhud->addApplet("All Messages", new InkHUD::AllMessageApplet, true, true); // Activated, autoshown - inkhud->addApplet("DMs", new InkHUD::DMApplet); // - - inkhud->addApplet("Channel 0", new InkHUD::ThreadedMessageApplet(0)); // - - inkhud->addApplet("Channel 1", new InkHUD::ThreadedMessageApplet(1)); // - + inkhud->addApplet("DMs", new InkHUD::DMApplet); // Inactive + inkhud->addApplet("Channel 0", new InkHUD::ThreadedMessageApplet(0)); // Inactive + inkhud->addApplet("Channel 1", new InkHUD::ThreadedMessageApplet(1)); // Inactive inkhud->addApplet("Positions", new InkHUD::PositionsApplet, true); // Activated - inkhud->addApplet("Recents List", new InkHUD::RecentsListApplet); // - + inkhud->addApplet("Recents List", new InkHUD::RecentsListApplet); // Inactive inkhud->addApplet("Heard", new InkHUD::HeardApplet, true, false, 0); // Activated, no autoshow, default on tile 0 // Start running InkHUD @@ -83,25 +94,25 @@ void setupNicheGraphics() Inputs::TwoButton *buttons = Inputs::TwoButton::getInstance(); // Shared NicheGraphics component - // Elecrow diagram: https://www.elecrow.com/download/product/CIL12901M/ThinkNode-M1_User_Manual.pdf + // As labeled on Elecrow diagram: https://www.elecrow.com/download/product/CIL12901M/ThinkNode-M1_User_Manual.pdf + constexpr uint8_t PAGE_TURN_BUTTON = 0; + constexpr uint8_t FUNCTION_BUTTON = 1; - // #0: Main User Button - // Labeled "Page Turn Button" by manual - buttons->setWiring(0, PIN_BUTTON2); - buttons->setTiming(0, 50, 500); // Todo: confirm 50ms is adequate debounce - buttons->setHandlerShortPress(0, [inkhud]() { inkhud->shortpress(); }); - buttons->setHandlerLongPress(0, [inkhud]() { inkhud->longpress(); }); + // Setup the main user button + buttons->setWiring(PAGE_TURN_BUTTON, PIN_BUTTON2); + buttons->setTiming(PAGE_TURN_BUTTON, 50, 500); // Todo: confirm 50ms is adequate debounce + buttons->setHandlerShortPress(PAGE_TURN_BUTTON, []() { InkHUD::InkHUD::getInstance()->shortpress(); }); + buttons->setHandlerLongPress(PAGE_TURN_BUTTON, []() { InkHUD::InkHUD::getInstance()->longpress(); }); - // #1: Aux Button - // Labeled "Function Button" by manual + // Setup the aux button + // Initial testing only: mapped to the backlight // Todo: additional features - buttons->setWiring(1, PIN_BUTTON1); - buttons->setTiming(1, 50, 500); // 500ms before latch - buttons->setHandlerDown(1, [backlight]() { backlight->peek(); }); - buttons->setHandlerLongPress(1, [backlight]() { backlight->latch(); }); - buttons->setHandlerShortPress(1, [backlight]() { backlight->off(); }); + buttons->setWiring(FUNCTION_BUTTON, PIN_BUTTON1); + buttons->setTiming(FUNCTION_BUTTON, 50, 500); // 500ms before latch + buttons->setHandlerDown(FUNCTION_BUTTON, [backlight]() { backlight->peek(); }); + buttons->setHandlerLongPress(FUNCTION_BUTTON, [backlight]() { backlight->latch(); }); + buttons->setHandlerShortPress(FUNCTION_BUTTON, [backlight]() { backlight->off(); }); - // Begin handling button events buttons->start(); } diff --git a/variants/seeed_solar_node/platformio.ini b/variants/Seeed_Solar_Node/platformio.ini similarity index 76% rename from variants/seeed_solar_node/platformio.ini rename to variants/Seeed_Solar_Node/platformio.ini index eb91a435f2..5ee0a5e8f1 100644 --- a/variants/seeed_solar_node/platformio.ini +++ b/variants/Seeed_Solar_Node/platformio.ini @@ -1,13 +1,13 @@ -[env:seeed_solar_node] -board = seeed_solar_node +[env:Seeed_Solar_Node] +board = Seeed_Solar_Node extends = nrf52840_base ;board_level = extra build_flags = ${nrf52840_base.build_flags} - -I $PROJECT_DIR/variants/seeed_solar_node + -I $PROJECT_DIR/variants/Seeed_Solar_Node -D SEEED_SOLAR_NODE -Isrc/platform/nrf52/softdevice -Isrc/platform/nrf52/softdevice/nrf52 board_build.ldscript = src/platform/nrf52/nrf52840_s140_v7.ld -build_src_filter = ${nrf52_base.build_src_filter} +<../variants/seeed_solar_node> +build_src_filter = ${nrf52_base.build_src_filter} +<../variants/Seeed_Solar_Node> lib_deps = ${nrf52840_base.lib_deps} debug_tool = jlink diff --git a/variants/seeed_solar_node/variant.cpp b/variants/Seeed_Solar_Node/variant.cpp similarity index 100% rename from variants/seeed_solar_node/variant.cpp rename to variants/Seeed_Solar_Node/variant.cpp diff --git a/variants/seeed_solar_node/variant.h b/variants/Seeed_Solar_Node/variant.h similarity index 98% rename from variants/seeed_solar_node/variant.h rename to variants/Seeed_Solar_Node/variant.h index 30d5c5888d..86682302b5 100644 --- a/variants/seeed_solar_node/variant.h +++ b/variants/Seeed_Solar_Node/variant.h @@ -20,8 +20,8 @@ // ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ // LEDs // LEDs -#define PIN_LED1 (12) // LED P1.15 -#define PIN_LED2 (11) // +#define PIN_LED1 (11) // LED P1.15 +#define PIN_LED2 (12) // #define LED_BUILTIN PIN_LED1 #define LED_CONN PIN_LED2 @@ -154,4 +154,4 @@ extern "C" { } #endif -#endif // _SEEED_SOLAR_NODE_H_ +#endif // _SEEED_SOLAR_NODE_H_ \ No newline at end of file diff --git a/variants/gat562_mesh_trial_tracker/platformio.ini b/variants/gat562_mesh_trial_tracker/platformio.ini new file mode 100644 index 0000000000..5f5de21d8c --- /dev/null +++ b/variants/gat562_mesh_trial_tracker/platformio.ini @@ -0,0 +1,14 @@ +; The very slick RAK wireless RAK 4631 / 4630 board - Unified firmware for 5005/19003, with or without OLED RAK 1921 +[env:gat562_mesh_trial_tracker] +extends = nrf52840_base +board = gat562_mesh_trial_tracker +board_check = true +build_flags = ${nrf52840_base.build_flags} -Ivariants/gat562_mesh_trial_tracker -D GAT562_MESH_TRIAL_TRACKER + -L "${platformio.libdeps_dir}/${this.__env__}/bsec2/src/cortex-m4/fpv4-sp-d16-hard" + -DGPS_POWER_TOGGLE ; comment this line to disable triple press function on the user button to turn off gps entirely. + -DRADIOLIB_EXCLUDE_SX128X=1 + -DRADIOLIB_EXCLUDE_SX127X=1 + -DRADIOLIB_EXCLUDE_LR11X0=1 +build_src_filter = ${nrf52_base.build_src_filter} +<../variants/gat562_mesh_trial_tracker> +lib_deps = + ${nrf52840_base.lib_deps} \ No newline at end of file diff --git a/variants/gat562_mesh_trial_tracker/variant.cpp b/variants/gat562_mesh_trial_tracker/variant.cpp new file mode 100644 index 0000000000..e84b60b3b9 --- /dev/null +++ b/variants/gat562_mesh_trial_tracker/variant.cpp @@ -0,0 +1,45 @@ +/* + Copyright (c) 2014-2015 Arduino LLC. All right reserved. + Copyright (c) 2016 Sandeep Mistry All right reserved. + Copyright (c) 2018, Adafruit Industries (adafruit.com) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "variant.h" +#include "nrf.h" +#include "wiring_constants.h" +#include "wiring_digital.h" + +const uint32_t g_ADigitalPinMap[] = { + // P0 + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + + // P1 + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47}; + +void initVariant() +{ + // LED1 & LED2 + pinMode(PIN_LED1, OUTPUT); + ledOff(PIN_LED1); + + pinMode(PIN_LED2, OUTPUT); + ledOff(PIN_LED2); + + // 3V3 Power Rail + pinMode(PIN_3V3_EN, OUTPUT); + digitalWrite(PIN_3V3_EN, HIGH); +} diff --git a/variants/gat562_mesh_trial_tracker/variant.h b/variants/gat562_mesh_trial_tracker/variant.h new file mode 100644 index 0000000000..0735d71783 --- /dev/null +++ b/variants/gat562_mesh_trial_tracker/variant.h @@ -0,0 +1,283 @@ +/* + Copyright (c) 2014-2015 Arduino LLC. All right reserved. + Copyright (c) 2016 Sandeep Mistry All right reserved. + Copyright (c) 2018, Adafruit Industries (adafruit.com) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef _VARIANT_GAT562_MESH_TRIAL_TRACKER_ +#define _VARIANT_GAT562_MESH_TRIAL_TRACKER_ + +#define GAT562_MESH_TRIAL_TRACKER + +/** Master clock frequency */ +#define VARIANT_MCK (64000000ul) + +#define USE_LFXO // Board uses 32khz crystal for LF +// define USE_LFRC // Board uses RC for LF + +/*---------------------------------------------------------------------------- + * Headers + *----------------------------------------------------------------------------*/ + +#include "WVariant.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +// Number of pins defined in PinDescription array +#define PINS_COUNT (48) +#define NUM_DIGITAL_PINS (48) +#define NUM_ANALOG_INPUTS (6) +#define NUM_ANALOG_OUTPUTS (0) + +// LEDs +#define PIN_LED1 (35) +#define PIN_LED2 (36) + +#define LED_BUILTIN PIN_LED1 +#define LED_CONN PIN_LED2 + +#define LED_GREEN PIN_LED1 +#define LED_BLUE PIN_LED2 + +#define LED_STATE_ON 1 // State when LED is litted + +/* + * Buttons + */ + +#define PIN_BUTTON1 9 // Pin for button on E-ink button module or IO expansion +#define BUTTON_NEED_PULLUP +#define PIN_BUTTON2 12 +#define PIN_BUTTON3 24 +#define PIN_BUTTON4 25 + +/* + * Analog pins + */ +#define PIN_A0 (5) +#define PIN_A1 (31) +#define PIN_A2 (28) +#define PIN_A3 (29) +#define PIN_A4 (30) +#define PIN_A5 (31) +#define PIN_A6 (0xff) +#define PIN_A7 (0xff) + +static const uint8_t A0 = PIN_A0; +static const uint8_t A1 = PIN_A1; +static const uint8_t A2 = PIN_A2; +static const uint8_t A3 = PIN_A3; +static const uint8_t A4 = PIN_A4; +static const uint8_t A5 = PIN_A5; +static const uint8_t A6 = PIN_A6; +static const uint8_t A7 = PIN_A7; +#define ADC_RESOLUTION 14 + +// Other pins +#define PIN_AREF (2) +#define PIN_NFC1 (9) +#define PIN_NFC2 (10) + +static const uint8_t AREF = PIN_AREF; + +/* + * Serial interfaces + */ +#define PIN_SERIAL1_RX (15) +#define PIN_SERIAL1_TX (16) + +// Connected to Jlink CDC +#define PIN_SERIAL2_RX (8) +#define PIN_SERIAL2_TX (6) + +/* + * SPI Interfaces + */ +#define SPI_INTERFACES_COUNT 2 + +#define PIN_SPI_MISO (45) +#define PIN_SPI_MOSI (44) +#define PIN_SPI_SCK (43) + +#define PIN_SPI1_MISO (29) // (0 + 29) +#define PIN_SPI1_MOSI (30) // (0 + 30) +#define PIN_SPI1_SCK (3) // (0 + 3) + +static const uint8_t SS = 42; +static const uint8_t MOSI = PIN_SPI_MOSI; +static const uint8_t MISO = PIN_SPI_MISO; +static const uint8_t SCK = PIN_SPI_SCK; + +/* + * eink display pins + */ + +// #define PIN_EINK_CS (0 + 26) +// #define PIN_EINK_BUSY (0 + 4) +// #define PIN_EINK_DC (0 + 17) +// #define PIN_EINK_RES (-1) +// #define PIN_EINK_SCLK (0 + 3) +// #define PIN_EINK_MOSI (0 + 30) // also called SDI + +// #define USE_EINK + +// Display - OLED connected via I2C +#define HAS_SCREEN 1 +#define USE_SSD1306 + +// RAKRGB +// #define HAS_NCP5623 + +/* + * Wire Interfaces + */ +#define WIRE_INTERFACES_COUNT 1 + +#define PIN_WIRE_SDA (13) +#define PIN_WIRE_SCL (14) + +// QSPI Pins +#define PIN_QSPI_SCK 3 +#define PIN_QSPI_CS 26 +#define PIN_QSPI_IO0 30 +#define PIN_QSPI_IO1 29 +#define PIN_QSPI_IO2 28 +#define PIN_QSPI_IO3 2 + +// On-board QSPI Flash +#define EXTERNAL_FLASH_DEVICES IS25LP080D +#define EXTERNAL_FLASH_USE_QSPI + +/* @note RAK5005-O GPIO mapping to RAK4631 GPIO ports + RAK5005-O <-> nRF52840 + IO1 <-> P0.17 (Arduino GPIO number 17) + IO2 <-> P1.02 (Arduino GPIO number 34) + IO3 <-> P0.21 (Arduino GPIO number 21) + IO4 <-> P0.04 (Arduino GPIO number 4) + IO5 <-> P0.09 (Arduino GPIO number 9) + IO6 <-> P0.10 (Arduino GPIO number 10) + IO7 <-> P0.28 (Arduino GPIO number 28) + SW1 <-> P0.01 (Arduino GPIO number 1) + A0 <-> P0.04/AIN2 (Arduino Analog A2 + A1 <-> P0.31/AIN7 (Arduino Analog A7 + SPI_CS <-> P0.26 (Arduino GPIO number 26) + */ + +// RAK4630 LoRa module + +/* Setup of the SX1262 LoRa module ( https://docs.rakwireless.com/Product-Categories/WisBlock/RAK4631/Datasheet/ ) + +P1.10 NSS SPI NSS (Arduino GPIO number 42) +P1.11 SCK SPI CLK (Arduino GPIO number 43) +P1.12 MOSI SPI MOSI (Arduino GPIO number 44) +P1.13 MISO SPI MISO (Arduino GPIO number 45) +P1.14 BUSY BUSY signal (Arduino GPIO number 46) +P1.15 DIO1 DIO1 event interrupt (Arduino GPIO number 47) +P1.06 NRESET NRESET manual reset of the SX1262 (Arduino GPIO number 38) + +Important for successful SX1262 initialization: + +* Setup DIO2 to control the antenna switch +* Setup DIO3 to control the TCXO power supply +* Setup the SX1262 to use it's DCDC regulator and not the LDO +* RAK4630 schematics show GPIO P1.07 connected to the antenna switch, but it should not be initialized, as DIO2 will do the +control of the antenna switch + +SO GPIO 39/TXEN MAY NOT BE DEFINED FOR SUCCESSFUL OPERATION OF THE SX1262 - TG + +*/ + +// configure the SET pin on the RAK12039 sensor board to disable the sensor while not reading +// air quality telemetry. PIN_NFC2 doesn't seem to be used anywhere else in the codebase, but if +// you're having problems with your node behaving weirdly when a RAK12039 board isn't connected, +// try disabling this. +// #define PMSA003I_ENABLE_PIN PIN_NFC2 + +// #define DETECTION_SENSOR_EN 4 + +#define USE_SX1262 +#define SX126X_CS (42) +#define SX126X_DIO1 (47) +#define SX126X_BUSY (46) +#define SX126X_RESET (38) +// #define SX126X_TXEN (39) +// #define SX126X_RXEN (37) +#define SX126X_POWER_EN (37) +// DIO2 controlls an antenna switch and the TCXO voltage is controlled by DIO3 +#define SX126X_DIO2_AS_RF_SWITCH +#define SX126X_DIO3_TCXO_VOLTAGE 1.8 + +// Testing USB detection +#define NRF_APM + +// enables 3.3V periphery like GPS or IO Module +// Do not toggle this for GPS power savings +#define PIN_3V3_EN (34) + +// RAK1910 GPS module +// If using the wisblock GPS module and pluged into Port A on WisBlock base +// IO1 is hooked to PPS (pin 12 on header) = gpio 17 +// IO2 is hooked to GPS RESET = gpio 34, but it can not be used to this because IO2 is ALSO used to control 3V3_S power (1 is on). +// Therefore must be 1 to keep peripherals powered +// Power is on the controllable 3V3_S rail +// #define PIN_GPS_RESET (34) +// #define PIN_GPS_EN PIN_3V3_EN +#define PIN_GPS_PPS (17) // Pulse per second input from the GPS + +#define GPS_RX_PIN PIN_SERIAL1_RX +#define GPS_TX_PIN PIN_SERIAL1_TX + +// Define pin to enable GPS toggle (set GPIO to LOW) via user button triple press + +// RAK12002 RTC Module +// #define RV3028_RTC (uint8_t)0b1010010 + +// RAK18001 Buzzer in Slot C +// #define PIN_BUZZER 21 // IO3 is PWM2 +// NEW: set this via protobuf instead! + +// Battery +// The battery sense is hooked to pin A0 (5) +#define BATTERY_PIN PIN_A0 +// and has 12 bit resolution +#define BATTERY_SENSE_RESOLUTION_BITS 12 +#define BATTERY_SENSE_RESOLUTION 4096.0 +#undef AREF_VOLTAGE +#define AREF_VOLTAGE 3.0 +#define VBAT_AR_INTERNAL AR_INTERNAL_3_0 +#define ADC_MULTIPLIER 1.73 + +// #define HAS_RTC 1 + +// #define HAS_ETHERNET 1 + +// #define RAK_4631 1 + +// #define PIN_ETHERNET_RESET 21 +// #define PIN_ETHERNET_SS PIN_EINK_CS +// #define ETH_SPI_PORT SPI1 +// #define AQ_SET_PIN 10 + +#ifdef __cplusplus +} +#endif + +/*---------------------------------------------------------------------------- + * Arduino objects - C++ only + *----------------------------------------------------------------------------*/ + +#endif \ No newline at end of file diff --git a/variants/heltec_mesh_pocket/nicheGraphics.h b/variants/heltec_mesh_pocket/nicheGraphics.h index 271a35d6d6..b697faa572 100644 --- a/variants/heltec_mesh_pocket/nicheGraphics.h +++ b/variants/heltec_mesh_pocket/nicheGraphics.h @@ -16,42 +16,54 @@ #include "graphics/niche/InkHUD/Applets/User/RecentsList/RecentsListApplet.h" #include "graphics/niche/InkHUD/Applets/User/ThreadedMessage/ThreadedMessageApplet.h" +// #include "graphics/niche/InkHUD/Applets/Examples/BasicExample/BasicExampleApplet.h" +// #include "graphics/niche/InkHUD/Applets/Examples/NewMsgExample/NewMsgExampleApplet.h" + // Shared NicheGraphics components // -------------------------------- #include "graphics/niche/Drivers/EInk/LCMEN2R13ECC1.h" #include "graphics/niche/Inputs/TwoButton.h" +#include "graphics/niche/Fonts/FreeSans6pt7b.h" +#include "graphics/niche/Fonts/FreeSans6pt8bCyrillic.h" +#include + void setupNicheGraphics() { using namespace NicheGraphics; // SPI // ----------------------------- - - // For NRF52 platforms, SPI pins are defined in variant.h - SPI1.begin(); + SPIClass *spi1 = &SPI1; + spi1->begin(); + // Display is connected to SPI1 // E-Ink Driver // ----------------------------- - + // Use E-Ink driver Drivers::EInk *driver = new Drivers::LCMEN2R13ECC1; - driver->begin(&SPI1, PIN_EINK_DC, PIN_EINK_CS, PIN_EINK_BUSY, PIN_EINK_RES); + driver->begin(spi1, PIN_EINK_DC, PIN_EINK_CS, PIN_EINK_BUSY, PIN_EINK_RES); // InkHUD // ---------------------------- InkHUD::InkHUD *inkhud = InkHUD::InkHUD::getInstance(); - // Set the E-Ink driver + // Set the driver inkhud->setDriver(driver); // Set how many FAST updates per FULL update // Set how unhealthy additional FAST updates beyond this number are inkhud->setDisplayResilience(10, 1.5); - // Select fonts - InkHUD::Applet::fontLarge = FREESANS_9PT_WIN1252; - InkHUD::Applet::fontSmall = FREESANS_6PT_WIN1252; + // Prepare fonts + InkHUD::Applet::fontLarge = InkHUD::AppletFont(FreeSans9pt7b); + InkHUD::Applet::fontSmall = InkHUD::AppletFont(FreeSans6pt7b); + /* + // Font localization demo: Cyrillic + InkHUD::Applet::fontSmall = InkHUD::AppletFont(FreeSans6pt8bCyrillic); + InkHUD::Applet::fontSmall.addSubstitutionsWin1251(); + */ // Customize default settings inkhud->persistence->settings.userTiles.maxCount = 2; // How many tiles can the display handle? @@ -60,14 +72,15 @@ void setupNicheGraphics() inkhud->persistence->settings.optionalMenuItems.nextTile = true; // Pick applets - // Note: order of applets determines priority of "auto-show" feature inkhud->addApplet("All Messages", new InkHUD::AllMessageApplet, true, true); // Activated, autoshown - inkhud->addApplet("DMs", new InkHUD::DMApplet); // - - inkhud->addApplet("Channel 0", new InkHUD::ThreadedMessageApplet(0)); // - - inkhud->addApplet("Channel 1", new InkHUD::ThreadedMessageApplet(1)); // - + inkhud->addApplet("DMs", new InkHUD::DMApplet); // Inactive + inkhud->addApplet("Channel 0", new InkHUD::ThreadedMessageApplet(0)); // Inactive + inkhud->addApplet("Channel 1", new InkHUD::ThreadedMessageApplet(1)); // Inactive inkhud->addApplet("Positions", new InkHUD::PositionsApplet, true); // Activated - inkhud->addApplet("Recents List", new InkHUD::RecentsListApplet); // - - inkhud->addApplet("Heard", new InkHUD::HeardApplet, true, false, 0); // Activated, no autoshow, default on tile 0 + inkhud->addApplet("Recents List", new InkHUD::RecentsListApplet); // Inactive + inkhud->addApplet("Heard", new InkHUD::HeardApplet, true, false, 0); // Activated, not autoshown, default on tile 0 + // inkhud->addApplet("Basic", new InkHUD::BasicExampleApplet); + // inkhud->addApplet("NewMsg", new InkHUD::NewMsgExampleApplet); // Start running InkHUD inkhud->begin(); @@ -76,13 +89,18 @@ void setupNicheGraphics() // -------------------------- Inputs::TwoButton *buttons = Inputs::TwoButton::getInstance(); // Shared NicheGraphics component - - // #0: Main User Button - buttons->setWiring(0, Inputs::TwoButton::getUserButtonPin()); - buttons->setHandlerShortPress(0, [inkhud]() { inkhud->shortpress(); }); - buttons->setHandlerLongPress(0, [inkhud]() { inkhud->longpress(); }); - - // Begin handling button events + constexpr uint8_t MAIN_BUTTON = 0; + // constexpr uint8_t AUX_BUTTON = 1; + + // Setup the main user button + buttons->setWiring(MAIN_BUTTON, Inputs::TwoButton::getUserButtonPin()); + buttons->setHandlerShortPress(MAIN_BUTTON, []() { InkHUD::InkHUD::getInstance()->shortpress(); }); + buttons->setHandlerLongPress(MAIN_BUTTON, []() { InkHUD::InkHUD::getInstance()->longpress(); }); + + // Setup the aux button + // Bonus feature of VME213 + // buttons->setWiring(AUX_BUTTON, BUTTON_PIN_SECONDARY); + // buttons->setHandlerShortPress(AUX_BUTTON, []() { InkHUD::InkHUD::getInstance()->nextTile(); }); buttons->start(); } diff --git a/variants/heltec_vision_master_e213/nicheGraphics.h b/variants/heltec_vision_master_e213/nicheGraphics.h index 7eccb29556..d6983bafe0 100644 --- a/variants/heltec_vision_master_e213/nicheGraphics.h +++ b/variants/heltec_vision_master_e213/nicheGraphics.h @@ -16,11 +16,18 @@ #include "graphics/niche/InkHUD/Applets/User/RecentsList/RecentsListApplet.h" #include "graphics/niche/InkHUD/Applets/User/ThreadedMessage/ThreadedMessageApplet.h" +// #include "graphics/niche/InkHUD/Applets/Examples/BasicExample/BasicExampleApplet.h" +// #include "graphics/niche/InkHUD/Applets/Examples/NewMsgExample/NewMsgExampleApplet.h" + // Shared NicheGraphics components // -------------------------------- #include "graphics/niche/Drivers/EInk/LCMEN2R13EFC1.h" #include "graphics/niche/Inputs/TwoButton.h" +#include "graphics/niche/Fonts/FreeSans6pt7b.h" +#include "graphics/niche/Fonts/FreeSans6pt8bCyrillic.h" +#include + void setupNicheGraphics() { using namespace NicheGraphics; @@ -35,6 +42,7 @@ void setupNicheGraphics() // E-Ink Driver // ----------------------------- + // Use E-Ink driver Drivers::EInk *driver = new Drivers::LCMEN213EFC1; driver->begin(hspi, PIN_EINK_DC, PIN_EINK_CS, PIN_EINK_BUSY, PIN_EINK_RES); @@ -43,16 +51,21 @@ void setupNicheGraphics() InkHUD::InkHUD *inkhud = InkHUD::InkHUD::getInstance(); - // Set the E-Ink driver + // Set the driver inkhud->setDriver(driver); // Set how many FAST updates per FULL update // Set how unhealthy additional FAST updates beyond this number are inkhud->setDisplayResilience(10, 1.5); - // Select fonts - InkHUD::Applet::fontLarge = FREESANS_9PT_WIN1252; - InkHUD::Applet::fontSmall = FREESANS_6PT_WIN1252; + // Prepare fonts + InkHUD::Applet::fontLarge = InkHUD::AppletFont(FreeSans9pt7b); + InkHUD::Applet::fontSmall = InkHUD::AppletFont(FreeSans6pt7b); + /* + // Font localization demo: Cyrillic + InkHUD::Applet::fontSmall = InkHUD::AppletFont(FreeSans6pt8bCyrillic); + InkHUD::Applet::fontSmall.addSubstitutionsWin1251(); + */ // Customize default settings inkhud->persistence->settings.userTiles.maxCount = 2; // How many tiles can the display handle? @@ -61,14 +74,15 @@ void setupNicheGraphics() inkhud->persistence->settings.optionalMenuItems.nextTile = false; // Behavior handled by aux button instead // Pick applets - // Note: order of applets determines priority of "auto-show" feature inkhud->addApplet("All Messages", new InkHUD::AllMessageApplet, true, true); // Activated, autoshown - inkhud->addApplet("DMs", new InkHUD::DMApplet); // - - inkhud->addApplet("Channel 0", new InkHUD::ThreadedMessageApplet(0)); // - - inkhud->addApplet("Channel 1", new InkHUD::ThreadedMessageApplet(1)); // - + inkhud->addApplet("DMs", new InkHUD::DMApplet); // Inactive + inkhud->addApplet("Channel 0", new InkHUD::ThreadedMessageApplet(0)); // Inactive + inkhud->addApplet("Channel 1", new InkHUD::ThreadedMessageApplet(1)); // Inactive inkhud->addApplet("Positions", new InkHUD::PositionsApplet, true); // Activated - inkhud->addApplet("Recents List", new InkHUD::RecentsListApplet); // - + inkhud->addApplet("Recents List", new InkHUD::RecentsListApplet); // Inactive inkhud->addApplet("Heard", new InkHUD::HeardApplet, true, false, 0); // Activated, not autoshown, default on tile 0 + // inkhud->addApplet("Basic", new InkHUD::BasicExampleApplet); + // inkhud->addApplet("NewMsg", new InkHUD::NewMsgExampleApplet); // Start running InkHUD inkhud->begin(); @@ -77,17 +91,18 @@ void setupNicheGraphics() // -------------------------- Inputs::TwoButton *buttons = Inputs::TwoButton::getInstance(); // Shared NicheGraphics component - - // #0: Main User Button - buttons->setWiring(0, Inputs::TwoButton::getUserButtonPin()); - buttons->setHandlerShortPress(0, [inkhud]() { inkhud->shortpress(); }); - buttons->setHandlerLongPress(0, [inkhud]() { inkhud->longpress(); }); - - // #1: Aux Button - buttons->setWiring(1, BUTTON_PIN_SECONDARY); - buttons->setHandlerShortPress(1, [inkhud]() { inkhud->nextTile(); }); - - // Begin handling button events + constexpr uint8_t MAIN_BUTTON = 0; + constexpr uint8_t AUX_BUTTON = 1; + + // Setup the main user button + buttons->setWiring(MAIN_BUTTON, Inputs::TwoButton::getUserButtonPin()); + buttons->setHandlerShortPress(MAIN_BUTTON, []() { InkHUD::InkHUD::getInstance()->shortpress(); }); + buttons->setHandlerLongPress(MAIN_BUTTON, []() { InkHUD::InkHUD::getInstance()->longpress(); }); + + // Setup the aux button + // Bonus feature of VME213 + buttons->setWiring(AUX_BUTTON, BUTTON_PIN_SECONDARY); + buttons->setHandlerShortPress(AUX_BUTTON, []() { InkHUD::InkHUD::getInstance()->nextTile(); }); buttons->start(); } diff --git a/variants/heltec_vision_master_e213/variant.h b/variants/heltec_vision_master_e213/variant.h index ebb2c341fd..49b8e91f5b 100644 --- a/variants/heltec_vision_master_e213/variant.h +++ b/variants/heltec_vision_master_e213/variant.h @@ -31,6 +31,7 @@ #define ADC_CHANNEL ADC1_GPIO7_CHANNEL #define ADC_MULTIPLIER 4.9 * 1.03 #define ADC_ATTENUATION ADC_ATTEN_DB_2_5 +#define HAS_32768HZ // LoRa #define USE_SX1262 diff --git a/variants/heltec_vision_master_e290/nicheGraphics.h b/variants/heltec_vision_master_e290/nicheGraphics.h index af78df7461..c2f26c7ff9 100644 --- a/variants/heltec_vision_master_e290/nicheGraphics.h +++ b/variants/heltec_vision_master_e290/nicheGraphics.h @@ -29,11 +29,18 @@ Different NicheGraphics UIs and different hardware variants will each have their #include "graphics/niche/InkHUD/Applets/User/RecentsList/RecentsListApplet.h" #include "graphics/niche/InkHUD/Applets/User/ThreadedMessage/ThreadedMessageApplet.h" +// #include "graphics/niche/InkHUD/Applets/Examples/BasicExample/BasicExampleApplet.h" +// #include "graphics/niche/InkHUD/Applets/Examples/NewMsgExample/NewMsgExampleApplet.h" + // Shared NicheGraphics components // -------------------------------- #include "graphics/niche/Drivers/EInk/DEPG0290BNS800.h" #include "graphics/niche/Inputs/TwoButton.h" +#include "graphics/niche/Fonts/FreeSans6pt7b.h" +#include "graphics/niche/Fonts/FreeSans6pt8bCyrillic.h" +#include + void setupNicheGraphics() { using namespace NicheGraphics; @@ -48,6 +55,7 @@ void setupNicheGraphics() // E-Ink Driver // ----------------------------- + // Use E-Ink driver Drivers::EInk *driver = new Drivers::DEPG0290BNS800; driver->begin(hspi, PIN_EINK_DC, PIN_EINK_CS, PIN_EINK_BUSY); @@ -56,16 +64,21 @@ void setupNicheGraphics() InkHUD::InkHUD *inkhud = InkHUD::InkHUD::getInstance(); - // Set the E-Ink driver + // Set the driver inkhud->setDriver(driver); // Set how many FAST updates per FULL update // Set how unhealthy additional FAST updates beyond this number are inkhud->setDisplayResilience(7, 1.5); - // Select fonts - InkHUD::Applet::fontLarge = FREESANS_9PT_WIN1252; - InkHUD::Applet::fontSmall = FREESANS_6PT_WIN1252; + // Prepare fonts + InkHUD::Applet::fontLarge = InkHUD::AppletFont(FreeSans9pt7b); + InkHUD::Applet::fontSmall = InkHUD::AppletFont(FreeSans6pt7b); + /* + // Font localization demo: Cyrillic + InkHUD::Applet::fontSmall = InkHUD::AppletFont(FreeSans6pt8bCyrillic); + InkHUD::Applet::fontSmall.addSubstitutionsWin1251(); + */ // Customize default settings inkhud->persistence->settings.userTiles.maxCount = 2; // How many tiles can the display handle? @@ -74,14 +87,22 @@ void setupNicheGraphics() inkhud->persistence->settings.optionalMenuItems.nextTile = false; // Behavior handled by aux button instead // Pick applets - // Note: order of applets determines priority of "auto-show" feature + + // Order of applets determines priority of "auto-show" feature. + // Optional arguments for default state: + // - is activated? + // - is autoshown? + // - is foreground on a specific tile (index)? + inkhud->addApplet("All Messages", new InkHUD::AllMessageApplet, true, true); // Activated, autoshown - inkhud->addApplet("DMs", new InkHUD::DMApplet); // - - inkhud->addApplet("Channel 0", new InkHUD::ThreadedMessageApplet(0)); // - - inkhud->addApplet("Channel 1", new InkHUD::ThreadedMessageApplet(1)); // - + inkhud->addApplet("DMs", new InkHUD::DMApplet); // Inactive + inkhud->addApplet("Channel 0", new InkHUD::ThreadedMessageApplet(0)); // Inactive + inkhud->addApplet("Channel 1", new InkHUD::ThreadedMessageApplet(1)); // Inactive inkhud->addApplet("Positions", new InkHUD::PositionsApplet, true); // Activated - inkhud->addApplet("Recents List", new InkHUD::RecentsListApplet); // - + inkhud->addApplet("Recents List", new InkHUD::RecentsListApplet); // Inactive inkhud->addApplet("Heard", new InkHUD::HeardApplet, true, false, 0); // Activated, not autoshown, default on tile 0 + // inkhud->addApplet("Basic", new InkHUD::BasicExampleApplet); + // inkhud->addApplet("NewMsg", new InkHUD::NewMsgExampleApplet); // Start running InkHUD inkhud->begin(); @@ -91,16 +112,16 @@ void setupNicheGraphics() Inputs::TwoButton *buttons = Inputs::TwoButton::getInstance(); // A shared NicheGraphics component - // #0: Main User Button + // Setup the main user button (0) buttons->setWiring(0, Inputs::TwoButton::getUserButtonPin()); - buttons->setHandlerShortPress(0, [inkhud]() { inkhud->shortpress(); }); - buttons->setHandlerLongPress(0, [inkhud]() { inkhud->longpress(); }); + buttons->setHandlerShortPress(0, []() { InkHUD::InkHUD::getInstance()->shortpress(); }); + buttons->setHandlerLongPress(0, []() { InkHUD::InkHUD::getInstance()->longpress(); }); - // #1: Aux Button + // Setup the aux button (1) + // Bonus feature of VME290 buttons->setWiring(1, BUTTON_PIN_SECONDARY); - buttons->setHandlerShortPress(1, [inkhud]() { inkhud->nextTile(); }); + buttons->setHandlerShortPress(1, []() { InkHUD::InkHUD::getInstance()->nextTile(); }); - // Begin handling button events buttons->start(); } diff --git a/variants/heltec_vision_master_e290/variant.h b/variants/heltec_vision_master_e290/variant.h index 02986d26b8..9d6041539d 100644 --- a/variants/heltec_vision_master_e290/variant.h +++ b/variants/heltec_vision_master_e290/variant.h @@ -30,6 +30,7 @@ #define ADC_CHANNEL ADC1_GPIO7_CHANNEL #define ADC_MULTIPLIER 4.9 * 1.03 #define ADC_ATTENUATION ADC_ATTEN_DB_2_5 +#define HAS_32768HZ // LoRa #define USE_SX1262 diff --git a/variants/heltec_vision_master_t190/variant.h b/variants/heltec_vision_master_t190/variant.h index 788466919c..1da3f99711 100644 --- a/variants/heltec_vision_master_t190/variant.h +++ b/variants/heltec_vision_master_t190/variant.h @@ -47,6 +47,7 @@ #define ADC_CHANNEL ADC1_GPIO6_CHANNEL #define ADC_MULTIPLIER 4.9 * 1.03 // Voltage divider is roughly 1:1 #define ADC_ATTENUATION ADC_ATTEN_DB_2_5 // Voltage divider output is quite high +#define HAS_32768HZ // LoRa #define USE_SX1262 diff --git a/variants/heltec_wireless_paper/nicheGraphics.h b/variants/heltec_wireless_paper/nicheGraphics.h index c8994b7f16..5e938fa641 100644 --- a/variants/heltec_wireless_paper/nicheGraphics.h +++ b/variants/heltec_wireless_paper/nicheGraphics.h @@ -16,11 +16,18 @@ #include "graphics/niche/InkHUD/Applets/User/RecentsList/RecentsListApplet.h" #include "graphics/niche/InkHUD/Applets/User/ThreadedMessage/ThreadedMessageApplet.h" +// #include "graphics/niche/InkHUD/Applets/Examples/BasicExample/BasicExampleApplet.h" +// #include "graphics/niche/InkHUD/Applets/Examples/NewMsgExample/NewMsgExampleApplet.h" + // Shared NicheGraphics components // -------------------------------- #include "graphics/niche/Drivers/EInk/LCMEN2R13EFC1.h" #include "graphics/niche/Inputs/TwoButton.h" +#include "graphics/niche/Fonts/FreeSans6pt7b.h" +#include "graphics/niche/Fonts/FreeSans6pt8bCyrillic.h" +#include + void setupNicheGraphics() { using namespace NicheGraphics; @@ -35,6 +42,7 @@ void setupNicheGraphics() // E-Ink Driver // ----------------------------- + // Use E-Ink driver Drivers::EInk *driver = new Drivers::LCMEN213EFC1; driver->begin(hspi, PIN_EINK_DC, PIN_EINK_CS, PIN_EINK_BUSY, PIN_EINK_RES); @@ -43,16 +51,21 @@ void setupNicheGraphics() InkHUD::InkHUD *inkhud = InkHUD::InkHUD::getInstance(); - // Set the E-Ink driver + // Set the driver inkhud->setDriver(driver); // Set how many FAST updates per FULL update // Set how unhealthy additional FAST updates beyond this number are inkhud->setDisplayResilience(10, 1.5); - // Select fonts - InkHUD::Applet::fontLarge = FREESANS_9PT_WIN1252; - InkHUD::Applet::fontSmall = FREESANS_6PT_WIN1252; + // Prepare fonts + InkHUD::Applet::fontLarge = InkHUD::AppletFont(FreeSans9pt7b); + InkHUD::Applet::fontSmall = InkHUD::AppletFont(FreeSans6pt7b); + /* + // Font localization demo: Cyrillic + InkHUD::Applet::fontSmall = InkHUD::AppletFont(FreeSans6pt8bCyrillic); + InkHUD::Applet::fontSmall.addSubstitutionsWin1251(); + */ // Customize default settings inkhud->persistence->settings.userTiles.maxCount = 2; // How many tiles can the display handle? @@ -60,14 +73,15 @@ void setupNicheGraphics() inkhud->persistence->settings.userTiles.count = 1; // One tile only by default, keep things simple for new users // Pick applets - // Note: order of applets determines priority of "auto-show" feature inkhud->addApplet("All Messages", new InkHUD::AllMessageApplet, true, true); // Activated, autoshown - inkhud->addApplet("DMs", new InkHUD::DMApplet); // - - inkhud->addApplet("Channel 0", new InkHUD::ThreadedMessageApplet(0)); // - - inkhud->addApplet("Channel 1", new InkHUD::ThreadedMessageApplet(1)); // - + inkhud->addApplet("DMs", new InkHUD::DMApplet); // Inactive + inkhud->addApplet("Channel 0", new InkHUD::ThreadedMessageApplet(0)); // Inactive + inkhud->addApplet("Channel 1", new InkHUD::ThreadedMessageApplet(1)); // Inactive inkhud->addApplet("Positions", new InkHUD::PositionsApplet, true); // Activated - inkhud->addApplet("Recents List", new InkHUD::RecentsListApplet); // - + inkhud->addApplet("Recents List", new InkHUD::RecentsListApplet); // Inactive inkhud->addApplet("Heard", new InkHUD::HeardApplet, true, false, 0); // Activated, not autoshown, default on tile 0 + // inkhud->addApplet("Basic", new InkHUD::BasicExampleApplet); + // inkhud->addApplet("NewMsg", new InkHUD::NewMsgExampleApplet); // Start running InkHUD inkhud->begin(); @@ -76,15 +90,15 @@ void setupNicheGraphics() // -------------------------- Inputs::TwoButton *buttons = Inputs::TwoButton::getInstance(); // Shared NicheGraphics component + constexpr uint8_t MAIN_BUTTON = 0; - // #0: Main User Button - buttons->setWiring(0, Inputs::TwoButton::getUserButtonPin()); - buttons->setHandlerShortPress(0, [inkhud]() { inkhud->shortpress(); }); - buttons->setHandlerLongPress(0, [inkhud]() { inkhud->longpress(); }); + // Setup the main user button + buttons->setWiring(MAIN_BUTTON, Inputs::TwoButton::getUserButtonPin()); + buttons->setHandlerShortPress(MAIN_BUTTON, []() { InkHUD::InkHUD::getInstance()->shortpress(); }); + buttons->setHandlerLongPress(MAIN_BUTTON, []() { InkHUD::InkHUD::getInstance()->longpress(); }); // No aux button on this board - // Begin handling button events buttons->start(); } diff --git a/variants/heltec_wireless_paper/variant.h b/variants/heltec_wireless_paper/variant.h index bbfd54ada7..0385945e68 100644 --- a/variants/heltec_wireless_paper/variant.h +++ b/variants/heltec_wireless_paper/variant.h @@ -28,6 +28,7 @@ #define ADC_MULTIPLIER 2 // Voltage divider is roughly 1:1 #define BAT_MEASURE_ADC_UNIT 2 // Use ADC2 #define ADC_ATTENUATION ADC_ATTEN_DB_12 // Voltage divider output is quite high +#define HAS_32768HZ #define ADC_CTRL_ENABLED LOW #define NO_EXT_GPIO 1 diff --git a/variants/heltec_wireless_paper_v1/variant.h b/variants/heltec_wireless_paper_v1/variant.h index 4505395c9f..fe8f391df4 100644 --- a/variants/heltec_wireless_paper_v1/variant.h +++ b/variants/heltec_wireless_paper_v1/variant.h @@ -29,6 +29,7 @@ #define ADC_MULTIPLIER 2 // Voltage divider is roughly 1:1 #define BAT_MEASURE_ADC_UNIT 2 // Use ADC2 #define ADC_ATTENUATION ADC_ATTEN_DB_12 // Voltage divider output is quite high +#define HAS_32768HZ #define ADC_CTRL_ENABLED LOW #define NO_EXT_GPIO 1 diff --git a/variants/t-echo/nicheGraphics.h b/variants/t-echo/nicheGraphics.h index 03185cf5be..af310db253 100644 --- a/variants/t-echo/nicheGraphics.h +++ b/variants/t-echo/nicheGraphics.h @@ -16,12 +16,19 @@ #include "graphics/niche/InkHUD/Applets/User/RecentsList/RecentsListApplet.h" #include "graphics/niche/InkHUD/Applets/User/ThreadedMessage/ThreadedMessageApplet.h" +// #include "graphics/niche/InkHUD/Applets/Examples/BasicExample/BasicExampleApplet.h" +// #include "graphics/niche/InkHUD/Applets/Examples/NewMsgExample/NewMsgExampleApplet.h" + // Shared NicheGraphics components // -------------------------------- #include "graphics/niche/Drivers/Backlight/LatchingBacklight.h" #include "graphics/niche/Drivers/EInk/GDEY0154D67.h" #include "graphics/niche/Inputs/TwoButton.h" +#include "graphics/niche/Fonts/FreeSans6pt7b.h" +#include "graphics/niche/Fonts/FreeSans6pt8bCyrillic.h" +#include + // Special case - fix T-Echo's touch button // ---------------------------------------- // On a handful of T-Echos, LoRa TX triggers the capacitive touch @@ -35,30 +42,37 @@ void setupNicheGraphics() // SPI // ----------------------------- - // For NRF52 platforms, SPI pins are defined in variant.h - SPI1.begin(); + // For NRF52 platforms, SPI pins are defined in variant.h, not passed to begin() + SPIClass *inkSPI = &SPI1; + inkSPI->begin(); - // E-Ink Driver + // Driver // ----------------------------- + // Use E-Ink driver Drivers::EInk *driver = new Drivers::GDEY0154D67; - driver->begin(&SPI1, PIN_EINK_DC, PIN_EINK_CS, PIN_EINK_BUSY, PIN_EINK_RES); + driver->begin(inkSPI, PIN_EINK_DC, PIN_EINK_CS, PIN_EINK_BUSY, PIN_EINK_RES); // InkHUD // ---------------------------- InkHUD::InkHUD *inkhud = InkHUD::InkHUD::getInstance(); - // Set the E-Ink driver + // Set the driver inkhud->setDriver(driver); // Set how many FAST updates per FULL update // Set how unhealthy additional FAST updates beyond this number are inkhud->setDisplayResilience(20, 1.5); - // Select fonts - InkHUD::Applet::fontLarge = FREESANS_9PT_WIN1252; - InkHUD::Applet::fontSmall = FREESANS_6PT_WIN1252; + // Prepare fonts + InkHUD::Applet::fontLarge = InkHUD::AppletFont(FreeSans9pt7b); + InkHUD::Applet::fontSmall = InkHUD::AppletFont(FreeSans6pt7b); + /* + // Font localization demo: Cyrillic + InkHUD::Applet::fontSmall = InkHUD::AppletFont(FreeSans6pt8bCyrillic); + InkHUD::Applet::fontSmall.addSubstitutionsWin1251(); + */ // Customize default settings inkhud->persistence->settings.userTiles.maxCount = 2; // Two applets side-by-side @@ -66,20 +80,22 @@ void setupNicheGraphics() inkhud->persistence->settings.optionalFeatures.batteryIcon = true; // Device definitely has a battery inkhud->persistence->settings.optionalMenuItems.backlight = true; // Until proves capacitive button works by touching it - // Setup backlight controller - // Note: AUX button attached further down + // Setup backlight + // Note: AUX button behavior configured further down Drivers::LatchingBacklight *backlight = Drivers::LatchingBacklight::getInstance(); backlight->setPin(PIN_EINK_EN); // Pick applets // Note: order of applets determines priority of "auto-show" feature inkhud->addApplet("All Messages", new InkHUD::AllMessageApplet, true, true); // Activated, autoshown - inkhud->addApplet("DMs", new InkHUD::DMApplet); // - - inkhud->addApplet("Channel 0", new InkHUD::ThreadedMessageApplet(0)); // - - inkhud->addApplet("Channel 1", new InkHUD::ThreadedMessageApplet(1)); // - - inkhud->addApplet("Positions", new InkHUD::PositionsApplet, true); // Activated - inkhud->addApplet("Recents List", new InkHUD::RecentsListApplet); // - - inkhud->addApplet("Heard", new InkHUD::HeardApplet, true, false, 0); // Activated, no autoshow, default on tile 0 + inkhud->addApplet("DMs", new InkHUD::DMApplet); + inkhud->addApplet("Channel 0", new InkHUD::ThreadedMessageApplet(0)); + inkhud->addApplet("Channel 1", new InkHUD::ThreadedMessageApplet(1)); + inkhud->addApplet("Positions", new InkHUD::PositionsApplet, true); // Activated + inkhud->addApplet("Recents List", new InkHUD::RecentsListApplet); + inkhud->addApplet("Heard", new InkHUD::HeardApplet, true, false, 0); // Activated, no autoshow, default on tile 0 + // inkhud->addApplet("Basic", new InkHUD::BasicExampleApplet); + // inkhud->addApplet("NewMsg", new InkHUD::NewMsgExampleApplet); // Start running InkHUD inkhud->begin(); @@ -89,19 +105,22 @@ void setupNicheGraphics() Inputs::TwoButton *buttons = Inputs::TwoButton::getInstance(); // Shared NicheGraphics component - // #0: Main User Button - buttons->setWiring(0, Inputs::TwoButton::getUserButtonPin()); - buttons->setTiming(0, 75, 500); - buttons->setHandlerShortPress(0, [inkhud]() { inkhud->shortpress(); }); - buttons->setHandlerLongPress(0, [inkhud]() { inkhud->longpress(); }); + // (To improve code readability only) + constexpr uint8_t MAIN_BUTTON = 0; + constexpr uint8_t TOUCH_BUTTON = 1; + + // Setup the main user button + buttons->setWiring(MAIN_BUTTON, Inputs::TwoButton::getUserButtonPin()); + buttons->setTiming(MAIN_BUTTON, 75, 500); + buttons->setHandlerShortPress(MAIN_BUTTON, []() { InkHUD::InkHUD::getInstance()->shortpress(); }); + buttons->setHandlerLongPress(MAIN_BUTTON, []() { InkHUD::InkHUD::getInstance()->longpress(); }); - // #1: Aux Button (Capacitive Touch Button) + // Setup the capacitive touch button // - short: momentary backlight // - long: latch backlight on - buttons->setWiring(1, PIN_BUTTON_TOUCH); - buttons->setTiming(1, 50, 5000); // 5 seconds before latch - limited by T-Echo's capacitive touch IC - - buttons->setHandlerDown(1, [inkhud, backlight]() { + buttons->setWiring(TOUCH_BUTTON, PIN_BUTTON_TOUCH); + buttons->setTiming(TOUCH_BUTTON, 50, 5000); // 5 seconds before latch - limited by T-Echo's capacitive touch IC + buttons->setHandlerDown(TOUCH_BUTTON, [backlight]() { // Discard the button press if radio is active // Rare hardware fault: LoRa activity triggers touch button if (!RadioLibInterface::instance || RadioLibInterface::instance->isSending()) @@ -112,11 +131,10 @@ void setupNicheGraphics() // Handler has run, which confirms touch button wasn't removed as part of DIY build. // No longer need the fallback backlight toggle in menu. - inkhud->persistence->settings.optionalMenuItems.backlight = false; + InkHUD::InkHUD::getInstance()->persistence->settings.optionalMenuItems.backlight = false; }); - - buttons->setHandlerLongPress(1, [backlight]() { backlight->latch(); }); - buttons->setHandlerShortPress(1, [backlight]() { backlight->off(); }); + buttons->setHandlerLongPress(TOUCH_BUTTON, [backlight]() { backlight->latch(); }); + buttons->setHandlerShortPress(TOUCH_BUTTON, [backlight]() { backlight->off(); }); // Begin handling button events buttons->start(); diff --git a/variants/tlora_t3s3_epaper/nicheGraphics.h b/variants/tlora_t3s3_epaper/nicheGraphics.h index 5184037e89..55bb9a203d 100644 --- a/variants/tlora_t3s3_epaper/nicheGraphics.h +++ b/variants/tlora_t3s3_epaper/nicheGraphics.h @@ -16,11 +16,18 @@ #include "graphics/niche/InkHUD/Applets/User/RecentsList/RecentsListApplet.h" #include "graphics/niche/InkHUD/Applets/User/ThreadedMessage/ThreadedMessageApplet.h" +// #include "graphics/niche/InkHUD/Applets/Examples/BasicExample/BasicExampleApplet.h" +// #include "graphics/niche/InkHUD/Applets/Examples/NewMsgExample/NewMsgExampleApplet.h" + // Shared NicheGraphics components // -------------------------------- #include "graphics/niche/Drivers/EInk/DEPG0213BNS800.h" #include "graphics/niche/Inputs/TwoButton.h" +#include "graphics/niche/Fonts/FreeSans6pt7b.h" +#include "graphics/niche/Fonts/FreeSans6pt8bCyrillic.h" +#include + void setupNicheGraphics() { using namespace NicheGraphics; @@ -35,6 +42,7 @@ void setupNicheGraphics() // E-Ink Driver // ----------------------------- + // Use E-Ink driver Drivers::EInk *driver = new Drivers::DEPG0213BNS800; driver->begin(hspi, PIN_EINK_DC, PIN_EINK_CS, PIN_EINK_BUSY, PIN_EINK_RES); @@ -50,9 +58,14 @@ void setupNicheGraphics() // Set how unhealthy additional FAST updates beyond this number are inkhud->setDisplayResilience(15, 1.5); - // Select fonts - InkHUD::Applet::fontLarge = FREESANS_9PT_WIN1252; - InkHUD::Applet::fontSmall = FREESANS_6PT_WIN1252; + // Prepare fonts + InkHUD::Applet::fontLarge = InkHUD::AppletFont(FreeSans9pt7b); + InkHUD::Applet::fontSmall = InkHUD::AppletFont(FreeSans6pt7b); + /* + // Font localization demo: Cyrillic + InkHUD::Applet::fontSmall = InkHUD::AppletFont(FreeSans6pt8bCyrillic); + InkHUD::Applet::fontSmall.addSubstitutionsWin1251(); + */ // Customize default settings inkhud->persistence->settings.userTiles.maxCount = 2; // How many tiles can the display handle? @@ -60,14 +73,15 @@ void setupNicheGraphics() inkhud->persistence->settings.userTiles.count = 1; // One tile only by default, keep things simple for new users // Pick applets - // Note: order of applets determines priority of "auto-show" feature inkhud->addApplet("All Messages", new InkHUD::AllMessageApplet, true, true); // Activated, autoshown - inkhud->addApplet("DMs", new InkHUD::DMApplet); // - - inkhud->addApplet("Channel 0", new InkHUD::ThreadedMessageApplet(0)); // - - inkhud->addApplet("Channel 1", new InkHUD::ThreadedMessageApplet(1)); // - + inkhud->addApplet("DMs", new InkHUD::DMApplet); // Inactive + inkhud->addApplet("Channel 0", new InkHUD::ThreadedMessageApplet(0)); // Inactive + inkhud->addApplet("Channel 1", new InkHUD::ThreadedMessageApplet(1)); // Inactive inkhud->addApplet("Positions", new InkHUD::PositionsApplet, true); // Activated - inkhud->addApplet("Recents List", new InkHUD::RecentsListApplet); // - + inkhud->addApplet("Recents List", new InkHUD::RecentsListApplet); // Inactive inkhud->addApplet("Heard", new InkHUD::HeardApplet, true, false, 0); // Activated, not autoshown, default on tile 0 + // inkhud->addApplet("Basic", new InkHUD::BasicExampleApplet); + // inkhud->addApplet("NewMsg", new InkHUD::NewMsgExampleApplet); // Start running InkHUD inkhud->begin(); @@ -79,8 +93,8 @@ void setupNicheGraphics() // Setup the main user button buttons->setWiring(0, Inputs::TwoButton::getUserButtonPin(), true); - buttons->setHandlerShortPress(0, [inkhud]() { inkhud->shortpress(); }); - buttons->setHandlerLongPress(0, [inkhud]() { inkhud->longpress(); }); + buttons->setHandlerShortPress(0, []() { InkHUD::InkHUD::getInstance()->shortpress(); }); + buttons->setHandlerLongPress(0, []() { InkHUD::InkHUD::getInstance()->longpress(); }); buttons->start(); } diff --git a/variants/xiao_ble/variant.h b/variants/xiao_ble/variant.h index b46aa96ae4..d00f8be897 100644 --- a/variants/xiao_ble/variant.h +++ b/variants/xiao_ble/variant.h @@ -145,12 +145,12 @@ static const uint8_t SCK = PIN_SPI_SCK; #ifdef EBYTE_E22_900M30S // 10dB PA gain and 30dB rated output; based on measurements from // https://github.com/S5NC/EBYTE_ESP32-S3/blob/main/E22-900M30S%20power%20output%20testing.txt -#define TX_GAIN_LORA 7 +#define REGULATORY_GAIN_LORA 7 #define SX126X_MAX_POWER 22 #endif #ifdef EBYTE_E22_900M33S // 25dB PA gain and 33dB rated output; based on TX Power Curve from E22-900M33S_UserManual_EN_v1.0.pdf -#define TX_GAIN_LORA 25 +#define REGULATORY_GAIN_LORA 25 #define SX126X_MAX_POWER 8 #endif #endif diff --git a/version.properties b/version.properties index b0e9606976..bedba21b7d 100644 --- a/version.properties +++ b/version.properties @@ -1,4 +1,4 @@ [VERSION] major = 2 minor = 6 -build = 9 +build = 8