From 178b2ef3cf20f501060bde2f1a9e9fe52cb5875f Mon Sep 17 00:00:00 2001 From: pelgraine <140762863+pelgraine@users.noreply.github.com> Date: Tue, 29 Sep 2026 06:46:19 +1000 Subject: [PATCH] Remove T5S3, T-Echo, CardKB and nRF support --- README.md | 342 +- Serial Settings Guide.md | 18 +- TXT & EPUB Reader Guide.md | 10 - arch/nrf52/extra_scripts/patch_bluefruit.py | 198 -- bin/uf2conv/uf2conv.py | 361 --- bin/uf2conv/uf2families.json | 362 --- boards/heltec_mesh_pocket.json | 53 - boards/heltec_mesh_solar.json | 61 - boards/heltec_t114.json | 61 - boards/keepteen_lt1.json | 79 - boards/lilygo_techo_card.json | 50 - boards/minewsemi_me25ls01.json | 59 - boards/nano-g2-ultra.json | 73 - boards/nrf52840_s140_v6.ld | 38 - boards/nrf52840_s140_v6_extrafs.ld | 38 - boards/nrf52840_s140_v7.ld | 38 - boards/nrf52840_s140_v7_extrafs.ld | 38 - boards/promicro_nrf52840.json | 79 - boards/rak3401.json | 72 - boards/rak4631.json | 72 - boards/seeed-wio-tracker-l1.json | 62 - boards/seeed-xiao-afruitnrf52-nrf52840.json | 61 - boards/seeed_sensecap_solar.json | 60 - boards/t-echo.json | 63 - boards/t5s3-epaper-pro.json | 38 - boards/thinknode_m1.json | 72 - boards/thinknode_m3.json | 72 - boards/thinknode_m6.json | 72 - boards/tracker-t1000-e.json | 59 - build.sh | 29 +- build_as_lib.py | 2 - create-uf2.py | 31 - docs/nrf52_power_management.md | 213 -- examples/companion_radio/DataStore.cpp | 67 +- examples/companion_radio/DataStore.h | 6 +- examples/companion_radio/MyMesh.cpp | 39 +- examples/companion_radio/MyMesh.h | 2 +- examples/companion_radio/NodePrefs.h | 13 - examples/companion_radio/main.cpp | 1226 +------ .../companion_radio/ui-new/CardKBKeyboard.h | 131 - .../ui-new/ChannelPickerScreen.h | 160 +- .../companion_radio/ui-new/ChannelScreen.h | 84 - .../companion_radio/ui-new/ContactsScreen.h | 37 - .../companion_radio/ui-new/DiscoveryScreen.h | 24 - .../ui-new/Fontpreviewscreen.h | 7 +- .../ui-new/GBCEmulatorScreen.h | 3 +- .../companion_radio/ui-new/GamesMenuScreen.h | 39 +- examples/companion_radio/ui-new/HomeIcons.h | 2 +- .../companion_radio/ui-new/LastHeardScreen.h | 15 - examples/companion_radio/ui-new/MeckFonts.h | 63 +- .../ui-new/MinesweeperScreen.h | 35 +- examples/companion_radio/ui-new/NotesScreen.h | 52 - .../companion_radio/ui-new/PathEditorScreen.h | 34 +- .../ui-new/RepeaterAdminScreen.h | 46 +- examples/companion_radio/ui-new/RxLogScreen.h | 4 - .../companion_radio/ui-new/SettingsScreen.h | 279 +- examples/companion_radio/ui-new/SnakeScreen.h | 31 - .../companion_radio/ui-new/TextReaderScreen.h | 58 +- examples/companion_radio/ui-new/Tracescreen.h | 51 - examples/companion_radio/ui-new/UITask.cpp | 798 +---- examples/companion_radio/ui-new/UITask.h | 44 +- .../companion_radio/ui-new/VirtualKeyboard.h | 540 ---- .../companion_radio/ui-new/WebReaderScreen.h | 117 +- .../ui-new/fonts/Montserrat12pt7b.h | 288 -- .../ui-new/fonts/Montserrat18pt7b.h | 481 --- .../ui-new/fonts/Montserrat20pt7b.h | 568 ---- .../ui-new/fonts/MontserratBold18pt7b.h | 536 --- .../ui-new/fonts/MontserratBold22pt7b.h | 745 ----- .../ui-new/fonts/MontserratBold24pt7b.h | 873 ----- .../ui-new/fonts/MontserratBold26pt7b.h | 1009 ------ .../ui-new/fonts/NotoSans12pt8b.h | 1103 ------- .../ui-new/fonts/NotoSans18pt7b.h | 464 --- .../ui-new/fonts/NotoSans20pt7b.h | 545 ---- .../ui-new/fonts/NotoSans22pt7b.h | 639 ---- .../ui-new/fonts/NotoSansBold18pt7b.h | 498 --- .../ui-new/fonts/NotoSansBold24pt7b.h | 801 ----- examples/companion_radio/ui-orig/UITask.cpp | 2 +- examples/simple_repeater/MyMesh.cpp | 6 +- examples/simple_repeater/MyMesh.h | 2 +- examples/simple_repeater/main.cpp | 10 +- examples/simple_room_server/MyMesh.cpp | 10 +- examples/simple_room_server/MyMesh.h | 4 +- examples/simple_room_server/main.cpp | 6 +- examples/simple_secure_chat/main.cpp | 23 +- examples/simple_sensor/SensorMesh.cpp | 6 +- examples/simple_sensor/SensorMesh.h | 2 +- examples/simple_sensor/main.cpp | 2 +- include/README | 342 +- lib/PDM_nrf52/library.json | 8 - lib/PDM_nrf52/src/PDM.cpp | 261 -- lib/PDM_nrf52/src/PDM.h | 65 - lib/PDM_nrf52/src/utility/PDMDoubleBuffer.cpp | 133 - lib/PDM_nrf52/src/utility/PDMDoubleBuffer.h | 53 - lib/nrf52/include/ble.h | 685 ---- lib/nrf52/include/ble_err.h | 93 - lib/nrf52/include/ble_gap.h | 2696 ---------------- lib/nrf52/include/ble_gatt.h | 229 -- lib/nrf52/include/ble_gattc.h | 715 ---- lib/nrf52/include/ble_gatts.h | 845 ----- lib/nrf52/include/ble_hci.h | 135 - lib/nrf52/include/ble_l2cap.h | 506 --- lib/nrf52/include/ble_ranges.h | 156 - lib/nrf52/include/ble_types.h | 215 -- lib/nrf52/include/nrf52/nrf_mbr.h | 268 -- lib/nrf52/include/nrf_error.h | 90 - lib/nrf52/include/nrf_error_sdm.h | 70 - lib/nrf52/include/nrf_error_soc.h | 85 - lib/nrf52/include/nrf_nvic.h | 491 --- lib/nrf52/include/nrf_sdm.h | 367 --- lib/nrf52/include/nrf_soc.h | 1079 ------- lib/nrf52/include/nrf_svc.h | 90 - lib/nrf52/s140_nrf52_7.3.0_API/include/ble.h | 679 ---- .../s140_nrf52_7.3.0_API/include/ble_err.h | 93 - .../s140_nrf52_7.3.0_API/include/ble_gap.h | 2867 ----------------- .../s140_nrf52_7.3.0_API/include/ble_gatt.h | 229 -- .../s140_nrf52_7.3.0_API/include/ble_gattc.h | 755 ----- .../s140_nrf52_7.3.0_API/include/ble_gatts.h | 863 ----- .../s140_nrf52_7.3.0_API/include/ble_hci.h | 135 - .../s140_nrf52_7.3.0_API/include/ble_l2cap.h | 507 --- .../s140_nrf52_7.3.0_API/include/ble_ranges.h | 156 - .../s140_nrf52_7.3.0_API/include/ble_types.h | 215 -- .../include/nrf52/nrf_mbr.h | 268 -- .../s140_nrf52_7.3.0_API/include/nrf_error.h | 90 - .../include/nrf_error_sdm.h | 70 - .../include/nrf_error_soc.h | 85 - .../s140_nrf52_7.3.0_API/include/nrf_nvic.h | 491 --- .../s140_nrf52_7.3.0_API/include/nrf_sdm.h | 371 --- .../s140_nrf52_7.3.0_API/include/nrf_soc.h | 1080 ------- .../s140_nrf52_7.3.0_API/include/nrf_svc.h | 100 - patch_nrf52_bsp.py | 66 - platformio.ini | 17 - src/helpers/ArduinoSerialInterface.h | 3 - src/helpers/ClientACL.cpp | 2 +- src/helpers/CommonCLI.cpp | 20 +- src/helpers/ESP32Board.h | 7 - src/helpers/IdentityStore.cpp | 4 +- src/helpers/IdentityStore.h | 2 +- src/helpers/NRF52Board.cpp | 321 -- src/helpers/NRF52Board.h | 82 - src/helpers/RegionMap.cpp | 2 +- src/helpers/bridges/RS232Bridge.cpp | 3 - src/helpers/bridges/RS232Bridge.h | 1 - src/helpers/esp32/SerialBLEInterface.cpp | 2 +- src/helpers/nrf52/SerialBLEInterface.cpp | 397 --- src/helpers/nrf52/SerialBLEInterface.h | 80 - src/helpers/radiolib/CustomLLCC68.h | 4 +- src/helpers/radiolib/CustomSX1262.h | 4 +- src/helpers/radiolib/CustomSX1268.h | 4 +- src/helpers/radiolib/CustomSX1276.h | 4 +- .../sensors/EnvironmentSensorManager.cpp | 6 - src/helpers/ui/FastEPDDisplay.cpp | 598 ---- src/helpers/ui/FastEPDDisplay.h | 145 - src/helpers/ui/GxEPDDisplay.cpp | 4 - src/helpers/ui/GxEPDDisplay.h | 7 - variants/heltec_v4/README.md | 2 +- .../lilygo_t5s3_epaper_pro/CPUPowerManager.h | 113 - .../lilygo_t5s3_epaper_pro/PCF85063Clock.h | 209 -- variants/lilygo_t5s3_epaper_pro/T5S3Board.cpp | 461 --- variants/lilygo_t5s3_epaper_pro/T5S3Board.h | 97 - .../lilygo_t5s3_epaper_pro/pins_arduino.h | 19 - .../lilygo_t5s3_epaper_pro/platformio.ini | 236 -- variants/lilygo_t5s3_epaper_pro/target.cpp | 91 - variants/lilygo_t5s3_epaper_pro/target.h | 50 - variants/lilygo_t5s3_epaper_pro/variant.h | 189 -- variants/lilygo_tdeck_max/platformio.ini | 2 +- 165 files changed, 187 insertions(+), 37364 deletions(-) delete mode 100644 arch/nrf52/extra_scripts/patch_bluefruit.py delete mode 100644 bin/uf2conv/uf2conv.py delete mode 100644 bin/uf2conv/uf2families.json delete mode 100644 boards/heltec_mesh_pocket.json delete mode 100644 boards/heltec_mesh_solar.json delete mode 100644 boards/heltec_t114.json delete mode 100644 boards/keepteen_lt1.json delete mode 100644 boards/lilygo_techo_card.json delete mode 100644 boards/minewsemi_me25ls01.json delete mode 100644 boards/nano-g2-ultra.json delete mode 100644 boards/nrf52840_s140_v6.ld delete mode 100644 boards/nrf52840_s140_v6_extrafs.ld delete mode 100644 boards/nrf52840_s140_v7.ld delete mode 100644 boards/nrf52840_s140_v7_extrafs.ld delete mode 100644 boards/promicro_nrf52840.json delete mode 100644 boards/rak3401.json delete mode 100644 boards/rak4631.json delete mode 100644 boards/seeed-wio-tracker-l1.json delete mode 100644 boards/seeed-xiao-afruitnrf52-nrf52840.json delete mode 100644 boards/seeed_sensecap_solar.json delete mode 100644 boards/t-echo.json delete mode 100644 boards/t5s3-epaper-pro.json delete mode 100644 boards/thinknode_m1.json delete mode 100644 boards/thinknode_m3.json delete mode 100644 boards/thinknode_m6.json delete mode 100644 boards/tracker-t1000-e.json delete mode 100644 create-uf2.py delete mode 100644 docs/nrf52_power_management.md delete mode 100644 examples/companion_radio/ui-new/CardKBKeyboard.h delete mode 100644 examples/companion_radio/ui-new/VirtualKeyboard.h delete mode 100644 examples/companion_radio/ui-new/fonts/Montserrat12pt7b.h delete mode 100644 examples/companion_radio/ui-new/fonts/Montserrat18pt7b.h delete mode 100644 examples/companion_radio/ui-new/fonts/Montserrat20pt7b.h delete mode 100644 examples/companion_radio/ui-new/fonts/MontserratBold18pt7b.h delete mode 100644 examples/companion_radio/ui-new/fonts/MontserratBold22pt7b.h delete mode 100644 examples/companion_radio/ui-new/fonts/MontserratBold24pt7b.h delete mode 100644 examples/companion_radio/ui-new/fonts/MontserratBold26pt7b.h delete mode 100644 examples/companion_radio/ui-new/fonts/NotoSans12pt8b.h delete mode 100644 examples/companion_radio/ui-new/fonts/NotoSans18pt7b.h delete mode 100644 examples/companion_radio/ui-new/fonts/NotoSans20pt7b.h delete mode 100644 examples/companion_radio/ui-new/fonts/NotoSans22pt7b.h delete mode 100644 examples/companion_radio/ui-new/fonts/NotoSansBold18pt7b.h delete mode 100644 examples/companion_radio/ui-new/fonts/NotoSansBold24pt7b.h delete mode 100644 lib/PDM_nrf52/library.json delete mode 100644 lib/PDM_nrf52/src/PDM.cpp delete mode 100644 lib/PDM_nrf52/src/PDM.h delete mode 100644 lib/PDM_nrf52/src/utility/PDMDoubleBuffer.cpp delete mode 100644 lib/PDM_nrf52/src/utility/PDMDoubleBuffer.h delete mode 100644 lib/nrf52/include/ble.h delete mode 100644 lib/nrf52/include/ble_err.h delete mode 100644 lib/nrf52/include/ble_gap.h delete mode 100644 lib/nrf52/include/ble_gatt.h delete mode 100644 lib/nrf52/include/ble_gattc.h delete mode 100644 lib/nrf52/include/ble_gatts.h delete mode 100644 lib/nrf52/include/ble_hci.h delete mode 100644 lib/nrf52/include/ble_l2cap.h delete mode 100644 lib/nrf52/include/ble_ranges.h delete mode 100644 lib/nrf52/include/ble_types.h delete mode 100644 lib/nrf52/include/nrf52/nrf_mbr.h delete mode 100644 lib/nrf52/include/nrf_error.h delete mode 100644 lib/nrf52/include/nrf_error_sdm.h delete mode 100644 lib/nrf52/include/nrf_error_soc.h delete mode 100644 lib/nrf52/include/nrf_nvic.h delete mode 100644 lib/nrf52/include/nrf_sdm.h delete mode 100644 lib/nrf52/include/nrf_soc.h delete mode 100644 lib/nrf52/include/nrf_svc.h delete mode 100755 lib/nrf52/s140_nrf52_7.3.0_API/include/ble.h delete mode 100755 lib/nrf52/s140_nrf52_7.3.0_API/include/ble_err.h delete mode 100755 lib/nrf52/s140_nrf52_7.3.0_API/include/ble_gap.h delete mode 100755 lib/nrf52/s140_nrf52_7.3.0_API/include/ble_gatt.h delete mode 100755 lib/nrf52/s140_nrf52_7.3.0_API/include/ble_gattc.h delete mode 100755 lib/nrf52/s140_nrf52_7.3.0_API/include/ble_gatts.h delete mode 100755 lib/nrf52/s140_nrf52_7.3.0_API/include/ble_hci.h delete mode 100755 lib/nrf52/s140_nrf52_7.3.0_API/include/ble_l2cap.h delete mode 100755 lib/nrf52/s140_nrf52_7.3.0_API/include/ble_ranges.h delete mode 100755 lib/nrf52/s140_nrf52_7.3.0_API/include/ble_types.h delete mode 100755 lib/nrf52/s140_nrf52_7.3.0_API/include/nrf52/nrf_mbr.h delete mode 100755 lib/nrf52/s140_nrf52_7.3.0_API/include/nrf_error.h delete mode 100755 lib/nrf52/s140_nrf52_7.3.0_API/include/nrf_error_sdm.h delete mode 100755 lib/nrf52/s140_nrf52_7.3.0_API/include/nrf_error_soc.h delete mode 100755 lib/nrf52/s140_nrf52_7.3.0_API/include/nrf_nvic.h delete mode 100755 lib/nrf52/s140_nrf52_7.3.0_API/include/nrf_sdm.h delete mode 100755 lib/nrf52/s140_nrf52_7.3.0_API/include/nrf_soc.h delete mode 100755 lib/nrf52/s140_nrf52_7.3.0_API/include/nrf_svc.h delete mode 100644 patch_nrf52_bsp.py delete mode 100644 src/helpers/NRF52Board.cpp delete mode 100644 src/helpers/NRF52Board.h delete mode 100644 src/helpers/nrf52/SerialBLEInterface.cpp delete mode 100644 src/helpers/nrf52/SerialBLEInterface.h delete mode 100644 src/helpers/ui/FastEPDDisplay.cpp delete mode 100644 src/helpers/ui/FastEPDDisplay.h delete mode 100644 variants/lilygo_t5s3_epaper_pro/CPUPowerManager.h delete mode 100644 variants/lilygo_t5s3_epaper_pro/PCF85063Clock.h delete mode 100644 variants/lilygo_t5s3_epaper_pro/T5S3Board.cpp delete mode 100644 variants/lilygo_t5s3_epaper_pro/T5S3Board.h delete mode 100644 variants/lilygo_t5s3_epaper_pro/pins_arduino.h delete mode 100644 variants/lilygo_t5s3_epaper_pro/platformio.ini delete mode 100644 variants/lilygo_t5s3_epaper_pro/target.cpp delete mode 100644 variants/lilygo_t5s3_epaper_pro/target.h delete mode 100644 variants/lilygo_t5s3_epaper_pro/variant.h diff --git a/README.md b/README.md index 0114ab1a..9ff8b733 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ## Meshcore + Fork = Meck -A fork created specifically to focus on enabling BLE & WiFi companion firmware for the LilyGo T-Deck Pro, LilyGo T-Deck Max & LilyGo T5 E-Paper S3 Pro. Created wholly with Claude AI using Meshcore v1.11 code. 100% vibecoded. +A fork created specifically to focus on enabling BLE & WiFi companion firmware for the LilyGo T-Deck Pro & LilyGo T-Deck Max. Created wholly with Claude AI using Meshcore v1.11 code. 100% vibecoded. [Check out the Meck discussion channel on the MeshCore Discord](https://discord.com/channels/1495203904898728149/1496789639556501614) @@ -63,17 +63,6 @@ A fork created specifically to focus on enabling BLE & WiFi companion firmware f - [Multi-Constellation GPS](#multi-constellation-gps) - [Remote Repeater (T-Deck Pro 4G)](#remote-repeater-t-deck-pro-4g) - [WiFi Repeater](#wifi-repeater) -- [T5S3 E-Paper Pro](#t5s3-e-paper-pro) - - [Build Variants](#t5s3-build-variants) - - [Touch Navigation](#touch-navigation) - - [Home Screen](#t5s3-home-screen) - - [Boot Button Controls](#boot-button-controls) - - [Backlight](#backlight) - - [Lock Screen](#lock-screen) - - [Virtual Keyboard](#virtual-keyboard) - - [Display Settings](#display-settings) - - [Clock & RTC](#clock--rtc) - - [Touch Gestures by Screen](#touch-gestures-by-screen) - [Serial Settings (USB)](Serial_Settings_Guide.md) - [Text & EPUB Reader](TXT___EPUB_Reader_Guide.md) - [Web Browser & IRC Guide](Web_App_Guide.md) @@ -103,11 +92,10 @@ Meck currently targets three LilyGo devices and also supports the Heltec V3 and |--------|---------|-------|------|---------|-----|-----| | **T-Deck Pro** | 240×320 e-ink (GxEPD2) | TCA8418 keyboard + optional touch | SX1262 | BQ27220 fuel gauge, 1400 mAh | Yes | No (uses GPS time) | | **T-Deck Max** | 240×320 e-ink (GxEPD2) + frontlight | TCA8418 keyboard + CST328 capacitive touch + 3 capacitive buttons | SX1262 | BQ27220 fuel gauge, 1400 mAh | Yes (multi-constellation) | No (uses GPS time) | -| **T5S3 E-Paper Pro** (V2, H752-B) | 960×540 e-ink (FastEPD, parallel) | GT911 capacitive touch (no keyboard) | SX1262 | BQ27220 fuel gauge, 1500 mAh | No (non-GPS variant) | Yes (PCF8563 hardware RTC) | | **Heltec V3** (remote repeater only) | 0.96" OLED (SSD1306) | — | SX1262 | — | No | No | | **Heltec V4** (remote repeater only) | 0.96" OLED (SSD1306) | — | SX1262 | — | No | No | -The T-Deck Pro, T-Deck Max, and T5S3 use the ESP32-S3 with 16 MB flash and 8 MB PSRAM. The Heltec V3 and V4 use the ESP32-S3 with 8 MB flash and 8 MB PSRAM. +The T-Deck Pro and T-Deck Max use the ESP32-S3 with 16 MB flash and 8 MB PSRAM. The Heltec V3 and V4 use the ESP32-S3 with 8 MB flash and 8 MB PSRAM. --- @@ -115,7 +103,7 @@ The T-Deck Pro, T-Deck Max, and T5S3 use the ESP32-S3 with 16 MB flash and 8 MB **An SD card is essential for Meck to function properly.** Many features — including the e-book reader, notes, bookmarks, web reader cache, audiobook playback, firmware updates, contact import/export, WiFi credential storage, and Game Boy ROMs and saves — rely on files stored on the SD card. Without an SD card inserted, the device will boot and handle mesh messaging, but most extended features will be unavailable or will fail silently. -**Recommended:** A **32 GB or larger** microSD card formatted as **FAT32**. Meck's extensive feature set — audiobooks, e-books, voice recordings, contact exports, alarm sounds, web reader cache, notes, and firmware images — can accumulate significant storage over time, so a larger card is worthwhile. MeshCore users have found that **SanDisk** microSD cards are the most reliable across both the T-Deck Pro and T5S3. +**Recommended:** A **32 GB or larger** microSD card formatted as **FAT32**. Meck's extensive feature set — audiobooks, e-books, voice recordings, contact exports, alarm sounds, web reader cache, notes, and firmware images — can accumulate significant storage over time, so a larger card is worthwhile. MeshCore users have found that **SanDisk** microSD cards are the most reliable on the T-Deck Pro. --- @@ -136,7 +124,7 @@ If the device has never had Meck firmware (or you want a clean start), use the * ``` esptool.py --chip esp32s3 --port /dev/ttyACM0 --baud 921600 \ - write_flash 0x0 meck_t5s3_standalone-merged.bin + write_flash 0x0 meck_max_standalone-merged.bin ``` On macOS the port is typically `/dev/cu.usbmodem*`. On Windows it will be a COM port like `COM3`. @@ -158,7 +146,7 @@ If the device is already running Meck (or any MeshCore-based firmware with a val ``` esptool.py --chip esp32s3 --port /dev/ttyACM0 --baud 921600 \ - write_flash 0x10000 meck_t5s3_standalone.bin + write_flash 0x10000 meck_max_standalone.bin ``` > **Tip:** If you're unsure whether the device already has a bootloader, it's always safe to use the merged file and flash at `0x0` — it will overwrite everything cleanly. @@ -174,7 +162,7 @@ If you're loading firmware from an SD card via the LilyGo Launcher firmware, use Once Meck is installed, you can update firmware directly from your phone — no computer or serial cable required. The device creates a temporary WiFi access point and you upload the new `.bin` via your phone's browser. 1. Download the new **non-merged** `.bin` to your phone (from GitHub Releases, Discord, etc.) -2. On the device: **Settings → OTA Tools → Firmware Update → Enter** (T-Deck Pro) or **tap** (T5S3) +2. On the device: **Settings → OTA Tools → Firmware Update → Enter** (T-Deck Pro) 3. The device starts a WiFi network called `Meck-Update-XXXX` and displays connection details 4. On your phone: connect to the `Meck-Update` WiFi network, open a browser, go to `192.168.4.1` 5. Tap **Choose File**, select the `.bin`, tap **Upload** @@ -192,7 +180,7 @@ The partition layout supports dual OTA slots — the old firmware remains on the Meck supports multibyte path hash, bringing it in line with MeshCore firmware v1.14. The path hash controls how many bytes each repeater uses to identify itself in forwarded flood packets. Larger hashes reduce the chance of identity collisions at the cost of fewer maximum hops per packet. -You can configure the path hash size in the device settings (press **S** from the home screen on T-Deck Pro, or open Settings via the tile on T5S3) or set it via USB serial: +You can configure the path hash size in the device settings (press **S** from the home screen on T-Deck Pro) or set it via USB serial: ``` set path.hash.mode 1 @@ -340,8 +328,6 @@ Pressing **M** from the home screen opens the channel picker. All your channels Pressing **X** on any highlighted channel brings up a confirmation overlay. Press **Enter** to confirm deletion or **Q** to cancel. This clears all stored messages for that channel from the circular buffer and saves to SD. The channel itself is not removed -- only its message history. -On the T5S3, swiping left or right on the channel messages screen also opens the channel picker, which displays a **vertical bubble list** matching the Meck P4 aesthetic. Long-press a channel to bring up the delete history confirmation. - **Unread counts and the companion app (v1.12.3+):** on standalone builds (no BLE or WiFi) the home-screen **MSG** count and the per-channel `*N` badges climb as messages arrive, and opening a channel clears that channel's count. On BLE and WiFi builds the on-device counts intentionally stay at zero while a companion app is connected, because the app marks each message read as it arrives; they resume counting once the app disconnects. Earlier firmware treated standalone builds as though a companion were permanently connected, so those counts -- along with the DM counter and the new-message screen wake -- never updated. ### Contacts Screen @@ -466,7 +452,7 @@ Command responses are displayed in a scrollable view. Use **W / S** to scroll lo The trace route screen lets you build a chain of repeaters and run a trace through them — the same feature available in the MeshCore companion app, but on-device. Each repeater in the chain that recognises its hash appends its receive SNR before forwarding the packet, giving you per-hop signal quality data for the whole route. -Press **R** from the home screen to open the trace screen. T5S3 users with a CardKB attached can use **R** as well. +Press **R** from the home screen to open the trace screen. **Building the path** @@ -535,8 +521,6 @@ You can clear all stored messages for any individual channel or the DM inbox wit From the home screen, press **M** to open the channel picker. Navigate to the channel you want to clear and press **X**. A confirmation overlay appears asking "Delete message history?" -- press **Enter** to confirm or **Q** to cancel. -On the T5S3, long-press the channel in the channel picker to bring up the same confirmation. Tap to confirm or press the Boot button to cancel. - Messages are invalidated in the circular buffer and the change is saved to SD immediately. The unread counter is also reset. New messages will continue to appear as they arrive. ### Per-Channel Notification Preferences (v1.10+) @@ -649,8 +633,6 @@ You can share any channel — public or private — with another Meck user by se The recipient's device automatically adds the channel to their channel list (if it doesn't already exist and there's an empty slot). An alert confirms the channel was added. In the DM conversation, both sender and recipient see a sanitised message ("Shared channel: name") rather than the raw protocol data. -On the T5S3, channel sharing works the same way via the CardKB keyboard. - ### Config Export/Import (v1.11+) The **Export/Import >>** sub-screen in Settings lets you back up and restore your device configuration via JSON files on the SD card. This is useful for migrating settings to a new board, keeping a backup before reflashing, or cloning a configuration across multiple devices. @@ -1028,14 +1010,13 @@ The WiFi repeater variants turn a device into a dedicated MeshCore repeater with | Variant | Environment | Platform | |---------|------------|----------| | T-Deck Pro WiFi Repeater | `meck_wifi_repeater` | LilyGo T-Deck Pro | -| T5S3 WiFi Repeater | `meck_wifi_repeater_t5s3` | LilyGo T5S3 E-Paper Pro | | Heltec V3 WiFi Repeater | `meck_wifi_repeater_heltec_v3` | Heltec V3 | | Heltec V4 WiFi Repeater | `meck_wifi_repeater_heltec_v4` | Heltec V4 | | Heltec V4 WiFi Repeater (headless) | `meck_wifi_repeater_heltec_v4_headless` | Heltec V4 (no display) | **Sections to write:** -- **Requirements** — device, WiFi network, MQTT broker account, SD card (T-Deck Pro / T5S3) or SPIFFS config (Heltec V4) +- **Requirements** — device, WiFi network, MQTT broker account, SD card (T-Deck Pro) or SPIFFS config (Heltec V4) - **SD card configuration** — `/remote/wifi.cfg` (supports multiple SSIDs) and `/remote/mqtt.cfg` - **Heltec V4 specifics** — no SD card slot, config stored in SPIFFS, headless vs display variant - **OTA updates** — NTP time sync, HTTP firmware download over WiFi @@ -1043,270 +1024,6 @@ The WiFi repeater variants turn a device into a dedicated MeshCore repeater with --- -## T5S3 E-Paper Pro - -The LilyGo T5S3 E-Paper Pro (V2, H752-B) is a 4.7-inch e-ink device with capacitive touch and no physical keyboard. All navigation is done via touch gestures and the Boot button (GPIO0). The larger 960×540 display provides significantly more screen real estate than the T-Deck Pro's 240×320 panel. - -### T5S3 Build Variants - -| Variant | Environment | BLE | WiFi | Web Reader | Max Contacts | -|---------|------------|-----|------|------------|-------------| -| Standalone | `meck_t5s3_standalone` | — | — | No | 2,000 | -| BLE Companion | `meck_t5s3_ble` | Yes | — | No | 2,000 | -| WiFi Companion | `meck_t5s3_wifi` | — | Yes (TCP:5000) | Yes | 2,000 | -| WiFi Repeater | `meck_wifi_repeater_t5s3` | — | Yes (MQTT) | No | — | - -The WiFi variant connects to the MeshCore web app or meshcore.js over your local network. The web reader shares the same WiFi connection — no extra setup needed. The WiFi Repeater variant is a dedicated remote repeater — see [WiFi Repeater](#wifi-repeater) for details on MQTT-based admin management. - -### Touch Navigation - -The T5S3 uses a combination of touch gestures and the Boot button for all interaction. There is no physical keyboard — text entry uses an on-screen virtual keyboard that appears when needed. - -**Core gesture types:** - -| Gesture | Description | -|---------|-------------| -| **Tap** | Touch and release quickly. Context-dependent: opens tiles on home screen, selects items in lists, advances pages in readers. | -| **Swipe** | Touch, drag at least 60 pixels, and release. Direction determines action (scroll, page turn, switch channel/filter). | -| **Long press (touch)** | Touch and hold for 500ms+. Context-dependent: compose messages, open DMs, delete bookmarks. | - -### T5S3 Home Screen - -The home screen displays a grid of tappable tiles across three rows: - -| | Column 1 | Column 2 | Column 3 | -|---|----------|----------|----------| -| **Row 1** | Messages | Contacts | Settings | -| **Row 2** | Reader | Notes | Browser (WiFi) / Discover (other) | -| **Row 3** | Trace | Games | | - -Tap a tile to open that screen. Tap outside the tile grid (or swipe left/right) to cycle between home pages. The additional home pages show BLE status, battery info, GPS status, and a hibernate option — same as the T-Deck Pro but navigated by swiping or tapping the left/right halves of the screen instead of pressing keys. - -### Boot Button Controls - -The Boot button (GPIO0, bottom of device) provides essential navigation and utility functions: - -| Action | Effect | -|--------|--------| -| **Single click** | On home screen: cycle to next page. On other screens: go back (same as pressing Q on T-Deck Pro). In text reader reading mode: close book and return to file list. | -| **Double-click** | Toggle backlight at full brightness (comfortable for indoor reading). | -| **Triple-click** | Toggle backlight at low brightness (dim nighttime reading). | -| **Long press** | Lock or unlock the screen. While locked, touch is disabled and a lock screen shows the time, battery percentage, and unread message count. | -| **Long press during first 8 seconds after boot** | Enter CLI rescue mode (serial settings interface). | - -### Backlight - -The T5S3 has a warm-tone front-light controlled by PWM on GPIO11. Brightness ranges from 0 (off) to 255 (maximum). - -- **Double-click Boot button** — toggle backlight on at 153/255 brightness (comfortable reading level) -- **Triple-click Boot button** — toggle backlight on at low brightness (4/255, nighttime reading) -- The backlight turns off automatically when the screen locks - -### Lock Screen - -Long press the Boot button to lock the device. The lock screen shows: -- Current time in large text (HH:MM) -- Battery percentage -- Unread message count (if any) -- "Hold button to unlock" hint - -Touch input is completely disabled while locked. Long press the Boot button again to unlock and return to whatever screen you were on. - -An auto-lock timer can be configured in **Settings → Auto Lock** (None / 2 / 5 / 10 / 15 / 30 minutes of idle time). The CPU drops to 40 MHz while locked to reduce power consumption. - -### Virtual Keyboard - -Since the T5S3 has no physical keyboard, a full-screen QWERTY virtual keyboard appears automatically when text input is needed (composing messages, entering WiFi passwords, editing settings, etc.). - -The virtual keyboard supports: -- QWERTY letter layout with a symbol/number layer (tap the **123** key to switch) -- Shift toggle for uppercase -- Backspace (UTF-8 aware — correctly deletes multi-byte emoji) and Enter keys -- **Emoji picker** — tap the **$** key to open a scrollable 8-column grid of 79 emoji sprites with page indicators. Tap an emoji to insert it inline in your message. Tap **Back** to return to the keyboard. Faces and emotions are grouped first for quick access. -- Inline emoji rendering — emoji appear as pixel sprites in the text field as you type -- Phantom keystroke prevention (a brief cooldown after the keyboard opens prevents accidental taps) - -Tap keys to type. Tap **Enter** to submit, or press the **Boot button** to cancel and close the keyboard. - -### External Keyboard (CardKB) - -The T5S3 supports the M5Stack CardKB (or compatible I2C keyboard) connected via the QWIIC port. When detected at boot, the CardKB can be used for all text input — composing messages, entering URLs, editing notes, and navigating menus — without the on-screen virtual keyboard. - -The CardKB is auto-detected on the I2C bus at address `0x5F`. No configuration is needed — just plug it in. - -### Display Settings - -The T5S3 Settings screen includes display options shared with the T-Deck Pro, plus one T5S3-specific setting: - -| Setting | Description | -|---------|-------------| -| **Dark Mode** | Inverts the display — white text on black background. Tap to toggle on/off. Available on both T-Deck Pro and T5S3. | -| **Larger Font** | Increases text size on channel messages, contacts, DM inbox, and repeater admin screens. Tap to toggle on/off. Available on both T-Deck Pro and T5S3. | -| **Font Style** | Choose between Classic (FreeSans), Noto Sans, or Montserrat. Swipe left/right to cycle, tap to apply. Available on both T-Deck Pro and T5S3. | -| **Portrait Mode** | Rotates the display 90° from landscape (960×540) to portrait (540×960). Touch coordinates are automatically remapped. Text reader layout recalculates on orientation change. T5S3 only. | - -These settings are persisted and survive reboots. - -### Clock & RTC - -Unlike the T-Deck Pro (which relies on GPS for time), the T5S3 has a hardware RTC (PCF8563/BM8563) that maintains time across reboots as long as the battery has charge. On first use (or after a full battery drain), the clock needs to be set via USB serial: - -``` -clock sync 1773554535 -``` - -Where the number is a Unix epoch timestamp. Quick one-liner from a macOS/Linux terminal: - -``` -echo "clock sync $(date +%s)" > /dev/ttyACM0 -``` - -Once set, the RTC retains the time across reboots. See the [Serial Settings Guide](Serial_Settings_Guide.md) for full clock sync documentation including the PlatformIO auto-sync feature. - -The UTC offset is configured in the Settings screen (same as T-Deck Pro) and is persisted to flash. - -### Touch Gestures by Screen - -#### Home Screen - -| Gesture | Action | -|---------|--------| -| Tap tile | Open that screen (Messages, Contacts, Settings, Reader, Notes, Browser/Discover) | -| Tap outside tiles (left half) | Previous home page | -| Tap outside tiles (right half) | Next home page | -| Swipe left / right | Next / previous home page | -| Long press (touch) | Activate current page action (toggle BLE, hibernate, etc.) | - -#### Channel Messages - -| Gesture | Action | -|---------|--------| -| Swipe up / down | Scroll messages | -| Swipe left / right | Open channel picker — shows all channels and DM inbox in a vertical bubble list with unread badges. Tap to select. | -| Tap footer area | View relay path of last received message | -| Tap path overlay | Dismiss overlay | -| Long press (touch) | Open virtual keyboard to compose message to current channel | - -#### Contacts - -The contacts list shows all known nodes sorted by most recently heard, with type prefix, estimated hop count, and time since last advert. See the [T-Deck Pro Contacts Screen](#contacts-screen) section for an explanation of the type prefix and hop count display — the same conventions apply on the T5S3. - -**Normal mode** - -| Gesture | Action | -|---------|--------| -| Swipe up / down | Scroll through contacts | -| Swipe left / right | Cycle contact filter (All → Chat → Rptr → Room → Sens → Fav) | -| Tap | Enter select mode (tapped contact is pre-selected) | -| Long press on Chat contact | View unread DMs (if any), then compose DM | -| Long press on Repeater/RS contact | Open repeater admin login | - -> **Note:** The **Fav** filter shows only contacts you have marked as favourites. If it appears empty, no contacts have been favourited yet — use select mode (tap a contact) and then long-press to mark favourites. - -**Select mode** — tap any contact row to enter select mode. The tapped contact is pre-selected (shown with `*`). Swipe or tap to navigate and toggle selections. You can also use a **two-finger tap** anywhere on the contacts screen to toggle select mode on and off. - -| Gesture | Action | -|---------|--------| -| Tap | Toggle selection on tapped row | -| Swipe left | Select all contacts in current filter | -| Swipe right | Deselect all | -| Two-finger tap | Toggle select mode on/off | -| Long press | Exit select mode (confirm favourites / deletions first) | - -Batch operations (favourite toggle, delete) are triggered from the overlay that appears after exiting select mode with contacts selected. - -**Adding contacts** - -1. **Automatic** — if Settings → Contacts → Add Mode is set to *Auto All*, nodes are added as their adverts are heard. *Custom* mode adds only nodes matching the enabled type toggles (Companion, Repeater, Room Server, Sensor). *Manual Only* disables auto-add. - -2. **From the Last Heard screen** — tap the **Discover** tile (or access via the home page on non-WiFi builds) and navigate to Last Heard. Tap any entry to add it to contacts, or tap an existing contact to remove it (favourites require a second tap within 3 seconds to confirm). Entries show `[+]` if already in contacts, `[★]` if a favourite. - - > **Note:** The Last Heard list holds up to 1,000 entries in PSRAM, and advert data is stored persistently on the SD card — so contacts can be added long after the original advertisement was received, even across reboots. This makes Last Heard especially useful when auto-add is set to *Manual Only*, as it provides a passive catalogue of every node heard on the network. - -3. **From the Discovery screen** — tap the Discover tile and run an active scan. Tap any result to add it to contacts. - -**Deleting contacts** - -Tap a contact to enter select mode, select the contacts to remove, exit select mode, and choose delete from the confirmation overlay. - -#### Text Reader (File List) - -| Gesture | Action | -|---------|--------| -| Swipe up / down | Scroll file list | -| Tap | Open selected book | - -#### Text Reader (Reading) - -| Gesture | Action | -|---------|--------| -| Tap anywhere | Next page | -| Tap footer bar | Go to page number (via virtual keyboard) | -| Swipe left | Next page | -| Swipe right | Previous page | -| Swipe up / down | Next / previous page | -| Long press (touch) | Close book, return to file list | -| Tap status bar | Go to home screen | - -#### Web Reader (WiFi variant) - -| Gesture | Action | -|---------|--------| -| Tap URL bar | Open virtual keyboard for URL entry | -| Tap Search | Open virtual keyboard for DuckDuckGo search | -| Tap reading area | Next page | -| Tap footer (if links exist) | Open virtual keyboard to enter link number | -| Swipe left / right (reading) | Next / previous page | -| Swipe up / down (home/lists) | Scroll list | -| Long press (reading) | Navigate back | -| Long press on bookmark | Delete bookmark | -| Long press on home | Exit web reader | - -#### Settings - -| Gesture | Action | -|---------|--------| -| Swipe up / down | Scroll through settings | -| Swipe left / right | Adjust value (same as A/D keys on T-Deck Pro) | -| Tap | Toggle or edit selected setting | - -#### Notes - -| Gesture | Action | -|---------|--------| -| Tap (while editing) | Open virtual keyboard for text entry | -| Long press (while editing) | Save note and exit editor | - -#### Discovery - -| Gesture | Action | -|---------|--------| -| Swipe up / down | Scroll node list | -| Tap | Add selected node to contacts | -| Long press | Rescan for nodes | - -#### Last Heard - -| Gesture | Action | -|---------|--------| -| Swipe up / down | Scroll advert list | -| Tap | Add to or delete from contacts | - -#### Repeater Admin - -| Gesture | Action | -|---------|--------| -| Swipe up / down | Scroll menu / response | -| Long press (password entry) | Open virtual keyboard for admin password | - -#### All Screens - -| Gesture | Action | -|---------|--------| -| Tap status bar (top of screen) | Return to home screen (except in text reader reading mode, where it advances the page) | - ---- - ## Meck-Mycelium Web App The [Meck-Mycelium web app](https://pelgraine.github.io/Meck-Mycelium) is a browser-based companion that connects to your MeshCore device via BLE (using WebBLE in Chrome) or to your MQTT broker for remote repeater management. @@ -1368,9 +1085,9 @@ For developers: **Companion Firmware** -The companion firmware can be connected to via BLE (T-Deck Pro and T5S3 BLE variants) or WiFi (T-Deck Pro WiFi variants and T5S3 WiFi variant, TCP port 5000). +The companion firmware can be connected to via BLE (T-Deck Pro BLE variants) or WiFi (T-Deck Pro WiFi variants, TCP port 5000). -> **Note:** On both the T-Deck Pro and T5S3, BLE and WiFi are disabled by default at boot. On the T-Deck Pro, navigate to the Bluetooth or WiFi home page and press Enter to enable. On the T5S3, navigate to the Bluetooth home page and long-press the screen to toggle BLE on. +> **Note:** On the T-Deck Pro, BLE and WiFi are disabled by default at boot. On the T-Deck Pro, navigate to the Bluetooth or WiFi home page and press Enter to enable. - Web: https://app.meshcore.nz - Meck-Mycelium: https://pelgraine.github.io/Meck-Mycelium (voice playback, remote repeater dashboard) @@ -1381,7 +1098,7 @@ The companion firmware can be connected to via BLE (T-Deck Pro and T5S3 BLE vari ## 🛠 Hardware Compatibility -MeshCore is designed for devices listed in the [MeshCore Flasher](https://flasher.meshcore.io). Meck specifically targets the LilyGo T-Deck Pro, LilyGo T-Deck Max, LilyGo T5S3 E-Paper Pro, Heltec V3 (remote repeater only), and Heltec V4 (remote repeater only). +MeshCore is designed for devices listed in the [MeshCore Flasher](https://flasher.meshcore.io). Meck specifically targets the LilyGo T-Deck Pro, LilyGo T-Deck Max, Heltec V3 (remote repeater only), and Heltec V4 (remote repeater only). ## Contributing @@ -1475,38 +1192,6 @@ There are a number of fairly major features in the pipeline, with no particular - [X] Voice-note recording on MAX (ES8311 ADC capture path) - [ ] BHI260AP gyroscope / IMU support (0x28) -- new on the MAX, not yet used by Meck -**T5S3 E-Paper Pro:** -- [X] Core port: display, touch input, LoRa, battery, RTC -- [X] Touch-navigable home screen with tappable tile grid -- [X] Full virtual keyboard for text entry -- [X] Lock screen with clock, battery, unread count, and auto-lock timer -- [X] Backlight control (double/triple-click Boot button) -- [X] Dark mode and portrait mode display settings -- [X] Channel messages with swipe navigation and touch compose -- [X] Contacts with filter cycling and long-press DM/admin -- [X] Text reader with swipe page turns -- [X] Web reader with virtual keyboard URL/search entry (WiFi variant) -- [X] Settings screen with touch editing -- [X] Serial clock sync for hardware RTC -- [X] CardKB external keyboard support (via QWIIC) -- [X] Last heard passive advert list -- [X] Tap-to-select on contacts, discovery, settings, text reader, notes screens -- [X] OTA firmware update via phone (WiFi variant) -- [X] DM inbox with per-contact unread indicators -- [X] Roomserver message handling and mark-read on login -- [X] Customised user option for larger-font mode -- [X] Contact select mode with batch favourite and delete -- [X] WiFi remote repeater with MQTT admin management -- [X] 2,000 contact support (PSRAM, all variants) -- [X] Channel picker screen with vertical bubble list layout -- [X] Region scope (MeshCore v1.15+ compatibility) -- [X] Selectable font styles (Classic, Noto Sans, Montserrat) -- [X] Virtual keyboard emoji grid with scrollable pages -- [X] Accented character / diacritics support (Czech, Polish, French, German, Latin Extended) -- [X] DM message persistence across reboots (v1.9) -- [X] Expanded Minesweeper grid to 14x14 with 25 mines (v1.11) -- [ ] Improve EPUB rendering and EPUB format handling - **Heltec V4:** - [X] WiFi remote repeater with MQTT admin management - [X] Headless WiFi repeater variant (no display) @@ -1531,9 +1216,8 @@ However, this firmware links against libraries with different license terms. Bec | [MeshCore](https://github.com/meshcore-dev/MeshCore) | MIT | Scott Powell / rippleradios.com | | [RadioLib](https://github.com/jgromes/RadioLib) | MIT | Jan Gromeš | | [GxEPD2](https://github.com/ZinggJM/GxEPD2) | GPL-3.0 | Jean-Marc Zingg (T-Deck Pro) | -| [FastEPD](https://github.com/bitbank2/FastEPD) | Apache-2.0 | Larry Bank / bitbank2 (T5S3) | | [Adafruit GFX Library](https://github.com/adafruit/Adafruit-GFX-Library) | BSD | Adafruit | -| [SensorLib](https://github.com/lewisxhe/SensorLib) | MIT | Lewis He (T5S3 touch/RTC) | +| [SensorLib](https://github.com/lewisxhe/SensorLib) | MIT | Lewis He | | [ESP32-audioI2S](https://github.com/schreibfaul1/ESP32-audioI2S) | GPL-3.0 | schreibfaul1 / Wolle | | [Codec2](https://github.com/sh123/esp32_codec2_arduino) | LGPL-2.1 | sh123 (ESP32 port) | | [Peanut-GB](https://github.com/deltabeard/Peanut-GB) | MIT | Mahyar Koshkouei / deltabeard (Game Boy emulator core, vendored) | diff --git a/Serial Settings Guide.md b/Serial Settings Guide.md index 9c5105f9..537fb53d 100644 --- a/Serial Settings Guide.md +++ b/Serial Settings Guide.md @@ -268,18 +268,6 @@ set gps.baud 0 Valid rates: 0 (default), 4800, 9600, 19200, 38400, 57600, 115200. -#### Backlight (T5S3 E-Paper Pro Only) - -Control the front-light on the T5S3 display: - -``` -set backlight on -set backlight off -set backlight 128 -``` - -Values: `on`, `off`, or a brightness level from 0–255. - ### Channel Management #### List Channels @@ -413,7 +401,7 @@ set apn ### Clock Sync -Set the device's real-time clock from a Unix timestamp. This is especially important for the T5S3 E-Paper Pro which has no GPS to auto-set the clock. These are standalone commands (not `get`/`set` prefixed) — matching the same `clock sync` command used on MeshCore repeaters. +Set the device's real-time clock from a Unix timestamp. These are standalone commands (not `get`/`set` prefixed) — matching the same `clock sync` command used on MeshCore repeaters. #### View Current Time @@ -455,9 +443,9 @@ clock sync 1773554535 **Tip:** On macOS/Linux, run `date +%s` to get the current epoch. On Windows PowerShell: `[int](Get-Date -UFormat %s)`. -#### Boot-Time Auto-Sync (T5S3) +#### Boot-Time Auto-Sync -When the T5S3 boots with no valid RTC time and detects a USB serial host is connected, it sends a `MECK_CLOCK_REQ` handshake over serial. If you're using PlatformIO's serial monitor (`pio device monitor`), the built-in `clock_sync` monitor filter responds automatically with the host computer's current time — no user action required. The sync appears transparently in the boot log: +When the device boots with no valid RTC time and detects a USB serial host is connected, it sends a `MECK_CLOCK_REQ` handshake over serial. If you're using PlatformIO's serial monitor (`pio device monitor`), the built-in `clock_sync` monitor filter responds automatically with the host computer's current time — no user action required. The sync appears transparently in the boot log: ``` MECK_CLOCK_REQ diff --git a/TXT & EPUB Reader Guide.md b/TXT & EPUB Reader Guide.md index c4750d29..017a8cab 100644 --- a/TXT & EPUB Reader Guide.md +++ b/TXT & EPUB Reader Guide.md @@ -25,16 +25,6 @@ This adds a text reader accessible via the **E** key from the home screen. | Reading | Enter | Go to page number (type digits, Enter to confirm, Q to cancel) | | Reading | Q | Close book → file list | -**Touch Gestures (T5S3):** -| Context | Gesture | Action | -|---------|---------|--------| -| File list | Swipe up/down | Scroll file list | -| File list | Tap | Open selected book | -| Reading | Tap | Next page | -| Reading | Swipe left/right | Next / previous page | -| Reading | Tap footer | Go to page number (via virtual keyboard) | -| Reading | Long press | Close book → file list | - --- ## SD Card Setup diff --git a/arch/nrf52/extra_scripts/patch_bluefruit.py b/arch/nrf52/extra_scripts/patch_bluefruit.py deleted file mode 100644 index b43bffb5..00000000 --- a/arch/nrf52/extra_scripts/patch_bluefruit.py +++ /dev/null @@ -1,198 +0,0 @@ -""" -Bluefruit BLE Patch Script - -Patches Bluefruit library to fix semaphore leak bug that causes device lockup -when BLE central disconnects unexpectedly (e.g., going out of range, supervision timeout). - -Patches applied: -1. BLEConnection.h: Add _hvn_qsize member to track semaphore queue size -2. BLEConnection.cpp: Store hvn_qsize and restore semaphore on disconnect - -Bug description: -- When a BLE central disconnects unexpectedly (reason=8 supervision timeout), - the BLE_GATTS_EVT_HVN_TX_COMPLETE event may never fire -- This leaves the _hvn_sem counting semaphore in a decremented state -- Since BLEConnection objects are reused (destructor never called), the - semaphore count is never restored -- Eventually all semaphore counts are exhausted and notify() blocks/fails - -""" - -from pathlib import Path - -Import("env") # pylint: disable=undefined-variable - - -def _patch_ble_connection_header(source: Path) -> bool: - """ - Add _hvn_qsize member variable to BLEConnection class. - - This is needed to restore the semaphore to its correct count on disconnect. - - Returns True if patch was applied or already applied, False on error. - """ - try: - content = source.read_text() - - # Check if already patched - if "_hvn_qsize" in content: - return True # Already patched - - # Find the location to insert - after _phy declaration - original_pattern = ''' uint8_t _phy; - - uint8_t _role;''' - - patched_pattern = ''' uint8_t _phy; - uint8_t _hvn_qsize; - - uint8_t _role;''' - - if original_pattern not in content: - print("Bluefruit patch: WARNING - BLEConnection.h pattern not found") - return False - - content = content.replace(original_pattern, patched_pattern) - source.write_text(content) - - # Verify - if "_hvn_qsize" not in source.read_text(): - return False - - return True - except Exception as e: - print(f"Bluefruit patch: ERROR patching BLEConnection.h: {e}") - return False - - -def _patch_ble_connection_source(source: Path) -> bool: - """ - Patch BLEConnection.cpp to: - 1. Store hvn_qsize in constructor - 2. Restore _hvn_sem semaphore to full count on disconnect - - Returns True if patch was applied or already applied, False on error. - """ - try: - content = source.read_text() - - # Check if already patched (look for the restore loop) - if "uxSemaphoreGetCount(_hvn_sem)" in content: - return True # Already patched - - # Patch 1: Store queue size in constructor - constructor_original = ''' _hvn_sem = xSemaphoreCreateCounting(hvn_qsize, hvn_qsize);''' - - constructor_patched = ''' _hvn_qsize = hvn_qsize; - _hvn_sem = xSemaphoreCreateCounting(hvn_qsize, hvn_qsize);''' - - if constructor_original not in content: - print("Bluefruit patch: WARNING - BLEConnection.cpp constructor pattern not found") - return False - - content = content.replace(constructor_original, constructor_patched) - - # Patch 2: Restore semaphore on disconnect - disconnect_original = ''' case BLE_GAP_EVT_DISCONNECTED: - // mark as disconnected - _connected = false; - break;''' - - disconnect_patched = ''' case BLE_GAP_EVT_DISCONNECTED: - // Restore notification semaphore to full count - // This fixes lockup when disconnect occurs with notifications in flight - while (uxSemaphoreGetCount(_hvn_sem) < _hvn_qsize) { - xSemaphoreGive(_hvn_sem); - } - // Release indication semaphore if waiting - if (_hvc_sem) { - _hvc_received = false; - xSemaphoreGive(_hvc_sem); - } - // mark as disconnected - _connected = false; - break;''' - - if disconnect_original not in content: - print("Bluefruit patch: WARNING - BLEConnection.cpp disconnect pattern not found") - return False - - content = content.replace(disconnect_original, disconnect_patched) - source.write_text(content) - - # Verify - verify_content = source.read_text() - if "uxSemaphoreGetCount(_hvn_sem)" not in verify_content: - return False - if "_hvn_qsize = hvn_qsize" not in verify_content: - return False - - return True - except Exception as e: - print(f"Bluefruit patch: ERROR patching BLEConnection.cpp: {e}") - return False - - -def _apply_bluefruit_patches(target, source, env): # pylint: disable=unused-argument - framework_path = env.get("PLATFORMFW_DIR") - if not framework_path: - framework_path = env.PioPlatform().get_package_dir("framework-arduinoadafruitnrf52") - - if not framework_path: - print("Bluefruit patch: ERROR - framework directory not found") - env.Exit(1) - return - - framework_dir = Path(framework_path) - bluefruit_lib = framework_dir / "libraries" / "Bluefruit52Lib" / "src" - patch_failed = False - - # Patch BLEConnection.h - conn_header = bluefruit_lib / "BLEConnection.h" - if conn_header.exists(): - before = conn_header.read_text() - success = _patch_ble_connection_header(conn_header) - after = conn_header.read_text() - - if success: - if before != after: - print("Bluefruit patch: OK - Applied BLEConnection.h fix (added _hvn_qsize member)") - else: - print("Bluefruit patch: OK - BLEConnection.h already patched") - else: - print("Bluefruit patch: FAILED - BLEConnection.h") - patch_failed = True - else: - print(f"Bluefruit patch: ERROR - BLEConnection.h not found at {conn_header}") - patch_failed = True - - # Patch BLEConnection.cpp - conn_source = bluefruit_lib / "BLEConnection.cpp" - if conn_source.exists(): - before = conn_source.read_text() - success = _patch_ble_connection_source(conn_source) - after = conn_source.read_text() - - if success: - if before != after: - print("Bluefruit patch: OK - Applied BLEConnection.cpp fix (restore semaphore on disconnect)") - else: - print("Bluefruit patch: OK - BLEConnection.cpp already patched") - else: - print("Bluefruit patch: FAILED - BLEConnection.cpp") - patch_failed = True - else: - print(f"Bluefruit patch: ERROR - BLEConnection.cpp not found at {conn_source}") - patch_failed = True - - if patch_failed: - print("Bluefruit patch: CRITICAL - Patch failed! Build aborted.") - env.Exit(1) - - -# Register the patch to run before build -bluefruit_action = env.VerboseAction(_apply_bluefruit_patches, "Applying Bluefruit BLE patches...") -env.AddPreAction("$BUILD_DIR/${PROGNAME}.elf", bluefruit_action) - -# Also run immediately to patch before any compilation -_apply_bluefruit_patches(None, None, env) diff --git a/bin/uf2conv/uf2conv.py b/bin/uf2conv/uf2conv.py deleted file mode 100644 index cb1987a1..00000000 --- a/bin/uf2conv/uf2conv.py +++ /dev/null @@ -1,361 +0,0 @@ -#!/usr/bin/env python3 -import sys -import struct -import subprocess -import re -import os -import os.path -import argparse -import json -from time import sleep - - -UF2_MAGIC_START0 = 0x0A324655 # "UF2\n" -UF2_MAGIC_START1 = 0x9E5D5157 # Randomly selected -UF2_MAGIC_END = 0x0AB16F30 # Ditto - -INFO_FILE = "/INFO_UF2.TXT" - -appstartaddr = 0x2000 -familyid = 0x0 - - -def is_uf2(buf): - w = struct.unpack(" 476: - assert False, "Invalid UF2 data size at " + ptr - newaddr = hd[3] - if (hd[2] & 0x2000) and (currfamilyid == None): - currfamilyid = hd[7] - if curraddr == None or ((hd[2] & 0x2000) and hd[7] != currfamilyid): - currfamilyid = hd[7] - curraddr = newaddr - if familyid == 0x0 or familyid == hd[7]: - appstartaddr = newaddr - padding = newaddr - curraddr - if padding < 0: - assert False, "Block out of order at " + ptr - if padding > 10*1024*1024: - assert False, "More than 10M of padding needed at " + ptr - if padding % 4 != 0: - assert False, "Non-word padding size at " + ptr - while padding > 0: - padding -= 4 - outp.append(b"\x00\x00\x00\x00") - if familyid == 0x0 or ((hd[2] & 0x2000) and familyid == hd[7]): - outp.append(block[32 : 32 + datalen]) - curraddr = newaddr + datalen - if hd[2] & 0x2000: - if hd[7] in families_found.keys(): - if families_found[hd[7]] > newaddr: - families_found[hd[7]] = newaddr - else: - families_found[hd[7]] = newaddr - if prev_flag == None: - prev_flag = hd[2] - if prev_flag != hd[2]: - all_flags_same = False - if blockno == (numblocks - 1): - print("--- UF2 File Header Info ---") - families = load_families() - for family_hex in families_found.keys(): - family_short_name = "" - for name, value in families.items(): - if value == family_hex: - family_short_name = name - print("Family ID is {:s}, hex value is 0x{:08x}".format(family_short_name,family_hex)) - print("Target Address is 0x{:08x}".format(families_found[family_hex])) - if all_flags_same: - print("All block flag values consistent, 0x{:04x}".format(hd[2])) - else: - print("Flags were not all the same") - print("----------------------------") - if len(families_found) > 1 and familyid == 0x0: - outp = [] - appstartaddr = 0x0 - return b"".join(outp) - -def convert_to_carray(file_content): - outp = "const unsigned long bindata_len = %d;\n" % len(file_content) - outp += "const unsigned char bindata[] __attribute__((aligned(16))) = {" - for i in range(len(file_content)): - if i % 16 == 0: - outp += "\n" - outp += "0x%02x, " % file_content[i] - outp += "\n};\n" - return bytes(outp, "utf-8") - -def convert_to_uf2(file_content): - global familyid - datapadding = b"" - while len(datapadding) < 512 - 256 - 32 - 4: - datapadding += b"\x00\x00\x00\x00" - numblocks = (len(file_content) + 255) // 256 - outp = [] - for blockno in range(numblocks): - ptr = 256 * blockno - chunk = file_content[ptr:ptr + 256] - flags = 0x0 - if familyid: - flags |= 0x2000 - hd = struct.pack(b"= 3 and words[1] == "2" and words[2] == "FAT": - drives.append(words[0]) - else: - searchpaths = ["/media"] - if sys.platform == "darwin": - searchpaths = ["/Volumes"] - elif sys.platform == "linux": - searchpaths += ["/media/" + os.environ["USER"], '/run/media/' + os.environ["USER"]] - - for rootpath in searchpaths: - if os.path.isdir(rootpath): - for d in os.listdir(rootpath): - if os.path.isdir(rootpath): - drives.append(os.path.join(rootpath, d)) - - - def has_info(d): - try: - return os.path.isfile(d + INFO_FILE) - except: - return False - - return list(filter(has_info, drives)) - - -def board_id(path): - with open(path + INFO_FILE, mode='r') as file: - file_content = file.read() - return re.search(r"Board-ID: ([^\r\n]*)", file_content).group(1) - - -def list_drives(): - for d in get_drives(): - print(d, board_id(d)) - - -def write_file(name, buf): - with open(name, "wb") as f: - f.write(buf) - print("Wrote %d bytes to %s" % (len(buf), name)) - - -def load_families(): - # The expectation is that the `uf2families.json` file is in the same - # directory as this script. Make a path that works using `__file__` - # which contains the full path to this script. - filename = "uf2families.json" - pathname = os.path.join(os.path.dirname(os.path.abspath(__file__)), filename) - with open(pathname) as f: - raw_families = json.load(f) - - families = {} - for family in raw_families: - families[family["short_name"]] = int(family["id"], 0) - - return families - - -def main(): - global appstartaddr, familyid - def error(msg): - print(msg, file=sys.stderr) - sys.exit(1) - parser = argparse.ArgumentParser(description='Convert to UF2 or flash directly.') - parser.add_argument('input', metavar='INPUT', type=str, nargs='?', - help='input file (HEX, BIN or UF2)') - parser.add_argument('-b', '--base', dest='base', type=str, - default="0x2000", - help='set base address of application for BIN format (default: 0x2000)') - parser.add_argument('-f', '--family', dest='family', type=str, - default="0x0", - help='specify familyID - number or name (default: 0x0)') - parser.add_argument('-o', '--output', metavar="FILE", dest='output', type=str, - help='write output to named file; defaults to "flash.uf2" or "flash.bin" where sensible') - parser.add_argument('-d', '--device', dest="device_path", - help='select a device path to flash') - parser.add_argument('-l', '--list', action='store_true', - help='list connected devices') - parser.add_argument('-c', '--convert', action='store_true', - help='do not flash, just convert') - parser.add_argument('-D', '--deploy', action='store_true', - help='just flash, do not convert') - parser.add_argument('-w', '--wait', action='store_true', - help='wait for device to flash') - parser.add_argument('-C', '--carray', action='store_true', - help='convert binary file to a C array, not UF2') - parser.add_argument('-i', '--info', action='store_true', - help='display header information from UF2, do not convert') - args = parser.parse_args() - appstartaddr = int(args.base, 0) - - families = load_families() - - if args.family.upper() in families: - familyid = families[args.family.upper()] - else: - try: - familyid = int(args.family, 0) - except ValueError: - error("Family ID needs to be a number or one of: " + ", ".join(families.keys())) - - if args.list: - list_drives() - else: - if not args.input: - error("Need input file") - with open(args.input, mode='rb') as f: - inpbuf = f.read() - from_uf2 = is_uf2(inpbuf) - ext = "uf2" - if args.deploy: - outbuf = inpbuf - elif from_uf2 and not args.info: - outbuf = convert_from_uf2(inpbuf) - ext = "bin" - elif from_uf2 and args.info: - outbuf = "" - convert_from_uf2(inpbuf) - elif is_hex(inpbuf): - outbuf = convert_from_hex_to_uf2(inpbuf.decode("utf-8")) - elif args.carray: - outbuf = convert_to_carray(inpbuf) - ext = "h" - else: - outbuf = convert_to_uf2(inpbuf) - if not args.deploy and not args.info: - print("Converted to %s, output size: %d, start address: 0x%x" % - (ext, len(outbuf), appstartaddr)) - if args.convert or ext != "uf2": - if args.output == None: - args.output = "flash." + ext - if args.output: - write_file(args.output, outbuf) - if ext == "uf2" and not args.convert and not args.info: - drives = get_drives() - if len(drives) == 0: - if args.wait: - print("Waiting for drive to deploy...") - while len(drives) == 0: - sleep(0.1) - drives = get_drives() - elif not args.output: - error("No drive to deploy.") - for d in drives: - print("Flashing %s (%s)" % (d, board_id(d))) - write_file(d + "/NEW.UF2", outbuf) - - -if __name__ == "__main__": - main() diff --git a/bin/uf2conv/uf2families.json b/bin/uf2conv/uf2families.json deleted file mode 100644 index 25943b52..00000000 --- a/bin/uf2conv/uf2families.json +++ /dev/null @@ -1,362 +0,0 @@ -[ - { - "id": "0x16573617", - "short_name": "ATMEGA32", - "description": "Microchip (Atmel) ATmega32" - }, - { - "id": "0x1851780a", - "short_name": "SAML21", - "description": "Microchip (Atmel) SAML21" - }, - { - "id": "0x1b57745f", - "short_name": "NRF52", - "description": "Nordic NRF52" - }, - { - "id": "0x1c5f21b0", - "short_name": "ESP32", - "description": "ESP32" - }, - { - "id": "0x1e1f432d", - "short_name": "STM32L1", - "description": "ST STM32L1xx" - }, - { - "id": "0x202e3a91", - "short_name": "STM32L0", - "description": "ST STM32L0xx" - }, - { - "id": "0x21460ff0", - "short_name": "STM32WL", - "description": "ST STM32WLxx" - }, - { - "id": "0x22e0d6fc", - "short_name": "RTL8710B", - "description": "Realtek AmebaZ RTL8710B" - }, - { - "id": "0x2abc77ec", - "short_name": "LPC55", - "description": "NXP LPC55xx" - }, - { - "id": "0x300f5633", - "short_name": "STM32G0", - "description": "ST STM32G0xx" - }, - { - "id": "0x31d228c6", - "short_name": "GD32F350", - "description": "GD32F350" - }, - { - "id": "0x3379CFE2", - "short_name": "RTL8720D", - "description": "Realtek AmebaD RTL8720D" - }, - { - "id": "0x04240bdf", - "short_name": "STM32L5", - "description": "ST STM32L5xx" - }, - { - "id": "0x4c71240a", - "short_name": "STM32G4", - "description": "ST STM32G4xx" - }, - { - "id": "0x4fb2d5bd", - "short_name": "MIMXRT10XX", - "description": "NXP i.MX RT10XX" - }, - { - "id": "0x51e903a8", - "short_name": "XR809", - "description": "Xradiotech 809" - }, - { - "id": "0x53b80f00", - "short_name": "STM32F7", - "description": "ST STM32F7xx" - }, - { - "id": "0x55114460", - "short_name": "SAMD51", - "description": "Microchip (Atmel) SAMD51" - }, - { - "id": "0x57755a57", - "short_name": "STM32F4", - "description": "ST STM32F4xx" - }, - { - "id": "0x5a18069b", - "short_name": "FX2", - "description": "Cypress FX2" - }, - { - "id": "0x5d1a0a2e", - "short_name": "STM32F2", - "description": "ST STM32F2xx" - }, - { - "id": "0x5ee21072", - "short_name": "STM32F1", - "description": "ST STM32F103" - }, - { - "id": "0x621e937a", - "short_name": "NRF52833", - "description": "Nordic NRF52833" - }, - { - "id": "0x647824b6", - "short_name": "STM32F0", - "description": "ST STM32F0xx" - }, - { - "id": "0x675a40b0", - "short_name": "BK7231U", - "description": "Beken 7231U/7231T" - }, - { - "id": "0x68ed2b88", - "short_name": "SAMD21", - "description": "Microchip (Atmel) SAMD21" - }, - { - "id": "0x6a82cc42", - "short_name": "BK7251", - "description": "Beken 7251/7252" - }, - { - "id": "0x6b846188", - "short_name": "STM32F3", - "description": "ST STM32F3xx" - }, - { - "id": "0x6d0922fa", - "short_name": "STM32F407", - "description": "ST STM32F407" - }, - { - "id": "0x4e8f1c5d", - "short_name": "STM32H5", - "description": "ST STM32H5xx" - }, - { - "id": "0x6db66082", - "short_name": "STM32H7", - "description": "ST STM32H7xx" - }, - { - "id": "0x70d16653", - "short_name": "STM32WB", - "description": "ST STM32WBxx" - }, - { - "id": "0x7b3ef230", - "short_name": "BK7231N", - "description": "Beken 7231N" - }, - { - "id": "0x7eab61ed", - "short_name": "ESP8266", - "description": "ESP8266" - }, - { - "id": "0x7f83e793", - "short_name": "KL32L2", - "description": "NXP KL32L2x" - }, - { - "id": "0x8fb060fe", - "short_name": "STM32F407VG", - "description": "ST STM32F407VG" - }, - { - "id": "0x9fffd543", - "short_name": "RTL8710A", - "description": "Realtek Ameba1 RTL8710A" - }, - { - "id": "0xada52840", - "short_name": "NRF52840", - "description": "Nordic NRF52840" - }, - { - "id": "0x820d9a5f", - "short_name": "NRF52820", - "description": "Nordic NRF52820_xxAA" - }, - { - "id": "0xbfdd4eee", - "short_name": "ESP32S2", - "description": "ESP32-S2" - }, - { - "id": "0xc47e5767", - "short_name": "ESP32S3", - "description": "ESP32-S3" - }, - { - "id": "0xd42ba06c", - "short_name": "ESP32C3", - "description": "ESP32-C3" - }, - { - "id": "0x2b88d29c", - "short_name": "ESP32C2", - "description": "ESP32-C2" - }, - { - "id": "0x332726f6", - "short_name": "ESP32H2", - "description": "ESP32-H2" - }, - { - "id": "0x540ddf62", - "short_name": "ESP32C6", - "description": "ESP32-C6" - }, - { - "id": "0x3d308e94", - "short_name": "ESP32P4", - "description": "ESP32-P4" - }, - { - "id": "0xf71c0343", - "short_name": "ESP32C5", - "description": "ESP32-C5" - }, - { - "id": "0x77d850c4", - "short_name": "ESP32C61", - "description": "ESP32-C61" - }, - { - "id": "0xb6dd00af", - "short_name": "ESP32H21", - "description": "ESP32-H21" - }, - { - "id": "0x9e0baa8a", - "short_name": "ESP32H4", - "description": "ESP32-H4" - }, - { - "id": "0xde1270b7", - "short_name": "BL602", - "description": "Boufallo 602" - }, - { - "id": "0xe08f7564", - "short_name": "RTL8720C", - "description": "Realtek AmebaZ2 RTL8720C" - }, - { - "id": "0xe48bff56", - "short_name": "RP2040", - "description": "Raspberry Pi RP2040" - }, - { - "id": "0xe48bff57", - "short_name": "RP2XXX_ABSOLUTE", - "description": "Raspberry Pi Microcontrollers: Absolute (unpartitioned) download" - }, - { - "id": "0xe48bff58", - "short_name": "RP2XXX_DATA", - "description": "Raspberry Pi Microcontrollers: Data partition download" - }, - { - "id": "0xe48bff59", - "short_name": "RP2350_ARM_S", - "description": "Raspberry Pi RP2350, Secure Arm image" - }, - { - "id": "0xe48bff5a", - "short_name": "RP2350_RISCV", - "description": "Raspberry Pi RP2350, RISC-V image" - }, - { - "id": "0xe48bff5b", - "short_name": "RP2350_ARM_NS", - "description": "Raspberry Pi RP2350, Non-secure Arm image" - }, - { - "id": "0x00ff6919", - "short_name": "STM32L4", - "description": "ST STM32L4xx" - }, - { - "id": "0x9af03e33", - "short_name": "GD32VF103", - "description": "GigaDevice GD32VF103" - }, - { - "id": "0x4f6ace52", - "short_name": "CSK4", - "description": "LISTENAI CSK300x/400x" - }, - { - "id": "0x6e7348a8", - "short_name": "CSK6", - "description": "LISTENAI CSK60xx" - }, - { - "id": "0x11de784a", - "short_name": "M0SENSE", - "description": "M0SENSE BL702" - }, - { - "id": "0x4b684d71", - "short_name": "MaixPlay-U4", - "description": "Sipeed MaixPlay-U4(BL618)" - }, - { - "id": "0x9517422f", - "short_name": "RZA1LU", - "description": "Renesas RZ/A1LU (R7S7210xx)" - }, - { - "id": "0x2dc309c5", - "short_name": "STM32F411xE", - "description": "ST STM32F411xE" - }, - { - "id": "0x06d1097b", - "short_name": "STM32F411xC", - "description": "ST STM32F411xC" - }, - { - "id": "0x72721d4e", - "short_name": "NRF52832xxAA", - "description": "Nordic NRF52832xxAA" - }, - { - "id": "0x6f752678", - "short_name": "NRF52832xxAB", - "description": "Nordic NRF52832xxAB" - }, - { - "id": "0xa0c97b8e", - "short_name": "AT32F415", - "description": "ArteryTek AT32F415" - }, - { - "id": "0x699b62ec", - "short_name": "CH32V", - "description": "WCH CH32V2xx and CH32V3xx" - }, - { - "id": "0x7be8976d", - "short_name": "RA4M1", - "description": "Renesas RA4M1" - } -] diff --git a/boards/heltec_mesh_pocket.json b/boards/heltec_mesh_pocket.json deleted file mode 100644 index 6fb48a46..00000000 --- a/boards/heltec_mesh_pocket.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "build": { - "arduino": { - "ldscript": "nrf52840_s140_v6.ld" - }, - "core": "nRF5", - "cpu": "cortex-m4", - "extra_flags": "-DNRF52840_XXAA", - "f_cpu": "64000000L", - "hwids": [ - ["0x239A", "0x4405"], - ["0x239A", "0x0029"], - ["0x239A", "0x002A"] - ], - "usb_product": "HT-n5262", - "mcu": "nrf52840", - "variant": "heltec_mesh_pocket", - "variants_dir": "variants", - "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", - "onboard_tools": ["jlink"], - "svd_path": "nrf52840.svd", - "openocd_target": "nrf52840-mdk-rs" - }, - "frameworks": ["arduino"], - "name": "Heltec nrf (Adafruit BSP)", - "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": "https://heltec.org/project/meshpocket/", - "vendor": "Heltec" - } diff --git a/boards/heltec_mesh_solar.json b/boards/heltec_mesh_solar.json deleted file mode 100644 index c9125811..00000000 --- a/boards/heltec_mesh_solar.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "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": "HT-n5262", - "mcu": "nrf52840", - "variant": "heltec_mesh_solar", - "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": "nrf52.cfg" - }, - "frameworks": [ - "arduino" - ], - "name": "Heltec Mesh Solar Board", - "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": "https://heltec.org/", - "vendor": "Heltec" -} \ No newline at end of file diff --git a/boards/heltec_t114.json b/boards/heltec_t114.json deleted file mode 100644 index 86f72e73..00000000 --- a/boards/heltec_t114.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "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": "HT-n5262", - "mcu": "nrf52840", - "variant": "Heltec_T114_Board", - "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": "nrf52.cfg" - }, - "frameworks": [ - "arduino" - ], - "name": "Heltec T114 Board", - "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": "https://heltec.org/", - "vendor": "Heltec" -} \ No newline at end of file diff --git a/boards/keepteen_lt1.json b/boards/keepteen_lt1.json deleted file mode 100644 index c23b0b88..00000000 --- a/boards/keepteen_lt1.json +++ /dev/null @@ -1,79 +0,0 @@ -{ - "build": { - "arduino":{ - "ldscript": "nrf52840_s140_v6.ld" - }, - "core": "nRF5", - "cpu": "cortex-m4", - "extra_flags": "-DARDUINO_NRF52840_FEATHER -DNRF52840_XXAA", - "f_cpu": "64000000L", - "hwids": [ - [ - "0x239A", - "0x00B3" - ], - [ - "0x239A", - "0x8029" - ], - [ - "0x239A", - "0x0029" - ], - [ - "0x239A", - "0x002A" - ], - [ - "0x239A", - "0x802A" - ] - ], - "usb_product": "Keepteen LT1", - "mcu": "nrf52840", - "variant": "Keepteen LT1", - "variants_dir": "variants", - "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": "nrf52.cfg" - }, - "frameworks": [ - "arduino", - "zephyr" - ], - "name": "Keepteen LT1", - "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.keepteen.com/", - "vendor": "Keepteen" - } \ No newline at end of file diff --git a/boards/lilygo_techo_card.json b/boards/lilygo_techo_card.json deleted file mode 100644 index a57f88b4..00000000 --- a/boards/lilygo_techo_card.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "build": { - "arduino": { - "ldscript": "nrf52840_s140_v6.ld" - }, - "core": "nRF5", - "cpu": "cortex-m4", - "extra_flags": "-DNRF52840_XXAA", - "f_cpu": "64000000L", - "hwids": [ - ["0x239A", "0x8029"] - ], - "usb_product": "T-Echo Card", - "mcu": "nrf52840", - "variant": "lilygo_techo_card", - "variants_dir": "variants_bsp", - "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", - "openocd_target": "nrf52840" - }, - "frameworks": ["arduino"], - "name": "LilyGo T-Echo Card (nRF52840, SX1262, 4MB Flash)", - "upload": { - "maximum_ram_size": 248832, - "maximum_size": 815104, - "speed": 115200, - "protocol": "nrfutil", - "protocols": ["nrfutil", "jlink", "cmsis-dap"], - "native_usb": true, - "use_1200bps_touch": true, - "require_upload_port": true, - "wait_for_upload_port": true - }, - "url": "https://github.com/Xinyuan-LilyGO/T-Echo-Card", - "vendor": "LILYGO" -} \ No newline at end of file diff --git a/boards/minewsemi_me25ls01.json b/boards/minewsemi_me25ls01.json deleted file mode 100644 index 4c943158..00000000 --- a/boards/minewsemi_me25ls01.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "build": { - "arduino": { - "ldscript": "nrf52840_s140_v7.ld" - }, - "core": "nRF5", - "cpu": "cortex-m4", - "extra_flags": "-DARDUINO_WIO_WM1110 -DNRF52840_XXAA", - "f_cpu": "64000000L", - "hwids": [ - ["0x239A", "0x8029"], - ["0x239A", "0x0029"], - ["0x239A", "0x002A"], - ["0x239A", "0x802A"] - ], - "usb_product": "me25ls01-BOOT", - "mcu": "nrf52840", - "variant": "minewsemi_me25ls01", - "bsp": { - "name": "adafruit" - }, - "softdevice": { - "sd_flags": "-DS140", - "sd_name": "s140", - "sd_version": "7.3.0", - "sd_fwid": "0x0123" - }, - "bootloader": { - "settings_addr": "0xFF000" - } - }, - "connectivity": ["bluetooth"], - "debug": { - "jlink_device": "nRF52840_xxAA", - "svd_path": "nrf52840.svd", - "openocd_target": "nrf52.cfg" - }, - "frameworks": ["arduino"], - "name": "Minewsemi ME25LS01", - "upload": { - "maximum_ram_size": 248832, - "maximum_size": 815104, - "speed": 115200, - "protocol": "nrfutil", - "protocols": [ - "jlink", - "nrfjprog", - "nrfutil", - "stlink", - "cmsis-dap", - "blackmagic" - ], - "use_1200bps_touch": true, - "require_upload_port": true, - "wait_for_upload_port": true - }, - "url": "https://en.minewsemi.com/lora-module/lr1110-nrf52840-me25LS01", - "vendor": "MINEWSEMI" -} diff --git a/boards/nano-g2-ultra.json b/boards/nano-g2-ultra.json deleted file mode 100644 index 9fa22d7b..00000000 --- a/boards/nano-g2-ultra.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "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": "BQ nRF52840", - "mcu": "nrf52840", - "variant": "nano-g2-ultra", - "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": "nrf52.cfg" - }, - "frameworks": [ - "arduino" - ], - "name": "BQ nRF52840", - "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": "https://wiki.uniteng.com/en/meshtastic/nano-g2-ultra", - "vendor": "BQ Consulting" -} diff --git a/boards/nrf52840_s140_v6.ld b/boards/nrf52840_s140_v6.ld deleted file mode 100644 index 6dad975b..00000000 --- a/boards/nrf52840_s140_v6.ld +++ /dev/null @@ -1,38 +0,0 @@ -/* Linker script to configure memory regions. */ - -SEARCH_DIR(.) -GROUP(-lgcc -lc -lnosys) - -MEMORY -{ - FLASH (rx) : ORIGIN = 0x26000, LENGTH = 0xED000 - 0x26000 - - /* SRAM required by Softdevice depend on - * - Attribute Table Size (Number of Services and Characteristics) - * - Vendor UUID count - * - Max ATT MTU - * - Concurrent connection peripheral + central + secure links - * - Event Len, HVN queue, Write CMD queue - */ - RAM (rwx) : ORIGIN = 0x20006000, LENGTH = 0x20040000 - 0x20006000 -} - -SECTIONS -{ - . = ALIGN(4); - .svc_data : - { - PROVIDE(__start_svc_data = .); - KEEP(*(.svc_data)) - PROVIDE(__stop_svc_data = .); - } > RAM - - .fs_data : - { - PROVIDE(__start_fs_data = .); - KEEP(*(.fs_data)) - PROVIDE(__stop_fs_data = .); - } > RAM -} INSERT AFTER .data; - -INCLUDE "nrf52_common.ld" diff --git a/boards/nrf52840_s140_v6_extrafs.ld b/boards/nrf52840_s140_v6_extrafs.ld deleted file mode 100644 index 35261067..00000000 --- a/boards/nrf52840_s140_v6_extrafs.ld +++ /dev/null @@ -1,38 +0,0 @@ -/* Linker script to configure memory regions. */ - -SEARCH_DIR(.) -GROUP(-lgcc -lc -lnosys) - -MEMORY -{ - FLASH (rx) : ORIGIN = 0x26000, LENGTH = 0xD4000 - 0x26000 - - /* SRAM required by Softdevice depend on - * - Attribute Table Size (Number of Services and Characteristics) - * - Vendor UUID count - * - Max ATT MTU - * - Concurrent connection peripheral + central + secure links - * - Event Len, HVN queue, Write CMD queue - */ - RAM (rwx) : ORIGIN = 0x20006000, LENGTH = 0x20040000 - 0x20006000 -} - -SECTIONS -{ - . = ALIGN(4); - .svc_data : - { - PROVIDE(__start_svc_data = .); - KEEP(*(.svc_data)) - PROVIDE(__stop_svc_data = .); - } > RAM - - .fs_data : - { - PROVIDE(__start_fs_data = .); - KEEP(*(.fs_data)) - PROVIDE(__stop_fs_data = .); - } > RAM -} INSERT AFTER .data; - -INCLUDE "nrf52_common.ld" diff --git a/boards/nrf52840_s140_v7.ld b/boards/nrf52840_s140_v7.ld deleted file mode 100644 index 6aaeb403..00000000 --- a/boards/nrf52840_s140_v7.ld +++ /dev/null @@ -1,38 +0,0 @@ -/* Linker script to configure memory regions. */ - -SEARCH_DIR(.) -GROUP(-lgcc -lc -lnosys) - -MEMORY -{ - FLASH (rx) : ORIGIN = 0x27000, LENGTH = 0xED000 - 0x27000 - - /* SRAM required by Softdevice depend on - * - Attribute Table Size (Number of Services and Characteristics) - * - Vendor UUID count - * - Max ATT MTU - * - Concurrent connection peripheral + central + secure links - * - Event Len, HVN queue, Write CMD queue - */ - RAM (rwx) : ORIGIN = 0x20006000, LENGTH = 0x20040000 - 0x20006000 -} - -SECTIONS -{ - . = ALIGN(4); - .svc_data : - { - PROVIDE(__start_svc_data = .); - KEEP(*(.svc_data)) - PROVIDE(__stop_svc_data = .); - } > RAM - - .fs_data : - { - PROVIDE(__start_fs_data = .); - KEEP(*(.fs_data)) - PROVIDE(__stop_fs_data = .); - } > RAM -} INSERT AFTER .data; - -INCLUDE "nrf52_common.ld" diff --git a/boards/nrf52840_s140_v7_extrafs.ld b/boards/nrf52840_s140_v7_extrafs.ld deleted file mode 100644 index 5956183a..00000000 --- a/boards/nrf52840_s140_v7_extrafs.ld +++ /dev/null @@ -1,38 +0,0 @@ -/* Linker script to configure memory regions. */ - -SEARCH_DIR(.) -GROUP(-lgcc -lc -lnosys) - -MEMORY -{ - FLASH (rx) : ORIGIN = 0x27000, LENGTH = 0xD4000 - 0x27000 - - /* SRAM required by Softdevice depend on - * - Attribute Table Size (Number of Services and Characteristics) - * - Vendor UUID count - * - Max ATT MTU - * - Concurrent connection peripheral + central + secure links - * - Event Len, HVN queue, Write CMD queue - */ - RAM (rwx) : ORIGIN = 0x20006000, LENGTH = 0x20040000 - 0x20006000 -} - -SECTIONS -{ - . = ALIGN(4); - .svc_data : - { - PROVIDE(__start_svc_data = .); - KEEP(*(.svc_data)) - PROVIDE(__stop_svc_data = .); - } > RAM - - .fs_data : - { - PROVIDE(__start_fs_data = .); - KEEP(*(.fs_data)) - PROVIDE(__stop_fs_data = .); - } > RAM -} INSERT AFTER .data; - -INCLUDE "nrf52_common.ld" diff --git a/boards/promicro_nrf52840.json b/boards/promicro_nrf52840.json deleted file mode 100644 index a428ffde..00000000 --- a/boards/promicro_nrf52840.json +++ /dev/null @@ -1,79 +0,0 @@ -{ - "build": { - "arduino":{ - "ldscript": "nrf52840_s140_v6.ld" - }, - "core": "nRF5", - "cpu": "cortex-m4", - "extra_flags": "-DARDUINO_NRF52840_FEATHER -DNRF52840_XXAA", - "f_cpu": "64000000L", - "hwids": [ - [ - "0x239A", - "0x00B3" - ], - [ - "0x239A", - "0x8029" - ], - [ - "0x239A", - "0x0029" - ], - [ - "0x239A", - "0x002A" - ], - [ - "0x239A", - "0x802A" - ] - ], - "usb_product": "ProMicro NRF52840", - "mcu": "nrf52840", - "variant": "promicro_nrf52840", - "variants_dir": "variants", - "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": "nrf52.cfg" - }, - "frameworks": [ - "arduino", - "zephyr" - ], - "name": "ProMicro NRF52840", - "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": "https://www.nologo.tech/en/product/otherboard/NRF52840.html", - "vendor": "Nologo" - } \ No newline at end of file diff --git a/boards/rak3401.json b/boards/rak3401.json deleted file mode 100644 index a2816a63..00000000 --- a/boards/rak3401.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "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": "WisCore RAK3401 Board", - "mcu": "nrf52840", - "variant": "WisCore_RAK3401_Board", - "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" - }, - "frameworks": [ - "arduino" - ], - "name": "WisCore RAK3401 Board", - "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": "https://www.rakwireless.com", - "vendor": "RAKwireless" -} diff --git a/boards/rak4631.json b/boards/rak4631.json deleted file mode 100644 index 8d820fce..00000000 --- a/boards/rak4631.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "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": "WisCore RAK4631 Board", - "mcu": "nrf52840", - "variant": "WisCore_RAK4631_Board", - "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" - }, - "frameworks": [ - "arduino" - ], - "name": "WisCore RAK4631 Board", - "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": "https://www.rakwireless.com", - "vendor": "RAKwireless" -} diff --git a/boards/seeed-wio-tracker-l1.json b/boards/seeed-wio-tracker-l1.json deleted file mode 100644 index 56e3b424..00000000 --- a/boards/seeed-wio-tracker-l1.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "build": { - "arduino": { - "ldscript": "nrf52840_s140_v7.ld" - }, - "core": "nRF5", - "cpu": "cortex-m4", - "extra_flags": "-DARDUINO_SEEED_WIO_TRACKER_L1 -DNRF52840_XXAA -DSEEED_WIO_TRACKER_L1 ", - "f_cpu": "64000000L", - "hwids": [ - [ "0x2886", "0x1667" ], - [ "0x2886", "0x1668" ] - ], - "mcu": "nrf52840", - "variant": "Seeed_Wio_Tracker_L1", - "softdevice": { - "sd_flags": "-DS140", - "sd_name": "s140", - "sd_version": "7.3.0", - "sd_fwid": "0x0123" - }, - "bsp": { - "name": "adafruit" - }, - "bootloader": { - "settings_addr": "0xFF000" - }, - "usb_product": "Seeed Wio Tracker L1" - }, - "connectivity": [ - "bluetooth" - ], - "debug": { - "jlink_device": "nRF52840_xxAA", - "openocd_target": "nrf52.cfg", - "svd_path": "nrf52840.svd" - }, - "frameworks": [ - "arduino" - ], - "name": "Seeed Wio Tracker L1", - "upload": { - "maximum_ram_size": 237568, - "maximum_size": 811008, - "protocol": "nrfutil", - "speed": 115200, - "protocols": [ - "jlink", - "stlink", - "nrfjprog", - "nrfutil", - "cmsis-dap", - "sam-ba", - "blackmagic" - ], - "use_1200bps_touch": true, - "require_upload_port": true, - "wait_for_upload_port": true - }, - "url": "https://wiki.seeedstudio.com/wio_tracker_l1_node/", - "vendor": "Seeed Studio" -} \ No newline at end of file diff --git a/boards/seeed-xiao-afruitnrf52-nrf52840.json b/boards/seeed-xiao-afruitnrf52-nrf52840.json deleted file mode 100644 index 78855cd7..00000000 --- a/boards/seeed-xiao-afruitnrf52-nrf52840.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "build": { - "arduino": { - "ldscript": "nrf52840_s140_v7.ld" - }, - "core": "nRF5", - "cpu": "cortex-m4", - "extra_flags": "-DARDUINO_Seeed_XIAO_nRF52840 -DNRF52840_XXAA -DSEEED_XIAO_NRF52840 ", - "f_cpu": "64000000L", - "hwids": [ - [ "0x2886", "0x8044" ], - [ "0x2886", "0x0044" ] - ], - "mcu": "nrf52840", - "variant": "Seeed_XIAO_nRF52840", - "softdevice": { - "sd_flags": "-DS140", - "sd_name": "s140", - "sd_version": "7.3.0", - "sd_fwid": "0x0123" - }, - "bsp": { - "name": "adafruit" - }, - "bootloader": { - "settings_addr": "0xFF000" - }, - "usb_product": "XIAO nRF52840" - }, - "connectivity": [ - "bluetooth" - ], - "debug": { - "jlink_device": "nRF52840_xxAA", - "openocd_target": "nrf52.cfg", - "svd_path": "nrf52840.svd" - }, - "frameworks": [ - "arduino" - ], - "name": "Seeed Studio XIAO nRF52840", - "upload": { - "maximum_ram_size": 237568, - "maximum_size": 811008, - "protocol": "nrfutil", - "speed": 115200, - "protocols": [ - "jlink", - "nrfjprog", - "nrfutil", - "cmsis-dap", - "sam-ba", - "blackmagic" - ], - "use_1200bps_touch": true, - "require_upload_port": true, - "wait_for_upload_port": true - }, - "url": "https://wiki.seeedstudio.com/XIAO_BLE", - "vendor": "Seeed Studio" -} diff --git a/boards/seeed_sensecap_solar.json b/boards/seeed_sensecap_solar.json deleted file mode 100644 index d6630d82..00000000 --- a/boards/seeed_sensecap_solar.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "build": { - "arduino": { - "ldscript": "nrf52840_s140_v7.ld" - }, - "core": "nRF5", - "cpu": "cortex-m4", - "extra_flags": "-DARDUINO_Seeed_XIAO_nRF52840 -DNRF52840_XXAA -DSEEED_XIAO_NRF52840 ", - "f_cpu": "64000000L", - "hwids": [ - [ "0x2886", "0x0059" ] - ], - "mcu": "nrf52840", - "variant": "Seeed_XIAO_nRF52840", - "softdevice": { - "sd_flags": "-DS140", - "sd_name": "s140", - "sd_version": "7.3.0", - "sd_fwid": "0x0123" - }, - "bsp": { - "name": "adafruit" - }, - "bootloader": { - "settings_addr": "0xFF000" - }, - "usb_product": "XIAO nRF52840" - }, - "connectivity": [ - "bluetooth" - ], - "debug": { - "jlink_device": "nRF52840_xxAA", - "openocd_target": "nrf52.cfg", - "svd_path": "nrf52840.svd" - }, - "frameworks": [ - "arduino" - ], - "name": "Seeed Studio XIAO nRF52840", - "upload": { - "maximum_ram_size": 248832, - "maximum_size": 815104, - "protocol": "nrfutil", - "speed": 115200, - "protocols": [ - "jlink", - "nrfjprog", - "nrfutil", - "cmsis-dap", - "sam-ba", - "blackmagic" - ], - "use_1200bps_touch": true, - "require_upload_port": true, - "wait_for_upload_port": true - }, - "url": "https://wiki.seeedstudio.com/meshtastic_solar_node/", - "vendor": "Seeed Studio" -} \ No newline at end of file diff --git a/boards/t-echo.json b/boards/t-echo.json deleted file mode 100644 index 8deea1bc..00000000 --- a/boards/t-echo.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "build": { - "arduino": { - "ldscript": "nrf52840_s140_v6.ld" - }, - "core": "nRF5", - "cpu": "cortex-m4", - "extra_flags": "-DARDUINO_NRF52840_PCA10056 -DNRF52840_XXAA", - "f_cpu": "64000000L", - "hwids": [ - [ - "0x239A", - "0x8029" - ] - ], - "usb_product": "NRF52 DK", - "mcu": "nrf52840", - "variant": "pca10056", - "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", - "onboard_tools": [ - "jlink" - ], - "svd_path": "nrf52840.svd", - "openocd_target": "nrf52.cfg" - }, - "frameworks": [ - "arduino" - ], - "name": "LilyGo T-ECHO", - "upload": { - "maximum_ram_size": 248832, - "maximum_size": 815104, - "require_upload_port": true, - "speed": 115200, - "protocol": "jlink", - "protocols": [ - "jlink", - "nrfjprog", - "stlink", - "cmsis-dap", - "blackmagic" - ] - }, - "url": "https://os.mbed.com/platforms/Nordic-nRF52840-DK/", - "vendor": "Nordic" -} \ No newline at end of file diff --git a/boards/t5s3-epaper-pro.json b/boards/t5s3-epaper-pro.json deleted file mode 100644 index 93c6edf6..00000000 --- a/boards/t5s3-epaper-pro.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "build": { - "arduino": { - "ldscript": "esp32s3_out.ld", - "memory_type": "qio_opi", - "partitions": "default_16MB.csv" - }, - "core": "esp32", - "extra_flags": [ - "-DBOARD_HAS_PSRAM", - "-DARDUINO_RUNNING_CORE=1", - "-DARDUINO_EVENT_RUNNING_CORE=0", - "-DARDUINO_USB_CDC_ON_BOOT=1", - "-DARDUINO_USB_MODE=1" - ], - "f_cpu": "240000000L", - "f_flash": "80000000L", - "flash_mode": "qio", - "hwids": [["0x303A", "0x1001"]], - "mcu": "esp32s3", - "variant": "esp32s3" - }, - "connectivity": ["wifi", "bluetooth", "lora"], - "debug": { - "openocd_target": "esp32s3.cfg" - }, - "frameworks": ["arduino", "espidf"], - "name": "LilyGo T5S3 E-Paper Pro", - "upload": { - "flash_size": "16MB", - "maximum_ram_size": 327680, - "maximum_size": 16777216, - "require_upload_port": true, - "speed": 921600 - }, - "url": "https://lilygo.cc/products/t5-e-paper-s3-pro", - "vendor": "LILYGO" -} diff --git a/boards/thinknode_m1.json b/boards/thinknode_m1.json deleted file mode 100644 index 9f486285..00000000 --- a/boards/thinknode_m1.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "build": { - "arduino": { - "ldscript": "nrf52840_s140_v6.ld" - }, - "core": "nRF5", - "cpu": "cortex-m4", - "extra_flags": "-DARDUINO_NRF52840_TTGO_EINK -DNRF52840_XXAA", - "f_cpu": "64000000L", - "hwids": [ - [ - "0x239A", - "0x4405" - ], - [ - "0x239A", - "0x0029" - ], - [ - "0x239A", - "0x002A" - ] - ], - "usb_product": "elecrow_eink", - "mcu": "nrf52840", - "variant": "ELECROW-ThinkNode-M1", - "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", - "onboard_tools": [ - "jlink" - ], - "svd_path": "nrf52840.svd", - "openocd_target": "nrf52.cfg" - }, - "frameworks": [ - "arduino" - ], - "name": "elecrow eink", - "upload": { - "maximum_ram_size": 248832, - "maximum_size": 815104, - "speed": 115200, - "use_1200bps_touch": true, - "require_upload_port": true, - "wait_for_upload_port": true, - "protocol": "nrfutil", - "protocols": [ - "jlink", - "nrfjprog", - "nrfutil", - "stlink" - ] - }, - "url": "https://github.com/Elecrow-RD", - "vendor": "ELECROW" -} \ No newline at end of file diff --git a/boards/thinknode_m3.json b/boards/thinknode_m3.json deleted file mode 100644 index 617740b6..00000000 --- a/boards/thinknode_m3.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "build": { - "arduino": { - "ldscript": "nrf52840_s140_v6.ld" - }, - "core": "nRF5", - "cpu": "cortex-m4", - "extra_flags": "-DNRF52840_XXAA", - "f_cpu": "64000000L", - "hwids": [ - [ - "0x239A", - "0x4405" - ], - [ - "0x239A", - "0x0029" - ], - [ - "0x239A", - "0x002A" - ] - ], - "usb_product": "elecrow_eink", - "mcu": "nrf52840", - "variant": "ELECROW-ThinkNode-M3", - "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", - "onboard_tools": [ - "jlink" - ], - "svd_path": "nrf52840.svd", - "openocd_target": "nrf52.cfg" - }, - "frameworks": [ - "arduino" - ], - "name": "elecrow nrf", - "upload": { - "maximum_ram_size": 248832, - "maximum_size": 815104, - "speed": 115200, - "use_1200bps_touch": true, - "require_upload_port": true, - "wait_for_upload_port": true, - "protocol": "nrfutil", - "protocols": [ - "jlink", - "nrfjprog", - "nrfutil", - "stlink" - ] - }, - "url": "https://github.com/Elecrow-RD", - "vendor": "ELECROW" -} \ No newline at end of file diff --git a/boards/thinknode_m6.json b/boards/thinknode_m6.json deleted file mode 100644 index 1f91b9aa..00000000 --- a/boards/thinknode_m6.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "build": { - "arduino": { - "ldscript": "nrf52840_s140_v6.ld" - }, - "core": "nRF5", - "cpu": "cortex-m4", - "extra_flags": "-DARDUINO_NRF52840_ELECROW_M6 -DNRF52840_XXAA", - "f_cpu": "64000000L", - "hwids": [ - [ - "0x239A", - "0x4405" - ], - [ - "0x239A", - "0x0029" - ], - [ - "0x239A", - "0x002A" - ] - ], - "usb_product": "elecrow_solar", - "mcu": "nrf52840", - "variant": "ELECROW-ThinkNode-M6", - "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", - "onboard_tools": [ - "jlink" - ], - "svd_path": "nrf52840.svd", - "openocd_target": "nrf52.cfg" - }, - "frameworks": [ - "arduino" - ], - "name": "elecrow solar", - "upload": { - "maximum_ram_size": 248832, - "maximum_size": 815104, - "speed": 115200, - "use_1200bps_touch": true, - "require_upload_port": true, - "wait_for_upload_port": true, - "protocol": "nrfutil", - "protocols": [ - "jlink", - "nrfjprog", - "nrfutil", - "stlink" - ] - }, - "url": "https://github.com/Elecrow-RD", - "vendor": "ELECROW" -} diff --git a/boards/tracker-t1000-e.json b/boards/tracker-t1000-e.json deleted file mode 100644 index fc740ac5..00000000 --- a/boards/tracker-t1000-e.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "build": { - "arduino": { - "ldscript": "nrf52840_s140_v7.ld" - }, - "core": "nRF5", - "cpu": "cortex-m4", - "extra_flags": "-DARDUINO_WIO_WM1110 -DNRF52840_XXAA", - "f_cpu": "64000000L", - "hwids": [ - ["0x239A", "0x8029"], - ["0x239A", "0x0029"], - ["0x239A", "0x002A"], - ["0x239A", "0x802A"] - ], - "usb_product": "T1000-E-BOOT", - "mcu": "nrf52840", - "variant": "Seeed_T1000-E", - "bsp": { - "name": "adafruit" - }, - "softdevice": { - "sd_flags": "-DS140", - "sd_name": "s140", - "sd_version": "7.3.0", - "sd_fwid": "0x0123" - }, - "bootloader": { - "settings_addr": "0xFF000" - } - }, - "connectivity": ["bluetooth"], - "debug": { - "jlink_device": "nRF52840_xxAA", - "svd_path": "nrf52840.svd", - "openocd_target": "nrf52.cfg" - }, - "frameworks": ["arduino"], - "name": "Seeed T1000-E", - "upload": { - "maximum_ram_size": 248832, - "maximum_size": 815104, - "speed": 115200, - "protocol": "nrfutil", - "protocols": [ - "jlink", - "nrfjprog", - "nrfutil", - "stlink", - "cmsis-dap", - "blackmagic" - ], - "use_1200bps_touch": true, - "require_upload_port": true, - "wait_for_upload_port": true - }, - "url": "https://www.seeedstudio.com/SenseCAP-Card-Tracker-T1000-E-for-Meshtastic-p-5913.html", - "vendor": "Seeed Studio" -} diff --git a/build.sh b/build.sh index b7f95dd7..c61062a8 100755 --- a/build.sh +++ b/build.sh @@ -15,10 +15,10 @@ Commands: build-room-server-firmwares: Build all chat room server firmwares for all build targets. Examples: -Build firmware for the "RAK_4631_repeater" device target -$ sh build.sh build-firmware RAK_4631_repeater +Build firmware for the "meck_max_ble" device target +$ sh build.sh build-firmware meck_max_ble -Build all firmwares for device targets containing the string "RAK_4631" +Build all firmwares for device targets containing the string "meck_max" $ sh build.sh build-matching-firmwares Build all companion firmwares @@ -38,11 +38,11 @@ Examples: Build without debug logging: $ export FIRMWARE_VERSION=v1.0.0 $ export DISABLE_DEBUG=1 -$ sh build.sh build-firmware RAK_4631_repeater +$ sh build.sh build-firmware meck_max_ble Build with debug logging (default, uses flags from variant files): $ export FIRMWARE_VERSION=v1.0.0 -$ sh build.sh build-firmware RAK_4631_repeater +$ sh build.sh build-firmware meck_max_ble EOF } @@ -109,7 +109,7 @@ build_firmware() { FIRMWARE_VERSION_STRING="${FIRMWARE_VERSION}-${COMMIT_HASH}" # craft filename - # e.g: RAK_4631_Repeater-v1.0.0-SHA + # e.g: meck_max_ble-v1.0.0-SHA FIRMWARE_FILENAME="$1-${FIRMWARE_VERSION_STRING}" # add firmware version info to end of existing platformio build flags in environment vars @@ -126,23 +126,13 @@ build_firmware() { pio run -t mergebin -e $1 fi - # build .uf2 for nrf52 boards - if [[ -f .pio/build/$1/firmware.zip && -f .pio/build/$1/firmware.hex ]]; then - python3 bin/uf2conv/uf2conv.py .pio/build/$1/firmware.hex -c -o .pio/build/$1/firmware.uf2 -f 0xADA52840 - fi - - # copy .bin, .uf2, and .zip to out folder + # copy .bin to out folder # e.g: Heltec_v3_room_server-v1.0.0-SHA.bin - # e.g: RAK_4631_Repeater-v1.0.0-SHA.uf2 # copy .bin for esp32 boards cp .pio/build/$1/firmware.bin out/${FIRMWARE_FILENAME}.bin 2>/dev/null || true cp .pio/build/$1/firmware-merged.bin out/${FIRMWARE_FILENAME}-merged.bin 2>/dev/null || true - # copy .zip and .uf2 of nrf52 boards - cp .pio/build/$1/firmware.uf2 out/${FIRMWARE_FILENAME}.uf2 2>/dev/null || true - cp .pio/build/$1/firmware.zip out/${FIRMWARE_FILENAME}.zip 2>/dev/null || true - } # firmwares containing $1 will be built @@ -169,7 +159,6 @@ build_repeater_firmwares() { # build_firmware "Xiao_C3_Repeater_sx1262" # build_firmware "Xiao_S3_WIO_Repeater" # build_firmware "LilyGo_T3S3_sx1262_Repeater" -# build_firmware "RAK_4631_Repeater" # build all repeater firmwares build_all_firmwares_by_suffix "_repeater" @@ -186,9 +175,6 @@ build_companion_firmwares() { # build_firmware "Xiao_S3_WIO_companion_radio_ble" # build_firmware "LilyGo_T3S3_sx1262_companion_radio_usb" # build_firmware "LilyGo_T3S3_sx1262_companion_radio_ble" -# build_firmware "RAK_4631_companion_radio_usb" -# build_firmware "RAK_4631_companion_radio_ble" -# build_firmware "t1000e_companion_radio_ble" # build all companion firmwares build_all_firmwares_by_suffix "_companion_radio_usb" @@ -200,7 +186,6 @@ build_room_server_firmwares() { # # build specific room server firmwares # build_firmware "Heltec_v3_room_server" -# build_firmware "RAK_4631_room_server" # build all room server firmwares build_all_firmwares_by_suffix "_room_server" diff --git a/build_as_lib.py b/build_as_lib.py index d8e95378..2e89f055 100644 --- a/build_as_lib.py +++ b/build_as_lib.py @@ -20,8 +20,6 @@ for item in menv.get("CPPDEFINES", []): src_filter.append("+") elif item == "ESP32": src_filter.append("+") - elif item == "NRF52_PLATFORM": - src_filter.append("+") elif item == "RP2040_PLATFORM": src_filter.append("+") diff --git a/create-uf2.py b/create-uf2.py deleted file mode 100644 index 10ec0ed6..00000000 --- a/create-uf2.py +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/python3 - -# Adds PlatformIO post-processing to convert hex files to uf2 files - -import os - -Import("env") - -firmware_hex = "${BUILD_DIR}/${PROGNAME}.hex" -uf2_file = os.environ.get("UF2_FILE_PATH", "${BUILD_DIR}/${PROGNAME}.uf2") - -def create_uf2_action(source, target, env): - uf2_cmd = " ".join( - [ - '"$PYTHONEXE"', - '"$PROJECT_DIR/bin/uf2conv/uf2conv.py"', - '-f', '0xADA52840', - '-c', firmware_hex, - '-o', uf2_file, - ] - ) - env.Execute(uf2_cmd) - -env.AddCustomTarget( - name="create_uf2", - dependencies=firmware_hex, - actions=create_uf2_action, - title="Create UF2 file", - description="Use uf2conv to convert hex binary into uf2", - always_build=True, -) \ No newline at end of file diff --git a/docs/nrf52_power_management.md b/docs/nrf52_power_management.md deleted file mode 100644 index ebe9bbbe..00000000 --- a/docs/nrf52_power_management.md +++ /dev/null @@ -1,213 +0,0 @@ -# nRF52 Power Management - -## Overview - -The nRF52 Power Management module provides battery protection features to prevent over-discharge, minimise likelihood of brownout and flash corruption conditions existing, and enable safe voltage-based recovery. - -## Features - -### Boot Voltage Protection -- Checks battery voltage immediately after boot and before mesh operations commence -- If voltage is below a configurable threshold (e.g., 3300mV), the device configures voltage wake (LPCOMP + VBUS) and enters protective shutdown (SYSTEMOFF) -- Prevents boot loops when battery is critically low -- Skipped when external power (USB VBUS) is detected - -### Voltage Wake (LPCOMP + VBUS) -- Configures the nRF52's Low Power Comparator (LPCOMP) before entering SYSTEMOFF -- Enables USB VBUS detection so external power can wake the device -- Device automatically wakes when battery voltage rises above recovery threshold or when VBUS is detected - -### Early Boot Register Capture -- Captures RESETREAS (reset reason) and GPREGRET2 (shutdown reason) before SystemInit() clears them -- Allows firmware to determine why it booted (cold boot, watchdog, LPCOMP wake, etc.) -- Allows firmware to determine why it last shut down (user request, low voltage, boot protection) - -### Shutdown Reason Tracking -Shutdown reason codes (stored in GPREGRET2): -| Code | Name | Description | -|------|------|-------------| -| 0x00 | NONE | Normal boot / no previous shutdown | -| 0x4C | LOW_VOLTAGE | Runtime low voltage threshold reached | -| 0x55 | USER | User requested powerOff() | -| 0x42 | BOOT_PROTECT | Boot voltage protection triggered | - -## Supported Boards - -| Board | Implemented | LPCOMP wake | VBUS wake | -|-------|-------------|-------------|-----------| -| Seeed Studio XIAO nRF52840 (`xiao_nrf52`) | Yes | Yes | Yes | -| RAK4631 (`rak4631`) | Yes | Yes | Yes | -| Heltec T114 (`heltec_t114`) | Yes | Yes | Yes | -| Promicro nRF52840 | No | No | No | -| RAK WisMesh Tag | No | No | No | -| Heltec Mesh Solar | No | No | No | -| LilyGo T-Echo / T-Echo Lite | No | No | No | -| SenseCAP Solar | No | No | No | -| WIO Tracker L1 / L1 E-Ink | No | No | No | -| WIO WM1110 | No | No | No | -| Mesh Pocket | No | No | No | -| Nano G2 Ultra | No | No | No | -| ThinkNode M1/M3/M6 | No | No | No | -| T1000-E | No | No | No | -| Ikoka Nano/Stick/Handheld (nRF) | No | No | No | -| Keepteen LT1 | No | No | No | -| Minewsemi ME25LS01 | No | No | No | - -Notes: -- "Implemented" reflects Phase 1 (boot lockout + shutdown reason capture). -- User power-off on Heltec T114 does not enable LPCOMP wake. -- VBUS detection is used to skip boot lockout on external power, and VBUS wake is configured alongside LPCOMP when supported hardware exposes VBUS to the nRF52. - -## Technical Details - -### Architecture - -The power management functionality is integrated into the `NRF52Board` base class in `src/helpers/NRF52Board.cpp`. Board variants provide hardware-specific configuration via a `PowerMgtConfig` struct and override `initiateShutdown(uint8_t reason)` to perform board-specific power-down work and conditionally enable voltage wake (LPCOMP + VBUS). - -### Early Boot Capture - -A static constructor with priority 101 in `NRF52Board.cpp` captures the RESETREAS and GPREGRET2 registers before: -- SystemInit() (priority 102) - which clears RESETREAS -- Static C++ constructors (default priority 65535) - -This ensures we capture the true reset reason before any initialisation code runs. - -### Board Implementation - -To enable power management on a board variant: - -1. **Enable in platformio.ini**: - ```ini - -D NRF52_POWER_MANAGEMENT - ``` - -2. **Define configuration in variant.h**: - ```c - #define PWRMGT_VOLTAGE_BOOTLOCK 3300 // Won't boot below this voltage (mV) - #define PWRMGT_LPCOMP_AIN 7 // AIN channel for voltage sensing - #define PWRMGT_LPCOMP_REFSEL 2 // REFSEL (0-6=1/8..7/8, 7=ARef, 8-15=1/16..15/16) - ``` - -3. **Implement in board .cpp file**: - ```cpp - #ifdef NRF52_POWER_MANAGEMENT - const PowerMgtConfig power_config = { - .lpcomp_ain_channel = PWRMGT_LPCOMP_AIN, - .lpcomp_refsel = PWRMGT_LPCOMP_REFSEL, - .voltage_bootlock = PWRMGT_VOLTAGE_BOOTLOCK - }; - - void MyBoard::initiateShutdown(uint8_t reason) { - // Board-specific shutdown preparation (e.g., disable peripherals) - bool enable_lpcomp = (reason == SHUTDOWN_REASON_LOW_VOLTAGE || - reason == SHUTDOWN_REASON_BOOT_PROTECT); - - if (enable_lpcomp) { - configureVoltageWake(power_config.lpcomp_ain_channel, power_config.lpcomp_refsel); - } - - enterSystemOff(reason); - } - #endif - - void MyBoard::begin() { - NRF52Board::begin(); // or NRF52BoardDCDC::begin() - // ... board setup ... - - #ifdef NRF52_POWER_MANAGEMENT - checkBootVoltage(&power_config); - #endif - } - ``` - - For user-initiated shutdowns, `powerOff()` remains board-specific. Power management only arms LPCOMP for automated shutdown reasons (boot protection/low voltage). - -4. **Declare override in board .h file**: - ```cpp - #ifdef NRF52_POWER_MANAGEMENT - void initiateShutdown(uint8_t reason) override; - #endif - ``` - -### Voltage Wake Configuration - -The LPCOMP (Low Power Comparator) is configured to: -- Monitor the specified AIN channel (0-7 corresponding to P0.02-P0.05, P0.28-P0.31) -- Compare against VDD fraction reference (REFSEL: 0-6=1/8..7/8, 7=ARef, 8-15=1/16..15/16) -- Detect UP events (voltage rising above threshold) -- Use 50mV hysteresis for noise immunity -- Wake the device from SYSTEMOFF when triggered - -VBUS wake is enabled via the POWER peripheral USBDETECTED event whenever `configureVoltageWake()` is used. This requires USB VBUS to be routed to the nRF52 (typical on nRF52840 boards with native USB). - -**LPCOMP Reference Selection (PWRMGT_LPCOMP_REFSEL)**: -| REFSEL | Fraction | VBAT @ 1M/1M divider (VDD=3.0-3.3) | VBAT @ 1.5M/1M divider (VDD=3.0-3.3) | -|--------|----------|------------------------------------|--------------------------------------| -| 0 | 1/8 | 0.75-0.82 V | 0.94-1.03 V | -| 1 | 2/8 | 1.50-1.65 V | 1.88-2.06 V | -| 2 | 3/8 | 2.25-2.47 V | 2.81-3.09 V | -| 3 | 4/8 | 3.00-3.30 V | 3.75-4.12 V | -| 4 | 5/8 | 3.75-4.12 V | 4.69-5.16 V | -| 5 | 6/8 | 4.50-4.95 V | 5.62-6.19 V | -| 6 | 7/8 | 5.25-5.77 V | 6.56-7.22 V | -| 7 | ARef | - | - | -| 8 | 1/16 | 0.38-0.41 V | 0.47-0.52 V | -| 9 | 3/16 | 1.12-1.24 V | 1.41-1.55 V | -| 10 | 5/16 | 1.88-2.06 V | 2.34-2.58 V | -| 11 | 7/16 | 2.62-2.89 V | 3.28-3.61 V | -| 12 | 9/16 | 3.38-3.71 V | 4.22-4.64 V | -| 13 | 11/16 | 4.12-4.54 V | 5.16-5.67 V | -| 14 | 13/16 | 4.88-5.36 V | 6.09-6.70 V | -| 15 | 15/16 | 5.62-6.19 V | 7.03-7.73 V | - -**Important**: For boards with a voltage divider on the battery sense pin, LPCOMP measures the divided voltage. Use: -`VBAT_threshold ≈ (VDD * fraction) * divider_scale`, where `divider_scale = (Rtop + Rbottom) / Rbottom` (e.g., 2.0 for 1M/1M, 2.5 for 1.5M/1M, 3.0 for XIAO). - -### SoftDevice Compatibility - -The power management code checks whether SoftDevice is enabled and uses the appropriate API: -- When SD enabled: `sd_power_*` functions -- When SD disabled: Direct register access (NRF_POWER->*) - -This ensures compatibility regardless of BLE stack state. - -## CLI Commands - -Power management status can be queried via the CLI: - -| Command | Description | -|---------|-------------| -| `get pwrmgt.support` | Returns "supported" or "unsupported" | -| `get pwrmgt.source` | Returns current power source - "battery" or "external" (5V/USB power) | -| `get pwrmgt.bootreason` | Returns reset and shutdown reason strings | -| `get pwrmgt.bootmv` | Returns boot voltage in millivolts | - -On boards without power management enabled, all commands except `get pwrmgt.support` return: -``` -ERROR: Power management not supported -``` - -## Debug Output - -When `MESH_DEBUG=1` is enabled, the power management module outputs: -``` -DEBUG: PWRMGT: Reset = Wake from LPCOMP (0x20000); Shutdown = Low Voltage (0x4C) -DEBUG: PWRMGT: Boot voltage = 3450 mV (threshold = 3300 mV) -DEBUG: PWRMGT: LPCOMP wake configured (AIN7, ref=3/8 VDD) -``` - -## Phase 2 (Planned) - -- Runtime voltage monitoring -- Voltage state machine (Normal -> Warning -> Critical -> Shutdown) -- Configurable thresholds -- Load shedding callbacks for power reduction -- Deep sleep integration -- Scheduled wake-up -- Extended sleep with periodic monitoring - -## References - -- [nRF52840 Product Specification - POWER](https://infocenter.nordicsemi.com/topic/ps_nrf52840/power.html) -- [nRF52840 Product Specification - LPCOMP](https://infocenter.nordicsemi.com/topic/ps_nrf52840/lpcomp.html) -- [SoftDevice S140 API - Power Management](https://infocenter.nordicsemi.com/topic/sdk_nrf5_v17.1.0/group__nrf__sdm__api.html) diff --git a/examples/companion_radio/DataStore.cpp b/examples/companion_radio/DataStore.cpp index a6942330..38317198 100644 --- a/examples/companion_radio/DataStore.cpp +++ b/examples/companion_radio/DataStore.cpp @@ -1,14 +1,10 @@ #include #include "DataStore.h" -#if defined(EXTRAFS) || defined(QSPIFLASH) - #define MAX_BLOBRECS 100 -#else #define MAX_BLOBRECS 20 -#endif DataStore::DataStore(FILESYSTEM& fs, mesh::RTCClock& clock) : _fs(&fs), _fsExtra(nullptr), _clock(&clock), -#if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM) +#if defined(STM32_PLATFORM) identity_store(fs, "") #elif defined(RP2040_PLATFORM) identity_store(fs, "/identity") @@ -18,21 +14,8 @@ DataStore::DataStore(FILESYSTEM& fs, mesh::RTCClock& clock) : _fs(&fs), _fsExtra { } -#if defined(EXTRAFS) || defined(QSPIFLASH) -DataStore::DataStore(FILESYSTEM& fs, FILESYSTEM& fsExtra, mesh::RTCClock& clock) : _fs(&fs), _fsExtra(&fsExtra), _clock(&clock), -#if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM) - identity_store(fs, "") -#elif defined(RP2040_PLATFORM) - identity_store(fs, "/identity") -#else - identity_store(fs, "/identity") -#endif -{ -} -#endif - static File openWrite(FILESYSTEM* fs, const char* filename) { -#if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM) +#if defined(STM32_PLATFORM) fs->remove(filename); return fs->open(filename, FILE_O_WRITE); #elif defined(RP2040_PLATFORM) @@ -42,7 +25,7 @@ static File openWrite(FILESYSTEM* fs, const char* filename) { #endif } -#if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM) +#if defined(STM32_PLATFORM) static uint32_t _ContactsChannelsTotalBlocks = 0; #endif @@ -51,12 +34,9 @@ void DataStore::begin() { identity_store.begin(); #endif -#if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM) +#if defined(STM32_PLATFORM) _ContactsChannelsTotalBlocks = _getContactsChannelsFS()->_getFS()->cfg->block_count; checkAdvBlobFile(); - #if defined(EXTRAFS) || defined(QSPIFLASH) - migrateToSecondaryFS(); - #endif #else // init 'blob store' support _fs->mkdir("/bl"); @@ -68,17 +48,11 @@ void DataStore::begin() { #include #elif defined(RP2040_PLATFORM) #include -#elif defined(NRF52_PLATFORM) || defined(STM32_PLATFORM) - #if defined(QSPIFLASH) - #include - #elif defined(EXTRAFS) - #include - #else +#elif defined(STM32_PLATFORM) #include - #endif #endif -#if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM) +#if defined(STM32_PLATFORM) int _countLfsBlock(void *p, lfs_block_t block){ if (block > _ContactsChannelsTotalBlocks) { MESH_DEBUG_PRINTLN("ERROR: Block %d exceeds filesystem bounds - CORRUPTION DETECTED!", block); @@ -108,7 +82,7 @@ uint32_t DataStore::getStorageUsedKb() const { info.usedBytes = 0; _fs->info(info); return info.usedBytes / 1024; -#elif defined(NRF52_PLATFORM) || defined(STM32_PLATFORM) +#elif defined(STM32_PLATFORM) const lfs_config* config = _getContactsChannelsFS()->_getFS()->cfg; int usedBlockCount = _getLfsUsedBlockCount(_getContactsChannelsFS()); int usedBytes = config->block_size * usedBlockCount; @@ -126,7 +100,7 @@ uint32_t DataStore::getStorageTotalKb() const { info.totalBytes = 0; _fs->info(info); return info.totalBytes / 1024; -#elif defined(NRF52_PLATFORM) || defined(STM32_PLATFORM) +#elif defined(STM32_PLATFORM) const lfs_config* config = _getContactsChannelsFS()->_getFS()->cfg; int totalBytes = config->block_size * config->block_count; return totalBytes / 1024; @@ -136,7 +110,7 @@ uint32_t DataStore::getStorageTotalKb() const { } File DataStore::openRead(const char* filename) { -#if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM) +#if defined(STM32_PLATFORM) return _fs->open(filename, FILE_O_READ); #elif defined(RP2040_PLATFORM) return _fs->open(filename, "r"); @@ -146,7 +120,7 @@ File DataStore::openRead(const char* filename) { } File DataStore::openRead(FILESYSTEM* fs, const char* filename) { -#if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM) +#if defined(STM32_PLATFORM) return fs->open(filename, FILE_O_READ); #elif defined(RP2040_PLATFORM) return fs->open(filename, "r"); @@ -164,7 +138,7 @@ bool DataStore::removeFile(FILESYSTEM* fs, const char* filename) { } bool DataStore::formatFileSystem() { -#if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM) +#if defined(STM32_PLATFORM) if (_fsExtra == nullptr) { return _fs->format(); } else { @@ -271,9 +245,7 @@ void DataStore::loadPrefsInt(const char *filename, NodePrefs& _prefs, double& no if (file.read((uint8_t *)&_prefs.dark_mode, sizeof(_prefs.dark_mode)) != sizeof(_prefs.dark_mode)) { _prefs.dark_mode = 0; // default: light mode } - if (file.read((uint8_t *)&_prefs.portrait_mode, sizeof(_prefs.portrait_mode)) != sizeof(_prefs.portrait_mode)) { - _prefs.portrait_mode = 0; // default: landscape - } + file.read(pad, 1); // 99: unused (reserved) if (file.read((uint8_t *)&_prefs.auto_lock_minutes, sizeof(_prefs.auto_lock_minutes)) != sizeof(_prefs.auto_lock_minutes)) { _prefs.auto_lock_minutes = 0; // default: disabled } @@ -316,7 +288,6 @@ void DataStore::loadPrefsInt(const char *filename, NodePrefs& _prefs, double& no // Clamp to valid ranges if (_prefs.dark_mode > 1) _prefs.dark_mode = 0; - if (_prefs.portrait_mode > 1) _prefs.portrait_mode = 0; if (_prefs.hint_shown > 1) _prefs.hint_shown = 0; if (_prefs.large_font > 1) _prefs.large_font = 0; if (_prefs.ui_font_style > 2) _prefs.ui_font_style = 0; @@ -383,7 +354,7 @@ void DataStore::savePrefs(const NodePrefs& _prefs, double node_lat, double node_ file.write((uint8_t *)&_prefs.gps_baudrate, sizeof(_prefs.gps_baudrate)); // 93 file.write((uint8_t *)&_prefs.interference_threshold, sizeof(_prefs.interference_threshold)); // 97 file.write((uint8_t *)&_prefs.dark_mode, sizeof(_prefs.dark_mode)); // 98 - file.write((uint8_t *)&_prefs.portrait_mode, sizeof(_prefs.portrait_mode)); // 99 + file.write(pad, 1); // 99: unused (reserved) file.write((uint8_t *)&_prefs.auto_lock_minutes, sizeof(_prefs.auto_lock_minutes)); // 100 file.write((uint8_t *)&_prefs.hint_shown, sizeof(_prefs.hint_shown)); // 101 file.write((uint8_t *)&_prefs.large_font, sizeof(_prefs.large_font)); // 102 @@ -484,8 +455,8 @@ void DataStore::loadContacts(DataStoreHost* host) { void DataStore::saveContacts(DataStoreHost* host) { FILESYSTEM* fs = _getContactsChannelsFS(); -#if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM) - // nRF52/STM32: direct write (no tmp+rename — InternalFS doesn't need atomic pattern) +#if defined(STM32_PLATFORM) + // STM32: direct write (no tmp+rename -- InternalFS doesn't need atomic pattern) File file = openWrite(fs, "/contacts3"); if (file) { uint32_t idx = 0; @@ -582,9 +553,9 @@ void DataStore::saveContacts(DataStoreHost* host) { // ========================================================================= // Chunked contact save — non-blocking across multiple loop iterations -// Only for ESP32 with SD card — nRF52 uses blocking saveContacts() above +// Only for ESP32 with SD card -- STM32 uses blocking saveContacts() above // ========================================================================= -#if !defined(NRF52_PLATFORM) && !defined(STM32_PLATFORM) +#if !defined(STM32_PLATFORM) bool DataStore::beginSaveContacts(DataStoreHost* host) { if (_saveInProgress) return false; // Already saving @@ -676,7 +647,7 @@ void DataStore::finishSaveContacts() { Serial.println("DataStore: rename failed, tmp file preserved"); } } -#endif // !NRF52_PLATFORM && !STM32_PLATFORM +#endif // !STM32_PLATFORM void DataStore::loadChannels(DataStoreHost* host) { FILESYSTEM* fs = _getContactsChannelsFS(); @@ -809,7 +780,7 @@ void DataStore::saveChannels(DataStoreHost* host) { } } -#if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM) +#if defined(STM32_PLATFORM) #define MAX_ADVERT_PKT_LEN (2 + 32 + PUB_KEY_SIZE + 4 + SIGNATURE_SIZE + MAX_ADVERT_DATA_SIZE) diff --git a/examples/companion_radio/DataStore.h b/examples/companion_radio/DataStore.h index b5da9f16..b159ffdf 100644 --- a/examples/companion_radio/DataStore.h +++ b/examples/companion_radio/DataStore.h @@ -20,11 +20,11 @@ class DataStore { IdentityStore identity_store; void loadPrefsInt(const char *filename, NodePrefs& prefs, double& node_lat, double& node_lon); -#if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM) +#if defined(STM32_PLATFORM) void checkAdvBlobFile(); #endif -#if !defined(NRF52_PLATFORM) && !defined(STM32_PLATFORM) +#if !defined(STM32_PLATFORM) // Chunked save state (ESP32 with SD card only) File _saveFile; DataStoreHost* _saveHost = nullptr; @@ -47,7 +47,7 @@ public: void savePrefs(const NodePrefs& prefs, double node_lat, double node_lon); void loadContacts(DataStoreHost* host); void saveContacts(DataStoreHost* host); -#if !defined(NRF52_PLATFORM) && !defined(STM32_PLATFORM) +#if !defined(STM32_PLATFORM) // Chunked save — splits contact write across multiple loop iterations bool beginSaveContacts(DataStoreHost* host); bool saveContactsChunk(int batchSize = 20); diff --git a/examples/companion_radio/MyMesh.cpp b/examples/companion_radio/MyMesh.cpp index 79108839..4bdea6f8 100644 --- a/examples/companion_radio/MyMesh.cpp +++ b/examples/companion_radio/MyMesh.cpp @@ -4,10 +4,6 @@ #include #include "RadioPresets.h" // Shared radio presets (serial CLI + settings screen) -#if defined(LilyGo_T5S3_EPaper_Pro) - #include "target.h" // for board.setBacklight() CLI command -#endif - #ifdef HAS_4G_MODEM #include "ModemManager.h" // Serial CLI modem commands #endif @@ -1787,7 +1783,6 @@ void MyMesh::begin(bool has_display) { if (_prefs.path_hash_mode > 2) _prefs.path_hash_mode = 0; if (_prefs.autoadd_max_hops > 64) _prefs.autoadd_max_hops = 0; if (_prefs.dark_mode > 1) _prefs.dark_mode = 0; - if (_prefs.portrait_mode > 1) _prefs.portrait_mode = 0; if (_prefs.hint_shown > 1) _prefs.hint_shown = 0; #ifdef BLE_PIN_CODE // 123456 by default @@ -1839,7 +1834,7 @@ void MyMesh::startInterface(BaseSerialInterface &serial) { // deferred-init SerialBLEInterface the controller stays down until the first // enable(), which now happens only when the user turns Bluetooth on from the // Bluetooth page. Reclaims the controller idle current in the standalone-first - // default. nRF52 BLE (separate class, no deferred init) and USB-serial / WiFi + // default. USB-serial / WiFi // are unaffected and still enable at boot below. #else serial.enable(); @@ -3649,29 +3644,8 @@ void MyMesh::checkCLIRescueCmd() { Serial.println(" Usage: set channel.scope "); } - // Backlight control (T5S3 E-Paper Pro only) } else if (memcmp(config, "backlight ", 10) == 0) { -#if defined(LilyGo_T5S3_EPaper_Pro) - const char* val = &config[10]; - if (strcmp(val, "on") == 0) { - board.setBacklight(true); - Serial.println(" > backlight ON"); - } else if (strcmp(val, "off") == 0) { - board.setBacklight(false); - Serial.println(" > backlight OFF"); - } else { - int brightness = atoi(val); - if (brightness >= 0 && brightness <= 255) { - board.setBacklightBrightness((uint8_t)brightness); - board.setBacklight(brightness > 0); - Serial.printf(" > backlight brightness = %d\n", brightness); - } else { - Serial.println(" Error: use 'on', 'off', or 0-255"); - } - } -#else Serial.println(" Error: backlight not available on this device"); -#endif // --- Contact auto-add settings --- } else if (memcmp(config, "contact.mode ", 13) == 0) { @@ -3841,11 +3815,6 @@ void MyMesh::checkCLIRescueCmd() { Serial.println(" erase Format filesystem"); Serial.println(" reboot Restart device"); Serial.println(" ls / cat / rm File operations"); -#if defined(LilyGo_T5S3_EPaper_Pro) - Serial.println(""); - Serial.println(" Display:"); - Serial.println(" set backlight on/off/0-255 Control front-light"); -#endif // ===================================================================== // Existing system commands (unchanged) @@ -4141,8 +4110,8 @@ void MyMesh::loop() { // is there are pending dirty contacts write needed? bool userActive = _lastUserInput && (millis() - _lastUserInput) < USER_IDLE_SAVE_THRESHOLD; if (dirty_contacts_expiry && millisHasNowPassed(dirty_contacts_expiry)) { -#if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM) - // nRF52/STM32: blocking save (fast on internal flash, no chunking needed) +#if defined(STM32_PLATFORM) + // STM32: blocking save (fast on internal flash, no chunking needed) if (!_deferSaves && !userActive) { _store->saveContacts(this); dirty_contacts_expiry = 0; @@ -4167,7 +4136,7 @@ void MyMesh::loop() { #endif } -#if !defined(NRF52_PLATFORM) && !defined(STM32_PLATFORM) +#if !defined(STM32_PLATFORM) // Drive chunked contact save -- write a batch each loop iteration // Paused while user is actively pressing keys or voice session is receiving if (_store->isSaveInProgress() && !_deferSaves && !userActive) { diff --git a/examples/companion_radio/MyMesh.h b/examples/companion_radio/MyMesh.h index f65b43ee..9e717dca 100644 --- a/examples/companion_radio/MyMesh.h +++ b/examples/companion_radio/MyMesh.h @@ -15,7 +15,7 @@ #define FIRMWARE_VERSION "Meck v1.14" #endif -#if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM) +#if defined(STM32_PLATFORM) #include #elif defined(RP2040_PLATFORM) #include diff --git a/examples/companion_radio/NodePrefs.h b/examples/companion_radio/NodePrefs.h index 90984b9e..bbd92808 100644 --- a/examples/companion_radio/NodePrefs.h +++ b/examples/companion_radio/NodePrefs.h @@ -46,7 +46,6 @@ struct NodePrefs { // persisted to file uint32_t gps_baudrate; // GPS baud rate (0 = use compile-time GPS_BAUDRATE default) uint8_t interference_threshold; // Interference threshold in dB (0=disabled, 14+=enabled) uint8_t dark_mode; // 0=off (white bg), 1=on (black bg) - uint8_t portrait_mode; // 0=landscape, 1=portrait — T5S3 only uint8_t auto_lock_minutes; // 0=disabled, 2/5/10/15/30=auto-lock after idle uint8_t hint_shown; // 0=show nav hint on boot, 1=already shown (dismiss permanently) uint8_t large_font; // 0=tiny (built-in 6x8), 1=larger (FreeSans9pt) — T-Deck Pro only @@ -94,8 +93,6 @@ struct NodePrefs { // persisted to file // --- Font helpers (inline, no overhead) --- // Returns the DisplayDriver text-size index for "small/body" text. // T-Deck Pro: 0 = built-in 6×8 (or 7pt with custom fonts), 1 = 9pt. - // T5S3: both 0 and 1 are 12pt fonts (regular vs bold) with identical line - // height, so large_font has no layout effect there. inline uint8_t smallTextSize() const { return large_font ? 1 : 0; } @@ -104,13 +101,8 @@ struct NodePrefs { // persisted to file // T-Deck Pro size 0 → 9 (6×8 + 1px gap), size 1 → 11 (9pt ascent+descent). // With custom fonts (Noto 7pt, Montserrat 7pt), size 0 is slightly taller // than built-in 6×8 but fits within the 9-unit virtual grid. - // T5S3 size 0/1 → same 12pt height → always 9 in virtual coords. inline int smallLineH() const { -#if defined(LilyGo_T5S3_EPaper_Pro) - return 9; -#else return large_font ? 11 : 9; -#endif } // Returns the Y offset for selection highlight fillRect (T-Deck Pro only). @@ -119,16 +111,11 @@ struct NodePrefs { // persisted to file // Size 0 (custom 7pt fonts): baseline fonts, same behaviour as size 1. // Size 1 (9pt): cursor positions at baseline, ascenders render // upward → fillRect must start above baseline to cover ascenders. - // T5S3: always 0 (both sizes use baseline fonts with highlight at y). inline int smallHighlightOff() const { -#if defined(LilyGo_T5S3_EPaper_Pro) - return 0; -#else // Custom 7pt fonts at textSize 0 use GFXfont (baseline rendering), not built-in. // Offset 0: highlight starts at row top, covers 7pt ascenders without // bleeding into the row above (-2 was calibrated for taller 9pt ascenders). if (ui_font_style > 0 && !large_font) return 0; return large_font ? -2 : 5; -#endif } }; \ No newline at end of file diff --git a/examples/companion_radio/main.cpp b/examples/companion_radio/main.cpp index 1f9589e9..0110ee50 100644 --- a/examples/companion_radio/main.cpp +++ b/examples/companion_radio/main.cpp @@ -188,7 +188,7 @@ if (SPIFFS.exists("/new_prefs")) { copyFile(SPIFFS, "/new_prefs", SD, "/meshcore/prefs.bin"); } - // Channels may live on SPIFFS or ExtraFS - on ESP32 they are on SPIFFS + // Channels are on SPIFFS on ESP32 if (SPIFFS.exists("/channels2")) { copyFile(SPIFFS, "/channels2", SD, "/meshcore/channels.bin"); } @@ -715,174 +715,17 @@ #endif // ============================================================================= -// Touch Input — unified across T5S3 (GT911) and T-Deck Pro (CST328) +// Touch Input -- T-Deck Pro (CST328) // ============================================================================= // Define MECK_TOUCH_ENABLED for any platform with touch support -#if defined(LilyGo_T5S3_EPaper_Pro) || (defined(LilyGo_TDeck_Pro) && defined(HAS_TOUCHSCREEN)) +#if defined(LilyGo_TDeck_Pro) && defined(HAS_TOUCHSCREEN) #define MECK_TOUCH_ENABLED 1 #endif // --- T-Watch S3 Plus: screen headers for the touch UI --- // The watch needs the same concrete screen types as the gesture machine casts -// to, but none of the T5S3/T-Deck hardware baggage (GT911, SD, TCA8418 keyboard). - -// --- T5S3: GT911 capacitive touch driver --- -#if defined(LilyGo_T5S3_EPaper_Pro) - #include "TouchDrvGT911.hpp" - #include - #include "TextReaderScreen.h" - #include "NotesScreen.h" - #include "ContactsScreen.h" - #include "ChannelScreen.h" - #include "ChannelPickerScreen.h" - #include "MeckExport.h" - #include "MeckImport.h" - #include "SettingsScreen.h" - #include "RepeaterAdminScreen.h" - #include "DiscoveryScreen.h" - #include "LastHeardScreen.h" - #include "PathEditorScreen.h" - #include "Tracescreen.h" - #include "GamesMenuScreen.h" - #include "SnakeScreen.h" - #include "MinesweeperScreen.h" -#if defined(LilyGo_TDeck_Pro) - #include "GBCEmulatorScreen.h" -#endif - - static TouchDrvGT911 gt911Touch; - static bool gt911Ready = false; - static bool sdCardReady = false; // T5S3 SD card state - - // --------------------------------------------------------------------------- - // SD Settings Backup / Restore (T5S3) - // --------------------------------------------------------------------------- - static bool copyFile(fs::FS& srcFS, const char* srcPath, - fs::FS& dstFS, const char* dstPath) { - File src = srcFS.open(srcPath, "r"); - if (!src) return false; - File dst = dstFS.open(dstPath, "w", true); - if (!dst) { src.close(); return false; } - - uint8_t buf[128]; - while (src.available()) { - int n = src.read(buf, sizeof(buf)); - if (n > 0) dst.write(buf, n); - } - src.close(); - dst.close(); - return true; - } - - void backupSettingsToSD() { - if (!sdCardReady) return; - - if (!SD.exists("/meshcore")) SD.mkdir("/meshcore"); - - if (SPIFFS.exists("/new_prefs")) { - copyFile(SPIFFS, "/new_prefs", SD, "/meshcore/prefs.bin"); - } - if (SPIFFS.exists("/channels2")) { - copyFile(SPIFFS, "/channels2", SD, "/meshcore/channels.bin"); - } - if (SPIFFS.exists("/identity/_main.id")) { - if (!SD.exists("/meshcore/identity")) SD.mkdir("/meshcore/identity"); - copyFile(SPIFFS, "/identity/_main.id", SD, "/meshcore/identity/_main.id"); - } - if (SPIFFS.exists("/contacts3")) { - copyFile(SPIFFS, "/contacts3", SD, "/meshcore/contacts.bin"); - } - - digitalWrite(SDCARD_CS, HIGH); - Serial.println("Settings backed up to SD"); - } - - bool restoreSettingsFromSD() { - if (!sdCardReady) return false; - - bool restored = false; - - if (!SPIFFS.exists("/new_prefs") && SD.exists("/meshcore/prefs.bin")) { - if (copyFile(SD, "/meshcore/prefs.bin", SPIFFS, "/new_prefs")) { - Serial.println("Restored prefs from SD"); - restored = true; - } - } - if (!SPIFFS.exists("/channels2") && SD.exists("/meshcore/channels.bin")) { - if (copyFile(SD, "/meshcore/channels.bin", SPIFFS, "/channels2")) { - Serial.println("Restored channels from SD"); - restored = true; - } - } - if (!SPIFFS.exists("/identity/_main.id") && SD.exists("/meshcore/identity/_main.id")) { - SPIFFS.mkdir("/identity"); - if (copyFile(SD, "/meshcore/identity/_main.id", SPIFFS, "/identity/_main.id")) { - Serial.println("Restored identity from SD"); - restored = true; - } - } - if (!SPIFFS.exists("/contacts3") && SD.exists("/meshcore/contacts.bin")) { - if (copyFile(SD, "/meshcore/contacts.bin", SPIFFS, "/contacts3")) { - Serial.println("Restored contacts from SD"); - restored = true; - } - } - - if (restored) { - Serial.println("=== Settings restored from SD card backup ==="); - } - digitalWrite(SDCARD_CS, HIGH); - return restored; - } - -#ifdef MECK_CARDKB - #include "CardKBKeyboard.h" - static CardKBKeyboard cardkb; - static unsigned long lastCardKBProbe = 0; - #define CARDKB_PROBE_INTERVAL_MS 5000 // Re-probe for hot-plug every 5s -#endif - - // Read GT911 in landscape orientation (960×540) - static bool readTouchLandscape(int16_t* outX, int16_t* outY) { - if (!gt911Ready) return false; - int16_t raw_x, raw_y; - if (gt911Touch.getPoint(&raw_x, &raw_y)) { - *outX = raw_y; - *outY = EPD_HEIGHT - 1 - raw_x; - return true; - } - return false; - } - - // Read GT911 in portrait orientation (540×960, canvas rotation 3) - static bool readTouchPortrait(int16_t* outX, int16_t* outY) { - if (!gt911Ready) return false; - int16_t raw_x, raw_y; - if (gt911Touch.getPoint(&raw_x, &raw_y)) { - *outX = raw_x; - *outY = raw_y; - return true; - } - return false; - } - - // Read up to 2 touch points — returns actual finger count (0, 1 or 2) - static int readTouchMulti(int16_t* outX0, int16_t* outY0, int16_t* outX1, int16_t* outY1) { - if (!gt911Ready) return 0; - int16_t xs[2], ys[2]; - uint8_t count = gt911Touch.getPoint(xs, ys, 2); - if (count == 0) return 0; - if (display.isPortraitMode()) { - *outX0 = xs[0]; *outY0 = ys[0]; - if (count >= 2) { *outX1 = xs[1]; *outY1 = ys[1]; } - } else { - *outX0 = ys[0]; *outY0 = EPD_HEIGHT - 1 - xs[0]; - if (count >= 2) { *outX1 = ys[1]; *outY1 = EPD_HEIGHT - 1 - xs[1]; } - } - return (int)count; - } -#endif +// to, but none of the T-Deck hardware baggage (SD, TCA8418 keyboard). // --- Shared touch state machine variables --- #ifdef MECK_TOUCH_ENABLED @@ -894,11 +737,7 @@ static int16_t touchLastY = 0; static unsigned long lastTouchSeenMs = 0; #define TOUCH_LONG_PRESS_MS 750 - #if defined(LilyGo_T5S3_EPaper_Pro) - #define TOUCH_SWIPE_THRESHOLD 60 // T5S3: 960×540 — 60px ≈ 6% of width - #else #define TOUCH_SWIPE_THRESHOLD 30 // T-Deck Pro: 240×320 — 30px ≈ 12.5% of width - #endif #define TOUCH_LIFT_DEBOUNCE_MS 150 #define TOUCH_MIN_INTERVAL_MS 300 static bool longPressHandled = false; @@ -906,21 +745,9 @@ static bool touchCooldown = false; static unsigned long lastTouchEventMs = 0; -#if defined(LilyGo_T5S3_EPaper_Pro) - // Two-finger tap detection state - static bool twoFingerDown = false; - static unsigned long twoFingerDownTime = 0; - #define TWO_FINGER_TAP_MS 350 // max ms from first finger down to both up -#endif - // Unified touch reader — returns physical screen coordinates static bool readTouch(int16_t* outX, int16_t* outY) { - #if defined(LilyGo_T5S3_EPaper_Pro) - if (display.isPortraitMode()) { - return readTouchPortrait(outX, outY); - } - return readTouchLandscape(outX, outY); - #elif defined(LilyGo_TDeck_Pro_Max) || defined(MECK_PRO_HYN_TOUCH) + #if defined(LilyGo_TDeck_Pro_Max) || defined(MECK_PRO_HYN_TOUCH) { int16_t hx[1], hy[1]; if (hyn_touch_get_point(hx, hy, 1) > 0) { @@ -939,10 +766,7 @@ // Convert physical touch coords to virtual 128×128 coordinate space static void touchToVirtual(int16_t px, int16_t py, int& vx, int& vy) { - #if defined(LilyGo_T5S3_EPaper_Pro) - float sx = display.isPortraitMode() ? ((float)EPD_HEIGHT / 128.0f) : ((float)EPD_WIDTH / 128.0f); - float sy = display.isPortraitMode() ? ((float)EPD_WIDTH / 128.0f) : ((float)EPD_HEIGHT / 128.0f); - #elif defined(LilyGo_TDeck_Pro) + #if defined(LilyGo_TDeck_Pro) float sx = (float)EINK_WIDTH / 128.0f; // 240/128 = 1.875 float sy = (float)EINK_HEIGHT / 128.0f; // 320/128 = 2.5 #endif @@ -958,48 +782,6 @@ } #endif -// --- T-Echo Lite: CardKB keyboard, GxEPD2 e-ink, no touch --- -#if defined(LILYGO_TECHO_LITE) || defined(LILYGO_TECHO_CARD) - #include "ContactsScreen.h" - #include "ChannelScreen.h" - #include "ChannelPickerScreen.h" - #include "SettingsScreen.h" - #include "RepeaterAdminScreen.h" - #include "DiscoveryScreen.h" - #include "LastHeardScreen.h" - #include "PathEditorScreen.h" - - #ifdef LILYGO_TECHO_CARD - #include "TechoCardHomeScreen.h" - static TechoCardHomeScreen* _techoHome = nullptr; - static int _techoC2Debug = 0; - #endif - - #ifdef MECK_CARDKB - #include "CardKBKeyboard.h" - static CardKBKeyboard cardkb; - static unsigned long lastCardKBProbe = 0; - #define CARDKB_PROBE_INTERVAL_MS 5000 - #endif -#endif - -// CardKB compose mode state — standalone so ANY variant with MECK_CARDKB gets these -#ifdef MECK_CARDKB - static bool ckbComposeMode = false; - static char ckbComposeBuf[138]; // 137 bytes max + null - static int ckbComposePos = 0; - static uint8_t ckbComposeChIdx = 0; - static bool ckbComposeDM = false; - static int ckbComposeDMIdx = -1; - static char ckbComposeDMName[32]; - static unsigned long ckbLastKeystroke = 0; - static bool ckbComposeRefresh = false; - #define CKB_COMPOSE_DEBOUNCE 600 - - void drawCardKBCompose(); - void sendCardKBMessage(); -#endif - // Board-agnostic: CPU frequency scaling and AGC reset CPUPowerManager cpuPower; #define AGC_RESET_INTERVAL_MS 500 @@ -1015,20 +797,9 @@ static uint32_t _atoi(const char* sp) { return n; } -#if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM) +#if defined(STM32_PLATFORM) #include - #if defined(QSPIFLASH) - #include - DataStore store(InternalFS, QSPIFlash, rtc_clock); - #else - #if defined(EXTRAFS) - #include - CustomLFS ExtraFS(0xD4000, 0x19000, 128); - DataStore store(InternalFS, ExtraFS, rtc_clock); - #else DataStore store(InternalFS, rtc_clock); - #endif - #endif #elif defined(RP2040_PLATFORM) #include DataStore store(LittleFS, rtc_clock); @@ -1080,14 +851,6 @@ static uint32_t _atoi(const char* sp) { #include ArduinoSerialInterface serial_interface; #endif -#elif defined(NRF52_PLATFORM) - #ifdef BLE_PIN_CODE - #include - SerialBLEInterface serial_interface; - #else - #include - ArduinoSerialInterface serial_interface; - #endif #elif defined(STM32_PLATFORM) #include ArduinoSerialInterface serial_interface; @@ -1098,7 +861,7 @@ static uint32_t _atoi(const char* sp) { /* GLOBAL OBJECTS */ #ifdef DISPLAY_CLASS #include "UITask.h" - #if HAS_GPS && !defined(LILYGO_TECHO_CARD) + #if HAS_GPS #include "MapScreen.h" // After BLE -- PNGdec headers conflict with BLE if included earlier #endif UITask ui_task(&board, &serial_interface); @@ -1252,10 +1015,10 @@ static void lastHeardToggleContact() { #if HAS_GPS // Open the map screen with everything it needs: the SD flag, the GPS position // and the contact markers, then navigate. This is the setup the G key handler -// has always done. The touch tile and CardKB routes used to call +// has always done. The touch tile route used to call // ui_task.gotoMapScreen() bare, so a map opened from the tile before any G // press that boot showed "SD card not found" (MapScreen::_sdReady starts -// false and only setSDReady() sets it). All three routes now come here. +// false and only setSDReady() sets it). Both routes now come here. static void openMapScreen() { Serial.println("Opening map"); cpuPower.setBoost(); // Map render is CPU-intensive (PNG decode + SD reads) @@ -1505,15 +1268,6 @@ static void openMapScreen() { if (ui_task.isOnTextReader()) { TextReaderScreen* reader = (TextReaderScreen*)ui_task.getTextReaderScreen(); if (reader && reader->isReading()) { -#if defined(LilyGo_T5S3_EPaper_Pro) - // Footer zone tap → go to page via VKB - if (vy >= 113) { - char label[24]; - snprintf(label, sizeof(label), "Page (1-%d)", reader->getTotalPages()); - ui_task.showVirtualKeyboard(VKB_TEXT_PAGE, label, "", 5); - return 0; - } -#endif return 'd'; // Tap anywhere else = next page } // File list: tap-to-select, double-tap to open @@ -1539,9 +1293,6 @@ static void openMapScreen() { return 0; } if (notes->isEditing()) { -#if defined(LilyGo_T5S3_EPaper_Pro) - ui_task.showVirtualKeyboard(VKB_NOTES, "Edit Note", "", 137); -#endif return 0; // T-Deck Pro: keyboard handles typing directly } // READING, RENAMING, CONFIRM_DELETE: tap = confirm/enter @@ -1555,39 +1306,14 @@ static void openMapScreen() { WebReaderScreen* wr = (WebReaderScreen*)ui_task.getWebReaderScreen(); if (wr) { if (wr->isReading()) { -#if defined(LilyGo_T5S3_EPaper_Pro) - // Footer zone tap → open link VKB (if links exist) - if (vy >= 113 && wr->getLinkCount() > 0) { - ui_task.showVirtualKeyboard(VKB_WEB_LINK, "Link #", "", 3); - return 0; - } -#endif return 'd'; // Tap reading area → next page } if (wr->isHome()) { -#if defined(LilyGo_T5S3_EPaper_Pro) - int sel = wr->getHomeSelected(); - if (sel == 1) { - ui_task.showVirtualKeyboard(VKB_WEB_URL, "Enter URL", - wr->getUrlText(), WEB_MAX_URL_LEN - 1); - return 0; - } - if (sel == 2) { - ui_task.showVirtualKeyboard(VKB_WEB_SEARCH, "Search DuckDuckGo", "", 127); - return 0; - } -#endif return KEY_ENTER; // Select current item (keyboard handles text on T-Deck Pro) } if (wr->isWifiSetup()) { -#if defined(LilyGo_T5S3_EPaper_Pro) - if (wr->isPasswordEntry()) { - ui_task.showVirtualKeyboard(VKB_WEB_WIFI_PASS, "WiFi Password", "", 63); - return 0; - } -#endif return KEY_ENTER; // SSID list: select, failed: retry } } @@ -1608,7 +1334,7 @@ static void openMapScreen() { return 0; // Tap on message area — consumed, no action } - // Channel picker screen: tap to select (T5S3: direct open, T-Deck Pro: highlight/activate) + // Channel picker screen: tap to select (T-Deck Pro: highlight/activate) if (ui_task.isOnChannelPickerScreen()) { ChannelPickerScreen* pick = (ChannelPickerScreen*)ui_task.getChannelPickerScreen(); if (pick) { @@ -1892,44 +1618,14 @@ static void openMapScreen() { return '\r'; } // Conversation mode: long press = compose reply -#if defined(LilyGo_T5S3_EPaper_Pro) - const char* dmName = chScr->getDMFilterName(); - if (dmName && dmName[0]) { - uint32_t numC = the_mesh.getNumContacts(); - ContactInfo ci; - for (uint32_t j = 0; j < numC; j++) { - if (the_mesh.getContactByIdx(j, ci) && strcmp(ci.name, dmName) == 0) { - char label[40]; - snprintf(label, sizeof(label), "DM: %s", dmName); - ui_task.showVirtualKeyboard(VKB_DM, label, "", 137, j); - ui_task.clearDMUnread(j); - return 0; - } - } - } - ui_task.showAlert("Contact not found", 1000); - return 0; -#else return KEY_ENTER; -#endif } -#if defined(LilyGo_T5S3_EPaper_Pro) - ChannelDetails ch; - if (the_mesh.getChannel(chIdx, ch)) { - char label[40]; - snprintf(label, sizeof(label), "To: %s", ch.name); - ui_task.showVirtualKeyboard(VKB_CHANNEL_MSG, label, "", 137, chIdx); - } - return 0; -#else return KEY_ENTER; // T-Deck Pro: keyboard handles compose mode -#endif } // Contacts screen: long press // T-Deck Pro: toggle select mode (DM/admin handled by keyboard Enter) - // T5S3: DM for chat contacts, admin for repeaters/rooms (no physical keyboard) - // If in select mode, long press exits it on both platforms. + // If in select mode, long press exits it. if (ui_task.isOnContactsScreen()) { ContactsScreen* cs = (ContactsScreen*)ui_task.getContactsScreen(); if (cs) { @@ -1940,47 +1636,11 @@ static void openMapScreen() { Serial.println("Contacts: exited select mode (touch long press)"); return 0; } -#if defined(LilyGo_T5S3_EPaper_Pro) - // T5S3: long press = DM/admin/room action (primary interaction path) - { - int idx = cs->getSelectedContactIdx(); - uint8_t ctype = cs->getSelectedContactType(); - if (idx >= 0 && ctype == ADV_TYPE_CHAT) { - if (ui_task.hasDMUnread(idx)) { - char cname[32]; - cs->getSelectedContactName(cname, sizeof(cname)); - ui_task.clearDMUnread(idx); - ui_task.gotoDMConversation(cname); - return 0; - } - char dname[32]; - cs->getSelectedContactName(dname, sizeof(dname)); - char label[40]; - snprintf(label, sizeof(label), "DM: %s", dname); - ui_task.showVirtualKeyboard(VKB_DM, label, "", 137, idx); - return 0; - } else if (idx >= 0 && ctype == ADV_TYPE_REPEATER) { - ui_task.gotoRepeaterAdmin(idx); - return 0; - } else if (idx >= 0 && ctype == ADV_TYPE_ROOM) { - ui_task.gotoRepeaterAdmin(idx); - return 0; - } else if (idx >= 0 && ui_task.hasDMUnread(idx)) { - char cname[32]; - cs->getSelectedContactName(cname, sizeof(cname)); - ui_task.clearDMUnread(idx); - ui_task.gotoDMConversation(cname); - return 0; - } - } - return 0; -#else // T-Deck Pro: long press enters select mode cs->enterSelectMode(); ui_task.forceRefresh(); Serial.println("Contacts: entered select mode (touch long press)"); return 0; -#endif } return KEY_ENTER; } @@ -1995,18 +1655,8 @@ static void openMapScreen() { return KEY_ENTER; } - // Trace screen: long press = Enter on most rows; on T5S3 the Type Path row - // opens the virtual keyboard instead so users can enter a comma-separated - // hash list without a physical keyboard. + // Trace screen: long press = Enter. if (ui_task.isOnTraceScreen()) { -#if defined(LilyGo_T5S3_EPaper_Pro) - TraceScreen* ts = (TraceScreen*)ui_task.getTraceScreen(); - if (ts && ts->isOnTypePathRow()) { - const char* current = ts->getCurrentPathAsText(); - ui_task.showVirtualKeyboard(VKB_TRACE_PATH, "Type Path", current, 79); - return 0; - } -#endif return KEY_ENTER; } @@ -2016,12 +1666,7 @@ static void openMapScreen() { if (admin) { RepeaterAdminScreen::AdminState astate = admin->getState(); if (astate == RepeaterAdminScreen::STATE_PASSWORD_ENTRY) { -#if defined(LilyGo_T5S3_EPaper_Pro) - ui_task.showVirtualKeyboard(VKB_ADMIN_PASSWORD, "Admin Password", "", 32); - return 0; -#else return KEY_ENTER; // T-Deck Pro: keyboard handles password entry -#endif } } } @@ -2175,20 +1820,9 @@ void setup() { fast_rng.begin(radio_get_rng_seed()); MESH_DEBUG_PRINTLN("setup() - fast_rng.begin() done"); -#if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM) - MESH_DEBUG_PRINTLN("setup() - NRF52/STM32 filesystem init"); +#if defined(STM32_PLATFORM) + MESH_DEBUG_PRINTLN("setup() - STM32 filesystem init"); InternalFS.begin(); - #if defined(QSPIFLASH) - if (!QSPIFlash.begin()) { - MESH_DEBUG_PRINTLN("CustomLFS_QSPIFlash: failed to initialize"); - } else { - MESH_DEBUG_PRINTLN("CustomLFS_QSPIFlash: initialized successfully"); - } - #else - #if defined(EXTRAFS) - ExtraFS.begin(); - #endif - #endif MESH_DEBUG_PRINTLN("setup() - about to call store.begin()"); store.begin(); MESH_DEBUG_PRINTLN("setup() - store.begin() done"); @@ -2342,42 +1976,6 @@ void setup() { MESH_DEBUG_PRINTLN("setup() - SD card not available after 3 attempts"); } } - #elif defined(LilyGo_T5S3_EPaper_Pro) && defined(HAS_SDCARD) - { - // T5S3: SD card shares LoRa SPI bus (SCK=14, MOSI=13, MISO=21) - // LoRa SPI already initialized by target.cpp. Create a local HSPI - // reference for SD init (same hardware peripheral, different CS). - static SPIClass sdSpi(HSPI); - sdSpi.begin(P_LORA_SCLK, P_LORA_MISO, P_LORA_MOSI, SDCARD_CS); - - pinMode(SDCARD_CS, OUTPUT); - digitalWrite(SDCARD_CS, HIGH); - pinMode(P_LORA_NSS, OUTPUT); - digitalWrite(P_LORA_NSS, HIGH); - delay(100); - - bool mounted = false; - for (int attempt = 0; attempt < 3 && !mounted; attempt++) { - if (attempt > 0) { - digitalWrite(SDCARD_CS, HIGH); - delay(250); - Serial.printf("setup() - SD card retry %d/3\n", attempt + 1); - } - mounted = SD.begin(SDCARD_CS, sdSpi, 4000000); - } - - if (mounted) { - sdCardReady = true; - Serial.println("setup() - SD card initialized"); - - // If SPIFFS was wiped (fresh flash), restore settings from SD backup - if (restoreSettingsFromSD()) { - Serial.println("setup() - T5S3: Settings restored from SD backup"); - } - } else { - Serial.println("setup() - SD card not available"); - } - } #endif // Copy bundled notification sounds to SD card (audio variant only). @@ -2494,7 +2092,7 @@ void setup() { // IMPORTANT: sensors.begin() calls initBasicGPS() which steals the GPS pins for Serial1. // We must end Serial1 first, then reclaim the pins for Serial2 (which feeds gpsStream). - // This is ESP32-specific — on nRF52, GPS Serial1 is initialised in radio_init(). + // This is ESP32-specific. #if HAS_GPS && defined(ESP32) Serial1.end(); // Release GPS pins from Serial1's UART + ISR Serial2.end(); // Close any existing Serial2 @@ -2512,16 +2110,6 @@ void setup() { MESH_DEBUG_PRINTLN("setup() - about to call ui_task.begin()"); ui_task.begin(disp, &sensors, the_mesh.getNodePrefs()); MESH_DEBUG_PRINTLN("setup() - ui_task.begin() done"); - - // T-Echo Card: replace the generic HomeScreen with the 72x40 OLED home screen - #ifdef LILYGO_TECHO_CARD - { - _techoHome = new TechoCardHomeScreen(&ui_task, &rtc_clock, - the_mesh.getNodePrefs()); - ui_task.setHomeScreen(_techoHome); - MESH_DEBUG_PRINTLN("setup() - TechoCardHomeScreen installed"); - } - #endif #endif // --------------------------------------------------------------------------- @@ -2554,35 +2142,10 @@ void setup() { // Touch input (CST328) is initialised earlier, right after board.begin(), // on a freshly-initialised quiet I2C bus (see setup() near board.begin()). - // Initialize GT911 touch (T5S3 E-Paper Pro) - // Wire is already initialized by T5S3Board::begin(). The 4-arg begin() re-calls - // Wire.begin() which logs "bus already initialized" — cosmetic only, not harmful. - #if defined(LilyGo_T5S3_EPaper_Pro) - gt911Touch.setPins(GT911_PIN_RST, GT911_PIN_INT); - if (gt911Touch.begin(Wire, GT911_SLAVE_ADDRESS_L, GT911_PIN_SDA, GT911_PIN_SCL)) { - gt911Ready = true; - Serial.println("setup() - GT911 touch initialized"); - } else { - Serial.println("setup() - GT911 touch FAILED"); - } - #endif - - // Initialize CardKB external keyboard (if connected via QWIIC) - #if defined(MECK_CARDKB) - if (cardkb.begin()) { - #if defined(LilyGo_T5S3_EPaper_Pro) - ui_task.setCardKBDetected(true); - #endif - Serial.println("setup() - CardKB detected at 0x5F"); - } else { - Serial.println("setup() - CardKB not detected (will re-probe)"); - } - #endif - // RTC diagnostic + boot-time serial clock sync // Works on all Meck builds — T-Deck Pro has no hardware RTC and GPS may - // not fix immediately; T5S3 has hardware RTC but it needs initial setting. - #if defined(LilyGo_T5S3_EPaper_Pro) || defined(LilyGo_TDeck_Pro) + // not fix immediately. + #if defined(LilyGo_TDeck_Pro) { uint32_t rtcTime = rtc_clock.getCurrentTime(); // Plausible range: Nov 2023 (1700000000) → May 2033 (2000000000) @@ -2710,36 +2273,6 @@ void setup() { } #endif - // T5S3 SD-dependent features - #if defined(LilyGo_T5S3_EPaper_Pro) && defined(HAS_SDCARD) - if (sdCardReady) { - // Channel message history - ChannelScreen* chanScr = (ChannelScreen*)ui_task.getChannelScreen(); - if (chanScr) { - chanScr->setSDReady(true); - if (chanScr->loadFromSD()) { - Serial.println("setup() - Message history loaded from SD"); - } - } - - // Text reader — set SD ready and pre-index books - TextReaderScreen* reader = (TextReaderScreen*)ui_task.getTextReaderScreen(); - if (reader) { - reader->setSDReady(true); - if (disp) { - cpuPower.setBoost(); - reader->bootIndex(*disp); - } - } - - // Notes screen - NotesScreen* notesScr = (NotesScreen*)ui_task.getNotesScreen(); - if (notesScr) { - notesScr->setSDReady(true); - } - Serial.println("setup() - SD features initialized"); - } - #endif // Check if node name is still the default hex prefix (first 4 bytes of pub key) // If so, launch onboarding wizard to set name and radio preset // --------------------------------------------------------------------------- @@ -2796,7 +2329,7 @@ void setup() { // BLE starts disabled for standalone-first operation // User can toggle it from the Bluetooth home page (Enter or long-press) - #if (defined(LilyGo_TDeck_Pro) || defined(LilyGo_T5S3_EPaper_Pro)) && defined(BLE_PIN_CODE) + #if defined(LilyGo_TDeck_Pro) && defined(BLE_PIN_CODE) serial_interface.disable(); MESH_DEBUG_PRINTLN("setup() - BLE disabled at boot (standalone mode)"); #endif @@ -2859,62 +2392,25 @@ void otaResumeRadio() { #endif void loop() { - // T-Echo Card: lazy Codec2 init from shallow stack context. - // codec2_create needs ~3KB stack for FFT/trig init. The loop task - // has only 4KB total. Calling from render() (deep call chain) overflows. - // Calling from here (top of loop) works because stack depth is minimal. - #ifdef LILYGO_TECHO_CARD - if (_techoHome && _techoHome->needsCodec2()) { - void* probe = malloc(25000); - Serial.printf("Voice: heap probe 25K=%s, creating codec2...\n", probe?"yes":"no"); - if (probe) free(probe); - Serial.flush(); - - struct CODEC2* c2 = codec2_create(VC_C2_MODE); - Serial.printf("Voice: codec2_create returned %p\n", c2); - Serial.flush(); - - if (c2) { - _techoHome->setCodec2Instance(c2); - void* postProbe = malloc(1000); - Serial.printf("Voice: set OK, post-probe=%s\n", postProbe?"yes":"no"); - if (postProbe) free(postProbe); - Serial.flush(); - _techoC2Debug = 99999; // Keep printing to test if yields prevent crash - } - } - #endif - #ifdef MECK_OTA_UPDATE if (!otaRadioPaused) { #endif - #ifdef LILYGO_TECHO_CARD - if (_techoC2Debug > 0) { - Serial.print("[pre-mesh]"); Serial.flush(); - } - #endif - the_mesh.loop(); - #ifdef LILYGO_TECHO_CARD - if (_techoC2Debug > 0) { - Serial.print("[post-mesh]"); Serial.flush(); - } - #endif #ifdef MECK_OTA_UPDATE } else { // OTA/File Manager active — poll the web server from the main loop for fast response. - // The render cycle on T5S3 (960×540 FastEPD) can block for 500ms+ during - // e-ink refresh, causing the browser to timeout before handleClient() runs. + // The e-ink render cycle can block during a refresh, causing the browser + // to timeout before handleClient() runs. // Polling here gives us ~1-5ms response time instead. if (ui_task.isOnSettingsScreen()) { SettingsScreen* ss = (SettingsScreen*)ui_task.getSettingsScreen(); if (ss) { ss->pollOTAServer(); // Detect upload completion and trigger verify → flash → reboot. - // Must happen here (not in render) because T5S3 e-ink refresh blocks - // for 500ms+ and the render-based check never fires reliably. + // Must happen here (not in render) because an e-ink refresh blocks + // and the render-based check never fires reliably. ss->checkOTAComplete(display); } } @@ -2963,7 +2459,7 @@ void loop() { // Map screen: periodically update own GPS position and contact markers #ifdef DISPLAY_CLASS - #if HAS_GPS && !defined(LILYGO_TECHO_CARD) + #if HAS_GPS if (ui_task.isOnMapScreen()) { static unsigned long lastMapUpdate = 0; if (millis() - lastMapUpdate > 30000) { // Every 30 seconds @@ -2998,7 +2494,7 @@ void loop() { // is active. The mesh radio has its own FIFO so packets are buffered; // 50 ms yield means the loop still runs 20×/sec which is more than enough // to drain the radio FIFO before overflow. -#if defined(LilyGo_T5S3_EPaper_Pro) || defined(LilyGo_TDeck_Pro) +#if defined(LilyGo_TDeck_Pro) { static bool wasLocked = false; bool nowLocked = ui_task.isLocked(); @@ -3676,24 +3172,8 @@ void loop() { #ifdef HAS_4G_MODEM smsMode = ui_task.isOnSMSScreen(); #endif - #elif defined(MECK_CARDKB) - if (!ckbComposeMode) { - ui_task.loop(); - } else { - // Compose mode: debounced rendering - if (ckbComposeRefresh && (millis() - ckbLastKeystroke) >= CKB_COMPOSE_DEBOUNCE) { - drawCardKBCompose(); - ckbComposeRefresh = false; - } - } #else - #ifdef LILYGO_TECHO_CARD - if (_techoC2Debug > 0) { Serial.print("[pre-ui]"); Serial.flush(); } - #endif ui_task.loop(); - #ifdef LILYGO_TECHO_CARD - if (_techoC2Debug > 0) { Serial.print("[post-ui]"); Serial.flush(); _techoC2Debug--; } - #endif #endif #endif rtc_clock.tick(); @@ -3766,22 +3246,18 @@ void loop() { #endif // --------------------------------------------------------------------------- - // Touch Input — tap/swipe/long-press state machine (T5S3 + T-Deck Pro) + // Touch Input -- tap/swipe/long-press state machine (T-Deck Pro) // Gestures: // Tap = finger down + up with minimal movement → select/open // Swipe = finger drag > threshold → scroll/page turn // Long press = finger held > 750ms without moving → edit/enter // After processing an event, cooldown waits for finger lift before next event. // Touch is disabled while lock screen is active. - // When virtual keyboard is active (T5S3), taps route to keyboard. // --------------------------------------------------------------------------- #ifdef MECK_TOUCH_ENABLED { - // Guard: skip touch when locked or VKB active + // Guard: skip touch when locked bool touchBlocked = ui_task.isLocked(); -#if defined(LilyGo_T5S3_EPaper_Pro) - touchBlocked = touchBlocked || ui_task.isVKBActive(); -#endif #ifdef HAS_4G_MODEM // SMS dialer has its own dedicated touch handler — don't consume touch data here if (smsMode) { @@ -3803,51 +3279,6 @@ void loop() { lastTouchSeenMs = now; } -#if defined(LilyGo_T5S3_EPaper_Pro) - // Two-finger tap detection — must run before single-finger state machine - // so it can suppress the single-finger path when two fingers are present. - { - int16_t x0, y0, x1, y1; - int fingers = readTouchMulti(&x0, &y0, &x1, &y1); - if (fingers >= 2) { - if (!twoFingerDown) { - twoFingerDown = true; - twoFingerDownTime = now; - } - // Suppress single-finger tracking while two fingers are down - lastTouchSeenMs = now; - touchDown = false; - longPressHandled = true; // prevent long-press triggering - swipeHandled = true; // prevent swipe triggering - } else if (twoFingerDown) { - // Both fingers lifted — check if it was a quick tap - if ((now - twoFingerDownTime) < TWO_FINGER_TAP_MS) { - if (ui_task.isOnContactsScreen()) { - ContactsScreen* cs = (ContactsScreen*)ui_task.getContactsScreen(); - if (cs) { - if (cs->isInSelectMode()) { - cs->exitSelectMode(); - Serial.println("[Touch] Two-finger tap: exited contacts select mode"); - } else { - cs->enterSelectMode(); - Serial.println("[Touch] Two-finger tap: entered contacts select mode"); - } - ui_task.forceRefresh(); - touchCooldown = true; - lastTouchEventMs = now; - } - } - } - twoFingerDown = false; - longPressHandled = false; - swipeHandled = false; - touchDown = false; - touchCooldown = true; - lastTouchEventMs = now; - } - } -#endif - bool fingerPresent = (now - lastTouchSeenMs) < TOUCH_LIFT_DEBOUNCE_MS; if (touchCooldown) { @@ -4021,443 +3452,8 @@ void loop() { } } - // Virtual keyboard touch routing (T5S3 only — T-Deck Pro uses physical keyboard) -#if defined(LilyGo_T5S3_EPaper_Pro) - { - static bool vkbNeedLift = true; - - if (ui_task.isVKBActive()) { - int16_t tx, ty; - bool gotPt = readTouch(&tx, &ty); - - if (!gotPt) { - vkbNeedLift = false; - } - - bool cooldownOk = (millis() - ui_task.vkbOpenedAt()) > 2000; - - if (gotPt && !vkbNeedLift && cooldownOk) { - int vx, vy; - touchToVirtual(tx, ty, vx, vy); - if (ui_task.getVKB().handleTap(vx, vy)) { - ui_task.forceRefresh(); - } - vkbNeedLift = true; - } - } else { - vkbNeedLift = true; - } - } -#endif #endif // MECK_TOUCH_ENABLED - // --------------------------------------------------------------------------- - // CardKB external keyboard polling (via QWIIC) - // When VKB is active: typed characters feed into the VKB text buffer. - // When VKB is not active: navigation keys route through injectKey(). - // ESC key maps to 'q' (back) when no VKB is active. - // --------------------------------------------------------------------------- -#if defined(MECK_CARDKB) - { - // Hot-plug detection: re-probe periodically - if (millis() - lastCardKBProbe >= CARDKB_PROBE_INTERVAL_MS) { - lastCardKBProbe = millis(); - bool wasDetected = cardkb.isDetected(); - bool nowDetected = cardkb.probe(); - if (nowDetected != wasDetected) { - #if defined(LilyGo_T5S3_EPaper_Pro) - ui_task.setCardKBDetected(nowDetected); - #endif - Serial.printf("[CardKB] %s\n", nowDetected ? "Connected" : "Disconnected"); - } - } - - // Poll for keypress - char ckb = cardkb.readKey(); - if (ckb != 0) { - Serial.printf("[CardKB] key=0x%02X '%c'\n", (uint8_t)ckb, (ckb >= 32 && ckb < 127) ? ckb : '?'); - - // --- CardKB compose mode: intercept ALL keys --- - if (ckbComposeMode) { - cpuPower.setBoost(); - ui_task.keepAlive(); - if (ckb == 0x1B) { - // ESC: cancel compose - ckbComposeMode = false; - ui_task.forceRefresh(); - } else if (ckb == '\r') { - // Enter: send message - if (ckbComposePos > 0) { - sendCardKBMessage(); - } else { - ckbComposeMode = false; - ui_task.forceRefresh(); - } - } else if (ckb == '\b') { - // Backspace: delete last character - if (ckbComposePos > 0) { - ckbComposeBuf[--ckbComposePos] = '\0'; - ckbComposeRefresh = true; - ckbLastKeystroke = millis(); - } - } else if (ckb >= 32 && ckb < 127) { - // Printable character - if (ckbComposePos < 137) { - ckbComposeBuf[ckbComposePos++] = ckb; - ckbComposeBuf[ckbComposePos] = '\0'; - ckbComposeRefresh = true; - ckbLastKeystroke = millis(); - } - } - // All keys consumed in compose mode — skip normal routing - } else { - // --- Normal (non-compose) key routing --- - #if defined(LilyGo_T5S3_EPaper_Pro) - if (!ui_task.isLocked()) { - #else - { - #endif - cpuPower.setBoost(); - ui_task.keepAlive(); - - #if defined(LilyGo_T5S3_EPaper_Pro) - if (ui_task.isVKBActive()) { - // VKB is open — feed character into VKB text buffer - ui_task.feedCardKBChar(ckb); - } else - #endif - if (ui_task.isOnHomeScreen()) { - // Home screen: ESC does nothing special, letter shortcuts open tiles - if (ckb == 0x1B) { - // ESC on home — no-op (already home) - } else { - switch (ckb) { - case 'm': ui_task.gotoChannelPickerScreen(); break; - case 'c': ui_task.gotoContactsScreen(); break; -#if !defined(LILYGO_TECHO_LITE) - case 'e': ui_task.gotoTextReader(); break; - case 'n': ui_task.gotoNotesScreen(); break; -#endif - case 's': - if (ui_task.isHomeOnShutdownPage()) { - ui_task.injectKey(ckb); - } else { - ui_task.gotoSettingsScreen(); - } - break; - case 'f': ui_task.gotoDiscoveryScreen(); break; - case 'h': ui_task.gotoLastHeardScreen(); break; - case 'r': ui_task.gotoTraceScreen(); break; - case 'j': ui_task.gotoGamesMenu(); break; - case (char)0xF3: ui_task.injectKey(KEY_LEFT); break; // Left arrow → prev page - case (char)0xF4: ui_task.injectKey(KEY_RIGHT); break; // Right arrow → next page -#ifdef MECK_WEB_READER - case 'b': ui_task.gotoWebReader(); break; -#endif -#if HAS_GPS - case 'g': openMapScreen(); break; -#endif - default: ui_task.injectKey(ckb); break; - } - } - } else { - // Non-home screens: context-specific routing - bool handled = false; - - // Notes editing/renaming: route ALL keys directly (no VKB). - // This gives: Enter=newline, arrows=cursor, printable=insert, ESC=save&exit -#if !defined(LILYGO_TECHO_LITE) - if (ui_task.isOnNotesScreen()) { - NotesScreen* notesScr = (NotesScreen*)ui_task.getNotesScreen(); - if (notesScr && (notesScr->isEditing() || notesScr->isRenaming())) { - handled = true; - if (ckb == 0x1B) { - // ESC: save & exit editing, or cancel rename - if (notesScr->isEditing()) { - notesScr->triggerSaveAndExit(); - } else { - ui_task.injectKey(KEY_CANCEL); - } - } else if (notesScr->isEditing()) { - // Editing mode: arrows move cursor, everything else types directly - switch (ckb) { - case (char)0xF2: notesScr->moveCursorUp(); break; - case (char)0xF1: notesScr->moveCursorDown(); break; - case (char)0xF3: notesScr->moveCursorLeft(); break; - case (char)0xF4: notesScr->moveCursorRight(); break; - default: ui_task.injectKey(ckb); break; - } - } else { - // Renaming mode: all keys go directly to rename handler - ui_task.injectKey(ckb); - } - ui_task.forceRefresh(); - } - } -#endif - - if (!handled) { - // ESC -> back navigation - if (ckb == 0x1B) { - if (ui_task.isOnSnakeScreen()) { - ui_task.injectKey(KEY_CANCEL); - SnakeScreen* ss = (SnakeScreen*)ui_task.getSnakeScreen(); - if (ss && ss->wantsExit()) { - ui_task.gotoGamesMenu(); - } - } else if (ui_task.isOnMinesweeperScreen()) { - ui_task.injectKey(KEY_CANCEL); - MinesweeperScreen* ms = (MinesweeperScreen*)ui_task.getMinesweeperScreen(); - if (ms && ms->wantsExit()) { - ui_task.gotoGamesMenu(); - } - } else if (ui_task.isOnGamesMenu()) { - ui_task.gotoHomeScreen(); - } else if (ui_task.isOnChannelPickerScreen()) { - ui_task.gotoHomeScreen(); - } else if (ui_task.isOnChannelScreen()) { - ChannelScreen* chScr = (ChannelScreen*)ui_task.getChannelScreen(); - if (chScr && (chScr->isReplySelectMode() || chScr->isShowingPathOverlay())) { - ui_task.injectKey(KEY_CANCEL); // dismiss overlay/reply first - } else if (chScr && chScr->isDMConversation()) { - ui_task.injectKey(KEY_CANCEL); // DM conversation -> inbox - } else { - ui_task.gotoChannelPickerScreen(); - } - } else { - ui_task.gotoHomeScreen(); // All other screens → home - } - } else if (ckb == '\r') { - // Enter key — screen-specific compose or select - if (ui_task.isOnChannelScreen()) { - uint8_t chIdx = ui_task.getChannelScreenViewIdx(); - if (chIdx == 0xFF) { - ChannelScreen* chScr = (ChannelScreen*)ui_task.getChannelScreen(); - if (chScr->isDMInboxMode()) { - // Inbox mode: inject Enter to open conversation - ui_task.injectKey('\r'); - } else { - // Conversation mode: open VKB DM compose - const char* dmName = chScr->getDMFilterName(); - if (dmName && dmName[0]) { - uint32_t numC = the_mesh.getNumContacts(); - ContactInfo ci; - for (uint32_t j = 0; j < numC; j++) { - if (the_mesh.getContactByIdx(j, ci) && strcmp(ci.name, dmName) == 0) { - char label[40]; - snprintf(label, sizeof(label), "DM: %s", dmName); - #if defined(LilyGo_T5S3_EPaper_Pro) - ui_task.showVirtualKeyboard(VKB_DM, label, "", 137, j); - #elif defined(MECK_CARDKB) - ckbComposeMode = true; - ckbComposeBuf[0] = '\0'; - ckbComposePos = 0; - ckbComposeDM = true; - ckbComposeDMIdx = (int)j; - strncpy(ckbComposeDMName, dmName, sizeof(ckbComposeDMName) - 1); - ckbComposeRefresh = true; - ckbLastKeystroke = millis(); - #else - ui_task.injectKey('\r'); - #endif - ui_task.clearDMUnread(j); - break; - } - } - } - } - } else { - // Open VKB for channel message compose - ChannelDetails ch; - if (the_mesh.getChannel(chIdx, ch)) { - char label[40]; - snprintf(label, sizeof(label), "To: %s", ch.name); - #if defined(LilyGo_T5S3_EPaper_Pro) - ui_task.showVirtualKeyboard(VKB_CHANNEL_MSG, label, "", 137, chIdx); - #elif defined(MECK_CARDKB) - ckbComposeMode = true; - ckbComposeBuf[0] = '\0'; - ckbComposePos = 0; - ckbComposeDM = false; - ckbComposeChIdx = chIdx; - ckbComposeRefresh = true; - ckbLastKeystroke = millis(); - #else - ui_task.injectKey('\r'); - #endif - } - } - } else if (ui_task.isOnContactsScreen()) { - ContactsScreen* cs = (ContactsScreen*)ui_task.getContactsScreen(); - if (cs && cs->isInSelectMode()) { - // Select mode: Enter toggles checkbox - cs->toggleSelected(); - ui_task.forceRefresh(); - } else if (cs) { - // Normal mode: DM compose for chat contacts, admin for repeaters - int idx = cs->getSelectedContactIdx(); - uint8_t ctype = cs->getSelectedContactType(); - if (idx >= 0 && ctype == ADV_TYPE_CHAT) { - if (ui_task.hasDMUnread(idx)) { - char cname[32]; - cs->getSelectedContactName(cname, sizeof(cname)); - ui_task.clearDMUnread(idx); - ui_task.gotoDMConversation(cname); - } else { - char dname[32]; - cs->getSelectedContactName(dname, sizeof(dname)); - char label[40]; - snprintf(label, sizeof(label), "DM: %s", dname); - #if defined(LilyGo_T5S3_EPaper_Pro) - ui_task.showVirtualKeyboard(VKB_DM, label, "", 137, idx); - #elif defined(MECK_CARDKB) - ckbComposeMode = true; - ckbComposeBuf[0] = '\0'; - ckbComposePos = 0; - ckbComposeDM = true; - ckbComposeDMIdx = idx; - strncpy(ckbComposeDMName, dname, sizeof(ckbComposeDMName) - 1); - ckbComposeRefresh = true; - ckbLastKeystroke = millis(); - #else - ui_task.injectKey('\r'); - #endif - } - } else if (idx >= 0 && ctype == ADV_TYPE_REPEATER) { - ui_task.gotoRepeaterAdmin(idx); - } else if (idx >= 0 && ctype == ADV_TYPE_ROOM) { - // Room server: open login (auto-redirects to conversation) - ui_task.gotoRepeaterAdmin(idx); - } else if (idx >= 0 && ui_task.hasDMUnread(idx)) { - char cname[32]; - cs->getSelectedContactName(cname, sizeof(cname)); - ui_task.clearDMUnread(idx); - ui_task.gotoDMConversation(cname); - } - } - } else if (ui_task.isOnRepeaterAdmin()) { - // Open VKB for password or CLI entry - RepeaterAdminScreen* admin = (RepeaterAdminScreen*)ui_task.getRepeaterAdminScreen(); - if (admin) { - RepeaterAdminScreen::AdminState astate = admin->getState(); - if (astate == RepeaterAdminScreen::STATE_PASSWORD_ENTRY) { - #if defined(LilyGo_T5S3_EPaper_Pro) - ui_task.showVirtualKeyboard(VKB_ADMIN_PASSWORD, "Admin Password", "", 32); - #else - ui_task.injectKey('\r'); - #endif - } else { - #if defined(LilyGo_T5S3_EPaper_Pro) - ui_task.showVirtualKeyboard(VKB_ADMIN_CLI, "Admin Command", "", 137); - #else - ui_task.injectKey('\r'); - #endif - } - } - } else if (ui_task.isOnPathEditor()) { - // Path editor handles Enter internally - ui_task.injectKey('\r'); - PathEditorScreen* pe = (PathEditorScreen*)ui_task.getPathEditorScreen(); - if (pe && pe->wantsExit()) { - ui_task.gotoContactsScreen(); - } - } else if (ui_task.isOnTraceScreen()) { - // Trace screen handles Enter internally - ui_task.injectKey('\r'); - TraceScreen* ts = (TraceScreen*)ui_task.getTraceScreen(); - if (ts && ts->wantsExit()) { - ui_task.gotoHomeScreen(); - } - } else if (ui_task.isOnGamesMenu()) { - // Games menu: Enter launches selected game - ui_task.injectKey('\r'); - GamesMenuScreen* gm = (GamesMenuScreen*)ui_task.getGamesMenuScreen(); - if (gm && gm->wantsLaunch()) { - GameID sel = gm->selectedGame(); - gm->clearFlags(); - switch (sel) { - case GAME_SNAKE: ui_task.gotoSnakeScreen(); break; - case GAME_MINESWEEPER: ui_task.gotoMinesweeperScreen(); break; -#if defined(LilyGo_TDeck_Pro) - case GAME_GBC: ui_task.gotoGBCScreen(); break; -#endif - default: break; - } - } - } else if (ui_task.isOnSnakeScreen()) { - // Snake: Enter starts/restarts game - ui_task.injectKey('\r'); - SnakeScreen* ss = (SnakeScreen*)ui_task.getSnakeScreen(); - if (ss && ss->wantsExit()) { - ui_task.gotoGamesMenu(); - } - } else if (ui_task.isOnMinesweeperScreen()) { - // Minesweeper: Enter reveals cell or starts/restarts - ui_task.injectKey('\r'); - MinesweeperScreen* ms = (MinesweeperScreen*)ui_task.getMinesweeperScreen(); - if (ms && ms->wantsExit()) { - ui_task.gotoGamesMenu(); - } - } else if (ui_task.isOnChannelPickerScreen()) { - // Channel picker: Enter selects channel - ui_task.injectKey('\r'); - ChannelPickerScreen* pick = (ChannelPickerScreen*)ui_task.getChannelPickerScreen(); - if (pick && pick->wantsExit()) { - ui_task.gotoChannelScreen(false); - } - } else { - // All other screens: pass Enter through for native handling - // (settings toggle, discovery add-contact, last heard, text reader, notes file list, etc.) - ui_task.injectKey('\r'); - } - } else { - // Non-Enter keys: remap arrows to WASD, pass others through - // Special: 'p' on contacts screen opens path editor - if ((ckb == 'p' || ckb == 'P') && ui_task.isOnContactsScreen()) { - ContactsScreen* cs = (ContactsScreen*)ui_task.getContactsScreen(); - if (cs) { - int idx = cs->getSelectedContactIdx(); - if (idx >= 0) { - ui_task.gotoPathEditor(idx); - } - } - } else if ((ckb == 0x1B) && ui_task.isOnPathEditor()) { - // ESC on path editor -> back to contacts - ui_task.gotoContactsScreen(); - } else if ((ckb == 0x1B) && ui_task.isOnChannelPickerScreen()) { - // ESC on picker -> home - ui_task.gotoHomeScreen(); - } else if ((ckb == 0x1B) && ui_task.isOnChannelScreen()) { - // ESC on channel screen -> picker (unless overlay/DM conversation) - ChannelScreen* chScr = (ChannelScreen*)ui_task.getChannelScreen(); - if (chScr && (chScr->isReplySelectMode() || chScr->isShowingPathOverlay())) { - ui_task.injectKey(KEY_CANCEL); // dismiss overlay/reply first - } else if (chScr && chScr->isDMConversation()) { - ui_task.injectKey(KEY_CANCEL); // DM conversation -> inbox (handled internally) - } else { - ui_task.gotoChannelPickerScreen(); - } - } else if (ui_task.isOnChannelScreen() && (ckb == (char)0xF3 || ckb == (char)0xF4)) { - // Channel screen: Left/Right arrows open picker - ui_task.gotoChannelPickerScreen(); - } else { - switch (ckb) { - case (char)0xF2: ui_task.injectKey('w'); break; // Up → scroll up - case (char)0xF1: ui_task.injectKey('s'); break; // Down → scroll down - case (char)0xF3: ui_task.injectKey('a'); break; // Left → prev channel/category - case (char)0xF4: ui_task.injectKey('d'); break; // Right → next channel/category - default: ui_task.injectKey(ckb); break; - } - } - } - } - } - } - } // end compose mode else - } - } -#endif - // Poll touch input for phone dialer numpad // Hybrid debounce: finger-up detection + 150ms minimum between accepted taps. // The CST328 INT pin is pulse-based (not level), so getPoint() can return @@ -4511,7 +3507,7 @@ void loop() { // The RTOS idle task executes WFI (wait-for-interrupt) during delay(), // dramatically reducing CPU power draw. 50 ms gives 20 loop cycles/sec // which is ample for LoRa packet reception (radio has hardware FIFO). -#if defined(LilyGo_T5S3_EPaper_Pro) || defined(LilyGo_TDeck_Pro) +#if defined(LilyGo_TDeck_Pro) if (ui_task.isLocked()) { delay(50); } @@ -6432,169 +5428,3 @@ void audio_eof_mp3(const char *info) { #endif // !HAS_4G_MODEM #endif // LilyGo_TDeck_Pro - -// ============================================================================ -// CARDKB COMPOSE FUNCTIONS (T-Echo Lite) -// ============================================================================ -#if defined(MECK_CARDKB) - -void drawCardKBCompose() { - #ifdef DISPLAY_CLASS - display.startFrame(); - display.setTextSize(1); - display.setColor(DisplayDriver::GREEN); - display.setCursor(0, 0); - - // Header: "To: channel" or "DM: contact" - char headerBuf[40]; - if (ckbComposeDM) { - snprintf(headerBuf, sizeof(headerBuf), "DM: %s", ckbComposeDMName); - } else { - ChannelDetails channel; - if (the_mesh.getChannel(ckbComposeChIdx, channel)) { - snprintf(headerBuf, sizeof(headerBuf), "To: %s", channel.name); - } else { - snprintf(headerBuf, sizeof(headerBuf), "To: Channel %d", ckbComposeChIdx); - } - } - display.print(headerBuf); - - display.setColor(DisplayDriver::LIGHT); - display.drawRect(0, 11, display.width(), 1); - - // Body: word-wrapped compose buffer - int y = 14; - int px = 0; - int lineW = display.width(); - char charStr[2] = {0, 0}; - char dblStr[3] = {0, 0, 0}; - bool atWordBoundary = true; - - display.setCursor(0, y); - display.setColor(DisplayDriver::LIGHT); - - for (int i = 0; i < ckbComposePos; i++) { - uint8_t b = (uint8_t)ckbComposeBuf[i]; - - // Word wrap: check if next word fits on this line - if (atWordBoundary && b != ' ' && px > 0) { - int wordW = 0; - for (int j = i; j < ckbComposePos; j++) { - uint8_t wb = (uint8_t)ckbComposeBuf[j]; - if (wb == ' ') break; - dblStr[0] = dblStr[1] = (char)wb; - charStr[0] = (char)wb; - wordW += display.getTextWidth(dblStr) - display.getTextWidth(charStr); - } - if (px + wordW > lineW) { - px = 0; - y += 12; - } - } - - if (b == ' ') { - charStr[0] = ' '; - dblStr[0] = dblStr[1] = ' '; - int adv = display.getTextWidth(dblStr) - display.getTextWidth(charStr); - if (px + adv > lineW) { - px = 0; - y += 12; - } else { - display.setCursor(px, y); - display.print(charStr); - px += adv; - } - atWordBoundary = true; - } else { - charStr[0] = (char)b; - dblStr[0] = dblStr[1] = (char)b; - int adv = display.getTextWidth(dblStr) - display.getTextWidth(charStr); - if (px + adv > lineW) { - px = 0; - y += 12; - } - display.setCursor(px, y); - display.print(charStr); - px += adv; - atWordBoundary = false; - } - } - - // Cursor - display.setCursor(px, y); - display.print("_"); - - // Footer status bar - int statusY = display.height() - 12; - display.setColor(DisplayDriver::LIGHT); - display.drawRect(0, statusY - 2, display.width(), 1); - display.setCursor(0, statusY); - display.setColor(DisplayDriver::YELLOW); - - char status[32]; - if (ckbComposePos == 0) { - display.print("Esc:Cancel"); - } else { - snprintf(status, sizeof(status), "Esc:X %d/137", ckbComposePos); - display.print(status); - } - const char* rt = "Ent:Send"; - display.setCursor(display.width() - display.getTextWidth(rt) - 2, statusY); - display.print(rt); - - display.endFrame(); - #endif -} - -void sendCardKBMessage() { - if (ckbComposePos == 0) return; - - cpuPower.setBoost(); - - if (ckbComposeDM) { - // Direct message - if (ckbComposeDMIdx >= 0) { - uint32_t sendRef = 0; - uint8_t sendTotal = 0; - if (the_mesh.uiSendDirectMessage((uint32_t)ckbComposeDMIdx, ckbComposeBuf, &sendRef, &sendTotal)) { - ui_task.addSentDM(ckbComposeDMName, the_mesh.getNodePrefs()->node_name, ckbComposeBuf, - sendRef, sendTotal); - ui_task.showAlert("DM sent!", 1500); - } else { - ui_task.showAlert("DM failed!", 1500); - } - } else { - ui_task.showAlert("No contact!", 1500); - } - } else { - // Channel message - ChannelDetails channel; - if (the_mesh.getChannel(ckbComposeChIdx, channel)) { - uint32_t timestamp = rtc_clock.getCurrentTime(); - int len = strlen(ckbComposeBuf); - - if (the_mesh.sendGroupMessage(timestamp, channel.channel, - the_mesh.getNodePrefs()->node_name, - ckbComposeBuf, len)) { - ui_task.addSentChannelMessage(ckbComposeChIdx, - the_mesh.getNodePrefs()->node_name, - ckbComposeBuf); - the_mesh.queueSentChannelMessage(ckbComposeChIdx, timestamp, - the_mesh.getNodePrefs()->node_name, - ckbComposeBuf); - ui_task.showAlert("Sent!", 1500); - } else { - ui_task.showAlert("Send failed!", 1500); - } - } else { - ui_task.showAlert("No channel!", 1500); - } - } - - ckbComposeMode = false; - ckbComposeBuf[0] = '\0'; - ckbComposePos = 0; - ui_task.forceRefresh(); -} - -#endif // MECK_CARDKB \ No newline at end of file diff --git a/examples/companion_radio/ui-new/CardKBKeyboard.h b/examples/companion_radio/ui-new/CardKBKeyboard.h deleted file mode 100644 index c20f304b..00000000 --- a/examples/companion_radio/ui-new/CardKBKeyboard.h +++ /dev/null @@ -1,131 +0,0 @@ -#pragma once -// ============================================================================= -// CardKBKeyboard — M5Stack CardKB (or compatible) I2C keyboard driver -// -// Polls 0x5F on the shared I2C bus via QWIIC connector. -// Maps CardKB special key codes to Meck key constants. -// -// Platform support: -// - ESP32/ESP32-S3 (T5S3, T-Deck Pro): Wire.begin(SDA, SCL) -// - nRF52840 (T-Echo Lite): Wire.begin() uses variant.h pins -// -// Usage: -// CardKBKeyboard cardkb; -// if (cardkb.begin()) { /* detected */ } -// char key = cardkb.readKey(); // returns 0 if no key -// ============================================================================= - -#if defined(MECK_CARDKB) -#ifndef CARDKB_KEYBOARD_H -#define CARDKB_KEYBOARD_H - -#include -#include - -// I2C address (defined in variant.h, fallback here) -#ifndef CARDKB_I2C_ADDR -#define CARDKB_I2C_ADDR 0x5F -#endif - -// CardKB special key codes (from M5Stack documentation) -#define CARDKB_KEY_UP 0xB5 -#define CARDKB_KEY_DOWN 0xB6 -#define CARDKB_KEY_LEFT 0xB4 -#define CARDKB_KEY_RIGHT 0xB7 -#define CARDKB_KEY_TAB 0x09 -#define CARDKB_KEY_ESC 0x1B -#define CARDKB_KEY_BS 0x08 -#define CARDKB_KEY_ENTER 0x0D -#define CARDKB_KEY_DEL 0x7F -#define CARDKB_KEY_FN 0x00 // Fn modifier (swallowed by CardKB internally) - -class CardKBKeyboard { -public: - CardKBKeyboard() : _detected(false) {} - - // Probe for CardKB on the I2C bus. Call after Wire.begin(). - bool begin() { - Wire.beginTransmission(CARDKB_I2C_ADDR); - _detected = (Wire.endTransmission() == 0); - if (_detected) { - Serial.println("[CardKB] Detected at 0x5F"); - } - return _detected; - } - - // Re-probe (e.g. for hot-plug detection every few seconds) - bool probe() { - Wire.beginTransmission(CARDKB_I2C_ADDR); - _detected = (Wire.endTransmission() == 0); - return _detected; - } - - bool isDetected() const { return _detected; } - - // Poll for a keypress. Returns 0 if no key available. - // Returns raw ASCII for printable chars, or Meck KEY_* constants for nav keys. - // Throttled to avoid flooding I2C bus — polls at most every 50ms. - // On read failure, backs off 500ms and re-inits Wire to recover bus state. - char readKey() { - if (!_detected) return 0; - - unsigned long now = millis(); - if (now - _lastPoll < _pollInterval) return 0; - _lastPoll = now; - - Wire.requestFrom((uint8_t)CARDKB_I2C_ADDR, (uint8_t)1); - if (!Wire.available()) { - _errorCount++; - if (_errorCount >= 3) { - // I2C bus may be stuck — re-init to recover -#if defined(ESP32) - // ESP32: Wire.begin() accepts explicit SDA/SCL pins - Wire.begin(I2C_SDA, I2C_SCL); -#else - // nRF52: Wire.begin() uses PIN_WIRE_SDA/SCL from variant.h - Wire.begin(); -#endif - Wire.setClock(100000); - _pollInterval = 500; // Back off for 500ms - _errorCount = 0; - Serial.println("[CardKB] I2C error recovery — bus re-init"); - } - return 0; - } - - _errorCount = 0; - _pollInterval = 50; // Normal polling rate - - uint8_t raw = Wire.read(); - if (raw == 0) return 0; - - // Map CardKB special keys to Meck constants - switch (raw) { - case CARDKB_KEY_UP: return 0xF2; // KEY_PREV - case CARDKB_KEY_DOWN: return 0xF1; // KEY_NEXT - case CARDKB_KEY_LEFT: return 0xF3; // KEY_LEFT - case CARDKB_KEY_RIGHT: return 0xF4; // KEY_RIGHT - case CARDKB_KEY_ENTER: return '\r'; - case CARDKB_KEY_BS: return '\b'; - case CARDKB_KEY_DEL: return '\b'; // Treat delete same as backspace - case CARDKB_KEY_ESC: return 0x1B; // ESC — handled by caller - case CARDKB_KEY_TAB: return 0x09; // Tab — available for future use - default: - // Printable ASCII — pass through unchanged - if (raw >= 0x20 && raw <= 0x7E) { - return (char)raw; - } - // Unknown code — ignore - return 0; - } - } - -private: - bool _detected; - unsigned long _lastPoll = 0; - unsigned long _pollInterval = 50; // ms between polls (increases on error) - uint8_t _errorCount = 0; -}; - -#endif // CARDKB_KEYBOARD_H -#endif // MECK_CARDKB \ No newline at end of file diff --git a/examples/companion_radio/ui-new/ChannelPickerScreen.h b/examples/companion_radio/ui-new/ChannelPickerScreen.h index e42587ca..6a4702eb 100644 --- a/examples/companion_radio/ui-new/ChannelPickerScreen.h +++ b/examples/companion_radio/ui-new/ChannelPickerScreen.h @@ -22,13 +22,10 @@ extern MyMesh the_mesh; // messages screen pre-targeted at that channel. // // Replaces the A/D channel-cycling model in ChannelScreen. Pressing A or D -// (or swiping left/right on T5S3) from the messages screen now opens the +// from the messages screen now opens the // picker instead of paging one channel at a time. // // Rendering: -// T5S3 E-Paper Pro : vertical list of outlined "bubble" rows (full-width, -// name left-aligned, unread badge right-aligned). -// Matches the P4 channel picker aesthetic. 1-tap opens. // T-Deck Pro / MAX : vertical list with "> " cursor, unread badge, right- // aligned. Same highlight/tap convention as Contacts. // @@ -56,12 +53,6 @@ class ChannelPickerScreen : public UIScreen { int _cursor; int _scrollTop; // Scroll offset (T-Deck Pro list only) - // Grid layout cache (T5S3) -- set in render(), consumed by touch hit test - int _cellW; - int _cellH; - int _gridTop; - int _gridCols; - // Delete confirmation sub-menu bool _confirmDelete; // True when showing "Delete history?" overlay @@ -108,7 +99,6 @@ public: ChannelPickerScreen(UITask* task) : _task(task), _channelScreen(nullptr), _itemCount(0), _cursor(0), _scrollTop(0), - _cellW(40), _cellH(12), _gridTop(14), _gridCols(3), _confirmDelete(false), _wantExit(false) { _items[0] = 0xFF; @@ -161,112 +151,6 @@ public: display.print(tmp); display.drawRect(0, 11, display.width(), 1); -#if defined(LilyGo_T5S3_EPaper_Pro) - // ================================================================= - // T5S3: Vertical bubble list (matches P4 channel picker aesthetic) - // Full-width outlined bubbles with channel name left-aligned and - // unread badge right-aligned. 1-tap opens the channel. - // ================================================================= - const int headerH = 14; - const int footerH = 14; - const int bodyH = display.height() - headerH - footerH; - const int bubbleH = 11; // Bubble height in virtual coords - const int gap = 2; // Gap between bubbles - const int padX = 3; // Horizontal padding from screen edge - const int bubbleW = display.width() - 2 * padX; - int maxVisible = bodyH / (bubbleH + gap); - if (maxVisible < 3) maxVisible = 3; - if (maxVisible > _itemCount) maxVisible = _itemCount; - - // Cache layout for touch hit test - _cellW = bubbleW; - _cellH = bubbleH + gap; - _gridTop = headerH; - _gridCols = 1; // Single column -- list mode - - // Centre scroll window on cursor - _scrollTop = max(0, min(_cursor - maxVisible / 2, _itemCount - maxVisible)); - if (_scrollTop < 0) _scrollTop = 0; - int endIdx = min(_itemCount, _scrollTop + maxVisible); - - for (int i = _scrollTop; i < endIdx; i++) { - int row = i - _scrollTop; - int x = padX; - int y = headerH + row * (bubbleH + gap) + 1; - int w = bubbleW; - int h = bubbleH; - - bool selected = (i == _cursor); - int unread = getItemUnread(i); - - // Bubble: filled if selected, outlined otherwise - if (selected) { - display.setColor(DisplayDriver::LIGHT); - display.fillRect(x, y, w, h); - display.setColor(DisplayDriver::DARK); - } else { - display.setColor(DisplayDriver::LIGHT); - display.drawRect(x, y, w, h); - // Draw a second outline 1px inset for a bolder border - display.drawRect(x + 1, y + 1, w - 2, h - 2); - } - - // Channel name -- left-aligned with inner padding - char name[32]; - getItemName(i, name, sizeof(name)); - char filtered[32]; - display.translateUTF8ToBlocks(filtered, name, sizeof(filtered)); - - int textY = y + (h - 9) / 2; - if (textY < y + 1) textY = y + 1; - int textX = x + 4; - - // Badge width reservation - int badgeW = 0; - char badge[8]; - if (unread > 0) { - if (unread > 99) snprintf(badge, sizeof(badge), "99+"); - else snprintf(badge, sizeof(badge), "*%d", unread); - badgeW = display.getTextWidth(badge) + 4; - } - int nameMaxW = w - 8 - badgeW; - if (nameMaxW < 8) nameMaxW = 8; - - int nameW = display.getTextWidth(filtered); - if (nameW <= nameMaxW) { - display.setCursor(textX, textY); - display.print(filtered); - } else { - display.drawTextEllipsized(textX, textY, nameMaxW, filtered); - } - - // Unread badge -- right-aligned inside bubble - if (unread > 0) { - int bx = x + w - badgeW; - display.setCursor(bx, textY); - display.print(badge); - } - - display.setColor(DisplayDriver::LIGHT); - } - - // Scroll indicator (if more items than visible) - if (_itemCount > maxVisible) { - const int sbW = 3; - int sbX = display.width() - sbW; - int sbTop = headerH; - int sbHeight = bodyH; - display.setColor(DisplayDriver::LIGHT); - display.drawRect(sbX, sbTop, sbW, sbHeight); - int thumbH = (maxVisible * sbHeight) / _itemCount; - if (thumbH < 4) thumbH = 4; - int maxScroll = _itemCount - maxVisible; - if (maxScroll < 1) maxScroll = 1; - int thumbY = sbTop + (_scrollTop * (sbHeight - thumbH)) / maxScroll; - display.fillRect(sbX + 1, thumbY + 1, sbW - 2, thumbH - 2); - } - -#else // ================================================================= // T-Deck Pro / MAX: Vertical list // Uses NodePrefs font helpers for large_font compatibility. @@ -338,7 +222,6 @@ public: int thumbY = sbTop + (_scrollTop * (sbHeight - thumbH)) / maxScroll; display.fillRect(sbX + 1, thumbY + 1, sbW - 2, thumbH - 2); } -#endif // ================================================================= // Delete confirmation overlay @@ -376,11 +259,7 @@ public: // Key hints display.setColor(DisplayDriver::YELLOW); - #if defined(LilyGo_T5S3_EPaper_Pro) - const char* hints = "Tap:Yes Boot:Cancel"; - #else const char* hints = "Enter:Yes Q:Cancel"; - #endif display.setCursor(boxX + 4, boxY + 29); display.print(hints); } @@ -392,24 +271,6 @@ public: display.setColor(DisplayDriver::YELLOW); display.setCursor(0, footerY); -#if defined(LilyGo_T5S3_EPaper_Pro) - if (_confirmDelete) { - display.print("Tap:Yes"); - const char* rt = "Boot:Cancel"; - display.setCursor(display.width() - display.getTextWidth(rt) - 2, footerY); - display.print(rt); - } else { - display.print("Tap:Open"); - const char* rt = "Long Press:Del Hist Boot:Back"; - display.setCursor(display.width() - display.getTextWidth(rt) - 2, footerY); - display.print(rt); - } -#elif defined(LILYGO_TECHO_LITE) - display.print("Q:Bk"); - const char* rt = "Ent:Open"; - display.setCursor(display.width() - display.getTextWidth(rt) - 2, footerY); - display.print(rt); -#else if (_confirmDelete) { display.print("Enter:Yes Q:Cancel"); } else { @@ -418,7 +279,6 @@ public: display.setCursor(display.width() - display.getTextWidth(rt) - 6, footerY); display.print(rt); } -#endif #ifdef USE_EINK return 5000; @@ -504,33 +364,16 @@ public: // ----------------------------------------------------------------------- // Touch hit test (virtual coordinates) // Returns: 0=miss, 1=cursor moved, 2=activate. - // T5S3 bubbles: any tap on a bubble -> 2 (direct open). // T-Deck Pro list: 1st tap -> 1 (highlight), 2nd tap same row -> 2. // ----------------------------------------------------------------------- int selectAtVxVy(int vx, int vy) { // If delete confirmation is showing: - // T5S3: tap = confirm (return 2 → KEY_ENTER → handleInput confirms) // T-Deck Pro: tap = cancel (dismiss overlay, stay on picker) if (_confirmDelete) { -#if defined(LilyGo_T5S3_EPaper_Pro) - return 2; // Confirm — maps to KEY_ENTER in mapTouchTap -#else _confirmDelete = false; return 1; // Cancel — redraw without activating -#endif } -#if defined(LilyGo_T5S3_EPaper_Pro) - // Vertical bubble list hit test - if (vy < _gridTop || _cellH == 0) return 0; - int footerY = 128 - 14; - if (vy >= footerY) return 0; - int row = (vy - _gridTop) / _cellH; - int idx = _scrollTop + row; - if (idx < 0 || idx >= _itemCount) return 0; - _cursor = idx; - return 2; // Direct open on tap -#else // T-Deck Pro / MAX list hit test -- uses NodePrefs for large_font compatibility NodePrefs* prefs = the_mesh.getNodePrefs(); int lineH = prefs->smallLineH(); @@ -547,6 +390,5 @@ public: if (tappedRow == _cursor) return 2; _cursor = tappedRow; return 1; -#endif } }; \ No newline at end of file diff --git a/examples/companion_radio/ui-new/ChannelScreen.h b/examples/companion_radio/ui-new/ChannelScreen.h index 3b89190e..33f941a4 100644 --- a/examples/companion_radio/ui-new/ChannelScreen.h +++ b/examples/companion_radio/ui-new/ChannelScreen.h @@ -850,11 +850,7 @@ public: display.setCursor(0, y); display.print("No direct messages"); display.setCursor(0, y + lineH); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.print("DMs from contacts appear here"); -#else display.print("A/D: Switch channel"); -#endif } else { int startIdx = max(0, min(_dmInboxScroll - maxVisible / 2, inboxCount - maxVisible)); @@ -865,11 +861,7 @@ public: if (selected) { display.setColor(DisplayDriver::LIGHT); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.fillRect(0, y, display.width(), lineH); -#else display.fillRect(0, y + the_mesh.getNodePrefs()->smallHighlightOff(), display.width(), lineH); -#endif display.setColor(DisplayDriver::DARK); } else { display.setColor(DisplayDriver::LIGHT); @@ -918,25 +910,11 @@ public: int footerY = display.height() - 12; display.drawRect(0, footerY - 2, display.width(), 1); display.setColor(DisplayDriver::YELLOW); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.setCursor(0, footerY); - display.print("Swipe:Nav"); - const char* rtInbox = "Hold:Open"; - display.setCursor(display.width() - display.getTextWidth(rtInbox) - 2, footerY); - display.print(rtInbox); -#elif defined(LILYGO_TECHO_LITE) - display.setCursor(0, footerY); - display.print("Q:Bk"); - const char* rtInbox = "Ent:Open"; - display.setCursor(display.width() - display.getTextWidth(rtInbox) - 2, footerY); - display.print(rtInbox); -#else display.setCursor(0, footerY); display.print("Q:Bck"); const char* rtInbox = "Ent:Open"; display.setCursor(display.width() - display.getTextWidth(rtInbox) - 6, footerY); display.print(rtInbox); -#endif #ifdef USE_EINK return 5000; @@ -1129,10 +1107,6 @@ public: display.drawRect(0, footerY - 2, display.width(), 1); display.setCursor(0, footerY); display.setColor(DisplayDriver::YELLOW); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.print("Back"); - const char* copyHint = "Tap:Dismiss"; -#else display.print("Q:Back"); // Show scroll hint if path is scrollable if (msg && (msg->path_len & 63) > _pathHopsVisible && msg->path_len != 0xFF) { @@ -1142,7 +1116,6 @@ public: display.print(scrollHint); } const char* copyHint = "Ent:Copy"; -#endif display.setCursor(display.width() - display.getTextWidth(copyHint) - 2, footerY); display.print(copyHint); @@ -1162,29 +1135,15 @@ public: snprintf(noMsg, sizeof(noMsg), "No messages from %s", _dmFilterName); display.print(noMsg); display.setCursor(0, 30); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.print("Hold: Compose reply"); -#else display.print("Q: Back to inbox"); display.setCursor(0, 40); display.print("Ent: Compose reply"); -#endif } else { display.print("No messages yet"); display.setCursor(0, 30); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.print("Swipe: Switch channel"); - display.setCursor(0, 40); - display.print("Long press: Compose"); -#elif defined(LILYGO_TECHO_LITE) - display.print("Arrows: Switch channel"); - display.setCursor(0, 40); - display.print("Ent: Compose message"); -#else display.print("A/D: Switch channel"); display.setCursor(0, 40); display.print("C: Compose message"); -#endif } display.setTextSize(1); // Restore for footer } else if (_viewChannelIdx == 0xFF && _dmInboxMode) { @@ -1269,11 +1228,7 @@ public: if (selected) { display.setColor(DisplayDriver::LIGHT); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.fillRect(0, y, display.width(), lineHeight); -#else display.fillRect(0, y + the_mesh.getNodePrefs()->smallHighlightOff(), display.width(), lineHeight); -#endif display.setColor(DisplayDriver::DARK); } else { display.setColor(DisplayDriver::LIGHT); @@ -1376,11 +1331,7 @@ public: int availH = maxY - y; if (maxFillH > availH) maxFillH = availH; display.setColor(DisplayDriver::LIGHT); - #if defined(LilyGo_T5S3_EPaper_Pro) - display.fillRect(0, y, contentW, maxFillH); -#else display.fillRect(0, y + the_mesh.getNodePrefs()->smallHighlightOff(), contentW, maxFillH); -#endif } // Time indicator with hop count - inline on same line as message start @@ -1594,11 +1545,7 @@ public: if (maxFillH > availH) maxFillH = availH; if (usedH < maxFillH) { display.setColor(DisplayDriver::DARK); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.fillRect(0, y, contentW, maxFillH - usedH); -#else display.fillRect(0, y + the_mesh.getNodePrefs()->smallHighlightOff(), contentW, maxFillH - usedH); -#endif } } @@ -1653,36 +1600,6 @@ public: display.setCursor(0, footerY); display.setColor(DisplayDriver::YELLOW); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.setCursor(0, footerY); - if (_viewChannelIdx == 0xFF) { - display.print("Swipe:Scroll"); - const char* rtCh = "Hold:Reply"; - display.setCursor(display.width() - display.getTextWidth(rtCh) - 2, footerY); - display.print(rtCh); - } else { - display.print("Swipe:Ch/Scroll"); - const char* midCh = "Tap:Path"; - display.setCursor((display.width() - display.getTextWidth(midCh)) / 2, footerY); - display.print(midCh); - const char* rtCh = "Hold:Compose"; - display.setCursor(display.width() - display.getTextWidth(rtCh) - 2, footerY); - display.print(rtCh); - } -#elif defined(LILYGO_TECHO_LITE) - // T-Echo Lite: minimal footer for narrow display - if (_viewChannelIdx == 0xFF) { - display.print("Q:Bk"); - const char* rightText = "Ent:Reply"; - display.setCursor(display.width() - display.getTextWidth(rightText) - 2, footerY); - display.print(rightText); - } else { - display.print("Q:Bk"); - const char* rightText = "Ent:New"; - display.setCursor(display.width() - display.getTextWidth(rightText) - 2, footerY); - display.print(rightText); - } -#else // Left side: abbreviated controls if (_replySelectMode) { display.print("W/S:Sel V:Pth Q:X"); @@ -1704,7 +1621,6 @@ public: display.setCursor(display.width() - display.getTextWidth(rightText) - 2, footerY); display.print(rightText); } -#endif #ifdef USE_EINK return 5000; diff --git a/examples/companion_radio/ui-new/ContactsScreen.h b/examples/companion_radio/ui-new/ContactsScreen.h index 61e4b661..1b2fbcb5 100644 --- a/examples/companion_radio/ui-new/ContactsScreen.h +++ b/examples/companion_radio/ui-new/ContactsScreen.h @@ -243,11 +243,7 @@ public: int selectRowAtVY(int vy) { if (_filteredCount == 0) return 0; const int headerH = 14, footerH = 14, lineH = the_mesh.getNodePrefs()->smallLineH(); -#if defined(LilyGo_T5S3_EPaper_Pro) - const int bodyTop = headerH; -#else const int bodyTop = headerH + the_mesh.getNodePrefs()->smallHighlightOff(); -#endif if (vy < bodyTop || vy >= 128 - footerH) return 0; int maxVisible = (128 - headerH - footerH) / lineH; @@ -336,11 +332,7 @@ public: display.setCursor(0, y); display.print("No contacts"); display.setCursor(0, y + lineHeight); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.print("Swipe to change filter"); -#else display.print("A/D: Change filter"); -#endif } else { // Center visible window around selected item (TextReaderScreen pattern) int maxVisible = (maxY - headerHeight) / lineHeight; @@ -359,11 +351,7 @@ public: // Highlight: fill LIGHT rect first, then draw DARK text on top if (selected) { display.setColor(DisplayDriver::LIGHT); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.fillRect(0, y, display.width(), lineHeight); -#else display.fillRect(0, y + the_mesh.getNodePrefs()->smallHighlightOff(), display.width(), lineHeight); -#endif display.setColor(DisplayDriver::DARK); } else { display.setColor(DisplayDriver::LIGHT); @@ -456,30 +444,6 @@ public: display.drawRect(0, footerY - 2, display.width(), 1); display.setColor(DisplayDriver::YELLOW); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.setCursor(0, footerY); - if (_selectMode) { - display.print("Swipe:All/Clr"); - const char* right = "Tap:Tog Hold:Exit"; - display.setCursor(display.width() - display.getTextWidth(right) - 2, footerY); - display.print(right); - } else { - display.print("Swipe:Filter"); - const char* right = "Hold:DM/Admin"; - display.setCursor(display.width() - display.getTextWidth(right) - 2, footerY); - display.print(right); - } -#elif defined(LILYGO_TECHO_LITE) - display.setCursor(0, footerY); - if (_selectMode) { - display.print("Q:Done"); - } else { - display.print("Q:Bk"); - const char* right = "Ent:Sel"; - display.setCursor(display.width() - display.getTextWidth(right) - 2, footerY); - display.print(right); - } -#else display.setCursor(0, footerY); if (_selectMode) { display.print("A:All D:Clr"); @@ -492,7 +456,6 @@ public: display.setCursor(display.width() - display.getTextWidth(right) - 2, footerY); display.print(right); } -#endif return 5000; // e-ink: next render after 5s diff --git a/examples/companion_radio/ui-new/DiscoveryScreen.h b/examples/companion_radio/ui-new/DiscoveryScreen.h index 03c62809..5bcba9d0 100644 --- a/examples/companion_radio/ui-new/DiscoveryScreen.h +++ b/examples/companion_radio/ui-new/DiscoveryScreen.h @@ -50,11 +50,7 @@ public: int count = the_mesh.getDiscoveredCount(); if (count == 0) return 0; const int headerH = 14, footerH = 14, lineH = the_mesh.getNodePrefs()->smallLineH(); -#if defined(LilyGo_T5S3_EPaper_Pro) - const int bodyTop = headerH; -#else const int bodyTop = headerH + the_mesh.getNodePrefs()->smallHighlightOff(); -#endif if (vy < bodyTop || vy >= 128 - footerH) return 0; int maxVisible = (128 - headerH - footerH) / lineH; @@ -105,11 +101,7 @@ public: display.print(active ? "Listening for adverts..." : "No nodes found"); if (!active) { display.setCursor(4, 38); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.print("Long press: Rescan"); -#else display.print("F: Scan again Q: Back"); -#endif } } else { // Center visible window around selected item @@ -126,11 +118,7 @@ public: // Highlight selected row if (selected) { display.setColor(DisplayDriver::LIGHT); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.fillRect(0, y, display.width(), lineHeight); -#else display.fillRect(0, y + the_mesh.getNodePrefs()->smallHighlightOff(), display.width(), lineHeight); -#endif display.setColor(DisplayDriver::DARK); } else { display.setColor(DisplayDriver::LIGHT); @@ -192,23 +180,11 @@ public: display.setColor(DisplayDriver::YELLOW); display.setCursor(0, footerY); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.print("Swipe:Scroll"); - - const char* mid = "Tap:Add"; - display.setCursor((display.width() - display.getTextWidth(mid)) / 2, footerY); - display.print(mid); - - const char* right = "Hold:Rescan"; - display.setCursor(display.width() - display.getTextWidth(right) - 2, footerY); - display.print(right); -#else display.print("Q:X F:Scan"); const char* right = "Tap/Ent:Add"; display.setCursor(display.width() - display.getTextWidth(right) - 2, footerY); display.print(right); -#endif // Faster refresh while actively scanning return active ? 1000 : 5000; diff --git a/examples/companion_radio/ui-new/Fontpreviewscreen.h b/examples/companion_radio/ui-new/Fontpreviewscreen.h index db3edb92..49d6b241 100644 --- a/examples/companion_radio/ui-new/Fontpreviewscreen.h +++ b/examples/companion_radio/ui-new/Fontpreviewscreen.h @@ -16,7 +16,7 @@ extern MyMesh the_mesh; // --------------------------------------------------------------------------- // Subscreen opened from Settings → Font Style. Shows a live preview of each // font style (Classic, Noto Sans, Montserrat) with sample body and title text. -// The user cycles through styles with W/S (or swipe on T5S3), previews the +// The user cycles through styles with W/S, previews the // actual rendering on-screen, and applies with Enter or cancels with Shift+Del. // // The preview works by temporarily calling display.setFontStyle() for each @@ -132,13 +132,8 @@ public: display.drawRect(0, footerY - 2, display.width(), 1); display.setCursor(0, footerY); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.print("Swipe:Pick"); - const char* rt = "Boot:Back Tap:Apply"; -#else display.print("W/S:Pick Q:Back"); const char* rt = "Enter:Apply"; -#endif display.setCursor(display.width() - display.getTextWidth(rt) - 2, footerY); display.print(rt); diff --git a/examples/companion_radio/ui-new/GBCEmulatorScreen.h b/examples/companion_radio/ui-new/GBCEmulatorScreen.h index db99697f..81211e24 100644 --- a/examples/companion_radio/ui-new/GBCEmulatorScreen.h +++ b/examples/companion_radio/ui-new/GBCEmulatorScreen.h @@ -4,8 +4,7 @@ // GBCEmulatorScreen -- Game Boy / Game Boy Color emulator for Meck (T-Deck) // // T-Deck Pro and Max (both define LilyGo_TDeck_Pro). Needs the raw joypad -// mode in the variant's TCA8418Keyboard.h; the T5S3 is excluded (different -// display class). +// mode in the variant's TCA8418Keyboard.h. // // Two modes. BROWSER lists the .gb/.gbc files in /roms on the SD card // (W/S to move, Enter to play, Shift+Backspace back to the games menu). diff --git a/examples/companion_radio/ui-new/GamesMenuScreen.h b/examples/companion_radio/ui-new/GamesMenuScreen.h index 9efb030f..a38d6825 100644 --- a/examples/companion_radio/ui-new/GamesMenuScreen.h +++ b/examples/companion_radio/ui-new/GamesMenuScreen.h @@ -111,37 +111,12 @@ public: // --- Header --- display.setColor(DisplayDriver::GREEN); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.drawTextCentered(display.width() / 2, 2, "Games"); -#else display.setCursor(2, 2); display.print("Games"); -#endif display.setColor(DisplayDriver::LIGHT); display.drawRect(0, 12, display.width(), 1); // --- Game list --- -#if defined(LilyGo_T5S3_EPaper_Pro) - int y = 18; - int lineH = 16; - - for (int i = 0; i < NUM_GAMES; i++) { - bool selected = (i == _cursor); - - if (selected) { - // Highlight bar - display.setColor(DisplayDriver::LIGHT); - display.fillRect(0, y - 1, display.width(), lineH); - display.setColor(DisplayDriver::DARK); - } else { - display.setColor(DisplayDriver::LIGHT); - } - - display.drawTextCentered(display.width() / 2, y + 2, getGames()[i].name); - - y += lineH; - } -#else // T-Deck Pro / MAX: rows follow the user's font size and style, the same // way the channel picker does (NodePrefs font helpers). NodePrefs* prefs = the_mesh.getNodePrefs(); @@ -165,36 +140,24 @@ public: y += lineH; } -#endif // --- Footer --- display.setColor(DisplayDriver::LIGHT); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.setTextSize(0); - display.drawTextCentered(display.width() / 2, display.height() - 8, "Tap to select"); - display.setTextSize(1); -#else display.setTextSize(1); int fy = display.height() - 12; display.drawRect(0, fy - 2, display.width(), 1); display.setCursor(2, fy); display.print("Enter:Play Q:Back"); -#endif return 5000; // Static menu -- slow refresh } - // --- Touch: tap to select game entry (T5S3 and T-Deck Pro / MAX) --- + // --- Touch: tap to select game entry (T-Deck Pro / MAX) --- int selectRowAtVY(int vy) { -#if defined(LilyGo_T5S3_EPaper_Pro) - int y = 18; - int lineH = 16; -#else // Must match the render geometry above (NodePrefs font helpers). NodePrefs* prefs = the_mesh.getNodePrefs(); int lineH = prefs->smallLineH(); int y = 14 + prefs->smallHighlightOff(); -#endif if (vy < y) return 0; // Above list int row = (vy - y) / lineH; if (row >= NUM_GAMES) return 0; // Below list diff --git a/examples/companion_radio/ui-new/HomeIcons.h b/examples/companion_radio/ui-new/HomeIcons.h index 500bd61c..82d9af6a 100644 --- a/examples/companion_radio/ui-new/HomeIcons.h +++ b/examples/companion_radio/ui-new/HomeIcons.h @@ -1,6 +1,6 @@ #pragma once // ============================================================================= -// HomeIcons -- 12x12 icon sprites for T5S3 home screen tiles +// HomeIcons -- 12x12 icon sprites for home screen tiles // MSB-first, 2 bytes per row (same format as emoji sprites) // ============================================================================= diff --git a/examples/companion_radio/ui-new/LastHeardScreen.h b/examples/companion_radio/ui-new/LastHeardScreen.h index 3c2f27e7..39107c3f 100644 --- a/examples/companion_radio/ui-new/LastHeardScreen.h +++ b/examples/companion_radio/ui-new/LastHeardScreen.h @@ -74,11 +74,7 @@ public: int selectRowAtVY(int vy) { if (_count == 0) return 0; const int headerH = 14, footerH = 14, lineH = the_mesh.getNodePrefs()->smallLineH(); -#if defined(LilyGo_T5S3_EPaper_Pro) - const int bodyTop = headerH; -#else const int bodyTop = headerH + the_mesh.getNodePrefs()->smallHighlightOff(); -#endif if (vy < bodyTop || vy >= 128 - footerH) return 0; int maxVisible = (128 - headerH - footerH) / lineH; @@ -149,11 +145,7 @@ public: // Highlight selected row if (selected) { display.setColor(DisplayDriver::LIGHT); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.fillRect(0, y, display.width(), lineHeight); -#else display.fillRect(0, y + the_mesh.getNodePrefs()->smallHighlightOff(), display.width(), lineHeight); -#endif display.setColor(DisplayDriver::DARK); } else { display.setColor(DisplayDriver::LIGHT); @@ -207,17 +199,10 @@ public: display.setColor(DisplayDriver::YELLOW); display.setCursor(0, footerY); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.print("Swipe:Scroll"); - const char* right = "Tap:Add/Del"; - display.setCursor(display.width() - display.getTextWidth(right) - 2, footerY); - display.print(right); -#else display.print("Q:Bk"); const char* right = "Tap/Ent:Add/Del"; display.setCursor(display.width() - display.getTextWidth(right) - 2, footerY); display.print(right); -#endif return 5000; // refresh every 5s to update ages } diff --git a/examples/companion_radio/ui-new/MeckFonts.h b/examples/companion_radio/ui-new/MeckFonts.h index 209dbffa..23e5bada 100644 --- a/examples/companion_radio/ui-new/MeckFonts.h +++ b/examples/companion_radio/ui-new/MeckFonts.h @@ -9,7 +9,7 @@ // Place this file in: examples/companion_radio/ui-new/ // Place font .h files in: examples/companion_radio/ui-new/fonts/ // -// Both GxEPDDisplay.h and FastEPDDisplay.h include this file. +// GxEPDDisplay.h includes this file. // The -I examples/companion_radio/ui-new flag (already in platformio.ini) // makes everything resolve. // --------------------------------------------------------------------------- @@ -38,24 +38,18 @@ static inline const char* meckFontStyleName(uint8_t style) { // --------------------------------------------------------------------------- #include "fonts/NotoSans7pt7b.h" #include "fonts/NotoSans9pt8b.h" -#include "fonts/NotoSans12pt8b.h" #include "fonts/NotoSansBold7pt7b.h" #include "fonts/NotoSansBold9pt7b.h" #include "fonts/NotoSansBold12pt7b.h" -#include "fonts/NotoSansBold18pt7b.h" -#include "fonts/NotoSansBold24pt7b.h" // --------------------------------------------------------------------------- // Font includes — Montserrat family // --------------------------------------------------------------------------- #include "fonts/Montserrat7pt7b.h" #include "fonts/Montserrat9pt7b.h" -#include "fonts/Montserrat12pt7b.h" #include "fonts/MontserratBold7pt7b.h" #include "fonts/MontserratBold9pt8b.h" #include "fonts/MontserratBold12pt8b.h" -#include "fonts/MontserratBold18pt7b.h" -#include "fonts/MontserratBold24pt7b.h" // --------------------------------------------------------------------------- // T-Deck Pro font lookup (240×320, GxEPD2) @@ -74,7 +68,6 @@ static inline const char* meckFontStyleName(uint8_t style) { // Classic 9pt=22, Noto 9pt=24, Montserrat 9pt=21 — close enough // Classic 12ptB=29, Noto 12ptB=32, Montserrat 12ptB=29 — close // --------------------------------------------------------------------------- -#if !defined(LilyGo_T5S3_EPaper_Pro) static inline const GFXfont* meckGetFont_TDeckPro(uint8_t style, int textSize) { // Classic — return NULL to let display driver use its defaults @@ -102,56 +95,6 @@ static inline const GFXfont* meckGetFont_TDeckPro(uint8_t style, int textSize) { } } -#endif // !LilyGo_T5S3_EPaper_Pro - -// --------------------------------------------------------------------------- -// T5S3 font lookup (960×540, FastEPD) -// --------------------------------------------------------------------------- -// Metric-matched to existing FreeSans sizes so virtual-coordinate layouts -// stay intact. The larger Noto/Montserrat sizes (18-26pt) are available in -// the fonts/ directory for a future T5S3 layout rework. -// -// textSize values used by Meck screens: -// 0 = body (12pt regular) -// 1 = heading (12pt bold) -// 2 = large bold (18pt bold) -// 3 = extra large (24pt bold) -// 5 = clock face (24pt bold ×5 scaling) -// -// yAdvance reference (physical pixels): -// FreeSans12pt=29, Noto12pt=32, Montserrat12pt=29 -// FreeSansBold18pt=42, NotoBold18pt=48, MontBold18pt=43 -// FreeSansBold24pt=56, NotoBold24pt=64, MontBold24pt=57 -// --------------------------------------------------------------------------- -#if defined(LilyGo_T5S3_EPaper_Pro) - -static inline const GFXfont* meckGetFont_T5S3(uint8_t style, int textSize) { - if (style == MECK_FONT_CLASSIC) return nullptr; - - if (style == MECK_FONT_NOTO) { - switch (textSize) { - case 0: return &NotoSans12pt8b; - case 1: return &NotoSans_Bold12pt7b; - case 2: return &NotoSans_Bold18pt7b; - case 3: return &NotoSans_Bold24pt7b; - case 5: return &NotoSans_Bold24pt7b; // caller applies x5 scale - default: return &NotoSans12pt8b; - } - } - - // MECK_FONT_MONTSERRAT - switch (textSize) { - case 0: return &Montserrat_Regular12pt7b; - case 1: return &MontserratBold12pt8b; - case 2: return &Montserrat_Bold18pt7b; - case 3: return &Montserrat_Bold24pt7b; - case 5: return &Montserrat_Bold24pt7b; // caller applies x5 scale - default: return &Montserrat_Regular12pt7b; - } -} - -#endif // LilyGo_T5S3_EPaper_Pro - // --------------------------------------------------------------------------- // Unified lookup — called from display driver setTextSize() // --------------------------------------------------------------------------- @@ -160,9 +103,5 @@ static inline const GFXfont* meckGetFont_T5S3(uint8_t style, int textSize) { // (FreeSans for Classic style, or built-in 6×8 for textSize 0). // --------------------------------------------------------------------------- static inline const GFXfont* meckGetFont(uint8_t style, int textSize) { -#if defined(LilyGo_T5S3_EPaper_Pro) - return meckGetFont_T5S3(style, textSize); -#else return meckGetFont_TDeckPro(style, textSize); -#endif } \ No newline at end of file diff --git a/examples/companion_radio/ui-new/MinesweeperScreen.h b/examples/companion_radio/ui-new/MinesweeperScreen.h index d80e3b86..cd6b6943 100644 --- a/examples/companion_radio/ui-new/MinesweeperScreen.h +++ b/examples/companion_radio/ui-new/MinesweeperScreen.h @@ -4,12 +4,10 @@ // MinesweeperScreen -- Classic Minesweeper for Meck e-ink devices // // 9x9 grid, 10 mines (classic Beginner difficulty) on T-Deck Pro. -// 14x14 grid, 25 mines on T5S3 (fills the larger virtual display). // First reveal is always safe -- mines are placed after the first click. // Fully turn-based: no tick timer, renders only on input. Perfect for e-ink. // // T-Deck Pro: 14x14 pixel cells (126x126 grid area on 240x320 display) -// T5S3: 14x14 grid at 8x8 pixel cells (112x112 on 128x128 virtual display) // ============================================================================= #include @@ -19,15 +17,7 @@ class UITask; // -- Grid and cell parameters per platform -- -#if defined(LilyGo_T5S3_EPaper_Pro) - #define MINE_GRID_W 14 - #define MINE_GRID_H 14 - #define MINE_COUNT 25 - #define MINE_CELL_W 8 - #define MINE_CELL_H 8 - #define MINE_HDR 14 - #define MINE_FTR 10 -#elif defined(LilyGo_TDeck_Pro_Max) +#if defined(LilyGo_TDeck_Pro_Max) // MAX renders into a 128x128 virtual canvas with non-uniform scaling // (X 1.875, Y 2.5) and a (2,5) virtual offset applied by GxEPDDisplay. // Cells are 8x6 virtual so they land square on the panel (8*1.875 = 6*2.5 @@ -60,13 +50,10 @@ class UITask; // Cell-text size + vertical nudge. GxEPDDisplay::setCursor adds a +5 baseline // fudge sized for the tall FreeSans fonts; for the small built-in (size 0) // font on MAX that lands the glyph at the cell's bottom edge, so it needs a -// negative nudge to sit centred. T5S3 (FastEPD, no fudge) and Pro are unchanged. +// negative nudge to sit centred. Pro is unchanged. #if defined(LilyGo_TDeck_Pro_Max) #define MINE_TEXT_SIZE 0 #define MINE_TEXT_DY (-3) -#elif defined(LilyGo_T5S3_EPaper_Pro) - #define MINE_TEXT_SIZE 0 - #define MINE_TEXT_DY 1 #else #define MINE_TEXT_SIZE 1 #define MINE_TEXT_DY 3 @@ -385,12 +372,8 @@ public: if (_state == READY) { // --- READY: header + instructions + footer --- display.setColor(DisplayDriver::GREEN); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.drawTextCentered(display.width() / 2, 2, "Minesweeper"); -#else display.setCursor(2, 2); display.print("Minesweeper"); -#endif display.setColor(DisplayDriver::LIGHT); display.drawRect(0, MINE_HDR - 2, display.width(), 1); @@ -400,39 +383,25 @@ public: display.drawTextCentered(cx, y, "Minesweeper"); y += 16; display.setColor(DisplayDriver::GREEN); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.drawTextCentered(cx, y, "Swipe to move cursor"); - y += 11; - display.drawTextCentered(cx, y, "Tap to reveal"); - y += 11; - display.drawTextCentered(cx, y, "Long press to flag"); -#else display.drawTextCentered(cx, y, "W/S/A/D to move cursor"); y += 11; display.drawTextCentered(cx, y, "Enter to reveal a cell"); y += 11; display.drawTextCentered(cx, y, "F to flag a mine"); -#endif y += 16; display.setColor(DisplayDriver::LIGHT); char info[32]; snprintf(info, sizeof(info), "%dx%d grid, %d mines", MINE_GRID_W, MINE_GRID_H, MINE_COUNT); display.drawTextCentered(cx, y, info); y += 16; -#if defined(LilyGo_T5S3_EPaper_Pro) - display.drawTextCentered(cx, y, "Tap to start"); -#else display.drawTextCentered(cx, y, "Press Enter to start"); -#endif // Footer display.setColor(DisplayDriver::LIGHT); -#if !defined(LilyGo_T5S3_EPaper_Pro) int fy = display.height() - 12; display.drawRect(0, fy - 2, display.width(), 1); display.setCursor(2, fy); display.print("Enter:Start Sh+Del:Back"); -#endif return 5000; } else if (_state == PLAYING) { diff --git a/examples/companion_radio/ui-new/NotesScreen.h b/examples/companion_radio/ui-new/NotesScreen.h index 4c44513f..28ada5a8 100644 --- a/examples/companion_radio/ui-new/NotesScreen.h +++ b/examples/companion_radio/ui-new/NotesScreen.h @@ -503,11 +503,7 @@ private: int rightX = display.width() - display.getTextWidth(tmp) - 2; if (_selectedFile >= 1 && _selectedFile <= (int)_fileList.size()) { -#if defined(LilyGo_T5S3_EPaper_Pro) - const char* hint = "[Hold:Rename]"; -#else const char* hint = "[R:Rename]"; -#endif int hintX = rightX - display.getTextWidth(hint) - 4; display.setCursor(hintX, 0); display.setColor(DisplayDriver::YELLOW); @@ -539,11 +535,7 @@ private: if (selected) { display.setColor(DisplayDriver::LIGHT); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.fillRect(0, y, display.width(), listLineH); -#else display.fillRect(0, y + _prefs->smallHighlightOff(), display.width(), listLineH); -#endif display.setColor(DisplayDriver::DARK); } else { display.setColor(DisplayDriver::LIGHT); @@ -567,13 +559,8 @@ private: display.drawRect(0, footerY - 2, display.width(), 1); display.setCursor(0, footerY); display.setColor(DisplayDriver::YELLOW); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.print("Swipe:Nav"); - const char* right = "Tap:Open"; -#else display.print("Q:Bk"); const char* right = "Tap/Ent:Open"; -#endif display.setCursor(display.width() - display.getTextWidth(right) - 2, footerY); display.print(right); } @@ -589,13 +576,8 @@ private: display.drawRect(0, footerY - 2, display.width(), 1); display.setColor(DisplayDriver::YELLOW); display.setCursor(0, footerY); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.print("Tap:Edit"); - const char* right = "Hold:Delete"; -#else display.print("Q:Bk Ent:Edit"); const char* right = "X:Delete"; -#endif display.setCursor(display.width() - display.getTextWidth(right) - 2, footerY); display.print(right); return; @@ -680,15 +662,9 @@ private: display.setColor(DisplayDriver::YELLOW); display.setCursor(0, footerY); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.print("Swipe:Page"); - - const char* right = "Tap:Edit"; -#else display.print("Q:Bk Ent:Edit"); const char* right = "X:Delete"; -#endif display.setCursor(display.width() - display.getTextWidth(right) - 2, footerY); display.print(right); } @@ -789,25 +765,11 @@ private: snprintf(status, sizeof(status), "Pg %d/%d", curPage, totalPg); display.print(status); -#if defined(LilyGo_T5S3_EPaper_Pro) - const char* mid = "Tap:Type"; - display.setCursor((display.width() - display.getTextWidth(mid)) / 2, footerY); - display.print(mid); -#endif - const char* right; if (_bufLen == 0 || !_dirty) { -#if defined(LilyGo_T5S3_EPaper_Pro) - right = "Back"; -#else right = "Q:Back"; -#endif } else { -#if defined(LilyGo_T5S3_EPaper_Pro) - right = "Hold:Save"; -#else right = "Sh+Del:Save"; -#endif } display.setCursor(display.width() - display.getTextWidth(right) - 2, footerY); display.print(right); @@ -854,13 +816,8 @@ private: display.drawRect(0, footerY - 2, display.width(), 1); display.setColor(DisplayDriver::YELLOW); display.setCursor(0, footerY); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.print("Boot:Cancel"); - const char* right = "Tap:Confirm"; -#else display.print("Q:Cancel"); const char* right = "Ent:Confirm"; -#endif display.setCursor(display.width() - display.getTextWidth(right) - 2, footerY); display.print(right); } @@ -893,13 +850,8 @@ private: display.drawRect(0, footerY - 2, display.width(), 1); display.setColor(DisplayDriver::YELLOW); display.setCursor(0, footerY); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.print("Boot:Cancel"); - const char* right = "Tap:Delete"; -#else display.print("Q:Cancel"); const char* right = "Ent:Delete"; -#endif display.setCursor(display.width() - display.getTextWidth(right) - 2, footerY); display.print(right); } @@ -1240,11 +1192,7 @@ public: if (_mode != FILE_LIST) return 0; const int startY = 14, footerH = 14; const int listLineH = _prefs ? _prefs->smallLineH() : 9; -#if defined(LilyGo_T5S3_EPaper_Pro) - const int bodyTop = startY; -#else const int bodyTop = startY + (_prefs ? _prefs->smallHighlightOff() : 5); -#endif if (vy < bodyTop || vy >= 128 - footerH) return 0; int totalItems = 1 + (int)_fileList.size(); diff --git a/examples/companion_radio/ui-new/PathEditorScreen.h b/examples/companion_radio/ui-new/PathEditorScreen.h index fc763d77..358f807e 100644 --- a/examples/companion_radio/ui-new/PathEditorScreen.h +++ b/examples/companion_radio/ui-new/PathEditorScreen.h @@ -281,11 +281,7 @@ public: if (selected) { display.setColor(DisplayDriver::LIGHT); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.fillRect(0, y, display.width(), lineH); -#else display.fillRect(0, y + 5, display.width(), lineH); -#endif display.setColor(DisplayDriver::DARK); } else { display.setColor(DisplayDriver::LIGHT); @@ -377,19 +373,11 @@ public: display.drawRect(0, footerY - 2, display.width(), 1); display.setColor(DisplayDriver::YELLOW); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.setCursor(0, footerY); - display.print("Swipe:Nav"); - const char* right = "Hold:Select"; - display.setCursor(display.width() - display.getTextWidth(right) - 2, footerY); - display.print(right); -#else display.setCursor(0, footerY); display.print("Q:Bk W/S:Nav"); const char* right = "Enter:Sel"; display.setCursor(display.width() - display.getTextWidth(right) - 2, footerY); display.print(right); -#endif return 5000; } @@ -435,11 +423,7 @@ public: if (selected) { display.setColor(DisplayDriver::LIGHT); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.fillRect(0, y, display.width(), lineH); -#else display.fillRect(0, y + 5, display.width(), lineH); -#endif display.setColor(DisplayDriver::DARK); } else { display.setColor(DisplayDriver::LIGHT); @@ -466,19 +450,11 @@ public: display.drawRect(0, footerY - 2, display.width(), 1); display.setColor(DisplayDriver::YELLOW); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.setCursor(0, footerY); - display.print("Swipe:Scroll"); - const char* right = "Hold:Add Back:Cancel"; - display.setCursor(display.width() - display.getTextWidth(right) - 2, footerY); - display.print(right); -#else display.setCursor(0, footerY); display.print("Q:Cancel W/S:Scroll"); const char* right = "Enter:Add"; display.setCursor(display.width() - display.getTextWidth(right) - 2, footerY); display.print(right); -#endif return 5000; } @@ -646,7 +622,7 @@ public: return false; } - // Tap-to-select for T5S3 touch + // Tap-to-select for touch int selectRowAtVY(int vy) { if (_state == STATE_PICK_HOP) { return selectPickerRowAtVY(vy); @@ -657,11 +633,7 @@ public: int selectMainRowAtVY(int vy) { if (_menuCount == 0) return 0; const int headerH = 14, footerH = 14, lineH = 9; -#if defined(LilyGo_T5S3_EPaper_Pro) - const int bodyTop = headerH; -#else const int bodyTop = headerH + 5; -#endif if (vy < bodyTop || vy >= 128 - footerH) return 0; int maxVisible = (128 - headerH - footerH) / lineH; @@ -679,11 +651,7 @@ public: int selectPickerRowAtVY(int vy) { if (_repCount == 0) return 0; const int headerH = 14, footerH = 14, lineH = 9; -#if defined(LilyGo_T5S3_EPaper_Pro) - const int bodyTop = headerH; -#else const int bodyTop = headerH + 5; -#endif if (vy < bodyTop || vy >= 128 - footerH) return 0; int maxVisible = (128 - headerH - footerH) / lineH; diff --git a/examples/companion_radio/ui-new/RepeaterAdminScreen.h b/examples/companion_radio/ui-new/RepeaterAdminScreen.h index 7321dbc5..f729e210 100644 --- a/examples/companion_radio/ui-new/RepeaterAdminScreen.h +++ b/examples/companion_radio/ui-new/RepeaterAdminScreen.h @@ -636,77 +636,41 @@ public: switch (_state) { case STATE_PASSWORD_ENTRY: -#if defined(LilyGo_T5S3_EPaper_Pro) - display.print("Boot:Exit"); - renderFooterRight(display, footerY, "Hold:Type"); -#else display.print("Sh+Del:Exit"); renderFooterRight(display, footerY, "Ent:Login"); -#endif break; case STATE_LOGGING_IN: case STATE_COMMAND_PENDING: -#if defined(LilyGo_T5S3_EPaper_Pro) - display.print("Boot:Cancel"); -#else display.print("Q:Cancel"); -#endif break; case STATE_CATEGORY_MENU: -#if defined(LilyGo_T5S3_EPaper_Pro) - display.print("Boot:Exit"); - renderFooterMidRight(display, footerY, "Back:Exit", "Tap:Open", "Swipe:Sel"); -#else display.print("Q:Exit"); renderFooterMidRight(display, footerY, "Q:Exit", "Ent:Open", "W/S:Sel"); -#endif break; case STATE_COMMAND_MENU: -#if defined(LilyGo_T5S3_EPaper_Pro) - display.print("Boot:Back"); - renderFooterMidRight(display, footerY, "Back:Back", "Tap:Run", "Swipe:Sel"); -#else display.print("Q:Back"); renderFooterMidRight(display, footerY, "Q:Back", "Ent:Run", "W/S:Sel"); -#endif break; case STATE_PARAM_ENTRY: -#if defined(LilyGo_T5S3_EPaper_Pro) - display.print("Boot:Cancel"); - renderFooterRight(display, footerY, "Tap:Send"); -#else display.print("Sh+Del:Cancel"); renderFooterRight(display, footerY, "Ent:Send"); -#endif break; case STATE_CONFIRM: -#if defined(LilyGo_T5S3_EPaper_Pro) - display.print("Boot:No"); - renderFooterRight(display, footerY, "Tap:Yes"); -#else display.print("Q:No"); renderFooterRight(display, footerY, "Ent:Yes"); -#endif break; case STATE_RESPONSE_VIEW: case STATE_ERROR: -#if defined(LilyGo_T5S3_EPaper_Pro) - display.print("Boot:Back"); - if (_responseTotalLines > bodyHeight / 9) { - renderFooterRight(display, footerY, "Swipe:Scroll"); - } -#else display.print("Q:Back"); if (_responseTotalLines > bodyHeight / 9) { renderFooterRight(display, footerY, "W/S:Scrll"); } -#endif break; } @@ -1076,11 +1040,7 @@ private: if (_pendingCmd && (_pendingCmd->flags & CMDF_EXPECT_TIMEOUT)) { display.print("Timeout response is normal."); } else { -#if defined(LilyGo_T5S3_EPaper_Pro) - display.print("Tap=Yes Back=No"); -#else display.print("Enter=Yes Q=No"); -#endif } display.setTextSize(1); @@ -1199,11 +1159,7 @@ private: bool selected, const char* label, bool warn) { if (selected) { display.setColor(DisplayDriver::LIGHT); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.fillRect(0, y, display.width(), lineHeight); -#else display.fillRect(0, y + the_mesh.getNodePrefs()->smallHighlightOff(), display.width(), lineHeight); -#endif display.setColor(DisplayDriver::DARK); } else if (warn) { display.setColor(DisplayDriver::YELLOW); @@ -1253,7 +1209,7 @@ inline bool RepeaterAdminScreen::doLogin() { _state = STATE_LOGGING_IN; _cmdSentAt = millis(); // Add a 5s buffer over the mesh estimate to account for blocking e-ink - // refreshes (FastEPD ~1-2s per frame, VKB dismiss + login render = 2-3 frames). + // refreshes. // Fall back to ADMIN_TIMEOUT_MS if the estimate came back zero. _loginTimeoutMs = (timeout_ms > 0) ? timeout_ms + 5000 : ADMIN_TIMEOUT_MS; _waitingForLogin = true; diff --git a/examples/companion_radio/ui-new/RxLogScreen.h b/examples/companion_radio/ui-new/RxLogScreen.h index 7d3e72c8..c09a2009 100644 --- a/examples/companion_radio/ui-new/RxLogScreen.h +++ b/examples/companion_radio/ui-new/RxLogScreen.h @@ -184,11 +184,7 @@ public: display.drawRect(0, footerY - 2, display.width(), 1); display.setColor(DisplayDriver::YELLOW); display.setCursor(0, footerY); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.print("Swipe:Scroll"); -#else display.print("Q:Bk W/S:Scroll"); -#endif return 5000; // refresh every 5s to pick up newly received packets } diff --git a/examples/companion_radio/ui-new/SettingsScreen.h b/examples/companion_radio/ui-new/SettingsScreen.h index a2a05928..257b8f78 100644 --- a/examples/companion_radio/ui-new/SettingsScreen.h +++ b/examples/companion_radio/ui-new/SettingsScreen.h @@ -12,11 +12,7 @@ #endif // Inline edit hint shown next to values being adjusted -#if defined(LilyGo_T5S3_EPaper_Pro) - #define EDIT_ADJ_HINT "" -#else #define EDIT_ADJ_HINT "" -#endif #ifdef HAS_4G_MODEM #include "ModemManager.h" @@ -146,10 +142,7 @@ enum SettingsRowType : uint8_t { ROW_DARK_MODE, // Dark mode toggle (inverted display) ROW_LARGE_FONT, // Font size toggle: 0=tiny (default), 1=larger ROW_FONT_STYLE, // Font style: Classic / Noto Sans / Montserrat -#if defined(LilyGo_T5S3_EPaper_Pro) - ROW_PORTRAIT_MODE, // Portrait orientation toggle -#endif -#if defined(LilyGo_T5S3_EPaper_Pro) || defined(LilyGo_TDeck_Pro) +#if defined(LilyGo_TDeck_Pro) ROW_AUTO_LOCK, // Auto-lock timeout picker (None/2/5/10/15/30 min) #endif ROW_GPS_BAUD, // GPS baud rate picker (requires reboot) @@ -346,9 +339,6 @@ private: // Dirty flag for radio params — prompt to apply bool _radioChanged; - // T5S3: signal UITask to open VKB when entering text edit mode - bool _needsTextVKB; - bool _needsCannedVKB; // T5S3: open VKB for a canned slot (full-length path) bool _wantsWatchChannels; // Watch: hand off to WatchChannelConfigScreen (polled by UITask) // 4G modem state (runtime cache of config) @@ -372,9 +362,6 @@ private: char _wifiPassBuf[64]; int _wifiPassLen; unsigned long _wifiFormLastChar; // For brief password reveal -#if defined(LilyGo_T5S3_EPaper_Pro) - bool _wifiNeedsVKB; // T5S3: signal UITask to open VKB for password -#endif #endif #ifdef MECK_OTA_UPDATE @@ -511,7 +498,7 @@ private: addRow(ROW_UTC_OFFSET); #if defined(LilyGo_TDeck_Pro_Max) // Canned messages are Max-only for now: the send trigger is the Max's - // speech-bubble capacitive pad, and no Pro/T5S3 trigger is wired. The + // speech-bubble capacitive pad, and no Pro trigger is wired. The // NodePrefs storage stays shared so the prefs layout is uniform. addRow(ROW_CANNED_SUBMENU); #endif @@ -526,14 +513,9 @@ private: addRow(ROW_PATH_HASH_SIZE); addRow(ROW_DEFAULT_SCOPE); addRow(ROW_DARK_MODE); -#if !defined(LILYGO_TECHO_LITE) addRow(ROW_LARGE_FONT); addRow(ROW_FONT_STYLE); -#endif -#if defined(LilyGo_T5S3_EPaper_Pro) - addRow(ROW_PORTRAIT_MODE); -#endif -#if defined(LilyGo_T5S3_EPaper_Pro) || defined(LilyGo_TDeck_Pro) +#if defined(LilyGo_TDeck_Pro) addRow(ROW_AUTO_LOCK); #endif #ifdef MECK_WIFI_COMPANION @@ -714,7 +696,7 @@ public: _editMode(EDIT_NONE), _editPos(0), _editPickerIdx(0), _editFloat(0), _editInt(0), _fontPickerOriginal(0), _confirmAction(0), _onboarding(false), _subScreen(SUB_NONE), _savedTopCursor(0), - _radioChanged(false), _needsTextVKB(false), _needsCannedVKB(false), + _radioChanged(false), _cannedPos(0), _cannedEditSlot(0), _wantsWatchChannels(false) { memset(_editBuf, 0, sizeof(_editBuf)); #ifdef HAS_SDCARD @@ -772,9 +754,6 @@ public: _wifiPassLen = 0; memset(_wifiPassBuf, 0, sizeof(_wifiPassBuf)); _wifiFormLastChar = 0; - #if defined(LilyGo_T5S3_EPaper_Pro) - _wifiNeedsVKB = false; - #endif #endif rebuildRows(); } @@ -804,12 +783,8 @@ public: if (_editMode != EDIT_NONE) return 0; // Don't change cursor while editing const int headerH = 14, footerH = 14, lineH = _prefs->smallLineH(); // bodyTop must match where the visual rows start (highlight bar position). - // T5S3 renders highlight at y directly. T-Deck Pro offsets by smallHighlightOff(). -#if defined(LilyGo_T5S3_EPaper_Pro) - const int bodyTop = headerH; -#else + // T-Deck Pro offsets by smallHighlightOff(). const int bodyTop = headerH + _prefs->smallHighlightOff(); -#endif if (vy < bodyTop || vy >= 128 - footerH) return 0; // Outside body area int maxVisible = (128 - headerH - footerH) / lineH; @@ -898,78 +873,10 @@ public: return _editMode == EDIT_WIFI && _wifiPhase == WIFI_PHASE_SELECT; } -#if defined(LilyGo_T5S3_EPaper_Pro) - // T5S3 VKB integration — UITask polls this to open the virtual keyboard - // when settings enters WiFi password phase (no physical keyboard available). - bool needsWifiVKB() const { return _wifiNeedsVKB; } - void clearWifiNeedsVKB() { _wifiNeedsVKB = false; } - - // Called by UITask::onVKBSubmit with the password text from VKB. - // Fills the password buffer and triggers the WiFi connect sequence. - void submitWifiPassword(const char* pass) { - _wifiNeedsVKB = false; - int len = strlen(pass); - if (len > 63) len = 63; - memcpy(_wifiPassBuf, pass, len); - _wifiPassBuf[len] = '\0'; - _wifiPassLen = len; - - // Trigger the same connect sequence as pressing Enter in password phase - _wifiPhase = WIFI_PHASE_CONNECTING; - - // Save credentials to SD (so web reader can reuse them) - if (SD.exists("/web") || SD.mkdir("/web")) { - File f = SD.open("/web/wifi.cfg", FILE_WRITE); - if (f) { - f.println(_wifiSSIDs[_wifiSSIDSelected]); - f.println(_wifiPassBuf); - f.close(); - } - digitalWrite(SDCARD_CS, HIGH); - } - - WiFi.disconnect(false); - WiFi.begin(_wifiSSIDs[_wifiSSIDSelected].c_str(), _wifiPassBuf); - - // Brief blocking wait — fine for e-ink - unsigned long timeout = millis() + 8000; - while (WiFi.status() != WL_CONNECTED && millis() < timeout) { - delay(100); - } - - if (WiFi.status() == WL_CONNECTED) { - Serial.printf("Settings VKB: WiFi connected to %s, IP: %s\n", - _wifiSSIDs[_wifiSSIDSelected].c_str(), - WiFi.localIP().toString().c_str()); - _editMode = EDIT_NONE; - _wifiPhase = WIFI_PHASE_IDLE; - if (_onboarding) _onboarding = false; - } else { - Serial.println("Settings VKB: WiFi connection failed"); - _wifiPhase = WIFI_PHASE_SELECT; // Back to SSID list to retry - } - } -#endif - #endif - // T5S3 VKB integration for text editing (channel name, device name, freq, APN) - bool needsTextVKB() const { return _needsTextVKB; } - void clearTextNeedsVKB() { _needsTextVKB = false; } bool wantsWatchChannels() const { return _wantsWatchChannels; } void clearWantsWatchChannels() { _wantsWatchChannels = false; } - const char* getEditBuf() const { return _editBuf; } - bool needsCannedVKB() const { return _needsCannedVKB; } - void clearCannedNeedsVKB() { _needsCannedVKB = false; } - const char* getCannedBuf() const { return _cannedBuf; } - SettingsRowType getCurrentRowType() const { return _rows[_cursor].type; } - void submitEditText(const char* text) { - strncpy(_editBuf, text, SETTINGS_TEXT_BUF - 1); - _editBuf[SETTINGS_TEXT_BUF - 1] = '\0'; - _editPos = strlen(_editBuf); - // Simulate Enter to confirm the edit through the normal path - handleInput('\r'); - } // Export/Import request flags — checked and cleared by main.cpp #ifdef HAS_SDCARD @@ -1253,8 +1160,8 @@ public: } // Called from main loop — detect upload completion and trigger flash. - // Must be called from the main loop (not render) because T5S3 FastEPD - // blocks for 500ms+ per frame, making render-only detection unreliable. + // Must be called from the main loop (not render) because an e-ink refresh + // blocks the render, making render-only detection unreliable. void checkOTAComplete(DisplayDriver& display) { if (_editMode != EDIT_OTA) return; if (!_otaUploadOk) return; @@ -1763,9 +1670,6 @@ public: strncpy(_editBuf, initial, SETTINGS_TEXT_BUF - 1); _editBuf[SETTINGS_TEXT_BUF - 1] = '\0'; _editPos = strlen(_editBuf); -#if defined(LilyGo_T5S3_EPaper_Pro) - _needsTextVKB = true; // Signal UITask to open virtual keyboard -#endif } // Canned slot edit: full-length buffer, bypasses the 32-char _editBuf. @@ -1776,18 +1680,6 @@ public: strncpy(_cannedBuf, _prefs->canned_msgs[slot], CANNED_MSG_LEN - 1); _cannedBuf[CANNED_MSG_LEN - 1] = '\0'; _cannedPos = strlen(_cannedBuf); -#if defined(LilyGo_T5S3_EPaper_Pro) - _needsCannedVKB = true; // Signal UITask to open the virtual keyboard -#endif - } - - // T5S3 VKB return path for canned slots: commit the full-length text - // directly (empty clears the slot) through the normal Enter path. - void submitCannedText(const char* text) { - strncpy(_cannedBuf, text ? text : "", CANNED_MSG_LEN - 1); - _cannedBuf[CANNED_MSG_LEN - 1] = '\0'; - _cannedPos = strlen(_cannedBuf); - handleInput('\r'); } void startEditPicker(int initialIdx) { @@ -1863,13 +1755,7 @@ public: // Selection highlight if (selected) { display.setColor(DisplayDriver::LIGHT); -#if defined(LilyGo_T5S3_EPaper_Pro) - // FreeSans12pt: baseline at (y+5)*scale_y, ascent ~17px above. - // Highlight needs to start above the baseline to cover ascenders. - display.fillRect(0, y, display.width() - sbW, lineHeight); -#else display.fillRect(0, y + _prefs->smallHighlightOff(), display.width() - sbW, lineHeight); -#endif display.setColor(DisplayDriver::DARK); } else { display.setColor(DisplayDriver::LIGHT); @@ -2048,15 +1934,7 @@ public: display.print(tmp); break; -#if defined(LilyGo_T5S3_EPaper_Pro) - case ROW_PORTRAIT_MODE: - snprintf(tmp, sizeof(tmp), "Portrait Mode: %s", - _prefs->portrait_mode ? "ON" : "OFF"); - display.print(tmp); - break; -#endif - -#if defined(LilyGo_T5S3_EPaper_Pro) || defined(LilyGo_TDeck_Pro) +#if defined(LilyGo_TDeck_Pro) case ROW_AUTO_LOCK: if (editing && _editMode == EDIT_PICKER) { snprintf(tmp, sizeof(tmp), "< Auto Lock: %s >", @@ -2239,13 +2117,7 @@ public: const char* nTag = (nPref == NOTIF_NONE) ? "Off" : (nPref == NOTIF_MENTIONS) ? "@" : "All"; char hintBuf[40]; - #if defined(LilyGo_T5S3_EPaper_Pro) - if (chIdx > 0) { - snprintf(hintBuf, sizeof(hintBuf), "Hold:Del"); - } else { - hintBuf[0] = '\0'; // No actionable hints for channel 0 on T5S3 - } - #elif defined(MECK_AUDIO_VARIANT) || defined(HAS_4G_MODEM) + #if defined(MECK_AUDIO_VARIANT) || defined(HAS_4G_MODEM) if (chIdx > 0) { snprintf(hintBuf, sizeof(hintBuf), "N:%s T:Tone X:Del", nTag); } else { @@ -2426,11 +2298,7 @@ public: display.drawTextCentered(display.width() / 2, by + 4, "Region not set."); display.drawTextCentered(display.width() / 2, by + 15, "Leave unset?"); } - #if defined(LilyGo_T5S3_EPaper_Pro) - display.drawTextCentered(display.width() / 2, by + bh - 14, "Tap:Yes Boot:No"); - #else display.drawTextCentered(display.width() / 2, by + bh - 14, "Enter:Yes Q:No"); - #endif display.setTextSize(1); } @@ -2506,13 +2374,8 @@ public: display.setTextSize(1); display.setColor(DisplayDriver::YELLOW); int fy = by + bh - 11; - #if defined(LilyGo_T5S3_EPaper_Pro) - display.setCursor(bx + 4, fy); - display.print("Tap:Pick Boot:Back"); - #else display.setCursor(bx + 4, fy); display.print("Enter:Pick Q:Back"); - #endif // Scroll indicator if (totalItems > maxVisible) { @@ -2567,11 +2430,7 @@ public: bool sel = (wi == _wifiSSIDSelected); if (sel) { display.setColor(DisplayDriver::LIGHT); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.fillRect(bx + 2, wy, bw - 4, 8); -#else display.fillRect(bx + 2, wy + 5, bw - 4, 8); -#endif display.setColor(DisplayDriver::DARK); } else { display.setColor(DisplayDriver::LIGHT); @@ -2847,11 +2706,7 @@ public: // Footer hint display.setColor(DisplayDriver::YELLOW); display.setCursor(bx + 4, by + bh - 12); - #if defined(LilyGo_T5S3_EPaper_Pro) - display.print("Tap:Send Boot:Cancel"); - #else display.print("Enter:Send Q:Cancel"); - #endif display.setTextSize(1); } @@ -2861,102 +2716,6 @@ public: display.setColor(DisplayDriver::YELLOW); display.setCursor(0, footerY); -#if defined(LilyGo_T5S3_EPaper_Pro) - if (_editMode == EDIT_NONE) { - if (_subScreen != SUB_NONE) { - display.print("Boot:Back"); - const char* r; - if (_subScreen == SUB_CHANNELS) r = "Tap:Select Hold:Del"; - #ifdef MECK_OTA_UPDATE - else if (_subScreen == SUB_OTA_TOOLS) r = "Tap:Select"; - #endif - else r = "Tap:Toggle Hold:Edit"; - display.setCursor(display.width() - display.getTextWidth(r) - 2, footerY); - display.print(r); - } else { - display.print("Swipe:Scroll"); - const char* r = "Tap:Toggle Hold:Edit"; - display.setCursor(display.width() - display.getTextWidth(r) - 2, footerY); - display.print(r); - } - } else if (_editMode == EDIT_NUMBER) { - display.print("Swipe:Adjust"); - const char* r = "Tap:OK Boot:Cancel"; - display.setCursor(display.width() - display.getTextWidth(r) - 2, footerY); - display.print(r); - } else if (_editMode == EDIT_PICKER) { - display.print("Swipe:Choose"); - const char* r = "Tap:OK Boot:Cancel"; - display.setCursor(display.width() - display.getTextWidth(r) - 2, footerY); - display.print(r); - } else if (_editMode == EDIT_CONFIRM) { - display.print("Boot:Cancel"); - const char* r = "Tap:Confirm"; - display.setCursor(display.width() - display.getTextWidth(r) - 2, footerY); - display.print(r); - #ifdef MECK_WIFI_COMPANION - } else if (_editMode == EDIT_WIFI) { - if (_wifiPhase == WIFI_PHASE_SELECT) { - display.print("Swipe:Pick"); - const char* r = "Tap:Select Boot:Back"; - display.setCursor(display.width() - display.getTextWidth(r) - 2, footerY); - display.print(r); - } else { - display.print("Please wait..."); - } - #endif - #ifdef MECK_OTA_UPDATE - } else if (_editMode == EDIT_OTA) { - if (_otaPhase == OTA_PHASE_CONFIRM) { - display.print("Boot:Cancel"); - const char* r = "Tap:Start"; - display.setCursor(display.width() - display.getTextWidth(r) - 2, footerY); - display.print(r); - } else if (_otaPhase == OTA_PHASE_WAITING) { - display.print("Boot:Cancel"); - } else if (_otaPhase == OTA_PHASE_ERROR) { - display.print("Boot:Back"); - } else { - display.print("Please wait..."); - } - } else if (_editMode == EDIT_FILEMGR) { - if (_fmPhase == FM_PHASE_CONFIRM) { - display.print("Boot:Cancel"); - const char* r = "Tap:Start"; - display.setCursor(display.width() - display.getTextWidth(r) - 2, footerY); - display.print(r); - } else if (_fmPhase == FM_PHASE_WAITING) { - display.print("Boot:Stop"); - } else if (_fmPhase == FM_PHASE_ERROR) { - display.print("Boot:Back"); - } else { - display.print("Please wait..."); - } - #endif - } else if (_editMode == EDIT_TEXT || _editMode == EDIT_CANNED) { - display.print("Hold:Type"); - const char* r = "Tap:OK Boot:Cancel"; - display.setCursor(display.width() - display.getTextWidth(r) - 2, footerY); - display.print(r); - } else { - display.print("Editing..."); - } -#elif defined(LILYGO_TECHO_LITE) - if (_editMode == EDIT_TEXT || _editMode == EDIT_CANNED) { - display.print("Ent:Ok Sh+Del:Cancel"); - } else if (_editMode == EDIT_PICKER) { - display.print("A/D:Pick Ent:Ok"); - } else if (_editMode == EDIT_NUMBER) { - display.print("W/S:Adj Ent:Ok"); - } else if (_editMode == EDIT_CONFIRM) { - // overlay handles it - } else { - display.print("Q:Bk"); - const char* r = "Ent:Edit"; - display.setCursor(display.width() - display.getTextWidth(r) - 2, footerY); - display.print(r); - } -#else if (_editMode == EDIT_TEXT || _editMode == EDIT_CANNED) { display.print("Type, Enter:Ok Sh+Del:Cancel"); #ifdef MECK_WIFI_COMPANION @@ -3013,7 +2772,6 @@ public: display.setCursor(display.width() - display.getTextWidth(r) - 2, footerY); display.print(r); } -#endif #ifdef MECK_OTA_UPDATE // Poll web server frequently during OTA waiting/receiving or file manager phases @@ -3229,9 +2987,6 @@ public: _wifiPassLen = 0; memset(_wifiPassBuf, 0, sizeof(_wifiPassBuf)); _wifiFormLastChar = 0; -#if defined(LilyGo_T5S3_EPaper_Pro) - _wifiNeedsVKB = true; // Signal UITask to open virtual keyboard -#endif return true; } if (c == KEY_CANCEL || c == 'q') { @@ -3448,7 +3203,7 @@ public: } else if (type == ROW_GPS_BAUD) { _editPickerIdx--; if (_editPickerIdx < 0) _editPickerIdx = GPS_BAUD_OPTION_COUNT - 1; -#if defined(LilyGo_T5S3_EPaper_Pro) || defined(LilyGo_TDeck_Pro) +#if defined(LilyGo_TDeck_Pro) } else if (type == ROW_AUTO_LOCK) { _editPickerIdx--; if (_editPickerIdx < 0) _editPickerIdx = AUTO_LOCK_OPTION_COUNT - 1; @@ -3471,7 +3226,7 @@ public: } else if (type == ROW_GPS_BAUD) { _editPickerIdx++; if (_editPickerIdx >= GPS_BAUD_OPTION_COUNT) _editPickerIdx = 0; -#if defined(LilyGo_T5S3_EPaper_Pro) || defined(LilyGo_TDeck_Pro) +#if defined(LilyGo_TDeck_Pro) } else if (type == ROW_AUTO_LOCK) { _editPickerIdx++; if (_editPickerIdx >= AUTO_LOCK_OPTION_COUNT) _editPickerIdx = 0; @@ -3497,7 +3252,7 @@ public: _editMode = EDIT_NONE; Serial.printf("Settings: GPS baud set to %lu (reboot to apply)\n", (unsigned long)_prefs->gps_baudrate); -#if defined(LilyGo_T5S3_EPaper_Pro) || defined(LilyGo_TDeck_Pro) +#if defined(LilyGo_TDeck_Pro) } else if (type == ROW_AUTO_LOCK) { _prefs->auto_lock_minutes = AUTO_LOCK_OPTIONS[_editPickerIdx]; the_mesh.savePrefs(); @@ -3760,15 +3515,7 @@ public: _fontPickerOriginal = _prefs->ui_font_style; startEditPicker(_prefs->ui_font_style); break; -#if defined(LilyGo_T5S3_EPaper_Pro) - case ROW_PORTRAIT_MODE: - _prefs->portrait_mode = _prefs->portrait_mode ? 0 : 1; - the_mesh.savePrefs(); - Serial.printf("Settings: Portrait mode = %s\n", - _prefs->portrait_mode ? "ON" : "OFF"); - break; -#endif -#if defined(LilyGo_T5S3_EPaper_Pro) || defined(LilyGo_TDeck_Pro) +#if defined(LilyGo_TDeck_Pro) case ROW_AUTO_LOCK: startEditPicker(findAutoLockIndex(_prefs->auto_lock_minutes)); break; diff --git a/examples/companion_radio/ui-new/SnakeScreen.h b/examples/companion_radio/ui-new/SnakeScreen.h index a2a09a6c..a88cd1c0 100644 --- a/examples/companion_radio/ui-new/SnakeScreen.h +++ b/examples/companion_radio/ui-new/SnakeScreen.h @@ -4,7 +4,6 @@ // SnakeScreen -- Classic Nokia-style Snake for Meck e-ink devices // // T-Deck Pro: 8x8 pixel cells on 240x320 display -// T5S3: 4x4 pixel cells on 128x128 virtual display // // The 800ms partial refresh floor naturally produces Nokia-era tick speed. // Snake body stored as circular buffer -- ~1KB, no PSRAM needed. @@ -21,15 +20,9 @@ class UITask; // -- Grid sizing per platform -- -#if defined(LilyGo_T5S3_EPaper_Pro) - #define SNAKE_CELL 4 - #define SNAKE_HDR 14 - #define SNAKE_FTR 10 -#else #define SNAKE_CELL 8 #define SNAKE_HDR 14 #define SNAKE_FTR 14 -#endif #define SNAKE_MAX_LEN 512 #define SNAKE_HI_COUNT 10 @@ -378,9 +371,6 @@ public: display.startFrame(); display.setTextSize(1); display.setColor(DisplayDriver::GREEN); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.drawTextCentered(display.width() / 2, 2, "Snake"); -#else display.setCursor(2, 2); display.print("Snake"); char scoreBuf[16]; @@ -388,7 +378,6 @@ public: int sw = display.getTextWidth(scoreBuf); display.setCursor(display.width() - sw - 2, 2); display.print(scoreBuf); -#endif display.setColor(DisplayDriver::LIGHT); display.drawRect(0, SNAKE_HDR - 2, display.width(), 1); @@ -399,11 +388,7 @@ public: display.drawTextCentered(cx, y, "Classic Snake"); y += 14; display.setColor(DisplayDriver::GREEN); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.drawTextCentered(cx, y, "Swipe to steer"); -#else display.drawTextCentered(cx, y, "W/S/A/D to steer"); -#endif y += 11; display.drawTextCentered(cx, y, "Eat food to grow"); y += 11; @@ -415,11 +400,7 @@ public: display.drawTextCentered(cx, y, "-- High Scores --"); y += 12; display.setColor(DisplayDriver::GREEN); -#if defined(LilyGo_T5S3_EPaper_Pro) - int showCount = (_hiCount < 5) ? _hiCount : 5; -#else int showCount = (_hiCount < 10) ? _hiCount : 10; -#endif for (int i = 0; i < showCount; i++) { char dateBuf[16]; formatDate(_hiScores[i].timestamp, dateBuf, sizeof(dateBuf)); @@ -434,11 +415,7 @@ public: } display.setColor(DisplayDriver::LIGHT); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.drawTextCentered(cx, y, "Tap to start"); -#else display.drawTextCentered(cx, y, "Press Enter to start"); -#endif } else { if (_state == PLAYING) { unsigned long now = millis(); @@ -492,13 +469,6 @@ public: } display.setColor(DisplayDriver::LIGHT); -#if defined(LilyGo_T5S3_EPaper_Pro) - char footBuf[32]; - snprintf(footBuf, sizeof(footBuf), "Score: %d", _score); - display.setTextSize(0); - display.drawTextCentered(display.width() / 2, display.height() - 8, footBuf); - display.setTextSize(1); -#else display.setTextSize(1); int fy = display.height() - 12; display.drawRect(0, fy - 2, display.width(), 1); @@ -509,7 +479,6 @@ public: display.setCursor(2, fy); display.print("Enter:Start Sh+Del:Back"); } -#endif if (_state == PLAYING) return 100; return 5000; diff --git a/examples/companion_radio/ui-new/TextReaderScreen.h b/examples/companion_radio/ui-new/TextReaderScreen.h index 8b93b269..be173c34 100644 --- a/examples/companion_radio/ui-new/TextReaderScreen.h +++ b/examples/companion_radio/ui-new/TextReaderScreen.h @@ -99,7 +99,7 @@ inline WrapResult findLineBreak(const char* buffer, int bufLen, int lineStart, i } // ============================================================================ -// Pixel-width line breaking for proportional fonts (T5S3) +// Pixel-width line breaking for proportional fonts // // Measures actual rendered text width via DisplayDriver::getTextWidth() at // each word boundary. This gives correct line breaks regardless of character @@ -114,11 +114,7 @@ inline WrapResult findLineBreakPixel(const char* buffer, int bufLen, int lineSta result.nextStart = lineStart; if (lineStart >= bufLen || !display) return result; -#if defined(LilyGo_T5S3_EPaper_Pro) - int rightMargin = 5; // Wider margin for T5S3 (portrait mode especially tight) -#else int rightMargin = 3; -#endif int displayW = display->width() - rightMargin; char measBuf[300]; // temp buffer for pixel measurement int measLen = 0; @@ -1119,14 +1115,10 @@ private: if (selected) { display.setColor(DisplayDriver::LIGHT); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.fillRect(0, y, display.width(), listLineH); -#else // setCursor adds +5 to y internally, but fillRect does not. // NodePrefs::smallHighlightOff() returns the correct offset for all // font combinations (built-in, large_font, custom 7pt styles). display.fillRect(0, y + _prefs->smallHighlightOff(), display.width(), listLineH); -#endif display.setColor(DisplayDriver::DARK); } else { display.setColor(DisplayDriver::LIGHT); @@ -1170,17 +1162,12 @@ private: display.drawRect(0, footerY - 2, display.width(), 1); display.setColor(DisplayDriver::YELLOW); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.setTextSize(_prefs->smallTextSize()); - display.drawTextCentered(display.width() / 2, footerY, "Swipe: Scroll Tap: Open Boot: home"); -#else display.setCursor(0, footerY); display.print("Q:Bk"); const char* right = "Tap/Ent:Open"; display.setCursor(display.width() - display.getTextWidth(right) - 2, footerY); display.print(right); -#endif } void renderPage(DisplayDriver& display) { @@ -1257,8 +1244,7 @@ private: } // Blank lines (paragraph breaks) get reduced height for compact layout. - // Full _lineHeight for blank lines wastes too much space — on T5S3 each - // blank line is ~34px, making paragraph gaps 7-8× the normal line spacing. + // Full _lineHeight for blank lines wastes too much space. // Using 40% height gives a visible paragraph break without wasting space. if (lineHasContent) { y += _lineHeight; @@ -1288,21 +1274,12 @@ private: sprintf(status, "%d/%d %d%%", _currentPage + 1, _totalPages, pct); } -#if defined(LilyGo_T5S3_EPaper_Pro) - display.setTextSize(_prefs->smallTextSize()); - display.setCursor(0, footerY); - display.print(status); - const char* right = "Swipe:Page Tap:GoTo Hold:Close"; - display.setCursor(display.width() - display.getTextWidth(right) - 2, footerY); - display.print(right); -#else display.setCursor(0, footerY); display.print(status); const char* right = _gotoMode ? "Ent:Go Sh+Del:Cancel" : "Entr:Pg# Q:Bk"; display.setCursor(display.width() - display.getTextWidth(right) - 2, footerY); display.print(right); -#endif } public: @@ -1350,28 +1327,12 @@ public: display.setTextSize(_prefs->smallTextSize()); // Measure character width: use 10 M's for monospace (T-Deck Pro tiny font). - // Proportional fonts (T5S3 and T-Deck Pro large_font) override below with + // Proportional fonts (T-Deck Pro large_font) override below with // average-width measurement since M is the widest glyph (~40% wider than average). uint16_t tenCharsW = display.getTextWidth("MMMMMMMMMM"); if (tenCharsW > 0) { _charsPerLine = (display.width() * 10) / tenCharsW; } -#if defined(LilyGo_T5S3_EPaper_Pro) - // T5S3 uses proportional font (FreeSans12pt) — measure average character - // width from a representative English sample. M-based measurement is far - // too conservative (M is the widest glyph), leaving half the line empty. - { - const char* sample = "the quick brown fox jumps over lazy dog"; - uint16_t sampleW = display.getTextWidth(sample); - int sampleLen = strlen(sample); - if (sampleW > 0 && sampleLen > 0) { - // 95% factor as small safety margin for slightly-wider-than-average text - _charsPerLine = (display.width() * sampleLen * 95) / ((int)sampleW * 100); - } - } - if (_charsPerLine < 15) _charsPerLine = 15; - if (_charsPerLine > 80) _charsPerLine = 80; -#else // T-Deck Pro: proportional font — measure average character width from // a sample sentence (M is widest glyph, ~40% wider than average). // Large font (9pt) uses 70% safety margin; custom tiny (7pt) uses 85%. @@ -1386,7 +1347,6 @@ public: } if (_charsPerLine < 15) _charsPerLine = 15; if (_charsPerLine > 60) _charsPerLine = 60; -#endif // Line height for built-in 6x8 font: // setCursor adds +5 to y, so effective text top = (y+5)*scale_y @@ -1401,13 +1361,6 @@ public: _lineHeight = 5; // Safe fallback } -#if defined(LilyGo_T5S3_EPaper_Pro) - // T5S3 uses FreeSans12pt/FreeSerif12pt for size 0 (yAdvance=29px). - { - extern DISPLAY_CLASS display; - _lineHeight = display.isPortraitMode() ? 5 : 8; - } -#else // T-Deck Pro large_font uses FreeSans9pt (yAdvance=22px at scale 1.5625×). // Custom proportional fonts (Noto Sans, Montserrat) at size 0 also need // a tuned line height — the 6x8 formula above uses a width:height ratio @@ -1417,7 +1370,6 @@ public: } else if (display.getFontStyle() > 0) { _lineHeight = 7; // Custom 7pt fonts: 7 * 2.5 = 17.5px — fits ~16 lines/page } -#endif _headerHeight = 0; // No header in reading mode (maximize text area) _footerHeight = 14; @@ -1755,11 +1707,7 @@ public: if (_mode != FILE_LIST) return 0; const int startY = 14, footerH = 14; const int listLineH = _prefs ? _prefs->smallLineH() : 9; -#if defined(LilyGo_T5S3_EPaper_Pro) - const int bodyTop = startY; -#else const int bodyTop = startY + (_prefs ? _prefs->smallHighlightOff() : 5); -#endif if (vy < bodyTop || vy >= 128 - footerH) return 0; int totalItems = totalListItems(); diff --git a/examples/companion_radio/ui-new/Tracescreen.h b/examples/companion_radio/ui-new/Tracescreen.h index 517ff8de..9bcce0c6 100644 --- a/examples/companion_radio/ui-new/Tracescreen.h +++ b/examples/companion_radio/ui-new/Tracescreen.h @@ -306,39 +306,12 @@ public: bool wantsExit() const { return _wantExit; } bool isEditing() const { return _editing; } - // --- Public helpers for T5S3 long-press → virtual keyboard integration --- - - // True if the highlighted menu row is the Type Path entry (STATE_BUILD only). - bool isOnTypePathRow() const { - return _state == STATE_BUILD && menuItemAt(_menuSel) == MENU_TYPE_PATH; - } - // True if the highlighted menu row is the Mode selector (STATE_BUILD only). bool isOnModeRow() const { return _state == STATE_BUILD && menuItemAt(_menuSel) == MENU_PATH_SIZE; } - // Returns the current path formatted as a comma-separated string, suitable - // for pre-populating an external text editor (e.g. the T5S3 virtual keyboard). - // The returned pointer references an internal buffer and is valid until the - // next call to this method or to setTypedPath()/parseTypedPath(). - const char* getCurrentPathAsText() { - pathToEditBuf(); - return _editBuf; - } - - // Apply a path typed externally (via virtual keyboard submission). - // Replaces the working path buffer with whatever parses out of `text` - // and ensures the inline editor flag is cleared so the menu redraws cleanly. - void setTypedPath(const char* text) { - if (!text) return; - strncpy(_editBuf, text, sizeof(_editBuf) - 1); - _editBuf[sizeof(_editBuf) - 1] = '\0'; - parseTypedPath(); - _editing = false; - } - void enter(int pathHashMode) { _state = STATE_BUILD; _hopCount = 0; @@ -466,11 +439,7 @@ private: snprintf(tmp, sizeof(tmp), "%c Path: %s", prefix, pathStr); display.print(tmp); } else { -#if defined(LilyGo_T5S3_EPaper_Pro) - snprintf(tmp, sizeof(tmp), "%c Type Path: [Long press]", prefix); -#else snprintf(tmp, sizeof(tmp), "%c Type Path: [Press Enter]", prefix); -#endif display.print(tmp); } break; @@ -531,17 +500,9 @@ private: display.setColor(DisplayDriver::LIGHT); display.setCursor(0, footerY); if (_editing) { -#if defined(LilyGo_T5S3_EPaper_Pro) - display.print("Boot:Cancel Tap:Apply"); -#else display.print("Q:Cancel Enter:Apply"); -#endif } else { -#if defined(LilyGo_T5S3_EPaper_Pro) - display.print("Boot:Exit Tap:Sel"); -#else display.print("Q:Exit W/S:Nav Ent:Sel"); -#endif } return 5000; @@ -600,11 +561,7 @@ private: display.drawRect(0, footerY - 2, display.width(), 1); display.setColor(DisplayDriver::LIGHT); display.setCursor(0, footerY); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.print("Boot:Back Tap:Add"); -#else display.print("Q:Back W/S:Scroll Ent:Add"); -#endif return 5000; } @@ -656,11 +613,7 @@ private: display.drawRect(0, footerY - 2, display.width(), 1); display.setColor(DisplayDriver::LIGHT); display.setCursor(0, footerY); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.print("Boot:Cancel"); -#else display.print("Q:Cancel"); -#endif return 500; // Fast refresh for elapsed timer } @@ -752,11 +705,7 @@ private: display.drawRect(0, footerY - 2, display.width(), 1); display.setColor(DisplayDriver::LIGHT); display.setCursor(0, footerY); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.print("Boot:Back Tap:New Trace"); -#else display.print("Q:Back Ent:New Trace"); -#endif return 5000; } diff --git a/examples/companion_radio/ui-new/UITask.cpp b/examples/companion_radio/ui-new/UITask.cpp index cf3b62eb..5e5916ce 100644 --- a/examples/companion_radio/ui-new/UITask.cpp +++ b/examples/companion_radio/ui-new/UITask.cpp @@ -1,9 +1,7 @@ #include "UITask.h" #include #include "../MyMesh.h" -#if !defined(LILYGO_TECHO_LITE) && !defined(LILYGO_TECHO_CARD) #include "NotesScreen.h" -#endif #include "RepeaterAdminScreen.h" #include "PathEditorScreen.h" #include "DiscoveryScreen.h" @@ -19,22 +17,19 @@ #ifdef MECK_WEB_READER #include "WebReaderScreen.h" #endif -#if HAS_GPS && !defined(LILYGO_TECHO_CARD) +#if HAS_GPS #include "MapScreen.h" #endif #include "target.h" #if defined(LilyGo_TDeck_Pro_Max) #include "DRV2605Haptic.h" // haptic motor for "Buzzer (vibrate)" channels #endif -#if defined(LilyGo_T5S3_EPaper_Pro) || defined(MECK_AUDIO_VARIANT) || defined(LilyGo_TDeck_Pro) +#if defined(MECK_AUDIO_VARIANT) || defined(LilyGo_TDeck_Pro) #include "HomeIcons.h" #endif #if defined(WIFI_SSID) || defined(MECK_WIFI_COMPANION) #include #endif -#if defined(LilyGo_T5S3_EPaper_Pro) && !defined(BLE_PIN_CODE) && !defined(MECK_WIFI_COMPANION) - #include "esp_sleep.h" -#endif #ifndef AUTO_OFF_MILLIS #define AUTO_OFF_MILLIS 15000 // 15 seconds @@ -56,11 +51,7 @@ #define LONG_PRESS_MILLIS 1200 #ifndef UI_RECENT_LIST_SIZE - #if defined(LilyGo_T5S3_EPaper_Pro) - #define UI_RECENT_LIST_SIZE 8 - #else #define UI_RECENT_LIST_SIZE 4 - #endif #endif #define PRESS_LABEL "long press" @@ -69,9 +60,7 @@ #include "ChannelScreen.h" #include "ChannelPickerScreen.h" #include "ContactsScreen.h" -#if !defined(LILYGO_TECHO_LITE) && !defined(LILYGO_TECHO_CARD) #include "TextReaderScreen.h" -#endif #include "SettingsScreen.h" #ifdef MECK_AUDIO_VARIANT #include "AudiobookPlayerScreen.h" @@ -215,28 +204,6 @@ void renderBatteryIndicator(DisplayDriver& display, uint16_t batteryMilliVolts, display.setColor(DisplayDriver::GREEN); display.setTextSize(_node_prefs->smallTextSize()); -#if defined(LilyGo_T5S3_EPaper_Pro) - // T5S3: text-only battery indicator — "Batt 99% 4.1v" - char battStr[20]; - float volts = batteryMilliVolts / 1000.0f; - snprintf(battStr, sizeof(battStr), "Batt %d%% %.1fv", batteryPercentage, volts); - uint16_t textWidth = display.getTextWidth(battStr); - int textX = display.width() - textWidth - 2; - if (outIconX) *outIconX = textX; - display.setCursor(textX, 0); - display.print(battStr); - display.setTextSize(1); // restore default text size -#elif defined(LILYGO_TECHO_LITE) - // T-Echo Lite: text-only battery (icon misaligns due to fillRect/setCursor offset mismatch at 2× scale) - char battStr[8]; - snprintf(battStr, sizeof(battStr), "%d%%", batteryPercentage); - uint16_t textWidth = display.getTextWidth(battStr); - int textX = display.width() - textWidth - 2; - if (outIconX) *outIconX = textX; - display.setCursor(textX, 0); // Same baseline as node name (HOME_HDR_Y) - display.print(battStr); - display.setTextSize(1); -#else // T-Deck Pro: icon + percentage text (icon hidden in large font) int iconWidth = 16; int iconHeight = 6; @@ -278,7 +245,6 @@ void renderBatteryIndicator(DisplayDriver& display, uint16_t batteryMilliVolts, display.print(pctStr); } display.setTextSize(1); // restore default text size -#endif } #ifdef MECK_AUDIO_VARIANT @@ -371,7 +337,7 @@ public: int render(DisplayDriver& display) override { char tmp[80]; -#if defined(LilyGo_T5S3_EPaper_Pro) || defined(LilyGo_TDeck_Pro) +#if defined(LilyGo_TDeck_Pro) _task->setHomeShowingTiles(false); // Reset — only set true on FIRST page #endif @@ -379,9 +345,6 @@ public: // First render: "powering off..." + wake instruction // Second render onward: wake instruction only (persists on e-ink) if (_shutdown_init && _poweroff_selected) { -#if defined(LilyGo_T5S3_EPaper_Pro) - board.setBacklight(false); -#endif display.setColor(DisplayDriver::GREEN); display.setTextSize(1); if (!_poweroff_msg_shown) { @@ -400,15 +363,7 @@ public: display.setColor(DisplayDriver::GREEN); char filtered_name[sizeof(_node_prefs->node_name)]; display.translateUTF8ToBlocks(filtered_name, _node_prefs->node_name, sizeof(filtered_name)); -#if defined(LilyGo_T5S3_EPaper_Pro) - // T5S3: FreeSans12pt ascenders need more room than built-in font. - // Shift header elements down by 4 virtual units (~17px physical). - #define HOME_HDR_Y 1 -#elif defined(LILYGO_TECHO_LITE) - #define HOME_HDR_Y 0 -#else #define HOME_HDR_Y -3 -#endif display.setCursor(0, HOME_HDR_Y); display.print(filtered_name); // battery voltage + status icons @@ -452,11 +407,7 @@ public: } } // curr page indicator -#if defined(LILYGO_TECHO_LITE) - int y = 13; // Below header -#elif defined(LilyGo_T5S3_EPaper_Pro) - int y = 14; // Closer to header -#elif defined(LilyGo_TDeck_Pro) +#if defined(LilyGo_TDeck_Pro) int y = 8; // Tighter under header; frees room for the MSG strip above the tile grid #else int y = 14; @@ -471,7 +422,7 @@ public: } if (_page == HomePage::FIRST) { -#if defined(LilyGo_T5S3_EPaper_Pro) || defined(LilyGo_TDeck_Pro) +#if defined(LilyGo_TDeck_Pro) _task->setHomeShowingTiles(true); #endif #if defined(LilyGo_TDeck_Pro) @@ -593,24 +544,12 @@ public: display.setTextSize(1); // restore driver font state after raw text } #else // not LilyGo_TDeck_Pro -#if defined(LilyGo_T5S3_EPaper_Pro) - #if defined(BLE_PIN_CODE) || defined(WIFI_SSID) || defined(MECK_WIFI_COMPANION) - int y = 18; // Tighter spacing — connectivity info fills gap below dots - #else - int y = 26; // Standalone: extra line below dots (no IP/Connected row) - #endif -#elif defined(LILYGO_TECHO_LITE) - int y = 18; // Below page dots -#else int y = 20; -#endif display.setColor(DisplayDriver::YELLOW); display.setTextSize(2); sprintf(tmp, "MSG: %d", _task->getUnreadMsgCount()); display.drawTextCentered(display.width() / 2, y, tmp); -#if defined(LILYGO_TECHO_LITE) - y += 12; // Compact -#elif defined(LilyGo_TDeck_Pro_Max) +#if defined(LilyGo_TDeck_Pro_Max) y += 10; // MAX: pull < Connected > up under MSG to make room for [T] Phone #else y += 14; // Reduced from 18 @@ -637,9 +576,7 @@ public: display.setTextSize(2); sprintf(tmp, "Pin:%d", the_mesh.getBLEPin()); display.drawTextCentered(display.width() / 2, y, tmp); -#if defined(LILYGO_TECHO_LITE) - y += 14; // Compact -#elif defined(LilyGo_TDeck_Pro_Max) +#if defined(LilyGo_TDeck_Pro_Max) y += 6; // MAX: tighter pin-to-menu gap so [T] Phone is not clipped #else y += 18; @@ -648,101 +585,7 @@ public: } #endif - // ----- T5S3: Tappable tile grid (touch-friendly home screen) ----- -#if defined(LilyGo_T5S3_EPaper_Pro) - // 3×2 grid of tiles below MSG count - // Virtual coords (128×128), scaled by DisplayDriver - { - struct Tile { const uint8_t* icon; const char* label; }; - const Tile tiles[2][3] = { - { {icon_envelope, "Messages"}, {icon_people, "Contacts"}, {icon_gear, "Settings"} }, -#ifdef MECK_WEB_READER - { {icon_book, "Reader"}, {icon_notepad, "Notes"}, {icon_search, "Browser"} } -#else - { {icon_book, "Reader"}, {icon_notepad, "Notes"}, {icon_search, "Discover"} } -#endif - }; - - const int tileW = 40; - const int tileH = 22; - const int gapX = 1; - const int gapY = 1; - const int gridW = tileW * 3 + gapX * 2; - const int gridX = (display.width() - gridW) / 2; - const int gridY = y + 2; - _task->setTileGridVY(gridY); // Store for touch hit testing - - for (int row = 0; row < 2; row++) { - for (int col = 0; col < 3; col++) { - int tx = gridX + col * (tileW + gapX); - int ty = gridY + row * (tileH + gapY); - - // Tile border - display.setColor(DisplayDriver::LIGHT); - display.drawRect(tx, ty, tileW, tileH); - - // Icon centered in tile - int iconX = tx + (tileW - HOME_ICON_W) / 2; - int iconY = ty + 2; - display.drawXbm(iconX, iconY, tiles[row][col].icon, HOME_ICON_W, HOME_ICON_H); - - // Label centered below icon - display.setTextSize(_node_prefs->smallTextSize()); - display.drawTextCentered(tx + tileW / 2, ty + 15, tiles[row][col].label); - } - } - - // Third row: Trace (col 0) + Games (col 1) - { - int row3y = gridY + 2 * (tileH + gapY); - - // Trace tile (column 0) - int col0x = gridX; - display.setColor(DisplayDriver::LIGHT); - display.drawRect(col0x, row3y, tileW, tileH); - int iconX = col0x + (tileW - HOME_ICON_W) / 2; - int iconY = row3y + 2; - display.drawXbm(iconX, iconY, icon_trace, HOME_ICON_W, HOME_ICON_H); - display.setTextSize(_node_prefs->smallTextSize()); - display.drawTextCentered(col0x + tileW / 2, row3y + 15, "Trace"); - - // Games tile (column 1) - int col1x = gridX + (tileW + gapX); - display.setColor(DisplayDriver::LIGHT); - display.drawRect(col1x, row3y, tileW, tileH); - iconX = col1x + (tileW - HOME_ICON_W) / 2; - iconY = row3y + 2; - display.drawXbm(iconX, iconY, icon_gamepad, HOME_ICON_W, HOME_ICON_H); - display.setTextSize(_node_prefs->smallTextSize()); - display.drawTextCentered(col1x + tileW / 2, row3y + 15, "Games"); - } - - // Nav hint at bottom of screen - display.setColor(DisplayDriver::GREEN); - display.setTextSize(_node_prefs->smallTextSize()); - display.drawTextCentered(display.width() / 2, display.height() - 8, "Tap tile to open"); - } - display.setTextSize(1); - -#else - // Non-T5S3: keyboard shortcut menu -#if defined(LILYGO_TECHO_LITE) - // T-Echo Lite: compact centered menu (tiny font fits 117px virtual width) - display.setColor(DisplayDriver::LIGHT); - display.setTextSize(0); // 6×8 built-in font - y += 2; - display.drawTextCentered(display.width() / 2, y, "M:Msgs C:Contacts"); - y += 8; - display.drawTextCentered(display.width() / 2, y, "S:Set F:Discover"); - y += 8; - display.drawTextCentered(display.width() / 2, y, "H:Last Heard"); - y += 9; - if (y < display.height() - 14) { - display.setColor(DisplayDriver::GREEN); - display.drawTextCentered(display.width() / 2, y, "Arrows: cycle views"); - } - display.setTextSize(1); // restore -#else + // Keyboard shortcut menu // ----- T-Deck Pro: Keyboard shortcut text menu ----- display.setColor(DisplayDriver::LIGHT); display.setTextSize(_node_prefs->smallTextSize()); @@ -877,8 +720,6 @@ public: (_node_prefs->large_font || display.getFontStyle() > 0) ? "A/D: cycle views" : "Press A/D to cycle home views"); } display.setTextSize(1); // restore -#endif // LILYGO_TECHO_LITE -#endif #endif // not LilyGo_TDeck_Pro } else if (_page == HomePage::RECENT) { the_mesh.getRecentlyHeard(recent, UI_RECENT_LIST_SIZE); @@ -908,13 +749,8 @@ public: // Hint for full Last Heard screen display.setColor(DisplayDriver::LIGHT); display.setTextSize(_node_prefs->smallTextSize()); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.drawTextCentered(display.width() / 2, display.height() - 24, - "Tap here for full Last Heard list"); -#else display.drawTextCentered(display.width() / 2, display.height() - 24, "H: Full Last Heard list"); -#endif } else if (_page == HomePage::RADIO) { display.setColor(DisplayDriver::YELLOW); display.setTextSize(1); @@ -940,40 +776,24 @@ public: #ifdef BLE_PIN_CODE } else if (_page == HomePage::BLUETOOTH) { display.setColor(DisplayDriver::GREEN); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.drawXbm((display.width() - 32) / 2, 28, -#else display.drawXbm((display.width() - 32) / 2, 18, -#endif _task->isSerialEnabled() ? bluetooth_on : bluetooth_off, 32, 32); if (_task->hasConnection()) { display.setColor(DisplayDriver::GREEN); display.setTextSize(1); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.drawTextCentered(display.width() / 2, 64, "< Connected >"); -#else display.drawTextCentered(display.width() / 2, 53, "< Connected >"); -#endif } else if (_task->isSerialEnabled() && the_mesh.getBLEPin() != 0) { display.setColor(DisplayDriver::RED); display.setTextSize(2); sprintf(tmp, "Pin:%d", the_mesh.getBLEPin()); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.drawTextCentered(display.width() / 2, 64, tmp); -#else display.drawTextCentered(display.width() / 2, 53, tmp); -#endif } display.setColor(DisplayDriver::GREEN); display.setTextSize(1); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.drawTextCentered(display.width() / 2, 80, "toggle: " PRESS_LABEL); -#else display.drawTextCentered(display.width() / 2, 68, "toggle: " PRESS_LABEL); display.drawTextCentered(display.width() / 2, 78, "or press Enter key"); #endif -#endif #ifdef MECK_WIFI_COMPANION } else if (_page == HomePage::WIFI_STATUS) { display.setColor(DisplayDriver::GREEN); @@ -1015,17 +835,9 @@ public: #endif } else if (_page == HomePage::ADVERT) { display.setColor(DisplayDriver::GREEN); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.drawXbm((display.width() - 32) / 2, 28, advert_icon, 32, 32); -#else display.drawXbm((display.width() - 32) / 2, 18, advert_icon, 32, 32); -#endif -#if defined(LilyGo_T5S3_EPaper_Pro) - display.drawTextCentered(display.width() / 2, 64, "advert: " PRESS_LABEL); -#else display.drawTextCentered(display.width() / 2, 57, "advert: " PRESS_LABEL); display.drawTextCentered(display.width() / 2, 67, "or press Enter key"); -#endif #if ENV_INCLUDE_GPS == 1 && !defined(MECK_40MHZ_TEST) } else if (_page == HomePage::GPS) { extern GPSStreamCounter gpsStream; @@ -1254,34 +1066,17 @@ public: display.setColor(DisplayDriver::GREEN); display.setTextSize(1); if (_shutdown_init) { -#if defined(LilyGo_T5S3_EPaper_Pro) - board.setBacklight(false); -#endif display.drawTextCentered(display.width() / 2, 34, "hibernating..."); } else if (_poweroff_confirm) { // Confirmation prompt for power off -#if defined(LilyGo_T5S3_EPaper_Pro) - display.drawXbm((display.width() - 32) / 2, 28, power_icon, 32, 32); -#else display.drawXbm((display.width() - 32) / 2, 20, power_icon, 32, 32); -#endif -#if defined(LilyGo_T5S3_EPaper_Pro) - display.drawTextCentered(display.width() / 2, 64, "power off device?"); - display.drawTextCentered(display.width() / 2, 76, "usb-c to wake"); -#else display.drawTextCentered(display.width() / 2, 56, "power off device?"); display.drawTextCentered(display.width() / 2, 66, "usb-c to wake"); display.drawTextCentered(display.width() / 2, 82, "Enter:yes q:no"); -#endif } else { // Menu: hibernate / power off -#if defined(LilyGo_T5S3_EPaper_Pro) - display.drawXbm((display.width() - 32) / 2, 20, power_icon, 32, 32); - const int y1 = 58, y2 = 70; -#else display.drawXbm((display.width() - 32) / 2, 20, power_icon, 32, 32); const int y1 = 56, y2 = 68; -#endif char line1[48], line2[48]; #if defined(LilyGo_TDeck_Pro) snprintf(line1, sizeof(line1), "%shibernate: long press/Enter", _poweroff_selected ? " " : ">"); @@ -1422,13 +1217,12 @@ public: // MsgPreviewScreen removed — all platforms now use toast alerts for new messages // ========================================================================== -// Lock Screen — T5S3 and T-Deck Pro +// Lock Screen -- T-Deck Pro // Big clock, battery %, unread message count. -// T5S3: Long press boot button to lock/unlock. Touch disabled while locked. // T-Deck Pro: Double-press boot button to lock/unlock. Touch+keyboard disabled. // ========================================================================== -#if defined(LilyGo_T5S3_EPaper_Pro) || defined(LilyGo_TDeck_Pro) +#if defined(LilyGo_TDeck_Pro) class LockScreen : public UIScreen { UITask* _task; mesh::RTCClock* _rtc; @@ -1452,11 +1246,7 @@ public: } // ---- Huge clock: HH:MM on one line ---- -#if defined(LilyGo_T5S3_EPaper_Pro) - display.setTextSize(5); // T5S3: FreeSansBold24pt × 5 -#else display.setTextSize(5); // T-Deck Pro: FreeSansBold12pt at GxEPD 2× scale -#endif display.setColor(DisplayDriver::LIGHT); display.drawTextCentered(display.width() / 2, 55, timeBuf); @@ -1512,11 +1302,6 @@ public: #endif // ---- Unlock hint ---- -#if defined(LilyGo_T5S3_EPaper_Pro) - display.setTextSize(_node_prefs->smallTextSize()); - display.setColor(DisplayDriver::LIGHT); - display.drawTextCentered(display.width() / 2, 120, "Hold button to unlock"); -#endif return 30000; } @@ -1590,7 +1375,7 @@ void UITask::begin(DisplayDriver* display, SensorManager* sensors, NodePrefs* no ui_started_at = millis(); _alert_expiry = 0; -#if defined(LilyGo_T5S3_EPaper_Pro) || defined(LilyGo_TDeck_Pro) +#if defined(LilyGo_TDeck_Pro) _lastInputMillis = millis(); #endif @@ -1602,13 +1387,8 @@ void UITask::begin(DisplayDriver* display, SensorManager* sensors, NodePrefs* no ((ChannelPickerScreen*)channel_picker_screen)->setChannelScreen((ChannelScreen*)channel_screen); contacts_screen = new ContactsScreen(this, &rtc_clock); ((ContactsScreen*)contacts_screen)->setDMUnreadPtr(_dmUnread); -#if !defined(LILYGO_TECHO_LITE) && !defined(LILYGO_TECHO_CARD) text_reader = new TextReaderScreen(this, node_prefs); notes_screen = new NotesScreen(this, node_prefs); -#else - text_reader = nullptr; // T-Echo Lite: excluded to save RAM (256KB nRF52) - notes_screen = nullptr; -#endif settings_screen = new SettingsScreen(this, &rtc_clock, node_prefs); repeater_admin = nullptr; // Lazy-initialized on first use to preserve heap for audio path_editor = nullptr; // Lazy-initialized on first use from contacts screen @@ -1622,7 +1402,7 @@ void UITask::begin(DisplayDriver* display, SensorManager* sensors, NodePrefs* no #if defined(LilyGo_TDeck_Pro) gbc_screen = new GBCEmulatorScreen(this); #endif -#if defined(LilyGo_T5S3_EPaper_Pro) || defined(LilyGo_TDeck_Pro) +#if defined(LilyGo_TDeck_Pro) lock_screen = new LockScreen(this, &rtc_clock, node_prefs); #endif audiobook_screen = nullptr; // Created and assigned from main.cpp if audio hardware present @@ -1633,21 +1413,14 @@ void UITask::begin(DisplayDriver* display, SensorManager* sensors, NodePrefs* no #ifdef HAS_4G_MODEM sms_screen = new SMSScreen(this, node_prefs); #endif -#if HAS_GPS && !defined(LILYGO_TECHO_CARD) +#if HAS_GPS map_screen = new MapScreen(this); #else map_screen = nullptr; #endif -#if defined(LilyGo_T5S3_EPaper_Pro) - // Apply saved display preferences before first render - if (_node_prefs->portrait_mode) { - ::display.setPortraitMode(true); - } -#endif - - // Apply saved dark mode preference (both T-Deck Pro and T5S3) -#if defined(LilyGo_T5S3_EPaper_Pro) || defined(LilyGo_TDeck_Pro) + // Apply saved dark mode preference (T-Deck Pro) +#if defined(LilyGo_TDeck_Pro) if (_node_prefs->dark_mode) { ::display.setDarkMode(true); } @@ -2125,50 +1898,7 @@ void UITask::loop() { #if (defined(PIN_USER_BTN)) int ev = user_btn.check(); if (ev == BUTTON_EVENT_CLICK) { -#if defined(LilyGo_T5S3_EPaper_Pro) - // T5S3: single click = cycle pages on home, go back to home from elsewhere - // Ignored while locked — long press required to unlock - if (_locked) { - c = 0; - } else if (_vkbActive) { - onVKBCancel(); - c = 0; - } else if (curr == home) { - c = checkDisplayOn(KEY_NEXT); - } else { - // Navigate back: reader reading→file list, file list→home, others→home -#if !defined(LILYGO_TECHO_LITE) && !defined(LILYGO_TECHO_CARD) - if (isOnTextReader()) { - TextReaderScreen* reader = (TextReaderScreen*)text_reader; - if (reader && reader->isReading()) { - c = checkDisplayOn('q'); // reading mode: close book → file list - } else { - gotoHomeScreen(); // file list: go home - c = 0; - } - } else if (isOnNotesScreen()) { - NotesScreen* notes = (NotesScreen*)notes_screen; - if (notes && notes->isEditing()) { - notes->triggerSaveAndExit(); // save and return to file list - } else { - notes->exitNotes(); - gotoHomeScreen(); - } - c = 0; - } else -#endif - if (isOnChannelPickerScreen()) { - gotoHomeScreen(); // picker → home - c = 0; - } else if (isOnChannelScreen()) { - gotoChannelPickerScreen(); // channel messages → picker - c = 0; - } else { - gotoHomeScreen(); - c = 0; // consumed - } - } -#elif defined(LilyGo_TDeck_Pro) +#if defined(LilyGo_TDeck_Pro) // T-Deck Pro: single click ignored while locked — double-press to unlock if (_locked) { c = 0; @@ -2214,7 +1944,7 @@ void UITask::loop() { #endif if (c != 0 && curr) { - // Dismiss boot hint on any button input (boot button on T5S3) + // Dismiss boot hint on any button input if (_hintActive) { dismissBootHint(); c = 0; // Consume the press @@ -2225,7 +1955,7 @@ void UITask::loop() { curr->handleInput(c); _auto_off = millis() + AUTO_OFF_MILLIS; // extend auto-off timer _next_refresh = 100; // trigger refresh -#if defined(LilyGo_T5S3_EPaper_Pro) || defined(LilyGo_TDeck_Pro) +#if defined(LilyGo_TDeck_Pro) _lastInputMillis = millis(); // Reset auto-lock idle timer #endif } @@ -2308,126 +2038,18 @@ if (curr) curr->poll(); _next_refresh = millis() + 500; // Re-check in 500ms } else { // Sync dark mode with prefs (settings toggle takes effect here) -#if defined(LilyGo_T5S3_EPaper_Pro) || defined(LilyGo_TDeck_Pro) +#if defined(LilyGo_TDeck_Pro) if (_node_prefs && display.isDarkMode() != (_node_prefs->dark_mode != 0)) { display.setDarkMode(_node_prefs->dark_mode != 0); } -#endif -#if defined(LilyGo_T5S3_EPaper_Pro) - // Sync portrait mode with prefs (T5S3 only) - if (_node_prefs && display.isPortraitMode() != (_node_prefs->portrait_mode != 0)) { - display.setPortraitMode(_node_prefs->portrait_mode != 0); - // Text reader layout depends on orientation -- force recalculation - if (text_reader) { - ((TextReaderScreen*)text_reader)->invalidateLayout(); - } - } #endif // Sync font style with prefs (settings toggle takes effect here) -#if defined(LilyGo_T5S3_EPaper_Pro) || defined(LilyGo_TDeck_Pro) +#if defined(LilyGo_TDeck_Pro) if (_node_prefs && display.getFontStyle() != _node_prefs->ui_font_style) { display.setFontStyle(_node_prefs->ui_font_style); } #endif _display->startFrame(); -#if defined(LilyGo_T5S3_EPaper_Pro) - if (_vkbActive) { - display.setForcePartial(true); // No flash while typing - _vkb.render(*_display); - _next_refresh = millis() + 500; // Moderate refresh for cursor blink - // Check if keyboard was submitted or cancelled during render cycle - if (_vkb.status() == VKB_SUBMITTED) { - onVKBSubmit(); - } else if (_vkb.status() == VKB_CANCELLED) { - onVKBCancel(); - } - } else { - // Default: allow full refresh. Override for notes editing (no flash while typing). - display.setForcePartial(false); - if (isOnNotesScreen() && ((NotesScreen*)notes_screen)->isEditing()) { - display.setForcePartial(true); - } - int delay_millis = curr->render(*_display); - - // Check if settings screen needs VKB for WiFi password entry -#ifdef MECK_WIFI_COMPANION - if (isOnSettingsScreen() && !_vkbActive) { - SettingsScreen* ss = (SettingsScreen*)settings_screen; - if (ss->needsWifiVKB()) { - ss->clearWifiNeedsVKB(); - showVirtualKeyboard(VKB_WIFI_PASSWORD, "WiFi Password", "", 63); - } - } -#endif - - // Check if settings screen needs VKB for text editing (channel name, freq, APN) - if (isOnSettingsScreen() && !_vkbActive) { - SettingsScreen* ss = (SettingsScreen*)settings_screen; - if (ss->needsTextVKB()) { - ss->clearTextNeedsVKB(); - // Pick a context-appropriate label - const char* label = "Edit"; - SettingsRowType rt = ss->getCurrentRowType(); - if (rt == ROW_NAME) label = "Node Name"; - else if (rt == ROW_ADD_CHANNEL) label = "Channel Name"; - else if (rt == ROW_FREQ) label = "Frequency"; - showVirtualKeyboard(VKB_SETTINGS_TEXT, label, ss->getEditBuf(), 31); - } - if (ss->needsCannedVKB()) { - ss->clearCannedNeedsVKB(); - showVirtualKeyboard(VKB_CANNED_TEXT, "Canned Message", ss->getCannedBuf(), CANNED_MSG_LEN - 1); - } - } - - if (_hintActive && millis() < _hintExpiry) { - // Boot navigation hint overlay — multi-line, larger box - _display->setTextSize(1); - int w = _display->width(); - int h = _display->height(); - int boxX = w / 8; - int boxY = h / 5; - int boxW = w - boxX * 2; - int boxH = h * 3 / 5; - _display->setColor(DisplayDriver::DARK); - _display->fillRect(boxX, boxY, boxW, boxH); - _display->setColor(DisplayDriver::LIGHT); - _display->drawRect(boxX, boxY, boxW, boxH); - int cx = w / 2; - int lineH = 11; - int startY = boxY + 6; -#if defined(LilyGo_T5S3_EPaper_Pro) - _display->drawTextCentered(cx, startY, "Swipe: Navigate"); - _display->drawTextCentered(cx, startY + lineH, "Tap: Select"); - _display->drawTextCentered(cx, startY + lineH * 2, "Long Press: Action"); - _display->drawTextCentered(cx, startY + lineH * 3, "Boot Btn: Home"); - _display->drawTextCentered(cx, startY + lineH * 4 + 4, "[Tap to dismiss hint]"); -#else - _display->drawTextCentered(cx, startY, "M:Msgs C:Contacts"); - _display->drawTextCentered(cx, startY + lineH, "S:Settings E:Reader"); - _display->drawTextCentered(cx, startY + lineH * 2, "N:Notes W/S:Scroll"); - _display->drawTextCentered(cx, startY + lineH * 3, "A/D:Cycle Left/Right"); - _display->drawTextCentered(cx, startY + lineH * 4 + 4, "[X to dismiss hint]"); -#endif - _next_refresh = _hintExpiry; - } else if (_hintActive) { - // Hint expired — auto-dismiss - dismissBootHint(); - _next_refresh = millis() + 200; - } else if (millis() < _alert_expiry) { - _display->setTextSize(1); - int y = _display->height() / 3; - int p = _display->height() / 32; - _display->setColor(DisplayDriver::DARK); - _display->fillRect(p, y, _display->width() - p*2, y); - _display->setColor(DisplayDriver::LIGHT); - _display->drawRect(p, y, _display->width() - p*2, y); - _display->drawTextCentered(_display->width() / 2, y + p*3, _alert); - _next_refresh = _alert_expiry; - } else { - _next_refresh = millis() + delay_millis; - } - } -#else int delay_millis = curr->render(*_display); if (_hintActive && millis() < _hintExpiry) { // Boot navigation hint overlay — multi-line, larger box @@ -2468,7 +2090,6 @@ if (curr) curr->poll(); } else { _next_refresh = millis() + delay_millis; } -#endif _display->endFrame(); // E-ink render throttle: enforce minimum interval between renders. @@ -2507,7 +2128,7 @@ if (curr) curr->poll(); } // Auto-lock idle timer — runs regardless of display on/off state -#if defined(LilyGo_T5S3_EPaper_Pro) || defined(LilyGo_TDeck_Pro) +#if defined(LilyGo_TDeck_Pro) if (_node_prefs && _node_prefs->auto_lock_minutes > 0 && !_locked) { uint8_t alm = _node_prefs->auto_lock_minutes; // Only act on valid option values (guards against garbage from uninitialised prefs) @@ -2520,19 +2141,9 @@ if (curr) curr->poll(); } // Lock screen clock refresh — keeps the displayed time current. - // T-Deck Pro: every 1 minute. T5S3: every 2 minutes. + // T-Deck Pro: every 1 minute. // Wakes the display driver briefly to render, then auto-off handles it. - // T5S3 standalone: no refreshes once powersaving begins — the device - // shows "hibernating..." and enters light sleep instead. -#if defined(LilyGo_T5S3_EPaper_Pro) && !defined(BLE_PIN_CODE) && !defined(MECK_WIFI_COMPANION) - // T5S3 standalone: only refresh while still active (before powersaving kicks in) - if (_locked && _display != NULL && _display->isOn()) { - const unsigned long LOCK_REFRESH_INTERVAL = 2UL * 60UL * 1000UL; // 2 minutes -#elif defined(LilyGo_T5S3_EPaper_Pro) - // T5S3 BLE/WiFi: refresh every 2 minutes - if (_locked && _display != NULL) { - const unsigned long LOCK_REFRESH_INTERVAL = 2UL * 60UL * 1000UL; // 2 minutes -#elif defined(LilyGo_TDeck_Pro) +#if defined(LilyGo_TDeck_Pro) // T-Deck Pro: refresh every 1 minute if (_locked && _display != NULL) { const unsigned long LOCK_REFRESH_INTERVAL = 1UL * 60UL * 1000UL; // 1 minute @@ -2551,56 +2162,6 @@ if (curr) curr->poll(); } #endif - // ── T5S3 standalone powersaving ────────────────────────────────────────── - // When locked with display off, enter ESP32 light sleep (~8 mA total). - // Radio stays in continuous RX — DIO1 going HIGH wakes the CPU instantly. - // Boot button (GPIO0 LOW) and a 30-min safety timer also wake. - // First sleep starts 60s after lock; subsequent cycles wake for 5s to let - // the mesh stack process/relay any received packet, then sleep again. -#if defined(LilyGo_T5S3_EPaper_Pro) && !defined(BLE_PIN_CODE) && !defined(MECK_WIFI_COMPANION) - if (_locked && _display != NULL && !_display->isOn()) { - unsigned long now = millis(); - if (now - _psLastActive >= _psNextSleepSecs * 1000UL) { - // First sleep entry: render a static "hibernating..." frame on the - // e-ink. Since e-ink retains its image indefinitely without power, - // this tells the user the device is in low-power mode until they - // wake it with the boot button. - if (_psNextSleepSecs == 60) { - _display->turnOn(); - _display->startFrame(); - _display->setTextSize(1); - _display->setColor(DisplayDriver::GREEN); - _display->drawTextCentered(_display->width() / 2, 34, "hibernating..."); - _display->endFrame(); - delay(700); // Allow e-ink refresh to complete - _display->turnOff(); - } - Serial.println("[POWERSAVE] Entering light sleep (locked+idle)"); - board.sleep(1800); // Light sleep up to 30 min - // ── CPU resumes here on wake ── - unsigned long wakeAt = millis(); - _psLastActive = wakeAt; - _psNextSleepSecs = 5; // Stay awake 5s for mesh processing - - esp_sleep_wakeup_cause_t cause = esp_sleep_get_wakeup_cause(); - if (cause == ESP_SLEEP_WAKEUP_GPIO) { - // Boot button pressed — unlock and return to normal use - Serial.println("[POWERSAVE] Woke by button — unlocking"); - unlockScreen(); - _psNextSleepSecs = 60; // Reset to long delay after user interaction - } else if (cause == ESP_SLEEP_WAKEUP_EXT1) { - Serial.println("[POWERSAVE] Woke by LoRa packet"); - } else if (cause == ESP_SLEEP_WAKEUP_TIMER) { - Serial.println("[POWERSAVE] Woke by timer"); - } - } - } else if (!_locked) { - // Not locked — keep powersaving timer reset so first sleep is 60s after lock - _psLastActive = millis(); - _psNextSleepSecs = 60; - } -#endif - #ifdef PIN_VIBRATION vibration.loop(); #endif @@ -2613,7 +2174,7 @@ if (curr) curr->poll(); if (_low_batt_count >= 3) { // 3 consecutive low readings (~24s) to avoid transient sags // show low battery shutdown alert on e-ink (persists after power loss) - #if defined(THINKNODE_M1) || defined(LILYGO_TECHO) || defined(LilyGo_TDeck_Pro) + #if defined(LilyGo_TDeck_Pro) if (_display != NULL) { _display->startFrame(); _display->setTextSize(2); @@ -2646,7 +2207,7 @@ char UITask::checkDisplayOn(char c) { } _auto_off = millis() + AUTO_OFF_MILLIS; // extend auto-off timer _next_refresh = 0; // trigger refresh -#if defined(LilyGo_T5S3_EPaper_Pro) || defined(LilyGo_TDeck_Pro) +#if defined(LilyGo_TDeck_Pro) _lastInputMillis = millis(); // Reset auto-lock idle timer #endif } @@ -2658,33 +2219,12 @@ char UITask::handleLongPress(char c) { the_mesh.enterCLIRescue(); c = 0; // consume event } -#if defined(LilyGo_T5S3_EPaper_Pro) - else if (_vkbActive) { - onVKBCancel(); // Long press while VKB → cancel - c = 0; - } else if (_locked) { - unlockScreen(); - c = 0; - } else { - lockScreen(); - c = 0; - } -#endif return c; } char UITask::handleDoubleClick(char c) { MESH_DEBUG_PRINTLN("UITask: double click triggered"); -#if defined(LilyGo_T5S3_EPaper_Pro) - // Double-click boot button → full brightness backlight toggle - if (board.isBacklightOn()) { - board.setBacklight(false); - } else { - board.setBacklightBrightness(153); - board.setBacklight(true); - } - c = 0; // consume event — don't pass through as navigation -#elif defined(LilyGo_TDeck_Pro) +#if defined(LilyGo_TDeck_Pro) // Double-click boot button → lock/unlock screen if (_locked) { unlockScreen(); @@ -2700,22 +2240,12 @@ char UITask::handleDoubleClick(char c) { char UITask::handleTripleClick(char c) { MESH_DEBUG_PRINTLN("UITask: triple click triggered"); checkDisplayOn(c); -#if defined(LilyGo_T5S3_EPaper_Pro) - // Triple-click → half brightness backlight (comfortable reading) - if (board.isBacklightOn()) { - board.setBacklight(false); // If already on, turn off - } else { - board.setBacklightBrightness(4); - board.setBacklight(true); - } -#else toggleBuzzer(); -#endif c = 0; return c; } -#if defined(LilyGo_T5S3_EPaper_Pro) || defined(LilyGo_TDeck_Pro) +#if defined(LilyGo_TDeck_Pro) void UITask::lockScreen() { if (_locked) return; _locked = true; @@ -2725,9 +2255,7 @@ void UITask::lockScreen() { if (_display != NULL && !_display->isOn()) { _display->turnOn(); } -#if defined(LilyGo_T5S3_EPaper_Pro) - board.setBacklight(false); // Save power (T5S3 backlight) -#elif defined(LilyGo_TDeck_Pro_Max) +#if defined(LilyGo_TDeck_Pro_Max) // MAX: IO41 frontlight stays lit otherwise, burning power behind the // lock screen. Plain Pro V1.1 has no working frontlight to switch off. if (board.isBacklightOn()) board.backlightOff(); @@ -2735,10 +2263,6 @@ void UITask::lockScreen() { _next_refresh = 0; // Draw lock screen immediately _auto_off = millis() + 60000; // 60s before display off while locked _lastLockRefresh = millis(); // Start lock screen clock refresh cycle -#if defined(LilyGo_T5S3_EPaper_Pro) && !defined(BLE_PIN_CODE) && !defined(MECK_WIFI_COMPANION) - _psLastActive = millis(); // Start powersaving countdown (60s to first sleep) - _psNextSleepSecs = 60; -#endif Serial.println("[UI] Screen locked — entering low-power mode"); } @@ -2760,261 +2284,7 @@ void UITask::unlockScreen() { _next_refresh = 0; Serial.println("[UI] Screen unlocked — exiting low-power mode"); } -#endif // LilyGo_T5S3_EPaper_Pro || LilyGo_TDeck_Pro - -#if defined(LilyGo_T5S3_EPaper_Pro) -void UITask::showVirtualKeyboard(VKBPurpose purpose, const char* label, const char* initial, int maxLen, int contextIdx) { - _vkb.open(purpose, label, initial, maxLen, contextIdx); - _vkbActive = true; - _vkbOpenedAt = millis(); - _screenBeforeVKB = curr; - _next_refresh = 0; - _auto_off = millis() + 120000; // 2min timeout while typing - Serial.printf("[UI] VKB opened: %s\n", label); -} - -void UITask::onVKBSubmit() { - _vkbActive = false; - const char* text = _vkb.getText(); - VKBPurpose purpose = _vkb.purpose(); - int idx = _vkb.contextIdx(); - - Serial.printf("[UI] VKB submit: purpose=%d idx=%d text='%s'\n", purpose, idx, text); - - switch (purpose) { - case VKB_CHANNEL_MSG: { - if (strlen(text) == 0) break; - - ChannelDetails channel; - if (the_mesh.getChannel(idx, channel)) { - uint32_t timestamp = rtc_clock.getCurrentTime(); - int textLen = strlen(text); - if (the_mesh.sendGroupMessage(timestamp, channel.channel, - the_mesh.getNodePrefs()->node_name, - text, textLen)) { - addSentChannelMessage(idx, the_mesh.getNodePrefs()->node_name, text); - the_mesh.queueSentChannelMessage(idx, timestamp, - the_mesh.getNodePrefs()->node_name, text); - showAlert("Sent!", 1500); - } else { - showAlert("Send failed!", 1500); - } - } - if (_screenBeforeVKB) setCurrScreen(_screenBeforeVKB); - break; - } - case VKB_DM: { - if (strlen(text) == 0) break; - - bool dmSuccess = false; - uint32_t sendRef = 0; - uint8_t sendTotal = 0; - if (the_mesh.uiSendDirectMessage((uint32_t)idx, text, &sendRef, &sendTotal)) { - // Add to channel screen so sent DM appears in conversation view - ContactInfo dmRecipient; - if (the_mesh.getContactByIdx(idx, dmRecipient)) { - addSentDM(dmRecipient.name, the_mesh.getNodePrefs()->node_name, text, - sendRef, sendTotal); - } - dmSuccess = true; - } - // Return to DM conversation if we have contact info - ContactInfo dmContact; - if (the_mesh.getContactByIdx(idx, dmContact)) { - ChannelScreen* cs = (ChannelScreen*)channel_screen; - uint8_t savedPerms = (cs && cs->isDMConversation()) ? cs->getDMContactPerms() : 0; - gotoDMConversation(dmContact.name, idx, savedPerms); - } else if (_screenBeforeVKB) { - setCurrScreen(_screenBeforeVKB); - } - // Show alert AFTER navigation (setCurrScreen clears prior alerts) - showAlert(dmSuccess ? "DM sent!" : "DM failed!", 1500); - break; - } - case VKB_ADMIN_PASSWORD: { - // Feed each character to the admin screen, then Enter - RepeaterAdminScreen* admin = (RepeaterAdminScreen*)getRepeaterAdminScreen(); - if (admin) { - for (int i = 0; text[i]; i++) { - admin->handleInput(text[i]); - } - admin->handleInput('\r'); - } - if (_screenBeforeVKB) setCurrScreen(_screenBeforeVKB); - break; - } - case VKB_ADMIN_CLI: { - RepeaterAdminScreen* admin = (RepeaterAdminScreen*)getRepeaterAdminScreen(); - if (admin) { - for (int i = 0; text[i]; i++) { - admin->handleInput(text[i]); - } - admin->handleInput('\r'); - } - if (_screenBeforeVKB) setCurrScreen(_screenBeforeVKB); - break; - } - case VKB_SETTINGS_NAME: { - if (strlen(text) > 0) { - strncpy(_node_prefs->node_name, text, sizeof(_node_prefs->node_name) - 1); - _node_prefs->node_name[sizeof(_node_prefs->node_name) - 1] = '\0'; - the_mesh.savePrefs(); - showAlert("Name saved", 1000); - } - if (_screenBeforeVKB) setCurrScreen(_screenBeforeVKB); - break; - } - case VKB_SETTINGS_TEXT: { - // Generic settings text edit — copy text back to settings edit buffer - // and confirm via the normal Enter path (handles name/freq/channel/APN) - SettingsScreen* ss = (SettingsScreen*)settings_screen; - if (strlen(text) > 0) { - ss->submitEditText(text); - } else { - // Empty submission — cancel the edit - ss->handleInput('q'); - } - if (_screenBeforeVKB) setCurrScreen(_screenBeforeVKB); - break; - } - case VKB_CANNED_TEXT: { - // Canned slot edit -- commit even when empty (empty clears the slot) - SettingsScreen* ss = (SettingsScreen*)settings_screen; - ss->submitCannedText(text); - if (_screenBeforeVKB) setCurrScreen(_screenBeforeVKB); - break; - } - case VKB_NOTES: { -#if !defined(LILYGO_TECHO_LITE) && !defined(LILYGO_TECHO_CARD) - NotesScreen* notes = (NotesScreen*)getNotesScreen(); - if (notes && strlen(text) > 0) { - for (int i = 0; text[i]; i++) { - notes->handleInput(text[i]); - } - } -#endif - if (_screenBeforeVKB) setCurrScreen(_screenBeforeVKB); - break; - } -#ifdef MECK_WIFI_COMPANION - case VKB_WIFI_PASSWORD: { - SettingsScreen* ss = (SettingsScreen*)settings_screen; - ss->submitWifiPassword(text); - if (WiFi.status() == WL_CONNECTED) { - showAlert("WiFi connected!", 2000); - } else { - showAlert("WiFi failed", 2000); - } - if (_screenBeforeVKB) setCurrScreen(_screenBeforeVKB); - break; - } -#endif -#ifdef MECK_WEB_READER - case VKB_WEB_URL: { - WebReaderScreen* wr = (WebReaderScreen*)getWebReaderScreen(); - if (wr && strlen(text) > 0) { - wr->setUrlText(text); // Copy text + set _urlEditing = true - wr->handleInput('\r'); // Triggers auto-prefix + fetch - } - if (_screenBeforeVKB) setCurrScreen(_screenBeforeVKB); - break; - } - case VKB_WEB_SEARCH: { - WebReaderScreen* wr = (WebReaderScreen*)getWebReaderScreen(); - if (wr && strlen(text) > 0) { - wr->setSearchText(text); // Copy text + set _searchEditing = true - wr->handleInput('\r'); // Triggers DDG search URL build + fetch - } - if (_screenBeforeVKB) setCurrScreen(_screenBeforeVKB); - break; - } - case VKB_WEB_WIFI_PASS: { - WebReaderScreen* wr = (WebReaderScreen*)getWebReaderScreen(); - if (wr && strlen(text) > 0) { - wr->setWifiPassText(text); // Copy password text - wr->handleInput('\r'); // Triggers WiFi connect - } - if (_screenBeforeVKB) setCurrScreen(_screenBeforeVKB); - break; - } - case VKB_WEB_LINK: { - WebReaderScreen* wr = (WebReaderScreen*)getWebReaderScreen(); - if (wr && strlen(text) > 0) { - // Activate link input mode, feed digits, then submit - wr->handleInput('l'); // Enter link selection mode - for (int i = 0; text[i]; i++) { - if (text[i] >= '0' && text[i] <= '9') { - wr->handleInput(text[i]); - } - } - wr->handleInput('\r'); // Confirm link number → navigate - } - if (_screenBeforeVKB) setCurrScreen(_screenBeforeVKB); - break; - } -#endif - case VKB_TEXT_PAGE: { -#if !defined(LILYGO_TECHO_LITE) && !defined(LILYGO_TECHO_CARD) - if (strlen(text) > 0) { - int pageNum = atoi(text); - TextReaderScreen* reader = (TextReaderScreen*)getTextReaderScreen(); - if (reader && pageNum > 0) { - reader->gotoPage(pageNum); - } - } -#endif - if (_screenBeforeVKB) setCurrScreen(_screenBeforeVKB); - break; - } - case VKB_TRACE_PATH: { - TraceScreen* ts = (TraceScreen*)getTraceScreen(); - if (ts) { - ts->setTypedPath(text); - } - if (_screenBeforeVKB) setCurrScreen(_screenBeforeVKB); - break; - } - } - _screenBeforeVKB = nullptr; - _next_refresh = 0; - display.setForcePartial(false); // Next frame does full refresh to clear VKB ghosts - display.invalidateFrameCRC(); -} - -void UITask::onVKBCancel() { - _vkbActive = false; - if (_screenBeforeVKB) setCurrScreen(_screenBeforeVKB); - _screenBeforeVKB = nullptr; - _next_refresh = 0; - display.setForcePartial(false); // Next frame does full refresh to clear VKB ghosts - display.invalidateFrameCRC(); - Serial.println("[UI] VKB cancelled"); -} - -#ifdef MECK_CARDKB -void UITask::feedCardKBChar(char c) { - if (_vkbActive) { - // VKB is open — feed character into its text buffer - if (_vkb.feedChar(c)) { - _next_refresh = 0; // Redraw VKB immediately - _auto_off = millis() + 120000; // Extend timeout while typing - // Check if feedChar triggered submit or cancel - if (_vkb.status() == VKB_SUBMITTED) { - onVKBSubmit(); - } else if (_vkb.status() == VKB_CANCELLED) { - onVKBCancel(); - } - } else { - // feedChar returned false — nav keys (arrows) while VKB is active - // Not consumed; could be used for cursor movement in future - } - } else { - // No VKB active — route as normal navigation key - injectKey(c); - } -} -#endif -#endif +#endif // LilyGo_TDeck_Pro bool UITask::getGPSState() { #if ENV_INCLUDE_GPS == 1 @@ -3086,7 +2356,7 @@ void UITask::injectKey(char c) { } curr->handleInput(c); _auto_off = millis() + AUTO_OFF_MILLIS; // extend auto-off timer -#if defined(LilyGo_T5S3_EPaper_Pro) || defined(LilyGo_TDeck_Pro) +#if defined(LilyGo_TDeck_Pro) _lastInputMillis = millis(); // Reset auto-lock idle timer #endif // Debounce refresh when editing UTC offset - e-ink takes 644ms per refresh @@ -3215,7 +2485,6 @@ void UITask::gotoContactsScreen() { void UITask::gotoTextReader() { if (!text_reader) return; // Not available on this platform -#if !defined(LILYGO_TECHO_LITE) && !defined(LILYGO_TECHO_CARD) TextReaderScreen* reader = (TextReaderScreen*)text_reader; if (_display != NULL) { reader->enter(*_display); @@ -3226,12 +2495,10 @@ void UITask::gotoTextReader() { } _auto_off = millis() + AUTO_OFF_MILLIS; _next_refresh = 100; -#endif } void UITask::gotoNotesScreen() { if (!notes_screen) return; // Not available on this platform -#if !defined(LILYGO_TECHO_LITE) && !defined(LILYGO_TECHO_CARD) NotesScreen* notes = (NotesScreen*)notes_screen; if (_display != NULL) { notes->enter(*_display); @@ -3246,7 +2513,6 @@ void UITask::gotoNotesScreen() { } _auto_off = millis() + AUTO_OFF_MILLIS; _next_refresh = 100; -#endif } void UITask::gotoSettingsScreen() { @@ -3596,8 +2862,7 @@ void UITask::gotoWebReader() { #if HAS_GPS void UITask::gotoMapScreen() { - if (!map_screen) return; // Not available on this platform (T-Echo Card) -#if !defined(LILYGO_TECHO_CARD) + if (!map_screen) return; // Not available on this platform MapScreen* map = (MapScreen*)map_screen; if (_display != NULL) { map->enter(*_display); @@ -3608,7 +2873,6 @@ void UITask::gotoMapScreen() { } _auto_off = millis() + AUTO_OFF_MILLIS; _next_refresh = 100; -#endif } #endif diff --git a/examples/companion_radio/ui-new/UITask.h b/examples/companion_radio/ui-new/UITask.h index 80803da8..c3d10c82 100644 --- a/examples/companion_radio/ui-new/UITask.h +++ b/examples/companion_radio/ui-new/UITask.h @@ -34,10 +34,6 @@ #include "AlarmScreen.h" #endif -#if defined(LilyGo_T5S3_EPaper_Pro) - #include "VirtualKeyboard.h" -#endif - // MapScreen.h included in UITask.cpp and main.cpp only (PNGdec headers // conflict with BLE if pulled into the global include chain) @@ -115,28 +111,7 @@ class UITask : public AbstractUITask { UIScreen* curr; bool _homeShowingTiles = false; // Set by HomeScreen render when tile grid is visible int _tileGridVY = 44; // Virtual Y of tile grid top (updated each render) -#if defined(LilyGo_T5S3_EPaper_Pro) - UIScreen* lock_screen; // Lock screen (big clock + battery + unread) - UIScreen* _screenBeforeLock = nullptr; - bool _locked = false; - unsigned long _lastInputMillis = 0; // Auto-lock idle tracking - unsigned long _lastLockRefresh = 0; // Periodic lock screen clock update - - VirtualKeyboard _vkb; - bool _vkbActive = false; - UIScreen* _screenBeforeVKB = nullptr; - unsigned long _vkbOpenedAt = 0; - - // Powersaving: light sleep when locked + idle (standalone only -- no BLE/WiFi) - // Wakes on LoRa packet (DIO1), boot button (GPIO0), or 30-min timer -#if !defined(BLE_PIN_CODE) && !defined(MECK_WIFI_COMPANION) - unsigned long _psLastActive = 0; // millis() at last wake or lock entry - unsigned long _psNextSleepSecs = 60; // Seconds before first sleep (60s), then 5s cycles -#endif -#ifdef MECK_CARDKB - bool _cardkbDetected = false; -#endif -#elif defined(LilyGo_TDeck_Pro) +#if defined(LilyGo_TDeck_Pro) UIScreen* lock_screen; // Lock screen (big clock + battery + unread) UIScreen* _screenBeforeLock = nullptr; bool _locked = false; @@ -246,7 +221,7 @@ public: // emulator's in-game input never passes through injectKey(), so without // this the lock screen would land on top of a running game. void resetIdleTimer() { -#if defined(LilyGo_T5S3_EPaper_Pro) || defined(LilyGo_TDeck_Pro) +#if defined(LilyGo_TDeck_Pro) _lastInputMillis = millis(); #endif } @@ -291,24 +266,11 @@ public: bool isOnGBCScreen() const { return curr == gbc_screen; } #endif bool isOnMapScreen() const { return curr == map_screen; } -#if defined(LilyGo_T5S3_EPaper_Pro) || defined(LilyGo_TDeck_Pro) +#if defined(LilyGo_TDeck_Pro) bool isLocked() const { return _locked; } void lockScreen(); void unlockScreen(); #endif -#if defined(LilyGo_T5S3_EPaper_Pro) - bool isVKBActive() const { return _vkbActive; } - unsigned long vkbOpenedAt() const { return _vkbOpenedAt; } - VirtualKeyboard& getVKB() { return _vkb; } - void showVirtualKeyboard(VKBPurpose purpose, const char* label, const char* initial, int maxLen, int contextIdx = 0); - void onVKBSubmit(); - void onVKBCancel(); -#ifdef MECK_CARDKB - void setCardKBDetected(bool v) { _cardkbDetected = v; } - bool hasCardKB() const { return _cardkbDetected; } - void feedCardKBChar(char c); -#endif -#endif #ifdef MECK_WEB_READER bool isOnWebReader() const { return curr == web_reader; } #endif diff --git a/examples/companion_radio/ui-new/VirtualKeyboard.h b/examples/companion_radio/ui-new/VirtualKeyboard.h deleted file mode 100644 index 478ac85c..00000000 --- a/examples/companion_radio/ui-new/VirtualKeyboard.h +++ /dev/null @@ -1,540 +0,0 @@ -#pragma once -// ============================================================================= -// VirtualKeyboard — On-screen QWERTY keyboard for T5S3 (touch-only devices) -// -// Renders in virtual coordinate space (128×128). Touch hit testing converts -// physical GT911 coords (960×540) to virtual coords. -// -// Usage: -// keyboard.open("To: General", "", 137); // label, initial text, max len -// keyboard.render(display); // in render loop -// keyboard.handleTap(vx, vy); // on touch tap (virtual coords) -// if (keyboard.status() == VKB_SUBMITTED) { ... keyboard.getText() ... } -// ============================================================================= - -#if defined(LilyGo_T5S3_EPaper_Pro) -#ifndef VIRTUAL_KEYBOARD_H -#define VIRTUAL_KEYBOARD_H - -#include -#include -#include "EmojiSprites.h" - -enum VKBStatus { VKB_EDITING, VKB_SUBMITTED, VKB_CANCELLED }; - -// What the keyboard is being used for (dispatch on submit) -enum VKBPurpose { - VKB_CHANNEL_MSG, // Send to channel - VKB_DM, // Direct message to contact - VKB_ADMIN_PASSWORD, // Repeater admin login - VKB_ADMIN_CLI, // Repeater admin CLI command - VKB_NOTES, // Insert text into notes - VKB_SETTINGS_NAME, // Edit node name - VKB_SETTINGS_TEXT, // Generic settings text edit (channel name, freq, APN) - VKB_CANNED_TEXT, // Canned message slot edit (full 133-char length) - VKB_WIFI_PASSWORD, // WiFi password entry (settings screen) -#ifdef MECK_WEB_READER - VKB_WEB_URL, // Web reader URL entry - VKB_WEB_SEARCH, // Web reader DuckDuckGo search query - VKB_WEB_WIFI_PASS, // Web reader WiFi password - VKB_WEB_LINK, // Web reader link number entry -#endif - VKB_TEXT_PAGE, // Text reader: go to page number - VKB_TRACE_PATH, // Trace screen: type comma-separated path values -}; - -class VirtualKeyboard { -public: - static const int MAX_TEXT = 140; - - VirtualKeyboard() : _status(VKB_CANCELLED), _purpose(VKB_CHANNEL_MSG), - _contextIdx(0), _textLen(0), _shifted(false), _symbols(false), - _emojiMode(false), _emojiScroll(0) { - _text[0] = '\0'; - _label[0] = '\0'; - } - - void open(VKBPurpose purpose, const char* label, const char* initial, int maxLen, int contextIdx = 0) { - _purpose = purpose; - _contextIdx = contextIdx; - _status = VKB_EDITING; - _shifted = false; - _symbols = false; - _emojiMode = false; - _emojiScroll = 0; - _maxLen = (maxLen > 0 && maxLen < MAX_TEXT) ? maxLen : MAX_TEXT; - - strncpy(_label, label, sizeof(_label) - 1); - _label[sizeof(_label) - 1] = '\0'; - - if (initial && initial[0]) { - strncpy(_text, initial, _maxLen); - _text[_maxLen] = '\0'; - _textLen = strlen(_text); - } else { - _text[0] = '\0'; - _textLen = 0; - } - } - - VKBStatus status() const { return _status; } - VKBPurpose purpose() const { return _purpose; } - int contextIdx() const { return _contextIdx; } - const char* getText() const { return _text; } - int getTextLen() const { return _textLen; } - bool isActive() const { return _status == VKB_EDITING; } - - // --- Render keyboard + input field --- - void render(DisplayDriver& display) { - // Header label (To: channel, DM: name, etc.) - display.setTextSize(0); - display.setColor(DisplayDriver::GREEN); - display.setCursor(2, 0); - display.print(_label); - - // Input text field - display.setColor(DisplayDriver::LIGHT); - display.drawRect(0, 10, 128, 18); // Border - - // Render text with inline emoji sprites - renderTextField(display); - - // Character count - { - char countBuf[12]; - snprintf(countBuf, sizeof(countBuf), "%d/%d", _textLen, _maxLen); - int cw = display.getTextWidth(countBuf); - display.setCursor(128 - cw - 2, 0); - display.setColor(DisplayDriver::LIGHT); - display.print(countBuf); - } - - // Separator - display.drawRect(0, 30, 128, 1); - - if (_emojiMode) { - renderEmojiGrid(display); - return; - } - - // --- Draw keyboard rows --- - const char* const* layout = getLayout(); - - for (int row = 0; row < 3; row++) { - int numKeys = strlen(layout[row]); - int rowY = KEY_START_Y + row * (KEY_H + KEY_GAP); - - // Calculate key width and starting X for this row - int totalW = numKeys * KEY_W + (numKeys - 1) * KEY_GAP; - int startX = (128 - totalW) / 2; - - for (int k = 0; k < numKeys; k++) { - int kx = startX + k * (KEY_W + KEY_GAP); - char ch = layout[row][k]; - - // Draw key background (inverted for special keys) - bool special = (ch == '<' || ch == '^' || ch == '~' || ch == '>' || ch == '\x01'); - if (special) { - display.setColor(DisplayDriver::LIGHT); - display.fillRect(kx, rowY + 1, KEY_W, KEY_H - 1); - display.setColor(DisplayDriver::DARK); - } else { - display.setColor(DisplayDriver::LIGHT); - display.drawRect(kx, rowY + 1, KEY_W, KEY_H - 1); - } - - // Draw key label - char keyLabel[2] = { ch, '\0' }; - // Remap special chars to display labels - if (ch == '<') keyLabel[0] = '<'; // Backspace - if (ch == '^') keyLabel[0] = '^'; // Shift - if (ch == '>') keyLabel[0] = '>'; // Enter - - if (ch == '~') { - // Space key — don't draw individual label - } else if (ch == '\x01') { - // Symbol toggle in row — show "ab" hint - int lx = kx + KEY_W / 2 - display.getTextWidth("ab") / 2; - display.setCursor(lx, rowY + 2); - display.print("ab"); - } else { - int lx = kx + KEY_W / 2 - display.getTextWidth(keyLabel) / 2; - display.setCursor(lx, rowY + 2); - display.print(keyLabel); - } - - // Restore color - display.setColor(DisplayDriver::LIGHT); - } - } - - // Draw row 4 with variable-width keys - int r4y = KEY_START_Y + 3 * (KEY_H + KEY_GAP); - drawRow4(display, r4y); - - // Shift/symbol indicator - display.setTextSize(0); - display.setColor(DisplayDriver::GREEN); - if (_shifted) { - display.setCursor(2, 126); - display.print("SHIFT"); - } else if (_symbols) { - display.setCursor(2, 126); - display.print("123"); - } - } - - // --- Handle touch tap (virtual coordinates) --- - // Returns true if the tap was consumed - bool handleTap(int vx, int vy) { - if (_status != VKB_EDITING) return false; - - if (_emojiMode) return handleEmojiTap(vx, vy); - - // Check keyboard rows 0-2 - const char* const* layout = getLayout(); - - for (int row = 0; row < 3; row++) { - int numKeys = strlen(layout[row]); - int rowY = KEY_START_Y + row * (KEY_H + KEY_GAP); - if (vy < rowY || vy >= rowY + KEY_H) continue; - - int totalW = numKeys * KEY_W + (numKeys - 1) * KEY_GAP; - int startX = (128 - totalW) / 2; - - for (int k = 0; k < numKeys; k++) { - int kx = startX + k * (KEY_W + KEY_GAP); - if (vx >= kx && vx < kx + KEY_W) { - char ch = layout[row][k]; - processKey(ch); - return true; - } - } - return true; // Tap was in row area but between keys — consume - } - - // Check row 4 (variable width keys) - int r4y = KEY_START_Y + 3 * (KEY_H + KEY_GAP); - if (vy >= r4y && vy < r4y + KEY_H) { - return handleRow4Tap(vx); - } - - return false; - } - - // Swipe up on keyboard = cancel - void cancel() { _status = VKB_CANCELLED; } - - // --- Feed a raw ASCII character from an external physical keyboard --- - // Maps standard ASCII control chars to internal VKB actions. - // Returns true if the character was consumed. -#ifdef MECK_CARDKB - bool feedChar(char c) { - if (_status != VKB_EDITING) return false; - switch (c) { - case '\r': processKey('>'); return true; // Enter → submit - case '\b': processKey('<'); return true; // Backspace - case 0x7F: processKey('<'); return true; // Delete → backspace - case 0x1B: _status = VKB_CANCELLED; return true; // ESC → cancel - case ' ': processKey('~'); return true; // Space - default: - // Printable ASCII → insert directly - if (c >= 0x20 && c <= 0x7E) { - if (_textLen < _maxLen) { - _text[_textLen++] = c; - _text[_textLen] = '\0'; - } - return true; - } - return false; // Non-printable / nav keys — not consumed - } - } -#endif - -private: - VKBStatus _status; - VKBPurpose _purpose; - int _contextIdx; - char _text[MAX_TEXT + 1]; - int _textLen; - int _maxLen; - char _label[40]; - bool _shifted; - bool _symbols; - bool _emojiMode; - int _emojiScroll; - - // Emoji grid constants (virtual coords) - static const int EMJ_COLS = 8; - static const int EMJ_CELL = 15; // 12px sprite + 3px gap - static const int EMJ_GRID_X = 4; - static const int EMJ_GRID_Y = 34; - static const int EMJ_VIS_ROWS = 5; - - int emojiTotalRows() const { return (EMOJI_COUNT + EMJ_COLS - 1) / EMJ_COLS; } - int emojiMaxScroll() const { int m = emojiTotalRows() - EMJ_VIS_ROWS; return m < 0 ? 0 : m; } - - void renderEmojiGrid(DisplayDriver& display) { - display.setTextSize(0); - - for (int vr = 0; vr < EMJ_VIS_ROWS; vr++) { - int absRow = _emojiScroll + vr; - if (absRow >= emojiTotalRows()) break; - - for (int col = 0; col < EMJ_COLS; col++) { - int idx = absRow * EMJ_COLS + col; - if (idx >= EMOJI_COUNT) break; - - int cx = EMJ_GRID_X + col * EMJ_CELL; - int cy = EMJ_GRID_Y + vr * EMJ_CELL; - - display.setColor(DisplayDriver::LIGHT); - const uint8_t* sprite = (const uint8_t*)pgm_read_ptr(&EMOJI_SPRITES_LG[idx]); - if (sprite) { - display.drawXbm(cx + 1, cy + 1, sprite, EMOJI_LG_W, EMOJI_LG_H); - } - } - } - - // Footer: [Back] [▲] page/total [▼] - int fy = EMJ_GRID_Y + EMJ_VIS_ROWS * EMJ_CELL + 2; - display.setColor(DisplayDriver::LIGHT); - display.drawRect(0, fy - 1, 128, 1); - - // Back button (inverted) - display.fillRect(4, fy + 1, 30, 12); - display.setColor(DisplayDriver::DARK); - int bw = display.getTextWidth("Back"); - display.setCursor(4 + (30 - bw) / 2, fy + 2); - display.print("Back"); - - display.setColor(DisplayDriver::LIGHT); - - // Scroll arrows (only if scrollable) - if (emojiTotalRows() > EMJ_VIS_ROWS) { - // Up arrow - if (_emojiScroll > 0) { - display.fillRect(50, fy + 1, 12, 12); - display.setColor(DisplayDriver::DARK); - display.setCursor(53, fy + 2); - display.print("^"); - display.setColor(DisplayDriver::LIGHT); - } - - // Page info - char pg[8]; - snprintf(pg, sizeof(pg), "%d/%d", _emojiScroll + 1, emojiMaxScroll() + 1); - int pw = display.getTextWidth(pg); - display.setCursor(75 - pw / 2, fy + 2); - display.print(pg); - - // Down arrow - if (_emojiScroll < emojiMaxScroll()) { - display.fillRect(90, fy + 1, 12, 12); - display.setColor(DisplayDriver::DARK); - display.setCursor(93, fy + 2); - display.print("v"); - display.setColor(DisplayDriver::LIGHT); - } - } - } - - bool handleEmojiTap(int vx, int vy) { - int fy = EMJ_GRID_Y + EMJ_VIS_ROWS * EMJ_CELL + 2; - - // Footer area - if (vy >= fy) { - if (vx >= 4 && vx < 34) { - // Back button - _emojiMode = false; - return true; - } - if (vx >= 50 && vx < 62 && _emojiScroll > 0) { - _emojiScroll--; - return true; - } - if (vx >= 90 && vx < 102 && _emojiScroll < emojiMaxScroll()) { - _emojiScroll++; - return true; - } - return true; // Consume tap in footer - } - - // Grid area - if (vy >= EMJ_GRID_Y && vy < EMJ_GRID_Y + EMJ_VIS_ROWS * EMJ_CELL) { - int col = (vx - EMJ_GRID_X) / EMJ_CELL; - int vr = (vy - EMJ_GRID_Y) / EMJ_CELL; - if (col < 0 || col >= EMJ_COLS || vr < 0 || vr >= EMJ_VIS_ROWS) return true; - - int idx = (_emojiScroll + vr) * EMJ_COLS + col; - if (idx >= 0 && idx < EMOJI_COUNT) { - insertEmoji(idx); - _emojiMode = false; - } - return true; - } - - return true; // Consume any tap while in emoji mode - } - - void insertEmoji(int idx) { - // Insert as UTF-8 directly (not escape bytes) so sent messages are valid - uint8_t utf8[8]; - int len = emojiEncodeUtf8(EMOJI_CODEPOINTS[idx].cp, utf8); - if (EMOJI_CODEPOINTS[idx].cp2 != 0) - len += emojiEncodeUtf8(EMOJI_CODEPOINTS[idx].cp2, utf8 + len); - if (_textLen + len > _maxLen) return; - memcpy(_text + _textLen, utf8, len); - _textLen += len; - _text[_textLen] = '\0'; - } - - // Render text field with inline emoji sprites (10×10) - void renderTextField(DisplayDriver& display) { - // Convert UTF-8 emoji to escape bytes for sprite lookup - char sanitized[MAX_TEXT + 1]; - emojiSanitize(_text, sanitized, sizeof(sanitized)); - - int x = 2; - int maxX = 124; - display.setColor(DisplayDriver::LIGHT); - display.setTextSize(0); - - for (int i = 0; sanitized[i] && x < maxX; i++) { - uint8_t b = (uint8_t)sanitized[i]; - if (b == EMOJI_PAD_BYTE) continue; - - if (isEmojiEscape(b)) { - const uint8_t* sprite = getEmojiSpriteSm(b); - if (sprite && x + EMOJI_SM_W < maxX) { - display.drawXbm(x, 14, sprite, EMOJI_SM_W, EMOJI_SM_H); - x += EMOJI_SM_W + 1; - } - } else { - char ch[2] = { (char)b, '\0' }; - display.setCursor(x, 12); - display.print(ch); - x += display.getTextWidth(ch); - } - } - - // Blinking cursor - if (x < maxX) { - display.setCursor(x, 12); - display.print("_"); - } - } - - // Layout constants (virtual coords) - static const int KEY_W = 11; - static const int KEY_H = 19; - static const int KEY_GAP = 1; - static const int KEY_START_Y = 34; - - // Key layouts — rows 0-2 as char arrays - // Special: ^ = shift, < = backspace, \x01 = sym toggle, \x02 = emoji, > = enter, ~ = space - const char* const* getLayout() const { - static const char* const lower[3] = { "qwertyuiop", "asdfghjkl", "^zxcvbnm<" }; - static const char* const upper[3] = { "QWERTYUIOP", "ASDFGHJKL", "^ZXCVBNM<" }; - static const char* const syms[3] = { "1234567890", "-/:;()@$&#", "\x01.,?!'\"_<" }; - return _symbols ? syms : (_shifted ? upper : lower); - } - - // Row 4: variable-width keys [#/ABC] [,] [$] [SPACE] [.] [Enter] - // Defined by physical zones, not the char-array approach - struct R4Key { int x; int w; char ch; const char* label; }; - - void drawRow4(DisplayDriver& display, int y) { - const R4Key keys[] = { - { 4, 20, '\x01', _symbols ? "ABC" : "123" }, - { 26, 11, ',', "," }, - { 39, 11, '\x02', "$" }, - { 52, 37, '~', "space" }, - { 91, 11, '.', "." }, - { 104, 20, '>', "Send" } - }; - - for (int i = 0; i < 6; i++) { - bool special = (keys[i].ch == '\x01' || keys[i].ch == '>' || keys[i].ch == '\x02'); - if (special) { - display.setColor(DisplayDriver::LIGHT); - display.fillRect(keys[i].x, y + 1, keys[i].w, KEY_H - 1); - display.setColor(DisplayDriver::DARK); - } else { - display.setColor(DisplayDriver::LIGHT); - display.drawRect(keys[i].x, y + 1, keys[i].w, KEY_H - 1); - } - - // Center label in key - display.setTextSize(0); - int lw = display.getTextWidth(keys[i].label); - int lx = keys[i].x + (keys[i].w - lw) / 2; - display.setCursor(lx, y + 2); - display.print(keys[i].label); - display.setColor(DisplayDriver::LIGHT); - } - } - - bool handleRow4Tap(int vx) { - const R4Key keys[] = { - { 4, 20, '\x01', nullptr }, - { 26, 11, ',', nullptr }, - { 39, 11, '\x02', nullptr }, - { 52, 37, '~', nullptr }, - { 91, 11, '.', nullptr }, - { 104, 20, '>', nullptr } - }; - for (int i = 0; i < 6; i++) { - if (vx >= keys[i].x && vx < keys[i].x + keys[i].w) { - processKey(keys[i].ch); - return true; - } - } - return true; // Consume tap in row area - } - - void processKey(char ch) { - if (ch == '^') { - // Shift toggle - _shifted = !_shifted; - _symbols = false; - } else if (ch == '\x01') { - // Symbol/letter toggle - _symbols = !_symbols; - _shifted = false; - } else if (ch == '\x02') { - // Emoji picker toggle - _emojiMode = !_emojiMode; - _emojiScroll = 0; - } else if (ch == '<') { - // Backspace — UTF-8 aware (walk back past continuation bytes 10xxxxxx) - if (_textLen > 0) { - _textLen--; - while (_textLen > 0 && ((uint8_t)_text[_textLen] & 0xC0) == 0x80) { - _textLen--; - } - _text[_textLen] = '\0'; - } - } else if (ch == '>') { - // Enter/Send - _status = VKB_SUBMITTED; - } else if (ch == '~') { - // Space - if (_textLen < _maxLen) { - _text[_textLen++] = ' '; - _text[_textLen] = '\0'; - } - } else { - // Regular character - if (_textLen < _maxLen) { - _text[_textLen++] = ch; - _text[_textLen] = '\0'; - // Auto-unshift after typing one character - if (_shifted) _shifted = false; - } - } - } -}; - -#endif // VIRTUAL_KEYBOARD_H -#endif // LilyGo_T5S3_EPaper_Pro \ No newline at end of file diff --git a/examples/companion_radio/ui-new/WebReaderScreen.h b/examples/companion_radio/ui-new/WebReaderScreen.h index fc80b54f..e42c2020 100644 --- a/examples/companion_radio/ui-new/WebReaderScreen.h +++ b/examples/companion_radio/ui-new/WebReaderScreen.h @@ -2671,11 +2671,7 @@ private: bool selected = (i == _selectedSSID); if (selected) { display.setColor(DisplayDriver::LIGHT); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.fillRect(0, y, display.width(), listLineH); -#else display.fillRect(0, y + _prefs->smallHighlightOff(), display.width(), listLineH); -#endif display.setColor(DisplayDriver::DARK); } else { display.setColor(DisplayDriver::LIGHT); @@ -2743,11 +2739,7 @@ private: } display.setCursor(0, 80); display.setColor(DisplayDriver::GREEN); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.print("Tap: Retry"); -#else display.print("Enter: Retry Sh+Del: Back"); -#endif } // Footer @@ -2756,14 +2748,7 @@ private: display.drawRect(0, footerY - 2, display.width(), 1); display.setCursor(0, footerY); display.setColor(DisplayDriver::YELLOW); -#if defined(LilyGo_T5S3_EPaper_Pro) - if (_wifiState == WIFI_ENTERING_PASS) - display.print("Tap: Enter Password Hold: Back"); - else - display.print("Swipe: Navigate Tap: Select"); -#else display.print("Sh+Del:Back W/S:Nav Ent:Select"); -#endif } void renderHome(DisplayDriver& display) { @@ -2895,11 +2880,7 @@ private: if (HOME_VISIBLE(y, ircH)) { if (selected) { display.setColor(DisplayDriver::LIGHT); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.fillRect(0, y, display.width() - (needsScroll ? scrollbarW + 1 : 0), listLineH); -#else display.fillRect(0, y + _prefs->smallHighlightOff(), display.width() - (needsScroll ? scrollbarW + 1 : 0), listLineH); -#endif display.setColor(DisplayDriver::DARK); } else { display.setColor(DisplayDriver::GREEN); @@ -2934,11 +2915,7 @@ private: if (HOME_VISIBLE(y, urlBarH)) { if (selected) { display.setColor(DisplayDriver::LIGHT); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.fillRect(0, y, display.width() - (needsScroll ? scrollbarW + 1 : 0), listLineH); -#else display.fillRect(0, y + _prefs->smallHighlightOff(), display.width() - (needsScroll ? scrollbarW + 1 : 0), listLineH); -#endif display.setColor(DisplayDriver::DARK); } else { display.setColor(DisplayDriver::LIGHT); @@ -2971,11 +2948,7 @@ private: if (HOME_VISIBLE(y, searchBarH)) { if (selected) { display.setColor(DisplayDriver::LIGHT); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.fillRect(0, y, display.width() - (needsScroll ? scrollbarW + 1 : 0), listLineH); -#else display.fillRect(0, y + _prefs->smallHighlightOff(), display.width() - (needsScroll ? scrollbarW + 1 : 0), listLineH); -#endif display.setColor(DisplayDriver::DARK); } else { display.setColor(DisplayDriver::LIGHT); @@ -3024,11 +2997,7 @@ private: int contentW = display.width() - (needsScroll ? scrollbarW + 1 : 0); if (selected) { display.setColor(DisplayDriver::LIGHT); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.fillRect(0, y, contentW, itemH); -#else display.fillRect(0, y + _prefs->smallHighlightOff(), contentW, itemH); -#endif display.setColor(DisplayDriver::DARK); } else { display.setColor(DisplayDriver::LIGHT); @@ -3076,11 +3045,7 @@ private: int contentW = display.width() - (needsScroll ? scrollbarW + 1 : 0); if (selected) { display.setColor(DisplayDriver::LIGHT); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.fillRect(0, y, contentW, itemH); -#else display.fillRect(0, y + _prefs->smallHighlightOff(), contentW, itemH); -#endif display.setColor(DisplayDriver::DARK); } else { display.setColor(DisplayDriver::LIGHT); @@ -3146,19 +3111,6 @@ private: display.print("Type query Ent:Search"); } else { char footerBuf[48]; -#if defined(LilyGo_T5S3_EPaper_Pro) - bool onBookmark = (_homeSelected >= 3 && _homeSelected < 3 + (int)_bookmarks.size()); - bool onUrl = (_homeSelected == 1); - bool onSearch = (_homeSelected == 2); - if (onUrl) - snprintf(footerBuf, sizeof(footerBuf), "Tap: Enter URL Hold: Back"); - else if (onSearch) - snprintf(footerBuf, sizeof(footerBuf), "Tap: Search Hold: Back"); - else if (onBookmark) - snprintf(footerBuf, sizeof(footerBuf), "Swipe: Navigate Tap: Open Hold: Delete"); - else - snprintf(footerBuf, sizeof(footerBuf), "Swipe: Navigate Tap: Open Hold: Exit"); -#else bool hasData = (_cookieCount > 0 || !_history.empty()); bool onBookmark = (_homeSelected >= 3 && _homeSelected < 3 + (int)_bookmarks.size()); if (onBookmark && hasData) @@ -3169,7 +3121,6 @@ private: snprintf(footerBuf, sizeof(footerBuf), "Q:Bk W/S Ent:Go X:Clr Ckies"); else snprintf(footerBuf, sizeof(footerBuf), "Q:Bk W/S:Nav Ent:Go"); -#endif display.print(footerBuf); } @@ -3268,13 +3219,9 @@ private: display.setCursor(0, y + 6); display.setColor(DisplayDriver::GREEN); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.print("Tap: Open in Reader"); -#else display.print("Ent: Open in Reader"); display.setCursor(0, y + 16); display.print("Q: Back to browser"); -#endif } else { display.setColor(DisplayDriver::YELLOW); display.print("Download Failed"); @@ -3289,11 +3236,7 @@ private: display.setCursor(0, 56); display.setColor(DisplayDriver::GREEN); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.print("Tap: Back to browser"); -#else display.print("Q: Back to browser"); -#endif } // Footer @@ -3302,11 +3245,7 @@ private: display.drawRect(0, footerY - 2, display.width(), 1); display.setCursor(0, footerY); display.setColor(DisplayDriver::YELLOW); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.print(_downloadOk ? "Tap: Open in Reader" : "Tap: Back"); -#else display.print(_downloadOk ? "Ent:Read Q:Back" : "Q:Back"); -#endif } void renderReading(DisplayDriver& display) { @@ -3434,13 +3373,6 @@ private: if (_linkInputActive) { snprintf(linkBuf, sizeof(linkBuf), "#%d_ Ent:Go", _linkInput); hint = linkBuf; -#if defined(LilyGo_T5S3_EPaper_Pro) - } else if (_linkCount > 0) { - hint = "Tap: Page | Tap Footer Bar: Enter Link # | Hold: Back"; - } else { - hint = "Tap: Page Hold: Back"; - } -#else } else if (_formCount > 0 && _linkCount > 0) { hint = "L:Lnk F:Frm B:Bk Q:X"; } else if (_formCount > 0) { @@ -3450,7 +3382,6 @@ private: } else { hint = "B:Bk Q:X"; } -#endif display.setCursor(display.width() - display.getTextWidth(hint) - 2, footerY); display.print(hint); @@ -3988,11 +3919,7 @@ private: // Field value if (isActive) { display.setColor(DisplayDriver::LIGHT); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.fillRect(0, y, display.width(), 9); -#else display.fillRect(0, y + 4, display.width(), 9); -#endif display.setColor(DisplayDriver::DARK); } else { display.setColor(DisplayDriver::LIGHT); @@ -4062,14 +3989,10 @@ private: display.print("Type text Ent:Next Sh+Del:Undo"); } else { const char* hint; -#if defined(LilyGo_T5S3_EPaper_Pro) - hint = "Swipe: Navigate Tap: Edit Hold: Back"; -#else if (_formCount > 1) hint = "W/S:Nav Ent:Edit :Form Sh+Del:Back"; else hint = "W/S:Nav Ent:Edit/Go Sh+Del:Back"; -#endif display.print(hint); } } @@ -4690,11 +4613,7 @@ private: bool sel = (_ircSetupField == i); if (sel) { display.setColor(DisplayDriver::LIGHT); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.fillRect(0, y, display.width(), lineH); -#else display.fillRect(0, y + 4, display.width(), lineH); -#endif display.setColor(DisplayDriver::DARK); } else { display.setColor(DisplayDriver::LIGHT); @@ -4742,11 +4661,7 @@ private: display.drawRect(0, footerY - 2, display.width(), 1); display.setCursor(0, footerY); display.setColor(DisplayDriver::YELLOW); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.print("Swipe: Navigate Tap: Edit Hold: Back"); -#else display.print("W/S:Nav Ent:Edit/Go Sh+Del:Back"); -#endif } bool handleIRCSetupInput(char c) { @@ -4876,19 +4791,11 @@ private: display.setTextSize(1); display.setColor(DisplayDriver::YELLOW); display.setCursor(0, footerY); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.print("Tap: Send Hold: Exit"); -#else display.print("Ent:Send Del:Exit"); -#endif } else { display.setColor(DisplayDriver::YELLOW); display.setCursor(0, footerY); -#if defined(LilyGo_T5S3_EPaper_Pro) - display.print("Tap: Compose Swipe: Scroll Hold: Back"); -#else display.print("Ent:Msg W/S:Scrl Sh+Del:Bk"); -#endif } // Message area @@ -5277,32 +5184,10 @@ public: (_mode == IRC_SETUP && _ircSetupEditing); } - // ---- Accessors for T5S3 touch mapping and VKB integration ---- + // ---- Accessors for touch mapping ---- int getHomeSelected() const { return _homeSelected; } - int getLinkCount() const { return _linkCount; } int getBookmarkCount() const { return (int)_bookmarks.size(); } - const char* getUrlText() const { return _urlBuffer; } - // Set URL text and activate editing mode (for VKB submit) - void setUrlText(const char* text) { - strncpy(_urlBuffer, text, WEB_MAX_URL_LEN - 1); - _urlBuffer[WEB_MAX_URL_LEN - 1] = '\0'; - _urlLen = strlen(_urlBuffer); - _urlEditing = true; - } - // Set search text and activate editing mode (for VKB submit) - void setSearchText(const char* text) { - strncpy(_searchBuffer, text, sizeof(_searchBuffer) - 1); - _searchBuffer[sizeof(_searchBuffer) - 1] = '\0'; - _searchLen = strlen(_searchBuffer); - _searchEditing = true; - } - // Set WiFi password text (for VKB submit) - void setWifiPassText(const char* text) { - strncpy(_wifiPass, text, WEB_WIFI_PASS_LEN - 1); - _wifiPass[WEB_WIFI_PASS_LEN - 1] = '\0'; - _wifiPassLen = strlen(_wifiPass); - } // Returns true if a password reveal is active and needs a refresh after expiry bool needsRevealRefresh() const { if (_formLastCharAt > 0 && (millis() - _formLastCharAt) < 900) { diff --git a/examples/companion_radio/ui-new/fonts/Montserrat12pt7b.h b/examples/companion_radio/ui-new/fonts/Montserrat12pt7b.h deleted file mode 100644 index f9b4ca38..00000000 --- a/examples/companion_radio/ui-new/fonts/Montserrat12pt7b.h +++ /dev/null @@ -1,288 +0,0 @@ -#ifndef MONTSERRAT12PT7B_H -#define MONTSERRAT12PT7B_H -const uint8_t Montserrat_Regular12pt7bBitmaps[] PROGMEM = { - 0x00, 0xFF, 0xFF, 0xFF, 0x03, 0xC0, 0x8C, 0x63, 0x18, 0xC6, 0x20, 0x04, - 0x10, 0x18, 0x20, 0x30, 0x40, 0x61, 0x80, 0x83, 0x1F, 0xFF, 0xC2, 0x08, - 0x04, 0x10, 0x08, 0x20, 0x30, 0x40, 0x60, 0x87, 0xFF, 0xE1, 0x06, 0x02, - 0x0C, 0x04, 0x10, 0x08, 0x20, 0x10, 0x40, 0x02, 0x00, 0x10, 0x00, 0x80, - 0x1F, 0x83, 0xFF, 0x31, 0x09, 0x88, 0x08, 0x40, 0x42, 0x03, 0x10, 0x0E, - 0x80, 0x3F, 0x00, 0x3E, 0x01, 0x18, 0x08, 0x60, 0x43, 0x02, 0x1E, 0x11, - 0x9E, 0xF8, 0x3F, 0x80, 0x20, 0x01, 0x00, 0x08, 0x00, 0x3C, 0x02, 0x19, - 0x81, 0x8C, 0x20, 0xC2, 0x08, 0x20, 0x83, 0x10, 0x20, 0xCC, 0x08, 0x22, - 0x01, 0x19, 0x00, 0x3C, 0xCF, 0x00, 0x26, 0x60, 0x11, 0x0C, 0x0C, 0xC1, - 0x02, 0x30, 0x41, 0x0C, 0x10, 0xC1, 0x0C, 0x20, 0x62, 0x10, 0x0F, 0x00, - 0x0F, 0x80, 0x3B, 0x80, 0xC1, 0x01, 0x82, 0x03, 0x04, 0x03, 0x18, 0x06, - 0xE0, 0x07, 0x00, 0x1E, 0x00, 0x66, 0x11, 0x86, 0x36, 0x06, 0x4C, 0x07, - 0x98, 0x06, 0x18, 0x0E, 0x3C, 0x76, 0x1F, 0x84, 0xFE, 0x18, 0x8C, 0x46, - 0x31, 0x88, 0x42, 0x31, 0x84, 0x21, 0x08, 0x63, 0x18, 0x43, 0x08, 0x60, - 0xC4, 0x66, 0x23, 0x33, 0x11, 0x11, 0x11, 0x13, 0x33, 0x26, 0x64, 0xC0, - 0x10, 0x10, 0x93, 0x7E, 0x38, 0x7C, 0x93, 0x10, 0x10, 0x0C, 0x03, 0x00, - 0xC0, 0x30, 0xFF, 0xC3, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0x1D, 0xA4, - 0xB0, 0xFE, 0x1F, 0x80, 0x00, 0xC0, 0x20, 0x18, 0x06, 0x01, 0x00, 0xC0, - 0x30, 0x08, 0x06, 0x01, 0x00, 0x40, 0x30, 0x08, 0x02, 0x01, 0x80, 0x40, - 0x30, 0x0C, 0x02, 0x01, 0x80, 0x60, 0x10, 0x00, 0x07, 0x80, 0x7F, 0x83, - 0x03, 0x18, 0x06, 0x60, 0x19, 0x00, 0x6C, 0x00, 0xF0, 0x03, 0xC0, 0x0F, - 0x00, 0x3C, 0x00, 0xD0, 0x02, 0x60, 0x19, 0x80, 0x63, 0x03, 0x07, 0xF8, - 0x0F, 0xC0, 0xFF, 0xF0, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, - 0x30, 0xC3, 0x0C, 0x1F, 0x83, 0xFF, 0x38, 0x18, 0x00, 0x60, 0x03, 0x00, - 0x18, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xC0, - 0x0C, 0x00, 0xC0, 0x0F, 0xFF, 0x7F, 0xF8, 0x7F, 0xF7, 0xFF, 0x00, 0x60, - 0x0C, 0x01, 0x80, 0x30, 0x03, 0x00, 0x60, 0x07, 0xE0, 0x07, 0x00, 0x30, - 0x01, 0x00, 0x10, 0x03, 0x40, 0x37, 0xDE, 0x1F, 0xC0, 0x00, 0x60, 0x01, - 0x80, 0x06, 0x00, 0x18, 0x00, 0x60, 0x00, 0xC0, 0x03, 0x00, 0x0C, 0x30, - 0x30, 0x60, 0xC0, 0xC1, 0x81, 0x87, 0xFF, 0xFF, 0xFF, 0xE0, 0x0C, 0x00, - 0x18, 0x00, 0x30, 0x00, 0x60, 0x3F, 0xE7, 0xFE, 0x60, 0x06, 0x00, 0x60, - 0x06, 0x00, 0x60, 0x07, 0xF0, 0x7F, 0xC0, 0x06, 0x00, 0x60, 0x03, 0x00, - 0x30, 0x02, 0xC0, 0x6F, 0xBC, 0x3F, 0x80, 0x07, 0xE0, 0xFF, 0x8E, 0x00, - 0xC0, 0x06, 0x00, 0x20, 0x03, 0x00, 0x19, 0xF8, 0xDE, 0xE7, 0x81, 0xB8, - 0x07, 0xC0, 0x36, 0x01, 0xB0, 0x0C, 0xC0, 0xC3, 0x9E, 0x0F, 0xC0, 0xFF, - 0xFF, 0xFF, 0x80, 0x38, 0x06, 0x80, 0x60, 0x0C, 0x00, 0xC0, 0x18, 0x01, - 0x80, 0x10, 0x03, 0x00, 0x30, 0x06, 0x00, 0x60, 0x0C, 0x00, 0xC0, 0x18, - 0x00, 0x0F, 0x81, 0xFF, 0x18, 0x0C, 0xC0, 0x26, 0x01, 0xB0, 0x09, 0x80, - 0xC7, 0xBC, 0x1F, 0xE3, 0x83, 0x98, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0D, - 0x80, 0xEF, 0x1E, 0x1F, 0xC0, 0x1F, 0x07, 0xFC, 0xE0, 0x6C, 0x02, 0xC0, - 0x38, 0x03, 0xC0, 0x3C, 0x07, 0x71, 0xD3, 0xF9, 0x00, 0x30, 0x03, 0x00, - 0x30, 0x06, 0x00, 0xE6, 0x7C, 0x7F, 0x00, 0x1F, 0x80, 0x00, 0x00, 0x7E, - 0x1F, 0x80, 0x00, 0x00, 0x76, 0x92, 0xC0, 0x00, 0xC1, 0xE1, 0xE3, 0xC0, - 0xC0, 0x3C, 0x03, 0xC0, 0x1E, 0x01, 0xC0, 0x00, 0xFF, 0xFF, 0xF0, 0x00, - 0x00, 0x00, 0x00, 0x0F, 0xFC, 0xC0, 0x1C, 0x01, 0xE0, 0x0E, 0x00, 0xC0, - 0xF0, 0xE1, 0xE0, 0xC0, 0x00, 0x00, 0x1F, 0x87, 0xFE, 0xE0, 0x60, 0x03, - 0x00, 0x30, 0x03, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x03, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 0xFE, 0x00, 0x07, - 0x07, 0x00, 0x30, 0x01, 0x80, 0xC0, 0x01, 0x83, 0x00, 0x01, 0x84, 0x1F, - 0x91, 0x10, 0x61, 0xA3, 0x21, 0x80, 0xC2, 0xC2, 0x01, 0x85, 0x8C, 0x01, - 0x0B, 0x18, 0x02, 0x1E, 0x30, 0x04, 0x3C, 0x60, 0x08, 0x58, 0x40, 0x30, - 0x90, 0xC0, 0xE1, 0x30, 0xE3, 0x64, 0x20, 0xFC, 0x78, 0x60, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x70, 0x00, 0x00, 0x3C, 0xF0, 0x00, 0x1F, 0x80, 0x00, - 0x00, 0xC0, 0x00, 0xE0, 0x00, 0x58, 0x00, 0x6C, 0x00, 0x22, 0x00, 0x31, - 0x80, 0x18, 0x40, 0x18, 0x30, 0x0C, 0x18, 0x0C, 0x06, 0x06, 0x03, 0x03, - 0xFF, 0xC3, 0xFF, 0xE1, 0x00, 0x19, 0x80, 0x0C, 0xC0, 0x02, 0xC0, 0x01, - 0x80, 0xFF, 0xC3, 0xFF, 0xCC, 0x03, 0x30, 0x06, 0xC0, 0x1B, 0x00, 0x6C, - 0x01, 0x30, 0x1C, 0xFF, 0xE3, 0x00, 0xEC, 0x01, 0xB0, 0x03, 0xC0, 0x0F, - 0x00, 0x3C, 0x01, 0xB0, 0x3E, 0xFF, 0xE0, 0x03, 0xF0, 0x1F, 0xF8, 0x70, - 0x19, 0x80, 0x06, 0x00, 0x0C, 0x00, 0x30, 0x00, 0x60, 0x00, 0xC0, 0x01, - 0x80, 0x03, 0x00, 0x03, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x01, 0x87, - 0xBE, 0x07, 0xF8, 0xFF, 0x80, 0xFF, 0xF0, 0xC0, 0x38, 0xC0, 0x0C, 0xC0, - 0x06, 0xC0, 0x06, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, - 0x02, 0xC0, 0x06, 0xC0, 0x06, 0xC0, 0x0C, 0xC0, 0x38, 0xFF, 0xF0, 0xFF, - 0xC0, 0xFF, 0xEF, 0xFE, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, - 0x00, 0xFF, 0xCC, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0F, - 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, - 0x06, 0x00, 0xFF, 0xDF, 0xFB, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, - 0x00, 0xC0, 0x00, 0x03, 0xF0, 0x1F, 0xF8, 0x70, 0x19, 0x80, 0x06, 0x00, - 0x0C, 0x00, 0x30, 0x00, 0x60, 0x00, 0xC0, 0x01, 0x80, 0x07, 0x00, 0x0B, - 0x00, 0x16, 0x00, 0x26, 0x00, 0x46, 0x01, 0x87, 0xDF, 0x03, 0xF8, 0xC0, - 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, - 0x03, 0xFF, 0xFF, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x3C, - 0x00, 0xF0, 0x03, 0xC0, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x3F, 0x9F, - 0xC0, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0x80, 0x40, 0x20, 0x10, - 0x08, 0x0F, 0x07, 0xEE, 0x3E, 0x00, 0xC0, 0x1B, 0x00, 0xCC, 0x06, 0x30, - 0x30, 0xC1, 0x83, 0x0C, 0x0C, 0x60, 0x33, 0x00, 0xDE, 0x03, 0xFC, 0x0F, - 0x30, 0x38, 0x60, 0xC0, 0xC3, 0x01, 0x8C, 0x03, 0x30, 0x0E, 0xC0, 0x1C, - 0xC0, 0x18, 0x03, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, - 0x18, 0x03, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x07, 0xFF, 0xFF, 0xE0, - 0x80, 0x00, 0xE0, 0x00, 0xF8, 0x00, 0xFC, 0x00, 0x7B, 0x00, 0x7C, 0x80, - 0x2E, 0x60, 0x37, 0x10, 0x33, 0x8C, 0x19, 0xC3, 0x18, 0xE1, 0x88, 0x70, - 0x6C, 0x38, 0x14, 0x1C, 0x0E, 0x0E, 0x02, 0x07, 0x00, 0x03, 0x80, 0x01, - 0x80, 0x80, 0x0F, 0x00, 0x3E, 0x00, 0xFC, 0x03, 0xF8, 0x0F, 0x60, 0x3C, - 0xC0, 0xF1, 0x83, 0xC3, 0x0F, 0x0E, 0x3C, 0x18, 0xF0, 0x33, 0xC0, 0x6F, - 0x00, 0xFC, 0x03, 0xF0, 0x07, 0xC0, 0x0C, 0x03, 0xF0, 0x03, 0xFF, 0x01, - 0xC0, 0x60, 0xC0, 0x0C, 0x60, 0x01, 0x98, 0x00, 0x6C, 0x00, 0x0F, 0x00, - 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0D, 0x80, 0x02, 0x60, 0x01, - 0x8C, 0x00, 0xC1, 0x80, 0x70, 0x3C, 0xF0, 0x03, 0xF8, 0x00, 0xFF, 0x87, - 0xFF, 0x30, 0x1D, 0x80, 0x6C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, - 0x36, 0x03, 0xBF, 0xF9, 0xFE, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x18, 0x00, - 0xC0, 0x00, 0x03, 0xF0, 0x01, 0xFF, 0x80, 0x70, 0x18, 0x18, 0x01, 0x86, - 0x00, 0x18, 0xC0, 0x03, 0x30, 0x00, 0x36, 0x00, 0x06, 0xC0, 0x00, 0xD8, - 0x00, 0x1B, 0x00, 0x03, 0x30, 0x00, 0xC6, 0x00, 0x18, 0x60, 0x06, 0x06, - 0x01, 0xC0, 0x79, 0xE0, 0x07, 0xF8, 0x00, 0x0E, 0x00, 0x00, 0xE3, 0x80, - 0x07, 0xE0, 0xFF, 0x87, 0xFF, 0x30, 0x1D, 0x80, 0x6C, 0x01, 0xE0, 0x0F, - 0x00, 0x78, 0x03, 0xC0, 0x36, 0x03, 0xBF, 0xF9, 0xFF, 0x0C, 0x0C, 0x60, - 0x33, 0x01, 0x98, 0x06, 0xC0, 0x18, 0x0F, 0xC1, 0xFF, 0x98, 0x04, 0xC0, - 0x04, 0x00, 0x20, 0x01, 0x80, 0x07, 0x00, 0x1F, 0x80, 0x0F, 0x00, 0x0C, - 0x00, 0x30, 0x01, 0x80, 0x0F, 0x00, 0xCF, 0x3C, 0x1F, 0xC0, 0xFF, 0xFF, - 0xFF, 0xF0, 0x30, 0x00, 0xC0, 0x03, 0x00, 0x0C, 0x00, 0x30, 0x00, 0xC0, - 0x03, 0x00, 0x0C, 0x00, 0x30, 0x00, 0xC0, 0x03, 0x00, 0x0C, 0x00, 0x30, - 0x00, 0xC0, 0x03, 0x00, 0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x18, 0x00, - 0xC0, 0x06, 0x00, 0x30, 0x01, 0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x3C, - 0x01, 0xE0, 0x0D, 0x80, 0xC7, 0xBC, 0x1F, 0xC0, 0xC0, 0x01, 0xB0, 0x01, - 0x98, 0x00, 0xC4, 0x00, 0xC3, 0x00, 0x61, 0x80, 0x20, 0x60, 0x30, 0x30, - 0x10, 0x0C, 0x18, 0x06, 0x0C, 0x01, 0x8C, 0x00, 0xC6, 0x00, 0x26, 0x00, - 0x1B, 0x00, 0x0D, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x00, 0xC0, 0x18, 0x01, - 0xE0, 0x0E, 0x00, 0x90, 0x07, 0x00, 0xCC, 0x06, 0x80, 0x66, 0x03, 0x60, - 0x21, 0x01, 0x30, 0x30, 0xC1, 0x88, 0x18, 0x60, 0xC6, 0x08, 0x18, 0x43, - 0x0C, 0x0C, 0x60, 0x86, 0x06, 0x30, 0x62, 0x01, 0x10, 0x33, 0x00, 0xD8, - 0x09, 0x80, 0x6C, 0x06, 0x80, 0x1C, 0x03, 0xC0, 0x0E, 0x00, 0xE0, 0x07, - 0x00, 0x60, 0x00, 0x60, 0x06, 0x60, 0x18, 0xE0, 0x60, 0xC0, 0x80, 0xC3, - 0x00, 0xCC, 0x01, 0xF0, 0x01, 0xE0, 0x01, 0x80, 0x07, 0x80, 0x1B, 0x80, - 0x63, 0x00, 0xC3, 0x03, 0x03, 0x0C, 0x07, 0x18, 0x06, 0x60, 0x06, 0xC0, - 0x06, 0xC0, 0x09, 0x80, 0x31, 0x80, 0xC1, 0x81, 0x83, 0x06, 0x03, 0x08, - 0x06, 0x30, 0x06, 0xC0, 0x07, 0x80, 0x0E, 0x00, 0x0C, 0x00, 0x18, 0x00, - 0x30, 0x00, 0x60, 0x00, 0xC0, 0x01, 0x80, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, - 0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x1C, 0x00, 0x60, 0x03, 0x00, 0x18, - 0x00, 0xC0, 0x07, 0x00, 0x18, 0x00, 0xC0, 0x06, 0x00, 0x3F, 0xFF, 0xFF, - 0xFC, 0xFF, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8F, - 0xF0, 0xC0, 0x10, 0x06, 0x01, 0x80, 0x20, 0x0C, 0x01, 0x00, 0x40, 0x18, - 0x02, 0x00, 0x80, 0x30, 0x04, 0x01, 0x80, 0x60, 0x08, 0x03, 0x00, 0xC0, - 0x10, 0x06, 0x01, 0x80, 0x20, 0xFF, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0xC6, - 0x31, 0x8C, 0x63, 0x18, 0xC6, 0x31, 0xFF, 0xE0, 0x0C, 0x07, 0x01, 0x60, - 0x48, 0x33, 0x08, 0x46, 0x19, 0x02, 0xC0, 0xA0, 0x30, 0xFF, 0xF0, 0xE0, - 0xC1, 0x80, 0x0E, 0x0F, 0xF9, 0x83, 0x00, 0x30, 0x06, 0x00, 0xCF, 0xFB, - 0x03, 0xC0, 0x78, 0x0F, 0x03, 0xB8, 0xF3, 0xF6, 0xC0, 0x06, 0x00, 0x30, - 0x01, 0x80, 0x0C, 0x00, 0x63, 0xC3, 0x7F, 0x9E, 0x0E, 0xE0, 0x36, 0x00, - 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x80, 0x7E, 0x06, 0xDC, 0xE6, - 0x7E, 0x00, 0x07, 0x01, 0xFC, 0x30, 0x66, 0x00, 0xC0, 0x0C, 0x00, 0xC0, - 0x0C, 0x00, 0xC0, 0x06, 0x00, 0x60, 0x23, 0xDE, 0x0F, 0x80, 0x00, 0x18, - 0x00, 0xC0, 0x06, 0x00, 0x30, 0x01, 0x83, 0x8C, 0x7F, 0x6E, 0x0F, 0x60, - 0x3E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0D, 0x80, 0xEC, 0x07, - 0x3D, 0xD8, 0xFC, 0xC0, 0x07, 0x01, 0xFC, 0x70, 0x66, 0x03, 0xC0, 0x3C, - 0x01, 0xFF, 0xFC, 0x00, 0xC0, 0x06, 0x00, 0x60, 0x23, 0xDE, 0x0F, 0xC0, - 0x0F, 0x0F, 0xC6, 0x02, 0x01, 0x07, 0xFB, 0xFC, 0x20, 0x10, 0x08, 0x04, - 0x02, 0x01, 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x00, 0x07, 0x19, 0xFE, - 0xDC, 0x1E, 0xC0, 0x7C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1B, - 0x01, 0xCC, 0x1E, 0x3F, 0xB0, 0x21, 0x80, 0x0C, 0x00, 0x6C, 0x06, 0x3F, - 0xE0, 0x7C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x78, - 0xDF, 0xCF, 0x06, 0xE0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, - 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xF0, 0x3F, 0xFF, 0xFF, 0xF0, 0x0C, - 0x30, 0x00, 0x00, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, - 0x30, 0xC3, 0x0F, 0xE7, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, - 0x0C, 0x07, 0xC0, 0xEC, 0x1C, 0xC3, 0x0C, 0x60, 0xCC, 0x0D, 0xE0, 0xF3, - 0x0E, 0x18, 0xC1, 0x8C, 0x0C, 0xC0, 0x6C, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF0, 0xC7, 0x01, 0xC6, 0xFE, 0x7F, 0xBC, 0x1E, 0x0D, 0xC0, 0xE0, 0x3C, - 0x03, 0x01, 0xE0, 0x18, 0x0F, 0x00, 0xC0, 0x78, 0x06, 0x03, 0xC0, 0x30, - 0x1E, 0x01, 0x80, 0xF0, 0x0C, 0x07, 0x80, 0x60, 0x3C, 0x03, 0x01, 0x80, - 0xC7, 0x8D, 0xFC, 0xF0, 0x6E, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, - 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x30, 0x07, 0x00, 0xFE, 0x0C, - 0x1C, 0xC0, 0x6C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1B, 0x01, - 0x98, 0x0C, 0x7B, 0xC0, 0xF8, 0x00, 0xC7, 0x86, 0xFF, 0x3C, 0x1D, 0xC0, - 0x6C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1F, 0x00, 0xFC, 0x0D, - 0xB9, 0xCC, 0xFC, 0x60, 0x03, 0x00, 0x18, 0x00, 0xC0, 0x06, 0x00, 0x00, - 0x07, 0x18, 0xFE, 0xDC, 0x1E, 0xC0, 0x7C, 0x01, 0xE0, 0x0F, 0x00, 0x78, - 0x03, 0xC0, 0x1B, 0x01, 0xD8, 0x0E, 0x7B, 0xB1, 0xF9, 0x80, 0x0C, 0x00, - 0x60, 0x03, 0x00, 0x18, 0x00, 0xC0, 0xC7, 0xBF, 0xC7, 0x0C, 0x18, 0x30, - 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x00, 0x0E, 0x1F, 0xFC, 0x0B, 0x00, 0xC0, - 0x38, 0x07, 0xE0, 0x1E, 0x00, 0xC0, 0x38, 0x0F, 0xCE, 0x7F, 0x00, 0x10, - 0x08, 0x3F, 0xDF, 0xE1, 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, - 0x01, 0x80, 0xE4, 0x3E, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, - 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x07, 0x60, 0x77, 0x9F, 0x1F, 0x30, - 0xC0, 0x1A, 0x00, 0xD8, 0x0C, 0xC0, 0x63, 0x06, 0x18, 0x30, 0x41, 0x03, - 0x18, 0x08, 0x80, 0x6C, 0x03, 0x40, 0x0E, 0x00, 0x70, 0x00, 0xC0, 0x20, - 0x1A, 0x03, 0x80, 0xD8, 0x1C, 0x04, 0xC0, 0xA0, 0x62, 0x0D, 0x82, 0x18, - 0x44, 0x30, 0xC2, 0x31, 0x82, 0x31, 0x88, 0x19, 0x04, 0xC0, 0x58, 0x34, - 0x03, 0xC0, 0xA0, 0x1C, 0x07, 0x00, 0x60, 0x30, 0x00, 0x60, 0x32, 0x06, - 0x30, 0x41, 0x8C, 0x0D, 0x80, 0x70, 0x06, 0x00, 0x70, 0x0D, 0x81, 0x8C, - 0x30, 0x43, 0x06, 0x60, 0x30, 0x60, 0x0C, 0x80, 0x33, 0x01, 0x8C, 0x06, - 0x18, 0x30, 0x60, 0xC0, 0xC2, 0x03, 0x18, 0x04, 0x40, 0x1B, 0x00, 0x28, - 0x00, 0xE0, 0x03, 0x80, 0x0C, 0x00, 0x30, 0x01, 0x80, 0xFC, 0x00, 0xE0, - 0x00, 0xFF, 0xFF, 0xF0, 0x18, 0x06, 0x03, 0x01, 0x80, 0xC0, 0x60, 0x18, - 0x0C, 0x06, 0x03, 0x00, 0xFF, 0xC0, 0x0E, 0x3C, 0xC1, 0x83, 0x06, 0x0C, - 0x18, 0x30, 0x60, 0xC7, 0x03, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, - 0x03, 0xC3, 0x80, 0xFF, 0xFF, 0xFE, 0xE1, 0xE0, 0x60, 0xC1, 0x83, 0x06, - 0x0C, 0x18, 0x30, 0x60, 0x71, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, - 0x9E, 0x38, 0x00, 0x7C, 0x28, 0xC5, 0x0F, 0x00 }; - -const GFXglyph Montserrat_Regular12pt7bGlyphs[] PROGMEM = { - { 0, 1, 1, 6, 0, 0 }, // 0x20 ' ' - { 1, 2, 17, 6, 2, -16 }, // 0x21 '!' - { 6, 5, 7, 9, 2, -16 }, // 0x22 '"' - { 11, 15, 17, 17, 1, -16 }, // 0x23 '#' - { 43, 13, 23, 15, 1, -19 }, // 0x24 '$' - { 81, 18, 17, 20, 1, -16 }, // 0x25 '%' - { 120, 15, 17, 16, 1, -16 }, // 0x26 '&' - { 152, 1, 7, 5, 2, -16 }, // 0x27 ''' - { 153, 5, 23, 8, 2, -17 }, // 0x28 '(' - { 168, 4, 23, 8, 1, -17 }, // 0x29 ')' - { 180, 8, 9, 9, 1, -17 }, // 0x2A '*' - { 189, 10, 10, 14, 2, -12 }, // 0x2B '+' - { 202, 3, 7, 5, 1, -2 }, // 0x2C ',' - { 205, 7, 1, 9, 1, -6 }, // 0x2D '-' - { 206, 3, 3, 5, 1, -2 }, // 0x2E '.' - { 208, 10, 22, 8, -1, -19 }, // 0x2F '/' - { 236, 14, 17, 16, 1, -16 }, // 0x30 '0' - { 266, 6, 17, 9, 0, -16 }, // 0x31 '1' - { 279, 13, 17, 14, 0, -16 }, // 0x32 '2' - { 307, 12, 17, 14, 0, -16 }, // 0x33 '3' - { 333, 15, 17, 16, 1, -16 }, // 0x34 '4' - { 365, 12, 17, 14, 1, -16 }, // 0x35 '5' - { 391, 13, 17, 15, 1, -16 }, // 0x36 '6' - { 419, 12, 17, 14, 1, -16 }, // 0x37 '7' - { 445, 13, 17, 15, 1, -16 }, // 0x38 '8' - { 473, 12, 17, 15, 1, -16 }, // 0x39 '9' - { 499, 3, 13, 5, 1, -12 }, // 0x3A ':' - { 504, 3, 17, 5, 1, -12 }, // 0x3B ';' - { 511, 10, 10, 14, 2, -12 }, // 0x3C '<' - { 524, 10, 7, 14, 2, -11 }, // 0x3D '=' - { 533, 10, 10, 14, 2, -12 }, // 0x3E '>' - { 546, 12, 17, 14, 0, -16 }, // 0x3F '?' - { 572, 23, 22, 25, 1, -16 }, // 0x40 '@' - { 636, 17, 17, 17, 0, -16 }, // 0x41 'A' - { 673, 14, 17, 18, 3, -16 }, // 0x42 'B' - { 703, 15, 17, 17, 1, -16 }, // 0x43 'C' - { 735, 16, 17, 20, 3, -16 }, // 0x44 'D' - { 769, 12, 17, 16, 3, -16 }, // 0x45 'E' - { 795, 11, 17, 15, 3, -16 }, // 0x46 'F' - { 819, 15, 17, 19, 1, -16 }, // 0x47 'G' - { 851, 14, 17, 20, 3, -16 }, // 0x48 'H' - { 881, 2, 17, 7, 3, -16 }, // 0x49 'I' - { 886, 9, 17, 12, 0, -16 }, // 0x4A 'J' - { 906, 14, 17, 17, 3, -16 }, // 0x4B 'K' - { 936, 11, 17, 14, 3, -16 }, // 0x4C 'L' - { 960, 17, 17, 23, 3, -16 }, // 0x4D 'M' - { 997, 14, 17, 20, 3, -16 }, // 0x4E 'N' - { 1027, 18, 17, 20, 1, -16 }, // 0x4F 'O' - { 1066, 13, 17, 17, 3, -16 }, // 0x50 'P' - { 1094, 19, 20, 20, 1, -16 }, // 0x51 'Q' - { 1142, 13, 17, 17, 3, -16 }, // 0x52 'R' - { 1170, 13, 17, 15, 1, -16 }, // 0x53 'S' - { 1198, 14, 17, 14, 0, -16 }, // 0x54 'T' - { 1228, 13, 17, 19, 3, -16 }, // 0x55 'U' - { 1256, 17, 17, 17, 0, -16 }, // 0x56 'V' - { 1293, 25, 17, 27, 1, -16 }, // 0x57 'W' - { 1347, 15, 17, 16, 0, -16 }, // 0x58 'X' - { 1379, 15, 17, 15, 0, -16 }, // 0x59 'Y' - { 1411, 14, 17, 16, 1, -16 }, // 0x5A 'Z' - { 1441, 4, 23, 8, 3, -17 }, // 0x5B '[' - { 1453, 10, 22, 8, -1, -19 }, // 0x5C '\' - { 1481, 5, 23, 8, 0, -17 }, // 0x5D ']' - { 1496, 10, 10, 14, 2, -12 }, // 0x5E '^' - { 1509, 12, 1, 12, 0, 1 }, // 0x5F '_' - { 1511, 6, 3, 14, 3, -17 }, // 0x60 '`' - { 1514, 11, 13, 14, 1, -12 }, // 0x61 'a' - { 1532, 13, 18, 16, 2, -17 }, // 0x62 'b' - { 1562, 12, 13, 14, 1, -12 }, // 0x63 'c' - { 1582, 13, 18, 16, 1, -17 }, // 0x64 'd' - { 1612, 12, 13, 15, 1, -12 }, // 0x65 'e' - { 1632, 9, 18, 8, 0, -17 }, // 0x66 'f' - { 1653, 13, 18, 16, 1, -12 }, // 0x67 'g' - { 1683, 12, 18, 16, 2, -17 }, // 0x68 'h' - { 1710, 2, 18, 6, 2, -17 }, // 0x69 'i' - { 1715, 6, 23, 7, -2, -17 }, // 0x6A 'j' - { 1733, 12, 18, 14, 2, -17 }, // 0x6B 'k' - { 1760, 2, 18, 6, 2, -17 }, // 0x6C 'l' - { 1765, 21, 13, 25, 2, -12 }, // 0x6D 'm' - { 1800, 12, 13, 16, 2, -12 }, // 0x6E 'n' - { 1820, 13, 13, 15, 1, -12 }, // 0x6F 'o' - { 1842, 13, 18, 16, 2, -12 }, // 0x70 'p' - { 1872, 13, 18, 16, 1, -12 }, // 0x71 'q' - { 1902, 7, 13, 10, 2, -12 }, // 0x72 'r' - { 1914, 10, 13, 12, 1, -12 }, // 0x73 's' - { 1931, 9, 15, 10, 0, -14 }, // 0x74 't' - { 1948, 12, 13, 16, 2, -12 }, // 0x75 'u' - { 1968, 13, 13, 13, 0, -12 }, // 0x76 'v' - { 1990, 21, 13, 21, 0, -12 }, // 0x77 'w' - { 2025, 12, 13, 13, 0, -12 }, // 0x78 'x' - { 2045, 14, 18, 13, -1, -12 }, // 0x79 'y' - { 2077, 10, 13, 12, 1, -12 }, // 0x7A 'z' - { 2094, 7, 23, 8, 1, -17 }, // 0x7B '{' - { 2115, 1, 23, 7, 3, -17 }, // 0x7C '|' - { 2118, 7, 23, 8, 0, -17 }, // 0x7D '}' - { 2139, 11, 3, 14, 1, -9 } }; // 0x7E '~' - -const GFXfont Montserrat_Regular12pt7b PROGMEM = { - (uint8_t *)Montserrat_Regular12pt7bBitmaps, - (GFXglyph *)Montserrat_Regular12pt7bGlyphs, - 0x20, 0x7E, 29 }; - -// Approx. 2816 bytes - -#endif // MONTSERRAT12PT7B_H diff --git a/examples/companion_radio/ui-new/fonts/Montserrat18pt7b.h b/examples/companion_radio/ui-new/fonts/Montserrat18pt7b.h deleted file mode 100644 index abb725a4..00000000 --- a/examples/companion_radio/ui-new/fonts/Montserrat18pt7b.h +++ /dev/null @@ -1,481 +0,0 @@ -#ifndef MONTSERRAT18PT7B_H -#define MONTSERRAT18PT7B_H -const uint8_t Montserrat_Regular18pt7bBitmaps[] PROGMEM = { - 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x6C, 0x00, 0x3F, 0xE0, 0xE3, - 0xF1, 0xF8, 0xFC, 0x76, 0x1B, 0x0D, 0x86, 0x82, 0x41, 0x20, 0x80, 0x01, - 0x80, 0xC0, 0x06, 0x03, 0x00, 0x18, 0x0C, 0x00, 0x60, 0x30, 0x01, 0x80, - 0xC0, 0x06, 0x03, 0x00, 0x30, 0x08, 0x1F, 0xFF, 0xFF, 0x7F, 0xFF, 0xFC, - 0x0C, 0x06, 0x00, 0x30, 0x18, 0x00, 0xC0, 0x60, 0x03, 0x01, 0x80, 0x0C, - 0x06, 0x00, 0x60, 0x10, 0x01, 0x80, 0xC0, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, - 0xE0, 0x60, 0x30, 0x01, 0x80, 0xC0, 0x06, 0x03, 0x00, 0x18, 0x0C, 0x00, - 0xC0, 0x20, 0x03, 0x01, 0x80, 0x0C, 0x06, 0x00, 0x00, 0xC0, 0x00, 0x30, - 0x00, 0x0C, 0x00, 0x03, 0x00, 0x01, 0xF0, 0x03, 0xFF, 0x83, 0xFF, 0xF9, - 0xE3, 0x0C, 0x70, 0xC0, 0x38, 0x30, 0x0E, 0x0C, 0x03, 0x83, 0x00, 0xE0, - 0xC0, 0x1C, 0x30, 0x07, 0x8C, 0x00, 0xFF, 0x00, 0x0F, 0xF8, 0x00, 0x7F, - 0x80, 0x0D, 0xF0, 0x03, 0x1E, 0x00, 0xC1, 0xC0, 0x30, 0x70, 0x0C, 0x1C, - 0x03, 0x07, 0x80, 0xC1, 0xF8, 0x30, 0xEF, 0x8C, 0xF0, 0xFF, 0xF8, 0x0F, - 0xF8, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x03, 0x00, 0x00, 0xC0, 0x00, 0x06, - 0x00, 0x06, 0x03, 0xF0, 0x01, 0x80, 0xC3, 0x00, 0x70, 0x30, 0x30, 0x0C, - 0x06, 0x06, 0x03, 0x00, 0x80, 0x40, 0xE0, 0x30, 0x0C, 0x18, 0x06, 0x01, - 0x86, 0x00, 0x40, 0x21, 0x80, 0x0C, 0x0C, 0x30, 0x01, 0x81, 0x8C, 0x00, - 0x18, 0x63, 0x00, 0x01, 0xF8, 0x63, 0xF0, 0x0C, 0x18, 0xFF, 0x00, 0x06, - 0x38, 0x70, 0x00, 0xC6, 0x06, 0x00, 0x30, 0x80, 0x40, 0x0C, 0x10, 0x08, - 0x01, 0x86, 0x01, 0x80, 0x60, 0x40, 0x30, 0x18, 0x08, 0x04, 0x07, 0x01, - 0x81, 0x80, 0xC0, 0x30, 0x30, 0x30, 0x03, 0xFC, 0x0E, 0x00, 0x3F, 0x00, - 0x01, 0xE0, 0x00, 0x3F, 0xC0, 0x03, 0x87, 0x00, 0x38, 0x18, 0x01, 0x80, - 0xE0, 0x0C, 0x03, 0x00, 0x60, 0x38, 0x03, 0x81, 0x80, 0x0C, 0x18, 0x00, - 0x73, 0x80, 0x01, 0xF8, 0x00, 0x07, 0x80, 0x00, 0xFC, 0x00, 0x0E, 0x70, - 0x00, 0xE1, 0xC1, 0xCE, 0x07, 0x0C, 0xE0, 0x1C, 0x66, 0x00, 0x77, 0x30, - 0x01, 0xF1, 0x80, 0x07, 0x8E, 0x00, 0x1C, 0x70, 0x03, 0xF1, 0xE0, 0x39, - 0xC7, 0xFF, 0x87, 0x0F, 0xF0, 0x10, 0xFF, 0xF6, 0xDA, 0x48, 0x1C, 0x63, - 0x8C, 0x31, 0xC6, 0x18, 0xE3, 0x8E, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, - 0x30, 0xC3, 0x0E, 0x38, 0xE1, 0x86, 0x1C, 0x30, 0xC3, 0x86, 0x0C, 0x60, - 0xE0, 0xC1, 0xC3, 0x83, 0x07, 0x0E, 0x0C, 0x18, 0x30, 0x70, 0xE1, 0xC3, - 0x87, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0x06, 0x0C, 0x38, 0x70, 0xC3, - 0x86, 0x0C, 0x38, 0x60, 0x06, 0x00, 0x60, 0x06, 0x0C, 0x67, 0x77, 0xE1, - 0xF8, 0x0F, 0x03, 0xF8, 0xF6, 0xEC, 0x62, 0x06, 0x00, 0x60, 0x06, 0x00, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, - 0x01, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x4E, 0xFE, 0x66, 0x4C, 0xC0, 0xFF, - 0xFF, 0xFF, 0xE0, 0x4E, 0xFE, 0x00, 0x1C, 0x00, 0x60, 0x01, 0x80, 0x0E, - 0x00, 0x30, 0x00, 0xC0, 0x07, 0x00, 0x18, 0x00, 0x60, 0x03, 0x00, 0x0C, - 0x00, 0x70, 0x01, 0x80, 0x06, 0x00, 0x38, 0x00, 0xC0, 0x03, 0x00, 0x1C, - 0x00, 0x60, 0x01, 0x80, 0x0E, 0x00, 0x30, 0x00, 0xC0, 0x07, 0x00, 0x18, - 0x00, 0x60, 0x03, 0x80, 0x0C, 0x00, 0x30, 0x01, 0x80, 0x06, 0x00, 0x38, - 0x00, 0xC0, 0x00, 0x00, 0xE0, 0x00, 0xFF, 0x80, 0x3F, 0xFC, 0x0E, 0x03, - 0xC3, 0x80, 0x38, 0xE0, 0x03, 0x9C, 0x00, 0x33, 0x00, 0x07, 0xE0, 0x00, - 0xFC, 0x00, 0x0F, 0x00, 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x07, 0x80, 0x00, - 0xF0, 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, 0xFC, 0x00, 0x1D, 0x80, 0x03, - 0x38, 0x00, 0xE3, 0x80, 0x1C, 0x78, 0x07, 0x07, 0x83, 0xC0, 0x7F, 0xF0, - 0x03, 0xF8, 0x00, 0xFF, 0xFF, 0xFF, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, - 0x03, 0x81, 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, 0x81, 0xC0, - 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, 0x80, 0x03, 0xE0, 0x07, 0xFE, - 0x07, 0xFF, 0xE3, 0xC0, 0x3C, 0xC0, 0x07, 0x00, 0x00, 0xC0, 0x00, 0x30, - 0x00, 0x0C, 0x00, 0x03, 0x00, 0x01, 0xC0, 0x00, 0x70, 0x00, 0x38, 0x00, - 0x1C, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x00, 0xE0, - 0x00, 0x70, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x03, - 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x7F, 0xFF, 0x9F, 0xFF, 0xE7, 0xFF, 0xF8, - 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x00, 0xE0, 0x00, - 0x70, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x07, 0xE0, 0x01, 0xFE, 0x00, 0x03, - 0xC0, 0x00, 0x38, 0x00, 0x07, 0x00, 0x01, 0xC0, 0x00, 0x70, 0x00, 0x1C, - 0x00, 0x07, 0x40, 0x01, 0xD8, 0x00, 0xE7, 0xC0, 0xF0, 0xFF, 0xF8, 0x0F, - 0xF8, 0x00, 0x00, 0x07, 0x00, 0x00, 0x18, 0x00, 0x00, 0xE0, 0x00, 0x07, - 0x00, 0x00, 0x38, 0x00, 0x01, 0xC0, 0x00, 0x06, 0x00, 0x00, 0x38, 0x00, - 0x01, 0xC0, 0x00, 0x0E, 0x00, 0x00, 0x70, 0x00, 0x01, 0x80, 0xE0, 0x0E, - 0x03, 0x80, 0x70, 0x0E, 0x03, 0x80, 0x38, 0x1C, 0x00, 0xE0, 0x7F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0xE0, 0x00, 0x03, 0x80, - 0x00, 0x0E, 0x00, 0x00, 0x38, 0x00, 0x00, 0xE0, 0x00, 0x03, 0x80, 0x1F, - 0xFF, 0x0F, 0xFF, 0x87, 0xFF, 0xC7, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x00, - 0xE0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x07, 0xFF, - 0x03, 0xFF, 0xE0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x07, 0x00, 0x01, 0x80, - 0x00, 0xC0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x3F, 0x00, 0x3B, 0xE0, 0x7C, - 0x7F, 0xFC, 0x0F, 0xF8, 0x00, 0x00, 0x7C, 0x00, 0xFF, 0xE0, 0xFF, 0xF0, - 0x78, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x07, 0x00, 0x01, 0x80, 0x00, 0xE0, - 0x00, 0x38, 0x00, 0x0C, 0x0F, 0x03, 0x1F, 0xF8, 0xCF, 0xBF, 0x37, 0x00, - 0xEF, 0x80, 0x1F, 0xC0, 0x07, 0xE0, 0x00, 0xF8, 0x00, 0x36, 0x00, 0x0D, - 0xC0, 0x07, 0x70, 0x01, 0xCE, 0x00, 0xE1, 0xE0, 0x78, 0x3F, 0xF8, 0x03, - 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x07, 0xE0, - 0x03, 0xB8, 0x00, 0xEE, 0x00, 0x70, 0x00, 0x1C, 0x00, 0x06, 0x00, 0x03, - 0x80, 0x00, 0xC0, 0x00, 0x70, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x03, 0x80, - 0x01, 0xC0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x03, 0x00, 0x01, - 0xC0, 0x00, 0x60, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x00, 0x01, - 0xF0, 0x01, 0xFF, 0xC0, 0xFC, 0xFC, 0x3C, 0x03, 0xC7, 0x00, 0x38, 0xC0, - 0x03, 0x98, 0x00, 0x73, 0x00, 0x0E, 0x60, 0x01, 0xCE, 0x00, 0x70, 0xE0, - 0x1C, 0x0F, 0xFF, 0x00, 0xFF, 0xE0, 0x7C, 0x3E, 0x1C, 0x00, 0xE7, 0x00, - 0x0E, 0xE0, 0x00, 0xD8, 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, 0x7E, 0x00, - 0x1C, 0xE0, 0x03, 0x9F, 0x01, 0xE1, 0xFF, 0xF8, 0x0F, 0xFC, 0x00, 0x03, - 0xC0, 0x01, 0xFF, 0x80, 0xFD, 0xF8, 0x3C, 0x03, 0x87, 0x00, 0x39, 0xC0, - 0x07, 0x38, 0x00, 0x77, 0x00, 0x0E, 0xE0, 0x01, 0xDC, 0x00, 0x39, 0x80, - 0x0F, 0x38, 0x03, 0xE3, 0xC0, 0xEC, 0x3F, 0xF9, 0x81, 0xFC, 0x30, 0x00, - 0x06, 0x00, 0x00, 0xC0, 0x00, 0x38, 0x00, 0x07, 0x00, 0x01, 0xC0, 0x00, - 0x30, 0x00, 0x1E, 0x0C, 0x0F, 0x81, 0xFF, 0xE0, 0x1F, 0xF0, 0x00, 0x4E, - 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xEF, 0xE0, 0x4E, 0xFE, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x04, 0xEF, 0xE6, 0x64, 0xCC, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x1F, 0x00, 0xFC, 0x03, 0xE0, 0x1F, 0x80, 0x7C, 0x00, 0xE0, - 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0xC0, 0x01, 0xF0, 0x00, 0x7E, 0x00, - 0x0F, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, - 0x00, 0xE0, 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00, - 0x3E, 0x00, 0x07, 0x00, 0x1F, 0x00, 0x7C, 0x03, 0xF0, 0x0F, 0x80, 0x7E, - 0x00, 0xF0, 0x00, 0xC0, 0x00, 0x01, 0xF0, 0x07, 0xFE, 0x0F, 0xFF, 0xCF, - 0x00, 0xE6, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x06, 0x00, 0x03, 0x00, 0x03, - 0x80, 0x01, 0x80, 0x01, 0xC0, 0x01, 0xC0, 0x01, 0xC0, 0x01, 0xC0, 0x01, - 0xC0, 0x00, 0xC0, 0x00, 0xE0, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x00, 0xE0, 0x00, 0x00, - 0x03, 0xE0, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x01, 0xF0, 0x0F, 0x80, 0x03, - 0x80, 0x01, 0xE0, 0x07, 0x00, 0x00, 0x70, 0x0C, 0x00, 0x00, 0x38, 0x18, - 0x00, 0x00, 0x1C, 0x30, 0x07, 0xC1, 0x8C, 0x30, 0x1F, 0xF1, 0x86, 0x60, - 0x3C, 0x3D, 0x86, 0x60, 0x70, 0x0D, 0x83, 0xC0, 0xE0, 0x07, 0x83, 0xC0, - 0xC0, 0x03, 0x83, 0xC1, 0xC0, 0x03, 0x83, 0xC1, 0x80, 0x03, 0x83, 0xC1, - 0x80, 0x03, 0x81, 0xC1, 0x80, 0x01, 0x81, 0xC1, 0x80, 0x03, 0x83, 0xC1, - 0xC0, 0x03, 0x83, 0xC1, 0xC0, 0x03, 0x83, 0xC0, 0xE0, 0x07, 0x83, 0x60, - 0xE0, 0x0F, 0x86, 0x60, 0x78, 0x1D, 0x86, 0x70, 0x3F, 0xF9, 0xFC, 0x30, - 0x0F, 0xE0, 0xF8, 0x18, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x0E, - 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x01, 0xE0, 0x06, 0x00, 0x00, - 0x7F, 0xFE, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x0E, - 0x00, 0x00, 0x0F, 0x80, 0x00, 0x06, 0xC0, 0x00, 0x07, 0x70, 0x00, 0x03, - 0x98, 0x00, 0x01, 0x8E, 0x00, 0x01, 0xC7, 0x00, 0x00, 0xC1, 0x80, 0x00, - 0xE0, 0xE0, 0x00, 0x60, 0x30, 0x00, 0x70, 0x1C, 0x00, 0x30, 0x06, 0x00, - 0x38, 0x03, 0x80, 0x18, 0x00, 0xC0, 0x1C, 0x00, 0x70, 0x0F, 0xFF, 0xF8, - 0x0F, 0xFF, 0xFE, 0x07, 0x00, 0x07, 0x03, 0x00, 0x01, 0xC3, 0x80, 0x00, - 0xE1, 0x80, 0x00, 0x31, 0xC0, 0x00, 0x1C, 0xC0, 0x00, 0x06, 0xE0, 0x00, - 0x03, 0x80, 0xFF, 0xE0, 0x0F, 0xFF, 0xF0, 0xFF, 0xFF, 0x8E, 0x00, 0x3C, - 0xE0, 0x00, 0xEE, 0x00, 0x0E, 0xE0, 0x00, 0x6E, 0x00, 0x06, 0xE0, 0x00, - 0xEE, 0x00, 0x0E, 0xE0, 0x01, 0xCE, 0x01, 0xF8, 0xFF, 0xFF, 0x0F, 0xFF, - 0xFC, 0xE0, 0x00, 0xEE, 0x00, 0x07, 0xE0, 0x00, 0x3E, 0x00, 0x03, 0xE0, - 0x00, 0x3E, 0x00, 0x03, 0xE0, 0x00, 0x7E, 0x00, 0x07, 0xE0, 0x03, 0xEF, - 0xFF, 0xFC, 0xFF, 0xFF, 0x00, 0x00, 0x3E, 0x00, 0x07, 0xFF, 0x00, 0x7F, - 0xFF, 0x03, 0xC0, 0x1E, 0x1E, 0x00, 0x18, 0xE0, 0x00, 0x07, 0x00, 0x00, - 0x1C, 0x00, 0x00, 0xE0, 0x00, 0x03, 0x80, 0x00, 0x0E, 0x00, 0x00, 0x30, - 0x00, 0x00, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x38, 0x00, - 0x00, 0xE0, 0x00, 0x01, 0x80, 0x00, 0x07, 0x00, 0x00, 0x0E, 0x00, 0x00, - 0x3C, 0x00, 0x18, 0x78, 0x00, 0xF0, 0xFC, 0x0F, 0x80, 0xFF, 0xF8, 0x00, - 0xFF, 0x80, 0xFF, 0xC0, 0x01, 0xFF, 0xFE, 0x03, 0xFF, 0xFF, 0x07, 0x00, - 0x1F, 0x0E, 0x00, 0x0F, 0x1C, 0x00, 0x07, 0x38, 0x00, 0x0F, 0x70, 0x00, - 0x0E, 0xE0, 0x00, 0x0D, 0xC0, 0x00, 0x1F, 0x80, 0x00, 0x3F, 0x00, 0x00, - 0x7E, 0x00, 0x00, 0xFC, 0x00, 0x01, 0xF8, 0x00, 0x03, 0xF0, 0x00, 0x07, - 0xE0, 0x00, 0x0F, 0xC0, 0x00, 0x3B, 0x80, 0x00, 0x77, 0x00, 0x01, 0xCE, - 0x00, 0x07, 0x1C, 0x00, 0x3E, 0x38, 0x03, 0xF0, 0x7F, 0xFF, 0xC0, 0xFF, - 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x0E, 0x00, - 0x07, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x00, 0xE0, 0x00, 0x70, 0x00, 0x38, - 0x00, 0x1F, 0xFF, 0xCF, 0xFF, 0xE7, 0xFF, 0xF3, 0x80, 0x01, 0xC0, 0x00, - 0xE0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x07, 0x00, - 0x03, 0x80, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFC, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x03, 0x80, 0x01, 0xC0, - 0x00, 0xE0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x0F, 0xFF, 0xE7, - 0xFF, 0xF3, 0xFF, 0xF9, 0xC0, 0x00, 0xE0, 0x00, 0x70, 0x00, 0x38, 0x00, - 0x1C, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x00, 0xE0, - 0x00, 0x00, 0x00, 0x3E, 0x00, 0x07, 0xFF, 0x80, 0x7F, 0xFF, 0x03, 0xC0, - 0x1F, 0x1E, 0x00, 0x18, 0xE0, 0x00, 0x07, 0x00, 0x00, 0x1C, 0x00, 0x00, - 0xE0, 0x00, 0x03, 0x80, 0x00, 0x0E, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC0, - 0x00, 0x03, 0x00, 0x00, 0x7E, 0x00, 0x01, 0xF8, 0x00, 0x07, 0xE0, 0x00, - 0x1D, 0x80, 0x00, 0x77, 0x00, 0x01, 0xCE, 0x00, 0x07, 0x3C, 0x00, 0x1C, - 0x78, 0x00, 0xF0, 0xFC, 0x0F, 0x80, 0xFF, 0xFC, 0x00, 0xFF, 0x80, 0xE0, - 0x00, 0x3E, 0x00, 0x03, 0xE0, 0x00, 0x3E, 0x00, 0x03, 0xE0, 0x00, 0x3E, - 0x00, 0x03, 0xE0, 0x00, 0x3E, 0x00, 0x03, 0xE0, 0x00, 0x3E, 0x00, 0x03, - 0xE0, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, - 0x3E, 0x00, 0x03, 0xE0, 0x00, 0x3E, 0x00, 0x03, 0xE0, 0x00, 0x3E, 0x00, - 0x03, 0xE0, 0x00, 0x3E, 0x00, 0x03, 0xE0, 0x00, 0x3E, 0x00, 0x03, 0xE0, - 0x00, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, - 0x3F, 0xFC, 0xFF, 0xF3, 0xFF, 0xC0, 0x07, 0x00, 0x1C, 0x00, 0x70, 0x01, - 0xC0, 0x07, 0x00, 0x1C, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00, - 0x70, 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x40, - 0x1B, 0x80, 0xEF, 0x07, 0x9F, 0xFC, 0x1F, 0xC0, 0xE0, 0x00, 0x77, 0x00, - 0x07, 0x38, 0x00, 0x71, 0xC0, 0x07, 0x0E, 0x00, 0x70, 0x70, 0x07, 0x03, - 0x80, 0x70, 0x1C, 0x07, 0x00, 0xE0, 0x70, 0x07, 0x07, 0x00, 0x38, 0x70, - 0x01, 0xC7, 0x00, 0x0E, 0x7C, 0x00, 0x77, 0xF0, 0x03, 0xFB, 0xC0, 0x1F, - 0x8F, 0x00, 0xF8, 0x3C, 0x07, 0x80, 0xE0, 0x38, 0x03, 0x81, 0xC0, 0x0E, - 0x0E, 0x00, 0x38, 0x70, 0x00, 0xE3, 0x80, 0x07, 0x9C, 0x00, 0x1C, 0xE0, - 0x00, 0x70, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, - 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, - 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, - 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, - 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x01, 0xF0, 0x00, 0x00, 0xF8, 0x00, - 0x00, 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x7F, 0x70, - 0x00, 0x37, 0x98, 0x00, 0x3B, 0xCE, 0x00, 0x19, 0xE3, 0x00, 0x1C, 0xF1, - 0xC0, 0x1C, 0x78, 0x70, 0x0C, 0x3C, 0x18, 0x0E, 0x1E, 0x0E, 0x06, 0x0F, - 0x03, 0x07, 0x07, 0x81, 0xC3, 0x03, 0xC0, 0x73, 0x01, 0xE0, 0x1B, 0x80, - 0xF0, 0x0F, 0x80, 0x78, 0x03, 0xC0, 0x3C, 0x01, 0xC0, 0x1E, 0x00, 0x60, - 0x0F, 0x00, 0x00, 0x07, 0x80, 0x00, 0x03, 0xC0, 0x00, 0x01, 0x80, 0xC0, - 0x00, 0x3E, 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x80, 0x03, 0xF8, 0x00, 0x3F, - 0xC0, 0x03, 0xEE, 0x00, 0x3E, 0xF0, 0x03, 0xE7, 0x00, 0x3E, 0x38, 0x03, - 0xE1, 0xC0, 0x3E, 0x0E, 0x03, 0xE0, 0xF0, 0x3E, 0x07, 0x03, 0xE0, 0x38, - 0x3E, 0x01, 0xC3, 0xE0, 0x0E, 0x3E, 0x00, 0xF3, 0xE0, 0x07, 0x3E, 0x00, - 0x3B, 0xE0, 0x01, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0xFE, 0x00, 0x07, 0xE0, - 0x00, 0x30, 0x00, 0x3E, 0x00, 0x00, 0x7F, 0xF0, 0x00, 0x7F, 0xFF, 0x00, - 0x3C, 0x01, 0xF0, 0x1C, 0x00, 0x1E, 0x0E, 0x00, 0x03, 0x87, 0x00, 0x00, - 0x71, 0xC0, 0x00, 0x0C, 0xE0, 0x00, 0x03, 0xB8, 0x00, 0x00, 0xEE, 0x00, - 0x00, 0x1B, 0x00, 0x00, 0x06, 0xC0, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x7E, - 0x00, 0x00, 0x1B, 0x80, 0x00, 0x06, 0xE0, 0x00, 0x03, 0x98, 0x00, 0x00, - 0xE7, 0x00, 0x00, 0x70, 0xE0, 0x00, 0x3C, 0x3C, 0x00, 0x1E, 0x07, 0x80, - 0x0F, 0x00, 0xFC, 0x0F, 0x80, 0x0F, 0xFF, 0xC0, 0x00, 0xFF, 0x80, 0x00, - 0xFF, 0xC0, 0x1F, 0xFF, 0xC3, 0xFF, 0xFC, 0x70, 0x03, 0xCE, 0x00, 0x1D, - 0xC0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x00, 0x7C, 0x00, 0x0F, - 0x80, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x0D, 0xC0, 0x03, 0xB8, 0x01, 0xE7, - 0xFF, 0xF8, 0xFF, 0xFC, 0x1C, 0x00, 0x03, 0x80, 0x00, 0x70, 0x00, 0x0E, - 0x00, 0x01, 0xC0, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0xE0, 0x00, 0x00, - 0x00, 0x3E, 0x00, 0x00, 0x3F, 0xF8, 0x00, 0x1F, 0xFF, 0xC0, 0x07, 0x80, - 0x3E, 0x01, 0xC0, 0x01, 0xE0, 0x70, 0x00, 0x1C, 0x1C, 0x00, 0x01, 0xC3, - 0x80, 0x00, 0x18, 0xE0, 0x00, 0x03, 0x9C, 0x00, 0x00, 0x73, 0x80, 0x00, - 0x06, 0x60, 0x00, 0x00, 0xCC, 0x00, 0x00, 0x1D, 0x80, 0x00, 0x03, 0xB8, - 0x00, 0x00, 0x67, 0x00, 0x00, 0x0C, 0xE0, 0x00, 0x03, 0x8E, 0x00, 0x00, - 0x71, 0xC0, 0x00, 0x1C, 0x1C, 0x00, 0x07, 0x83, 0xC0, 0x01, 0xE0, 0x3C, - 0x00, 0x78, 0x03, 0xF0, 0x3E, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0xFF, 0x80, - 0x00, 0x00, 0xE0, 0x00, 0x00, 0x0E, 0x03, 0x00, 0x00, 0xF0, 0xE0, 0x00, - 0x0F, 0xF8, 0x00, 0x00, 0x7C, 0x00, 0xFF, 0x80, 0x0F, 0xFF, 0xC0, 0xFF, - 0xFF, 0x0E, 0x00, 0x78, 0xE0, 0x01, 0xCE, 0x00, 0x0E, 0xE0, 0x00, 0xEE, - 0x00, 0x0E, 0xE0, 0x00, 0x6E, 0x00, 0x06, 0xE0, 0x00, 0xEE, 0x00, 0x0E, - 0xE0, 0x00, 0xCE, 0x00, 0x1C, 0xE0, 0x07, 0x8F, 0xFF, 0xF0, 0xFF, 0xFC, - 0x0E, 0x01, 0xC0, 0xE0, 0x0E, 0x0E, 0x00, 0x70, 0xE0, 0x03, 0x0E, 0x00, - 0x38, 0xE0, 0x01, 0xCE, 0x00, 0x0E, 0xE0, 0x00, 0xE0, 0x01, 0xF0, 0x03, - 0xFF, 0x83, 0xFF, 0xF9, 0xE0, 0x0C, 0x70, 0x00, 0x38, 0x00, 0x0E, 0x00, - 0x03, 0x80, 0x00, 0xE0, 0x00, 0x1C, 0x00, 0x07, 0x80, 0x00, 0xFE, 0x00, - 0x0F, 0xF8, 0x00, 0x7F, 0x80, 0x01, 0xF0, 0x00, 0x1E, 0x00, 0x01, 0xC0, - 0x00, 0x70, 0x00, 0x1C, 0x00, 0x07, 0x80, 0x01, 0xF8, 0x00, 0xEF, 0x80, - 0xF0, 0xFF, 0xF8, 0x0F, 0xF8, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xF0, 0x06, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x60, 0x00, - 0x06, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, - 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x60, - 0x00, 0x06, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x60, 0x00, 0x06, - 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x60, 0x00, 0xC0, 0x00, 0x7C, - 0x00, 0x07, 0xC0, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7C, 0x00, 0x07, - 0xC0, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, - 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7C, 0x00, - 0x07, 0xC0, 0x00, 0x7E, 0x00, 0x07, 0xE0, 0x00, 0x66, 0x00, 0x0E, 0x70, - 0x00, 0xE3, 0x80, 0x1C, 0x3E, 0x07, 0x80, 0xFF, 0xF0, 0x03, 0xFC, 0x00, - 0xE0, 0x00, 0x03, 0x60, 0x00, 0x07, 0x70, 0x00, 0x06, 0x70, 0x00, 0x0E, - 0x38, 0x00, 0x0E, 0x38, 0x00, 0x0C, 0x1C, 0x00, 0x1C, 0x1C, 0x00, 0x18, - 0x0C, 0x00, 0x38, 0x0E, 0x00, 0x30, 0x06, 0x00, 0x70, 0x07, 0x00, 0x70, - 0x07, 0x00, 0xE0, 0x03, 0x80, 0xE0, 0x03, 0x80, 0xC0, 0x01, 0xC1, 0xC0, - 0x01, 0xC1, 0x80, 0x00, 0xC3, 0x80, 0x00, 0xE3, 0x00, 0x00, 0x67, 0x00, - 0x00, 0x77, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x3C, 0x00, - 0x00, 0x1C, 0x00, 0xE0, 0x00, 0x70, 0x00, 0x3B, 0x00, 0x03, 0x80, 0x01, - 0x9C, 0x00, 0x1C, 0x00, 0x1C, 0xE0, 0x01, 0xF0, 0x00, 0xE3, 0x00, 0x0D, - 0x80, 0x06, 0x1C, 0x00, 0x6C, 0x00, 0x70, 0xE0, 0x07, 0x70, 0x03, 0x83, - 0x00, 0x31, 0x80, 0x18, 0x1C, 0x01, 0x8C, 0x01, 0xC0, 0xE0, 0x1C, 0x70, - 0x0E, 0x03, 0x00, 0xC1, 0x80, 0x60, 0x1C, 0x06, 0x0C, 0x07, 0x00, 0xE0, - 0x70, 0x70, 0x38, 0x03, 0x03, 0x01, 0x81, 0x80, 0x1C, 0x38, 0x0C, 0x1C, - 0x00, 0xE1, 0xC0, 0x70, 0xE0, 0x03, 0x0C, 0x01, 0x86, 0x00, 0x1C, 0xE0, - 0x0E, 0x70, 0x00, 0xE7, 0x00, 0x73, 0x80, 0x03, 0x30, 0x01, 0x98, 0x00, - 0x1F, 0x80, 0x0F, 0xC0, 0x00, 0xF8, 0x00, 0x7E, 0x00, 0x03, 0xC0, 0x01, - 0xE0, 0x00, 0x1E, 0x00, 0x0F, 0x00, 0x00, 0xE0, 0x00, 0x78, 0x00, 0xE0, - 0x00, 0x3B, 0x80, 0x03, 0x8E, 0x00, 0x38, 0x70, 0x01, 0xC1, 0xC0, 0x1C, - 0x07, 0x01, 0xC0, 0x1C, 0x1C, 0x00, 0xE0, 0xE0, 0x03, 0x8E, 0x00, 0x0E, - 0xE0, 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x07, 0x00, 0x00, 0x7C, 0x00, - 0x07, 0x70, 0x00, 0x3B, 0x80, 0x03, 0x8E, 0x00, 0x38, 0x38, 0x03, 0x80, - 0xE0, 0x1C, 0x07, 0x01, 0xC0, 0x1C, 0x1C, 0x00, 0x71, 0xC0, 0x01, 0xCE, - 0x00, 0x0E, 0xE0, 0x00, 0x38, 0xE0, 0x00, 0x0D, 0x80, 0x00, 0x77, 0x00, - 0x03, 0x8E, 0x00, 0x0C, 0x38, 0x00, 0x70, 0x70, 0x01, 0x80, 0xC0, 0x0E, - 0x03, 0x80, 0x70, 0x07, 0x01, 0x80, 0x0C, 0x0E, 0x00, 0x38, 0x70, 0x00, - 0x71, 0x80, 0x01, 0xCE, 0x00, 0x03, 0xB0, 0x00, 0x07, 0xC0, 0x00, 0x1E, - 0x00, 0x00, 0x30, 0x00, 0x00, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x0C, 0x00, - 0x00, 0x30, 0x00, 0x00, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x0C, 0x00, 0x00, - 0x30, 0x00, 0xFF, 0xFF, 0xEF, 0xFF, 0xFE, 0xFF, 0xFF, 0xE0, 0x00, 0x1C, - 0x00, 0x03, 0xC0, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0xE0, 0x00, 0x1C, - 0x00, 0x03, 0xC0, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0xE0, 0x00, 0x1C, - 0x00, 0x03, 0xC0, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0xE0, 0x00, 0x1C, - 0x00, 0x01, 0xC0, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0xE0, 0x00, 0x0F, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFC, 0x30, 0xC3, 0x0C, 0x30, 0xC3, - 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, - 0x0C, 0x30, 0xC3, 0x0C, 0x3F, 0xFC, 0xC0, 0x03, 0x80, 0x06, 0x00, 0x18, - 0x00, 0x30, 0x00, 0xC0, 0x03, 0x00, 0x06, 0x00, 0x18, 0x00, 0x70, 0x00, - 0xC0, 0x03, 0x00, 0x0E, 0x00, 0x18, 0x00, 0x60, 0x01, 0xC0, 0x03, 0x00, - 0x0C, 0x00, 0x38, 0x00, 0x60, 0x01, 0x80, 0x07, 0x00, 0x0C, 0x00, 0x30, - 0x00, 0x60, 0x01, 0x80, 0x06, 0x00, 0x0C, 0x00, 0x30, 0x00, 0xE0, 0x01, - 0x80, 0x06, 0x00, 0x1C, 0xFF, 0xF0, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, - 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, - 0xC3, 0x0C, 0x30, 0xFF, 0xFC, 0x03, 0x00, 0x0E, 0x00, 0x78, 0x01, 0xE0, - 0x0C, 0xC0, 0x33, 0x01, 0xC6, 0x06, 0x18, 0x18, 0x30, 0xC0, 0xC3, 0x03, - 0x18, 0x06, 0x60, 0x19, 0x80, 0x3C, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF0, 0xE0, 0x70, 0x38, 0x0C, 0x07, 0x01, 0x00, 0x3F, 0xE1, 0xFF, 0xF3, - 0x80, 0xE4, 0x00, 0xE0, 0x00, 0xC0, 0x01, 0x80, 0x03, 0x00, 0x06, 0x3F, - 0xFD, 0xF8, 0x1F, 0x00, 0x3E, 0x00, 0x78, 0x00, 0xF0, 0x03, 0xF0, 0x07, - 0x70, 0x3E, 0xFF, 0xEC, 0x7F, 0x18, 0xE0, 0x00, 0x1C, 0x00, 0x03, 0x80, - 0x00, 0x70, 0x00, 0x0E, 0x00, 0x01, 0xC0, 0x00, 0x38, 0x00, 0x07, 0x00, - 0x00, 0xE3, 0xFC, 0x1D, 0xFF, 0xE3, 0xF0, 0x1E, 0x7C, 0x00, 0xEF, 0x00, - 0x1D, 0xE0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x00, 0x7C, 0x00, - 0x0F, 0x80, 0x03, 0xF0, 0x00, 0x7F, 0x00, 0x0D, 0xE0, 0x03, 0xBE, 0x00, - 0xE7, 0x70, 0x7C, 0xE7, 0xFE, 0x1C, 0x7F, 0x80, 0x00, 0x40, 0x0F, 0xFC, - 0x1F, 0xFE, 0x3C, 0x0F, 0x70, 0x03, 0x60, 0x00, 0xE0, 0x00, 0xC0, 0x00, - 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xE0, 0x00, 0xE0, 0x00, - 0x70, 0x02, 0x78, 0x07, 0x3C, 0x0F, 0x1F, 0xFE, 0x07, 0xF8, 0x00, 0x00, - 0xC0, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x03, 0x00, 0x00, 0xC0, 0x00, 0x30, - 0x00, 0x0C, 0x02, 0x03, 0x0F, 0xF8, 0xC7, 0xFF, 0x33, 0xC0, 0xED, 0xC0, - 0x0F, 0xE0, 0x01, 0xF8, 0x00, 0x7C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, - 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x80, 0x07, 0xE0, 0x01, 0xDC, 0x00, 0xF7, - 0x80, 0x7C, 0xF0, 0x3B, 0x1F, 0xFC, 0xC1, 0xFC, 0x30, 0x00, 0xC0, 0x03, - 0xFE, 0x01, 0xFF, 0xC0, 0xE0, 0x38, 0x70, 0x07, 0x38, 0x00, 0xEE, 0x00, - 0x1B, 0x00, 0x06, 0xC0, 0x01, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, - 0xC0, 0x00, 0x38, 0x00, 0x07, 0x00, 0x01, 0xE0, 0x0C, 0x3E, 0x0F, 0x07, - 0xFF, 0x80, 0x7F, 0x80, 0x07, 0xE0, 0xFF, 0x1E, 0x01, 0xC0, 0x18, 0x01, - 0x80, 0x18, 0x01, 0x80, 0xFF, 0xEF, 0xFE, 0x18, 0x01, 0x80, 0x18, 0x01, - 0x80, 0x18, 0x01, 0x80, 0x18, 0x01, 0x80, 0x18, 0x01, 0x80, 0x18, 0x01, - 0x80, 0x18, 0x01, 0x80, 0x18, 0x01, 0x80, 0x00, 0x80, 0x01, 0xFF, 0x1C, - 0x7F, 0xFB, 0x9C, 0x03, 0xF7, 0x00, 0x3F, 0xC0, 0x03, 0xF8, 0x00, 0x3E, - 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, 0x7E, - 0x00, 0x1E, 0xC0, 0x03, 0xDC, 0x00, 0xF9, 0xE0, 0x77, 0x1F, 0xFC, 0xE0, - 0xFF, 0x1C, 0x00, 0x03, 0x00, 0x00, 0x60, 0x00, 0x1C, 0x00, 0x03, 0x9C, - 0x00, 0xE3, 0xF0, 0xF8, 0x1F, 0xFE, 0x00, 0xFF, 0x00, 0xE0, 0x00, 0x70, - 0x00, 0x38, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x03, 0x80, 0x01, - 0xC0, 0x80, 0xE7, 0xFC, 0x77, 0xFF, 0x3F, 0x01, 0xDF, 0x00, 0x7F, 0x00, - 0x3F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8, - 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, - 0xE0, 0x01, 0xF0, 0x00, 0xC0, 0xFF, 0xA0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFC, 0x03, 0x81, 0xC0, 0xE0, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xC0, - 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xC0, 0x60, 0x30, 0x18, - 0x1F, 0x1D, 0xFE, 0x7C, 0x00, 0xE0, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x03, - 0x80, 0x00, 0xE0, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x03, 0x80, 0x00, 0xE0, - 0x07, 0x38, 0x03, 0x8E, 0x01, 0xC3, 0x80, 0xE0, 0xE0, 0x70, 0x38, 0x78, - 0x0E, 0x3C, 0x03, 0x9E, 0x00, 0xEF, 0xC0, 0x3F, 0x38, 0x0F, 0x87, 0x03, - 0xC1, 0xE0, 0xE0, 0x38, 0x38, 0x07, 0x0E, 0x00, 0xE3, 0x80, 0x1C, 0xE0, - 0x07, 0xB8, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFC, 0x00, 0x60, 0x01, 0x01, 0xCF, 0xF8, 0x3F, 0xE3, 0xBF, 0xF8, - 0xFF, 0xE7, 0xE0, 0x7B, 0x81, 0xEF, 0x80, 0x7E, 0x01, 0xDE, 0x00, 0x78, - 0x01, 0xF8, 0x00, 0xE0, 0x03, 0xF0, 0x01, 0xC0, 0x07, 0xE0, 0x03, 0x80, - 0x0F, 0xC0, 0x07, 0x00, 0x1F, 0x80, 0x0E, 0x00, 0x3F, 0x00, 0x1C, 0x00, - 0x7E, 0x00, 0x38, 0x00, 0xFC, 0x00, 0x70, 0x01, 0xF8, 0x00, 0xE0, 0x03, - 0xF0, 0x01, 0xC0, 0x07, 0xE0, 0x03, 0x80, 0x0F, 0xC0, 0x07, 0x00, 0x1F, - 0x80, 0x0E, 0x00, 0x38, 0x00, 0x40, 0x73, 0xFE, 0x3B, 0xFF, 0x9F, 0x80, - 0xEF, 0x80, 0x3F, 0x80, 0x1F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, - 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, - 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x60, 0x00, 0x00, 0x03, - 0xFF, 0x01, 0xFF, 0xE0, 0xF0, 0x3C, 0x70, 0x03, 0x98, 0x00, 0x6E, 0x00, - 0x1F, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, - 0xE0, 0x01, 0xF8, 0x00, 0x77, 0x00, 0x39, 0xE0, 0x1E, 0x3C, 0x0F, 0x07, - 0xFF, 0x80, 0x7F, 0x80, 0x00, 0x00, 0x1C, 0x7F, 0x83, 0xBF, 0xFC, 0x7E, - 0x03, 0xCF, 0x80, 0x1D, 0xE0, 0x03, 0xBC, 0x00, 0x3F, 0x00, 0x07, 0xE0, - 0x00, 0x7C, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x7E, 0x00, 0x0F, 0xE0, - 0x01, 0xBC, 0x00, 0x77, 0xC0, 0x1C, 0xEE, 0x0F, 0x9C, 0xFF, 0xC3, 0x8F, - 0xF0, 0x70, 0x00, 0x0E, 0x00, 0x01, 0xC0, 0x00, 0x38, 0x00, 0x07, 0x00, - 0x00, 0xE0, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x80, 0x03, 0xFE, 0x31, 0xFF, - 0xCC, 0xF0, 0x3B, 0x70, 0x03, 0xF8, 0x00, 0x7E, 0x00, 0x1F, 0x00, 0x07, - 0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xE0, 0x01, 0xF8, - 0x00, 0x77, 0x00, 0x3D, 0xE0, 0x1F, 0x3C, 0x0E, 0xC7, 0xFF, 0x30, 0x7F, - 0x0C, 0x00, 0x03, 0x00, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x03, - 0x00, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x79, 0xFE, 0xFF, 0xF0, 0xF8, 0x3C, - 0x0E, 0x03, 0x80, 0xE0, 0x38, 0x0E, 0x03, 0x80, 0xE0, 0x38, 0x0E, 0x03, - 0x80, 0xE0, 0x38, 0x0E, 0x00, 0x01, 0x00, 0x3F, 0xF0, 0xFF, 0xF3, 0x80, - 0x66, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x38, 0x00, 0x7E, 0x00, 0x3F, 0xC0, - 0x1F, 0xE0, 0x01, 0xE0, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0xA0, 0x07, 0xF0, - 0x1C, 0xFF, 0xF0, 0x7F, 0xC0, 0x18, 0x01, 0x80, 0x18, 0x01, 0x80, 0xFF, - 0xEF, 0xFE, 0x18, 0x01, 0x80, 0x18, 0x01, 0x80, 0x18, 0x01, 0x80, 0x18, - 0x01, 0x80, 0x18, 0x01, 0x80, 0x18, 0x01, 0x80, 0x1C, 0x01, 0xE0, 0x0F, - 0xF0, 0x7E, 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00, - 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8, - 0x00, 0xFC, 0x00, 0x7E, 0x00, 0x3B, 0x80, 0x3D, 0xC0, 0x1E, 0x78, 0x3B, - 0x1F, 0xF9, 0x87, 0xF8, 0xC0, 0xE0, 0x00, 0xEC, 0x00, 0x19, 0xC0, 0x07, - 0x18, 0x00, 0xC3, 0x80, 0x38, 0x30, 0x06, 0x07, 0x01, 0xC0, 0x60, 0x30, - 0x0E, 0x06, 0x01, 0xC1, 0xC0, 0x18, 0x30, 0x03, 0x8E, 0x00, 0x31, 0x80, - 0x07, 0x70, 0x00, 0x6C, 0x00, 0x0F, 0x80, 0x00, 0xE0, 0x00, 0x1C, 0x00, - 0x60, 0x03, 0x80, 0x0D, 0x80, 0x0E, 0x00, 0x77, 0x00, 0x7C, 0x01, 0x8C, - 0x01, 0xB0, 0x06, 0x30, 0x0E, 0xC0, 0x38, 0xE0, 0x33, 0x80, 0xC1, 0x80, - 0xC6, 0x03, 0x07, 0x07, 0x18, 0x1C, 0x0C, 0x18, 0x30, 0x60, 0x30, 0x60, - 0xC3, 0x80, 0xE3, 0x03, 0x8C, 0x01, 0x8C, 0x06, 0x30, 0x06, 0x70, 0x19, - 0xC0, 0x1D, 0x80, 0x76, 0x00, 0x36, 0x00, 0xD8, 0x00, 0xF8, 0x03, 0xC0, - 0x01, 0xC0, 0x07, 0x00, 0x07, 0x00, 0x1C, 0x00, 0x60, 0x07, 0x38, 0x07, - 0x0E, 0x03, 0x03, 0x83, 0x80, 0xE3, 0x80, 0x33, 0x80, 0x1D, 0x80, 0x07, - 0xC0, 0x01, 0xC0, 0x01, 0xE0, 0x01, 0xF8, 0x00, 0xCE, 0x00, 0xE3, 0x80, - 0xE0, 0xE0, 0xE0, 0x30, 0x60, 0x1C, 0x70, 0x07, 0x70, 0x01, 0xC0, 0x70, - 0x00, 0x73, 0x00, 0x06, 0x38, 0x00, 0xE1, 0x80, 0x0C, 0x1C, 0x01, 0xC0, - 0xC0, 0x18, 0x0E, 0x03, 0x80, 0x60, 0x30, 0x07, 0x03, 0x00, 0x70, 0x70, - 0x03, 0x06, 0x00, 0x38, 0xE0, 0x01, 0x8C, 0x00, 0x1D, 0xC0, 0x00, 0xD8, - 0x00, 0x0F, 0x80, 0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0x70, 0x00, 0x06, - 0x00, 0x00, 0xE0, 0x00, 0x1C, 0x00, 0x63, 0x80, 0x0F, 0xF8, 0x00, 0x3E, - 0x00, 0x00, 0x7F, 0xFE, 0xFF, 0xFC, 0x00, 0x70, 0x00, 0xC0, 0x03, 0x80, - 0x0E, 0x00, 0x38, 0x00, 0xE0, 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00, 0x70, - 0x01, 0xC0, 0x03, 0x80, 0x0E, 0x00, 0x38, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, - 0x07, 0x87, 0xC7, 0x03, 0x81, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, - 0x03, 0x01, 0x80, 0xC0, 0x61, 0xF0, 0xF0, 0x3C, 0x06, 0x03, 0x01, 0x80, - 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xE0, 0x78, 0x1F, - 0x07, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xF0, - 0x7C, 0x0E, 0x03, 0x81, 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, - 0x81, 0xC0, 0xE0, 0x70, 0x1F, 0x07, 0x87, 0x07, 0x03, 0x81, 0xC0, 0xE0, - 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, 0x81, 0xC0, 0xE0, 0xE1, 0xF0, 0xE0, - 0x00, 0x3E, 0x03, 0x7F, 0x03, 0x63, 0x83, 0xC1, 0xEE, 0xC0, 0x7C }; - -const GFXglyph Montserrat_Regular18pt7bGlyphs[] PROGMEM = { - { 0, 1, 1, 9, 0, 0 }, // 0x20 ' ' - { 1, 3, 25, 9, 3, -24 }, // 0x21 '!' - { 11, 9, 10, 13, 2, -24 }, // 0x22 '"' - { 23, 22, 25, 24, 1, -24 }, // 0x23 '#' - { 92, 18, 33, 22, 2, -28 }, // 0x24 '$' - { 167, 27, 25, 29, 1, -24 }, // 0x25 '%' - { 252, 21, 25, 23, 2, -24 }, // 0x26 '&' - { 318, 3, 10, 7, 2, -24 }, // 0x27 ''' - { 322, 6, 33, 12, 4, -25 }, // 0x28 '(' - { 347, 7, 33, 12, 1, -25 }, // 0x29 ')' - { 376, 12, 13, 14, 1, -25 }, // 0x2A '*' - { 396, 16, 15, 20, 2, -19 }, // 0x2B '+' - { 426, 4, 9, 7, 2, -3 }, // 0x2C ',' - { 431, 9, 3, 13, 2, -10 }, // 0x2D '-' - { 435, 4, 4, 7, 2, -3 }, // 0x2E '.' - { 437, 14, 33, 12, -1, -28 }, // 0x2F '/' - { 495, 19, 25, 23, 2, -24 }, // 0x30 '0' - { 555, 9, 25, 13, 0, -24 }, // 0x31 '1' - { 584, 18, 25, 20, 1, -24 }, // 0x32 '2' - { 641, 18, 25, 20, 0, -24 }, // 0x33 '3' - { 698, 22, 25, 23, 1, -24 }, // 0x34 '4' - { 767, 17, 25, 20, 1, -24 }, // 0x35 '5' - { 821, 18, 25, 21, 2, -24 }, // 0x36 '6' - { 878, 18, 25, 21, 1, -24 }, // 0x37 '7' - { 935, 19, 25, 22, 2, -24 }, // 0x38 '8' - { 995, 19, 25, 21, 1, -24 }, // 0x39 '9' - { 1055, 4, 19, 7, 2, -18 }, // 0x3A ':' - { 1065, 4, 24, 7, 2, -18 }, // 0x3B ';' - { 1077, 16, 15, 20, 2, -19 }, // 0x3C '<' - { 1107, 16, 10, 20, 2, -16 }, // 0x3D '=' - { 1127, 16, 15, 20, 2, -19 }, // 0x3E '>' - { 1157, 17, 25, 20, 0, -24 }, // 0x3F '?' - { 1211, 32, 32, 36, 2, -24 }, // 0x40 '@' - { 1339, 25, 25, 25, 0, -24 }, // 0x41 'A' - { 1418, 20, 25, 26, 4, -24 }, // 0x42 'B' - { 1481, 22, 25, 25, 2, -24 }, // 0x43 'C' - { 1550, 23, 25, 29, 4, -24 }, // 0x44 'D' - { 1622, 17, 25, 23, 4, -24 }, // 0x45 'E' - { 1676, 17, 25, 22, 4, -24 }, // 0x46 'F' - { 1730, 22, 25, 27, 2, -24 }, // 0x47 'G' - { 1799, 20, 25, 28, 4, -24 }, // 0x48 'H' - { 1862, 3, 25, 11, 4, -24 }, // 0x49 'I' - { 1872, 14, 25, 18, 0, -24 }, // 0x4A 'J' - { 1916, 21, 25, 25, 4, -24 }, // 0x4B 'K' - { 1982, 16, 25, 21, 4, -24 }, // 0x4C 'L' - { 2032, 25, 25, 33, 4, -24 }, // 0x4D 'M' - { 2111, 20, 25, 28, 4, -24 }, // 0x4E 'N' - { 2174, 26, 25, 29, 2, -24 }, // 0x4F 'O' - { 2256, 19, 25, 25, 4, -24 }, // 0x50 'P' - { 2316, 27, 30, 29, 2, -24 }, // 0x51 'Q' - { 2418, 20, 25, 25, 4, -24 }, // 0x52 'R' - { 2481, 18, 25, 22, 2, -24 }, // 0x53 'S' - { 2538, 20, 25, 20, 0, -24 }, // 0x54 'T' - { 2601, 20, 25, 28, 4, -24 }, // 0x55 'U' - { 2664, 24, 25, 24, 0, -24 }, // 0x56 'V' - { 2739, 37, 25, 39, 1, -24 }, // 0x57 'W' - { 2855, 21, 25, 23, 1, -24 }, // 0x58 'X' - { 2921, 22, 25, 22, 0, -24 }, // 0x59 'Y' - { 2990, 20, 25, 23, 2, -24 }, // 0x5A 'Z' - { 3053, 6, 33, 11, 4, -25 }, // 0x5B '[' - { 3078, 14, 33, 12, -1, -28 }, // 0x5C '\' - { 3136, 6, 33, 11, 1, -25 }, // 0x5D ']' - { 3161, 14, 15, 20, 3, -19 }, // 0x5E '^' - { 3188, 18, 2, 18, 0, 1 }, // 0x5F '_' - { 3193, 8, 5, 21, 5, -25 }, // 0x60 '`' - { 3198, 15, 19, 21, 2, -18 }, // 0x61 'a' - { 3234, 19, 26, 24, 3, -25 }, // 0x62 'b' - { 3296, 16, 19, 20, 2, -18 }, // 0x63 'c' - { 3334, 18, 26, 24, 2, -25 }, // 0x64 'd' - { 3393, 18, 19, 21, 2, -18 }, // 0x65 'e' - { 3436, 12, 26, 12, 1, -25 }, // 0x66 'f' - { 3475, 19, 26, 24, 2, -18 }, // 0x67 'g' - { 3537, 17, 26, 24, 3, -25 }, // 0x68 'h' - { 3593, 3, 26, 9, 3, -25 }, // 0x69 'i' - { 3603, 9, 33, 10, -3, -25 }, // 0x6A 'j' - { 3641, 18, 26, 21, 3, -25 }, // 0x6B 'k' - { 3700, 3, 26, 9, 3, -25 }, // 0x6C 'l' - { 3710, 31, 19, 37, 3, -18 }, // 0x6D 'm' - { 3784, 17, 19, 24, 3, -18 }, // 0x6E 'n' - { 3825, 18, 19, 22, 2, -18 }, // 0x6F 'o' - { 3868, 19, 26, 24, 3, -18 }, // 0x70 'p' - { 3930, 18, 26, 24, 2, -18 }, // 0x71 'q' - { 3989, 10, 19, 14, 3, -18 }, // 0x72 'r' - { 4013, 15, 19, 17, 1, -18 }, // 0x73 's' - { 4049, 12, 22, 14, 1, -21 }, // 0x74 't' - { 4082, 17, 18, 24, 3, -17 }, // 0x75 'u' - { 4121, 19, 18, 19, 0, -17 }, // 0x76 'v' - { 4164, 30, 18, 31, 0, -17 }, // 0x77 'w' - { 4232, 17, 18, 19, 1, -17 }, // 0x78 'x' - { 4271, 20, 25, 19, -1, -17 }, // 0x79 'y' - { 4334, 15, 18, 18, 1, -17 }, // 0x7A 'z' - { 4368, 9, 33, 12, 2, -25 }, // 0x7B '{' - { 4406, 2, 33, 10, 4, -25 }, // 0x7C '|' - { 4415, 9, 33, 12, 1, -25 }, // 0x7D '}' - { 4453, 16, 5, 20, 2, -14 } }; // 0x7E '~' - -const GFXfont Montserrat_Regular18pt7b PROGMEM = { - (uint8_t *)Montserrat_Regular18pt7bBitmaps, - (GFXglyph *)Montserrat_Regular18pt7bGlyphs, - 0x20, 0x7E, 43 }; - -// Approx. 5135 bytes - -#endif // MONTSERRAT18PT7B_H diff --git a/examples/companion_radio/ui-new/fonts/Montserrat20pt7b.h b/examples/companion_radio/ui-new/fonts/Montserrat20pt7b.h deleted file mode 100644 index 197f4507..00000000 --- a/examples/companion_radio/ui-new/fonts/Montserrat20pt7b.h +++ /dev/null @@ -1,568 +0,0 @@ -#ifndef MONTSERRAT20PT7B_H -#define MONTSERRAT20PT7B_H -const uint8_t Montserrat_Regular20pt7bBitmaps[] PROGMEM = { - 0x00, 0xFF, 0x77, 0x77, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x60, 0x00, - 0x06, 0xFF, 0x70, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, - 0xC1, 0xE0, 0xC0, 0x00, 0xC0, 0x30, 0x00, 0x60, 0x18, 0x00, 0x30, 0x0C, - 0x00, 0x18, 0x06, 0x00, 0x0C, 0x03, 0x00, 0x0E, 0x01, 0x80, 0x06, 0x01, - 0xC0, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0x80, 0xC0, 0x30, 0x00, 0x60, - 0x18, 0x00, 0x30, 0x0C, 0x00, 0x18, 0x06, 0x00, 0x1C, 0x03, 0x00, 0x0C, - 0x03, 0x80, 0x06, 0x01, 0x80, 0x03, 0x00, 0xC0, 0x7F, 0xFF, 0xFF, 0xBF, - 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xE0, 0x30, 0x0C, 0x00, 0x38, 0x06, 0x00, - 0x18, 0x07, 0x00, 0x0C, 0x03, 0x00, 0x06, 0x01, 0x80, 0x03, 0x00, 0xC0, - 0x01, 0x80, 0x60, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x60, 0x00, - 0x06, 0x00, 0x00, 0x70, 0x00, 0x7F, 0xF0, 0x1F, 0xFF, 0xC3, 0xE6, 0x3E, - 0x78, 0x60, 0x47, 0x06, 0x00, 0x70, 0x60, 0x0E, 0x06, 0x00, 0xE0, 0x60, - 0x07, 0x06, 0x00, 0x70, 0x60, 0x07, 0xC6, 0x00, 0x3F, 0x60, 0x00, 0xFF, - 0x00, 0x03, 0xFE, 0x00, 0x07, 0xF8, 0x00, 0x67, 0xE0, 0x06, 0x1E, 0x00, - 0x60, 0xF0, 0x06, 0x07, 0x00, 0x60, 0x70, 0x06, 0x07, 0x00, 0x60, 0x7C, - 0x06, 0x0F, 0xF0, 0x61, 0xE7, 0xE6, 0x7C, 0x3F, 0xFF, 0x80, 0x7F, 0xE0, - 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x18, 0x1E, 0x70, 0x01, 0x80, - 0xC0, 0xC0, 0x1C, 0x0C, 0x06, 0x00, 0xC0, 0x60, 0x18, 0x0C, 0x03, 0x00, - 0xC0, 0xE0, 0x18, 0x06, 0x06, 0x00, 0xC0, 0x30, 0x60, 0x06, 0x01, 0x87, - 0x00, 0x30, 0x0C, 0x30, 0x01, 0x80, 0xC3, 0x00, 0x06, 0x0E, 0x38, 0x00, - 0x3F, 0xE1, 0x81, 0x80, 0x7E, 0x18, 0x7F, 0x00, 0x01, 0xC7, 0x1C, 0x00, - 0x0C, 0x70, 0x70, 0x00, 0xC3, 0x01, 0x80, 0x0E, 0x18, 0x0C, 0x00, 0xE1, - 0x80, 0x30, 0x06, 0x0C, 0x01, 0x80, 0x60, 0x60, 0x0C, 0x07, 0x03, 0x00, - 0x60, 0x30, 0x0C, 0x06, 0x03, 0x00, 0x60, 0x30, 0x38, 0x01, 0x83, 0x81, - 0x80, 0x0F, 0xF8, 0x18, 0x00, 0x1F, 0x00, 0x00, 0x20, 0x00, 0x03, 0xFC, - 0x00, 0x07, 0xFE, 0x00, 0x0E, 0x07, 0x00, 0x0C, 0x03, 0x00, 0x1C, 0x03, - 0x80, 0x1C, 0x03, 0x80, 0x1C, 0x03, 0x00, 0x0C, 0x07, 0x00, 0x0E, 0x0E, - 0x00, 0x07, 0x1C, 0x00, 0x03, 0xF8, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xE0, - 0x00, 0x0F, 0xF0, 0x00, 0x1E, 0x78, 0x00, 0x38, 0x3C, 0x0C, 0x70, 0x1E, - 0x1C, 0xE0, 0x0F, 0x1C, 0xE0, 0x07, 0x98, 0xE0, 0x03, 0xF8, 0xE0, 0x01, - 0xF0, 0xE0, 0x00, 0xF0, 0xE0, 0x00, 0xF8, 0x70, 0x01, 0xFC, 0x3C, 0x0F, - 0x9E, 0x1F, 0xFF, 0x0E, 0x07, 0xFC, 0x06, 0xFF, 0xFF, 0xF0, 0x0E, 0x18, - 0x70, 0xE3, 0x87, 0x0C, 0x38, 0x70, 0xE1, 0x83, 0x0E, 0x1C, 0x38, 0x70, - 0xE1, 0xC3, 0x87, 0x0E, 0x1C, 0x38, 0x70, 0xE0, 0xC1, 0xC3, 0x87, 0x06, - 0x0E, 0x1C, 0x18, 0x38, 0x70, 0x70, 0x60, 0xC1, 0xC1, 0xC3, 0x83, 0x07, - 0x0E, 0x0C, 0x1C, 0x38, 0x70, 0x60, 0xC1, 0xC3, 0x87, 0x0E, 0x1C, 0x38, - 0x70, 0xE1, 0xC3, 0x87, 0x0C, 0x38, 0x70, 0xE1, 0xC3, 0x0E, 0x1C, 0x30, - 0xE1, 0x87, 0x0C, 0x00, 0x02, 0x00, 0x10, 0x00, 0x81, 0x84, 0x3F, 0x27, - 0x9D, 0x70, 0x3E, 0x01, 0xF0, 0x3F, 0xE7, 0x93, 0xF8, 0x86, 0x04, 0x00, - 0x20, 0x01, 0x00, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x30, 0x00, - 0x18, 0x00, 0x0C, 0x00, 0x06, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xC0, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x06, 0x00, 0x03, - 0x00, 0x01, 0x80, 0x00, 0x7F, 0xF7, 0x76, 0x66, 0xCC, 0xFF, 0xFF, 0xFF, - 0xFF, 0x80, 0x7F, 0xF7, 0x00, 0x06, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x60, - 0x01, 0xC0, 0x03, 0x80, 0x06, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x60, 0x01, - 0xC0, 0x03, 0x00, 0x06, 0x00, 0x1C, 0x00, 0x30, 0x00, 0x60, 0x01, 0xC0, - 0x03, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x30, 0x00, 0xE0, 0x01, 0xC0, 0x03, - 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x30, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x00, - 0x0E, 0x00, 0x18, 0x00, 0x30, 0x00, 0xE0, 0x01, 0x80, 0x03, 0x00, 0x0E, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x7F, 0xF8, 0x03, 0xC1, - 0xF0, 0x1E, 0x01, 0xE0, 0xE0, 0x03, 0xC3, 0x80, 0x07, 0x1C, 0x00, 0x0E, - 0x70, 0x00, 0x39, 0x80, 0x00, 0xEE, 0x00, 0x01, 0xB8, 0x00, 0x07, 0xE0, - 0x00, 0x1F, 0x80, 0x00, 0x7E, 0x00, 0x01, 0xF8, 0x00, 0x07, 0xE0, 0x00, - 0x1F, 0x80, 0x00, 0x7E, 0x00, 0x01, 0x9C, 0x00, 0x0E, 0x70, 0x00, 0x39, - 0xC0, 0x01, 0xE3, 0x80, 0x07, 0x0F, 0x00, 0x3C, 0x1E, 0x01, 0xE0, 0x3F, - 0x3F, 0x00, 0x7F, 0xF8, 0x00, 0x7F, 0x80, 0xFF, 0xFF, 0xF0, 0x1C, 0x07, - 0x01, 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xC0, - 0x70, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1C, - 0x07, 0x01, 0xC0, 0x70, 0x1C, 0x00, 0x40, 0x00, 0xFF, 0xE0, 0x3F, 0xFF, - 0x07, 0xC0, 0xF8, 0xF0, 0x03, 0xC4, 0x00, 0x1C, 0x00, 0x01, 0xC0, 0x00, - 0x1C, 0x00, 0x01, 0xC0, 0x00, 0x1C, 0x00, 0x01, 0xC0, 0x00, 0x1C, 0x00, - 0x03, 0x80, 0x00, 0x78, 0x00, 0x0F, 0x00, 0x01, 0xE0, 0x00, 0x3C, 0x00, - 0x07, 0x80, 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x03, 0xC0, 0x00, 0x78, 0x00, - 0x0F, 0x00, 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x07, 0xFF, 0xFF, 0x7F, 0xFF, - 0xF7, 0xFF, 0xFF, 0x7F, 0xFF, 0xE7, 0xFF, 0xFE, 0x00, 0x01, 0xC0, 0x00, - 0x3C, 0x00, 0x03, 0x80, 0x00, 0x70, 0x00, 0x0E, 0x00, 0x01, 0xC0, 0x00, - 0x3C, 0x00, 0x03, 0x80, 0x00, 0x70, 0x00, 0x0F, 0x80, 0x00, 0xFF, 0x00, - 0x0F, 0xFC, 0x00, 0x03, 0xE0, 0x00, 0x0E, 0x00, 0x00, 0x70, 0x00, 0x07, - 0x00, 0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0x70, 0x00, 0x07, 0x60, 0x00, - 0xEF, 0x80, 0x1E, 0x7F, 0x1F, 0xC1, 0xFF, 0xF8, 0x07, 0xFE, 0x00, 0x00, - 0x07, 0x80, 0x00, 0x0E, 0x00, 0x00, 0x38, 0x00, 0x00, 0xE0, 0x00, 0x03, - 0x80, 0x00, 0x0F, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x70, 0x00, 0x01, 0xC0, - 0x00, 0x07, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x38, 0x0E, 0x00, 0xE0, 0x1C, - 0x03, 0x80, 0x38, 0x0E, 0x00, 0x70, 0x3C, 0x00, 0xE0, 0x70, 0x01, 0xC1, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x1C, 0x00, - 0x00, 0x38, 0x00, 0x00, 0x70, 0x00, 0x00, 0xE0, 0x00, 0x01, 0xC0, 0x00, - 0x03, 0x80, 0x00, 0x07, 0x00, 0x1F, 0xFF, 0xC1, 0xFF, 0xFC, 0x1C, 0x00, - 0x01, 0x80, 0x00, 0x18, 0x00, 0x01, 0x80, 0x00, 0x38, 0x00, 0x03, 0x80, - 0x00, 0x38, 0x00, 0x03, 0x80, 0x00, 0x38, 0x00, 0x03, 0xFF, 0xC0, 0x3F, - 0xFF, 0x00, 0x07, 0xF8, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xE0, - 0x00, 0x0E, 0x00, 0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0x60, 0x00, 0x0E, - 0x40, 0x01, 0xEF, 0x00, 0x3C, 0x7F, 0x1F, 0x83, 0xFF, 0xF0, 0x07, 0xFC, - 0x00, 0x00, 0x0C, 0x00, 0x0F, 0xFE, 0x01, 0xFF, 0xF8, 0x1F, 0x01, 0x81, - 0xE0, 0x00, 0x1E, 0x00, 0x00, 0xE0, 0x00, 0x0E, 0x00, 0x00, 0x70, 0x00, - 0x03, 0x00, 0x00, 0x38, 0x00, 0x01, 0xC0, 0x00, 0x0E, 0x1F, 0xF0, 0x73, - 0xFF, 0xE3, 0xBC, 0x0F, 0x9F, 0x80, 0x1C, 0xF8, 0x00, 0x77, 0x80, 0x03, - 0xBC, 0x00, 0x0C, 0xE0, 0x00, 0x77, 0x00, 0x03, 0xB8, 0x00, 0x18, 0xE0, - 0x01, 0xC7, 0x00, 0x0E, 0x1C, 0x00, 0xE0, 0x78, 0x1E, 0x01, 0xFF, 0xE0, - 0x03, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x7E, 0x00, - 0x0F, 0xE0, 0x00, 0xEE, 0x00, 0x0E, 0xE0, 0x01, 0xC0, 0x00, 0x1C, 0x00, - 0x03, 0x80, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0x70, 0x00, 0x0E, 0x00, - 0x00, 0xE0, 0x00, 0x1E, 0x00, 0x01, 0xC0, 0x00, 0x1C, 0x00, 0x03, 0x80, - 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0x70, 0x00, 0x0E, 0x00, 0x00, 0xE0, - 0x00, 0x1C, 0x00, 0x01, 0xC0, 0x00, 0x3C, 0x00, 0x03, 0x80, 0x00, 0x00, - 0x20, 0x00, 0x3F, 0xF8, 0x07, 0xFF, 0xF0, 0x7C, 0x07, 0xC3, 0x80, 0x0E, - 0x38, 0x00, 0x39, 0xC0, 0x01, 0xCE, 0x00, 0x0E, 0x70, 0x00, 0x73, 0x80, - 0x03, 0x9E, 0x00, 0x38, 0x78, 0x03, 0xC1, 0xF8, 0xFC, 0x03, 0xFF, 0x80, - 0x7F, 0xFF, 0x07, 0x80, 0x7C, 0x78, 0x00, 0xF7, 0x80, 0x03, 0xB8, 0x00, - 0x0F, 0xC0, 0x00, 0x7E, 0x00, 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0xEE, - 0x00, 0x0E, 0x78, 0x00, 0xF1, 0xF0, 0x1F, 0x07, 0xFF, 0xF0, 0x0F, 0xFE, - 0x00, 0x00, 0x60, 0x00, 0x3F, 0xF0, 0x07, 0xFF, 0xC0, 0x78, 0x0F, 0x07, - 0x80, 0x1C, 0x38, 0x00, 0x73, 0x80, 0x03, 0x9C, 0x00, 0x0E, 0xE0, 0x00, - 0x77, 0x00, 0x03, 0xB8, 0x00, 0x1C, 0xE0, 0x01, 0xF7, 0x00, 0x1F, 0x9C, - 0x01, 0xDC, 0xFE, 0x7C, 0xE1, 0xFF, 0xC7, 0x03, 0xF8, 0x38, 0x00, 0x01, - 0x80, 0x00, 0x1C, 0x00, 0x00, 0xE0, 0x00, 0x07, 0x00, 0x00, 0x70, 0x00, - 0x03, 0x80, 0x00, 0x38, 0x00, 0x07, 0x81, 0xC0, 0xF8, 0x0F, 0xFF, 0x80, - 0x3F, 0xF0, 0x00, 0x7F, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, - 0xFF, 0x70, 0x7F, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, - 0x77, 0x66, 0x6C, 0xC0, 0x00, 0x00, 0x80, 0x01, 0xC0, 0x07, 0xE0, 0x0F, - 0xC0, 0x3F, 0x00, 0x7E, 0x01, 0xF8, 0x01, 0xE0, 0x00, 0xE0, 0x00, 0x7C, - 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00, 0x3E, - 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, - 0xFF, 0xE0, 0x00, 0x00, 0x70, 0x00, 0x3E, 0x00, 0x07, 0xE0, 0x00, 0xFC, - 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x1F, 0x00, 0x03, 0x80, 0x0F, 0xC0, - 0x1F, 0x80, 0x7E, 0x00, 0xFC, 0x03, 0xF0, 0x03, 0xE0, 0x01, 0x80, 0x00, - 0x00, 0x60, 0x00, 0xFF, 0xC0, 0x7F, 0xFE, 0x3E, 0x03, 0xEF, 0x00, 0x1E, - 0x40, 0x01, 0xC0, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0xE0, 0x00, 0x1C, - 0x00, 0x07, 0x00, 0x00, 0xE0, 0x00, 0x38, 0x00, 0x1E, 0x00, 0x07, 0x80, - 0x00, 0xE0, 0x00, 0x38, 0x00, 0x0F, 0x00, 0x01, 0xC0, 0x00, 0x38, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, - 0x0F, 0x00, 0x01, 0xE0, 0x00, 0x38, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0xFF, 0xF8, 0x00, 0x00, 0x7F, 0xDF, 0xE0, 0x00, 0x1F, 0x00, 0x07, - 0x80, 0x03, 0xC0, 0x00, 0x1C, 0x00, 0x70, 0x00, 0x00, 0xE0, 0x0E, 0x00, - 0x00, 0x03, 0x01, 0xC0, 0x00, 0x00, 0x18, 0x18, 0x01, 0xF8, 0x71, 0xC3, - 0x00, 0xFF, 0xE7, 0x0C, 0x30, 0x1F, 0x1F, 0x70, 0x66, 0x03, 0xC0, 0x3F, - 0x06, 0x60, 0x78, 0x01, 0xF0, 0x76, 0x07, 0x00, 0x0F, 0x03, 0xE0, 0xE0, - 0x00, 0x70, 0x3C, 0x0E, 0x00, 0x07, 0x03, 0xC0, 0xE0, 0x00, 0x70, 0x3C, - 0x0E, 0x00, 0x07, 0x03, 0xC0, 0xE0, 0x00, 0x70, 0x3C, 0x0E, 0x00, 0x07, - 0x03, 0xC0, 0xE0, 0x00, 0x70, 0x3C, 0x0E, 0x00, 0x07, 0x03, 0xE0, 0x70, - 0x00, 0xF0, 0x36, 0x07, 0x00, 0x0F, 0x06, 0x60, 0x38, 0x03, 0xF0, 0x67, - 0x01, 0xE0, 0x73, 0x8E, 0x30, 0x0F, 0xFE, 0x3F, 0xC3, 0x80, 0x3F, 0x81, - 0xF8, 0x1C, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x07, 0x00, - 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x40, 0x00, - 0x07, 0xE0, 0x7C, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x00, 0x3F, 0xC0, - 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x1F, 0x80, 0x00, - 0x01, 0xF8, 0x00, 0x00, 0x39, 0xC0, 0x00, 0x03, 0x9C, 0x00, 0x00, 0x70, - 0xE0, 0x00, 0x07, 0x0E, 0x00, 0x00, 0x60, 0x60, 0x00, 0x0E, 0x07, 0x00, - 0x00, 0xC0, 0x70, 0x00, 0x1C, 0x03, 0x80, 0x01, 0xC0, 0x38, 0x00, 0x38, - 0x01, 0xC0, 0x03, 0x80, 0x1C, 0x00, 0x70, 0x00, 0xE0, 0x07, 0x00, 0x0E, - 0x00, 0xFF, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0x01, 0xFF, 0xFF, 0xF0, 0x1C, - 0x00, 0x03, 0x81, 0xC0, 0x00, 0x38, 0x38, 0x00, 0x01, 0xC3, 0x80, 0x00, - 0x1C, 0x70, 0x00, 0x00, 0xE7, 0x00, 0x00, 0x0E, 0xE0, 0x00, 0x00, 0x70, - 0xFF, 0xFF, 0x81, 0xFF, 0xFF, 0xC3, 0x80, 0x07, 0xC7, 0x00, 0x03, 0xCE, - 0x00, 0x03, 0x9C, 0x00, 0x03, 0xB8, 0x00, 0x07, 0x70, 0x00, 0x0E, 0xE0, - 0x00, 0x1D, 0xC0, 0x00, 0x73, 0x80, 0x01, 0xE7, 0x00, 0x0F, 0x8F, 0xFF, - 0xFC, 0x1F, 0xFF, 0xFC, 0x38, 0x00, 0xFE, 0x70, 0x00, 0x1E, 0xE0, 0x00, - 0x1F, 0xC0, 0x00, 0x1F, 0x80, 0x00, 0x3F, 0x00, 0x00, 0x7E, 0x00, 0x00, - 0xFC, 0x00, 0x01, 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x1E, 0xE0, 0x03, 0xF9, - 0xFF, 0xFF, 0xE3, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x00, 0x00, 0x7F, 0xF0, - 0x01, 0xFF, 0xFC, 0x07, 0xE0, 0x3E, 0x0F, 0x80, 0x0F, 0x1E, 0x00, 0x02, - 0x3C, 0x00, 0x00, 0x38, 0x00, 0x00, 0x70, 0x00, 0x00, 0x70, 0x00, 0x00, - 0xE0, 0x00, 0x00, 0xE0, 0x00, 0x00, 0xE0, 0x00, 0x00, 0xE0, 0x00, 0x00, - 0xE0, 0x00, 0x00, 0xE0, 0x00, 0x00, 0xE0, 0x00, 0x00, 0xE0, 0x00, 0x00, - 0x70, 0x00, 0x00, 0x70, 0x00, 0x00, 0x78, 0x00, 0x00, 0x38, 0x00, 0x00, - 0x1C, 0x00, 0x02, 0x1E, 0x00, 0x07, 0x0F, 0x80, 0x0F, 0x07, 0xF8, 0xFE, - 0x01, 0xFF, 0xF8, 0x00, 0x7F, 0xE0, 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0xF8, - 0x0E, 0x00, 0x3F, 0x83, 0x80, 0x01, 0xF0, 0xE0, 0x00, 0x1E, 0x38, 0x00, - 0x03, 0xCE, 0x00, 0x00, 0x73, 0x80, 0x00, 0x0E, 0xE0, 0x00, 0x03, 0xB8, - 0x00, 0x00, 0x7E, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x07, 0xE0, 0x00, 0x01, - 0xF8, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x07, 0xE0, 0x00, - 0x01, 0xF8, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x3B, 0x80, 0x00, 0x0E, 0xE0, - 0x00, 0x07, 0x38, 0x00, 0x03, 0xCE, 0x00, 0x01, 0xE3, 0x80, 0x01, 0xF0, - 0xFF, 0xFF, 0xF0, 0x3F, 0xFF, 0xF8, 0x0F, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, - 0xEF, 0xFF, 0xFE, 0xE0, 0x00, 0x0E, 0x00, 0x00, 0xE0, 0x00, 0x0E, 0x00, - 0x00, 0xE0, 0x00, 0x0E, 0x00, 0x00, 0xE0, 0x00, 0x0E, 0x00, 0x00, 0xE0, - 0x00, 0x0E, 0x00, 0x00, 0xFF, 0xFF, 0x8F, 0xFF, 0xF8, 0xE0, 0x00, 0x0E, - 0x00, 0x00, 0xE0, 0x00, 0x0E, 0x00, 0x00, 0xE0, 0x00, 0x0E, 0x00, 0x00, - 0xE0, 0x00, 0x0E, 0x00, 0x00, 0xE0, 0x00, 0x0E, 0x00, 0x00, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, - 0x00, 0x70, 0x00, 0x0E, 0x00, 0x01, 0xC0, 0x00, 0x38, 0x00, 0x07, 0x00, - 0x00, 0xE0, 0x00, 0x1C, 0x00, 0x03, 0x80, 0x00, 0x70, 0x00, 0x0E, 0x00, - 0x01, 0xFF, 0xFF, 0x3F, 0xFF, 0xE7, 0x00, 0x00, 0xE0, 0x00, 0x1C, 0x00, - 0x03, 0x80, 0x00, 0x70, 0x00, 0x0E, 0x00, 0x01, 0xC0, 0x00, 0x38, 0x00, - 0x07, 0x00, 0x00, 0xE0, 0x00, 0x1C, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x3F, 0xF8, 0x00, 0x7F, 0xFF, 0x00, 0xFC, 0x07, 0xE0, - 0xF8, 0x00, 0x78, 0xF0, 0x00, 0x18, 0xF0, 0x00, 0x00, 0x70, 0x00, 0x00, - 0x70, 0x00, 0x00, 0x38, 0x00, 0x00, 0x38, 0x00, 0x00, 0x1C, 0x00, 0x00, - 0x0E, 0x00, 0x00, 0x07, 0x00, 0x00, 0x03, 0x80, 0x00, 0x0D, 0xC0, 0x00, - 0x06, 0xE0, 0x00, 0x03, 0x70, 0x00, 0x01, 0x9C, 0x00, 0x00, 0xCE, 0x00, - 0x00, 0x67, 0x80, 0x00, 0x31, 0xC0, 0x00, 0x18, 0x70, 0x00, 0x0C, 0x3C, - 0x00, 0x06, 0x0F, 0x80, 0x0F, 0x01, 0xFC, 0x3F, 0x80, 0x7F, 0xFF, 0x00, - 0x07, 0xFC, 0x00, 0xE0, 0x00, 0x0F, 0xC0, 0x00, 0x1F, 0x80, 0x00, 0x3F, - 0x00, 0x00, 0x7E, 0x00, 0x00, 0xFC, 0x00, 0x01, 0xF8, 0x00, 0x03, 0xF0, - 0x00, 0x07, 0xE0, 0x00, 0x0F, 0xC0, 0x00, 0x1F, 0x80, 0x00, 0x3F, 0x00, - 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x03, 0xF0, 0x00, - 0x07, 0xE0, 0x00, 0x0F, 0xC0, 0x00, 0x1F, 0x80, 0x00, 0x3F, 0x00, 0x00, - 0x7E, 0x00, 0x00, 0xFC, 0x00, 0x01, 0xF8, 0x00, 0x03, 0xF0, 0x00, 0x07, - 0xE0, 0x00, 0x0F, 0xC0, 0x00, 0x1F, 0x80, 0x00, 0x38, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x3F, 0xFE, 0x7F, 0xFC, - 0x00, 0x38, 0x00, 0x70, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x80, 0x07, 0x00, - 0x0E, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x70, 0x00, 0xE0, 0x01, 0xC0, 0x03, - 0x80, 0x07, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x70, 0x00, 0xE8, - 0x01, 0xD0, 0x03, 0xF8, 0x0E, 0x7C, 0x7C, 0x7F, 0xF0, 0x3F, 0x80, 0xE0, - 0x00, 0x1C, 0xE0, 0x00, 0x38, 0xE0, 0x00, 0x70, 0xE0, 0x00, 0xE0, 0xE0, - 0x01, 0xC0, 0xE0, 0x03, 0x80, 0xE0, 0x07, 0x00, 0xE0, 0x0E, 0x00, 0xE0, - 0x1C, 0x00, 0xE0, 0x38, 0x00, 0xE0, 0x70, 0x00, 0xE0, 0xE0, 0x00, 0xE1, - 0xE0, 0x00, 0xE3, 0xF0, 0x00, 0xE7, 0xF8, 0x00, 0xEF, 0x3C, 0x00, 0xFE, - 0x1E, 0x00, 0xFC, 0x0E, 0x00, 0xF8, 0x07, 0x00, 0xF0, 0x03, 0x80, 0xE0, - 0x03, 0xC0, 0xE0, 0x01, 0xE0, 0xE0, 0x00, 0xF0, 0xE0, 0x00, 0x78, 0xE0, - 0x00, 0x38, 0xE0, 0x00, 0x1C, 0xE0, 0x00, 0x0E, 0xE0, 0x00, 0x1C, 0x00, - 0x03, 0x80, 0x00, 0x70, 0x00, 0x0E, 0x00, 0x01, 0xC0, 0x00, 0x38, 0x00, - 0x07, 0x00, 0x00, 0xE0, 0x00, 0x1C, 0x00, 0x03, 0x80, 0x00, 0x70, 0x00, - 0x0E, 0x00, 0x01, 0xC0, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0xE0, 0x00, - 0x1C, 0x00, 0x03, 0x80, 0x00, 0x70, 0x00, 0x0E, 0x00, 0x01, 0xC0, 0x00, - 0x38, 0x00, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x80, 0xE0, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x1F, - 0xF0, 0x00, 0x01, 0xFF, 0xC0, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0xFF, 0xB8, - 0x00, 0x0E, 0xFC, 0xC0, 0x00, 0x77, 0xE7, 0x00, 0x07, 0x3F, 0x1C, 0x00, - 0x39, 0xF8, 0xE0, 0x03, 0x8F, 0xC3, 0x80, 0x18, 0x7E, 0x1C, 0x01, 0xC3, - 0xF0, 0x70, 0x1C, 0x1F, 0x81, 0xC0, 0xE0, 0xFC, 0x0E, 0x0E, 0x07, 0xE0, - 0x38, 0x60, 0x3F, 0x01, 0xC7, 0x01, 0xF8, 0x07, 0x30, 0x0F, 0xC0, 0x1B, - 0x80, 0x7E, 0x00, 0xF8, 0x03, 0xF0, 0x03, 0xC0, 0x1F, 0x80, 0x1C, 0x00, - 0xFC, 0x00, 0x40, 0x07, 0xE0, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x01, 0xF8, - 0x00, 0x00, 0x0E, 0xE0, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0xE0, 0x00, 0x3F, - 0xE0, 0x00, 0x7F, 0xE0, 0x00, 0xFD, 0xC0, 0x01, 0xF9, 0xC0, 0x03, 0xF3, - 0xC0, 0x07, 0xE3, 0xC0, 0x0F, 0xC3, 0xC0, 0x1F, 0x83, 0x80, 0x3F, 0x03, - 0x80, 0x7E, 0x07, 0x80, 0xFC, 0x07, 0x81, 0xF8, 0x07, 0x83, 0xF0, 0x07, - 0x07, 0xE0, 0x07, 0x0F, 0xC0, 0x0F, 0x1F, 0x80, 0x0F, 0x3F, 0x00, 0x0F, - 0x7E, 0x00, 0x0E, 0xFC, 0x00, 0x0F, 0xF8, 0x00, 0x1F, 0xF0, 0x00, 0x1F, - 0xE0, 0x00, 0x1F, 0xC0, 0x00, 0x1F, 0x80, 0x00, 0x38, 0x00, 0x02, 0x00, - 0x00, 0x03, 0xFF, 0x80, 0x00, 0x7F, 0xFF, 0x00, 0x0F, 0xC0, 0x7E, 0x00, - 0xF0, 0x00, 0xF8, 0x0F, 0x00, 0x01, 0xE0, 0xF0, 0x00, 0x07, 0x07, 0x00, - 0x00, 0x1C, 0x70, 0x00, 0x00, 0xE3, 0x80, 0x00, 0x03, 0xB8, 0x00, 0x00, - 0x1D, 0xC0, 0x00, 0x00, 0xEE, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x1F, - 0x80, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x3F, 0x00, - 0x00, 0x03, 0x9C, 0x00, 0x00, 0x1C, 0xE0, 0x00, 0x00, 0xE7, 0x80, 0x00, - 0x0E, 0x1C, 0x00, 0x00, 0xF0, 0x70, 0x00, 0x0F, 0x03, 0xC0, 0x00, 0xF0, - 0x0F, 0x80, 0x0F, 0x00, 0x1F, 0xC7, 0xF0, 0x00, 0x7F, 0xFF, 0x00, 0x00, - 0x7F, 0xC0, 0x00, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0x0E, 0x00, 0x7E, 0x38, - 0x00, 0x3C, 0xE0, 0x00, 0x7B, 0x80, 0x00, 0xEE, 0x00, 0x01, 0xF8, 0x00, - 0x07, 0xE0, 0x00, 0x1F, 0x80, 0x00, 0x7E, 0x00, 0x01, 0xF8, 0x00, 0x07, - 0xE0, 0x00, 0x3B, 0x80, 0x01, 0xEE, 0x00, 0x0F, 0x38, 0x01, 0xF8, 0xFF, - 0xFF, 0xC3, 0xFF, 0xFC, 0x0E, 0x00, 0x00, 0x38, 0x00, 0x00, 0xE0, 0x00, - 0x03, 0x80, 0x00, 0x0E, 0x00, 0x00, 0x38, 0x00, 0x00, 0xE0, 0x00, 0x03, - 0x80, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFF, - 0xC0, 0x00, 0x1F, 0xFF, 0xC0, 0x01, 0xF8, 0x0F, 0xC0, 0x0F, 0x00, 0x0F, - 0x80, 0x78, 0x00, 0x0F, 0x03, 0xC0, 0x00, 0x1C, 0x0E, 0x00, 0x00, 0x38, - 0x70, 0x00, 0x00, 0xE1, 0xC0, 0x00, 0x01, 0xCE, 0x00, 0x00, 0x07, 0x38, - 0x00, 0x00, 0x1C, 0xE0, 0x00, 0x00, 0x3B, 0x80, 0x00, 0x00, 0xEE, 0x00, - 0x00, 0x03, 0xB8, 0x00, 0x00, 0x0E, 0xE0, 0x00, 0x00, 0x3B, 0x80, 0x00, - 0x01, 0xC7, 0x00, 0x00, 0x07, 0x1C, 0x00, 0x00, 0x1C, 0x78, 0x00, 0x00, - 0xE0, 0xE0, 0x00, 0x07, 0x81, 0xC0, 0x00, 0x3C, 0x07, 0x80, 0x01, 0xE0, - 0x0F, 0x80, 0x0F, 0x00, 0x0F, 0xE3, 0xF8, 0x00, 0x1F, 0xFF, 0xC0, 0x00, - 0x0F, 0xF8, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x07, 0x80, 0x20, 0x00, - 0x0F, 0x83, 0xC0, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x1F, 0xE0, 0xFF, 0xFF, - 0x03, 0xFF, 0xFF, 0x0E, 0x00, 0x7E, 0x38, 0x00, 0x3C, 0xE0, 0x00, 0x7B, - 0x80, 0x00, 0xEE, 0x00, 0x01, 0xF8, 0x00, 0x07, 0xE0, 0x00, 0x1F, 0x80, - 0x00, 0x7E, 0x00, 0x01, 0xF8, 0x00, 0x07, 0xE0, 0x00, 0x3B, 0x80, 0x01, - 0xEE, 0x00, 0x0F, 0x38, 0x00, 0xF8, 0xFF, 0xFF, 0xC3, 0xFF, 0xFC, 0x0E, - 0x00, 0x70, 0x38, 0x00, 0xE0, 0xE0, 0x03, 0xC3, 0x80, 0x07, 0x0E, 0x00, - 0x0E, 0x38, 0x00, 0x1C, 0xE0, 0x00, 0x73, 0x80, 0x00, 0xEE, 0x00, 0x01, - 0xC0, 0x00, 0x30, 0x00, 0x7F, 0xF0, 0x1F, 0xFF, 0xC3, 0xE0, 0x3E, 0x78, - 0x00, 0x47, 0x00, 0x00, 0x70, 0x00, 0x0E, 0x00, 0x00, 0xE0, 0x00, 0x07, - 0x00, 0x00, 0x70, 0x00, 0x07, 0xC0, 0x00, 0x3F, 0x00, 0x00, 0xFF, 0x00, - 0x03, 0xFE, 0x00, 0x07, 0xF8, 0x00, 0x07, 0xE0, 0x00, 0x1E, 0x00, 0x00, - 0xF0, 0x00, 0x07, 0x00, 0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0x7C, 0x00, - 0x0F, 0xF0, 0x01, 0xE7, 0xE0, 0x7C, 0x3F, 0xFF, 0x80, 0x7F, 0xE0, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x03, 0x80, 0x00, 0x0E, 0x00, 0x00, 0x38, - 0x00, 0x00, 0xE0, 0x00, 0x03, 0x80, 0x00, 0x0E, 0x00, 0x00, 0x38, 0x00, - 0x00, 0xE0, 0x00, 0x03, 0x80, 0x00, 0x0E, 0x00, 0x00, 0x38, 0x00, 0x00, - 0xE0, 0x00, 0x03, 0x80, 0x00, 0x0E, 0x00, 0x00, 0x38, 0x00, 0x00, 0xE0, - 0x00, 0x03, 0x80, 0x00, 0x0E, 0x00, 0x00, 0x38, 0x00, 0x00, 0xE0, 0x00, - 0x03, 0x80, 0x00, 0x0E, 0x00, 0x00, 0x38, 0x00, 0x00, 0xE0, 0x00, 0x03, - 0x80, 0x00, 0xE0, 0x00, 0x0F, 0xC0, 0x00, 0x1F, 0x80, 0x00, 0x3F, 0x00, - 0x00, 0x7E, 0x00, 0x00, 0xFC, 0x00, 0x01, 0xF8, 0x00, 0x03, 0xF0, 0x00, - 0x07, 0xE0, 0x00, 0x0F, 0xC0, 0x00, 0x1F, 0x80, 0x00, 0x3F, 0x00, 0x00, - 0x7E, 0x00, 0x00, 0xFC, 0x00, 0x01, 0xF8, 0x00, 0x03, 0xF0, 0x00, 0x07, - 0xE0, 0x00, 0x0F, 0xC0, 0x00, 0x1F, 0x80, 0x00, 0x33, 0x80, 0x00, 0xE7, - 0x00, 0x01, 0xCF, 0x00, 0x07, 0x8E, 0x00, 0x1E, 0x0F, 0x00, 0x78, 0x1F, - 0xC7, 0xE0, 0x0F, 0xFF, 0x80, 0x07, 0xFC, 0x00, 0xF0, 0x00, 0x00, 0xEE, - 0x00, 0x00, 0x39, 0xC0, 0x00, 0x07, 0x1C, 0x00, 0x00, 0xC3, 0x80, 0x00, - 0x38, 0x38, 0x00, 0x07, 0x07, 0x00, 0x01, 0xC0, 0x70, 0x00, 0x38, 0x0E, - 0x00, 0x0E, 0x01, 0xE0, 0x01, 0xC0, 0x1C, 0x00, 0x70, 0x03, 0x80, 0x0E, - 0x00, 0x38, 0x01, 0x80, 0x07, 0x00, 0x70, 0x00, 0x70, 0x0E, 0x00, 0x0E, - 0x03, 0x80, 0x00, 0xE0, 0x70, 0x00, 0x1C, 0x1C, 0x00, 0x03, 0xC3, 0x80, - 0x00, 0x38, 0xE0, 0x00, 0x07, 0x1C, 0x00, 0x00, 0x73, 0x00, 0x00, 0x0E, - 0xE0, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x01, 0xE0, 0x00, - 0x00, 0x38, 0x00, 0x00, 0x70, 0x00, 0x1C, 0x00, 0x03, 0xB8, 0x00, 0x0F, - 0x00, 0x01, 0x9C, 0x00, 0x0F, 0x80, 0x01, 0xC7, 0x00, 0x07, 0xC0, 0x00, - 0xE3, 0x80, 0x03, 0x70, 0x00, 0x61, 0xC0, 0x03, 0xB8, 0x00, 0x70, 0x70, - 0x01, 0xCC, 0x00, 0x38, 0x38, 0x00, 0xC7, 0x00, 0x18, 0x1C, 0x00, 0xE3, - 0x80, 0x1C, 0x07, 0x00, 0x70, 0xC0, 0x0E, 0x03, 0x80, 0x30, 0x70, 0x0E, - 0x01, 0xC0, 0x38, 0x38, 0x07, 0x00, 0x70, 0x1C, 0x0C, 0x03, 0x80, 0x38, - 0x0C, 0x07, 0x03, 0x80, 0x1C, 0x0E, 0x03, 0x81, 0xC0, 0x07, 0x07, 0x00, - 0xC0, 0xE0, 0x03, 0x83, 0x00, 0x70, 0xE0, 0x01, 0xC3, 0x80, 0x38, 0x70, - 0x00, 0x71, 0xC0, 0x0C, 0x38, 0x00, 0x38, 0xC0, 0x07, 0x38, 0x00, 0x1C, - 0xE0, 0x03, 0x9C, 0x00, 0x07, 0x70, 0x00, 0xEE, 0x00, 0x03, 0xB0, 0x00, - 0x7E, 0x00, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x00, 0x7C, 0x00, 0x0F, 0x80, - 0x00, 0x3C, 0x00, 0x07, 0x80, 0x00, 0x1E, 0x00, 0x03, 0xC0, 0x00, 0x70, - 0x00, 0x1E, 0x38, 0x00, 0x1C, 0x3C, 0x00, 0x38, 0x1C, 0x00, 0x70, 0x0E, - 0x00, 0x70, 0x07, 0x00, 0xE0, 0x07, 0x81, 0xC0, 0x03, 0x83, 0x80, 0x01, - 0xC3, 0x80, 0x01, 0xE7, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7E, 0x00, 0x00, - 0x3C, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x7E, 0x00, 0x00, 0xEE, 0x00, 0x01, - 0xE7, 0x00, 0x01, 0xC3, 0x80, 0x03, 0x83, 0xC0, 0x07, 0x01, 0xC0, 0x0F, - 0x00, 0xE0, 0x0E, 0x00, 0xF0, 0x1C, 0x00, 0x78, 0x3C, 0x00, 0x38, 0x78, - 0x00, 0x1C, 0x70, 0x00, 0x1E, 0xE0, 0x00, 0x0F, 0x70, 0x00, 0x07, 0x38, - 0x00, 0x03, 0x8E, 0x00, 0x03, 0x87, 0x00, 0x01, 0x81, 0xC0, 0x01, 0xC0, - 0x70, 0x01, 0xC0, 0x38, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x07, 0x00, 0xE0, - 0x01, 0xC0, 0x70, 0x00, 0x70, 0x70, 0x00, 0x38, 0x38, 0x00, 0x0E, 0x38, - 0x00, 0x07, 0xB8, 0x00, 0x01, 0xDC, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x3C, - 0x00, 0x00, 0x0E, 0x00, 0x00, 0x07, 0x00, 0x00, 0x03, 0x80, 0x00, 0x01, - 0xC0, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x70, 0x00, 0x00, 0x38, 0x00, 0x00, - 0x1C, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xF0, 0x00, 0x03, 0x80, 0x00, 0x1C, 0x00, 0x00, 0xE0, 0x00, - 0x07, 0x80, 0x00, 0x3C, 0x00, 0x00, 0xE0, 0x00, 0x07, 0x00, 0x00, 0x3C, - 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x38, 0x00, 0x01, 0xC0, 0x00, - 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x0E, 0x00, 0x00, 0x70, - 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0x70, 0x00, 0x03, 0x80, 0x00, - 0x1C, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, - 0xFF, 0xFF, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, - 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, - 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xFF, 0xFF, - 0xFF, 0xC0, 0x01, 0xC0, 0x03, 0x80, 0x03, 0x00, 0x07, 0x00, 0x06, 0x00, - 0x0C, 0x00, 0x1C, 0x00, 0x18, 0x00, 0x30, 0x00, 0x70, 0x00, 0x60, 0x00, - 0xE0, 0x01, 0xC0, 0x01, 0x80, 0x03, 0x80, 0x07, 0x00, 0x06, 0x00, 0x0E, - 0x00, 0x1C, 0x00, 0x18, 0x00, 0x38, 0x00, 0x70, 0x00, 0x60, 0x00, 0xE0, - 0x00, 0xC0, 0x01, 0x80, 0x03, 0x80, 0x03, 0x00, 0x06, 0x00, 0x0E, 0x00, - 0x0C, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x30, 0x00, 0x70, 0x00, 0xE0, 0xFF, - 0xFC, 0x38, 0x70, 0xE1, 0xC3, 0x87, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC3, - 0x87, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0x87, 0x0E, 0x1C, 0x38, 0x70, - 0xE1, 0xC3, 0x87, 0x0E, 0x1F, 0xFF, 0xFF, 0xE0, 0x01, 0xC0, 0x01, 0xC0, - 0x03, 0xC0, 0x03, 0x60, 0x06, 0x60, 0x06, 0x70, 0x0E, 0x30, 0x0C, 0x30, - 0x0C, 0x18, 0x18, 0x18, 0x18, 0x1C, 0x38, 0x0C, 0x30, 0x0E, 0x70, 0x06, - 0x60, 0x06, 0x60, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x3C, 0x07, - 0x01, 0xC0, 0x78, 0x01, 0xC0, 0x0F, 0xFE, 0x1F, 0xFF, 0x8F, 0x01, 0xE2, - 0x00, 0x78, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x03, 0x00, 0x01, 0x80, 0xFF, - 0xC7, 0xFF, 0xE7, 0xE0, 0x37, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, - 0x07, 0xE0, 0x03, 0xB8, 0x03, 0xDE, 0x07, 0x67, 0xFF, 0x30, 0xFF, 0x18, - 0xE0, 0x00, 0x07, 0x00, 0x00, 0x38, 0x00, 0x01, 0xC0, 0x00, 0x0E, 0x00, - 0x00, 0x70, 0x00, 0x03, 0x80, 0x00, 0x1C, 0x00, 0x00, 0xE0, 0x70, 0x07, - 0x1F, 0xF0, 0x3B, 0xFF, 0xE1, 0xFC, 0x07, 0x8F, 0x80, 0x1E, 0x78, 0x00, - 0x73, 0xC0, 0x01, 0xDC, 0x00, 0x0E, 0xE0, 0x00, 0x37, 0x00, 0x01, 0xF8, - 0x00, 0x0F, 0xC0, 0x00, 0x7E, 0x00, 0x03, 0xF0, 0x00, 0x3B, 0x80, 0x01, - 0xDE, 0x00, 0x1E, 0xF8, 0x00, 0xE7, 0xE0, 0x0E, 0x3B, 0xC3, 0xF1, 0xCF, - 0xFE, 0x0E, 0x1F, 0xC0, 0x00, 0x00, 0xF0, 0x01, 0xFF, 0x80, 0xFF, 0xF8, - 0x78, 0x0F, 0x38, 0x01, 0xDC, 0x00, 0x27, 0x00, 0x03, 0x80, 0x00, 0xE0, - 0x00, 0x38, 0x00, 0x0E, 0x00, 0x03, 0x80, 0x00, 0xE0, 0x00, 0x38, 0x00, - 0x0E, 0x00, 0x01, 0xC0, 0x00, 0x78, 0x00, 0x8F, 0x00, 0x71, 0xF0, 0xF8, - 0x3F, 0xFC, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x38, 0x00, 0x01, 0xC0, 0x00, - 0x0E, 0x00, 0x00, 0x70, 0x00, 0x03, 0x80, 0x00, 0x1C, 0x00, 0x00, 0xE0, - 0x00, 0x07, 0x00, 0x60, 0x38, 0x3F, 0xF1, 0xC7, 0xFF, 0xCE, 0x7C, 0x07, - 0x73, 0x80, 0x1F, 0xB8, 0x00, 0x7D, 0xC0, 0x01, 0xFC, 0x00, 0x0F, 0xE0, - 0x00, 0x3F, 0x00, 0x01, 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0x7E, 0x00, 0x03, - 0xF0, 0x00, 0x3F, 0x80, 0x01, 0xEE, 0x00, 0x1F, 0x78, 0x00, 0xF9, 0xE0, - 0x0F, 0xC7, 0xC3, 0xEE, 0x1F, 0xFE, 0x70, 0x3F, 0xC3, 0x80, 0x00, 0xE0, - 0x00, 0x7F, 0xE0, 0x1F, 0xFF, 0x03, 0xC0, 0x78, 0x38, 0x01, 0xC7, 0x00, - 0x0E, 0x60, 0x00, 0xEE, 0x00, 0x06, 0xE0, 0x00, 0x7E, 0x00, 0x07, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x0E, 0x00, 0x00, 0xE0, 0x00, 0x07, - 0x00, 0x00, 0x78, 0x00, 0x83, 0xC0, 0x1C, 0x1F, 0x87, 0xC0, 0xFF, 0xF8, - 0x03, 0xFE, 0x00, 0x03, 0xF8, 0x1F, 0xE0, 0xF1, 0x83, 0x80, 0x1C, 0x00, - 0x70, 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x03, 0xFF, 0xCF, 0xFF, 0x07, 0x00, - 0x1C, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00, 0x70, 0x01, 0xC0, - 0x07, 0x00, 0x1C, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00, 0x70, - 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00, 0x00, 0x70, 0x00, 0x3F, 0xF1, 0xC7, - 0xFF, 0xEE, 0x7C, 0x07, 0xF7, 0x80, 0x0F, 0xB8, 0x00, 0x3F, 0xC0, 0x01, - 0xFC, 0x00, 0x07, 0xE0, 0x00, 0x3F, 0x00, 0x01, 0xF8, 0x00, 0x0F, 0xC0, - 0x00, 0x7E, 0x00, 0x03, 0xF0, 0x00, 0x3D, 0xC0, 0x01, 0xEF, 0x00, 0x1F, - 0x3C, 0x01, 0xF8, 0xF8, 0x3D, 0xC3, 0xFF, 0xCE, 0x07, 0xF8, 0x70, 0x00, - 0x03, 0x80, 0x00, 0x1C, 0x00, 0x01, 0xC0, 0x00, 0x0E, 0x30, 0x00, 0xF3, - 0xE0, 0x0F, 0x0F, 0xFF, 0xF0, 0x1F, 0xFF, 0x00, 0x1F, 0x80, 0x00, 0xE0, - 0x00, 0x1C, 0x00, 0x03, 0x80, 0x00, 0x70, 0x00, 0x0E, 0x00, 0x01, 0xC0, - 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0xE0, 0xF0, 0x1C, 0xFF, 0xC3, 0xBF, - 0xFC, 0x7E, 0x03, 0xCF, 0x80, 0x3D, 0xE0, 0x03, 0xB8, 0x00, 0x37, 0x00, - 0x07, 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00, 0x7E, 0x00, - 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x00, 0xFC, 0x00, - 0x1F, 0x80, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x0E, 0xEF, 0xFE, 0x00, 0x00, - 0x0E, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xE0, 0x00, - 0xE0, 0x0F, 0x00, 0xF0, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, - 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, - 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, - 0xE4, 0x1C, 0x7F, 0xC7, 0xF8, 0x1C, 0x00, 0xE0, 0x00, 0x1C, 0x00, 0x03, - 0x80, 0x00, 0x70, 0x00, 0x0E, 0x00, 0x01, 0xC0, 0x00, 0x38, 0x00, 0x07, - 0x00, 0x00, 0xE0, 0x00, 0x5C, 0x00, 0x73, 0x80, 0x1C, 0x70, 0x07, 0x0E, - 0x01, 0xC1, 0xC0, 0xF0, 0x38, 0x3C, 0x07, 0x0F, 0x00, 0xE3, 0xC0, 0x1C, - 0xF8, 0x03, 0xBF, 0x80, 0x7F, 0x78, 0x0F, 0xC7, 0x01, 0xE0, 0x70, 0x38, - 0x07, 0x07, 0x00, 0xF0, 0xE0, 0x0F, 0x1C, 0x00, 0xE3, 0x80, 0x0E, 0x70, - 0x00, 0xEE, 0x00, 0x1E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFE, 0x00, 0x60, 0x00, 0xE0, 0x39, 0xFF, 0x81, 0xFF, 0x0E, - 0xFF, 0xF1, 0xFF, 0xE3, 0xF0, 0x1E, 0xF0, 0x3C, 0xF8, 0x03, 0xF0, 0x07, - 0xBC, 0x00, 0x78, 0x00, 0xEE, 0x00, 0x1E, 0x00, 0x1B, 0x80, 0x07, 0x80, - 0x07, 0xE0, 0x01, 0xC0, 0x01, 0xF8, 0x00, 0x70, 0x00, 0x7E, 0x00, 0x1C, - 0x00, 0x1F, 0x80, 0x07, 0x00, 0x07, 0xE0, 0x01, 0xC0, 0x01, 0xF8, 0x00, - 0x70, 0x00, 0x7E, 0x00, 0x1C, 0x00, 0x1F, 0x80, 0x07, 0x00, 0x07, 0xE0, - 0x01, 0xC0, 0x01, 0xF8, 0x00, 0x70, 0x00, 0x7E, 0x00, 0x1C, 0x00, 0x1F, - 0x80, 0x07, 0x00, 0x07, 0xE0, 0x01, 0xC0, 0x01, 0xC0, 0x00, 0xF0, 0x1C, - 0xFF, 0xC3, 0xBF, 0xFC, 0x7E, 0x03, 0xCF, 0x80, 0x3D, 0xE0, 0x03, 0xB8, - 0x00, 0x37, 0x00, 0x07, 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0, - 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xE0, - 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x0E, 0x00, - 0x70, 0x00, 0x3F, 0xF0, 0x03, 0xFF, 0xE0, 0x3C, 0x07, 0x83, 0x80, 0x1E, - 0x38, 0x00, 0x71, 0xC0, 0x01, 0xDC, 0x00, 0x0E, 0xE0, 0x00, 0x37, 0x00, - 0x01, 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0x7E, 0x00, 0x03, 0xF0, 0x00, 0x3B, - 0x80, 0x01, 0xCE, 0x00, 0x1E, 0x78, 0x00, 0xE1, 0xE0, 0x0E, 0x07, 0xC3, - 0xE0, 0x1F, 0xFE, 0x00, 0x3F, 0xC0, 0x00, 0x00, 0x70, 0x07, 0x1F, 0xF0, - 0x3B, 0xFF, 0xE1, 0xFC, 0x07, 0x8F, 0x80, 0x1E, 0x78, 0x00, 0x73, 0xC0, - 0x01, 0xDC, 0x00, 0x0E, 0xE0, 0x00, 0x37, 0x00, 0x01, 0xF8, 0x00, 0x0F, - 0xC0, 0x00, 0x7E, 0x00, 0x03, 0xF0, 0x00, 0x3B, 0x80, 0x01, 0xDE, 0x00, - 0x1E, 0xF8, 0x00, 0xE7, 0xE0, 0x0E, 0x3B, 0xC3, 0xF1, 0xCF, 0xFE, 0x0E, - 0x1F, 0xC0, 0x70, 0x00, 0x03, 0x80, 0x00, 0x1C, 0x00, 0x00, 0xE0, 0x00, - 0x07, 0x00, 0x00, 0x38, 0x00, 0x01, 0xC0, 0x00, 0x0E, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x3F, 0xF1, 0xC7, 0xFF, 0xCE, 0x7C, 0x07, 0x73, 0x80, - 0x1F, 0xB8, 0x00, 0x7D, 0xC0, 0x01, 0xFC, 0x00, 0x0F, 0xE0, 0x00, 0x3F, - 0x00, 0x01, 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0x7E, 0x00, 0x03, 0xF0, 0x00, - 0x3F, 0x80, 0x01, 0xEE, 0x00, 0x1F, 0x78, 0x00, 0xF9, 0xE0, 0x0F, 0xC7, - 0xC3, 0xEE, 0x1F, 0xFE, 0x70, 0x3F, 0xC3, 0x80, 0x00, 0x1C, 0x00, 0x00, - 0xE0, 0x00, 0x07, 0x00, 0x00, 0x38, 0x00, 0x01, 0xC0, 0x00, 0x0E, 0x00, - 0x00, 0x70, 0x00, 0x03, 0x80, 0x00, 0x79, 0xFE, 0xFF, 0xF8, 0xF8, 0x3C, - 0x0E, 0x03, 0x80, 0xE0, 0x38, 0x0E, 0x03, 0x80, 0xE0, 0x38, 0x0E, 0x03, - 0x80, 0xE0, 0x38, 0x0E, 0x03, 0x80, 0xE0, 0x00, 0x01, 0xE0, 0x07, 0xFF, - 0x0F, 0xFF, 0xCF, 0x00, 0xC7, 0x00, 0x03, 0x80, 0x01, 0x80, 0x00, 0xE0, - 0x00, 0x78, 0x00, 0x1F, 0x80, 0x07, 0xFE, 0x00, 0x7F, 0xC0, 0x01, 0xF0, - 0x00, 0x3C, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x03, 0xB0, 0x03, 0xBF, 0x07, - 0xCF, 0xFF, 0xC0, 0xFF, 0x80, 0x1C, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00, - 0x1C, 0x03, 0xFF, 0xCF, 0xFF, 0x07, 0x00, 0x1C, 0x00, 0x70, 0x01, 0xC0, - 0x07, 0x00, 0x1C, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00, 0x70, - 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00, 0x38, 0x00, 0xF1, 0x81, 0xFF, 0x03, - 0xF8, 0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, - 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x3C, - 0x00, 0x0F, 0x00, 0x07, 0xE0, 0x01, 0xF8, 0x00, 0x7E, 0x00, 0x1F, 0xC0, - 0x0F, 0x78, 0x07, 0xCF, 0x8F, 0xB1, 0xFF, 0xCC, 0x3F, 0xC3, 0xE0, 0x00, - 0x3B, 0x80, 0x03, 0x9C, 0x00, 0x1C, 0x70, 0x00, 0xC3, 0x80, 0x0E, 0x0E, - 0x00, 0x60, 0x70, 0x07, 0x01, 0x80, 0x38, 0x0E, 0x03, 0x80, 0x70, 0x1C, - 0x01, 0xC1, 0xC0, 0x0E, 0x0E, 0x00, 0x38, 0x60, 0x01, 0xC7, 0x00, 0x06, - 0x30, 0x00, 0x3B, 0x80, 0x00, 0xDC, 0x00, 0x07, 0xC0, 0x00, 0x3E, 0x00, - 0x00, 0xE0, 0x00, 0x60, 0x00, 0xE0, 0x01, 0xDC, 0x00, 0x78, 0x00, 0x67, - 0x00, 0x1E, 0x00, 0x38, 0xC0, 0x0F, 0xC0, 0x0C, 0x38, 0x03, 0xB0, 0x03, - 0x06, 0x00, 0xCE, 0x01, 0xC1, 0xC0, 0x73, 0x80, 0x60, 0x70, 0x18, 0x60, - 0x38, 0x0C, 0x06, 0x1C, 0x0E, 0x03, 0x83, 0x83, 0x03, 0x00, 0xE0, 0xC0, - 0xC1, 0xC0, 0x18, 0x70, 0x38, 0x60, 0x07, 0x1C, 0x06, 0x18, 0x00, 0xC6, - 0x01, 0xCE, 0x00, 0x3B, 0x80, 0x73, 0x00, 0x0E, 0xC0, 0x0D, 0xC0, 0x01, - 0xB0, 0x03, 0xF0, 0x00, 0x7C, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x1E, 0x00, - 0x03, 0x80, 0x07, 0x00, 0x70, 0x01, 0xC7, 0x00, 0x70, 0xF0, 0x1C, 0x0E, - 0x07, 0x80, 0xE0, 0xE0, 0x0E, 0x38, 0x00, 0xEE, 0x00, 0x1F, 0x80, 0x01, - 0xF0, 0x00, 0x1C, 0x00, 0x07, 0xC0, 0x01, 0xF8, 0x00, 0x3B, 0x80, 0x0E, - 0x38, 0x03, 0x83, 0x80, 0xE0, 0x78, 0x3C, 0x07, 0x07, 0x00, 0x71, 0xC0, - 0x07, 0x70, 0x00, 0x70, 0x70, 0x00, 0x1C, 0xE0, 0x00, 0xE3, 0x80, 0x03, - 0x87, 0x00, 0x0C, 0x1C, 0x00, 0x70, 0x38, 0x01, 0x80, 0xE0, 0x0E, 0x01, - 0x80, 0x38, 0x07, 0x01, 0xC0, 0x1C, 0x07, 0x00, 0x38, 0x38, 0x00, 0xE0, - 0xE0, 0x01, 0xC3, 0x00, 0x07, 0x1C, 0x00, 0x0E, 0x60, 0x00, 0x3B, 0x80, - 0x00, 0x6E, 0x00, 0x01, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0E, 0x00, 0x00, - 0x38, 0x00, 0x00, 0xC0, 0x00, 0x07, 0x00, 0x00, 0x38, 0x00, 0x40, 0xE0, - 0x03, 0xFF, 0x00, 0x07, 0xF8, 0x00, 0x07, 0x80, 0x00, 0xFF, 0xFF, 0xFF, - 0xFF, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x3C, 0x00, 0x38, 0x00, 0x70, 0x00, - 0xE0, 0x01, 0xC0, 0x03, 0xC0, 0x03, 0x80, 0x07, 0x00, 0x0E, 0x00, 0x1E, - 0x00, 0x1C, 0x00, 0x38, 0x00, 0x70, 0x00, 0xE0, 0x00, 0xFF, 0xFF, 0xFF, - 0xFF, 0x03, 0xC1, 0xF0, 0xF0, 0x38, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1C, - 0x07, 0x01, 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1C, 0x3F, 0x0F, - 0x80, 0xF0, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xC0, 0x70, - 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1C, 0x03, 0x80, 0xFC, 0x1F, 0x00, 0xC0, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFE, 0xF0, 0x3E, 0x03, 0xC0, 0x70, 0x0E, 0x03, 0x80, 0xE0, 0x38, - 0x0E, 0x03, 0x80, 0xE0, 0x38, 0x0E, 0x03, 0x80, 0xE0, 0x38, 0x0E, 0x03, - 0xF0, 0x7C, 0x3C, 0x0E, 0x03, 0x80, 0xE0, 0x38, 0x0E, 0x03, 0x80, 0xE0, - 0x38, 0x0E, 0x03, 0x80, 0xE0, 0x38, 0x0E, 0x07, 0x0F, 0xC3, 0xE0, 0xC0, - 0x00, 0x0E, 0x00, 0xCF, 0xE0, 0x37, 0xBC, 0x0D, 0x83, 0x86, 0x60, 0x7F, - 0xB0, 0x0F, 0xC0 }; - -const GFXglyph Montserrat_Regular20pt7bGlyphs[] PROGMEM = { - { 0, 1, 1, 10, 0, 0 }, // 0x20 ' ' - { 1, 4, 27, 10, 3, -26 }, // 0x21 '!' - { 15, 9, 10, 15, 3, -26 }, // 0x22 '"' - { 27, 25, 27, 27, 1, -26 }, // 0x23 '#' - { 112, 20, 37, 24, 2, -31 }, // 0x24 '$' - { 205, 29, 28, 32, 2, -27 }, // 0x25 '%' - { 307, 24, 28, 26, 2, -27 }, // 0x26 '&' - { 391, 2, 10, 8, 3, -26 }, // 0x27 ''' - { 394, 7, 37, 13, 4, -28 }, // 0x28 '(' - { 427, 7, 37, 13, 2, -28 }, // 0x29 ')' - { 460, 13, 14, 15, 1, -28 }, // 0x2A '*' - { 483, 17, 17, 22, 3, -21 }, // 0x2B '+' - { 520, 4, 10, 8, 2, -3 }, // 0x2C ',' - { 525, 11, 3, 15, 2, -11 }, // 0x2D '-' - { 530, 4, 4, 8, 2, -3 }, // 0x2E '.' - { 532, 15, 37, 13, -1, -32 }, // 0x2F '/' - { 602, 22, 28, 26, 2, -27 }, // 0x30 '0' - { 679, 10, 27, 14, 0, -26 }, // 0x31 '1' - { 713, 20, 28, 22, 1, -27 }, // 0x32 '2' - { 783, 20, 27, 22, 0, -26 }, // 0x33 '3' - { 851, 23, 27, 26, 2, -26 }, // 0x34 '4' - { 929, 20, 27, 22, 1, -26 }, // 0x35 '5' - { 997, 21, 28, 24, 2, -27 }, // 0x36 '6' - { 1071, 20, 27, 23, 1, -26 }, // 0x37 '7' - { 1139, 21, 28, 25, 2, -27 }, // 0x38 '8' - { 1213, 21, 28, 24, 1, -27 }, // 0x39 '9' - { 1287, 4, 21, 8, 2, -20 }, // 0x3A ':' - { 1298, 4, 27, 8, 2, -20 }, // 0x3B ';' - { 1312, 17, 16, 22, 3, -21 }, // 0x3C '<' - { 1346, 17, 11, 22, 3, -18 }, // 0x3D '=' - { 1370, 17, 16, 22, 3, -21 }, // 0x3E '>' - { 1404, 19, 28, 22, 0, -27 }, // 0x3F '?' - { 1471, 36, 36, 40, 2, -27 }, // 0x40 '@' - { 1633, 28, 27, 28, 0, -26 }, // 0x41 'A' - { 1728, 23, 27, 29, 4, -26 }, // 0x42 'B' - { 1806, 24, 28, 28, 2, -27 }, // 0x43 'C' - { 1890, 26, 27, 32, 4, -26 }, // 0x44 'D' - { 1978, 20, 27, 26, 4, -26 }, // 0x45 'E' - { 2046, 19, 27, 25, 4, -26 }, // 0x46 'F' - { 2111, 25, 28, 30, 2, -27 }, // 0x47 'G' - { 2199, 23, 27, 32, 4, -26 }, // 0x48 'H' - { 2277, 3, 27, 12, 4, -26 }, // 0x49 'I' - { 2288, 15, 27, 20, 0, -26 }, // 0x4A 'J' - { 2339, 24, 27, 28, 4, -26 }, // 0x4B 'K' - { 2420, 19, 27, 23, 4, -26 }, // 0x4C 'L' - { 2485, 29, 27, 37, 4, -26 }, // 0x4D 'M' - { 2583, 23, 27, 32, 4, -26 }, // 0x4E 'N' - { 2661, 29, 28, 33, 2, -27 }, // 0x4F 'O' - { 2763, 22, 27, 28, 4, -26 }, // 0x50 'P' - { 2838, 30, 33, 33, 2, -27 }, // 0x51 'Q' - { 2962, 22, 27, 28, 4, -26 }, // 0x52 'R' - { 3037, 20, 28, 24, 2, -27 }, // 0x53 'S' - { 3107, 22, 27, 22, 0, -26 }, // 0x54 'T' - { 3182, 23, 27, 31, 4, -26 }, // 0x55 'U' - { 3260, 27, 27, 27, 0, -26 }, // 0x56 'V' - { 3352, 41, 27, 43, 1, -26 }, // 0x57 'W' - { 3491, 24, 27, 26, 1, -26 }, // 0x58 'X' - { 3572, 25, 27, 25, 0, -26 }, // 0x59 'Y' - { 3657, 22, 27, 25, 2, -26 }, // 0x5A 'Z' - { 3732, 8, 37, 12, 4, -28 }, // 0x5B '[' - { 3769, 15, 37, 13, -1, -32 }, // 0x5C '\' - { 3839, 7, 37, 12, 1, -28 }, // 0x5D ']' - { 3872, 16, 16, 22, 3, -21 }, // 0x5E '^' - { 3904, 20, 2, 20, 0, 1 }, // 0x5F '_' - { 3909, 9, 5, 23, 5, -28 }, // 0x60 '`' - { 3915, 17, 21, 23, 2, -20 }, // 0x61 'a' - { 3960, 21, 29, 26, 4, -28 }, // 0x62 'b' - { 4037, 18, 21, 22, 2, -20 }, // 0x63 'c' - { 4085, 21, 29, 26, 2, -28 }, // 0x64 'd' - { 4162, 20, 21, 24, 2, -20 }, // 0x65 'e' - { 4215, 14, 29, 13, 1, -28 }, // 0x66 'f' - { 4266, 21, 29, 27, 2, -20 }, // 0x67 'g' - { 4343, 19, 29, 26, 4, -28 }, // 0x68 'h' - { 4412, 4, 29, 10, 4, -28 }, // 0x69 'i' - { 4427, 12, 37, 11, -4, -28 }, // 0x6A 'j' - { 4483, 19, 29, 23, 4, -28 }, // 0x6B 'k' - { 4552, 3, 29, 10, 4, -28 }, // 0x6C 'l' - { 4563, 34, 21, 41, 4, -20 }, // 0x6D 'm' - { 4653, 19, 21, 26, 4, -20 }, // 0x6E 'n' - { 4703, 21, 21, 24, 2, -20 }, // 0x6F 'o' - { 4759, 21, 29, 26, 4, -20 }, // 0x70 'p' - { 4836, 21, 29, 26, 2, -20 }, // 0x71 'q' - { 4913, 10, 21, 16, 4, -20 }, // 0x72 'r' - { 4940, 17, 21, 19, 1, -20 }, // 0x73 's' - { 4985, 14, 25, 16, 1, -24 }, // 0x74 't' - { 5029, 18, 20, 26, 4, -19 }, // 0x75 'u' - { 5074, 21, 20, 21, 0, -19 }, // 0x76 'v' - { 5127, 34, 20, 34, 0, -19 }, // 0x77 'w' - { 5212, 19, 20, 21, 1, -19 }, // 0x78 'x' - { 5260, 22, 28, 21, -1, -19 }, // 0x79 'y' - { 5337, 16, 20, 20, 2, -19 }, // 0x7A 'z' - { 5377, 10, 37, 13, 2, -28 }, // 0x7B '{' - { 5424, 3, 37, 11, 4, -28 }, // 0x7C '|' - { 5438, 10, 37, 13, 1, -28 }, // 0x7D '}' - { 5485, 18, 6, 22, 2, -16 } }; // 0x7E '~' - -const GFXfont Montserrat_Regular20pt7b PROGMEM = { - (uint8_t *)Montserrat_Regular20pt7bBitmaps, - (GFXglyph *)Montserrat_Regular20pt7bGlyphs, - 0x20, 0x7E, 48 }; - -// Approx. 6171 bytes - -#endif // MONTSERRAT20PT7B_H diff --git a/examples/companion_radio/ui-new/fonts/MontserratBold18pt7b.h b/examples/companion_radio/ui-new/fonts/MontserratBold18pt7b.h deleted file mode 100644 index 6113cf69..00000000 --- a/examples/companion_radio/ui-new/fonts/MontserratBold18pt7b.h +++ /dev/null @@ -1,536 +0,0 @@ -#ifndef MONTSERRATBOLD18PT7B_H -#define MONTSERRATBOLD18PT7B_H -const uint8_t Montserrat_Bold18pt7bBitmaps[] PROGMEM = { - 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0x7D, 0xE7, - 0x9E, 0x78, 0x00, 0x1E, 0xFF, 0xFF, 0xFF, 0x78, 0xF1, 0xFE, 0x3F, 0xC7, - 0xF8, 0xFF, 0x1F, 0xE3, 0xFC, 0x7F, 0x8F, 0xF1, 0xFE, 0x3C, 0x01, 0xE0, - 0xF0, 0x03, 0xC0, 0xF0, 0x03, 0xC1, 0xE0, 0x03, 0xC1, 0xE0, 0x03, 0xC1, - 0xE0, 0x03, 0xC1, 0xE0, 0x7F, 0xFF, 0xFE, 0x7F, 0xFF, 0xFE, 0x7F, 0xFF, - 0xFE, 0x7F, 0xFF, 0xFE, 0x07, 0x83, 0xC0, 0x07, 0x83, 0xC0, 0x07, 0x83, - 0xC0, 0x07, 0x83, 0xC0, 0x07, 0x83, 0xC0, 0x07, 0x83, 0xC0, 0xFF, 0xFF, - 0xFC, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFC, 0x0F, 0x07, 0x80, 0x0F, 0x07, - 0x80, 0x0F, 0x07, 0x80, 0x0F, 0x07, 0x80, 0x0F, 0x07, 0x80, 0x0F, 0x07, - 0x80, 0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0x70, 0x00, 0x07, 0x00, 0x01, - 0xFE, 0x00, 0xFF, 0xFC, 0x1F, 0xFF, 0xE3, 0xFF, 0xFE, 0x7F, 0xFF, 0xC7, - 0xE7, 0x1C, 0x7C, 0x70, 0x4F, 0xC7, 0x00, 0xFC, 0x70, 0x07, 0xF7, 0x00, - 0x7F, 0xF0, 0x03, 0xFF, 0xE0, 0x1F, 0xFF, 0x80, 0xFF, 0xFE, 0x01, 0xFF, - 0xE0, 0x07, 0xFF, 0x00, 0x73, 0xF0, 0x07, 0x1F, 0x00, 0x71, 0xF7, 0x07, - 0x3F, 0x7E, 0x77, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xE7, 0xFF, 0xF8, 0x0F, - 0xFF, 0x00, 0x07, 0x00, 0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0x70, 0x00, - 0x0F, 0x00, 0x07, 0x81, 0xFE, 0x00, 0x78, 0x1F, 0xF8, 0x07, 0x80, 0xF3, - 0xC0, 0x3C, 0x0F, 0x0F, 0x03, 0xC0, 0x78, 0x78, 0x3C, 0x03, 0x81, 0xC1, - 0xE0, 0x1C, 0x0E, 0x1E, 0x00, 0xF0, 0xF1, 0xE0, 0x07, 0x87, 0x9F, 0x00, - 0x1E, 0x78, 0xF0, 0x00, 0xFF, 0xCF, 0x00, 0x03, 0xFC, 0xF8, 0xFC, 0x07, - 0x87, 0x9F, 0xF0, 0x00, 0x78, 0xFF, 0xC0, 0x07, 0xCF, 0x1E, 0x00, 0x3C, - 0x70, 0x78, 0x03, 0xC3, 0x83, 0xC0, 0x3E, 0x1C, 0x1E, 0x01, 0xE0, 0xE0, - 0xF0, 0x1E, 0x07, 0x07, 0x81, 0xE0, 0x3C, 0x78, 0x0F, 0x00, 0xFF, 0xC0, - 0xF0, 0x07, 0xFC, 0x0F, 0x00, 0x0F, 0xC0, 0x00, 0xF8, 0x00, 0x03, 0xFF, - 0x00, 0x0F, 0xFF, 0x80, 0x0F, 0xFF, 0x80, 0x1F, 0x87, 0xC0, 0x1F, 0x07, - 0xC0, 0x1F, 0x07, 0xC0, 0x1F, 0x0F, 0xC0, 0x0F, 0x9F, 0x80, 0x0F, 0xFF, - 0x00, 0x07, 0xFE, 0x00, 0x07, 0xFC, 0x00, 0x0F, 0xFC, 0x00, 0x1F, 0xFE, - 0x3C, 0x3F, 0x7F, 0x3E, 0x7E, 0x3F, 0xBE, 0x7C, 0x1F, 0xFC, 0xFC, 0x0F, - 0xFC, 0xFC, 0x07, 0xF8, 0xFC, 0x03, 0xF8, 0x7E, 0x07, 0xFC, 0x7F, 0xFF, - 0xFE, 0x3F, 0xFF, 0xFE, 0x1F, 0xFF, 0x9C, 0x07, 0xFE, 0x0C, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0x0F, 0x8F, 0x8F, 0xC7, 0xC3, 0xE3, 0xF1, 0xF0, 0xF8, - 0xFC, 0x7E, 0x3E, 0x1F, 0x0F, 0x87, 0xC3, 0xE1, 0xF0, 0xF8, 0x7C, 0x3E, - 0x1F, 0x0F, 0x87, 0xC3, 0xE1, 0xF8, 0xFC, 0x3E, 0x1F, 0x0F, 0xC3, 0xE1, - 0xF8, 0x7C, 0x3E, 0x0F, 0x80, 0x7C, 0x1F, 0x03, 0xE0, 0xFC, 0x3F, 0x07, - 0xC1, 0xF8, 0x7E, 0x0F, 0x83, 0xE0, 0xFC, 0x3F, 0x0F, 0xC1, 0xF0, 0x7C, - 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x3F, 0x0F, 0xC3, 0xF0, 0xF8, 0x3E, 0x0F, - 0x87, 0xE1, 0xF8, 0x7C, 0x3F, 0x0F, 0x83, 0xE1, 0xF0, 0xFC, 0x00, 0x03, - 0x80, 0x07, 0x00, 0x8E, 0x23, 0xDC, 0xE7, 0xFF, 0xE7, 0xFF, 0x87, 0xFC, - 0x0F, 0xF8, 0x7F, 0xFC, 0xFF, 0xF9, 0xCE, 0x71, 0x1C, 0x40, 0x38, 0x00, - 0x70, 0x00, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3E, - 0x00, 0x1F, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, - 0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, - 0x10, 0xFB, 0xFF, 0xFF, 0xEF, 0xDF, 0x1E, 0x3C, 0xF1, 0xE3, 0x80, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x10, 0xFB, 0xFF, 0xFF, 0xEF, 0xDF, 0x00, 0x00, - 0x1F, 0x00, 0x1F, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x7C, 0x00, - 0x7C, 0x00, 0x78, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF0, 0x01, 0xF0, 0x01, - 0xF0, 0x03, 0xE0, 0x03, 0xE0, 0x03, 0xE0, 0x07, 0xC0, 0x07, 0xC0, 0x07, - 0xC0, 0x0F, 0x80, 0x0F, 0x80, 0x0F, 0x80, 0x1F, 0x00, 0x1F, 0x00, 0x1F, - 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3C, 0x00, 0x7C, 0x00, 0x7C, 0x00, 0x78, - 0x00, 0xF8, 0x00, 0xF8, 0x00, 0x00, 0xFC, 0x00, 0x1F, 0xF8, 0x03, 0xFF, - 0xE0, 0x3F, 0xFF, 0x81, 0xFF, 0xFE, 0x1F, 0xC3, 0xF9, 0xFC, 0x0F, 0xCF, - 0xC0, 0x3F, 0x7E, 0x01, 0xFB, 0xE0, 0x0F, 0xFF, 0x00, 0x3F, 0xF8, 0x01, - 0xFF, 0xC0, 0x0F, 0xFE, 0x00, 0x7F, 0xF0, 0x03, 0xEF, 0x80, 0x3F, 0x7C, - 0x01, 0xFB, 0xF0, 0x0F, 0xDF, 0x80, 0xFC, 0x7E, 0x07, 0xE3, 0xFC, 0xFF, - 0x0F, 0xFF, 0xF0, 0x3F, 0xFF, 0x00, 0xFF, 0xF0, 0x03, 0xFE, 0x00, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xE0, - 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xE0, 0xFC, - 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xE0, 0x03, 0xF8, - 0x00, 0xFF, 0xF0, 0x3F, 0xFF, 0x87, 0xFF, 0xFC, 0xFF, 0xFF, 0xC7, 0xC0, - 0xFE, 0x18, 0x07, 0xE0, 0x00, 0x7E, 0x00, 0x07, 0xE0, 0x00, 0x7E, 0x00, - 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x3F, 0x80, 0x07, 0xF0, 0x00, 0xFE, 0x00, - 0x1F, 0xC0, 0x03, 0xF8, 0x00, 0x7F, 0x00, 0x0F, 0xE0, 0x01, 0xFC, 0x00, - 0x3F, 0xFF, 0xF7, 0xFF, 0xFF, 0x7F, 0xFF, 0xF7, 0xFF, 0xFF, 0x7F, 0xFF, - 0xF0, 0x7F, 0xFF, 0xCF, 0xFF, 0xF9, 0xFF, 0xFF, 0x3F, 0xFF, 0xE7, 0xFF, - 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x1F, - 0x80, 0x07, 0xE0, 0x00, 0xFF, 0x80, 0x1F, 0xF8, 0x03, 0xFF, 0x80, 0x7F, - 0xF8, 0x00, 0x3F, 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x0F, 0x98, 0x03, - 0xF7, 0xE1, 0xFE, 0xFF, 0xFF, 0xBF, 0xFF, 0xF3, 0xFF, 0xF8, 0x1F, 0xFE, - 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xF0, - 0x00, 0x07, 0xE0, 0x00, 0x1F, 0x80, 0x00, 0x7E, 0x00, 0x01, 0xFC, 0x00, - 0x03, 0xF0, 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0x00, 0x00, 0xFE, 0x3F, 0x01, - 0xF8, 0x7E, 0x07, 0xE0, 0xFC, 0x1F, 0x81, 0xF8, 0x7F, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, - 0x7E, 0x00, 0x00, 0xFC, 0x00, 0x01, 0xF8, 0x00, 0x03, 0xF0, 0x00, 0x07, - 0xE0, 0x1F, 0xFF, 0xC1, 0xFF, 0xFC, 0x1F, 0xFF, 0xC1, 0xFF, 0xFC, 0x1F, - 0xFF, 0xC1, 0xF0, 0x00, 0x1F, 0x00, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x01, - 0xF0, 0x00, 0x1F, 0xFE, 0x03, 0xFF, 0xF8, 0x3F, 0xFF, 0xC3, 0xFF, 0xFE, - 0x00, 0x3F, 0xE0, 0x00, 0x7F, 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x00, 0x03, - 0xF3, 0x00, 0x7F, 0x3F, 0x1F, 0xE7, 0xFF, 0xFE, 0xFF, 0xFF, 0xC7, 0xFF, - 0xF8, 0x0F, 0xFE, 0x00, 0x00, 0x7F, 0x80, 0x0F, 0xFF, 0x01, 0xFF, 0xF8, - 0x1F, 0xFF, 0xC1, 0xFF, 0xFC, 0x1F, 0xE0, 0x20, 0xFC, 0x00, 0x0F, 0xC0, - 0x00, 0x7E, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0x3F, 0xC1, 0xFF, 0xFF, 0x8F, - 0xFF, 0xFE, 0x7F, 0xFF, 0xFB, 0xFC, 0x1F, 0xDF, 0xC0, 0x7E, 0x7E, 0x01, - 0xFB, 0xF0, 0x0F, 0xDF, 0x80, 0x7E, 0xFC, 0x03, 0xE3, 0xF0, 0x3F, 0x0F, - 0xFF, 0xF0, 0x7F, 0xFF, 0x80, 0xFF, 0xF8, 0x03, 0xFF, 0x00, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0x80, - 0x7E, 0xF8, 0x0F, 0xEF, 0x80, 0xFC, 0xF8, 0x0F, 0xC0, 0x01, 0xF8, 0x00, - 0x1F, 0x80, 0x03, 0xF0, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x00, 0x7E, 0x00, - 0x0F, 0xE0, 0x00, 0xFC, 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x1F, 0x80, - 0x03, 0xF0, 0x00, 0x3F, 0x00, 0x07, 0xF0, 0x00, 0x7E, 0x00, 0x0F, 0xE0, - 0x00, 0x01, 0xFC, 0x00, 0x7F, 0xFC, 0x07, 0xFF, 0xF0, 0x7F, 0xFF, 0xC3, - 0xF8, 0xFE, 0x3F, 0x01, 0xF9, 0xF8, 0x0F, 0xCF, 0xC0, 0x7E, 0x7E, 0x03, - 0xF1, 0xF8, 0x3F, 0x8F, 0xFF, 0xF8, 0x3F, 0xFF, 0x81, 0xFF, 0xFC, 0x1F, - 0xFF, 0xF1, 0xFE, 0x1F, 0xCF, 0xC0, 0x7E, 0xFC, 0x01, 0xFF, 0xE0, 0x0F, - 0xFF, 0x00, 0x7F, 0xF8, 0x03, 0xF7, 0xE0, 0x3F, 0x3F, 0xFF, 0xF8, 0xFF, - 0xFF, 0x83, 0xFF, 0xF8, 0x07, 0xFF, 0x00, 0x03, 0xF0, 0x01, 0xFF, 0xE0, - 0x3F, 0xFF, 0x07, 0xFF, 0xF8, 0x7F, 0x3F, 0xCF, 0xC0, 0x7E, 0xFC, 0x07, - 0xEF, 0x80, 0x3E, 0xF8, 0x03, 0xFF, 0xC0, 0x7F, 0xFC, 0x07, 0xFF, 0xFB, - 0xFF, 0x7F, 0xFF, 0xF3, 0xFF, 0xFF, 0x1F, 0xFB, 0xF0, 0x7E, 0x3F, 0x00, - 0x03, 0xE0, 0x00, 0x7E, 0x00, 0x07, 0xE0, 0x00, 0xFC, 0x38, 0x7F, 0xC3, - 0xFF, 0xF8, 0x7F, 0xFF, 0x07, 0xFF, 0xE0, 0x3F, 0xF8, 0x00, 0x10, 0xFB, - 0xFF, 0xFF, 0xEF, 0xDF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x1F, 0x7F, - 0xFF, 0xFD, 0xFB, 0xE0, 0x10, 0xFB, 0xFF, 0xFF, 0xEF, 0xDF, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x02, 0x1F, 0x7F, 0xFF, 0xFD, 0xFB, 0xE3, 0xC7, 0x9E, - 0x3C, 0x70, 0x00, 0x00, 0x80, 0x03, 0xC0, 0x07, 0xE0, 0x1F, 0xF0, 0x7F, - 0xF8, 0xFF, 0xE3, 0xFF, 0x81, 0xFF, 0x00, 0xFC, 0x00, 0x7F, 0x00, 0x3F, - 0xF0, 0x0F, 0xFF, 0x00, 0xFF, 0xF0, 0x0F, 0xFC, 0x01, 0xFE, 0x00, 0x1F, - 0x00, 0x01, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x80, 0x00, 0x78, 0x00, 0x3F, - 0x00, 0x1F, 0xF0, 0x0F, 0xFF, 0x00, 0xFF, 0xE0, 0x0F, 0xFE, 0x01, 0xFF, - 0x00, 0x1F, 0x80, 0x1F, 0xC0, 0x7F, 0xE1, 0xFF, 0xE7, 0xFF, 0x87, 0xFE, - 0x03, 0xFC, 0x01, 0xF0, 0x00, 0xC0, 0x00, 0x00, 0x03, 0xF8, 0x01, 0xFF, - 0xE0, 0xFF, 0xFE, 0x3F, 0xFF, 0xEF, 0xFF, 0xFC, 0xF8, 0x1F, 0xC6, 0x01, - 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x01, 0xF8, 0x00, 0x7E, 0x00, 0x1F, - 0xC0, 0x07, 0xF0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xC0, 0x00, 0xF8, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x1F, 0x80, 0x03, 0xF8, - 0x00, 0x7F, 0x00, 0x0F, 0xC0, 0x00, 0xF8, 0x00, 0x00, 0x07, 0xF8, 0x00, - 0x00, 0x0F, 0xFF, 0xE0, 0x00, 0x0F, 0xFF, 0xFE, 0x00, 0x0F, 0xFE, 0xFF, - 0xC0, 0x07, 0xF0, 0x01, 0xF8, 0x03, 0xF0, 0x00, 0x1F, 0x01, 0xF0, 0x00, - 0x03, 0xE0, 0x78, 0x00, 0x00, 0x7C, 0x3E, 0x0F, 0xF7, 0xCF, 0x0F, 0x07, - 0xFF, 0xF1, 0xE7, 0x83, 0xFF, 0xFC, 0x79, 0xE1, 0xFF, 0xFF, 0x0E, 0x78, - 0x7C, 0x0F, 0xC3, 0xDE, 0x3E, 0x01, 0xF0, 0xFF, 0x0F, 0x80, 0x7C, 0x3F, - 0xC3, 0xE0, 0x1F, 0x0F, 0xF0, 0xF8, 0x07, 0xC3, 0xFC, 0x3E, 0x01, 0xF0, - 0xFF, 0x0F, 0x80, 0x7C, 0x3D, 0xE3, 0xF0, 0x3F, 0x0E, 0x78, 0x7E, 0x1F, - 0xC7, 0x9E, 0x1F, 0xFF, 0xFF, 0xE3, 0xC3, 0xFF, 0xFF, 0xF0, 0xF0, 0x7F, - 0xE7, 0xF8, 0x1E, 0x0F, 0xE0, 0xFC, 0x07, 0xC0, 0x00, 0x00, 0x00, 0xF8, - 0x00, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x00, 0x03, 0xFC, 0x0F, 0x00, 0x00, - 0x7F, 0xFF, 0xE0, 0x00, 0x07, 0xFF, 0xF8, 0x00, 0x00, 0x3F, 0xF8, 0x00, - 0x00, 0x1F, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x3F, - 0xE0, 0x00, 0x07, 0xFC, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x3E, 0xF8, 0x00, - 0x0F, 0xDF, 0x00, 0x01, 0xF3, 0xF0, 0x00, 0x3E, 0x3E, 0x00, 0x0F, 0xC7, - 0xE0, 0x01, 0xF0, 0x7C, 0x00, 0x7E, 0x0F, 0xC0, 0x0F, 0x81, 0xF8, 0x03, - 0xF0, 0x1F, 0x00, 0x7F, 0xFF, 0xF0, 0x1F, 0xFF, 0xFE, 0x03, 0xFF, 0xFF, - 0xE0, 0x7F, 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0xC3, 0xE0, 0x01, 0xF8, 0xFC, - 0x00, 0x1F, 0x9F, 0x80, 0x03, 0xF7, 0xE0, 0x00, 0x3E, 0xFC, 0x00, 0x07, - 0xE0, 0xFF, 0xF0, 0x03, 0xFF, 0xFF, 0x0F, 0xFF, 0xFE, 0x3F, 0xFF, 0xFC, - 0xFF, 0xFF, 0xFB, 0xF0, 0x0F, 0xEF, 0xC0, 0x1F, 0xBF, 0x00, 0x7E, 0xFC, - 0x01, 0xFB, 0xF0, 0x07, 0xEF, 0xC0, 0xFF, 0x3F, 0xFF, 0xF8, 0xFF, 0xFF, - 0xE3, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xBF, 0x00, 0x3F, 0xFC, 0x00, 0xFF, - 0xF0, 0x01, 0xFF, 0xC0, 0x07, 0xFF, 0x00, 0x3F, 0xFC, 0x03, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xF8, 0xFF, 0xFF, 0x80, 0x00, 0x3F, - 0x80, 0x01, 0xFF, 0xF0, 0x03, 0xFF, 0xFC, 0x0F, 0xFF, 0xFE, 0x1F, 0xFF, - 0xFF, 0x1F, 0xE0, 0x7E, 0x3F, 0x80, 0x1C, 0x7F, 0x00, 0x00, 0x7E, 0x00, - 0x00, 0x7E, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xFC, 0x00, 0x00, 0xFC, 0x00, - 0x00, 0xFC, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7E, 0x00, - 0x00, 0x7F, 0x00, 0x00, 0x3F, 0x00, 0x18, 0x3F, 0xC0, 0x3C, 0x1F, 0xF9, - 0xFE, 0x0F, 0xFF, 0xFE, 0x07, 0xFF, 0xFC, 0x03, 0xFF, 0xF8, 0x00, 0xFF, - 0xE0, 0xFF, 0xF0, 0x00, 0x7F, 0xFF, 0xC0, 0x3F, 0xFF, 0xF8, 0x1F, 0xFF, - 0xFE, 0x0F, 0xFF, 0xFF, 0x87, 0xE0, 0x3F, 0xE3, 0xF0, 0x03, 0xF9, 0xF8, - 0x00, 0xFC, 0xFC, 0x00, 0x3F, 0x7E, 0x00, 0x1F, 0xBF, 0x00, 0x07, 0xDF, - 0x80, 0x03, 0xEF, 0xC0, 0x01, 0xFF, 0xE0, 0x00, 0xFF, 0xF0, 0x00, 0x7D, - 0xF8, 0x00, 0x7E, 0xFC, 0x00, 0x3F, 0x7E, 0x00, 0x3F, 0xBF, 0x00, 0x3F, - 0x9F, 0x80, 0x3F, 0xCF, 0xFF, 0xFF, 0xC7, 0xFF, 0xFF, 0xC3, 0xFF, 0xFF, - 0xC1, 0xFF, 0xFF, 0x80, 0xFF, 0xFE, 0x00, 0x00, 0xFF, 0xFF, 0xDF, 0xFF, - 0xFB, 0xFF, 0xFF, 0x7F, 0xFF, 0xEF, 0xFF, 0xFD, 0xF8, 0x00, 0x3F, 0x00, - 0x07, 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xFF, 0xFE, 0x7F, 0xFF, - 0xCF, 0xFF, 0xF9, 0xFF, 0xFF, 0x3F, 0xFF, 0xE7, 0xE0, 0x00, 0xFC, 0x00, - 0x1F, 0x80, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x0F, 0xC0, 0x03, - 0xF0, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xFF, - 0xFF, 0xBF, 0xFF, 0xEF, 0xFF, 0xFB, 0xFF, 0xFE, 0xFC, 0x00, 0x3F, 0x00, - 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03, - 0xF0, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x3F, 0xC0, 0x01, 0xFF, 0xF0, 0x03, - 0xFF, 0xFC, 0x0F, 0xFF, 0xFE, 0x1F, 0xFF, 0xFF, 0x1F, 0xE0, 0x7E, 0x3F, - 0x80, 0x1C, 0x7F, 0x00, 0x08, 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7C, - 0x00, 0x00, 0xFC, 0x00, 0x00, 0xFC, 0x00, 0x3F, 0xFC, 0x00, 0x3F, 0xFC, - 0x00, 0x3F, 0x7E, 0x00, 0x3F, 0x7E, 0x00, 0x3F, 0x7F, 0x00, 0x3F, 0x3F, - 0x00, 0x3F, 0x3F, 0xC0, 0x3F, 0x1F, 0xF9, 0xFF, 0x0F, 0xFF, 0xFF, 0x07, - 0xFF, 0xFE, 0x03, 0xFF, 0xFC, 0x00, 0xFF, 0xE0, 0xFC, 0x00, 0x7F, 0xF0, - 0x01, 0xFF, 0xC0, 0x07, 0xFF, 0x00, 0x1F, 0xFC, 0x00, 0x7F, 0xF0, 0x01, - 0xFF, 0xC0, 0x07, 0xFF, 0x00, 0x1F, 0xFC, 0x00, 0x7F, 0xF0, 0x01, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0x00, 0x1F, 0xFC, 0x00, 0x7F, 0xF0, 0x01, 0xFF, 0xC0, 0x07, - 0xFF, 0x00, 0x1F, 0xFC, 0x00, 0x7F, 0xF0, 0x01, 0xFF, 0xC0, 0x07, 0xFF, - 0x00, 0x1F, 0xFC, 0x00, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, - 0x1F, 0xFF, 0x8F, 0xFF, 0xC7, 0xFF, 0xE3, 0xFF, 0xF1, 0xFF, 0xF8, 0x00, - 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, - 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, - 0x80, 0x07, 0xC4, 0x07, 0xE7, 0x03, 0xF3, 0xE3, 0xFB, 0xFF, 0xF9, 0xFF, - 0xFC, 0x7F, 0xFC, 0x0F, 0xF8, 0x00, 0xFC, 0x00, 0xFF, 0xF8, 0x03, 0xFB, - 0xF0, 0x0F, 0xE7, 0xE0, 0x1F, 0x8F, 0xC0, 0x7E, 0x1F, 0x81, 0xF8, 0x3F, - 0x07, 0xE0, 0x7E, 0x1F, 0x80, 0xFC, 0x7E, 0x01, 0xF9, 0xF8, 0x03, 0xF7, - 0xE0, 0x07, 0xFF, 0xC0, 0x0F, 0xFF, 0x80, 0x1F, 0xFF, 0x80, 0x3F, 0xFF, - 0x80, 0x7F, 0xFF, 0x80, 0xFF, 0x3F, 0x81, 0xFC, 0x3F, 0x03, 0xF0, 0x7F, - 0x07, 0xE0, 0x7F, 0x0F, 0xC0, 0x7F, 0x1F, 0x80, 0x7F, 0x3F, 0x00, 0x7E, - 0x7E, 0x00, 0xFE, 0xFC, 0x00, 0xFE, 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, - 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, - 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x3F, - 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, - 0x03, 0xF0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xC0, 0xF8, 0x00, 0x01, 0xEF, 0x80, 0x00, 0x3E, 0xFC, 0x00, - 0x03, 0xEF, 0xC0, 0x00, 0x7E, 0xFE, 0x00, 0x0F, 0xEF, 0xF0, 0x00, 0xFE, - 0xFF, 0x00, 0x1F, 0xEF, 0xF8, 0x01, 0xFE, 0xFF, 0x80, 0x3F, 0xEF, 0xFC, - 0x07, 0xFE, 0xFF, 0xE0, 0x7F, 0xEF, 0xBE, 0x0F, 0xBE, 0xFB, 0xF0, 0xFB, - 0xEF, 0x9F, 0x1F, 0x3E, 0xF8, 0xFB, 0xF3, 0xEF, 0x8F, 0xFE, 0x3E, 0xF8, - 0x7F, 0xC3, 0xEF, 0x87, 0xFC, 0x3E, 0xF8, 0x3F, 0x83, 0xEF, 0x81, 0xF8, - 0x3F, 0xF8, 0x1F, 0x03, 0xFF, 0x80, 0xF0, 0x3F, 0xF8, 0x00, 0x03, 0xFF, - 0x80, 0x00, 0x3F, 0xF8, 0x00, 0x03, 0xF0, 0xF8, 0x00, 0x7F, 0xE0, 0x01, - 0xFF, 0xC0, 0x07, 0xFF, 0x80, 0x1F, 0xFF, 0x00, 0x7F, 0xFE, 0x01, 0xFF, - 0xFC, 0x07, 0xFF, 0xF0, 0x1F, 0xFF, 0xE0, 0x7F, 0xFF, 0xC1, 0xFF, 0xFF, - 0x87, 0xFF, 0x7F, 0x1F, 0xFD, 0xFC, 0x7F, 0xF3, 0xF9, 0xFF, 0xC7, 0xF7, - 0xFF, 0x0F, 0xFF, 0xFC, 0x1F, 0xFF, 0xF0, 0x3F, 0xFF, 0xC0, 0xFF, 0xFF, - 0x01, 0xFF, 0xFC, 0x03, 0xFF, 0xF0, 0x07, 0xFF, 0xC0, 0x0F, 0xFF, 0x00, - 0x3F, 0xFC, 0x00, 0x7C, 0x00, 0x3F, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x0F, - 0xFF, 0xF0, 0x07, 0xFF, 0xFF, 0x01, 0xFF, 0xFF, 0xF0, 0x3F, 0xC0, 0xFF, - 0x0F, 0xE0, 0x07, 0xF3, 0xF8, 0x00, 0x7E, 0x7E, 0x00, 0x0F, 0xCF, 0xC0, - 0x00, 0xFD, 0xF0, 0x00, 0x1F, 0xFE, 0x00, 0x03, 0xFF, 0xC0, 0x00, 0x7F, - 0xF8, 0x00, 0x0F, 0xFF, 0x00, 0x01, 0xFB, 0xF0, 0x00, 0x3F, 0x7E, 0x00, - 0x07, 0xEF, 0xE0, 0x01, 0xF8, 0xFC, 0x00, 0x7F, 0x1F, 0xE0, 0x1F, 0xC1, - 0xFF, 0x9F, 0xF8, 0x1F, 0xFF, 0xFE, 0x01, 0xFF, 0xFF, 0x80, 0x1F, 0xFF, - 0xC0, 0x00, 0xFF, 0xE0, 0x00, 0xFF, 0xE0, 0x07, 0xFF, 0xF8, 0x3F, 0xFF, - 0xF1, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0x7E, 0x03, 0xFB, 0xF0, 0x0F, 0xFF, - 0x80, 0x3F, 0xFC, 0x01, 0xFF, 0xE0, 0x0F, 0xFF, 0x00, 0x7F, 0xF8, 0x03, - 0xFF, 0xC0, 0x3F, 0xFE, 0x0F, 0xFB, 0xFF, 0xFF, 0xDF, 0xFF, 0xFC, 0xFF, - 0xFF, 0x87, 0xFF, 0xF0, 0x3F, 0x00, 0x01, 0xF8, 0x00, 0x0F, 0xC0, 0x00, - 0x7E, 0x00, 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00, 0x00, 0x00, - 0x3F, 0x80, 0x00, 0x1F, 0xFF, 0x00, 0x03, 0xFF, 0xFC, 0x00, 0xFF, 0xFF, - 0xE0, 0x1F, 0xFF, 0xFF, 0x01, 0xFE, 0x07, 0xF8, 0x3F, 0x80, 0x1F, 0xC7, - 0xF0, 0x00, 0xFC, 0x7E, 0x00, 0x0F, 0xC7, 0xE0, 0x00, 0x7E, 0x7C, 0x00, - 0x07, 0xEF, 0xC0, 0x00, 0x7E, 0xFC, 0x00, 0x07, 0xEF, 0xC0, 0x00, 0x7E, - 0xFC, 0x00, 0x07, 0xE7, 0xE0, 0x00, 0x7E, 0x7E, 0x00, 0x07, 0xE7, 0xF0, - 0x00, 0xFC, 0x3F, 0x00, 0x1F, 0xC3, 0xFC, 0x03, 0xF8, 0x1F, 0xF9, 0xFF, - 0x80, 0xFF, 0xFF, 0xF0, 0x07, 0xFF, 0xFE, 0x00, 0x3F, 0xFF, 0x80, 0x00, - 0xFF, 0xE0, 0x00, 0x00, 0xFE, 0x06, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x3F, - 0xFF, 0x00, 0x01, 0xFF, 0xF0, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x07, 0x00, - 0xFF, 0xE0, 0x03, 0xFF, 0xFC, 0x0F, 0xFF, 0xFC, 0x3F, 0xFF, 0xF8, 0xFF, - 0xFF, 0xF3, 0xF0, 0x1F, 0xCF, 0xC0, 0x3F, 0xBF, 0x00, 0x7E, 0xFC, 0x01, - 0xFB, 0xF0, 0x07, 0xEF, 0xC0, 0x1F, 0xBF, 0x00, 0x7E, 0xFC, 0x03, 0xFB, - 0xF0, 0x7F, 0xCF, 0xFF, 0xFF, 0x3F, 0xFF, 0xF8, 0xFF, 0xFF, 0x83, 0xFF, - 0xFC, 0x0F, 0xC1, 0xF8, 0x3F, 0x03, 0xF0, 0xFC, 0x0F, 0xC3, 0xF0, 0x1F, - 0x8F, 0xC0, 0x3F, 0x3F, 0x00, 0xFE, 0xFC, 0x01, 0xF8, 0x01, 0xFE, 0x00, - 0xFF, 0xFC, 0x1F, 0xFF, 0xE3, 0xFF, 0xFE, 0x7F, 0xFF, 0xC7, 0xE0, 0x1C, - 0x7C, 0x00, 0x4F, 0xC0, 0x00, 0xFC, 0x00, 0x07, 0xF0, 0x00, 0x7F, 0xE0, - 0x03, 0xFF, 0xE0, 0x1F, 0xFF, 0x80, 0xFF, 0xFE, 0x01, 0xFF, 0xE0, 0x01, - 0xFF, 0x00, 0x03, 0xF0, 0x00, 0x1F, 0x00, 0x01, 0xF7, 0x00, 0x3F, 0x7E, - 0x07, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xE7, 0xFF, 0xF8, 0x0F, 0xFF, 0x00, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0x80, 0x7E, 0x00, 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00, - 0x07, 0xE0, 0x00, 0x3F, 0x00, 0x01, 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0x7E, - 0x00, 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00, 0x07, 0xE0, 0x00, - 0x3F, 0x00, 0x01, 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0x7E, 0x00, 0x03, 0xF0, - 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00, 0xF8, 0x00, 0xFF, 0xE0, 0x03, 0xFF, - 0x80, 0x0F, 0xFE, 0x00, 0x3F, 0xF8, 0x00, 0xFF, 0xE0, 0x03, 0xFF, 0x80, - 0x0F, 0xFE, 0x00, 0x3F, 0xF8, 0x00, 0xFF, 0xE0, 0x03, 0xFF, 0x80, 0x0F, - 0xFE, 0x00, 0x3F, 0xF8, 0x00, 0xFF, 0xE0, 0x03, 0xFF, 0x80, 0x0F, 0xFE, - 0x00, 0x3F, 0xFC, 0x00, 0xFF, 0xF0, 0x03, 0xFF, 0xC0, 0x1F, 0x9F, 0x80, - 0xFE, 0x7F, 0xDF, 0xF8, 0xFF, 0xFF, 0xC1, 0xFF, 0xFE, 0x03, 0xFF, 0xF0, - 0x03, 0xFF, 0x00, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x03, 0xF7, 0xE0, 0x00, - 0xFD, 0xF8, 0x00, 0x3E, 0x7F, 0x00, 0x1F, 0x8F, 0xC0, 0x07, 0xC3, 0xF0, - 0x03, 0xF0, 0x7E, 0x00, 0xF8, 0x1F, 0x80, 0x7E, 0x03, 0xF0, 0x1F, 0x80, - 0xFC, 0x0F, 0xC0, 0x3F, 0x83, 0xF0, 0x07, 0xE0, 0xF8, 0x01, 0xF8, 0x7E, - 0x00, 0x3F, 0x1F, 0x00, 0x0F, 0xCF, 0xC0, 0x01, 0xFB, 0xF0, 0x00, 0x7F, - 0xF8, 0x00, 0x1F, 0xFE, 0x00, 0x03, 0xFF, 0x00, 0x00, 0xFF, 0xC0, 0x00, - 0x1F, 0xE0, 0x00, 0x07, 0xF8, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x3F, 0x00, - 0x00, 0xFC, 0x00, 0x7C, 0x00, 0x3F, 0xF8, 0x00, 0xFC, 0x00, 0xFF, 0xF0, - 0x03, 0xF8, 0x01, 0xF3, 0xF0, 0x07, 0xF0, 0x03, 0xE7, 0xE0, 0x0F, 0xE0, - 0x0F, 0xCF, 0xC0, 0x3F, 0xE0, 0x1F, 0x0F, 0xC0, 0x7F, 0xC0, 0x3E, 0x1F, - 0x80, 0xFF, 0x80, 0xFC, 0x3F, 0x03, 0xFF, 0x81, 0xF0, 0x3F, 0x07, 0xDF, - 0x03, 0xE0, 0x7E, 0x0F, 0xBE, 0x0F, 0xC0, 0xFC, 0x3E, 0x7E, 0x1F, 0x00, - 0xFC, 0x7C, 0x7C, 0x3E, 0x01, 0xF8, 0xF8, 0xF8, 0xFC, 0x03, 0xF3, 0xE1, - 0xF9, 0xF0, 0x03, 0xE7, 0xC1, 0xF3, 0xE0, 0x07, 0xEF, 0x83, 0xEF, 0xC0, - 0x0F, 0xFE, 0x07, 0xFF, 0x00, 0x0F, 0xFC, 0x07, 0xFE, 0x00, 0x1F, 0xF8, - 0x0F, 0xFC, 0x00, 0x3F, 0xE0, 0x1F, 0xF0, 0x00, 0x3F, 0xC0, 0x1F, 0xE0, - 0x00, 0x7F, 0x80, 0x3F, 0xC0, 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x00, 0xFC, - 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x3F, 0x3F, 0x80, 0x3F, 0x8F, 0xC0, 0x1F, - 0x83, 0xF0, 0x1F, 0x81, 0xFC, 0x1F, 0x80, 0x7F, 0x0F, 0xC0, 0x1F, 0x8F, - 0xC0, 0x07, 0xEF, 0xC0, 0x03, 0xFF, 0xE0, 0x00, 0xFF, 0xE0, 0x00, 0x3F, - 0xE0, 0x00, 0x1F, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x07, 0xFC, 0x00, 0x03, - 0xFE, 0x00, 0x03, 0xFF, 0x80, 0x03, 0xFF, 0xE0, 0x01, 0xFB, 0xF0, 0x01, - 0xF8, 0xFC, 0x01, 0xF8, 0x3F, 0x01, 0xFC, 0x1F, 0xC0, 0xFC, 0x07, 0xE0, - 0xFC, 0x01, 0xF8, 0xFE, 0x00, 0xFE, 0xFE, 0x00, 0x3F, 0x80, 0xFC, 0x00, - 0x1F, 0xFC, 0x00, 0x3F, 0x7E, 0x00, 0x7E, 0x7E, 0x00, 0x7C, 0x3F, 0x00, - 0xFC, 0x1F, 0x80, 0xF8, 0x1F, 0x81, 0xF8, 0x0F, 0xC3, 0xF0, 0x0F, 0xC3, - 0xE0, 0x07, 0xE7, 0xE0, 0x03, 0xF7, 0xC0, 0x03, 0xFF, 0xC0, 0x01, 0xFF, - 0x80, 0x01, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7E, - 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7E, - 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7E, - 0x00, 0x7F, 0xFF, 0xF9, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0x9F, 0xFF, 0xFE, - 0x7F, 0xFF, 0xF8, 0x00, 0x1F, 0xC0, 0x00, 0x7E, 0x00, 0x03, 0xF0, 0x00, - 0x1F, 0xC0, 0x00, 0xFE, 0x00, 0x07, 0xF0, 0x00, 0x3F, 0x80, 0x00, 0xFC, - 0x00, 0x07, 0xF0, 0x00, 0x3F, 0x80, 0x01, 0xFC, 0x00, 0x0F, 0xE0, 0x00, - 0x7F, 0x00, 0x01, 0xF8, 0x00, 0x0F, 0xE0, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0x87, 0xC3, 0xE1, 0xF0, 0xF8, 0x7C, 0x3E, 0x1F, 0x0F, - 0x87, 0xC3, 0xE1, 0xF0, 0xF8, 0x7C, 0x3E, 0x1F, 0x0F, 0x87, 0xC3, 0xE1, - 0xF0, 0xF8, 0x7C, 0x3E, 0x1F, 0x0F, 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, - 0x7C, 0x00, 0x3E, 0x00, 0x0F, 0x00, 0x07, 0xC0, 0x03, 0xE0, 0x00, 0xF0, - 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x00, - 0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, - 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x01, - 0xE0, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x1E, 0x00, 0x0F, 0x80, 0x07, 0xC0, - 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0xFF, - 0xFF, 0xFF, 0xFF, 0xF0, 0xF8, 0x7C, 0x3E, 0x1F, 0x0F, 0x87, 0xC3, 0xE1, - 0xF0, 0xF8, 0x7C, 0x3E, 0x1F, 0x0F, 0x87, 0xC3, 0xE1, 0xF0, 0xF8, 0x7C, - 0x3E, 0x1F, 0x0F, 0x87, 0xC3, 0xE1, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x80, 0x03, 0xE0, 0x01, 0xF0, 0x01, 0xFC, 0x00, 0xFE, 0x00, 0x7F, 0x00, - 0x7B, 0xC0, 0x3D, 0xE0, 0x3C, 0x78, 0x1E, 0x3C, 0x1F, 0x1F, 0x0F, 0x07, - 0x87, 0x83, 0xC7, 0x80, 0xF3, 0xC0, 0x7B, 0xC0, 0x1E, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFC, 0x7E, 0x07, 0xE0, 0x3E, 0x03, 0xE0, 0x3C, 0x07, - 0xF8, 0x0F, 0xFF, 0x87, 0xFF, 0xF0, 0xFF, 0xFE, 0x3E, 0x3F, 0xC4, 0x03, - 0xF0, 0x00, 0xFC, 0x00, 0x1F, 0x0F, 0xFF, 0xCF, 0xFF, 0xF7, 0xFF, 0xFD, - 0xF8, 0x1F, 0xFC, 0x07, 0xFF, 0x03, 0xFF, 0xC0, 0xFD, 0xFC, 0xFF, 0x7F, - 0xFF, 0xCF, 0xFD, 0xF1, 0xFE, 0x7C, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, - 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F, - 0x9F, 0xC0, 0xFB, 0xFF, 0x0F, 0xFF, 0xF8, 0xFF, 0xFF, 0xCF, 0xF9, 0xFE, - 0xFE, 0x07, 0xEF, 0xC0, 0x3F, 0xF8, 0x03, 0xFF, 0x80, 0x3F, 0xF8, 0x03, - 0xFF, 0x80, 0x3F, 0xF8, 0x03, 0xFF, 0xC0, 0x3F, 0xFC, 0x07, 0xEF, 0xF1, - 0xFE, 0xFF, 0xFF, 0xCF, 0xFF, 0xF8, 0xFF, 0xFF, 0x0F, 0x9F, 0xE0, 0x01, - 0xFC, 0x00, 0xFF, 0xE0, 0x7F, 0xFF, 0x1F, 0xFF, 0xE7, 0xFC, 0xFE, 0xFC, - 0x07, 0x9F, 0x00, 0x47, 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0, - 0x00, 0x7E, 0x00, 0x07, 0xC0, 0x00, 0xFC, 0x07, 0x1F, 0xE3, 0xF9, 0xFF, - 0xFF, 0x1F, 0xFF, 0xC1, 0xFF, 0xF0, 0x0F, 0xF8, 0x00, 0x00, 0x01, 0xF8, - 0x00, 0x0F, 0xC0, 0x00, 0x7E, 0x00, 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x00, - 0xFC, 0x00, 0x07, 0xE0, 0x7F, 0x3F, 0x0F, 0xFF, 0xF8, 0xFF, 0xFF, 0xCF, - 0xFF, 0xFE, 0xFF, 0x9F, 0xF7, 0xE0, 0x3F, 0xBF, 0x01, 0xFF, 0xF0, 0x07, - 0xFF, 0x80, 0x3F, 0xFC, 0x01, 0xFF, 0xE0, 0x0F, 0xFF, 0x00, 0x7E, 0xF8, - 0x03, 0xF7, 0xE0, 0x3F, 0xBF, 0xC7, 0xFC, 0xFF, 0xFF, 0xE3, 0xFF, 0xFF, - 0x0F, 0xFF, 0xF8, 0x1F, 0xCF, 0xC0, 0x03, 0xFC, 0x00, 0xFF, 0xF0, 0x1F, - 0xFF, 0x83, 0xFF, 0xFC, 0x7F, 0x0F, 0xE7, 0xE0, 0x3E, 0x7C, 0x03, 0xFF, - 0xC0, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, - 0x7C, 0x00, 0x07, 0xE0, 0x10, 0x7F, 0x87, 0x83, 0xFF, 0xFC, 0x1F, 0xFF, - 0xC0, 0xFF, 0xF8, 0x03, 0xFE, 0x00, 0x01, 0xFC, 0x0F, 0xF8, 0x3F, 0xF0, - 0x7F, 0xE1, 0xF8, 0x03, 0xF0, 0x07, 0xE0, 0x0F, 0xC0, 0xFF, 0xF9, 0xFF, - 0xF3, 0xFF, 0xE7, 0xFF, 0xC1, 0xF8, 0x03, 0xF0, 0x07, 0xE0, 0x0F, 0xC0, - 0x1F, 0x80, 0x3F, 0x00, 0x7E, 0x00, 0xFC, 0x01, 0xF8, 0x03, 0xF0, 0x07, - 0xE0, 0x0F, 0xC0, 0x1F, 0x80, 0x3F, 0x00, 0x03, 0xF8, 0xF8, 0x7F, 0xF7, - 0xC7, 0xFF, 0xFE, 0x7F, 0xFF, 0xF7, 0xF8, 0xFF, 0xBF, 0x01, 0xFF, 0xF0, - 0x07, 0xFF, 0x80, 0x3F, 0xFC, 0x00, 0xFF, 0xE0, 0x07, 0xFF, 0x00, 0x7F, - 0xF8, 0x03, 0xF7, 0xE0, 0x3F, 0xBF, 0xE7, 0xFC, 0xFF, 0xFF, 0xE3, 0xFF, - 0xFF, 0x0F, 0xFF, 0xF8, 0x1F, 0xCF, 0xC0, 0x00, 0x7E, 0x00, 0x03, 0xF1, - 0x80, 0x3F, 0x1F, 0x8F, 0xF8, 0xFF, 0xFF, 0x8F, 0xFF, 0xF8, 0x1F, 0xFF, - 0x80, 0x3F, 0xF0, 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, 0x7C, - 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xC7, 0xE0, 0xFB, - 0xFF, 0x1F, 0xFF, 0xF3, 0xFF, 0xFF, 0x7F, 0xFF, 0xEF, 0xE0, 0xFD, 0xF8, - 0x0F, 0xFE, 0x01, 0xFF, 0xC0, 0x3F, 0xF8, 0x07, 0xFF, 0x00, 0xFF, 0xE0, - 0x1F, 0xFC, 0x03, 0xFF, 0x80, 0x7F, 0xF0, 0x0F, 0xFE, 0x01, 0xFF, 0xC0, - 0x3F, 0xF8, 0x07, 0xFF, 0x00, 0xFC, 0x10, 0xFB, 0xFF, 0xFF, 0xEF, 0x84, - 0x00, 0x00, 0xF9, 0xF3, 0xE7, 0xCF, 0x9F, 0x3E, 0x7C, 0xF9, 0xF3, 0xE7, - 0xCF, 0x9F, 0x3E, 0x7C, 0xF9, 0xF3, 0xE0, 0x00, 0x80, 0x3E, 0x07, 0xF0, - 0x7F, 0x07, 0xF0, 0x3E, 0x00, 0x80, 0x00, 0x00, 0x00, 0x3E, 0x03, 0xE0, - 0x3E, 0x03, 0xE0, 0x3E, 0x03, 0xE0, 0x3E, 0x03, 0xE0, 0x3E, 0x03, 0xE0, - 0x3E, 0x03, 0xE0, 0x3E, 0x03, 0xE0, 0x3E, 0x03, 0xE0, 0x3E, 0x03, 0xE0, - 0x3E, 0x03, 0xE0, 0x7E, 0x47, 0xE7, 0xFC, 0xFF, 0xCF, 0xF8, 0x7E, 0x00, - 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, - 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x7E, 0xF8, 0x0F, 0xCF, 0x83, - 0xF8, 0xF8, 0x7F, 0x0F, 0x8F, 0xE0, 0xF9, 0xFC, 0x0F, 0xBF, 0x80, 0xFF, - 0xF0, 0x0F, 0xFF, 0x00, 0xFF, 0xF8, 0x0F, 0xFF, 0x80, 0xFF, 0xFC, 0x0F, - 0xEF, 0xE0, 0xFC, 0x7F, 0x0F, 0x83, 0xF8, 0xF8, 0x1F, 0x8F, 0x80, 0xFC, - 0xF8, 0x0F, 0xEF, 0x80, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xF9, 0xFC, - 0x0F, 0xE1, 0xF7, 0xFE, 0x7F, 0xF3, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, - 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0x81, 0xFE, 0x0F, 0xFF, 0x03, 0xF8, - 0x1F, 0xFC, 0x07, 0xE0, 0x1F, 0xF8, 0x07, 0xC0, 0x3F, 0xF0, 0x0F, 0x80, - 0x7F, 0xE0, 0x1F, 0x00, 0xFF, 0xC0, 0x3E, 0x01, 0xFF, 0x80, 0x7C, 0x03, - 0xFF, 0x00, 0xF8, 0x07, 0xFE, 0x01, 0xF0, 0x0F, 0xFC, 0x03, 0xE0, 0x1F, - 0xF8, 0x07, 0xC0, 0x3F, 0xF0, 0x0F, 0x80, 0x7F, 0xE0, 0x1F, 0x00, 0xF8, - 0xF8, 0xFC, 0x1F, 0x7F, 0xE3, 0xFF, 0xFE, 0x7F, 0xFF, 0xEF, 0xFF, 0xFD, - 0xFC, 0x1F, 0xBF, 0x01, 0xFF, 0xC0, 0x3F, 0xF8, 0x07, 0xFF, 0x00, 0xFF, - 0xE0, 0x1F, 0xFC, 0x03, 0xFF, 0x80, 0x7F, 0xF0, 0x0F, 0xFE, 0x01, 0xFF, - 0xC0, 0x3F, 0xF8, 0x07, 0xFF, 0x00, 0xFF, 0xE0, 0x1F, 0x80, 0x01, 0xFC, - 0x00, 0x3F, 0xF8, 0x07, 0xFF, 0xF0, 0x7F, 0xFF, 0xC7, 0xF8, 0xFE, 0x3F, - 0x01, 0xF9, 0xF0, 0x0F, 0xDF, 0x80, 0x3F, 0xFC, 0x01, 0xFF, 0xE0, 0x0F, - 0xFF, 0x00, 0x7F, 0xF8, 0x03, 0xF7, 0xC0, 0x1F, 0x3F, 0x01, 0xF9, 0xFE, - 0x3F, 0xC7, 0xFF, 0xFC, 0x1F, 0xFF, 0xC0, 0x7F, 0xFC, 0x00, 0xFF, 0x80, - 0xF9, 0xFC, 0x0F, 0xBF, 0xF0, 0xFF, 0xFF, 0x8F, 0xFF, 0xFC, 0xFF, 0x9F, - 0xEF, 0xE0, 0x7E, 0xFC, 0x03, 0xFF, 0x80, 0x3F, 0xF8, 0x03, 0xFF, 0x80, - 0x3F, 0xF8, 0x03, 0xFF, 0x80, 0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x7E, 0xFF, - 0x1F, 0xEF, 0xFF, 0xFC, 0xFF, 0xFF, 0x8F, 0xFF, 0xF0, 0xF9, 0xFE, 0x0F, - 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, - 0xF8, 0x00, 0x0F, 0x80, 0x00, 0x03, 0xF9, 0xF8, 0x7F, 0xFF, 0xC7, 0xFF, - 0xFE, 0x7F, 0xFF, 0xF7, 0xF9, 0xFF, 0xBF, 0x01, 0xFF, 0xF0, 0x0F, 0xFF, - 0x80, 0x3F, 0xFC, 0x01, 0xFF, 0xE0, 0x0F, 0xFF, 0x00, 0x7F, 0xF8, 0x03, - 0xFF, 0xC0, 0x1F, 0xBF, 0x01, 0xFD, 0xFE, 0x3F, 0xE7, 0xFF, 0xFF, 0x1F, - 0xFF, 0xF8, 0x7F, 0xFF, 0xC0, 0xFE, 0x7E, 0x00, 0x03, 0xF0, 0x00, 0x1F, - 0x80, 0x00, 0xFC, 0x00, 0x07, 0xE0, 0x00, 0x3F, 0x00, 0x01, 0xF8, 0x00, - 0x0F, 0xC0, 0xF8, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x3F, 0x07, - 0xC0, 0xF8, 0x1F, 0x03, 0xE0, 0x7C, 0x0F, 0x81, 0xF0, 0x3E, 0x07, 0xC0, - 0xF8, 0x1F, 0x03, 0xE0, 0x00, 0x07, 0xFC, 0x0F, 0xFF, 0x9F, 0xFF, 0xCF, - 0xFF, 0xCF, 0xC0, 0xE7, 0xC0, 0x03, 0xF0, 0x01, 0xFE, 0x00, 0x7F, 0xF8, - 0x3F, 0xFF, 0x07, 0xFF, 0xC0, 0x3F, 0xE0, 0x01, 0xFA, 0x00, 0x7D, 0xC0, - 0x7F, 0xFF, 0xFE, 0xFF, 0xFF, 0x7F, 0xFF, 0x0F, 0xFE, 0x00, 0x1F, 0x80, - 0x3F, 0x00, 0x7E, 0x00, 0xFC, 0x0F, 0xFF, 0x9F, 0xFF, 0x3F, 0xFE, 0x7F, - 0xFC, 0x1F, 0x80, 0x3F, 0x00, 0x7E, 0x00, 0xFC, 0x01, 0xF8, 0x03, 0xF0, - 0x07, 0xE0, 0x0F, 0xC0, 0x1F, 0x80, 0x3F, 0x00, 0x7F, 0x00, 0x7F, 0xE0, - 0xFF, 0xC0, 0xFF, 0x80, 0xFF, 0x00, 0xFC, 0x03, 0xFF, 0x80, 0x7F, 0xF0, - 0x0F, 0xFE, 0x01, 0xFF, 0xC0, 0x3F, 0xF8, 0x07, 0xFF, 0x00, 0xFF, 0xE0, - 0x1F, 0xFC, 0x03, 0xFF, 0x80, 0x7F, 0xF0, 0x0F, 0xFE, 0x01, 0xF7, 0xC0, - 0x7E, 0xFC, 0x0F, 0xDF, 0xEF, 0xFB, 0xFF, 0xFF, 0x3F, 0xFF, 0xE3, 0xFF, - 0xFC, 0x1F, 0xCF, 0x80, 0xFC, 0x00, 0xFF, 0xE0, 0x0F, 0xDF, 0x00, 0x7C, - 0xFC, 0x03, 0xE3, 0xE0, 0x3E, 0x1F, 0x81, 0xF0, 0xFC, 0x1F, 0x83, 0xE0, - 0xF8, 0x1F, 0x8F, 0xC0, 0x7C, 0x7C, 0x03, 0xF3, 0xE0, 0x1F, 0xBE, 0x00, - 0x7D, 0xF0, 0x03, 0xFF, 0x80, 0x0F, 0xF8, 0x00, 0x7F, 0xC0, 0x01, 0xFC, - 0x00, 0x0F, 0xE0, 0x00, 0x7E, 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0xBE, 0x01, - 0xF0, 0x0F, 0x9F, 0x01, 0xFC, 0x07, 0xCF, 0x80, 0xFE, 0x03, 0xE3, 0xE0, - 0x7F, 0x03, 0xE1, 0xF0, 0x7F, 0xC1, 0xF0, 0xF8, 0x3F, 0xE0, 0xF0, 0x3E, - 0x1F, 0xF0, 0xF8, 0x1F, 0x1F, 0x7C, 0x7C, 0x0F, 0x8F, 0xBE, 0x3C, 0x03, - 0xEF, 0x8F, 0xBE, 0x01, 0xF7, 0xC7, 0xDF, 0x00, 0xFB, 0xE3, 0xFF, 0x00, - 0x3F, 0xE0, 0xFF, 0x80, 0x1F, 0xF0, 0x7F, 0xC0, 0x07, 0xF0, 0x3F, 0xC0, - 0x03, 0xF8, 0x0F, 0xE0, 0x01, 0xFC, 0x07, 0xE0, 0x00, 0x7C, 0x03, 0xF0, - 0x00, 0x7E, 0x03, 0xF3, 0xF0, 0x1F, 0x0F, 0xC1, 0xF8, 0x3F, 0x1F, 0x80, - 0xFD, 0xF8, 0x07, 0xEF, 0x80, 0x1F, 0xFC, 0x00, 0x7F, 0xC0, 0x01, 0xFC, - 0x00, 0x0F, 0xE0, 0x00, 0x7F, 0x00, 0x07, 0xFC, 0x00, 0x7F, 0xF0, 0x07, - 0xEF, 0xC0, 0x3E, 0x7E, 0x03, 0xF1, 0xF8, 0x3F, 0x07, 0xE3, 0xF0, 0x3F, - 0x9F, 0x00, 0xFC, 0xFC, 0x00, 0xFF, 0xE0, 0x0F, 0xDF, 0x00, 0x7C, 0xFC, - 0x03, 0xE3, 0xE0, 0x3E, 0x1F, 0x81, 0xF0, 0xFC, 0x1F, 0x83, 0xE0, 0xF8, - 0x1F, 0x8F, 0xC0, 0x7C, 0x7C, 0x03, 0xF3, 0xE0, 0x0F, 0xBE, 0x00, 0x7D, - 0xF0, 0x03, 0xFF, 0x80, 0x0F, 0xF8, 0x00, 0x7F, 0xC0, 0x01, 0xFC, 0x00, - 0x0F, 0xE0, 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x1F, 0x80, 0x39, 0xF8, - 0x01, 0xFF, 0xC0, 0x1F, 0xFC, 0x00, 0xFF, 0xC0, 0x01, 0xF8, 0x00, 0x00, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x03, 0xF0, 0x03, - 0xF0, 0x03, 0xF0, 0x03, 0xF0, 0x03, 0xF0, 0x03, 0xF8, 0x01, 0xF8, 0x01, - 0xF8, 0x01, 0xF8, 0x01, 0xF8, 0x01, 0xF8, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x03, 0xE1, 0xFC, 0x7F, 0x8F, 0xF1, 0xF8, - 0x3E, 0x07, 0xC0, 0xF8, 0x1F, 0x03, 0xE0, 0x7C, 0x0F, 0x81, 0xF0, 0x7E, - 0x3F, 0xC7, 0xF0, 0xFC, 0x1F, 0xC3, 0xFC, 0x1F, 0x81, 0xF0, 0x3E, 0x07, - 0xC0, 0xF8, 0x1F, 0x03, 0xE0, 0x7C, 0x0F, 0x81, 0xFC, 0x3F, 0xC3, 0xF8, - 0x3F, 0x01, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, - 0xF8, 0x1F, 0x83, 0xF8, 0x7F, 0x87, 0xF0, 0x7E, 0x07, 0xC0, 0xF8, 0x1F, - 0x03, 0xE0, 0x7C, 0x0F, 0x81, 0xF0, 0x3E, 0x07, 0xF8, 0x7F, 0x07, 0xE3, - 0xFC, 0x7F, 0x8F, 0x81, 0xF0, 0x3E, 0x07, 0xC0, 0xF8, 0x1F, 0x03, 0xE0, - 0x7C, 0x1F, 0x8F, 0xF1, 0xFE, 0x3F, 0x87, 0xE0, 0xF0, 0x00, 0x0C, 0x00, - 0x1F, 0xC1, 0xDF, 0xF1, 0xFF, 0xFF, 0xFF, 0x3F, 0xF7, 0x07, 0xFB, 0x81, - 0xF8 }; - -const GFXglyph Montserrat_Bold18pt7bGlyphs[] PROGMEM = { - { 0, 1, 1, 10, 0, 0 }, // 0x20 ' ' - { 1, 6, 25, 10, 2, -24 }, // 0x21 '!' - { 20, 11, 10, 15, 2, -24 }, // 0x22 '"' - { 34, 24, 25, 25, 1, -24 }, // 0x23 '#' - { 109, 20, 33, 22, 1, -28 }, // 0x24 '$' - { 192, 29, 25, 31, 1, -24 }, // 0x25 '%' - { 283, 24, 25, 25, 1, -24 }, // 0x26 '&' - { 358, 4, 10, 8, 2, -24 }, // 0x27 ''' - { 363, 9, 33, 13, 3, -25 }, // 0x28 '(' - { 401, 10, 33, 13, 0, -25 }, // 0x29 ')' - { 443, 15, 14, 15, 0, -25 }, // 0x2A '*' - { 470, 17, 16, 21, 2, -19 }, // 0x2B '+' - { 504, 7, 12, 9, 1, -6 }, // 0x2C ',' - { 515, 10, 4, 14, 2, -11 }, // 0x2D '-' - { 520, 7, 7, 9, 1, -6 }, // 0x2E '.' - { 527, 16, 33, 14, -1, -28 }, // 0x2F '/' - { 593, 21, 25, 24, 1, -24 }, // 0x30 '0' - { 659, 11, 25, 14, 0, -24 }, // 0x31 '1' - { 694, 20, 25, 21, 0, -24 }, // 0x32 '2' - { 757, 19, 25, 21, 0, -24 }, // 0x33 '3' - { 817, 23, 25, 24, 1, -24 }, // 0x34 '4' - { 889, 20, 25, 21, 0, -24 }, // 0x35 '5' - { 952, 21, 25, 22, 1, -24 }, // 0x36 '6' - { 1018, 20, 25, 22, 1, -24 }, // 0x37 '7' - { 1081, 21, 25, 23, 1, -24 }, // 0x38 '8' - { 1147, 20, 25, 22, 1, -24 }, // 0x39 '9' - { 1210, 7, 20, 9, 1, -19 }, // 0x3A ':' - { 1228, 7, 25, 9, 1, -19 }, // 0x3B ';' - { 1250, 17, 17, 21, 2, -20 }, // 0x3C '<' - { 1287, 17, 13, 21, 2, -18 }, // 0x3D '=' - { 1315, 17, 17, 21, 2, -20 }, // 0x3E '>' - { 1352, 19, 25, 21, 0, -24 }, // 0x3F '?' - { 1412, 34, 32, 36, 1, -24 }, // 0x40 '@' - { 1548, 27, 25, 27, 0, -24 }, // 0x41 'A' - { 1633, 22, 25, 27, 3, -24 }, // 0x42 'B' - { 1702, 24, 25, 25, 1, -24 }, // 0x43 'C' - { 1777, 25, 25, 29, 3, -24 }, // 0x44 'D' - { 1856, 19, 25, 23, 3, -24 }, // 0x45 'E' - { 1916, 18, 25, 22, 3, -24 }, // 0x46 'F' - { 1973, 24, 25, 27, 1, -24 }, // 0x47 'G' - { 2048, 22, 25, 28, 3, -24 }, // 0x48 'H' - { 2117, 6, 25, 11, 3, -24 }, // 0x49 'I' - { 2136, 17, 25, 19, -1, -24 }, // 0x4A 'J' - { 2190, 23, 25, 26, 3, -24 }, // 0x4B 'K' - { 2262, 18, 25, 21, 3, -24 }, // 0x4C 'L' - { 2319, 28, 25, 33, 3, -24 }, // 0x4D 'M' - { 2407, 22, 25, 28, 3, -24 }, // 0x4E 'N' - { 2476, 27, 25, 30, 1, -24 }, // 0x4F 'O' - { 2561, 21, 25, 26, 3, -24 }, // 0x50 'P' - { 2627, 28, 31, 30, 1, -24 }, // 0x51 'Q' - { 2736, 22, 25, 26, 3, -24 }, // 0x52 'R' - { 2805, 20, 25, 22, 1, -24 }, // 0x53 'S' - { 2868, 21, 25, 22, 0, -24 }, // 0x54 'T' - { 2934, 22, 25, 28, 3, -24 }, // 0x55 'U' - { 3003, 26, 25, 26, 0, -24 }, // 0x56 'V' - { 3085, 39, 25, 41, 1, -24 }, // 0x57 'W' - { 3207, 25, 25, 25, 0, -24 }, // 0x58 'X' - { 3286, 24, 25, 24, 0, -24 }, // 0x59 'Y' - { 3361, 22, 25, 23, 1, -24 }, // 0x5A 'Z' - { 3430, 9, 33, 13, 3, -25 }, // 0x5B '[' - { 3468, 17, 33, 14, -2, -28 }, // 0x5C '\' - { 3539, 9, 33, 13, 1, -25 }, // 0x5D ']' - { 3577, 17, 15, 21, 2, -19 }, // 0x5E '^' - { 3609, 18, 3, 18, 0, 1 }, // 0x5F '_' - { 3616, 11, 5, 21, 3, -25 }, // 0x60 '`' - { 3623, 18, 19, 22, 1, -18 }, // 0x61 'a' - { 3666, 20, 26, 24, 3, -25 }, // 0x62 'b' - { 3731, 19, 19, 21, 1, -18 }, // 0x63 'c' - { 3777, 21, 26, 24, 1, -25 }, // 0x64 'd' - { 3846, 20, 19, 22, 1, -18 }, // 0x65 'e' - { 3894, 15, 26, 14, 0, -25 }, // 0x66 'f' - { 3943, 21, 26, 25, 1, -18 }, // 0x67 'g' - { 4012, 19, 26, 24, 3, -25 }, // 0x68 'h' - { 4074, 7, 28, 11, 2, -27 }, // 0x69 'i' - { 4099, 12, 35, 11, -3, -27 }, // 0x6A 'j' - { 4152, 20, 26, 23, 3, -25 }, // 0x6B 'k' - { 4217, 5, 26, 11, 3, -25 }, // 0x6C 'l' - { 4234, 31, 19, 37, 3, -18 }, // 0x6D 'm' - { 4308, 19, 19, 24, 3, -18 }, // 0x6E 'n' - { 4354, 21, 19, 23, 1, -18 }, // 0x6F 'o' - { 4404, 20, 26, 24, 3, -18 }, // 0x70 'p' - { 4469, 21, 26, 24, 1, -18 }, // 0x71 'q' - { 4538, 11, 19, 15, 3, -18 }, // 0x72 'r' - { 4565, 17, 19, 19, 1, -18 }, // 0x73 's' - { 4606, 15, 23, 15, 0, -22 }, // 0x74 't' - { 4650, 19, 19, 24, 2, -18 }, // 0x75 'u' - { 4696, 21, 19, 21, 0, -18 }, // 0x76 'v' - { 4746, 33, 19, 33, 0, -18 }, // 0x77 'w' - { 4825, 21, 19, 21, 0, -18 }, // 0x78 'x' - { 4875, 21, 26, 21, 0, -18 }, // 0x79 'y' - { 4944, 17, 19, 19, 1, -18 }, // 0x7A 'z' - { 4985, 11, 33, 14, 2, -25 }, // 0x7B '{' - { 5031, 5, 33, 11, 3, -25 }, // 0x7C '|' - { 5052, 11, 33, 14, 1, -25 }, // 0x7D '}' - { 5098, 17, 7, 21, 2, -15 } }; // 0x7E '~' - -const GFXfont Montserrat_Bold18pt7b PROGMEM = { - (uint8_t *)Montserrat_Bold18pt7bBitmaps, - (GFXglyph *)Montserrat_Bold18pt7bGlyphs, - 0x20, 0x7E, 43 }; - -// Approx. 5785 bytes - -#endif // MONTSERRATBOLD18PT7B_H diff --git a/examples/companion_radio/ui-new/fonts/MontserratBold22pt7b.h b/examples/companion_radio/ui-new/fonts/MontserratBold22pt7b.h deleted file mode 100644 index 4eb1d40d..00000000 --- a/examples/companion_radio/ui-new/fonts/MontserratBold22pt7b.h +++ /dev/null @@ -1,745 +0,0 @@ -#ifndef MONTSERRATBOLD22PT7B_H -#define MONTSERRATBOLD22PT7B_H -const uint8_t Montserrat_Bold22pt7bBitmaps[] PROGMEM = { - 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, - 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x3E, 0x00, 0x00, 0x00, - 0x7E, 0x7F, 0xFF, 0xFF, 0xFF, 0x7F, 0x3E, 0xFC, 0x7F, 0xF8, 0xFF, 0xF1, - 0xFF, 0xE3, 0xFF, 0xC7, 0xFF, 0x8F, 0xFF, 0x1F, 0xFE, 0x3F, 0xFC, 0x7F, - 0xF0, 0xFB, 0xE1, 0xF3, 0xC1, 0xE0, 0x00, 0xF8, 0x1F, 0x00, 0x07, 0xC0, - 0xF8, 0x00, 0x3E, 0x07, 0xC0, 0x01, 0xF0, 0x3E, 0x00, 0x0F, 0x81, 0xF0, - 0x00, 0x7C, 0x0F, 0x80, 0x03, 0xC0, 0x7C, 0x0F, 0xFF, 0xFF, 0xFF, 0x7F, - 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFE, 0x03, 0xE0, - 0x7C, 0x00, 0x1F, 0x03, 0xE0, 0x00, 0xF8, 0x1F, 0x00, 0x07, 0x80, 0xF8, - 0x00, 0x7C, 0x07, 0x80, 0x03, 0xE0, 0x7C, 0x00, 0x1F, 0x03, 0xE0, 0x3F, - 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, - 0xFF, 0xFB, 0xFF, 0xFF, 0xFF, 0xC0, 0xF8, 0x0F, 0x00, 0x07, 0xC0, 0xF8, - 0x00, 0x3E, 0x07, 0xC0, 0x01, 0xF0, 0x3E, 0x00, 0x0F, 0x81, 0xF0, 0x00, - 0x7C, 0x0F, 0x80, 0x03, 0xE0, 0x7C, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x0F, - 0x00, 0x00, 0x07, 0x80, 0x00, 0x03, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x0F, - 0xFF, 0xC0, 0x1F, 0xFF, 0xF8, 0x3F, 0xFF, 0xFE, 0x1F, 0xFF, 0xFE, 0x1F, - 0xFF, 0xFF, 0x1F, 0xF7, 0x9F, 0x8F, 0xE3, 0xC1, 0x87, 0xF1, 0xE0, 0x03, - 0xF8, 0xF0, 0x01, 0xFC, 0x78, 0x00, 0xFF, 0x3C, 0x00, 0x7F, 0xFE, 0x00, - 0x1F, 0xFF, 0x00, 0x0F, 0xFF, 0xF8, 0x03, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, - 0xE0, 0x0F, 0xFF, 0xF8, 0x00, 0xFF, 0xFC, 0x00, 0x3F, 0xFF, 0x00, 0x1E, - 0x7F, 0x80, 0x0F, 0x1F, 0xC0, 0x07, 0x8F, 0xE6, 0x03, 0xC7, 0xF3, 0xC1, - 0xE3, 0xFB, 0xFC, 0xF7, 0xFD, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFC, 0x7F, - 0xFF, 0xFC, 0x0F, 0xFF, 0xFC, 0x01, 0xFF, 0xF8, 0x00, 0x03, 0xC0, 0x00, - 0x01, 0xE0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x3C, 0x00, - 0x0F, 0xE0, 0x00, 0x7C, 0x01, 0xFF, 0x80, 0x0F, 0xC0, 0x3F, 0xFC, 0x00, - 0xF8, 0x07, 0xC7, 0xC0, 0x1F, 0x00, 0x78, 0x3E, 0x03, 0xF0, 0x0F, 0x83, - 0xE0, 0x3E, 0x00, 0xF8, 0x1E, 0x07, 0xC0, 0x0F, 0x81, 0xE0, 0xFC, 0x00, - 0xF8, 0x1E, 0x0F, 0x80, 0x0F, 0x81, 0xE1, 0xF0, 0x00, 0xF8, 0x3E, 0x3E, - 0x00, 0x07, 0x83, 0xC3, 0xE0, 0x00, 0x7E, 0xFC, 0x7C, 0x00, 0x03, 0xFF, - 0x8F, 0x80, 0x00, 0x1F, 0xF0, 0xF8, 0x7E, 0x00, 0xFE, 0x1F, 0x1F, 0xF8, - 0x00, 0x03, 0xE3, 0xFF, 0xC0, 0x00, 0x3E, 0x3E, 0x7E, 0x00, 0x07, 0xC7, - 0xC3, 0xE0, 0x00, 0xF8, 0x78, 0x1E, 0x00, 0x1F, 0x87, 0x81, 0xE0, 0x01, - 0xF0, 0x78, 0x1F, 0x00, 0x3E, 0x07, 0x81, 0xF0, 0x07, 0xE0, 0x78, 0x1E, - 0x00, 0x7C, 0x07, 0x81, 0xE0, 0x0F, 0x80, 0x7C, 0x3E, 0x01, 0xF8, 0x03, - 0xE7, 0xE0, 0x1F, 0x00, 0x3F, 0xFC, 0x03, 0xE0, 0x01, 0xFF, 0x80, 0x7C, - 0x00, 0x0F, 0xF0, 0x01, 0xFF, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x07, 0xFF, - 0xF0, 0x00, 0xFF, 0xFF, 0x00, 0x1F, 0xE3, 0xF8, 0x01, 0xFC, 0x1F, 0x80, - 0x1F, 0x81, 0xF8, 0x01, 0xF8, 0x1F, 0x80, 0x1F, 0xC1, 0xF8, 0x00, 0xFC, - 0x7F, 0x00, 0x0F, 0xEF, 0xF0, 0x00, 0x7F, 0xFE, 0x00, 0x07, 0xFF, 0xC0, - 0x00, 0x3F, 0xF0, 0x00, 0x0F, 0xFF, 0x00, 0x01, 0xFF, 0xF8, 0x3C, 0x3F, - 0xFF, 0xC3, 0xE7, 0xF9, 0xFE, 0x7E, 0xFE, 0x0F, 0xF7, 0xEF, 0xE0, 0x7F, - 0xFE, 0xFC, 0x03, 0xFF, 0xCF, 0xC0, 0x1F, 0xFC, 0xFC, 0x00, 0xFF, 0x8F, - 0xE0, 0x07, 0xF8, 0xFF, 0x01, 0xFF, 0xCF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, - 0xFF, 0xF3, 0xFF, 0xFF, 0xFE, 0x1F, 0xFF, 0xE1, 0xC0, 0x7F, 0xF8, 0x0C, - 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, - 0x9E, 0x07, 0xF0, 0x7E, 0x0F, 0xE0, 0xFC, 0x1F, 0xC1, 0xF8, 0x3F, 0x83, - 0xF8, 0x3F, 0x07, 0xF0, 0x7F, 0x07, 0xF0, 0x7E, 0x07, 0xE0, 0xFE, 0x0F, - 0xE0, 0xFE, 0x0F, 0xE0, 0xFE, 0x0F, 0xE0, 0xFE, 0x0F, 0xE0, 0xFE, 0x0F, - 0xE0, 0xFE, 0x0F, 0xE0, 0x7E, 0x07, 0xE0, 0x7E, 0x07, 0xF0, 0x7F, 0x03, - 0xF0, 0x3F, 0x83, 0xF8, 0x1F, 0x81, 0xFC, 0x1F, 0xC0, 0xFC, 0x0F, 0xE0, - 0x7E, 0x7E, 0x07, 0xF0, 0x3F, 0x03, 0xF8, 0x1F, 0x81, 0xFC, 0x1F, 0xC0, - 0xFC, 0x0F, 0xE0, 0xFE, 0x07, 0xE0, 0x7E, 0x07, 0xF0, 0x7F, 0x07, 0xF0, - 0x7F, 0x07, 0xF0, 0x3F, 0x03, 0xF0, 0x3F, 0x03, 0xF0, 0x3F, 0x03, 0xF0, - 0x3F, 0x07, 0xF0, 0x7F, 0x07, 0xF0, 0x7F, 0x07, 0xF0, 0x7E, 0x0F, 0xE0, - 0xFE, 0x0F, 0xE0, 0xFC, 0x1F, 0xC1, 0xF8, 0x3F, 0x83, 0xF8, 0x7F, 0x07, - 0xE0, 0x03, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x0C, 0x78, 0xEF, 0xBC, 0xF7, - 0xFF, 0xFF, 0xFF, 0xFC, 0x7F, 0xF8, 0x0F, 0xF8, 0x0F, 0xFE, 0x1F, 0xFF, - 0xDF, 0xFF, 0xFF, 0xBD, 0xF3, 0x9E, 0x38, 0x0F, 0x00, 0x07, 0x80, 0x03, - 0xC0, 0x00, 0x01, 0xF8, 0x00, 0x1F, 0x80, 0x01, 0xF8, 0x00, 0x1F, 0x80, - 0x01, 0xF8, 0x00, 0x1F, 0x80, 0x01, 0xF8, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x1F, - 0x80, 0x01, 0xF8, 0x00, 0x1F, 0x80, 0x01, 0xF8, 0x00, 0x1F, 0x80, 0x01, - 0xF8, 0x00, 0x1F, 0x80, 0x1E, 0x3F, 0x9F, 0xEF, 0xF7, 0xFB, 0xFD, 0xFC, - 0x7E, 0x1F, 0x1F, 0x0F, 0x87, 0x83, 0xC3, 0xE1, 0xE0, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1E, 0x3F, 0x9F, 0xFF, 0xFF, 0xFB, - 0xFD, 0xFC, 0x7C, 0x00, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x07, 0xE0, 0x00, - 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x01, 0xF8, 0x00, - 0x1F, 0x80, 0x03, 0xF0, 0x00, 0x3F, 0x00, 0x03, 0xF0, 0x00, 0x7E, 0x00, - 0x07, 0xE0, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x0F, 0xC0, - 0x01, 0xF8, 0x00, 0x1F, 0x80, 0x03, 0xF8, 0x00, 0x3F, 0x00, 0x03, 0xF0, - 0x00, 0x7E, 0x00, 0x07, 0xE0, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x00, 0xFC, - 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x1F, 0x80, 0x01, 0xF8, 0x00, 0x3F, - 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x00, 0x7E, 0x00, 0x07, - 0xE0, 0x00, 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x08, 0x00, 0x00, 0xFF, - 0xE0, 0x00, 0xFF, 0xFC, 0x01, 0xFF, 0xFF, 0x01, 0xFF, 0xFF, 0xC0, 0xFF, - 0xFF, 0xF0, 0xFF, 0x8F, 0xF8, 0xFF, 0x01, 0xFE, 0x7F, 0x00, 0x7F, 0x3F, - 0x80, 0x3F, 0xFF, 0x80, 0x0F, 0xFF, 0xC0, 0x07, 0xFF, 0xE0, 0x03, 0xFF, - 0xF0, 0x01, 0xFF, 0xF8, 0x00, 0xFF, 0xFC, 0x00, 0x7F, 0xFE, 0x00, 0x3F, - 0xFF, 0x00, 0x1F, 0xFF, 0x80, 0x0F, 0xFF, 0xC0, 0x07, 0xFF, 0xE0, 0x03, - 0xFF, 0xF0, 0x01, 0xFD, 0xFC, 0x01, 0xFE, 0xFE, 0x00, 0xFE, 0x7F, 0x80, - 0xFF, 0x1F, 0xFB, 0xFF, 0x07, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0x80, 0xFF, - 0xFF, 0x80, 0x1F, 0xFF, 0x00, 0x07, 0xFF, 0x00, 0x00, 0x38, 0x00, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x81, 0xFC, 0x0F, 0xE0, 0x7F, - 0x03, 0xF8, 0x1F, 0xC0, 0xFE, 0x07, 0xF0, 0x3F, 0x81, 0xFC, 0x0F, 0xE0, - 0x7F, 0x03, 0xF8, 0x1F, 0xC0, 0xFE, 0x07, 0xF0, 0x3F, 0x81, 0xFC, 0x0F, - 0xE0, 0x7F, 0x03, 0xF8, 0x1F, 0xC0, 0xFE, 0x07, 0xF0, 0x3F, 0x81, 0xFC, - 0x00, 0x18, 0x00, 0x03, 0xFF, 0xC0, 0x0F, 0xFF, 0xF0, 0x3F, 0xFF, 0xF8, - 0x7F, 0xFF, 0xFC, 0xFF, 0xFF, 0xFC, 0x7F, 0x87, 0xFE, 0x3E, 0x01, 0xFE, - 0x0C, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, - 0x00, 0x01, 0xFE, 0x00, 0x01, 0xFC, 0x00, 0x03, 0xFC, 0x00, 0x07, 0xF8, - 0x00, 0x0F, 0xF0, 0x00, 0x1F, 0xE0, 0x00, 0x3F, 0xC0, 0x00, 0x7F, 0x80, - 0x00, 0xFF, 0x00, 0x01, 0xFE, 0x00, 0x03, 0xFC, 0x00, 0x07, 0xF8, 0x00, - 0x0F, 0xF0, 0x00, 0x3F, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, - 0x7F, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0x7F, 0xFF, 0xFE, - 0x7F, 0xFF, 0xFE, 0x7F, 0xFF, 0xFE, 0x7F, 0xFF, 0xFE, 0x7F, 0xFF, 0xFC, - 0x00, 0x03, 0xFC, 0x00, 0x07, 0xF8, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xE0, - 0x00, 0x1F, 0xC0, 0x00, 0x3F, 0x80, 0x00, 0x7F, 0x00, 0x00, 0xFF, 0xC0, - 0x00, 0xFF, 0xF0, 0x00, 0xFF, 0xF8, 0x00, 0xFF, 0xFC, 0x00, 0xFF, 0xFE, - 0x00, 0x03, 0xFE, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, - 0x00, 0x00, 0x7F, 0x30, 0x00, 0xFF, 0x38, 0x00, 0xFE, 0x7F, 0x87, 0xFE, - 0x7F, 0xFF, 0xFE, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xF8, 0x3F, 0xFF, 0xF0, - 0x0F, 0xFF, 0xC0, 0x00, 0x18, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x7F, - 0x80, 0x00, 0x07, 0xF0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x1F, 0xC0, 0x00, - 0x03, 0xFC, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x00, 0xFF, - 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x3F, 0x80, 0x00, - 0x07, 0xF8, 0x7E, 0x00, 0xFF, 0x07, 0xE0, 0x0F, 0xE0, 0x7E, 0x01, 0xFC, - 0x07, 0xE0, 0x3F, 0xC0, 0x7E, 0x07, 0xF8, 0x07, 0xE0, 0x7F, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x07, - 0xE0, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x7E, 0x00, - 0x00, 0x07, 0xE0, 0x0F, 0xFF, 0xFE, 0x0F, 0xFF, 0xFE, 0x0F, 0xFF, 0xFE, - 0x0F, 0xFF, 0xFE, 0x0F, 0xFF, 0xFE, 0x0F, 0xC0, 0x00, 0x0F, 0xC0, 0x00, - 0x0F, 0xC0, 0x00, 0x1F, 0xC0, 0x00, 0x1F, 0xC0, 0x00, 0x1F, 0xC0, 0x00, - 0x1F, 0xFF, 0x00, 0x1F, 0xFF, 0xE0, 0x1F, 0xFF, 0xF8, 0x1F, 0xFF, 0xFC, - 0x1F, 0xFF, 0xFE, 0x1F, 0xFF, 0xFF, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x7F, - 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x10, 0x00, 0x7F, - 0x3C, 0x00, 0xFF, 0x3F, 0xC7, 0xFF, 0x7F, 0xFF, 0xFE, 0x7F, 0xFF, 0xFC, - 0x7F, 0xFF, 0xF8, 0x3F, 0xFF, 0xF0, 0x07, 0xFF, 0xC0, 0x00, 0x00, 0x00, - 0x00, 0x03, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x7F, 0xFF, 0x80, 0xFF, 0xFF, - 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xE0, 0xFF, 0xC0, 0x60, 0x7F, 0x80, - 0x00, 0x7F, 0x80, 0x00, 0x3F, 0x80, 0x00, 0x3F, 0xC0, 0x00, 0x1F, 0xC0, - 0x00, 0x0F, 0xE1, 0xF8, 0x07, 0xF7, 0xFF, 0x83, 0xFF, 0xFF, 0xE1, 0xFF, - 0xFF, 0xF8, 0xFF, 0xFF, 0xFE, 0x7F, 0xF1, 0xFF, 0xBF, 0xE0, 0x3F, 0xDF, - 0xE0, 0x0F, 0xEF, 0xF0, 0x03, 0xF7, 0xF8, 0x01, 0xFF, 0xF8, 0x00, 0xFC, - 0xFE, 0x00, 0xFE, 0x7F, 0x00, 0x7F, 0x1F, 0xE0, 0x7F, 0x8F, 0xFF, 0xFF, - 0x83, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xC0, 0x3F, 0xFF, 0x80, 0x07, 0xFF, - 0x80, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, - 0xFE, 0xFC, 0x01, 0xFE, 0xFC, 0x01, 0xFC, 0xFC, 0x01, 0xFC, 0x00, 0x03, - 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x07, 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x0F, - 0xF0, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0xE0, 0x00, 0x1F, 0xE0, 0x00, 0x1F, - 0xC0, 0x00, 0x3F, 0xC0, 0x00, 0x3F, 0x80, 0x00, 0x7F, 0x80, 0x00, 0x7F, - 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFE, 0x00, 0x01, 0xFE, 0x00, 0x01, 0xFE, - 0x00, 0x01, 0xFC, 0x00, 0x03, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x0E, - 0x00, 0x00, 0x7F, 0xF8, 0x00, 0x7F, 0xFF, 0x80, 0x3F, 0xFF, 0xF0, 0x1F, - 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0xC3, 0xFC, 0x07, 0xF0, 0xFE, 0x01, 0xFE, - 0x3F, 0x80, 0x3F, 0x8F, 0xE0, 0x0F, 0xE3, 0xF8, 0x03, 0xF8, 0xFE, 0x01, - 0xFC, 0x3F, 0xE0, 0xFF, 0x07, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xC0, 0x3F, - 0xFF, 0xF0, 0x1F, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0xC7, 0xFC, 0x07, 0xF9, - 0xFC, 0x00, 0xFE, 0x7F, 0x00, 0x3F, 0xDF, 0xC0, 0x07, 0xFF, 0xF0, 0x01, - 0xFD, 0xFC, 0x00, 0x7F, 0x7F, 0x00, 0x3F, 0xDF, 0xE0, 0x1F, 0xE3, 0xFF, - 0xFF, 0xF8, 0xFF, 0xFF, 0xFC, 0x1F, 0xFF, 0xFE, 0x01, 0xFF, 0xFF, 0x00, - 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x01, 0xFF, 0xC0, - 0x03, 0xFF, 0xF8, 0x03, 0xFF, 0xFE, 0x03, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, - 0xE1, 0xFC, 0x07, 0xF9, 0xFC, 0x01, 0xFC, 0xFE, 0x00, 0x7F, 0x7F, 0x00, - 0x3F, 0xBF, 0x80, 0x1F, 0xDF, 0xC0, 0x0F, 0xEF, 0xE0, 0x0F, 0xFF, 0xF8, - 0x0F, 0xFD, 0xFF, 0x9F, 0xFE, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0x8F, - 0xFF, 0xDF, 0xC1, 0xFF, 0xCF, 0xE0, 0x3F, 0x0F, 0xE0, 0x00, 0x07, 0xF0, - 0x00, 0x03, 0xF8, 0x00, 0x03, 0xFC, 0x00, 0x03, 0xFC, 0x10, 0x03, 0xFE, - 0x0E, 0x07, 0xFE, 0x0F, 0xFF, 0xFE, 0x07, 0xFF, 0xFE, 0x07, 0xFF, 0xFE, - 0x03, 0xFF, 0xFE, 0x00, 0x7F, 0xF8, 0x00, 0x01, 0x80, 0x00, 0x1E, 0x3F, - 0x9F, 0xFF, 0xFF, 0xFB, 0xFD, 0xFC, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x3C, 0x7F, 0x3F, 0xFF, 0xFF, 0xF7, 0xFB, 0xF8, 0xF8, - 0x1E, 0x3F, 0x9F, 0xFF, 0xFF, 0xFB, 0xFD, 0xFC, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x7F, 0x3F, 0xDF, 0xEF, 0xF7, 0xFB, - 0xF8, 0xFC, 0x3E, 0x3E, 0x1F, 0x0F, 0x07, 0x87, 0xC3, 0xC0, 0x00, 0x00, - 0x00, 0x00, 0x07, 0x00, 0x01, 0xF0, 0x00, 0xFF, 0x00, 0x7F, 0xF0, 0x1F, - 0xFF, 0x0F, 0xFF, 0xC7, 0xFF, 0xE0, 0xFF, 0xF8, 0x0F, 0xFC, 0x00, 0xFE, - 0x00, 0x0F, 0xE0, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0x80, 0x3F, 0xFF, 0x00, - 0xFF, 0xFC, 0x01, 0xFF, 0xF0, 0x03, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0x1F, - 0x00, 0x00, 0x70, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x0E, - 0x00, 0x00, 0xF8, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0xE0, 0x0F, 0xFF, 0x80, - 0x3F, 0xFF, 0x00, 0xFF, 0xFC, 0x01, 0xFF, 0xF0, 0x03, 0xFF, 0x00, 0x07, - 0xF0, 0x00, 0xFF, 0x00, 0x3F, 0xF0, 0x1F, 0xFF, 0x0F, 0xFF, 0xC7, 0xFF, - 0xF0, 0xFF, 0xF8, 0x0F, 0xFC, 0x00, 0xFF, 0x00, 0x0F, 0x80, 0x00, 0xC0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x07, 0xFF, 0x80, 0x3F, 0xFF, - 0xC1, 0xFF, 0xFF, 0xC7, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xDF, 0xE0, 0xFF, - 0x9F, 0x00, 0xFF, 0x0C, 0x00, 0xFE, 0x00, 0x01, 0xFC, 0x00, 0x03, 0xF8, - 0x00, 0x0F, 0xE0, 0x00, 0x3F, 0xC0, 0x00, 0xFF, 0x00, 0x03, 0xFC, 0x00, - 0x0F, 0xF0, 0x00, 0x1F, 0xC0, 0x00, 0x7F, 0x00, 0x00, 0xFC, 0x00, 0x03, - 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x3E, 0x00, 0x00, 0xFE, 0x00, 0x01, 0xFE, 0x00, 0x07, 0xFC, - 0x00, 0x07, 0xF8, 0x00, 0x0F, 0xE0, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x00, - 0x1C, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xF8, 0x00, 0x00, 0x07, 0xFF, 0xFF, - 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xE0, 0x00, 0x1F, 0xFF, 0xFF, 0xFC, 0x00, - 0x1F, 0xF0, 0x00, 0xFF, 0x00, 0x1F, 0xC0, 0x00, 0x1F, 0xC0, 0x1F, 0xC0, - 0x00, 0x03, 0xF0, 0x1F, 0x80, 0x00, 0x00, 0xFC, 0x0F, 0x80, 0x00, 0x00, - 0x3E, 0x0F, 0xC0, 0x7F, 0x9F, 0x8F, 0x8F, 0xC0, 0xFF, 0xEF, 0xC7, 0xC7, - 0xC0, 0xFF, 0xFF, 0xE1, 0xF3, 0xE0, 0xFF, 0xFF, 0xF0, 0xFB, 0xE0, 0xFF, - 0xFF, 0xF8, 0x3D, 0xF0, 0x7F, 0x03, 0xFC, 0x1E, 0xF8, 0x7F, 0x00, 0xFE, - 0x0F, 0xFC, 0x3F, 0x00, 0x3F, 0x07, 0xFE, 0x1F, 0x80, 0x1F, 0x83, 0xFF, - 0x0F, 0xC0, 0x0F, 0xC1, 0xFF, 0x87, 0xE0, 0x07, 0xE0, 0xFF, 0xC3, 0xF0, - 0x03, 0xF0, 0x7F, 0xE1, 0xF8, 0x01, 0xF8, 0x3F, 0xF0, 0xFC, 0x00, 0xFC, - 0x1E, 0xF8, 0x7F, 0x00, 0xFE, 0x0F, 0x7C, 0x1F, 0xC0, 0xFF, 0x8F, 0x9F, - 0x0F, 0xFF, 0xFF, 0xEF, 0x8F, 0x83, 0xFF, 0xFF, 0xFF, 0xC7, 0xE0, 0xFF, - 0xF9, 0xFF, 0xC1, 0xF0, 0x3F, 0xF8, 0xFF, 0xC0, 0xFC, 0x07, 0xF8, 0x1F, - 0xC0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x00, 0x03, - 0xF8, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x06, 0x00, 0x00, 0x3F, 0xF8, - 0x7F, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xC0, 0x00, 0x01, 0xFF, 0xFF, 0xE0, - 0x00, 0x00, 0x3F, 0xFF, 0xC0, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, - 0x07, 0xF0, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, - 0x03, 0xFF, 0x80, 0x00, 0x01, 0xFF, 0xC0, 0x00, 0x00, 0xFF, 0xE0, 0x00, - 0x00, 0xFF, 0xF8, 0x00, 0x00, 0x7E, 0xFC, 0x00, 0x00, 0x7F, 0x7F, 0x00, - 0x00, 0x3F, 0x1F, 0x80, 0x00, 0x3F, 0x8F, 0xE0, 0x00, 0x1F, 0x87, 0xF0, - 0x00, 0x1F, 0xC1, 0xFC, 0x00, 0x0F, 0xE0, 0xFE, 0x00, 0x07, 0xE0, 0x3F, - 0x00, 0x07, 0xF0, 0x1F, 0xC0, 0x03, 0xF0, 0x0F, 0xE0, 0x03, 0xF8, 0x03, - 0xF8, 0x01, 0xFF, 0xFF, 0xFC, 0x01, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, - 0xFF, 0x80, 0xFF, 0xFF, 0xFF, 0xE0, 0x7F, 0xFF, 0xFF, 0xF0, 0x7F, 0xFF, - 0xFF, 0xF8, 0x3F, 0x80, 0x00, 0xFE, 0x1F, 0xC0, 0x00, 0x7F, 0x1F, 0xC0, - 0x00, 0x1F, 0xCF, 0xE0, 0x00, 0x0F, 0xEF, 0xE0, 0x00, 0x07, 0xFF, 0xF0, - 0x00, 0x01, 0xFC, 0xFF, 0xFF, 0xE0, 0x1F, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, - 0xF8, 0x7F, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xF9, 0xF8, 0x01, 0xFF, 0x3F, - 0x00, 0x0F, 0xF7, 0xE0, 0x01, 0xFE, 0xFC, 0x00, 0x1F, 0xDF, 0x80, 0x03, - 0xF3, 0xF0, 0x00, 0xFE, 0x7E, 0x00, 0x3F, 0xCF, 0xFF, 0xFF, 0xF1, 0xFF, - 0xFF, 0xFC, 0x3F, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, - 0x9F, 0x80, 0x0F, 0xFB, 0xF0, 0x00, 0x7F, 0xFE, 0x00, 0x07, 0xFF, 0xC0, - 0x00, 0xFF, 0xF8, 0x00, 0x1F, 0xFF, 0x00, 0x03, 0xFF, 0xE0, 0x00, 0xFF, - 0xFC, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, - 0xFF, 0xCF, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x01, 0x80, - 0x00, 0x03, 0xFF, 0xC0, 0x01, 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0xFC, 0x07, - 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFF, 0x1F, 0xFC, 0x3F, 0xF3, 0xFE, 0x00, - 0x7C, 0x7F, 0xC0, 0x01, 0x87, 0xF8, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x0F, - 0xF0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0xFE, 0x00, - 0x00, 0x0F, 0xE0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, - 0xFE, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x07, 0xF0, - 0x00, 0x00, 0x7F, 0x80, 0x01, 0x03, 0xFC, 0x00, 0x3C, 0x3F, 0xF0, 0x07, - 0xE1, 0xFF, 0xE7, 0xFF, 0x0F, 0xFF, 0xFF, 0xF0, 0x7F, 0xFF, 0xFE, 0x03, - 0xFF, 0xFF, 0xC0, 0x0F, 0xFF, 0xF0, 0x00, 0x3F, 0xFC, 0x00, 0x00, 0x08, - 0x00, 0xFF, 0xFF, 0xC0, 0x03, 0xFF, 0xFF, 0xE0, 0x0F, 0xFF, 0xFF, 0xE0, - 0x3F, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFF, 0xC3, 0xFF, 0xFF, 0xFF, 0x8F, - 0xE0, 0x07, 0xFE, 0x3F, 0x80, 0x07, 0xFC, 0xFE, 0x00, 0x0F, 0xFB, 0xF8, - 0x00, 0x1F, 0xEF, 0xE0, 0x00, 0x3F, 0xBF, 0x80, 0x00, 0xFE, 0xFE, 0x00, - 0x01, 0xFF, 0xF8, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x1F, 0xFF, 0x80, 0x00, - 0x7F, 0xFE, 0x00, 0x01, 0xFF, 0xF8, 0x00, 0x0F, 0xFF, 0xE0, 0x00, 0x3F, - 0xBF, 0x80, 0x00, 0xFE, 0xFE, 0x00, 0x07, 0xFB, 0xF8, 0x00, 0x3F, 0xCF, - 0xE0, 0x01, 0xFF, 0x3F, 0x80, 0x1F, 0xF8, 0xFF, 0xFF, 0xFF, 0xE3, 0xFF, - 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xF8, 0x3F, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, - 0xF8, 0x03, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFB, - 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xDF, 0x80, 0x00, 0x3F, - 0x00, 0x00, 0x7E, 0x00, 0x00, 0xFC, 0x00, 0x01, 0xF8, 0x00, 0x03, 0xF0, - 0x00, 0x07, 0xE0, 0x00, 0x0F, 0xFF, 0xFF, 0x1F, 0xFF, 0xFE, 0x3F, 0xFF, - 0xFC, 0x7F, 0xFF, 0xF8, 0xFF, 0xFF, 0xF1, 0xF8, 0x00, 0x03, 0xF0, 0x00, - 0x07, 0xE0, 0x00, 0x0F, 0xC0, 0x00, 0x1F, 0x80, 0x00, 0x3F, 0x00, 0x00, - 0x7E, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, - 0x00, 0x0F, 0xE0, 0x00, 0x3F, 0x80, 0x00, 0xFE, 0x00, 0x03, 0xF8, 0x00, - 0x0F, 0xE0, 0x00, 0x3F, 0x80, 0x00, 0xFE, 0x00, 0x03, 0xFF, 0xFF, 0xCF, - 0xFF, 0xFF, 0x3F, 0xFF, 0xFC, 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, 0xCF, 0xFF, - 0xFF, 0x3F, 0x80, 0x00, 0xFE, 0x00, 0x03, 0xF8, 0x00, 0x0F, 0xE0, 0x00, - 0x3F, 0x80, 0x00, 0xFE, 0x00, 0x03, 0xF8, 0x00, 0x0F, 0xE0, 0x00, 0x3F, - 0x80, 0x00, 0xFE, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x00, - 0x01, 0xFF, 0xF0, 0x00, 0x7F, 0xFF, 0xE0, 0x07, 0xFF, 0xFF, 0xC0, 0x7F, - 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFC, 0x7F, 0xF0, 0xFF, 0xC7, 0xFE, 0x00, - 0xFC, 0x7F, 0xC0, 0x01, 0xC3, 0xFC, 0x00, 0x04, 0x1F, 0xC0, 0x00, 0x01, - 0xFE, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x03, 0xF8, - 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x7E, 0xFE, 0x00, 0x03, 0xF7, 0xF0, 0x00, - 0x1F, 0xBF, 0x80, 0x00, 0xFD, 0xFC, 0x00, 0x07, 0xEF, 0xF0, 0x00, 0x3F, - 0x3F, 0x80, 0x01, 0xF9, 0xFE, 0x00, 0x0F, 0xC7, 0xF8, 0x00, 0x7E, 0x3F, - 0xF0, 0x03, 0xF0, 0xFF, 0xFB, 0xFF, 0x83, 0xFF, 0xFF, 0xFC, 0x0F, 0xFF, - 0xFF, 0xE0, 0x3F, 0xFF, 0xFE, 0x00, 0x7F, 0xFF, 0xC0, 0x00, 0xFF, 0xF8, - 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x0F, 0xFF, 0xC0, 0x01, 0xFF, 0xF8, - 0x00, 0x3F, 0xFF, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0xFF, 0xFC, 0x00, 0x1F, - 0xFF, 0x80, 0x03, 0xFF, 0xF0, 0x00, 0x7F, 0xFE, 0x00, 0x0F, 0xFF, 0xC0, - 0x01, 0xFF, 0xF8, 0x00, 0x3F, 0xFF, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x3F, 0xFF, 0x00, 0x07, 0xFF, - 0xE0, 0x00, 0xFF, 0xFC, 0x00, 0x1F, 0xFF, 0x80, 0x03, 0xFF, 0xF0, 0x00, - 0x7F, 0xFE, 0x00, 0x0F, 0xFF, 0xC0, 0x01, 0xFF, 0xF8, 0x00, 0x3F, 0xFF, - 0x00, 0x07, 0xFF, 0xE0, 0x00, 0xFF, 0xFC, 0x00, 0x1F, 0xC0, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xC0, 0x1F, 0xFF, 0xF8, 0xFF, 0xFF, 0xC7, 0xFF, 0xFE, 0x3F, 0xFF, 0xF1, - 0xFF, 0xFF, 0x80, 0x01, 0xFC, 0x00, 0x0F, 0xE0, 0x00, 0x7F, 0x00, 0x03, - 0xF8, 0x00, 0x1F, 0xC0, 0x00, 0xFE, 0x00, 0x07, 0xF0, 0x00, 0x3F, 0x80, - 0x01, 0xFC, 0x00, 0x0F, 0xE0, 0x00, 0x7F, 0x00, 0x03, 0xF8, 0x00, 0x1F, - 0xC0, 0x00, 0xFE, 0x00, 0x07, 0xF0, 0x00, 0x3F, 0x80, 0x01, 0xFC, 0x60, - 0x0F, 0xE7, 0x80, 0xFF, 0x3F, 0x0F, 0xF3, 0xFF, 0xFF, 0x9F, 0xFF, 0xF8, - 0x7F, 0xFF, 0x81, 0xFF, 0xF8, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, 0xFC, - 0x00, 0x1F, 0xEF, 0xC0, 0x03, 0xFC, 0xFC, 0x00, 0x7F, 0x8F, 0xC0, 0x0F, - 0xF0, 0xFC, 0x01, 0xFE, 0x0F, 0xC0, 0x3F, 0xC0, 0xFC, 0x03, 0xF8, 0x0F, - 0xC0, 0x7F, 0x80, 0xFC, 0x0F, 0xF0, 0x0F, 0xC1, 0xFE, 0x00, 0xFC, 0x3F, - 0xC0, 0x0F, 0xC7, 0xF8, 0x00, 0xFC, 0xFF, 0x00, 0x0F, 0xDF, 0xE0, 0x00, - 0xFF, 0xFF, 0x00, 0x0F, 0xFF, 0xF8, 0x00, 0xFF, 0xFF, 0xC0, 0x0F, 0xFF, - 0xFC, 0x00, 0xFF, 0xDF, 0xE0, 0x0F, 0xF8, 0xFF, 0x00, 0xFF, 0x0F, 0xF8, - 0x0F, 0xE0, 0x7F, 0xC0, 0xFC, 0x03, 0xFC, 0x0F, 0xC0, 0x1F, 0xE0, 0xFC, - 0x00, 0xFF, 0x0F, 0xC0, 0x0F, 0xF8, 0xFC, 0x00, 0x7F, 0xCF, 0xC0, 0x03, - 0xFC, 0xFC, 0x00, 0x1F, 0xEF, 0xC0, 0x00, 0xFF, 0xFE, 0x00, 0x03, 0xF8, - 0x00, 0x0F, 0xE0, 0x00, 0x3F, 0x80, 0x00, 0xFE, 0x00, 0x03, 0xF8, 0x00, - 0x0F, 0xE0, 0x00, 0x3F, 0x80, 0x00, 0xFE, 0x00, 0x03, 0xF8, 0x00, 0x0F, - 0xE0, 0x00, 0x3F, 0x80, 0x00, 0xFE, 0x00, 0x03, 0xF8, 0x00, 0x0F, 0xE0, - 0x00, 0x3F, 0x80, 0x00, 0xFE, 0x00, 0x03, 0xF8, 0x00, 0x0F, 0xE0, 0x00, - 0x3F, 0x80, 0x00, 0xFE, 0x00, 0x03, 0xF8, 0x00, 0x0F, 0xE0, 0x00, 0x3F, - 0x80, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFC, 0x00, 0x00, 0x1F, 0xBF, - 0x00, 0x00, 0x07, 0xEF, 0xE0, 0x00, 0x03, 0xFB, 0xFC, 0x00, 0x00, 0xFE, - 0xFF, 0x00, 0x00, 0x7F, 0xBF, 0xE0, 0x00, 0x3F, 0xEF, 0xF8, 0x00, 0x0F, - 0xFB, 0xFF, 0x00, 0x07, 0xFE, 0xFF, 0xE0, 0x01, 0xFF, 0xBF, 0xF8, 0x00, - 0xFF, 0xEF, 0xFF, 0x00, 0x7F, 0xFB, 0xFF, 0xC0, 0x1F, 0xFE, 0xFF, 0xF8, - 0x0F, 0xFF, 0xBF, 0x7F, 0x03, 0xF7, 0xEF, 0xDF, 0xC1, 0xF9, 0xFB, 0xF3, - 0xF8, 0xFE, 0x7E, 0xFC, 0x7E, 0x3F, 0x1F, 0xBF, 0x1F, 0xDF, 0xC7, 0xEF, - 0xC3, 0xFF, 0xE1, 0xFB, 0xF0, 0xFF, 0xF0, 0x7E, 0xFC, 0x1F, 0xFC, 0x1F, - 0xBF, 0x03, 0xFE, 0x07, 0xEF, 0xC0, 0xFF, 0x81, 0xFB, 0xF0, 0x1F, 0xC0, - 0x7E, 0xFC, 0x03, 0xE0, 0x1F, 0xBF, 0x00, 0xF8, 0x07, 0xEF, 0xC0, 0x1C, - 0x01, 0xFB, 0xF0, 0x00, 0x00, 0x7E, 0xFC, 0x00, 0x00, 0x1F, 0xBF, 0x00, - 0x00, 0x07, 0xE0, 0xFC, 0x00, 0x0F, 0xFF, 0xC0, 0x01, 0xFF, 0xF8, 0x00, - 0x3F, 0xFF, 0x80, 0x07, 0xFF, 0xF8, 0x00, 0xFF, 0xFF, 0x80, 0x1F, 0xFF, - 0xF8, 0x03, 0xFF, 0xFF, 0x80, 0x7F, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0x01, - 0xFF, 0xFF, 0xF0, 0x3F, 0xFF, 0xFF, 0x07, 0xFF, 0xDF, 0xF0, 0xFF, 0xF9, - 0xFE, 0x1F, 0xFF, 0x1F, 0xE3, 0xFF, 0xE1, 0xFE, 0x7F, 0xFC, 0x3F, 0xEF, - 0xFF, 0x83, 0xFF, 0xFF, 0xF0, 0x3F, 0xFF, 0xFE, 0x03, 0xFF, 0xFF, 0xC0, - 0x3F, 0xFF, 0xF8, 0x07, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0xE0, 0x07, 0xFF, - 0xFC, 0x00, 0x7F, 0xFF, 0x80, 0x07, 0xFF, 0xF0, 0x00, 0x7F, 0xFE, 0x00, - 0x0F, 0xFF, 0xC0, 0x00, 0xFF, 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0x01, 0x80, - 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x3F, 0xFF, 0xE0, 0x00, 0x7F, 0xFF, - 0xF8, 0x00, 0x7F, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0xFF, 0xC0, 0x7F, 0xF0, - 0xFF, 0xE0, 0x7F, 0xC0, 0x0F, 0xF8, 0x7F, 0xC0, 0x03, 0xFE, 0x3F, 0xC0, - 0x00, 0xFF, 0x1F, 0xC0, 0x00, 0x3F, 0xDF, 0xE0, 0x00, 0x0F, 0xEF, 0xE0, - 0x00, 0x07, 0xF7, 0xF0, 0x00, 0x03, 0xFB, 0xF8, 0x00, 0x01, 0xFF, 0xFC, - 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x3F, 0xFF, - 0x80, 0x00, 0x1F, 0xDF, 0xC0, 0x00, 0x0F, 0xEF, 0xF0, 0x00, 0x07, 0xF3, - 0xF8, 0x00, 0x07, 0xF9, 0xFE, 0x00, 0x07, 0xF8, 0x7F, 0x80, 0x07, 0xFC, - 0x3F, 0xF0, 0x07, 0xFC, 0x0F, 0xFF, 0x3F, 0xFC, 0x03, 0xFF, 0xFF, 0xFE, - 0x00, 0xFF, 0xFF, 0xFC, 0x00, 0x3F, 0xFF, 0xFC, 0x00, 0x07, 0xFF, 0xFC, - 0x00, 0x00, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x80, - 0x3F, 0xFF, 0xFC, 0x0F, 0xFF, 0xFF, 0xC3, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, - 0xFF, 0x3F, 0xFF, 0xFF, 0xCF, 0xE0, 0x0F, 0xFB, 0xF8, 0x00, 0xFE, 0xFE, - 0x00, 0x3F, 0xBF, 0x80, 0x0F, 0xFF, 0xE0, 0x01, 0xFF, 0xF8, 0x00, 0x7F, - 0xFE, 0x00, 0x3F, 0xFF, 0x80, 0x0F, 0xEF, 0xE0, 0x07, 0xFB, 0xF8, 0x03, - 0xFE, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xE3, 0xFF, - 0xFF, 0xE0, 0xFF, 0xFF, 0xE0, 0x3F, 0xFF, 0x80, 0x0F, 0xE0, 0x00, 0x03, - 0xF8, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x0F, 0xE0, 0x00, - 0x03, 0xF8, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, 0x00, - 0x01, 0x80, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0x0F, 0xFF, 0xF8, 0x00, - 0x0F, 0xFF, 0xFF, 0x00, 0x07, 0xFF, 0xFF, 0xF0, 0x03, 0xFF, 0xFF, 0xFE, - 0x01, 0xFF, 0xC3, 0xFF, 0x80, 0xFF, 0x80, 0x1F, 0xF0, 0x7F, 0xC0, 0x03, - 0xFE, 0x1F, 0xE0, 0x00, 0x7F, 0x87, 0xF0, 0x00, 0x0F, 0xF3, 0xFC, 0x00, - 0x01, 0xFC, 0xFE, 0x00, 0x00, 0x7F, 0x3F, 0x80, 0x00, 0x1F, 0xCF, 0xE0, - 0x00, 0x07, 0xFB, 0xF8, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00, 0x3F, 0xBF, - 0x80, 0x00, 0x1F, 0xEF, 0xE0, 0x00, 0x07, 0xF3, 0xF8, 0x00, 0x01, 0xFC, - 0xFF, 0x00, 0x00, 0x7F, 0x1F, 0xC0, 0x00, 0x3F, 0xC7, 0xF8, 0x00, 0x1F, - 0xE0, 0xFF, 0x00, 0x0F, 0xF8, 0x3F, 0xF0, 0x07, 0xFC, 0x07, 0xFF, 0x9F, - 0xFE, 0x00, 0xFF, 0xFF, 0xFF, 0x80, 0x1F, 0xFF, 0xFF, 0x80, 0x03, 0xFF, - 0xFF, 0xC0, 0x00, 0x3F, 0xFF, 0xE0, 0x00, 0x03, 0xFF, 0xC0, 0x00, 0x00, - 0x0F, 0xF8, 0x0C, 0x00, 0x01, 0xFF, 0x8F, 0x80, 0x00, 0x3F, 0xFF, 0xF0, - 0x00, 0x07, 0xFF, 0xFC, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0x0F, 0xFF, - 0x00, 0x00, 0x00, 0xFE, 0x00, 0xFF, 0xFF, 0xC0, 0x3F, 0xFF, 0xFC, 0x0F, - 0xFF, 0xFF, 0xC3, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, - 0xCF, 0xE0, 0x0F, 0xFB, 0xF8, 0x00, 0xFE, 0xFE, 0x00, 0x3F, 0xBF, 0x80, - 0x0F, 0xFF, 0xE0, 0x01, 0xFF, 0xF8, 0x00, 0x7F, 0xFE, 0x00, 0x3F, 0xFF, - 0x80, 0x0F, 0xEF, 0xE0, 0x07, 0xFB, 0xF8, 0x03, 0xFE, 0xFF, 0xFF, 0xFF, - 0x3F, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xC3, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, - 0xF0, 0x3F, 0xFF, 0xFC, 0x0F, 0xE0, 0x3F, 0x83, 0xF8, 0x0F, 0xF0, 0xFE, - 0x01, 0xFC, 0x3F, 0x80, 0x3F, 0x8F, 0xE0, 0x0F, 0xF3, 0xF8, 0x01, 0xFE, - 0xFE, 0x00, 0x3F, 0xBF, 0x80, 0x0F, 0xF0, 0x00, 0x0E, 0x00, 0x00, 0xFF, - 0xFC, 0x01, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0xE1, 0xFF, - 0xFF, 0xF1, 0xFF, 0x01, 0xF8, 0xFE, 0x00, 0x18, 0x7F, 0x00, 0x00, 0x3F, - 0x80, 0x00, 0x1F, 0xC0, 0x00, 0x0F, 0xF0, 0x00, 0x07, 0xFE, 0x00, 0x01, - 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0xF0, 0x07, 0xFF, 0xFE, - 0x00, 0xFF, 0xFF, 0x80, 0x0F, 0xFF, 0xC0, 0x00, 0x7F, 0xF0, 0x00, 0x07, - 0xF8, 0x00, 0x01, 0xFC, 0x00, 0x00, 0xFE, 0x60, 0x00, 0x7F, 0x3C, 0x00, - 0x3F, 0xBF, 0xC0, 0x7F, 0xDF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xC7, 0xFF, - 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, 0x80, 0x00, 0x18, 0x00, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x03, 0xF8, 0x00, 0x00, 0xFE, - 0x00, 0x00, 0x3F, 0x80, 0x00, 0x0F, 0xE0, 0x00, 0x03, 0xF8, 0x00, 0x00, - 0xFE, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x0F, 0xE0, 0x00, 0x03, 0xF8, 0x00, - 0x00, 0xFE, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x0F, 0xE0, 0x00, 0x03, 0xF8, - 0x00, 0x00, 0xFE, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x0F, 0xE0, 0x00, 0x03, - 0xF8, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x0F, 0xE0, 0x00, - 0x03, 0xF8, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x0F, 0xE0, - 0x00, 0xFE, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x7F, 0xFE, 0x00, 0x07, 0xFF, - 0xE0, 0x00, 0x7F, 0xFE, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x7F, 0xFE, 0x00, - 0x07, 0xFF, 0xE0, 0x00, 0x7F, 0xFE, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x7F, - 0xFE, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x7F, 0xFE, 0x00, 0x07, 0xFF, 0xE0, - 0x00, 0x7F, 0xFE, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x7F, 0xFE, 0x00, 0x07, - 0xFF, 0xE0, 0x00, 0x7F, 0xFE, 0x00, 0x07, 0xFF, 0xF0, 0x00, 0xFE, 0x7F, - 0x00, 0x0F, 0xE7, 0xF0, 0x00, 0xFE, 0x7F, 0x80, 0x1F, 0xE3, 0xFC, 0x03, - 0xFC, 0x3F, 0xFF, 0xFF, 0xC1, 0xFF, 0xFF, 0xF8, 0x1F, 0xFF, 0xFF, 0x00, - 0x7F, 0xFF, 0xE0, 0x03, 0xFF, 0xFC, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7F, 0x7F, 0x80, 0x00, 0x3F, 0x9F, 0xC0, - 0x00, 0x3F, 0x8F, 0xF0, 0x00, 0x1F, 0xC3, 0xF8, 0x00, 0x0F, 0xE1, 0xFE, - 0x00, 0x0F, 0xE0, 0xFF, 0x00, 0x07, 0xF0, 0x3F, 0x80, 0x07, 0xF0, 0x1F, - 0xE0, 0x03, 0xF8, 0x07, 0xF0, 0x03, 0xF8, 0x03, 0xFC, 0x01, 0xFC, 0x00, - 0xFE, 0x00, 0xFE, 0x00, 0x7F, 0x00, 0xFE, 0x00, 0x3F, 0xC0, 0x7F, 0x00, - 0x0F, 0xE0, 0x7F, 0x00, 0x07, 0xF8, 0x3F, 0x80, 0x01, 0xFC, 0x3F, 0x80, - 0x00, 0xFF, 0x1F, 0xC0, 0x00, 0x3F, 0x8F, 0xC0, 0x00, 0x1F, 0xCF, 0xE0, - 0x00, 0x0F, 0xF7, 0xF0, 0x00, 0x03, 0xFF, 0xF0, 0x00, 0x01, 0xFF, 0xF8, - 0x00, 0x00, 0x7F, 0xF8, 0x00, 0x00, 0x3F, 0xFC, 0x00, 0x00, 0x0F, 0xFC, - 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0xFF, - 0x00, 0x00, 0x00, 0x7F, 0x80, 0x00, 0xFE, 0x00, 0x07, 0xF0, 0x00, 0x7F, - 0xFF, 0x00, 0x07, 0xF0, 0x00, 0x7F, 0x7F, 0x00, 0x0F, 0xF0, 0x00, 0x7E, - 0x7F, 0x00, 0x0F, 0xF8, 0x00, 0xFE, 0x7F, 0x80, 0x1F, 0xF8, 0x00, 0xFE, - 0x3F, 0x80, 0x1F, 0xF8, 0x00, 0xFC, 0x3F, 0x80, 0x1F, 0xFC, 0x01, 0xFC, - 0x3F, 0xC0, 0x3F, 0xFC, 0x01, 0xFC, 0x1F, 0xC0, 0x3F, 0xFC, 0x01, 0xF8, - 0x1F, 0xC0, 0x3F, 0xFE, 0x03, 0xF8, 0x1F, 0xE0, 0x7F, 0xFE, 0x03, 0xF8, - 0x0F, 0xE0, 0x7E, 0x7E, 0x03, 0xF0, 0x0F, 0xE0, 0x7E, 0x7F, 0x07, 0xF0, - 0x0F, 0xF0, 0xFE, 0x7F, 0x07, 0xF0, 0x07, 0xF0, 0xFC, 0x3F, 0x07, 0xE0, - 0x07, 0xF0, 0xFC, 0x3F, 0x8F, 0xE0, 0x07, 0xF1, 0xFC, 0x3F, 0x8F, 0xE0, - 0x03, 0xF9, 0xF8, 0x1F, 0x8F, 0xC0, 0x03, 0xF9, 0xF8, 0x1F, 0xDF, 0xC0, - 0x03, 0xFB, 0xF8, 0x1F, 0xDF, 0xC0, 0x01, 0xFF, 0xF0, 0x0F, 0xDF, 0x80, - 0x01, 0xFF, 0xF0, 0x0F, 0xFF, 0x80, 0x01, 0xFF, 0xF0, 0x0F, 0xFF, 0x80, - 0x00, 0xFF, 0xE0, 0x07, 0xFF, 0x00, 0x00, 0xFF, 0xE0, 0x07, 0xFF, 0x00, - 0x00, 0xFF, 0xE0, 0x07, 0xFF, 0x00, 0x00, 0x7F, 0xC0, 0x03, 0xFE, 0x00, - 0x00, 0x7F, 0xC0, 0x03, 0xFE, 0x00, 0x00, 0x7F, 0xC0, 0x03, 0xFE, 0x00, - 0x00, 0x3F, 0x80, 0x01, 0xFC, 0x00, 0x7F, 0x80, 0x03, 0xF8, 0x7F, 0x80, - 0x0F, 0xF0, 0x7F, 0x00, 0x3F, 0xC0, 0xFF, 0x00, 0x7F, 0x00, 0xFF, 0x01, - 0xFE, 0x00, 0xFF, 0x07, 0xF8, 0x01, 0xFE, 0x0F, 0xE0, 0x01, 0xFE, 0x3F, - 0x80, 0x01, 0xFE, 0xFF, 0x00, 0x01, 0xFD, 0xFC, 0x00, 0x03, 0xFF, 0xF0, - 0x00, 0x03, 0xFF, 0xC0, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x07, 0xFE, 0x00, - 0x00, 0x07, 0xF8, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x3F, 0xF8, 0x00, - 0x00, 0xFF, 0xF8, 0x00, 0x03, 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xF0, 0x00, - 0x1F, 0xEF, 0xF0, 0x00, 0x7F, 0x8F, 0xE0, 0x00, 0xFE, 0x1F, 0xE0, 0x03, - 0xFC, 0x1F, 0xE0, 0x0F, 0xF0, 0x1F, 0xE0, 0x3F, 0xC0, 0x3F, 0xC0, 0x7F, - 0x80, 0x3F, 0xC1, 0xFE, 0x00, 0x3F, 0xC7, 0xF8, 0x00, 0x7F, 0xDF, 0xE0, - 0x00, 0x7F, 0x80, 0x7F, 0x00, 0x01, 0xFC, 0xFF, 0x00, 0x03, 0xF8, 0xFE, - 0x00, 0x0F, 0xE0, 0xFE, 0x00, 0x1F, 0xC1, 0xFE, 0x00, 0x7F, 0x01, 0xFC, - 0x01, 0xFC, 0x03, 0xFC, 0x03, 0xF8, 0x03, 0xF8, 0x0F, 0xE0, 0x03, 0xF8, - 0x1F, 0xC0, 0x07, 0xF8, 0x7F, 0x00, 0x07, 0xF1, 0xFC, 0x00, 0x0F, 0xF3, - 0xF8, 0x00, 0x0F, 0xEF, 0xE0, 0x00, 0x0F, 0xFF, 0xC0, 0x00, 0x1F, 0xFF, - 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x3F, 0xF8, 0x00, 0x00, 0x3F, 0xE0, - 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0xFE, 0x00, - 0x00, 0x01, 0xFC, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x07, 0xF0, 0x00, - 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0x3F, 0x80, 0x00, - 0x00, 0x7F, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x00, - 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, - 0xFE, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xC0, 0x00, 0x1F, 0xF0, 0x00, - 0x07, 0xF8, 0x00, 0x03, 0xFC, 0x00, 0x01, 0xFE, 0x00, 0x00, 0xFF, 0x00, - 0x00, 0x7F, 0x80, 0x00, 0x3F, 0xE0, 0x00, 0x0F, 0xF0, 0x00, 0x07, 0xF8, - 0x00, 0x03, 0xFC, 0x00, 0x01, 0xFE, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x7F, - 0xC0, 0x00, 0x1F, 0xE0, 0x00, 0x0F, 0xF0, 0x00, 0x07, 0xF8, 0x00, 0x03, - 0xFC, 0x00, 0x01, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x3F, 0x07, - 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xE0, - 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xE0, 0xFC, - 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xE0, 0xFC, 0x1F, - 0x83, 0xF0, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x07, - 0xE0, 0x00, 0x7E, 0x00, 0x07, 0xE0, 0x00, 0x3F, 0x00, 0x03, 0xF0, 0x00, - 0x3F, 0x00, 0x01, 0xF8, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00, 0x0F, 0xC0, - 0x00, 0xFC, 0x00, 0x07, 0xE0, 0x00, 0x7E, 0x00, 0x07, 0xE0, 0x00, 0x3F, - 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x00, 0x01, 0xF8, 0x00, 0x1F, 0x80, 0x01, - 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0x7E, 0x00, - 0x07, 0xE0, 0x00, 0x3E, 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x00, 0x01, 0xF8, - 0x00, 0x1F, 0x80, 0x01, 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x0F, - 0xC0, 0x00, 0x7E, 0x00, 0x07, 0xE0, 0x00, 0x7E, 0x00, 0x03, 0xF0, 0x00, - 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x0F, 0xC1, 0xF8, 0x3F, - 0x07, 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, - 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xE0, - 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xE0, 0xFC, - 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFC, 0x00, 0x07, - 0xE0, 0x00, 0x7F, 0x80, 0x03, 0xFC, 0x00, 0x3F, 0xF0, 0x01, 0xFF, 0x80, - 0x1F, 0x7C, 0x00, 0xF9, 0xF0, 0x07, 0xCF, 0x80, 0x7C, 0x3E, 0x03, 0xE1, - 0xF0, 0x3E, 0x07, 0xC1, 0xF0, 0x3E, 0x1F, 0x01, 0xF0, 0xF8, 0x07, 0xCF, - 0xC0, 0x3E, 0x7C, 0x00, 0xFB, 0xE0, 0x07, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0xFC, 0x07, 0xF0, - 0x0F, 0xC0, 0x3F, 0x00, 0xF8, 0x0F, 0xFF, 0x00, 0xFF, 0xFF, 0x07, 0xFF, - 0xFE, 0x1F, 0xFF, 0xFC, 0x3F, 0xFF, 0xF8, 0xF0, 0x1F, 0xE1, 0x00, 0x3F, - 0x80, 0x00, 0x7E, 0x00, 0x01, 0xFC, 0x03, 0xFF, 0xF1, 0xFF, 0xFF, 0xCF, - 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFC, 0x07, 0xFF, 0xE0, 0x1F, 0xFF, 0x00, - 0x7F, 0xFC, 0x03, 0xFF, 0xF8, 0x0F, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, - 0x7F, 0xFF, 0xFC, 0xFF, 0xF7, 0xF0, 0xFF, 0x9F, 0xC0, 0xFE, 0x00, 0x00, - 0x7F, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x1F, 0xC0, 0x00, 0x0F, 0xE0, 0x00, - 0x07, 0xF0, 0x00, 0x03, 0xF8, 0x00, 0x01, 0xFC, 0x00, 0x00, 0xFE, 0x00, - 0x00, 0x7F, 0x3F, 0xF0, 0x3F, 0xBF, 0xFC, 0x1F, 0xFF, 0xFF, 0x8F, 0xFF, - 0xFF, 0xE7, 0xFF, 0xFF, 0xF3, 0xFF, 0x07, 0xFD, 0xFF, 0x01, 0xFE, 0xFF, - 0x00, 0x7F, 0xFF, 0x00, 0x1F, 0xFF, 0x80, 0x0F, 0xFF, 0xC0, 0x07, 0xFF, - 0xE0, 0x03, 0xFF, 0xF0, 0x01, 0xFF, 0xF8, 0x00, 0xFF, 0xFC, 0x00, 0x7F, - 0xFF, 0x00, 0x7F, 0xFF, 0xC0, 0x7F, 0xBF, 0xF8, 0x7F, 0xDF, 0xFF, 0xFF, - 0xCF, 0xFF, 0xFF, 0xC7, 0xFF, 0xFF, 0xC3, 0xFB, 0xFF, 0xC1, 0xFC, 0xFF, - 0x80, 0x00, 0xFF, 0xE0, 0x03, 0xFF, 0xF0, 0x0F, 0xFF, 0xFC, 0x1F, 0xFF, - 0xFC, 0x1F, 0xFF, 0xFE, 0x3F, 0xE1, 0xFE, 0x7F, 0x80, 0x7C, 0x7F, 0x00, - 0x30, 0x7F, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, - 0x00, 0xFE, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, - 0x30, 0x7F, 0x80, 0x7C, 0x3F, 0xE1, 0xFF, 0x1F, 0xFF, 0xFE, 0x1F, 0xFF, - 0xFC, 0x07, 0xFF, 0xFC, 0x03, 0xFF, 0xF0, 0x00, 0xFF, 0xC0, 0x00, 0x00, - 0x1F, 0xC0, 0x00, 0x07, 0xF0, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x7F, 0x00, - 0x00, 0x1F, 0xC0, 0x00, 0x07, 0xF0, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x7F, - 0x00, 0x00, 0x1F, 0xC0, 0x7F, 0xE7, 0xF0, 0x7F, 0xFD, 0xFC, 0x3F, 0xFF, - 0xFF, 0x1F, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xF3, 0xFE, 0x1F, 0xFD, 0xFE, - 0x01, 0xFF, 0x7F, 0x00, 0x3F, 0xDF, 0xC0, 0x07, 0xF7, 0xE0, 0x01, 0xFF, - 0xF8, 0x00, 0x7F, 0xFE, 0x00, 0x1F, 0xFF, 0x80, 0x07, 0xF7, 0xF0, 0x01, - 0xFD, 0xFC, 0x00, 0xFF, 0x7F, 0x00, 0x3F, 0xDF, 0xE0, 0x1F, 0xF3, 0xFE, - 0x1F, 0xFC, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0xC3, 0xFF, 0xFF, 0xF0, - 0x3F, 0xFD, 0xFC, 0x07, 0xFC, 0x7F, 0x00, 0xFF, 0xC0, 0x01, 0xFF, 0xF8, - 0x03, 0xFF, 0xFE, 0x03, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0xE1, 0xFE, 0x07, - 0xF1, 0xFC, 0x01, 0xFC, 0xFE, 0x00, 0x7E, 0x7E, 0x00, 0x3F, 0x7F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xF0, - 0x00, 0x01, 0xFC, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7F, 0x80, 0x10, 0x1F, - 0xF0, 0x3C, 0x07, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xC0, 0x7F, 0xFF, 0xC0, - 0x1F, 0xFF, 0xC0, 0x03, 0xFF, 0x80, 0x00, 0x7F, 0x80, 0x7F, 0xF0, 0x3F, - 0xF8, 0x1F, 0xFE, 0x07, 0xFF, 0x83, 0xFC, 0x00, 0xFE, 0x00, 0x3F, 0x80, - 0x0F, 0xC0, 0x3F, 0xFF, 0xCF, 0xFF, 0xF3, 0xFF, 0xFC, 0xFF, 0xFF, 0x3F, - 0xFF, 0xCF, 0xFF, 0xF0, 0x3F, 0x80, 0x0F, 0xE0, 0x03, 0xF8, 0x00, 0xFE, - 0x00, 0x3F, 0x80, 0x0F, 0xE0, 0x03, 0xF8, 0x00, 0xFE, 0x00, 0x3F, 0x80, - 0x0F, 0xE0, 0x03, 0xF8, 0x00, 0xFE, 0x00, 0x3F, 0x80, 0x0F, 0xE0, 0x03, - 0xF8, 0x00, 0xFE, 0x00, 0x3F, 0x80, 0x01, 0xFF, 0x8F, 0xC1, 0xFF, 0xF3, - 0xF0, 0xFF, 0xFE, 0xFC, 0x7F, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xCF, 0xF8, - 0x3F, 0xF7, 0xF8, 0x03, 0xFD, 0xFC, 0x00, 0xFF, 0x7F, 0x00, 0x1F, 0xFF, - 0x80, 0x07, 0xFF, 0xE0, 0x01, 0xFF, 0xF8, 0x00, 0x7F, 0xFE, 0x00, 0x1F, - 0xDF, 0xC0, 0x07, 0xF7, 0xF8, 0x03, 0xFD, 0xFF, 0x01, 0xFF, 0x3F, 0xFF, - 0xFF, 0xC7, 0xFF, 0xFF, 0xF1, 0xFF, 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0x03, - 0xFF, 0x9F, 0xC0, 0x1F, 0x87, 0xF0, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x7E, - 0x08, 0x00, 0x3F, 0x87, 0xC0, 0x1F, 0xE1, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, - 0xFC, 0x3F, 0xFF, 0xFE, 0x07, 0xFF, 0xFE, 0x00, 0x7F, 0xFF, 0x00, 0x00, - 0xFC, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, - 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, - 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x7F, 0xE0, 0xFE, 0xFF, 0xF0, 0xFF, - 0xFF, 0xF8, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFE, 0xFF, 0xE7, 0xFE, 0xFF, - 0x80, 0xFE, 0xFF, 0x00, 0xFF, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, - 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, - 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, - 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, - 0x00, 0x7F, 0x3C, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x18, 0x00, 0x00, - 0x00, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, - 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, - 0x00, 0x78, 0x01, 0xF8, 0x07, 0xF8, 0x0F, 0xF0, 0x1F, 0xE0, 0x3F, 0xC0, - 0x3F, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xE0, 0x1F, - 0xC0, 0x3F, 0x80, 0x7F, 0x00, 0xFE, 0x01, 0xFC, 0x03, 0xF8, 0x07, 0xF0, - 0x0F, 0xE0, 0x1F, 0xC0, 0x3F, 0x80, 0x7F, 0x00, 0xFE, 0x01, 0xFC, 0x03, - 0xF8, 0x07, 0xF0, 0x0F, 0xE0, 0x1F, 0xC0, 0x3F, 0x80, 0x7F, 0x00, 0xFE, - 0x01, 0xFC, 0x03, 0xF8, 0x07, 0xF0, 0x0F, 0xE0, 0x1F, 0xCF, 0xFF, 0x9F, - 0xFE, 0x3F, 0xF8, 0xFF, 0xF1, 0xFF, 0x80, 0x38, 0x00, 0xFE, 0x00, 0x00, - 0x7F, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x1F, 0xC0, 0x00, 0x0F, 0xE0, 0x00, - 0x07, 0xF0, 0x00, 0x03, 0xF8, 0x00, 0x01, 0xFC, 0x00, 0x00, 0xFE, 0x00, - 0x00, 0x7F, 0x00, 0x7F, 0xBF, 0x80, 0x7F, 0x9F, 0xC0, 0x7F, 0x8F, 0xE0, - 0x7F, 0x87, 0xF0, 0x7F, 0x83, 0xF8, 0x7F, 0x81, 0xFC, 0x7F, 0x80, 0xFE, - 0x7F, 0x80, 0x7F, 0xFF, 0x80, 0x3F, 0xFF, 0x80, 0x1F, 0xFF, 0xE0, 0x0F, - 0xFF, 0xF0, 0x07, 0xFF, 0xFC, 0x03, 0xFF, 0xFF, 0x01, 0xFF, 0x7F, 0xC0, - 0xFF, 0x1F, 0xF0, 0x7F, 0x07, 0xF8, 0x3F, 0x81, 0xFE, 0x1F, 0xC0, 0x7F, - 0x8F, 0xE0, 0x1F, 0xE7, 0xF0, 0x0F, 0xF3, 0xF8, 0x03, 0xFD, 0xFC, 0x00, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x7F, 0xC0, 0x7F, 0xC1, 0xFD, 0xFF, - 0xE3, 0xFF, 0xE3, 0xFF, 0xFF, 0xEF, 0xFF, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, - 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFF, 0xE0, - 0x7F, 0xE0, 0x7F, 0xFF, 0x80, 0x7F, 0x80, 0x7F, 0xFE, 0x00, 0xFE, 0x00, - 0xFF, 0xFC, 0x01, 0xFC, 0x01, 0xFF, 0xF8, 0x03, 0xF8, 0x03, 0xFF, 0xF0, - 0x07, 0xF0, 0x07, 0xFF, 0xE0, 0x0F, 0xE0, 0x0F, 0xFF, 0xC0, 0x1F, 0xC0, - 0x1F, 0xFF, 0x80, 0x3F, 0x80, 0x3F, 0xFF, 0x00, 0x7F, 0x00, 0x7F, 0xFE, - 0x00, 0xFE, 0x00, 0xFF, 0xFC, 0x01, 0xFC, 0x01, 0xFF, 0xF8, 0x03, 0xF8, - 0x03, 0xFF, 0xF0, 0x07, 0xF0, 0x07, 0xFF, 0xE0, 0x0F, 0xE0, 0x0F, 0xFF, - 0xC0, 0x1F, 0xC0, 0x1F, 0xFF, 0x80, 0x3F, 0x80, 0x3F, 0x80, 0xFE, 0x7F, - 0xE0, 0xFE, 0xFF, 0xF0, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, - 0xFE, 0xFF, 0xE7, 0xFE, 0xFF, 0x80, 0xFE, 0xFF, 0x00, 0xFF, 0xFE, 0x00, - 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, - 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, - 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, - 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0x00, 0xFF, 0xC0, 0x00, 0xFF, - 0xFC, 0x00, 0xFF, 0xFF, 0xC0, 0x7F, 0xFF, 0xF8, 0x1F, 0xFF, 0xFF, 0x0F, - 0xF8, 0x7F, 0xC7, 0xF8, 0x07, 0xF9, 0xFC, 0x00, 0xFE, 0x7F, 0x00, 0x3F, - 0xBF, 0x80, 0x07, 0xFF, 0xE0, 0x01, 0xFF, 0xF8, 0x00, 0x7F, 0xFE, 0x00, - 0x1F, 0xDF, 0x80, 0x07, 0xF7, 0xF0, 0x03, 0xF9, 0xFC, 0x00, 0xFE, 0x7F, - 0x80, 0x7F, 0x8F, 0xF8, 0x7F, 0xC1, 0xFF, 0xFF, 0xF0, 0x3F, 0xFF, 0xF8, - 0x07, 0xFF, 0xFC, 0x00, 0xFF, 0xFC, 0x00, 0x0F, 0xFC, 0x00, 0xFE, 0x7F, - 0xE0, 0x7F, 0x7F, 0xF8, 0x3F, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0xCF, 0xFF, - 0xFF, 0xE7, 0xFE, 0x0F, 0xFB, 0xFE, 0x03, 0xFD, 0xFE, 0x00, 0xFF, 0xFE, - 0x00, 0x3F, 0xFF, 0x00, 0x1F, 0xFF, 0x80, 0x0F, 0xFF, 0xC0, 0x07, 0xFF, - 0xE0, 0x03, 0xFF, 0xF0, 0x01, 0xFF, 0xF8, 0x00, 0xFF, 0xFE, 0x00, 0xFF, - 0xFF, 0x80, 0xFF, 0x7F, 0xF0, 0xFF, 0xBF, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, - 0xCF, 0xFF, 0xFF, 0xC7, 0xF7, 0xFF, 0x83, 0xF9, 0xFF, 0x01, 0xFC, 0x00, - 0x00, 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x1F, 0xC0, - 0x00, 0x0F, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x01, - 0xFF, 0x9F, 0xC1, 0xFF, 0xF7, 0xF0, 0xFF, 0xFF, 0xFC, 0x7F, 0xFF, 0xFF, - 0x3F, 0xFF, 0xFF, 0xCF, 0xF8, 0x7F, 0xF7, 0xF8, 0x07, 0xFD, 0xFC, 0x00, - 0xFF, 0x7F, 0x00, 0x3F, 0xFF, 0x80, 0x07, 0xFF, 0xE0, 0x01, 0xFF, 0xF8, - 0x00, 0x7F, 0xFE, 0x00, 0x1F, 0xFF, 0x80, 0x07, 0xF7, 0xF0, 0x03, 0xFD, - 0xFC, 0x00, 0xFF, 0x7F, 0x80, 0x7F, 0xCF, 0xF8, 0x7F, 0xF3, 0xFF, 0xFF, - 0xFC, 0x7F, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xC1, 0xFF, 0xF7, 0xF0, 0x1F, - 0xF1, 0xFC, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x07, 0xF0, - 0x00, 0x01, 0xFC, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x07, - 0xF0, 0x00, 0x01, 0xFC, 0xFE, 0x3F, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xF8, 0x3F, 0xC0, 0xFF, 0x03, 0xF8, 0x0F, 0xE0, 0x3F, - 0x80, 0xFE, 0x03, 0xF8, 0x0F, 0xE0, 0x3F, 0x80, 0xFE, 0x03, 0xF8, 0x0F, - 0xE0, 0x3F, 0x80, 0xFE, 0x03, 0xF8, 0x0F, 0xE0, 0x00, 0x07, 0xFF, 0xC0, - 0xFF, 0xFF, 0x8F, 0xFF, 0xFC, 0xFF, 0xFF, 0xC7, 0xFF, 0xFE, 0x3F, 0x00, - 0x63, 0xF8, 0x00, 0x1F, 0xC0, 0x00, 0x7F, 0x80, 0x03, 0xFF, 0xE0, 0x1F, - 0xFF, 0xE0, 0x7F, 0xFF, 0xC0, 0xFF, 0xFF, 0x00, 0xFF, 0xF8, 0x00, 0x3F, - 0xE0, 0x00, 0x7F, 0x20, 0x03, 0xFB, 0xC0, 0x1F, 0xDF, 0xFF, 0xFD, 0xFF, - 0xFF, 0xEF, 0xFF, 0xFE, 0x3F, 0xFF, 0xE0, 0x3F, 0xFC, 0x00, 0x0F, 0xE0, - 0x03, 0xF8, 0x00, 0xFE, 0x00, 0x3F, 0x80, 0x0F, 0xE0, 0x3F, 0xFF, 0xCF, - 0xFF, 0xF3, 0xFF, 0xFC, 0xFF, 0xFF, 0x3F, 0xFF, 0xC0, 0xFE, 0x00, 0x3F, - 0x80, 0x0F, 0xE0, 0x03, 0xF8, 0x00, 0xFE, 0x00, 0x3F, 0x80, 0x0F, 0xE0, - 0x03, 0xF8, 0x00, 0xFE, 0x00, 0x3F, 0x80, 0x0F, 0xE0, 0x03, 0xF8, 0x00, - 0xFF, 0x00, 0x3F, 0xFE, 0x07, 0xFF, 0x81, 0xFF, 0xE0, 0x3F, 0xFC, 0x03, - 0xFE, 0xFE, 0x00, 0x7F, 0xFC, 0x00, 0xFF, 0xF8, 0x01, 0xFF, 0xF0, 0x03, - 0xFF, 0xE0, 0x07, 0xFF, 0xC0, 0x0F, 0xFF, 0x80, 0x1F, 0xFF, 0x00, 0x3F, - 0xFE, 0x00, 0x7F, 0xFC, 0x00, 0xFF, 0xF8, 0x01, 0xFF, 0xF0, 0x03, 0xFF, - 0xE0, 0x07, 0xFF, 0xC0, 0x1F, 0xFF, 0x80, 0x3F, 0xFF, 0x00, 0x7F, 0xFF, - 0x01, 0xFE, 0xFF, 0xDF, 0xFD, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xF3, 0xFF, - 0xFF, 0xE3, 0xFF, 0xEF, 0xC1, 0xFF, 0x1F, 0x80, 0xFE, 0x00, 0x1F, 0xFF, - 0x80, 0x07, 0xE7, 0xF0, 0x03, 0xF9, 0xFC, 0x00, 0xFE, 0x3F, 0x00, 0x3F, - 0x0F, 0xE0, 0x1F, 0xC3, 0xF8, 0x07, 0xE0, 0x7F, 0x03, 0xF8, 0x1F, 0xC0, - 0xFC, 0x03, 0xF0, 0x3F, 0x00, 0xFE, 0x1F, 0xC0, 0x1F, 0x87, 0xE0, 0x07, - 0xF3, 0xF8, 0x01, 0xFC, 0xFC, 0x00, 0x3F, 0xFF, 0x00, 0x0F, 0xFF, 0x80, - 0x01, 0xFF, 0xE0, 0x00, 0x7F, 0xF8, 0x00, 0x1F, 0xFC, 0x00, 0x03, 0xFF, - 0x00, 0x00, 0xFF, 0x80, 0x00, 0x1F, 0xE0, 0x00, 0x07, 0xF8, 0x00, 0xFE, - 0x00, 0x7E, 0x00, 0x3F, 0x7E, 0x00, 0x7F, 0x00, 0x3F, 0x7E, 0x00, 0x7F, - 0x00, 0x7E, 0x7F, 0x00, 0xFF, 0x00, 0x7E, 0x3F, 0x00, 0xFF, 0x80, 0x7E, - 0x3F, 0x01, 0xFF, 0x80, 0xFC, 0x3F, 0x81, 0xFF, 0xC0, 0xFC, 0x1F, 0x81, - 0xFF, 0xC0, 0xF8, 0x1F, 0x83, 0xFF, 0xC1, 0xF8, 0x0F, 0xC3, 0xF7, 0xE1, - 0xF8, 0x0F, 0xC3, 0xF7, 0xE3, 0xF0, 0x0F, 0xC7, 0xE7, 0xE3, 0xF0, 0x07, - 0xE7, 0xE3, 0xF3, 0xF0, 0x07, 0xE7, 0xC3, 0xF7, 0xE0, 0x07, 0xEF, 0xC3, - 0xF7, 0xE0, 0x03, 0xFF, 0xC1, 0xFF, 0xE0, 0x03, 0xFF, 0x81, 0xFF, 0xC0, - 0x03, 0xFF, 0x81, 0xFF, 0xC0, 0x01, 0xFF, 0x80, 0xFF, 0xC0, 0x01, 0xFF, - 0x00, 0xFF, 0x80, 0x01, 0xFF, 0x00, 0xFF, 0x80, 0x00, 0xFE, 0x00, 0x7F, - 0x00, 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x9F, 0xC0, 0x3F, - 0x8F, 0xF0, 0x3F, 0x83, 0xFC, 0x3F, 0x80, 0xFE, 0x3F, 0xC0, 0x3F, 0x9F, - 0xC0, 0x1F, 0xFF, 0xC0, 0x07, 0xFF, 0xC0, 0x01, 0xFF, 0xE0, 0x00, 0x7F, - 0xE0, 0x00, 0x3F, 0xE0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF8, 0x00, 0x0F, - 0xFE, 0x00, 0x07, 0xFF, 0x80, 0x07, 0xFF, 0xE0, 0x07, 0xF7, 0xF8, 0x07, - 0xF9, 0xFC, 0x03, 0xF8, 0x7F, 0x03, 0xF8, 0x3F, 0xC3, 0xF8, 0x0F, 0xF3, - 0xFC, 0x03, 0xF9, 0xFC, 0x01, 0xFE, 0xFE, 0x00, 0x1F, 0xFF, 0x80, 0x07, - 0xE7, 0xF0, 0x03, 0xF9, 0xFC, 0x00, 0xFE, 0x3F, 0x80, 0x3F, 0x0F, 0xE0, - 0x1F, 0xC3, 0xF8, 0x07, 0xE0, 0x7F, 0x03, 0xF8, 0x1F, 0xC0, 0xFC, 0x03, - 0xF8, 0x3F, 0x00, 0xFE, 0x1F, 0xC0, 0x1F, 0x87, 0xE0, 0x07, 0xF3, 0xF8, - 0x01, 0xFC, 0xFC, 0x00, 0x3F, 0xBF, 0x00, 0x0F, 0xFF, 0x80, 0x01, 0xFF, - 0xE0, 0x00, 0x7F, 0xF8, 0x00, 0x0F, 0xFC, 0x00, 0x03, 0xFF, 0x00, 0x00, - 0x7F, 0x80, 0x00, 0x1F, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x00, 0xFC, 0x00, - 0x00, 0x7F, 0x00, 0x08, 0x3F, 0x80, 0x07, 0xFF, 0xE0, 0x01, 0xFF, 0xF0, - 0x00, 0xFF, 0xF8, 0x00, 0x3F, 0xFC, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x3C, - 0x00, 0x00, 0x7F, 0xFF, 0xFB, 0xFF, 0xFF, 0xDF, 0xFF, 0xFE, 0xFF, 0xFF, - 0xF7, 0xFF, 0xFF, 0x00, 0x07, 0xF0, 0x00, 0x7F, 0x80, 0x07, 0xF8, 0x00, - 0x7F, 0x80, 0x07, 0xF8, 0x00, 0x3F, 0x80, 0x03, 0xF8, 0x00, 0x3F, 0xC0, - 0x03, 0xFC, 0x00, 0x3F, 0xC0, 0x03, 0xFC, 0x00, 0x1F, 0xC0, 0x01, 0xFC, - 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xE0, 0x00, 0xFC, 0x0F, 0xF0, 0x7F, 0xC3, 0xFF, 0x0F, 0xFC, - 0x3F, 0xC0, 0xFE, 0x03, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, - 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x1F, 0xC0, 0xFF, 0x0F, 0xFC, - 0x3F, 0xE0, 0xFF, 0x03, 0xFE, 0x0F, 0xFC, 0x07, 0xF0, 0x0F, 0xC0, 0x3F, - 0x00, 0xFC, 0x03, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F, - 0xC0, 0x3F, 0x80, 0xFE, 0x03, 0xFF, 0x0F, 0xFC, 0x1F, 0xF0, 0x3F, 0xC0, - 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x03, 0xFC, 0x0F, 0xF8, - 0x3F, 0xE0, 0xFF, 0xC1, 0xFF, 0x01, 0xFC, 0x07, 0xF0, 0x0F, 0xC0, 0x3F, - 0x00, 0xFC, 0x03, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F, - 0xC0, 0x3F, 0xC0, 0xFF, 0xC1, 0xFF, 0x03, 0xFC, 0x3F, 0xF0, 0xFF, 0xC3, - 0xF8, 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, - 0xFC, 0x03, 0xF0, 0x0F, 0xC0, 0x7F, 0x03, 0xFC, 0x3F, 0xF0, 0xFF, 0xC3, - 0xFE, 0x0F, 0xF0, 0x3F, 0x80, 0x1F, 0xC0, 0x7C, 0xFF, 0x81, 0xF7, 0xFF, - 0x87, 0x9F, 0xFF, 0xFE, 0x7F, 0xFF, 0xFB, 0xE1, 0xFF, 0xCF, 0x81, 0xFE, - 0x3C, 0x03, 0xF0 }; - -const GFXglyph Montserrat_Bold22pt7bGlyphs[] PROGMEM = { - { 0, 1, 1, 12, 0, 0 }, // 0x20 ' ' - { 1, 8, 30, 12, 2, -29 }, // 0x21 '!' - { 31, 15, 12, 19, 2, -29 }, // 0x22 '"' - { 54, 29, 30, 31, 1, -29 }, // 0x23 '#' - { 163, 25, 40, 27, 1, -34 }, // 0x24 '$' - { 288, 36, 30, 38, 1, -29 }, // 0x25 '%' - { 423, 28, 31, 31, 2, -29 }, // 0x26 '&' - { 532, 6, 12, 10, 2, -29 }, // 0x27 ''' - { 541, 12, 40, 15, 3, -31 }, // 0x28 '(' - { 601, 12, 40, 15, 0, -31 }, // 0x29 ')' - { 661, 17, 17, 19, 1, -31 }, // 0x2A '*' - { 698, 20, 20, 26, 3, -24 }, // 0x2B '+' - { 748, 9, 15, 11, 1, -7 }, // 0x2C ',' - { 765, 12, 6, 17, 2, -14 }, // 0x2D '-' - { 774, 9, 8, 11, 1, -7 }, // 0x2E '.' - { 783, 20, 40, 17, -1, -35 }, // 0x2F '/' - { 883, 25, 32, 29, 2, -30 }, // 0x30 '0' - { 983, 13, 30, 17, 0, -29 }, // 0x31 '1' - { 1032, 24, 31, 25, 0, -30 }, // 0x32 '2' - { 1125, 24, 31, 25, 0, -29 }, // 0x33 '3' - { 1218, 28, 30, 30, 1, -29 }, // 0x34 '4' - { 1323, 24, 31, 26, 0, -29 }, // 0x35 '5' - { 1416, 25, 32, 27, 2, -30 }, // 0x36 '6' - { 1516, 24, 30, 27, 1, -29 }, // 0x37 '7' - { 1606, 26, 32, 28, 1, -30 }, // 0x38 '8' - { 1710, 25, 32, 27, 1, -30 }, // 0x39 '9' - { 1810, 9, 23, 11, 1, -22 }, // 0x3A ':' - { 1836, 9, 30, 11, 1, -22 }, // 0x3B ';' - { 1870, 20, 22, 26, 3, -25 }, // 0x3C '<' - { 1925, 20, 16, 26, 3, -22 }, // 0x3D '=' - { 1965, 20, 22, 26, 3, -25 }, // 0x3E '>' - { 2020, 23, 31, 25, 0, -30 }, // 0x3F '?' - { 2110, 41, 40, 45, 2, -30 }, // 0x40 '@' - { 2315, 33, 30, 33, 0, -29 }, // 0x41 'A' - { 2439, 27, 30, 33, 4, -29 }, // 0x42 'B' - { 2541, 28, 32, 31, 2, -30 }, // 0x43 'C' - { 2653, 30, 30, 36, 4, -29 }, // 0x44 'D' - { 2766, 23, 30, 29, 4, -29 }, // 0x45 'E' - { 2853, 22, 30, 27, 4, -29 }, // 0x46 'F' - { 2936, 29, 32, 33, 2, -30 }, // 0x47 'G' - { 3052, 27, 30, 35, 4, -29 }, // 0x48 'H' - { 3154, 7, 30, 14, 4, -29 }, // 0x49 'I' - { 3181, 21, 31, 23, -1, -29 }, // 0x4A 'J' - { 3263, 28, 30, 32, 4, -29 }, // 0x4B 'K' - { 3368, 22, 30, 26, 4, -29 }, // 0x4C 'L' - { 3451, 34, 30, 41, 4, -29 }, // 0x4D 'M' - { 3579, 27, 30, 35, 4, -29 }, // 0x4E 'N' - { 3681, 33, 32, 36, 2, -30 }, // 0x4F 'O' - { 3813, 26, 30, 31, 4, -29 }, // 0x50 'P' - { 3911, 34, 38, 36, 2, -30 }, // 0x51 'Q' - { 4073, 26, 30, 32, 4, -29 }, // 0x52 'R' - { 4171, 25, 32, 27, 1, -30 }, // 0x53 'S' - { 4271, 26, 30, 27, 0, -29 }, // 0x54 'T' - { 4369, 28, 31, 34, 3, -29 }, // 0x55 'U' - { 4478, 33, 30, 32, 0, -29 }, // 0x56 'V' - { 4602, 48, 30, 50, 1, -29 }, // 0x57 'W' - { 4782, 31, 30, 31, 0, -29 }, // 0x58 'X' - { 4899, 31, 30, 29, -1, -29 }, // 0x59 'Y' - { 5016, 26, 30, 29, 2, -29 }, // 0x5A 'Z' - { 5114, 11, 40, 16, 4, -31 }, // 0x5B '[' - { 5169, 20, 40, 17, -2, -35 }, // 0x5C '\' - { 5269, 11, 40, 16, 1, -31 }, // 0x5D ']' - { 5324, 21, 18, 26, 2, -23 }, // 0x5E '^' - { 5372, 22, 4, 22, 0, 1 }, // 0x5F '_' - { 5383, 13, 6, 26, 4, -31 }, // 0x60 '`' - { 5393, 22, 23, 27, 2, -22 }, // 0x61 'a' - { 5457, 25, 32, 30, 3, -31 }, // 0x62 'b' - { 5557, 24, 23, 25, 1, -22 }, // 0x63 'c' - { 5626, 26, 32, 30, 1, -31 }, // 0x64 'd' - { 5730, 25, 23, 27, 1, -22 }, // 0x65 'e' - { 5802, 18, 32, 17, 0, -31 }, // 0x66 'f' - { 5874, 26, 32, 30, 1, -22 }, // 0x67 'g' - { 5978, 24, 32, 30, 3, -31 }, // 0x68 'h' - { 6074, 8, 34, 13, 3, -33 }, // 0x69 'i' - { 6108, 15, 43, 13, -4, -33 }, // 0x6A 'j' - { 6189, 25, 32, 28, 3, -31 }, // 0x6B 'k' - { 6289, 7, 32, 13, 3, -31 }, // 0x6C 'l' - { 6317, 39, 23, 45, 3, -22 }, // 0x6D 'm' - { 6430, 24, 23, 30, 3, -22 }, // 0x6E 'n' - { 6499, 26, 23, 28, 1, -22 }, // 0x6F 'o' - { 6574, 25, 31, 30, 3, -22 }, // 0x70 'p' - { 6671, 26, 31, 30, 1, -22 }, // 0x71 'q' - { 6772, 14, 23, 19, 3, -22 }, // 0x72 'r' - { 6813, 21, 23, 23, 1, -22 }, // 0x73 's' - { 6874, 18, 28, 19, 0, -27 }, // 0x74 't' - { 6937, 23, 23, 30, 3, -22 }, // 0x75 'u' - { 7004, 26, 23, 26, 0, -22 }, // 0x76 'v' - { 7079, 40, 23, 40, 0, -22 }, // 0x77 'w' - { 7194, 25, 23, 26, 0, -22 }, // 0x78 'x' - { 7266, 26, 32, 26, 0, -22 }, // 0x79 'y' - { 7370, 21, 23, 23, 1, -22 }, // 0x7A 'z' - { 7431, 14, 40, 17, 2, -31 }, // 0x7B '{' - { 7501, 6, 40, 13, 4, -31 }, // 0x7C '|' - { 7531, 14, 40, 17, 1, -31 }, // 0x7D '}' - { 7601, 22, 8, 26, 2, -18 } }; // 0x7E '~' - -const GFXfont Montserrat_Bold22pt7b PROGMEM = { - (uint8_t *)Montserrat_Bold22pt7bBitmaps, - (GFXglyph *)Montserrat_Bold22pt7bGlyphs, - 0x20, 0x7E, 53 }; - -// Approx. 8295 bytes - -#endif // MONTSERRATBOLD22PT7B_H diff --git a/examples/companion_radio/ui-new/fonts/MontserratBold24pt7b.h b/examples/companion_radio/ui-new/fonts/MontserratBold24pt7b.h deleted file mode 100644 index 485d40a2..00000000 --- a/examples/companion_radio/ui-new/fonts/MontserratBold24pt7b.h +++ /dev/null @@ -1,873 +0,0 @@ -#ifndef MONTSERRATBOLD24PT7B_H -#define MONTSERRATBOLD24PT7B_H -const uint8_t Montserrat_Bold24pt7bBitmaps[] PROGMEM = { - 0x00, 0xFF, 0xBF, 0xDF, 0xEF, 0xF7, 0xFB, 0xFD, 0xFE, 0xFF, 0x7F, 0xBF, - 0xDF, 0xCF, 0xE7, 0xF3, 0xF9, 0xFC, 0xFE, 0x3F, 0x1F, 0x8F, 0xC7, 0xE3, - 0xF1, 0xF8, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0xCF, 0xFF, 0xFF, 0xFD, 0xFE, - 0xFF, 0x3F, 0x00, 0xFE, 0x3F, 0xFF, 0x1F, 0xFF, 0x0F, 0xDF, 0x87, 0xEF, - 0xC3, 0xF7, 0xE1, 0xF9, 0xF0, 0x7C, 0xF8, 0x3E, 0x7C, 0x1F, 0x3E, 0x0F, - 0x9F, 0x07, 0xCF, 0x83, 0xE7, 0xC1, 0xF0, 0x00, 0x7C, 0x07, 0xE0, 0x00, - 0x7C, 0x07, 0xE0, 0x00, 0x7C, 0x07, 0xC0, 0x00, 0x7C, 0x07, 0xC0, 0x00, - 0x7C, 0x07, 0xC0, 0x00, 0x7C, 0x07, 0xC0, 0x00, 0xFC, 0x07, 0xC0, 0x00, - 0xFC, 0x0F, 0xC0, 0x3F, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0x3F, - 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0x00, - 0xF8, 0x0F, 0x80, 0x01, 0xF8, 0x0F, 0x80, 0x01, 0xF8, 0x1F, 0x80, 0x01, - 0xF0, 0x1F, 0x80, 0x01, 0xF0, 0x1F, 0x80, 0x01, 0xF0, 0x1F, 0x00, 0x01, - 0xF0, 0x1F, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, - 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFC, 0x03, - 0xE0, 0x3F, 0x00, 0x03, 0xE0, 0x3E, 0x00, 0x03, 0xE0, 0x3E, 0x00, 0x03, - 0xE0, 0x3E, 0x00, 0x03, 0xE0, 0x3E, 0x00, 0x07, 0xE0, 0x3E, 0x00, 0x07, - 0xE0, 0x7E, 0x00, 0x07, 0xE0, 0x7E, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, - 0xF8, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x0F, 0x80, - 0x00, 0x00, 0xF8, 0x00, 0x00, 0xFF, 0xFC, 0x00, 0x3F, 0xFF, 0xF8, 0x0F, - 0xFF, 0xFF, 0xC1, 0xFF, 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, - 0xF8, 0x3F, 0xCF, 0x8F, 0x87, 0xF8, 0xF8, 0x30, 0x7F, 0x8F, 0x80, 0x07, - 0xF8, 0xF8, 0x00, 0x7F, 0x8F, 0x80, 0x07, 0xFC, 0xF8, 0x00, 0x7F, 0xFF, - 0x80, 0x03, 0xFF, 0xF8, 0x00, 0x3F, 0xFF, 0xE0, 0x01, 0xFF, 0xFF, 0xC0, - 0x0F, 0xFF, 0xFF, 0x00, 0x3F, 0xFF, 0xF8, 0x00, 0xFF, 0xFF, 0xC0, 0x00, - 0xFF, 0xFE, 0x00, 0x0F, 0xFF, 0xE0, 0x00, 0xF9, 0xFF, 0x00, 0x0F, 0x8F, - 0xF0, 0x00, 0xF8, 0xFF, 0x10, 0x0F, 0x8F, 0xF3, 0x80, 0xF8, 0xFE, 0x3F, - 0x0F, 0x9F, 0xE7, 0xFF, 0xFF, 0xFE, 0x7F, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, - 0xF8, 0x7F, 0xFF, 0xFF, 0x01, 0xFF, 0xFF, 0xE0, 0x03, 0xFF, 0xF8, 0x00, - 0x00, 0xF8, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x0F, - 0x80, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x07, 0xF0, 0x00, - 0x0F, 0x80, 0x3F, 0xF8, 0x00, 0x3F, 0x00, 0xFF, 0xF8, 0x00, 0xFC, 0x01, - 0xFF, 0xF0, 0x01, 0xF0, 0x07, 0xC1, 0xF0, 0x07, 0xE0, 0x0F, 0x83, 0xE0, - 0x1F, 0x80, 0x3E, 0x03, 0xC0, 0x3E, 0x00, 0x7C, 0x07, 0xC0, 0xFC, 0x00, - 0xF8, 0x0F, 0x83, 0xF0, 0x01, 0xF0, 0x1F, 0x07, 0xC0, 0x03, 0xE0, 0x3C, - 0x1F, 0x80, 0x03, 0xC0, 0x78, 0x7E, 0x00, 0x07, 0xC1, 0xF0, 0xF8, 0x00, - 0x0F, 0xC7, 0xE3, 0xE0, 0x00, 0x0F, 0xFF, 0x8F, 0xC0, 0x00, 0x0F, 0xFE, - 0x1F, 0x03, 0xC0, 0x0F, 0xF8, 0x7C, 0x3F, 0xE0, 0x07, 0xC1, 0xF8, 0xFF, - 0xE0, 0x00, 0x07, 0xE3, 0xFF, 0xE0, 0x00, 0x0F, 0x87, 0xC7, 0xE0, 0x00, - 0x3F, 0x1F, 0x07, 0xC0, 0x00, 0xFC, 0x3E, 0x07, 0xC0, 0x01, 0xF0, 0x78, - 0x0F, 0x80, 0x07, 0xE0, 0xF0, 0x1F, 0x00, 0x1F, 0x81, 0xE0, 0x3E, 0x00, - 0x3E, 0x03, 0xC0, 0x7C, 0x00, 0xFC, 0x07, 0xC0, 0xF8, 0x03, 0xF0, 0x0F, - 0x81, 0xF0, 0x07, 0xC0, 0x1F, 0x87, 0xC0, 0x1F, 0x80, 0x1F, 0xFF, 0x80, - 0x7E, 0x00, 0x1F, 0xFE, 0x00, 0xF8, 0x00, 0x3F, 0xF8, 0x03, 0xF0, 0x00, - 0x1F, 0xE0, 0x00, 0x7F, 0xE0, 0x00, 0x03, 0xFF, 0xE0, 0x00, 0x0F, 0xFF, - 0xE0, 0x00, 0x3F, 0xFF, 0xE0, 0x00, 0xFF, 0xFF, 0xE0, 0x01, 0xFC, 0x1F, - 0xC0, 0x03, 0xF0, 0x1F, 0x80, 0x07, 0xE0, 0x3F, 0x00, 0x0F, 0xC0, 0x7E, - 0x00, 0x1F, 0xC1, 0xFC, 0x00, 0x3F, 0x87, 0xF0, 0x00, 0x7F, 0xBF, 0xE0, - 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x7F, 0xF8, 0x00, - 0x01, 0xFF, 0xC0, 0x00, 0x0F, 0xFF, 0xC0, 0xC0, 0x3F, 0xFF, 0xC1, 0xF0, - 0xFF, 0xFF, 0xC3, 0xF3, 0xFC, 0x7F, 0xC7, 0xE7, 0xF0, 0x7F, 0xDF, 0xDF, - 0xC0, 0x7F, 0xFF, 0x3F, 0x80, 0x7F, 0xFE, 0x7F, 0x00, 0x7F, 0xF8, 0xFE, - 0x00, 0x7F, 0xF1, 0xFC, 0x00, 0x7F, 0xE3, 0xFC, 0x00, 0xFF, 0xE7, 0xFE, - 0x0F, 0xFF, 0xE7, 0xFF, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xFF, 0xC7, 0xFF, - 0xFF, 0x3F, 0x07, 0xFF, 0xFC, 0x3C, 0x03, 0xFF, 0xE0, 0x30, 0x00, 0x30, - 0x00, 0x00, 0xFF, 0xFF, 0xF7, 0xEF, 0xDF, 0x9F, 0x3E, 0x7C, 0xF9, 0xF3, - 0xE7, 0xC0, 0x03, 0xF8, 0x3F, 0xC1, 0xFC, 0x1F, 0xE0, 0xFE, 0x0F, 0xF0, - 0x7F, 0x03, 0xF8, 0x3F, 0xC1, 0xFC, 0x0F, 0xE0, 0x7F, 0x07, 0xF8, 0x3F, - 0x81, 0xFC, 0x0F, 0xE0, 0x7F, 0x03, 0xF8, 0x1F, 0xC1, 0xFE, 0x0F, 0xF0, - 0x7F, 0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x03, 0xF8, 0x1F, 0xC0, 0xFE, 0x07, - 0xF0, 0x3F, 0x81, 0xFC, 0x0F, 0xF0, 0x3F, 0x81, 0xFC, 0x0F, 0xE0, 0x7F, - 0x81, 0xFC, 0x0F, 0xE0, 0x7F, 0x81, 0xFC, 0x0F, 0xE0, 0x3F, 0x81, 0xFC, - 0x07, 0xF0, 0x7F, 0x03, 0xF8, 0x0F, 0xE0, 0x7F, 0x01, 0xFC, 0x0F, 0xE0, - 0x7F, 0x81, 0xFC, 0x0F, 0xE0, 0x7F, 0x81, 0xFC, 0x0F, 0xE0, 0x7F, 0x03, - 0xFC, 0x0F, 0xE0, 0x7F, 0x03, 0xF8, 0x1F, 0xC0, 0xFE, 0x07, 0xF0, 0x3F, - 0x81, 0xFC, 0x0F, 0xE0, 0x7F, 0x03, 0xF8, 0x1F, 0xC0, 0xFE, 0x07, 0xF0, - 0x3F, 0x81, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0xF0, 0x3F, 0x81, 0xFC, 0x1F, - 0xE0, 0xFE, 0x07, 0xF0, 0x7F, 0x03, 0xF8, 0x3F, 0xC1, 0xFC, 0x1F, 0xC0, - 0xFE, 0x00, 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x07, 0x80, 0x30, 0xF0, 0xC7, - 0x9E, 0x3D, 0xFB, 0xDF, 0xBF, 0xFF, 0xFB, 0xFF, 0xFC, 0x1F, 0xFE, 0x00, - 0xFF, 0x80, 0x7F, 0xFC, 0x3F, 0xFF, 0xEF, 0xFF, 0xFF, 0xFB, 0xDF, 0x9C, - 0x78, 0xE1, 0x0F, 0x04, 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x07, 0x80, 0x00, - 0x00, 0xFC, 0x00, 0x03, 0xF0, 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0x00, 0x00, - 0xFC, 0x00, 0x03, 0xF0, 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0x00, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, - 0x03, 0xF0, 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0x00, 0x00, 0xFC, 0x00, 0x03, - 0xF0, 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0x00, 0x00, 0xFC, 0x00, 0x1C, 0x3F, - 0x3F, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x3F, 0x1F, 0x0F, 0x8F, 0xC7, - 0xC3, 0xE1, 0xE1, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xF0, 0x18, 0x3F, 0x3F, 0xDF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFE, - 0x7E, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xF0, 0x00, 0x1F, 0xC0, 0x00, - 0x7E, 0x00, 0x01, 0xF8, 0x00, 0x0F, 0xE0, 0x00, 0x3F, 0x00, 0x01, 0xFC, - 0x00, 0x07, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0xFE, 0x00, 0x03, 0xF8, 0x00, - 0x0F, 0xC0, 0x00, 0x7F, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xE0, 0x00, 0x3F, - 0x80, 0x00, 0xFE, 0x00, 0x03, 0xF0, 0x00, 0x1F, 0xC0, 0x00, 0x7E, 0x00, - 0x01, 0xF8, 0x00, 0x0F, 0xE0, 0x00, 0x3F, 0x00, 0x00, 0xFC, 0x00, 0x07, - 0xF0, 0x00, 0x1F, 0x80, 0x00, 0xFE, 0x00, 0x03, 0xF8, 0x00, 0x0F, 0xC0, - 0x00, 0x7F, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xE0, 0x00, 0x3F, 0x80, 0x00, - 0xFE, 0x00, 0x03, 0xF0, 0x00, 0x1F, 0xC0, 0x00, 0x7F, 0x00, 0x01, 0xF8, - 0x00, 0x0F, 0xE0, 0x00, 0x3F, 0x00, 0x00, 0xFC, 0x00, 0x07, 0xF0, 0x00, - 0x1F, 0x80, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x7F, 0xE0, 0x00, 0x1F, 0xFF, - 0x80, 0x07, 0xFF, 0xFE, 0x00, 0xFF, 0xFF, 0xF0, 0x1F, 0xFF, 0xFF, 0x01, - 0xFF, 0xFF, 0xF8, 0x3F, 0xF0, 0xFF, 0xC3, 0xFC, 0x03, 0xFC, 0x7F, 0x80, - 0x1F, 0xE7, 0xF8, 0x01, 0xFE, 0xFF, 0x00, 0x0F, 0xEF, 0xF0, 0x00, 0xFF, - 0xFF, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0x00, 0x0F, 0xFF, 0xF0, - 0x00, 0xFF, 0xFF, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0x00, 0x0F, - 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, - 0x00, 0x0F, 0xE7, 0xF8, 0x01, 0xFE, 0x7F, 0x80, 0x1F, 0xE3, 0xFC, 0x03, - 0xFC, 0x3F, 0xE0, 0x7F, 0xC1, 0xFF, 0xFF, 0xF8, 0x1F, 0xFF, 0xFF, 0x80, - 0xFF, 0xFF, 0xF0, 0x07, 0xFF, 0xFE, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0xFF, - 0xE0, 0x00, 0x00, 0x60, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x7F, 0x80, 0xFF, 0x01, 0xFE, 0x03, 0xFC, - 0x07, 0xF8, 0x0F, 0xF0, 0x1F, 0xE0, 0x3F, 0xC0, 0x7F, 0x80, 0xFF, 0x01, - 0xFE, 0x03, 0xFC, 0x07, 0xF8, 0x0F, 0xF0, 0x1F, 0xE0, 0x3F, 0xC0, 0x7F, - 0x80, 0xFF, 0x01, 0xFE, 0x03, 0xFC, 0x07, 0xF8, 0x0F, 0xF0, 0x1F, 0xE0, - 0x3F, 0xC0, 0x7F, 0x80, 0xFF, 0x01, 0xFE, 0x01, 0xFF, 0xE0, 0x01, 0xFF, - 0xFE, 0x01, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xF8, 0x7F, 0xFF, 0xFF, 0x3F, - 0xFF, 0xFF, 0xE7, 0xF8, 0x1F, 0xF8, 0x78, 0x01, 0xFE, 0x0C, 0x00, 0x7F, - 0x80, 0x00, 0x0F, 0xE0, 0x00, 0x03, 0xF8, 0x00, 0x01, 0xFE, 0x00, 0x00, - 0x7F, 0x80, 0x00, 0x1F, 0xE0, 0x00, 0x0F, 0xF0, 0x00, 0x07, 0xFC, 0x00, - 0x03, 0xFE, 0x00, 0x01, 0xFF, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x7F, 0xC0, - 0x00, 0x3F, 0xE0, 0x00, 0x3F, 0xF0, 0x00, 0x1F, 0xF8, 0x00, 0x0F, 0xFC, - 0x00, 0x07, 0xFE, 0x00, 0x03, 0xFF, 0x00, 0x01, 0xFF, 0x80, 0x00, 0xFF, - 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, 0xFC, - 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xC0, 0x3F, 0xFF, 0xFF, 0x8F, 0xFF, - 0xFF, 0xE3, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFE, 0x3F, 0xFF, 0xFF, 0x8F, - 0xFF, 0xFF, 0xC0, 0x00, 0x1F, 0xE0, 0x00, 0x0F, 0xF0, 0x00, 0x03, 0xFC, - 0x00, 0x01, 0xFE, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x3F, - 0xC0, 0x00, 0x1F, 0xE0, 0x00, 0x07, 0xFF, 0x80, 0x01, 0xFF, 0xF0, 0x00, - 0x7F, 0xFF, 0x00, 0x1F, 0xFF, 0xC0, 0x07, 0xFF, 0xF8, 0x00, 0x03, 0xFF, - 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x0F, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, - 0xFF, 0x00, 0x00, 0x3F, 0xCE, 0x00, 0x1F, 0xF3, 0xF0, 0x0F, 0xF9, 0xFF, - 0xFF, 0xFE, 0x7F, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xC7, 0xFF, 0xFF, 0xE0, - 0xFF, 0xFF, 0xE0, 0x07, 0xFF, 0xE0, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x3F, - 0xC0, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x07, 0xF8, - 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x00, 0xFF, 0x00, - 0x00, 0x03, 0xFC, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x1F, 0xE0, 0x00, - 0x00, 0x7F, 0x80, 0x00, 0x01, 0xFE, 0x0F, 0xF0, 0x07, 0xFC, 0x1F, 0xE0, - 0x0F, 0xF0, 0x3F, 0xC0, 0x3F, 0xC0, 0x7F, 0x80, 0xFF, 0x80, 0xFF, 0x01, - 0xFE, 0x01, 0xFE, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, - 0x03, 0xFC, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, - 0x1F, 0xE0, 0x00, 0x00, 0x3F, 0xC0, 0x07, 0xFF, 0xFF, 0x81, 0xFF, 0xFF, - 0xF0, 0x3F, 0xFF, 0xFE, 0x07, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xF8, 0x1F, - 0xFF, 0xFF, 0x03, 0xF8, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x0F, 0xE0, 0x00, - 0x01, 0xFC, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x01, 0xFF, - 0xE0, 0x00, 0x3F, 0xFF, 0xE0, 0x07, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xF8, - 0x1F, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0xF0, 0x7F, 0xFF, 0xFF, 0x00, 0x00, - 0x3F, 0xE0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x07, 0xF8, - 0x00, 0x00, 0xFF, 0x10, 0x00, 0x1F, 0xE3, 0x80, 0x07, 0xF8, 0xFC, 0x01, - 0xFF, 0x1F, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFE, 0x1F, - 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xE0, 0x03, 0xFF, 0xF0, 0x00, 0x01, 0x80, - 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x1F, 0xFF, 0xF0, 0x0F, 0xFF, 0xFE, 0x03, - 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xF0, 0x3F, 0xFF, 0xFE, 0x07, 0xFE, 0x01, - 0x81, 0xFF, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x0F, 0xF0, 0x00, 0x01, 0xFE, - 0x00, 0x00, 0x7F, 0x80, 0x00, 0x0F, 0xF0, 0x3C, 0x01, 0xFE, 0x7F, 0xF0, - 0x3F, 0xFF, 0xFF, 0x87, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, - 0xFF, 0xFB, 0xFF, 0xC1, 0xFF, 0x7F, 0xE0, 0x1F, 0xFF, 0xF8, 0x01, 0xFF, - 0xFF, 0x00, 0x3F, 0xFF, 0xC0, 0x03, 0xFB, 0xF8, 0x00, 0x7F, 0x7F, 0x80, - 0x1F, 0xEF, 0xF0, 0x03, 0xFC, 0xFF, 0x00, 0xFF, 0x1F, 0xF8, 0x7F, 0xE1, - 0xFF, 0xFF, 0xF8, 0x1F, 0xFF, 0xFE, 0x01, 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, - 0xE0, 0x00, 0xFF, 0xF0, 0x00, 0x00, 0x40, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0x80, 0x0F, 0xF7, 0xF0, 0x03, 0xFE, 0xFE, - 0x00, 0x7F, 0x9F, 0xC0, 0x1F, 0xF3, 0xF8, 0x03, 0xFC, 0x7F, 0x00, 0x7F, - 0x80, 0x00, 0x1F, 0xE0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0xFF, 0x00, 0x00, - 0x1F, 0xE0, 0x00, 0x07, 0xFC, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x3F, 0xE0, - 0x00, 0x07, 0xF8, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x07, - 0xF8, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x0F, 0xF8, 0x00, - 0x01, 0xFE, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x0F, 0xF0, 0x00, 0x01, 0xFE, - 0x00, 0x00, 0x7F, 0x80, 0x00, 0x0F, 0xF0, 0x00, 0x03, 0xFE, 0x00, 0x00, - 0x01, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0xF8, 0x0F, 0xFF, - 0xFF, 0x83, 0xFF, 0xFF, 0xF8, 0xFF, 0xC1, 0xFF, 0x9F, 0xF0, 0x0F, 0xF3, - 0xFC, 0x01, 0xFE, 0x7F, 0x00, 0x1F, 0xCF, 0xE0, 0x03, 0xF9, 0xFE, 0x00, - 0xFF, 0x3F, 0xC0, 0x1F, 0xE3, 0xFC, 0x07, 0xF8, 0x7F, 0xFF, 0xFF, 0x07, - 0xFF, 0xFF, 0xC0, 0x7F, 0xFF, 0xF0, 0x1F, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, - 0xF1, 0xFF, 0xFF, 0xFF, 0x3F, 0xC0, 0x1F, 0xEF, 0xF0, 0x01, 0xFF, 0xFE, - 0x00, 0x3F, 0xFF, 0x80, 0x03, 0xFF, 0xF0, 0x00, 0x7F, 0xFF, 0x00, 0x1F, - 0xFF, 0xE0, 0x03, 0xFF, 0xFE, 0x00, 0xFF, 0xBF, 0xF0, 0x7F, 0xE7, 0xFF, - 0xFF, 0xFC, 0x7F, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xC0, 0x7F, 0xFF, 0xF0, - 0x01, 0xFF, 0xF0, 0x00, 0x00, 0xA0, 0x00, 0x01, 0xFF, 0xC0, 0x00, 0xFF, - 0xFE, 0x00, 0x3F, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xF0, - 0xFF, 0xC3, 0xFF, 0x1F, 0xE0, 0x1F, 0xE7, 0xF8, 0x01, 0xFE, 0xFF, 0x00, - 0x3F, 0xDF, 0xC0, 0x03, 0xFB, 0xF8, 0x00, 0x7F, 0xFF, 0x80, 0x1F, 0xFF, - 0xF0, 0x03, 0xFF, 0xFF, 0x00, 0xFF, 0xDF, 0xF0, 0x3F, 0xFB, 0xFF, 0xFF, - 0xFF, 0x3F, 0xFF, 0xFF, 0xE3, 0xFF, 0xFF, 0xFC, 0x3F, 0xFF, 0xFF, 0x81, - 0xFF, 0xCF, 0xF0, 0x07, 0xC1, 0xFE, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x0F, - 0xF0, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x1F, 0xF0, 0x20, - 0x0F, 0xFC, 0x0F, 0xFF, 0xFF, 0x81, 0xFF, 0xFF, 0xE0, 0x7F, 0xFF, 0xF8, - 0x0F, 0xFF, 0xFE, 0x03, 0xFF, 0xFF, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0x0C, - 0x00, 0x00, 0x18, 0x3F, 0x3F, 0xDF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFE, 0x7E, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x1F, 0x9F, - 0xEF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0x3F, 0x00, 0x18, 0x3F, 0x3F, 0xDF, - 0xFF, 0xFF, 0xFF, 0xFD, 0xFE, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x0E, 0x1F, 0x9F, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x1F, 0x8F, 0x87, 0xC7, 0xE3, 0xE1, 0xF0, 0xF0, 0xF8, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0xC0, 0x01, 0xFF, 0x00, 0x3F, 0xFC, - 0x03, 0xFF, 0xF0, 0x7F, 0xFF, 0x87, 0xFF, 0xF0, 0xFF, 0xFE, 0x03, 0xFF, - 0xC0, 0x0F, 0xFC, 0x00, 0x3F, 0x80, 0x00, 0xFF, 0x80, 0x03, 0xFF, 0xC0, - 0x0F, 0xFF, 0xE0, 0x0F, 0xFF, 0xF0, 0x07, 0xFF, 0xF0, 0x07, 0xFF, 0xF0, - 0x03, 0xFF, 0xC0, 0x01, 0xFF, 0x00, 0x01, 0xFC, 0x00, 0x00, 0xF0, 0x00, - 0x00, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFC, 0x80, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0xE0, 0x00, 0x3F, 0xE0, 0x00, - 0xFF, 0xF0, 0x03, 0xFF, 0xF0, 0x03, 0xFF, 0xF8, 0x03, 0xFF, 0xFC, 0x01, - 0xFF, 0xFC, 0x00, 0xFF, 0xF0, 0x00, 0x7F, 0xC0, 0x00, 0x7F, 0x00, 0x07, - 0xFC, 0x00, 0xFF, 0xF0, 0x1F, 0xFF, 0xC1, 0xFF, 0xFC, 0x3F, 0xFF, 0x83, - 0xFF, 0xF8, 0x0F, 0xFF, 0x00, 0x3F, 0xE0, 0x00, 0xFE, 0x00, 0x03, 0xC0, - 0x00, 0x0C, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xE0, 0x03, 0xFF, 0xFC, 0x07, - 0xFF, 0xFF, 0x87, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xFD, - 0xFE, 0x03, 0xFE, 0x3C, 0x00, 0xFF, 0x0C, 0x00, 0x7F, 0x80, 0x00, 0x1F, - 0xC0, 0x00, 0x1F, 0xE0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, - 0xF0, 0x00, 0x0F, 0xF8, 0x00, 0x0F, 0xF8, 0x00, 0x0F, 0xF8, 0x00, 0x0F, - 0xF0, 0x00, 0x07, 0xF8, 0x00, 0x07, 0xF8, 0x00, 0x03, 0xF8, 0x00, 0x01, - 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0F, 0x80, 0x00, 0x0F, 0xE0, 0x00, 0x07, 0xF8, 0x00, 0x07, 0xFC, 0x00, - 0x03, 0xFE, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x1F, 0x80, - 0x00, 0x00, 0x00, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xF8, 0x00, - 0x00, 0x07, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, - 0x1F, 0xFC, 0x01, 0xFF, 0xC0, 0x01, 0xFF, 0x00, 0x01, 0xFF, 0x00, 0x1F, - 0xE0, 0x00, 0x03, 0xFC, 0x01, 0xFE, 0x00, 0x00, 0x07, 0xF0, 0x0F, 0xC0, - 0x00, 0x00, 0x1F, 0x80, 0xFC, 0x00, 0x00, 0x00, 0x7E, 0x0F, 0xC0, 0x3F, - 0xE3, 0xF1, 0xF0, 0x7E, 0x03, 0xFF, 0xDF, 0x87, 0xC7, 0xE0, 0x7F, 0xFF, - 0xFC, 0x3E, 0x3F, 0x07, 0xFF, 0xFF, 0xE0, 0xF9, 0xF0, 0x3F, 0xFF, 0xFF, - 0x07, 0xDF, 0x83, 0xFE, 0x0F, 0xF8, 0x3E, 0xFC, 0x1F, 0xC0, 0x3F, 0xC0, - 0xFF, 0xC1, 0xFC, 0x00, 0xFE, 0x07, 0xFE, 0x0F, 0xE0, 0x03, 0xF0, 0x3F, - 0xF0, 0x7F, 0x00, 0x1F, 0x81, 0xFF, 0x83, 0xF0, 0x00, 0xFC, 0x0F, 0xFC, - 0x1F, 0x80, 0x07, 0xE0, 0x7F, 0xE0, 0xFC, 0x00, 0x3F, 0x03, 0xFF, 0x07, - 0xF0, 0x01, 0xF8, 0x1F, 0xF8, 0x3F, 0x80, 0x1F, 0xC0, 0xF7, 0xE1, 0xFC, - 0x00, 0xFE, 0x0F, 0xBF, 0x07, 0xF0, 0x0F, 0xF0, 0x7C, 0xF8, 0x3F, 0xE1, - 0xFF, 0xC7, 0xE7, 0xE0, 0xFF, 0xFF, 0xFF, 0xFE, 0x3F, 0x07, 0xFF, 0xFF, - 0xFF, 0xE0, 0xFC, 0x1F, 0xFF, 0xDF, 0xFF, 0x07, 0xE0, 0x3F, 0xFC, 0x7F, - 0xF0, 0x1F, 0x80, 0xFF, 0x81, 0xFE, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, - 0x03, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x00, 0x00, - 0x3F, 0xC0, 0x00, 0x10, 0x00, 0x00, 0xFF, 0xC0, 0x07, 0x80, 0x00, 0x03, - 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x0F, - 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x1F, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x03, - 0xE0, 0x00, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x3F, 0xC0, 0x00, - 0x00, 0x07, 0xFE, 0x00, 0x00, 0x00, 0x7F, 0xE0, 0x00, 0x00, 0x0F, 0xFF, - 0x00, 0x00, 0x00, 0xFF, 0xF0, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x01, - 0xFF, 0xF8, 0x00, 0x00, 0x3F, 0xFF, 0xC0, 0x00, 0x03, 0xF9, 0xFC, 0x00, - 0x00, 0x3F, 0x9F, 0xC0, 0x00, 0x07, 0xF0, 0xFE, 0x00, 0x00, 0x7F, 0x0F, - 0xE0, 0x00, 0x0F, 0xE0, 0xFF, 0x00, 0x00, 0xFE, 0x07, 0xF0, 0x00, 0x1F, - 0xE0, 0x7F, 0x80, 0x01, 0xFC, 0x03, 0xF8, 0x00, 0x3F, 0xC0, 0x3F, 0xC0, - 0x03, 0xF8, 0x03, 0xFC, 0x00, 0x3F, 0x80, 0x1F, 0xC0, 0x07, 0xFF, 0xFF, - 0xFE, 0x00, 0x7F, 0xFF, 0xFF, 0xE0, 0x0F, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, - 0xFF, 0xFF, 0xF0, 0x1F, 0xFF, 0xFF, 0xFF, 0x81, 0xFF, 0xFF, 0xFF, 0xF8, - 0x3F, 0xC0, 0x00, 0x3F, 0xC3, 0xFC, 0x00, 0x03, 0xFC, 0x3F, 0x80, 0x00, - 0x1F, 0xC7, 0xF8, 0x00, 0x01, 0xFE, 0x7F, 0x00, 0x00, 0x1F, 0xEF, 0xF0, - 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x0F, 0xF0, 0xFF, 0xFF, 0xF8, 0x03, - 0xFF, 0xFF, 0xFC, 0x0F, 0xFF, 0xFF, 0xF8, 0x3F, 0xFF, 0xFF, 0xF0, 0xFF, - 0xFF, 0xFF, 0xE3, 0xFF, 0xFF, 0xFF, 0xCF, 0xE0, 0x01, 0xFF, 0x3F, 0x80, - 0x03, 0xFC, 0xFE, 0x00, 0x07, 0xF3, 0xF8, 0x00, 0x1F, 0xCF, 0xE0, 0x00, - 0x7F, 0x3F, 0x80, 0x03, 0xFC, 0xFE, 0x00, 0x1F, 0xF3, 0xF8, 0x03, 0xFF, - 0x8F, 0xFF, 0xFF, 0xFC, 0x3F, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFF, 0xC3, - 0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xFF, 0x3F, 0x80, 0x07, 0xFE, 0xFE, - 0x00, 0x07, 0xFB, 0xF8, 0x00, 0x0F, 0xFF, 0xE0, 0x00, 0x3F, 0xFF, 0x80, - 0x00, 0xFF, 0xFE, 0x00, 0x03, 0xFF, 0xF8, 0x00, 0x0F, 0xFF, 0xE0, 0x00, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xFF, - 0xCF, 0xFF, 0xFF, 0xFE, 0x3F, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFC, 0x00, - 0x00, 0x1F, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x80, 0x07, 0xFF, 0xFF, 0xC0, - 0x1F, 0xFF, 0xFF, 0xC0, 0x7F, 0xFF, 0xFF, 0xC1, 0xFF, 0xFF, 0xFF, 0xC7, - 0xFF, 0x81, 0xFF, 0x1F, 0xF8, 0x00, 0x7C, 0x3F, 0xE0, 0x00, 0x70, 0xFF, - 0x80, 0x00, 0x41, 0xFE, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x0F, 0xF0, - 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x00, 0x7F, 0x80, - 0x00, 0x00, 0xFF, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x03, 0xFC, 0x00, - 0x00, 0x07, 0xF8, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x1F, 0xF0, 0x00, - 0x00, 0x1F, 0xE0, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x10, 0x3F, 0xE0, 0x00, - 0x70, 0x7F, 0xE0, 0x01, 0xF0, 0x7F, 0xF0, 0x0F, 0xF0, 0x7F, 0xFF, 0xFF, - 0xF0, 0x7F, 0xFF, 0xFF, 0xC0, 0x7F, 0xFF, 0xFF, 0x80, 0x7F, 0xFF, 0xFC, - 0x00, 0x3F, 0xFF, 0xF0, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0xA0, 0x00, - 0xFF, 0xFF, 0xE0, 0x00, 0x7F, 0xFF, 0xFF, 0x00, 0x3F, 0xFF, 0xFF, 0xE0, - 0x1F, 0xFF, 0xFF, 0xFC, 0x0F, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, - 0xC3, 0xFC, 0x03, 0xFF, 0xF1, 0xFE, 0x00, 0x1F, 0xF8, 0xFF, 0x00, 0x03, - 0xFE, 0x7F, 0x80, 0x00, 0xFF, 0xBF, 0xC0, 0x00, 0x3F, 0xDF, 0xE0, 0x00, - 0x1F, 0xEF, 0xF0, 0x00, 0x07, 0xFF, 0xF8, 0x00, 0x03, 0xFF, 0xFC, 0x00, - 0x01, 0xFF, 0xFE, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x7F, 0xFF, 0x80, - 0x00, 0x3F, 0xFF, 0xC0, 0x00, 0x1F, 0xFF, 0xE0, 0x00, 0x0F, 0xFF, 0xF0, - 0x00, 0x07, 0xFF, 0xF8, 0x00, 0x07, 0xFB, 0xFC, 0x00, 0x03, 0xFD, 0xFE, - 0x00, 0x03, 0xFE, 0xFF, 0x00, 0x03, 0xFE, 0x7F, 0x80, 0x07, 0xFF, 0x3F, - 0xC0, 0x1F, 0xFF, 0x1F, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0x07, - 0xFF, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xFE, 0x01, 0xFF, 0xFF, 0xFC, 0x00, - 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF8, 0x00, 0x01, 0xFC, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x00, - 0x3F, 0x80, 0x00, 0x1F, 0xC0, 0x00, 0x0F, 0xE0, 0x00, 0x07, 0xFF, 0xFF, - 0xF3, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFE, 0x7F, 0xFF, - 0xFF, 0x3F, 0xFF, 0xFF, 0x9F, 0xC0, 0x00, 0x0F, 0xE0, 0x00, 0x07, 0xF0, - 0x00, 0x03, 0xF8, 0x00, 0x01, 0xFC, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7F, - 0x00, 0x00, 0x3F, 0x80, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x01, 0xFE, - 0x00, 0x00, 0xFF, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x3F, 0xC0, 0x00, 0x1F, - 0xE0, 0x00, 0x0F, 0xF0, 0x00, 0x07, 0xF8, 0x00, 0x03, 0xFC, 0x00, 0x01, - 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFE, 0x7F, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, - 0x9F, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xE7, 0xF8, 0x00, 0x03, 0xFC, 0x00, - 0x01, 0xFE, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x3F, 0xC0, - 0x00, 0x1F, 0xE0, 0x00, 0x0F, 0xF0, 0x00, 0x07, 0xF8, 0x00, 0x03, 0xFC, - 0x00, 0x01, 0xFE, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, - 0x00, 0x00, 0x7F, 0xFF, 0xE0, 0x01, 0xFF, 0xFF, 0xF8, 0x03, 0xFF, 0xFF, - 0xFC, 0x07, 0xFF, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0xFE, 0x1F, 0xFE, 0x03, - 0xFC, 0x3F, 0xF0, 0x00, 0xF8, 0x3F, 0xE0, 0x00, 0x70, 0x7F, 0xC0, 0x00, - 0x00, 0x7F, 0x80, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x00, 0xFF, 0x00, 0x00, - 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, - 0x00, 0xFF, 0x00, 0x00, 0xFE, 0xFF, 0x00, 0x00, 0xFE, 0xFF, 0x00, 0x00, - 0xFE, 0xFF, 0x00, 0x00, 0xFE, 0xFF, 0x00, 0x00, 0xFE, 0xFF, 0x80, 0x00, - 0xFE, 0x7F, 0x80, 0x00, 0xFE, 0x7F, 0xC0, 0x00, 0xFE, 0x3F, 0xE0, 0x00, - 0xFE, 0x3F, 0xF0, 0x00, 0xFE, 0x1F, 0xFC, 0x03, 0xFE, 0x0F, 0xFF, 0xFF, - 0xFE, 0x07, 0xFF, 0xFF, 0xFE, 0x03, 0xFF, 0xFF, 0xFE, 0x01, 0xFF, 0xFF, - 0xF8, 0x00, 0x7F, 0xFF, 0xF0, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x00, 0x70, - 0x00, 0xFF, 0x00, 0x03, 0xFF, 0xFC, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0x3F, - 0xFF, 0xC0, 0x00, 0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xFC, 0x00, 0x0F, 0xFF, - 0xF0, 0x00, 0x3F, 0xFF, 0xC0, 0x00, 0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xFC, - 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0x3F, 0xFF, 0xC0, 0x00, 0xFF, 0xFF, 0x00, - 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xFC, 0x00, 0x0F, 0xFF, - 0xF0, 0x00, 0x3F, 0xFF, 0xC0, 0x00, 0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xFC, - 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0x3F, 0xFF, 0xC0, 0x00, 0xFF, 0xFF, 0x00, - 0x03, 0xFF, 0xFC, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0x3F, 0xFF, 0xC0, 0x00, - 0xFF, 0xFF, 0x00, 0x03, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0x0F, 0xFF, 0xFE, 0x1F, 0xFF, 0xFC, 0x3F, 0xFF, 0xF8, 0x7F, - 0xFF, 0xF0, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0xC0, 0x00, 0x7F, 0x80, 0x00, - 0xFF, 0x00, 0x01, 0xFE, 0x00, 0x03, 0xFC, 0x00, 0x07, 0xF8, 0x00, 0x0F, - 0xF0, 0x00, 0x1F, 0xE0, 0x00, 0x3F, 0xC0, 0x00, 0x7F, 0x80, 0x00, 0xFF, - 0x00, 0x01, 0xFE, 0x00, 0x03, 0xFC, 0x00, 0x07, 0xF8, 0x00, 0x0F, 0xF0, - 0x00, 0x1F, 0xE0, 0x00, 0x3F, 0xC0, 0x00, 0x7F, 0x80, 0x00, 0xFF, 0x08, - 0x01, 0xFE, 0x38, 0x07, 0xF8, 0xFC, 0x1F, 0xF3, 0xFF, 0xFF, 0xEF, 0xFF, - 0xFF, 0x8F, 0xFF, 0xFF, 0x0F, 0xFF, 0xFC, 0x0F, 0xFF, 0xF0, 0x07, 0xFF, - 0x80, 0x00, 0x70, 0x00, 0xFE, 0x00, 0x03, 0xFD, 0xFC, 0x00, 0x0F, 0xF3, - 0xF8, 0x00, 0x3F, 0xC7, 0xF0, 0x00, 0xFF, 0x0F, 0xE0, 0x03, 0xFC, 0x1F, - 0xC0, 0x0F, 0xF0, 0x3F, 0x80, 0x3F, 0xE0, 0x7F, 0x00, 0xFF, 0x80, 0xFE, - 0x03, 0xFE, 0x01, 0xFC, 0x0F, 0xF8, 0x03, 0xF8, 0x3F, 0xE0, 0x07, 0xF0, - 0xFF, 0x80, 0x0F, 0xE3, 0xFE, 0x00, 0x1F, 0xCF, 0xF8, 0x00, 0x3F, 0xBF, - 0xE0, 0x00, 0x7F, 0xFF, 0xC0, 0x00, 0xFF, 0xFF, 0xC0, 0x01, 0xFF, 0xFF, - 0xC0, 0x03, 0xFF, 0xFF, 0xC0, 0x07, 0xFF, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, - 0x80, 0x1F, 0xFC, 0xFF, 0x80, 0x3F, 0xF0, 0xFF, 0x80, 0x7F, 0xC0, 0xFF, - 0x80, 0xFF, 0x01, 0xFF, 0x81, 0xFC, 0x01, 0xFF, 0x03, 0xF8, 0x01, 0xFF, - 0x07, 0xF0, 0x01, 0xFF, 0x0F, 0xE0, 0x01, 0xFF, 0x1F, 0xC0, 0x01, 0xFF, - 0x3F, 0x80, 0x03, 0xFE, 0x7F, 0x00, 0x03, 0xFE, 0xFE, 0x00, 0x03, 0xFE, - 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, - 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, - 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, - 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, - 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, - 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, - 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x03, 0xFF, 0xF0, 0x00, 0x00, 0x1F, - 0xFF, 0xC0, 0x00, 0x01, 0xFF, 0xFE, 0x00, 0x00, 0x0F, 0xFF, 0xF8, 0x00, - 0x00, 0xFF, 0xFF, 0xC0, 0x00, 0x0F, 0xFF, 0xFF, 0x00, 0x00, 0x7F, 0xFF, - 0xFC, 0x00, 0x07, 0xFF, 0xFF, 0xE0, 0x00, 0x3F, 0xFF, 0xFF, 0x80, 0x03, - 0xFF, 0xFF, 0xFC, 0x00, 0x3F, 0xFF, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0xFF, - 0xC0, 0x1F, 0xFF, 0xFF, 0xFE, 0x00, 0xFF, 0xFF, 0xFB, 0xF8, 0x0F, 0xEF, - 0xFF, 0xDF, 0xC0, 0xFE, 0x7F, 0xFE, 0x7F, 0x07, 0xF3, 0xFF, 0xF3, 0xFC, - 0x7F, 0x1F, 0xFF, 0x8F, 0xE3, 0xF8, 0xFF, 0xFC, 0x3F, 0xBF, 0x87, 0xFF, - 0xE1, 0xFF, 0xF8, 0x3F, 0xFF, 0x07, 0xFF, 0xC1, 0xFF, 0xF8, 0x3F, 0xFC, - 0x0F, 0xFF, 0xC0, 0xFF, 0xE0, 0x7F, 0xFE, 0x03, 0xFE, 0x03, 0xFF, 0xF0, - 0x1F, 0xF0, 0x1F, 0xFF, 0x80, 0x7F, 0x00, 0xFF, 0xFC, 0x03, 0xF0, 0x07, - 0xFF, 0xE0, 0x0F, 0x80, 0x3F, 0xFF, 0x00, 0x38, 0x01, 0xFF, 0xF8, 0x00, - 0x00, 0x0F, 0xFF, 0xC0, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x03, 0xF8, - 0xFE, 0x00, 0x01, 0xFF, 0xF8, 0x00, 0x07, 0xFF, 0xF0, 0x00, 0x1F, 0xFF, - 0xE0, 0x00, 0x7F, 0xFF, 0xC0, 0x01, 0xFF, 0xFF, 0x80, 0x07, 0xFF, 0xFE, - 0x00, 0x1F, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0xF8, 0x01, 0xFF, 0xFF, 0xF0, - 0x07, 0xFF, 0xFF, 0xE0, 0x1F, 0xFF, 0xFF, 0xC0, 0x7F, 0xFF, 0xFF, 0x01, - 0xFF, 0xFB, 0xFE, 0x07, 0xFF, 0xE7, 0xFC, 0x1F, 0xFF, 0x9F, 0xF8, 0x7F, - 0xFE, 0x3F, 0xF1, 0xFF, 0xF8, 0x7F, 0xC7, 0xFF, 0xE0, 0xFF, 0x9F, 0xFF, - 0x81, 0xFF, 0x7F, 0xFE, 0x03, 0xFF, 0xFF, 0xF8, 0x0F, 0xFF, 0xFF, 0xE0, - 0x1F, 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0xFE, 0x00, 0x7F, 0xFF, 0xF8, 0x00, - 0xFF, 0xFF, 0xE0, 0x03, 0xFF, 0xFF, 0x80, 0x07, 0xFF, 0xFE, 0x00, 0x0F, - 0xFF, 0xF8, 0x00, 0x1F, 0xFF, 0xE0, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x7F, - 0xFE, 0x00, 0x01, 0xFC, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x07, 0xFF, 0xFE, - 0x00, 0x01, 0xFF, 0xFF, 0xF0, 0x00, 0x3F, 0xFF, 0xFF, 0xC0, 0x07, 0xFF, - 0xFF, 0xFE, 0x00, 0xFF, 0xFF, 0xFF, 0xF0, 0x1F, 0xFE, 0x07, 0xFF, 0x83, - 0xFF, 0x00, 0x1F, 0xF8, 0x3F, 0xE0, 0x00, 0x7F, 0xC7, 0xFC, 0x00, 0x03, - 0xFC, 0x7F, 0x80, 0x00, 0x3F, 0xE7, 0xF8, 0x00, 0x01, 0xFE, 0xFF, 0x00, - 0x00, 0x1F, 0xEF, 0xF0, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x0F, 0xFF, - 0xF0, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0x00, 0xFF, 0xFF, 0x00, - 0x00, 0x1F, 0xE7, 0xF8, 0x00, 0x01, 0xFE, 0x7F, 0x80, 0x00, 0x3F, 0xE7, - 0xFC, 0x00, 0x03, 0xFC, 0x3F, 0xE0, 0x00, 0x7F, 0xC3, 0xFF, 0x00, 0x1F, - 0xF8, 0x1F, 0xFC, 0x07, 0xFF, 0x80, 0xFF, 0xFF, 0xFF, 0xF0, 0x07, 0xFF, - 0xFF, 0xFE, 0x00, 0x3F, 0xFF, 0xFF, 0xC0, 0x01, 0xFF, 0xFF, 0xF8, 0x00, - 0x07, 0xFF, 0xFE, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x00, 0x07, 0x00, - 0x00, 0xFF, 0xFF, 0xE0, 0x0F, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, 0x0F, - 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xFE, 0xFF, 0x01, - 0xFF, 0xEF, 0xF0, 0x01, 0xFF, 0xFF, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0xFF, - 0xFF, 0x00, 0x07, 0xFF, 0xF0, 0x00, 0x7F, 0xFF, 0x00, 0x07, 0xFF, 0xF0, - 0x00, 0x7F, 0xFF, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0x00, 0x1F, - 0xFF, 0xF0, 0x1F, 0xFE, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFC, 0xFF, - 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFC, 0x0F, 0xFF, 0xFE, - 0x00, 0xFF, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x0F, - 0xF0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFF, 0x00, - 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, - 0x00, 0x00, 0x03, 0xFF, 0xFF, 0x00, 0x00, 0x7F, 0xFF, 0xFC, 0x00, 0x07, - 0xFF, 0xFF, 0xF8, 0x00, 0x7F, 0xFF, 0xFF, 0xE0, 0x07, 0xFF, 0xFF, 0xFF, - 0x80, 0x7F, 0xF8, 0x1F, 0xFE, 0x07, 0xFE, 0x00, 0x3F, 0xF0, 0x3F, 0xE0, - 0x00, 0x7F, 0xC3, 0xFE, 0x00, 0x01, 0xFE, 0x1F, 0xE0, 0x00, 0x0F, 0xF8, - 0xFF, 0x00, 0x00, 0x3F, 0xCF, 0xF0, 0x00, 0x01, 0xFE, 0x7F, 0x80, 0x00, - 0x07, 0xFB, 0xFC, 0x00, 0x00, 0x3F, 0xDF, 0xE0, 0x00, 0x01, 0xFE, 0xFF, - 0x00, 0x00, 0x0F, 0xF7, 0xF8, 0x00, 0x00, 0x7F, 0xBF, 0xC0, 0x00, 0x03, - 0xFD, 0xFE, 0x00, 0x00, 0x1F, 0xEF, 0xF0, 0x00, 0x01, 0xFE, 0x3F, 0xC0, - 0x00, 0x0F, 0xF1, 0xFE, 0x00, 0x00, 0xFF, 0x8F, 0xF8, 0x00, 0x07, 0xF8, - 0x3F, 0xE0, 0x00, 0x7F, 0xC1, 0xFF, 0x80, 0x0F, 0xFC, 0x07, 0xFF, 0x01, - 0xFF, 0xE0, 0x1F, 0xFF, 0xFF, 0xFE, 0x00, 0x7F, 0xFF, 0xFF, 0xE0, 0x01, - 0xFF, 0xFF, 0xFE, 0x00, 0x07, 0xFF, 0xFF, 0xE0, 0x00, 0x0F, 0xFF, 0xFC, - 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x00, 0x0F, 0xFC, 0x03, 0x00, 0x00, - 0x3F, 0xF8, 0x7C, 0x00, 0x00, 0xFF, 0xFF, 0xF0, 0x00, 0x03, 0xFF, 0xFF, - 0x80, 0x00, 0x07, 0xFF, 0xFC, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x00, - 0x3F, 0xF8, 0x00, 0x00, 0x00, 0x08, 0x00, 0xFF, 0xFF, 0xC0, 0x07, 0xFF, - 0xFF, 0xE0, 0x3F, 0xFF, 0xFF, 0xC1, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, - 0xFC, 0x7F, 0xFF, 0xFF, 0xF3, 0xFC, 0x07, 0xFF, 0x9F, 0xE0, 0x03, 0xFE, - 0xFF, 0x00, 0x0F, 0xF7, 0xF8, 0x00, 0x7F, 0xBF, 0xC0, 0x01, 0xFD, 0xFE, - 0x00, 0x0F, 0xEF, 0xF0, 0x00, 0x7F, 0x7F, 0x80, 0x03, 0xFB, 0xFC, 0x00, - 0x3F, 0xDF, 0xE0, 0x01, 0xFE, 0xFF, 0x00, 0x1F, 0xF7, 0xF8, 0x07, 0xFF, - 0x3F, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xF8, 0x7F, - 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0xF0, 0x1F, 0xFF, 0xFF, 0x80, 0xFF, 0x01, - 0xFE, 0x07, 0xF8, 0x07, 0xF8, 0x3F, 0xC0, 0x3F, 0xE1, 0xFE, 0x00, 0xFF, - 0x0F, 0xF0, 0x03, 0xFC, 0x7F, 0x80, 0x1F, 0xF3, 0xFC, 0x00, 0x7F, 0x9F, - 0xE0, 0x01, 0xFE, 0xFF, 0x00, 0x0F, 0xF8, 0x00, 0xFF, 0xFC, 0x00, 0x3F, - 0xFF, 0xF8, 0x0F, 0xFF, 0xFF, 0xC1, 0xFF, 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, - 0x83, 0xFF, 0xFF, 0xF8, 0x3F, 0xC0, 0x0F, 0x87, 0xF8, 0x00, 0x30, 0x7F, - 0x80, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x07, 0xFC, 0x00, - 0x00, 0x7F, 0xF0, 0x00, 0x03, 0xFF, 0xE0, 0x00, 0x3F, 0xFF, 0xE0, 0x01, - 0xFF, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0x00, 0x3F, 0xFF, 0xF8, 0x00, 0xFF, - 0xFF, 0xC0, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0xFF, 0xE0, 0x00, 0x01, 0xFF, - 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFF, 0x10, 0x00, 0x0F, 0xF3, 0x80, - 0x00, 0xFE, 0x3F, 0x00, 0x1F, 0xE7, 0xFF, 0xFF, 0xFE, 0x7F, 0xFF, 0xFF, - 0xCF, 0xFF, 0xFF, 0xF8, 0x7F, 0xFF, 0xFF, 0x01, 0xFF, 0xFF, 0xE0, 0x03, - 0xFF, 0xF8, 0x00, 0x00, 0x40, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x7F, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, - 0x1F, 0xC0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x3F, - 0x80, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x7F, 0x00, - 0x00, 0x03, 0xF8, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0xFE, 0x00, 0x00, - 0x07, 0xF0, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x0F, - 0xE0, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x1F, 0xC0, - 0x00, 0x00, 0xFE, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x3F, 0x80, 0x00, - 0x01, 0xFC, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x03, - 0xF8, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0xFE, 0x00, 0x03, 0xFF, 0xF0, 0x00, - 0x1F, 0xFF, 0x80, 0x00, 0xFF, 0xFC, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x3F, - 0xFF, 0x00, 0x01, 0xFF, 0xF8, 0x00, 0x0F, 0xFF, 0xC0, 0x00, 0x7F, 0xFE, - 0x00, 0x03, 0xFF, 0xF0, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0xFF, 0xFC, 0x00, - 0x07, 0xFF, 0xE0, 0x00, 0x3F, 0xFF, 0x00, 0x01, 0xFF, 0xF8, 0x00, 0x0F, - 0xFF, 0xC0, 0x00, 0x7F, 0xFE, 0x00, 0x03, 0xFF, 0xF0, 0x00, 0x1F, 0xFF, - 0x80, 0x00, 0xFF, 0xFC, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x3F, 0xFF, 0x80, - 0x03, 0xFF, 0xFC, 0x00, 0x1F, 0xFF, 0xE0, 0x00, 0xFF, 0xFF, 0x80, 0x0F, - 0xFB, 0xFE, 0x00, 0xFF, 0x9F, 0xF8, 0x0F, 0xFC, 0x7F, 0xFF, 0xFF, 0xC3, - 0xFF, 0xFF, 0xFC, 0x0F, 0xFF, 0xFF, 0xE0, 0x3F, 0xFF, 0xFE, 0x00, 0x7F, - 0xFF, 0xC0, 0x00, 0xFF, 0xF8, 0x00, 0x00, 0x50, 0x00, 0x00, 0xFF, 0x00, - 0x00, 0x0F, 0xEF, 0xF0, 0x00, 0x01, 0xFE, 0x7F, 0x80, 0x00, 0x1F, 0xE7, - 0xF8, 0x00, 0x03, 0xFC, 0x7F, 0xC0, 0x00, 0x3F, 0xC3, 0xFC, 0x00, 0x03, - 0xF8, 0x3F, 0xE0, 0x00, 0x7F, 0x81, 0xFE, 0x00, 0x07, 0xF0, 0x1F, 0xE0, - 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x0F, 0xE0, 0x0F, 0xF0, 0x01, 0xFE, 0x00, - 0xFF, 0x80, 0x1F, 0xE0, 0x07, 0xF8, 0x01, 0xFC, 0x00, 0x7F, 0xC0, 0x3F, - 0xC0, 0x03, 0xFC, 0x03, 0xF8, 0x00, 0x3F, 0xC0, 0x7F, 0x80, 0x01, 0xFE, - 0x07, 0xF0, 0x00, 0x1F, 0xE0, 0xFF, 0x00, 0x00, 0xFF, 0x0F, 0xF0, 0x00, - 0x0F, 0xF0, 0xFE, 0x00, 0x00, 0xFF, 0x1F, 0xE0, 0x00, 0x07, 0xF9, 0xFC, - 0x00, 0x00, 0x7F, 0xBF, 0xC0, 0x00, 0x03, 0xFF, 0xF8, 0x00, 0x00, 0x3F, - 0xFF, 0x80, 0x00, 0x01, 0xFF, 0xF8, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, - 0x01, 0xFF, 0xF0, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0xFF, 0xE0, - 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x00, 0x03, - 0xFC, 0x00, 0x00, 0xFF, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xF7, 0xF8, 0x00, - 0x0F, 0xF0, 0x00, 0x3F, 0x9F, 0xE0, 0x00, 0xFF, 0x80, 0x01, 0xFC, 0xFF, - 0x00, 0x07, 0xFC, 0x00, 0x1F, 0xE7, 0xF8, 0x00, 0x3F, 0xF0, 0x00, 0xFE, - 0x1F, 0xE0, 0x03, 0xFF, 0x80, 0x07, 0xF0, 0xFF, 0x00, 0x1F, 0xFC, 0x00, - 0x7F, 0x87, 0xF8, 0x00, 0xFF, 0xF0, 0x03, 0xF8, 0x1F, 0xE0, 0x0F, 0xFF, - 0x80, 0x1F, 0xC0, 0xFF, 0x00, 0x7F, 0xFC, 0x01, 0xFE, 0x07, 0xF8, 0x03, - 0xFF, 0xF0, 0x0F, 0xE0, 0x1F, 0xE0, 0x3F, 0xBF, 0x80, 0x7F, 0x00, 0xFF, - 0x01, 0xFD, 0xFC, 0x07, 0xF8, 0x07, 0xF8, 0x0F, 0xEF, 0xE0, 0x3F, 0x80, - 0x1F, 0xE0, 0xFE, 0x3F, 0x81, 0xFC, 0x00, 0xFF, 0x07, 0xF1, 0xFC, 0x1F, - 0xE0, 0x07, 0xF8, 0x3F, 0x8F, 0xE0, 0xFE, 0x00, 0x1F, 0xE3, 0xF8, 0x3F, - 0x87, 0xF0, 0x00, 0xFF, 0x1F, 0xC1, 0xFC, 0x7F, 0x80, 0x07, 0xF8, 0xFE, - 0x0F, 0xE3, 0xF8, 0x00, 0x1F, 0xCF, 0xE0, 0x3F, 0x9F, 0xC0, 0x00, 0xFF, - 0x7F, 0x01, 0xFD, 0xFE, 0x00, 0x07, 0xFB, 0xF8, 0x0F, 0xEF, 0xE0, 0x00, - 0x1F, 0xFF, 0x80, 0x3F, 0xFF, 0x00, 0x00, 0xFF, 0xFC, 0x01, 0xFF, 0xF8, - 0x00, 0x07, 0xFF, 0xE0, 0x0F, 0xFF, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x3F, - 0xFC, 0x00, 0x00, 0xFF, 0xF0, 0x01, 0xFF, 0xE0, 0x00, 0x07, 0xFF, 0x00, - 0x0F, 0xFE, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0xFF, - 0xC0, 0x01, 0xFF, 0x80, 0x00, 0x07, 0xFC, 0x00, 0x0F, 0xF8, 0x00, 0x00, - 0x1F, 0xE0, 0x00, 0x3F, 0xC0, 0x00, 0x7F, 0xC0, 0x00, 0xFF, 0x1F, 0xE0, - 0x00, 0xFF, 0x8F, 0xF8, 0x00, 0x7F, 0x83, 0xFE, 0x00, 0x7F, 0x80, 0xFF, - 0x80, 0x7F, 0x80, 0x3F, 0xC0, 0x3F, 0xC0, 0x1F, 0xF0, 0x3F, 0xC0, 0x07, - 0xFC, 0x3F, 0xC0, 0x01, 0xFE, 0x3F, 0xE0, 0x00, 0xFF, 0x9F, 0xE0, 0x00, - 0x3F, 0xFF, 0xE0, 0x00, 0x0F, 0xFF, 0xE0, 0x00, 0x03, 0xFF, 0xF0, 0x00, - 0x01, 0xFF, 0xF0, 0x00, 0x00, 0x7F, 0xF0, 0x00, 0x00, 0x1F, 0xF8, 0x00, - 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x07, 0xFF, 0x80, - 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x07, 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xFC, - 0x00, 0x03, 0xFD, 0xFF, 0x00, 0x03, 0xFC, 0x7F, 0xC0, 0x03, 0xFE, 0x1F, - 0xE0, 0x01, 0xFE, 0x0F, 0xF8, 0x01, 0xFE, 0x03, 0xFE, 0x01, 0xFF, 0x00, - 0xFF, 0x01, 0xFF, 0x00, 0x7F, 0xC0, 0xFF, 0x00, 0x1F, 0xF0, 0xFF, 0x80, - 0x07, 0xFC, 0xFF, 0x80, 0x01, 0xFE, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x7F, - 0x80, 0x00, 0x3F, 0xBF, 0xC0, 0x00, 0x3F, 0xCF, 0xF0, 0x00, 0x1F, 0xC7, - 0xF8, 0x00, 0x1F, 0xC1, 0xFE, 0x00, 0x1F, 0xE0, 0x7F, 0x80, 0x0F, 0xE0, - 0x3F, 0xC0, 0x0F, 0xF0, 0x0F, 0xF0, 0x07, 0xF0, 0x07, 0xF8, 0x07, 0xF0, - 0x01, 0xFE, 0x07, 0xF8, 0x00, 0x7F, 0x83, 0xF8, 0x00, 0x3F, 0xC3, 0xFC, - 0x00, 0x0F, 0xF1, 0xFC, 0x00, 0x07, 0xF9, 0xFC, 0x00, 0x01, 0xFF, 0xFE, - 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x0F, 0xFF, - 0x00, 0x00, 0x07, 0xFF, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x7F, - 0x80, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0x0F, - 0xF0, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x01, - 0xFE, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x00, - 0x3F, 0xC0, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, - 0x07, 0xF8, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xBF, - 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, - 0xFF, 0xF0, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0xFF, - 0x80, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x07, 0xFC, 0x00, - 0x00, 0x7F, 0xC0, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x07, - 0xFC, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x3F, 0xE0, - 0x00, 0x03, 0xFE, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x03, 0xFE, 0x00, 0x00, - 0x3F, 0xE0, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x01, 0xFF, - 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xF8, 0x1F, 0xC0, 0xFE, 0x07, 0xF0, 0x3F, 0x81, 0xFC, 0x0F, - 0xE0, 0x7F, 0x03, 0xF8, 0x1F, 0xC0, 0xFE, 0x07, 0xF0, 0x3F, 0x81, 0xFC, - 0x0F, 0xE0, 0x7F, 0x03, 0xF8, 0x1F, 0xC0, 0xFE, 0x07, 0xF0, 0x3F, 0x81, - 0xFC, 0x0F, 0xE0, 0x7F, 0x03, 0xF8, 0x1F, 0xC0, 0xFE, 0x07, 0xF0, 0x3F, - 0x81, 0xFC, 0x0F, 0xE0, 0x7F, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xF0, 0xFE, 0x00, 0x03, 0xF8, 0x00, 0x07, 0xE0, 0x00, - 0x1F, 0xC0, 0x00, 0x7F, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x0F, - 0xE0, 0x00, 0x1F, 0x80, 0x00, 0x7F, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xF0, - 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0x80, 0x00, 0x7E, 0x00, 0x01, 0xFC, 0x00, - 0x03, 0xF0, 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0x80, 0x00, 0x7E, 0x00, 0x01, - 0xFC, 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0x80, 0x00, 0xFE, - 0x00, 0x01, 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x1F, 0xC0, 0x00, 0x3F, 0x00, - 0x00, 0xFE, 0x00, 0x01, 0xF8, 0x00, 0x07, 0xE0, 0x00, 0x1F, 0xC0, 0x00, - 0x3F, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x07, 0xE0, 0x00, 0x1F, - 0x80, 0x00, 0x7F, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x0F, 0xE0, - 0x00, 0x1F, 0x80, 0x00, 0x7F, 0x00, 0x01, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xF0, 0x7F, 0x07, 0xF0, 0x7F, 0x07, - 0xF0, 0x7F, 0x07, 0xF0, 0x7F, 0x07, 0xF0, 0x7F, 0x07, 0xF0, 0x7F, 0x07, - 0xF0, 0x7F, 0x07, 0xF0, 0x7F, 0x07, 0xF0, 0x7F, 0x07, 0xF0, 0x7F, 0x07, - 0xF0, 0x7F, 0x07, 0xF0, 0x7F, 0x07, 0xF0, 0x7F, 0x07, 0xF0, 0x7F, 0x07, - 0xF0, 0x7F, 0x07, 0xF0, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0x00, 0xFC, 0x00, 0x03, 0xFC, 0x00, 0x07, 0xF8, 0x00, 0x0F, - 0xF8, 0x00, 0x3F, 0xF0, 0x00, 0x7F, 0xF0, 0x01, 0xFB, 0xE0, 0x03, 0xE7, - 0xC0, 0x0F, 0xCF, 0xC0, 0x1F, 0x0F, 0x80, 0x7E, 0x1F, 0x80, 0xFC, 0x1F, - 0x01, 0xF0, 0x3F, 0x07, 0xE0, 0x7E, 0x0F, 0x80, 0x7C, 0x3F, 0x00, 0xFC, - 0x7E, 0x00, 0xF9, 0xF8, 0x01, 0xFB, 0xF0, 0x01, 0xF0, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x80, 0xFF, - 0x00, 0xFE, 0x01, 0xFC, 0x03, 0xF8, 0x07, 0xF0, 0x00, 0x7C, 0x00, 0x07, - 0xFF, 0xC0, 0x3F, 0xFF, 0xF0, 0x7F, 0xFF, 0xF8, 0x7F, 0xFF, 0xFC, 0x3F, - 0xFF, 0xFC, 0x3F, 0x07, 0xFE, 0x18, 0x01, 0xFE, 0x00, 0x00, 0xFE, 0x00, - 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x01, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0x3F, - 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0x00, 0xFF, 0xFE, - 0x00, 0xFF, 0xFE, 0x00, 0xFF, 0xFE, 0x00, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, - 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0x3F, 0xFF, 0x7F, 0x1F, 0xFE, 0x7F, 0x0F, - 0xFC, 0x7F, 0xFF, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFF, 0x00, 0x00, - 0x0F, 0xF0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFF, - 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x0F, 0xF0, 0x38, - 0x00, 0xFF, 0x3F, 0xF8, 0x0F, 0xF7, 0xFF, 0xE0, 0xFF, 0xFF, 0xFF, 0x0F, - 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0x9F, 0xFC, 0xFF, 0xC0, - 0x3F, 0xEF, 0xF8, 0x01, 0xFE, 0xFF, 0x80, 0x0F, 0xEF, 0xF0, 0x00, 0xFF, - 0xFF, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0x00, 0x0F, 0xFF, 0xF0, - 0x00, 0xFF, 0xFF, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0x80, 0x1F, - 0xEF, 0xF8, 0x01, 0xFE, 0xFF, 0xE0, 0x7F, 0xEF, 0xFF, 0xFF, 0xFC, 0xFF, - 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xF8, 0xFE, 0xFF, 0xFF, 0x0F, 0xE7, 0xFF, - 0xC0, 0xFE, 0x1F, 0xF0, 0x00, 0x00, 0x07, 0x00, 0x00, 0x3F, 0xFE, 0x00, - 0x3F, 0xFF, 0xC0, 0x1F, 0xFF, 0xFC, 0x0F, 0xFF, 0xFF, 0x87, 0xFF, 0xFF, - 0xE3, 0xFF, 0x8F, 0xFC, 0xFF, 0x80, 0xFE, 0x7F, 0xC0, 0x1E, 0x1F, 0xE0, - 0x02, 0x07, 0xF0, 0x00, 0x01, 0xFC, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x3F, - 0xC0, 0x00, 0x07, 0xF0, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x7F, 0x80, 0x00, - 0x1F, 0xE0, 0x02, 0x07, 0xFC, 0x01, 0xE0, 0xFF, 0x80, 0xFE, 0x1F, 0xFF, - 0xFF, 0xC7, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xF0, 0x1F, 0xFF, 0xF8, 0x01, - 0xFF, 0xFC, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x01, - 0xFC, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x00, 0xFE, 0x00, - 0x00, 0x1F, 0xC0, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x0F, - 0xE0, 0x03, 0x81, 0xFC, 0x07, 0xFE, 0x3F, 0x83, 0xFF, 0xF7, 0xF0, 0xFF, - 0xFF, 0xFE, 0x3F, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xFB, 0xFF, 0x8F, 0xFF, - 0x7F, 0xC0, 0x7F, 0xFF, 0xF0, 0x07, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0x00, - 0x0F, 0xFF, 0xE0, 0x00, 0xFF, 0xFC, 0x00, 0x1F, 0xFF, 0x80, 0x03, 0xFF, - 0xF0, 0x00, 0x7F, 0xFE, 0x00, 0x0F, 0xFF, 0xE0, 0x03, 0xFF, 0xFC, 0x00, - 0x7F, 0xFF, 0xC0, 0x1F, 0xF7, 0xFC, 0x07, 0xFE, 0xFF, 0xFF, 0xFF, 0xCF, - 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xE0, 0xFF, 0xFD, - 0xFC, 0x07, 0xFE, 0x3F, 0x80, 0x00, 0x06, 0x00, 0x00, 0x1F, 0xFE, 0x00, - 0x0F, 0xFF, 0xF0, 0x03, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xF0, 0x3F, 0xFF, - 0xFF, 0x0F, 0xF8, 0x1F, 0xE1, 0xFE, 0x01, 0xFE, 0x7F, 0x80, 0x1F, 0xCF, - 0xE0, 0x01, 0xFD, 0xFC, 0x00, 0x3F, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFB, 0xF8, 0x00, 0x00, 0x7F, - 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x01, 0xFF, 0x00, 0x10, 0x1F, 0xF0, 0x0F, - 0x01, 0xFF, 0xFF, 0xF0, 0x3F, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xE0, 0x3F, - 0xFF, 0xF8, 0x01, 0xFF, 0xFE, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x3F, 0xE0, - 0x0F, 0xFF, 0x01, 0xFF, 0xE0, 0x3F, 0xFE, 0x07, 0xFF, 0xC0, 0x7F, 0xFC, - 0x07, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xE0, 0x00, 0xFE, 0x00, 0xFF, 0xFF, - 0xCF, 0xFF, 0xFC, 0xFF, 0xFF, 0xCF, 0xFF, 0xFC, 0xFF, 0xFF, 0xCF, 0xFF, - 0xFC, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, - 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, - 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, - 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, - 0x00, 0x00, 0x0E, 0x00, 0x00, 0x1F, 0xFE, 0x3F, 0x03, 0xFF, 0xF3, 0xF0, - 0xFF, 0xFF, 0xBF, 0x1F, 0xFF, 0xFF, 0xF1, 0xFF, 0xFF, 0xFF, 0x3F, 0xF8, - 0xFF, 0xF7, 0xFE, 0x01, 0xFF, 0x7F, 0x80, 0x0F, 0xF7, 0xF8, 0x00, 0xFF, - 0x7F, 0x00, 0x07, 0xF7, 0xF0, 0x00, 0x7F, 0xFF, 0x00, 0x07, 0xF7, 0xF0, - 0x00, 0x7F, 0x7F, 0x00, 0x07, 0xF7, 0xF8, 0x00, 0x7F, 0x7F, 0x80, 0x0F, - 0xF7, 0xFC, 0x01, 0xFF, 0x3F, 0xF8, 0x7F, 0xF1, 0xFF, 0xFF, 0xFF, 0x1F, - 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0x03, 0xFF, 0xF7, 0xF0, 0x1F, 0xFE, - 0x7F, 0x00, 0x1F, 0x07, 0xF0, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x0F, 0xF0, - 0xC0, 0x00, 0xFF, 0x0F, 0x00, 0x1F, 0xE1, 0xFF, 0x1F, 0xFE, 0x1F, 0xFF, - 0xFF, 0xC3, 0xFF, 0xFF, 0xF8, 0x3F, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xE0, - 0x01, 0xFF, 0xF8, 0x00, 0x00, 0x60, 0x00, 0xFF, 0x00, 0x00, 0x3F, 0xC0, - 0x00, 0x0F, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x3F, - 0xC0, 0x00, 0x0F, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0xFF, 0x00, 0x00, - 0x3F, 0xC0, 0xE0, 0x0F, 0xF3, 0xFF, 0x83, 0xFD, 0xFF, 0xF8, 0xFF, 0xFF, - 0xFF, 0x3F, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xFE, 0xFF, - 0xE0, 0x7F, 0xFF, 0xE0, 0x0F, 0xFF, 0xF8, 0x03, 0xFF, 0xFC, 0x00, 0x7F, - 0xFF, 0x00, 0x1F, 0xFF, 0xC0, 0x07, 0xFF, 0xF0, 0x01, 0xFF, 0xFC, 0x00, - 0x7F, 0xFF, 0x00, 0x1F, 0xFF, 0xC0, 0x07, 0xFF, 0xF0, 0x01, 0xFF, 0xFC, - 0x00, 0x7F, 0xFF, 0x00, 0x1F, 0xFF, 0xC0, 0x07, 0xFF, 0xF0, 0x01, 0xFF, - 0xFC, 0x00, 0x7F, 0xFF, 0x00, 0x1F, 0xFF, 0xC0, 0x07, 0xFF, 0xF0, 0x01, - 0xFC, 0x3C, 0x7F, 0xBF, 0xDF, 0xFF, 0xFF, 0xFB, 0xFC, 0xFC, 0x00, 0x00, - 0x00, 0x00, 0x0F, 0xF7, 0xFB, 0xFD, 0xFE, 0xFF, 0x7F, 0xBF, 0xDF, 0xEF, - 0xF7, 0xFB, 0xFD, 0xFE, 0xFF, 0x7F, 0xBF, 0xDF, 0xEF, 0xF7, 0xFB, 0xFD, - 0xFE, 0xFF, 0x7F, 0xBF, 0xDF, 0xEF, 0xF0, 0x00, 0x78, 0x01, 0xFE, 0x01, - 0xFE, 0x01, 0xFF, 0x01, 0xFF, 0x01, 0xFE, 0x01, 0xFE, 0x00, 0xFC, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0xFE, 0x00, - 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, - 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, - 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, - 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, - 0xFE, 0x01, 0xFE, 0x63, 0xFE, 0x7F, 0xFC, 0x7F, 0xFC, 0xFF, 0xF8, 0xFF, - 0xF0, 0xFF, 0xC0, 0x04, 0x00, 0xFF, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, - 0xFF, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x0F, 0xF0, - 0x00, 0x00, 0xFF, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFF, 0x00, 0x00, - 0x0F, 0xF0, 0x00, 0x00, 0xFF, 0x00, 0x3F, 0xEF, 0xF0, 0x07, 0xF8, 0xFF, - 0x01, 0xFF, 0x0F, 0xF0, 0x3F, 0xE0, 0xFF, 0x07, 0xFC, 0x0F, 0xF0, 0xFF, - 0xC0, 0xFF, 0x1F, 0xF8, 0x0F, 0xF3, 0xFF, 0x00, 0xFF, 0x7F, 0xE0, 0x0F, - 0xFF, 0xFC, 0x00, 0xFF, 0xFF, 0x80, 0x0F, 0xFF, 0xFC, 0x00, 0xFF, 0xFF, - 0xC0, 0x0F, 0xFF, 0xFE, 0x00, 0xFF, 0xFF, 0xF0, 0x0F, 0xFE, 0xFF, 0x80, - 0xFF, 0xCF, 0xF8, 0x0F, 0xF8, 0x7F, 0xC0, 0xFF, 0x03, 0xFE, 0x0F, 0xF0, - 0x1F, 0xF0, 0xFF, 0x00, 0xFF, 0x8F, 0xF0, 0x0F, 0xF8, 0xFF, 0x00, 0x7F, - 0xCF, 0xF0, 0x03, 0xFE, 0xFF, 0x00, 0x1F, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x07, 0x00, 0x00, 0xC0, - 0x1F, 0xC7, 0xFE, 0x03, 0xFF, 0x83, 0xF9, 0xFF, 0xF0, 0xFF, 0xFC, 0x7F, - 0x7F, 0xFF, 0x3F, 0xFF, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xFE, 0x07, 0xFF, - 0x81, 0xFF, 0xFF, 0x80, 0x7F, 0xE0, 0x1F, 0xFF, 0xE0, 0x07, 0xF8, 0x03, - 0xFF, 0xFC, 0x00, 0xFF, 0x00, 0x3F, 0xFF, 0x80, 0x1F, 0xE0, 0x07, 0xFF, - 0xF0, 0x03, 0xF8, 0x00, 0xFF, 0xFE, 0x00, 0x7F, 0x00, 0x1F, 0xFF, 0xC0, - 0x0F, 0xE0, 0x03, 0xFF, 0xF8, 0x01, 0xFC, 0x00, 0x7F, 0xFF, 0x00, 0x3F, - 0x80, 0x0F, 0xFF, 0xE0, 0x07, 0xF0, 0x01, 0xFF, 0xFC, 0x00, 0xFE, 0x00, - 0x3F, 0xFF, 0x80, 0x1F, 0xC0, 0x07, 0xFF, 0xF0, 0x03, 0xF8, 0x00, 0xFF, - 0xFE, 0x00, 0x7F, 0x00, 0x1F, 0xFF, 0xC0, 0x0F, 0xE0, 0x03, 0xFF, 0xF8, - 0x01, 0xFC, 0x00, 0x7F, 0xFF, 0x00, 0x3F, 0x80, 0x0F, 0xFF, 0xE0, 0x07, - 0xF0, 0x01, 0xFC, 0x00, 0x03, 0x80, 0x3F, 0x8F, 0xFE, 0x0F, 0xE7, 0xFF, - 0xE3, 0xFB, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xEF, 0xFF, - 0xFF, 0xFB, 0xFF, 0x81, 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0xE0, 0x0F, 0xFF, - 0xF0, 0x01, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0x00, 0x1F, 0xFF, 0xC0, 0x07, - 0xFF, 0xF0, 0x01, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0x00, 0x1F, 0xFF, 0xC0, - 0x07, 0xFF, 0xF0, 0x01, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0x00, 0x1F, 0xFF, - 0xC0, 0x07, 0xFF, 0xF0, 0x01, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0x00, 0x1F, - 0xFF, 0xC0, 0x07, 0xF0, 0x00, 0x07, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x03, - 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0x81, 0xFF, 0xFF, - 0xFC, 0x3F, 0xF8, 0xFF, 0xC3, 0xFE, 0x03, 0xFE, 0x7F, 0xC0, 0x1F, 0xE7, - 0xF8, 0x00, 0xFF, 0x7F, 0x00, 0x0F, 0xF7, 0xF0, 0x00, 0x7F, 0xFF, 0x00, - 0x07, 0xFF, 0xF0, 0x00, 0x7F, 0x7F, 0x00, 0x07, 0xF7, 0xF0, 0x00, 0x7F, - 0x7F, 0x80, 0x0F, 0xF7, 0xF8, 0x00, 0xFF, 0x3F, 0xC0, 0x1F, 0xE3, 0xFE, - 0x03, 0xFE, 0x1F, 0xFF, 0xFF, 0xC1, 0xFF, 0xFF, 0xF8, 0x0F, 0xFF, 0xFF, - 0x80, 0x7F, 0xFF, 0xE0, 0x01, 0xFF, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x00, - 0x03, 0x80, 0x0F, 0xE3, 0xFF, 0x80, 0xFE, 0x7F, 0xFE, 0x0F, 0xFF, 0xFF, - 0xF0, 0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xFC, 0xFF, 0xF9, 0xFF, 0xCF, - 0xFC, 0x03, 0xFE, 0xFF, 0x80, 0x1F, 0xEF, 0xF8, 0x00, 0xFE, 0xFF, 0x00, - 0x0F, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0xFF, - 0xFF, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0x00, 0x0F, 0xFF, 0xF8, - 0x01, 0xFE, 0xFF, 0x80, 0x1F, 0xEF, 0xFE, 0x07, 0xFE, 0xFF, 0xFF, 0xFF, - 0xCF, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xF0, 0xFF, - 0x7F, 0xFC, 0x0F, 0xF1, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x0F, 0xF0, 0x00, - 0x00, 0xFF, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x0F, - 0xF0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFF, 0x00, - 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x0F, 0xFC, 0x7F, 0x03, 0xFF, 0xF7, - 0xF0, 0x7F, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xF1, 0xFF, 0xFF, 0xFF, 0x3F, - 0xF8, 0xFF, 0xF3, 0xFE, 0x03, 0xFF, 0x7F, 0xC0, 0x1F, 0xF7, 0xF8, 0x00, - 0xFF, 0x7F, 0x00, 0x0F, 0xF7, 0xF0, 0x00, 0x7F, 0xFF, 0x00, 0x07, 0xFF, - 0xF0, 0x00, 0x7F, 0x7F, 0x00, 0x07, 0xF7, 0xF0, 0x00, 0x7F, 0x7F, 0x80, - 0x0F, 0xF7, 0xF8, 0x00, 0xFF, 0x7F, 0xC0, 0x1F, 0xF3, 0xFE, 0x03, 0xFF, - 0x3F, 0xFF, 0xFF, 0xF1, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xF0, 0x7F, - 0xFF, 0xFF, 0x03, 0xFF, 0xE7, 0xF0, 0x0F, 0xFC, 0x7F, 0x00, 0x00, 0x07, - 0xF0, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x7F, 0x00, - 0x00, 0x07, 0xF0, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, - 0x7F, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x01, 0xFE, 0x3F, 0xFE, 0x7F, 0xFE, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xC0, 0xFF, - 0x80, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, - 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, - 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x3E, 0x00, - 0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0xF0, 0xFF, 0xFF, 0xE3, 0xFF, 0xFF, 0x8F, - 0xFF, 0xFF, 0x1F, 0xE0, 0x1C, 0x3F, 0x80, 0x08, 0x7F, 0x00, 0x00, 0xFE, - 0x00, 0x01, 0xFF, 0x80, 0x03, 0xFF, 0xFC, 0x03, 0xFF, 0xFE, 0x03, 0xFF, - 0xFF, 0x03, 0xFF, 0xFF, 0x00, 0xFF, 0xFE, 0x00, 0x07, 0xFE, 0x00, 0x03, - 0xFC, 0x80, 0x03, 0xF9, 0xC0, 0x07, 0xF7, 0xF0, 0x3F, 0xCF, 0xFF, 0xFF, - 0xBF, 0xFF, 0xFE, 0x7F, 0xFF, 0xF8, 0x7F, 0xFF, 0xE0, 0x1F, 0xFF, 0x00, - 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, - 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0xCF, 0xFF, 0xFC, 0xFF, 0xFF, 0xCF, 0xFF, - 0xFC, 0xFF, 0xFF, 0xC0, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, - 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, - 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, - 0x0F, 0xF0, 0x00, 0x7F, 0xDC, 0x07, 0xFF, 0xC0, 0x7F, 0xFE, 0x03, 0xFF, - 0xE0, 0x1F, 0xFF, 0x00, 0x7F, 0xC0, 0xFF, 0x00, 0x1F, 0xFF, 0xC0, 0x07, - 0xFF, 0xF0, 0x01, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0x00, 0x1F, 0xFF, 0xC0, - 0x07, 0xFF, 0xF0, 0x01, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0x00, 0x1F, 0xFF, - 0xC0, 0x07, 0xFF, 0xF0, 0x01, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0x00, 0x1F, - 0xFF, 0xC0, 0x0F, 0xFF, 0xF0, 0x03, 0xFF, 0xFC, 0x00, 0xFF, 0xFF, 0x00, - 0x7F, 0xDF, 0xE0, 0x1F, 0xF7, 0xFC, 0x1F, 0xFD, 0xFF, 0xFF, 0xFF, 0x3F, - 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xF1, 0xFF, 0xFF, 0xFC, 0x3F, 0xFE, 0x7F, - 0x03, 0xFE, 0x1F, 0xC0, 0xFF, 0x00, 0x07, 0xFF, 0xF0, 0x00, 0x7F, 0x7F, - 0x00, 0x0F, 0xE7, 0xF8, 0x00, 0xFE, 0x3F, 0x80, 0x1F, 0xC3, 0xFC, 0x01, - 0xFC, 0x3F, 0xC0, 0x1F, 0xC1, 0xFC, 0x03, 0xF8, 0x1F, 0xE0, 0x3F, 0x80, - 0xFE, 0x07, 0xF0, 0x0F, 0xF0, 0x7F, 0x00, 0x7F, 0x0F, 0xF0, 0x07, 0xF0, - 0xFE, 0x00, 0x7F, 0x8F, 0xE0, 0x03, 0xF9, 0xFC, 0x00, 0x3F, 0xDF, 0xC0, - 0x01, 0xFF, 0xF8, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0xFF, 0xF8, 0x00, 0x0F, - 0xFF, 0x00, 0x00, 0xFF, 0xF0, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x7F, 0xE0, - 0x00, 0x03, 0xFC, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0xFE, 0x00, 0x1F, 0xC0, - 0x07, 0xF7, 0xF0, 0x03, 0xFC, 0x00, 0x7E, 0x7F, 0x00, 0x3F, 0xC0, 0x0F, - 0xE7, 0xF0, 0x03, 0xFE, 0x00, 0xFE, 0x3F, 0x80, 0x7F, 0xE0, 0x0F, 0xC3, - 0xF8, 0x07, 0xFE, 0x01, 0xFC, 0x3F, 0x80, 0x7F, 0xF0, 0x1F, 0xC1, 0xFC, - 0x0F, 0xFF, 0x01, 0xF8, 0x1F, 0xC0, 0xFF, 0xF0, 0x3F, 0x80, 0xFC, 0x0F, - 0xFF, 0x83, 0xF0, 0x0F, 0xE1, 0xFD, 0xF8, 0x3F, 0x00, 0xFE, 0x1F, 0x9F, - 0x87, 0xF0, 0x07, 0xE3, 0xF9, 0xFC, 0x7E, 0x00, 0x7F, 0x3F, 0x8F, 0xC7, - 0xE0, 0x07, 0xF3, 0xF0, 0xFE, 0xFE, 0x00, 0x3F, 0x7F, 0x0F, 0xEF, 0xC0, - 0x03, 0xFF, 0xE0, 0x7F, 0xFC, 0x00, 0x3F, 0xFE, 0x07, 0xFF, 0xC0, 0x01, - 0xFF, 0xE0, 0x7F, 0xF8, 0x00, 0x1F, 0xFC, 0x03, 0xFF, 0x80, 0x00, 0xFF, - 0xC0, 0x3F, 0xF0, 0x00, 0x0F, 0xFC, 0x03, 0xFF, 0x00, 0x00, 0xFF, 0x80, - 0x1F, 0xF0, 0x00, 0x07, 0xF8, 0x01, 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x0F, - 0xE0, 0x00, 0x7F, 0x80, 0x1F, 0xE3, 0xFC, 0x03, 0xFC, 0x1F, 0xE0, 0x3F, - 0x81, 0xFF, 0x07, 0xF8, 0x0F, 0xF0, 0xFF, 0x00, 0x7F, 0x9F, 0xE0, 0x03, - 0xFD, 0xFC, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0xFF, 0xF8, 0x00, 0x0F, 0xFF, - 0x00, 0x00, 0x7F, 0xE0, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x3F, 0xC0, 0x00, - 0x07, 0xFE, 0x00, 0x00, 0xFF, 0xF0, 0x00, 0x1F, 0xFF, 0x80, 0x01, 0xFF, - 0xF8, 0x00, 0x3F, 0xFF, 0xC0, 0x07, 0xF9, 0xFE, 0x00, 0xFF, 0x0F, 0xF0, - 0x0F, 0xF0, 0xFF, 0x01, 0xFE, 0x07, 0xF8, 0x3F, 0xC0, 0x3F, 0xC7, 0xF8, - 0x03, 0xFE, 0x7F, 0x80, 0x1F, 0xE0, 0xFF, 0x00, 0x07, 0xFF, 0xF0, 0x00, - 0x7F, 0x7F, 0x00, 0x0F, 0xE7, 0xF8, 0x00, 0xFE, 0x3F, 0x80, 0x1F, 0xC3, - 0xFC, 0x01, 0xFC, 0x1F, 0xC0, 0x1F, 0xC1, 0xFC, 0x03, 0xF8, 0x1F, 0xE0, - 0x3F, 0x80, 0xFE, 0x07, 0xF0, 0x0F, 0xF0, 0x7F, 0x00, 0x7F, 0x07, 0xE0, - 0x07, 0xF0, 0xFE, 0x00, 0x3F, 0x8F, 0xE0, 0x03, 0xF9, 0xFC, 0x00, 0x3F, - 0xDF, 0xC0, 0x01, 0xFF, 0xF8, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0xFF, 0xF8, - 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x7F, 0xF0, 0x00, 0x07, 0xFE, 0x00, 0x00, - 0x7F, 0xE0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x03, 0xFC, - 0x00, 0x00, 0x3F, 0x80, 0x02, 0x07, 0xF8, 0x00, 0x7D, 0xFF, 0x00, 0x07, - 0xFF, 0xF0, 0x00, 0xFF, 0xFE, 0x00, 0x0F, 0xFF, 0xC0, 0x00, 0xFF, 0xF8, - 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, - 0x3F, 0xE0, 0x00, 0xFF, 0x00, 0x07, 0xF8, 0x00, 0x3F, 0xC0, 0x01, 0xFE, - 0x00, 0x0F, 0xF0, 0x00, 0x7F, 0xC0, 0x03, 0xFE, 0x00, 0x0F, 0xF0, 0x00, - 0x7F, 0x80, 0x03, 0xFC, 0x00, 0x1F, 0xE0, 0x00, 0xFF, 0x00, 0x07, 0xFC, - 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x3F, 0x01, 0xFF, 0x03, 0xFF, - 0x07, 0xFF, 0x07, 0xFF, 0x0F, 0xFF, 0x0F, 0xF8, 0x0F, 0xF0, 0x0F, 0xE0, - 0x0F, 0xE0, 0x0F, 0xE0, 0x0F, 0xE0, 0x0F, 0xE0, 0x0F, 0xE0, 0x0F, 0xE0, - 0x0F, 0xE0, 0x0F, 0xE0, 0x0F, 0xE0, 0x0F, 0xE0, 0xFF, 0xE0, 0xFF, 0xE0, - 0xFF, 0xC0, 0xFF, 0x80, 0xFF, 0xC0, 0xFF, 0xE0, 0x1F, 0xE0, 0x0F, 0xE0, - 0x0F, 0xE0, 0x0F, 0xE0, 0x0F, 0xE0, 0x0F, 0xE0, 0x0F, 0xE0, 0x0F, 0xE0, - 0x0F, 0xE0, 0x0F, 0xE0, 0x0F, 0xE0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xFF, - 0x07, 0xFF, 0x07, 0xFF, 0x03, 0xFF, 0x01, 0xFF, 0x00, 0x7F, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF0, 0xFC, 0x01, 0xFE, 0x03, 0xFE, 0x07, 0xFE, 0x0F, 0xFE, 0x1F, 0xFC, - 0x07, 0xF8, 0x07, 0xF0, 0x0F, 0xE0, 0x1F, 0xC0, 0x3F, 0x80, 0x7F, 0x00, - 0xFE, 0x01, 0xFC, 0x03, 0xF8, 0x07, 0xF0, 0x0F, 0xE0, 0x1F, 0xC0, 0x3F, - 0xC0, 0x7F, 0xF0, 0x7F, 0xE0, 0x7F, 0xC0, 0xFF, 0x83, 0xFF, 0x0F, 0xFE, - 0x1F, 0xE0, 0x3F, 0x80, 0x7F, 0x00, 0xFE, 0x01, 0xFC, 0x03, 0xF8, 0x07, - 0xF0, 0x0F, 0xE0, 0x1F, 0xC0, 0x3F, 0x80, 0x7F, 0x00, 0xFE, 0x03, 0xFC, - 0x3F, 0xF8, 0x7F, 0xF0, 0xFF, 0xC1, 0xFF, 0x83, 0xFC, 0x07, 0xF0, 0x00, - 0x0F, 0xC0, 0x1F, 0x1F, 0xF0, 0x1F, 0x3F, 0xF8, 0x1F, 0x7F, 0xFE, 0x3E, - 0x7F, 0xFF, 0xFE, 0x7C, 0x7F, 0xFE, 0x78, 0x1F, 0xFC, 0xF8, 0x0F, 0xF8, - 0xF8, 0x03, 0xF0 }; - -const GFXglyph Montserrat_Bold24pt7bGlyphs[] PROGMEM = { - { 0, 1, 1, 13, 0, 0 }, // 0x20 ' ' - { 1, 9, 33, 14, 2, -32 }, // 0x21 '!' - { 39, 17, 13, 21, 2, -32 }, // 0x22 '"' - { 67, 32, 33, 34, 1, -32 }, // 0x23 '#' - { 199, 28, 45, 30, 1, -38 }, // 0x24 '$' - { 357, 39, 33, 41, 1, -32 }, // 0x25 '%' - { 518, 31, 34, 34, 2, -32 }, // 0x26 '&' - { 650, 7, 13, 11, 2, -32 }, // 0x27 ''' - { 662, 13, 44, 17, 3, -34 }, // 0x28 '(' - { 734, 13, 44, 17, 0, -34 }, // 0x29 ')' - { 806, 19, 19, 20, 1, -34 }, // 0x2A '*' - { 852, 22, 21, 28, 3, -26 }, // 0x2B '+' - { 910, 9, 16, 12, 2, -8 }, // 0x2C ',' - { 928, 14, 6, 18, 2, -15 }, // 0x2D '-' - { 939, 9, 9, 12, 2, -8 }, // 0x2E '.' - { 950, 22, 45, 18, -2, -39 }, // 0x2F '/' - { 1074, 28, 34, 32, 2, -32 }, // 0x30 '0' - { 1193, 15, 33, 18, 0, -32 }, // 0x31 '1' - { 1255, 26, 33, 28, 0, -32 }, // 0x32 '2' - { 1363, 26, 34, 28, 0, -32 }, // 0x33 '3' - { 1474, 31, 33, 32, 1, -32 }, // 0x34 '4' - { 1602, 27, 34, 28, 0, -32 }, // 0x35 '5' - { 1717, 27, 34, 30, 2, -32 }, // 0x36 '6' - { 1832, 27, 33, 29, 1, -32 }, // 0x37 '7' - { 1944, 27, 34, 31, 2, -32 }, // 0x38 '8' - { 2059, 27, 34, 30, 1, -32 }, // 0x39 '9' - { 2174, 9, 26, 12, 2, -25 }, // 0x3A ':' - { 2204, 9, 33, 12, 2, -25 }, // 0x3B ';' - { 2242, 22, 23, 28, 3, -27 }, // 0x3C '<' - { 2306, 22, 17, 28, 3, -24 }, // 0x3D '=' - { 2353, 22, 23, 28, 3, -27 }, // 0x3E '>' - { 2417, 25, 33, 28, 0, -32 }, // 0x3F '?' - { 2521, 45, 43, 49, 2, -32 }, // 0x40 '@' - { 2763, 36, 33, 36, 0, -32 }, // 0x41 'A' - { 2912, 30, 33, 36, 4, -32 }, // 0x42 'B' - { 3036, 31, 34, 34, 2, -32 }, // 0x43 'C' - { 3168, 33, 33, 39, 4, -32 }, // 0x44 'D' - { 3305, 25, 33, 32, 4, -32 }, // 0x45 'E' - { 3409, 25, 33, 30, 4, -32 }, // 0x46 'F' - { 3513, 32, 34, 36, 2, -32 }, // 0x47 'G' - { 3649, 30, 33, 38, 4, -32 }, // 0x48 'H' - { 3773, 8, 33, 15, 4, -32 }, // 0x49 'I' - { 3806, 23, 34, 25, -1, -32 }, // 0x4A 'J' - { 3904, 31, 33, 35, 4, -32 }, // 0x4B 'K' - { 4032, 24, 33, 28, 4, -32 }, // 0x4C 'L' - { 4131, 37, 33, 45, 4, -32 }, // 0x4D 'M' - { 4284, 30, 33, 38, 4, -32 }, // 0x4E 'N' - { 4408, 36, 34, 40, 2, -32 }, // 0x4F 'O' - { 4561, 28, 33, 34, 4, -32 }, // 0x50 'P' - { 4677, 37, 41, 40, 2, -32 }, // 0x51 'Q' - { 4867, 29, 33, 35, 4, -32 }, // 0x52 'R' - { 4987, 28, 34, 30, 1, -32 }, // 0x53 'S' - { 5106, 29, 33, 29, 0, -32 }, // 0x54 'T' - { 5226, 29, 34, 37, 4, -32 }, // 0x55 'U' - { 5350, 36, 33, 35, 0, -32 }, // 0x56 'V' - { 5499, 53, 33, 55, 1, -32 }, // 0x57 'W' - { 5718, 33, 33, 34, 0, -32 }, // 0x58 'X' - { 5855, 33, 33, 32, -1, -32 }, // 0x59 'Y' - { 5992, 29, 33, 32, 2, -32 }, // 0x5A 'Z' - { 6112, 13, 44, 17, 4, -34 }, // 0x5B '[' - { 6184, 22, 45, 18, -2, -39 }, // 0x5C '\' - { 6308, 12, 44, 17, 1, -34 }, // 0x5D ']' - { 6374, 23, 19, 28, 3, -25 }, // 0x5E '^' - { 6429, 24, 4, 24, 0, 1 }, // 0x5F '_' - { 6441, 14, 6, 28, 4, -34 }, // 0x60 '`' - { 6452, 24, 26, 29, 2, -25 }, // 0x61 'a' - { 6530, 28, 35, 32, 3, -34 }, // 0x62 'b' - { 6653, 26, 26, 28, 1, -25 }, // 0x63 'c' - { 6738, 27, 35, 33, 2, -34 }, // 0x64 'd' - { 6857, 27, 26, 30, 1, -25 }, // 0x65 'e' - { 6945, 20, 35, 18, 0, -34 }, // 0x66 'f' - { 7033, 28, 36, 33, 1, -25 }, // 0x67 'g' - { 7159, 26, 35, 32, 3, -34 }, // 0x68 'h' - { 7273, 9, 37, 14, 3, -36 }, // 0x69 'i' - { 7315, 16, 47, 14, -4, -36 }, // 0x6A 'j' - { 7409, 28, 35, 31, 3, -34 }, // 0x6B 'k' - { 7532, 8, 35, 14, 3, -34 }, // 0x6C 'l' - { 7567, 43, 26, 49, 3, -25 }, // 0x6D 'm' - { 7707, 26, 26, 32, 3, -25 }, // 0x6E 'n' - { 7792, 28, 26, 31, 1, -25 }, // 0x6F 'o' - { 7883, 28, 35, 32, 3, -25 }, // 0x70 'p' - { 8006, 28, 35, 32, 1, -25 }, // 0x71 'q' - { 8129, 16, 26, 20, 3, -25 }, // 0x72 'r' - { 8181, 23, 26, 25, 1, -25 }, // 0x73 's' - { 8256, 20, 31, 20, 0, -30 }, // 0x74 't' - { 8334, 26, 25, 32, 3, -24 }, // 0x75 'u' - { 8416, 28, 25, 28, 0, -24 }, // 0x76 'v' - { 8504, 44, 25, 44, 0, -24 }, // 0x77 'w' - { 8642, 28, 25, 28, 0, -24 }, // 0x78 'x' - { 8730, 28, 35, 28, 0, -24 }, // 0x79 'y' - { 8853, 22, 25, 26, 2, -24 }, // 0x7A 'z' - { 8922, 16, 44, 18, 2, -34 }, // 0x7B '{' - { 9010, 7, 44, 15, 4, -34 }, // 0x7C '|' - { 9049, 15, 44, 18, 1, -34 }, // 0x7D '}' - { 9132, 24, 9, 28, 2, -20 } }; // 0x7E '~' - -const GFXfont Montserrat_Bold24pt7b PROGMEM = { - (uint8_t *)Montserrat_Bold24pt7bBitmaps, - (GFXglyph *)Montserrat_Bold24pt7bGlyphs, - 0x20, 0x7E, 57 }; - -// Approx. 9831 bytes - -#endif // MONTSERRATBOLD24PT7B_H diff --git a/examples/companion_radio/ui-new/fonts/MontserratBold26pt7b.h b/examples/companion_radio/ui-new/fonts/MontserratBold26pt7b.h deleted file mode 100644 index 62dcc6aa..00000000 --- a/examples/companion_radio/ui-new/fonts/MontserratBold26pt7b.h +++ /dev/null @@ -1,1009 +0,0 @@ -#ifndef MONTSERRATBOLD26PT7B_H -#define MONTSERRATBOLD26PT7B_H -const uint8_t Montserrat_Bold26pt7bBitmaps[] PROGMEM = { - 0x00, 0x7F, 0xDF, 0xF7, 0xFD, 0xFF, 0x7F, 0xDF, 0xF7, 0xFD, 0xFF, 0x7F, - 0xDF, 0xF7, 0xF9, 0xFE, 0x7F, 0x8F, 0xE3, 0xF8, 0xFE, 0x3F, 0x8F, 0xE3, - 0xF8, 0xFE, 0x3F, 0x8F, 0xE3, 0xF8, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x38, - 0x3F, 0x9F, 0xF7, 0xFF, 0xFF, 0x7F, 0xDF, 0xF7, 0xF8, 0xFC, 0x7E, 0x0F, - 0xDF, 0x83, 0xF7, 0xE0, 0xFD, 0xF8, 0x3F, 0x7E, 0x0F, 0xDF, 0x83, 0xF7, - 0xE0, 0xFD, 0xF8, 0x3F, 0x7E, 0x0F, 0xDF, 0x83, 0xF7, 0xE0, 0xFD, 0xF8, - 0x3F, 0x7E, 0x0F, 0xDF, 0x83, 0xF7, 0xE0, 0xFC, 0x00, 0x3F, 0x01, 0xF8, - 0x00, 0x07, 0xE0, 0x3F, 0x00, 0x00, 0xFC, 0x07, 0xE0, 0x00, 0x1F, 0x00, - 0xFC, 0x00, 0x03, 0xE0, 0x1F, 0x80, 0x00, 0xFC, 0x03, 0xE0, 0x00, 0x1F, - 0x80, 0x7C, 0x00, 0x03, 0xF0, 0x1F, 0x80, 0x3F, 0xFF, 0xFF, 0xFF, 0xE7, - 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, 0xFF, - 0xF3, 0xFF, 0xFF, 0xFF, 0xFE, 0x7F, 0xFF, 0xFF, 0xFF, 0xC0, 0x3F, 0x00, - 0xF8, 0x00, 0x07, 0xE0, 0x3F, 0x00, 0x00, 0xFC, 0x07, 0xE0, 0x00, 0x1F, - 0x80, 0xFC, 0x00, 0x03, 0xF0, 0x1F, 0x80, 0x00, 0x7C, 0x03, 0xF0, 0x00, - 0x0F, 0x80, 0x7E, 0x00, 0x03, 0xF0, 0x0F, 0x80, 0x3F, 0xFF, 0xFF, 0xFF, - 0xE7, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, - 0xFF, 0xF3, 0xFF, 0xFF, 0xFF, 0xFE, 0x7F, 0xFF, 0xFF, 0xFF, 0xC0, 0x1F, - 0x00, 0xFC, 0x00, 0x07, 0xE0, 0x1F, 0x00, 0x00, 0xFC, 0x03, 0xE0, 0x00, - 0x1F, 0x80, 0xFC, 0x00, 0x03, 0xF0, 0x1F, 0x80, 0x00, 0x7E, 0x03, 0xF0, - 0x00, 0x0F, 0xC0, 0x7E, 0x00, 0x01, 0xF0, 0x0F, 0xC0, 0x00, 0x00, 0x07, - 0xC0, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x01, 0xF0, - 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x03, 0xFF, 0xE0, - 0x00, 0x7F, 0xFF, 0xF0, 0x07, 0xFF, 0xFF, 0xF0, 0x3F, 0xFF, 0xFF, 0xC1, - 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFC, 0x3F, 0xFF, 0xDF, 0xE0, 0xFF, - 0x9F, 0x07, 0x87, 0xFC, 0x7C, 0x04, 0x1F, 0xE1, 0xF0, 0x00, 0x7F, 0x87, - 0xC0, 0x01, 0xFF, 0x1F, 0x00, 0x07, 0xFC, 0x7C, 0x00, 0x1F, 0xFD, 0xF0, - 0x00, 0x3F, 0xFF, 0xC0, 0x00, 0xFF, 0xFF, 0xC0, 0x01, 0xFF, 0xFF, 0xE0, - 0x03, 0xFF, 0xFF, 0xE0, 0x07, 0xFF, 0xFF, 0xE0, 0x07, 0xFF, 0xFF, 0xC0, - 0x03, 0xFF, 0xFF, 0x80, 0x01, 0xFF, 0xFE, 0x00, 0x07, 0xFF, 0xFC, 0x00, - 0x1F, 0x3F, 0xF0, 0x00, 0x7C, 0x7F, 0xC0, 0x01, 0xF0, 0xFF, 0x10, 0x07, - 0xC3, 0xFC, 0x60, 0x1F, 0x0F, 0xF3, 0xE0, 0x7C, 0x7F, 0xCF, 0xF9, 0xF7, - 0xFE, 0x7F, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xFE, - 0x0F, 0xFF, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0x80, 0x07, 0xFF, 0xF0, 0x00, - 0x00, 0x7C, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, - 0x1F, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x03, 0xF8, - 0x00, 0x03, 0xF0, 0x03, 0xFF, 0x00, 0x00, 0xFC, 0x01, 0xFF, 0xF0, 0x00, - 0x7E, 0x00, 0xFF, 0xFC, 0x00, 0x3F, 0x00, 0x3F, 0x1F, 0x80, 0x0F, 0xC0, - 0x1F, 0x83, 0xE0, 0x07, 0xE0, 0x07, 0xC0, 0xFC, 0x03, 0xF0, 0x01, 0xF0, - 0x1F, 0x00, 0xFC, 0x00, 0xFC, 0x07, 0xC0, 0x7E, 0x00, 0x3F, 0x01, 0xF0, - 0x3F, 0x00, 0x0F, 0xC0, 0x7C, 0x0F, 0xC0, 0x03, 0xF0, 0x1F, 0x07, 0xE0, - 0x00, 0x7C, 0x07, 0xC3, 0xF0, 0x00, 0x1F, 0x03, 0xF1, 0xFC, 0x00, 0x07, - 0xE0, 0xF8, 0x7E, 0x00, 0x00, 0xFF, 0xFE, 0x3F, 0x00, 0x00, 0x3F, 0xFF, - 0x1F, 0xC0, 0x00, 0x07, 0xFF, 0x87, 0xE0, 0xFE, 0x00, 0x7F, 0xC3, 0xF0, - 0xFF, 0xE0, 0x01, 0x01, 0xF8, 0x7F, 0xFC, 0x00, 0x00, 0x7E, 0x3F, 0xFF, - 0x80, 0x00, 0x3F, 0x0F, 0xC7, 0xE0, 0x00, 0x1F, 0x87, 0xE0, 0xFC, 0x00, - 0x07, 0xE1, 0xF0, 0x1F, 0x00, 0x03, 0xF0, 0x7C, 0x07, 0xC0, 0x01, 0xF8, - 0x1F, 0x01, 0xF0, 0x00, 0x7E, 0x07, 0xC0, 0x7C, 0x00, 0x3F, 0x01, 0xF0, - 0x1F, 0x00, 0x1F, 0x80, 0x7C, 0x07, 0xC0, 0x07, 0xE0, 0x1F, 0x01, 0xF0, - 0x03, 0xF0, 0x07, 0xE0, 0xFC, 0x01, 0xF8, 0x00, 0xF8, 0x3E, 0x00, 0x7E, - 0x00, 0x3F, 0xFF, 0x80, 0x3F, 0x00, 0x07, 0xFF, 0xC0, 0x1F, 0x80, 0x00, - 0xFF, 0xE0, 0x0F, 0xE0, 0x00, 0x1F, 0xF0, 0x00, 0x3F, 0xF0, 0x00, 0x00, - 0x3F, 0xFF, 0x00, 0x00, 0x1F, 0xFF, 0xE0, 0x00, 0x0F, 0xFF, 0xFC, 0x00, - 0x07, 0xFF, 0xFF, 0x80, 0x01, 0xFE, 0x1F, 0xE0, 0x00, 0xFF, 0x03, 0xF8, - 0x00, 0x3F, 0x80, 0x7E, 0x00, 0x0F, 0xE0, 0x1F, 0x80, 0x03, 0xF8, 0x0F, - 0xE0, 0x00, 0xFF, 0x03, 0xF8, 0x00, 0x1F, 0xE1, 0xFE, 0x00, 0x07, 0xFD, - 0xFF, 0x00, 0x01, 0xFF, 0xFF, 0x80, 0x00, 0x3F, 0xFF, 0xC0, 0x00, 0x07, - 0xFF, 0xE0, 0x00, 0x01, 0xFF, 0xE0, 0x00, 0x00, 0xFF, 0xF8, 0x00, 0x00, - 0xFF, 0xFF, 0x01, 0xC0, 0x7F, 0xFF, 0xE0, 0xFE, 0x3F, 0xFF, 0xFC, 0x3F, - 0x9F, 0xF1, 0xFF, 0x8F, 0xE7, 0xF8, 0x3F, 0xF7, 0xF3, 0xFC, 0x03, 0xFF, - 0xFC, 0xFF, 0x00, 0x7F, 0xFF, 0x3F, 0xC0, 0x0F, 0xFF, 0x8F, 0xF0, 0x01, - 0xFF, 0xE3, 0xFC, 0x00, 0x3F, 0xF0, 0xFF, 0x80, 0x0F, 0xFE, 0x3F, 0xF0, - 0x07, 0xFF, 0xC7, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, - 0xFF, 0xFF, 0xFF, 0x87, 0xFF, 0xFF, 0xCF, 0xC0, 0x7F, 0xFF, 0xE1, 0xF0, - 0x07, 0xFF, 0xC0, 0x38, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x7E, 0xFD, 0xFB, - 0xF7, 0xEF, 0xDF, 0xBF, 0x7E, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0x80, 0x03, - 0xFC, 0x1F, 0xE0, 0x7F, 0x03, 0xFC, 0x0F, 0xF0, 0x7F, 0x81, 0xFE, 0x0F, - 0xF0, 0x3F, 0xC0, 0xFF, 0x07, 0xF8, 0x1F, 0xE0, 0x7F, 0x81, 0xFE, 0x07, - 0xF0, 0x3F, 0xC0, 0xFF, 0x03, 0xFC, 0x0F, 0xF0, 0x3F, 0xC0, 0xFF, 0x03, - 0xFC, 0x0F, 0xF0, 0x3F, 0xC0, 0xFF, 0x03, 0xFC, 0x0F, 0xF0, 0x3F, 0xC0, - 0xFF, 0x03, 0xFC, 0x0F, 0xF0, 0x3F, 0xC0, 0xFF, 0x01, 0xFC, 0x07, 0xF8, - 0x1F, 0xE0, 0x7F, 0x81, 0xFE, 0x03, 0xFC, 0x0F, 0xF0, 0x3F, 0xC0, 0x7F, - 0x81, 0xFE, 0x03, 0xF8, 0x0F, 0xF0, 0x1F, 0xC0, 0x7F, 0x80, 0xFE, 0xFE, - 0x03, 0xFC, 0x07, 0xF8, 0x1F, 0xE0, 0x3F, 0xC0, 0xFF, 0x01, 0xFC, 0x07, - 0xF8, 0x1F, 0xE0, 0x3F, 0xC0, 0xFF, 0x03, 0xFC, 0x0F, 0xF0, 0x1F, 0xC0, - 0x7F, 0x81, 0xFE, 0x07, 0xF8, 0x1F, 0xE0, 0x7F, 0x80, 0xFE, 0x03, 0xF8, - 0x0F, 0xE0, 0x3F, 0xC0, 0xFF, 0x03, 0xFC, 0x0F, 0xF0, 0x3F, 0x80, 0xFE, - 0x03, 0xF8, 0x1F, 0xE0, 0x7F, 0x81, 0xFE, 0x07, 0xF8, 0x1F, 0xE0, 0x7F, - 0x83, 0xFC, 0x0F, 0xF0, 0x3F, 0xC0, 0xFF, 0x07, 0xF8, 0x1F, 0xE0, 0x7F, - 0x03, 0xFC, 0x0F, 0xF0, 0x7F, 0x81, 0xFE, 0x0F, 0xF0, 0x3F, 0x80, 0x00, - 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x02, 0x0F, 0x04, 0x78, 0xF1, 0xE7, - 0xCF, 0x3E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xC0, 0xFF, 0xF0, - 0x07, 0xFE, 0x01, 0xFF, 0xF8, 0x7F, 0xFF, 0xEF, 0xFF, 0xFF, 0xFE, 0xF7, - 0xF7, 0x8F, 0x1E, 0x30, 0xF0, 0xE0, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, - 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, - 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, - 0x00, 0x00, 0x7F, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x7F, - 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, - 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, - 0x00, 0x3F, 0x1F, 0xEF, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFE, 0x3F, - 0x8F, 0xC3, 0xF0, 0xF8, 0x7E, 0x1F, 0x87, 0xC1, 0xF0, 0xFC, 0x00, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, - 0x3F, 0x1F, 0xEF, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFE, 0x3F, 0x00, - 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, - 0x00, 0x00, 0xFE, 0x00, 0x01, 0xFC, 0x00, 0x01, 0xFC, 0x00, 0x01, 0xFC, - 0x00, 0x03, 0xF8, 0x00, 0x03, 0xF8, 0x00, 0x07, 0xF8, 0x00, 0x07, 0xF0, - 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xE0, 0x00, 0x0F, 0xE0, - 0x00, 0x1F, 0xC0, 0x00, 0x1F, 0xC0, 0x00, 0x1F, 0xC0, 0x00, 0x3F, 0x80, - 0x00, 0x3F, 0x80, 0x00, 0x3F, 0x80, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, - 0x00, 0x7F, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, - 0x01, 0xFC, 0x00, 0x01, 0xFC, 0x00, 0x03, 0xFC, 0x00, 0x03, 0xF8, 0x00, - 0x03, 0xF8, 0x00, 0x07, 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x07, 0xF0, 0x00, - 0x0F, 0xE0, 0x00, 0x0F, 0xE0, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0xC0, 0x00, - 0x1F, 0xC0, 0x00, 0x1F, 0xC0, 0x00, 0x3F, 0x80, 0x00, 0x3F, 0x80, 0x00, - 0x3F, 0x80, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, - 0x00, 0x3F, 0xF0, 0x00, 0x01, 0xFF, 0xFC, 0x00, 0x0F, 0xFF, 0xFC, 0x00, - 0x3F, 0xFF, 0xFC, 0x00, 0xFF, 0xFF, 0xFC, 0x01, 0xFF, 0xFF, 0xFC, 0x07, - 0xFF, 0xFF, 0xFC, 0x1F, 0xF8, 0x1F, 0xF8, 0x3F, 0xE0, 0x0F, 0xF8, 0xFF, - 0x80, 0x1F, 0xF1, 0xFF, 0x00, 0x1F, 0xF3, 0xFC, 0x00, 0x3F, 0xEF, 0xF8, - 0x00, 0x3F, 0xDF, 0xF0, 0x00, 0x7F, 0xBF, 0xE0, 0x00, 0xFF, 0x7F, 0x80, - 0x01, 0xFE, 0xFF, 0x00, 0x03, 0xFF, 0xFE, 0x00, 0x07, 0xFF, 0xFC, 0x00, - 0x0F, 0xFF, 0xF8, 0x00, 0x1F, 0xFF, 0xF8, 0x00, 0x3F, 0xFF, 0xF0, 0x00, - 0x7F, 0xBF, 0xE0, 0x00, 0xFF, 0x7F, 0xC0, 0x01, 0xFE, 0x7F, 0x80, 0x07, - 0xFC, 0xFF, 0x80, 0x0F, 0xF9, 0xFF, 0x00, 0x1F, 0xE1, 0xFF, 0x00, 0x7F, - 0xC3, 0xFF, 0x01, 0xFF, 0x03, 0xFF, 0x9F, 0xFE, 0x07, 0xFF, 0xFF, 0xF8, - 0x07, 0xFF, 0xFF, 0xF0, 0x07, 0xFF, 0xFF, 0xC0, 0x07, 0xFF, 0xFE, 0x00, - 0x07, 0xFF, 0xF8, 0x00, 0x03, 0xFF, 0xC0, 0x00, 0x00, 0x78, 0x00, 0x00, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0x01, 0xFF, 0x01, 0xFF, 0x01, 0xFF, 0x01, 0xFF, 0x01, 0xFF, - 0x01, 0xFF, 0x01, 0xFF, 0x01, 0xFF, 0x01, 0xFF, 0x01, 0xFF, 0x01, 0xFF, - 0x01, 0xFF, 0x01, 0xFF, 0x01, 0xFF, 0x01, 0xFF, 0x01, 0xFF, 0x01, 0xFF, - 0x01, 0xFF, 0x01, 0xFF, 0x01, 0xFF, 0x01, 0xFF, 0x01, 0xFF, 0x01, 0xFF, - 0x01, 0xFF, 0x01, 0xFF, 0x01, 0xFF, 0x01, 0xFF, 0x01, 0xFF, 0x01, 0xFF, - 0x00, 0xFF, 0xF0, 0x00, 0x1F, 0xFF, 0xE0, 0x03, 0xFF, 0xFF, 0xC0, 0x3F, - 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xFC, 0x3F, 0xFF, 0xFF, 0xE3, 0xFF, 0xFF, - 0xFF, 0x87, 0xF0, 0x0F, 0xFC, 0x1F, 0x00, 0x3F, 0xE0, 0x30, 0x00, 0xFF, - 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x01, 0xFE, 0x00, - 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x0F, 0xF8, 0x00, 0x00, - 0x7F, 0xC0, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x0F, 0xFE, - 0x00, 0x00, 0xFF, 0xE0, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0xFF, 0xC0, 0x00, - 0x0F, 0xFC, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0xFF, - 0xC0, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x0F, 0xFF, 0xFF, - 0xFC, 0xFF, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xF9, - 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xFE, 0x7F, 0xFF, 0xFF, 0xF0, 0x3F, - 0xFF, 0xFF, 0xE3, 0xFF, 0xFF, 0xFE, 0x3F, 0xFF, 0xFF, 0xE3, 0xFF, 0xFF, - 0xFE, 0x3F, 0xFF, 0xFF, 0xE3, 0xFF, 0xFF, 0xFE, 0x3F, 0xFF, 0xFF, 0xC0, - 0x00, 0x0F, 0xF8, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x03, - 0xFC, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x0F, 0xF8, 0x00, 0x01, 0xFF, 0x00, - 0x00, 0x3F, 0xE0, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x03, - 0xFF, 0xF8, 0x00, 0x3F, 0xFF, 0xC0, 0x03, 0xFF, 0xFE, 0x00, 0x3F, 0xFF, - 0xE0, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0xFF, 0x00, - 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x0F, 0xF1, 0x80, 0x01, - 0xFF, 0x3E, 0x00, 0x3F, 0xF3, 0xFE, 0x1F, 0xFE, 0x7F, 0xFF, 0xFF, 0xE7, - 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0x87, 0xFF, 0xFF, 0xF0, 0x1F, 0xFF, - 0xFE, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0xFF, - 0x80, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x00, 0x7F, - 0xC0, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x00, 0x3F, - 0xE0, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x00, 0x1F, - 0xE0, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x1F, - 0xF0, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x0F, - 0xF8, 0x3F, 0xC0, 0x0F, 0xF8, 0x1F, 0xE0, 0x07, 0xFC, 0x0F, 0xF0, 0x07, - 0xFC, 0x07, 0xF8, 0x07, 0xFC, 0x03, 0xFC, 0x07, 0xFC, 0x01, 0xFE, 0x03, - 0xFE, 0x00, 0xFF, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0xFF, - 0x00, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x00, 0x1F, - 0xE0, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x03, - 0xFC, 0x00, 0x0F, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFC, 0x0F, 0xFF, 0xFF, - 0xC0, 0xFF, 0xFF, 0xFC, 0x0F, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFC, 0x1F, - 0xFF, 0xFF, 0xC1, 0xFE, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x01, 0xFE, 0x00, - 0x00, 0x1F, 0xE0, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x01, - 0xFC, 0x00, 0x00, 0x1F, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0xC0, 0x3F, 0xFF, - 0xFF, 0x03, 0xFF, 0xFF, 0xF8, 0x3F, 0xFF, 0xFF, 0xC3, 0xFF, 0xFF, 0xFE, - 0x00, 0x03, 0xFF, 0xE0, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x1F, 0xF0, 0x00, - 0x01, 0xFF, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x1F, - 0xF3, 0x00, 0x01, 0xFF, 0x3E, 0x00, 0x3F, 0xE7, 0xFE, 0x1F, 0xFE, 0x7F, - 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0x87, 0xFF, 0xFF, - 0xF0, 0x1F, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x3C, 0x00, 0x00, - 0x00, 0x0F, 0xFF, 0x00, 0x01, 0xFF, 0xFF, 0x00, 0x3F, 0xFF, 0xFC, 0x07, - 0xFF, 0xFF, 0xC0, 0x7F, 0xFF, 0xFE, 0x07, 0xFF, 0xFF, 0xE0, 0x3F, 0xFE, - 0x7F, 0x03, 0xFF, 0x00, 0x10, 0x3F, 0xF0, 0x00, 0x01, 0xFF, 0x00, 0x00, - 0x1F, 0xF0, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x7F, - 0xC0, 0x00, 0x03, 0xFE, 0x3F, 0xF0, 0x1F, 0xE7, 0xFF, 0xE0, 0xFF, 0x7F, - 0xFF, 0xC7, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, - 0xEF, 0xFF, 0x01, 0xFF, 0xFF, 0xF0, 0x07, 0xFF, 0xFF, 0x00, 0x1F, 0xFF, - 0xF0, 0x00, 0xFF, 0x7F, 0x80, 0x07, 0xFB, 0xFC, 0x00, 0x3F, 0xDF, 0xE0, - 0x01, 0xFE, 0xFF, 0x80, 0x0F, 0xF3, 0xFC, 0x00, 0xFF, 0x9F, 0xF8, 0x0F, - 0xFC, 0x7F, 0xFF, 0xFF, 0xC1, 0xFF, 0xFF, 0xFC, 0x07, 0xFF, 0xFF, 0xE0, - 0x1F, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0xC0, 0x00, 0xFF, 0xF8, 0x00, 0x00, - 0x38, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x03, 0xFE, 0xFF, 0x00, 0x1F, 0xF7, - 0xF8, 0x01, 0xFF, 0x3F, 0xC0, 0x0F, 0xF9, 0xFE, 0x00, 0x7F, 0x8F, 0xF0, - 0x07, 0xFC, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x1F, - 0xF0, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0xFF, 0x80, - 0x00, 0x07, 0xFC, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x03, 0xFE, 0x00, 0x00, - 0x1F, 0xF0, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0xFF, - 0x80, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x03, 0xFE, 0x00, - 0x00, 0x1F, 0xF0, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, - 0xFF, 0x80, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x03, 0xFE, - 0x00, 0x00, 0x00, 0x7F, 0xF8, 0x00, 0x0F, 0xFF, 0xF8, 0x00, 0x7F, 0xFF, - 0xF8, 0x03, 0xFF, 0xFF, 0xF0, 0x1F, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFF, - 0xC3, 0xFE, 0x03, 0xFF, 0x1F, 0xF0, 0x07, 0xFC, 0x7F, 0xC0, 0x0F, 0xF1, - 0xFE, 0x00, 0x3F, 0xE7, 0xF8, 0x00, 0xFF, 0x9F, 0xE0, 0x03, 0xFC, 0x7F, - 0xC0, 0x0F, 0xF0, 0xFF, 0x80, 0x7F, 0xC3, 0xFF, 0xCF, 0xFE, 0x07, 0xFF, - 0xFF, 0xF8, 0x0F, 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, 0xFE, 0x01, 0xFF, 0xFF, - 0xFC, 0x0F, 0xFF, 0xFF, 0xFC, 0x7F, 0xF8, 0xFF, 0xF1, 0xFF, 0x00, 0x7F, - 0xEF, 0xF8, 0x00, 0x7F, 0xBF, 0xE0, 0x01, 0xFF, 0xFF, 0x00, 0x07, 0xFF, - 0xFC, 0x00, 0x1F, 0xFF, 0xF0, 0x00, 0x7F, 0xFF, 0xE0, 0x01, 0xFF, 0xFF, - 0x80, 0x0F, 0xF9, 0xFF, 0x00, 0x7F, 0xE7, 0xFF, 0xDF, 0xFF, 0x8F, 0xFF, - 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0xE0, 0x3F, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, - 0xF0, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x07, 0x40, 0x00, 0x00, 0xFF, 0xE0, - 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0xE0, 0x07, 0xFF, 0xFF, 0xC0, - 0x3F, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xFF, 0x07, 0xFE, 0x07, 0xFE, 0x1F, - 0xF0, 0x07, 0xF8, 0xFF, 0x80, 0x0F, 0xF3, 0xFC, 0x00, 0x3F, 0xCF, 0xF0, - 0x00, 0xFF, 0xBF, 0xC0, 0x03, 0xFE, 0xFF, 0x00, 0x0F, 0xFB, 0xFE, 0x00, - 0x3F, 0xEF, 0xF8, 0x01, 0xFF, 0x9F, 0xF0, 0x0F, 0xFE, 0x7F, 0xFF, 0xFF, - 0xF8, 0xFF, 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, 0xFF, 0x87, 0xFF, 0xFF, 0xFE, - 0x07, 0xFF, 0xF7, 0xF8, 0x0F, 0xFF, 0x1F, 0xE0, 0x01, 0xE0, 0x7F, 0x80, - 0x00, 0x01, 0xFE, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x3F, 0xC0, 0x00, - 0x01, 0xFF, 0x00, 0x00, 0x0F, 0xF8, 0x08, 0x00, 0x7F, 0xE0, 0x3C, 0x0F, - 0xFF, 0x01, 0xFF, 0xFF, 0xF8, 0x07, 0xFF, 0xFF, 0xE0, 0x3F, 0xFF, 0xFF, - 0x00, 0xFF, 0xFF, 0xF0, 0x03, 0xFF, 0xFF, 0x80, 0x03, 0xFF, 0xF0, 0x00, - 0x00, 0x78, 0x00, 0x00, 0x3F, 0x1F, 0xEF, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF9, 0xFE, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x03, 0xF1, 0xFE, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, - 0xE3, 0xF0, 0x3F, 0x1F, 0xEF, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFE, - 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x03, 0xF1, 0xFE, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xE3, 0xF8, - 0xFC, 0x3F, 0x0F, 0x87, 0xE1, 0xF8, 0x7C, 0x1F, 0x0F, 0xC0, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x7F, 0x00, 0x03, 0xFF, 0x00, 0x0F, - 0xFF, 0x00, 0x7F, 0xFF, 0x03, 0xFF, 0xFE, 0x0F, 0xFF, 0xF0, 0x7F, 0xFF, - 0xC0, 0xFF, 0xFE, 0x00, 0xFF, 0xF0, 0x00, 0xFF, 0x80, 0x00, 0xFF, 0x00, - 0x00, 0xFF, 0xE0, 0x00, 0xFF, 0xFC, 0x00, 0xFF, 0xFF, 0x80, 0x1F, 0xFF, - 0xE0, 0x07, 0xFF, 0xFC, 0x00, 0xFF, 0xFF, 0x00, 0x1F, 0xFF, 0x00, 0x07, - 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x07, 0x00, 0x00, - 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, - 0x00, 0xF8, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0xFF, 0xF8, - 0x00, 0xFF, 0xFF, 0x00, 0x3F, 0xFF, 0xC0, 0x0F, 0xFF, 0xF8, 0x01, 0xFF, - 0xFF, 0x00, 0x3F, 0xFF, 0x00, 0x07, 0xFF, 0x00, 0x01, 0xFF, 0x00, 0x00, - 0xFF, 0x00, 0x07, 0xFF, 0x00, 0x1F, 0xFF, 0x00, 0xFF, 0xFF, 0x07, 0xFF, - 0xFC, 0x3F, 0xFF, 0xE0, 0xFF, 0xFF, 0x00, 0xFF, 0xFC, 0x00, 0xFF, 0xE0, - 0x00, 0xFF, 0x80, 0x00, 0xFC, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x80, 0x00, - 0x00, 0x00, 0xFF, 0xF0, 0x00, 0x7F, 0xFF, 0xC0, 0x3F, 0xFF, 0xFC, 0x0F, - 0xFF, 0xFF, 0xC3, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x7F, - 0xF9, 0xFC, 0x03, 0xFF, 0x1F, 0x00, 0x3F, 0xE0, 0xC0, 0x03, 0xFC, 0x00, - 0x00, 0x7F, 0x80, 0x00, 0x0F, 0xF0, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x7F, - 0x80, 0x00, 0x1F, 0xF0, 0x00, 0x07, 0xFC, 0x00, 0x01, 0xFF, 0x00, 0x00, - 0x7F, 0xC0, 0x00, 0x1F, 0xF0, 0x00, 0x07, 0xFC, 0x00, 0x00, 0xFF, 0x00, - 0x00, 0x3F, 0xC0, 0x00, 0x07, 0xF8, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xC0, 0x00, - 0x01, 0xFC, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x0F, 0xFC, 0x00, 0x01, 0xFF, - 0x80, 0x00, 0x3F, 0xF0, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x7F, 0x80, 0x00, - 0x07, 0xE0, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0xFF, - 0xFF, 0xF0, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x03, 0xFF, - 0xFF, 0xFF, 0xC0, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x07, 0xFE, - 0x00, 0x0F, 0xFC, 0x00, 0x07, 0xFC, 0x00, 0x00, 0xFF, 0x00, 0x07, 0xF8, - 0x00, 0x00, 0x1F, 0xC0, 0x07, 0xF0, 0x00, 0x00, 0x07, 0xF0, 0x07, 0xF0, - 0x00, 0x00, 0x01, 0xFC, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x7F, 0x03, 0xF0, - 0x07, 0xFC, 0x7F, 0x1F, 0x83, 0xF8, 0x0F, 0xFF, 0xBF, 0x87, 0xE1, 0xF8, - 0x0F, 0xFF, 0xFF, 0xC1, 0xF1, 0xFC, 0x0F, 0xFF, 0xFF, 0xE0, 0xFC, 0xFC, - 0x0F, 0xFF, 0xFF, 0xF0, 0x7E, 0x7E, 0x07, 0xFF, 0xFF, 0xF8, 0x1F, 0x3E, - 0x07, 0xFC, 0x07, 0xFC, 0x0F, 0xBF, 0x03, 0xFC, 0x01, 0xFE, 0x07, 0xFF, - 0x83, 0xFC, 0x00, 0x7F, 0x03, 0xFF, 0xC1, 0xFC, 0x00, 0x3F, 0x80, 0xFF, - 0xE0, 0xFE, 0x00, 0x1F, 0xC0, 0x7F, 0xF0, 0x7F, 0x00, 0x07, 0xE0, 0x3F, - 0xF8, 0x3F, 0x80, 0x03, 0xF0, 0x1F, 0xFC, 0x1F, 0xC0, 0x01, 0xF8, 0x0F, - 0xFE, 0x0F, 0xE0, 0x01, 0xFC, 0x0F, 0xFF, 0x07, 0xF0, 0x00, 0xFE, 0x07, - 0xDF, 0x83, 0xFC, 0x00, 0x7F, 0x03, 0xE7, 0xC0, 0xFF, 0x00, 0x7F, 0x81, - 0xF3, 0xF0, 0x7F, 0xC0, 0x7F, 0xE1, 0xF9, 0xF8, 0x1F, 0xFF, 0xFF, 0xF9, - 0xF8, 0xFC, 0x0F, 0xFF, 0xFF, 0xFF, 0xFC, 0x3F, 0x03, 0xFF, 0xFE, 0xFF, - 0xFC, 0x1F, 0xC0, 0xFF, 0xFE, 0x7F, 0xFC, 0x07, 0xE0, 0x3F, 0xFE, 0x1F, - 0xFC, 0x03, 0xF8, 0x07, 0xFC, 0x07, 0xF8, 0x00, 0xFE, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x00, - 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x40, 0x00, 0x01, 0xFF, 0xC0, 0x00, - 0xE0, 0x00, 0x00, 0x3F, 0xFF, 0x0F, 0xF0, 0x00, 0x00, 0x0F, 0xFF, 0xFF, - 0xFC, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x3F, 0xFF, - 0xFE, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x06, - 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, - 0x00, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, - 0x03, 0xFF, 0x80, 0x00, 0x00, 0x07, 0xFF, 0xC0, 0x00, 0x00, 0x07, 0xFF, - 0xC0, 0x00, 0x00, 0x0F, 0xFF, 0xE0, 0x00, 0x00, 0x0F, 0xEF, 0xE0, 0x00, - 0x00, 0x1F, 0xEF, 0xF0, 0x00, 0x00, 0x1F, 0xEF, 0xF0, 0x00, 0x00, 0x3F, - 0xC7, 0xF8, 0x00, 0x00, 0x3F, 0xC7, 0xF8, 0x00, 0x00, 0x3F, 0x83, 0xFC, - 0x00, 0x00, 0x7F, 0x83, 0xFC, 0x00, 0x00, 0x7F, 0x83, 0xFC, 0x00, 0x00, - 0xFF, 0x01, 0xFE, 0x00, 0x00, 0xFF, 0x01, 0xFE, 0x00, 0x01, 0xFE, 0x00, - 0xFF, 0x00, 0x01, 0xFE, 0x00, 0xFF, 0x00, 0x03, 0xFC, 0x00, 0xFF, 0x80, - 0x03, 0xFC, 0x00, 0x7F, 0x80, 0x03, 0xFF, 0xFF, 0xFF, 0xC0, 0x07, 0xFF, - 0xFF, 0xFF, 0xC0, 0x07, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, - 0xE0, 0x0F, 0xFF, 0xFF, 0xFF, 0xE0, 0x1F, 0xFF, 0xFF, 0xFF, 0xF0, 0x1F, - 0xE0, 0x00, 0x0F, 0xF0, 0x3F, 0xE0, 0x00, 0x0F, 0xF8, 0x3F, 0xC0, 0x00, - 0x07, 0xF8, 0x3F, 0xC0, 0x00, 0x07, 0xFC, 0x7F, 0x80, 0x00, 0x07, 0xFC, - 0x7F, 0x80, 0x00, 0x03, 0xFC, 0xFF, 0x80, 0x00, 0x03, 0xFE, 0xFF, 0x00, - 0x00, 0x01, 0xFE, 0xFF, 0xFF, 0xF8, 0x00, 0x7F, 0xFF, 0xFF, 0xC0, 0x3F, - 0xFF, 0xFF, 0xF8, 0x1F, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0x87, - 0xFF, 0xFF, 0xFF, 0xE3, 0xFF, 0xFF, 0xFF, 0xF9, 0xFE, 0x00, 0x0F, 0xFC, - 0xFF, 0x00, 0x03, 0xFE, 0x7F, 0x80, 0x00, 0xFF, 0x3F, 0xC0, 0x00, 0x7F, - 0x9F, 0xE0, 0x00, 0x3F, 0xCF, 0xF0, 0x00, 0x3F, 0xE7, 0xF8, 0x00, 0x1F, - 0xE3, 0xFC, 0x00, 0x3F, 0xF1, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, - 0xF0, 0x7F, 0xFF, 0xFF, 0xF0, 0x3F, 0xFF, 0xFF, 0xFE, 0x1F, 0xFF, 0xFF, - 0xFF, 0x8F, 0xFF, 0xFF, 0xFF, 0xE7, 0xF8, 0x00, 0x1F, 0xFB, 0xFC, 0x00, - 0x07, 0xFD, 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0x00, 0x00, 0x7F, 0xFF, 0x80, - 0x00, 0x3F, 0xFF, 0xC0, 0x00, 0x3F, 0xFF, 0xE0, 0x00, 0x1F, 0xFF, 0xF0, - 0x00, 0x1F, 0xFF, 0xF8, 0x00, 0x3F, 0xFB, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, - 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFC, 0x7F, 0xFF, 0xFF, 0xFC, 0x3F, - 0xFF, 0xFF, 0xF8, 0x1F, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x07, 0xFF, 0xC0, - 0x00, 0x07, 0xFF, 0xFC, 0x00, 0x07, 0xFF, 0xFF, 0xC0, 0x07, 0xFF, 0xFF, - 0xF8, 0x03, 0xFF, 0xFF, 0xFF, 0x81, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, - 0xFF, 0xFC, 0x7F, 0xF8, 0x03, 0xFC, 0x1F, 0xF8, 0x00, 0x3E, 0x0F, 0xFC, - 0x00, 0x07, 0x03, 0xFE, 0x00, 0x00, 0x81, 0xFF, 0x00, 0x00, 0x00, 0x7F, - 0xC0, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x03, - 0xFE, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x00, - 0x0F, 0xF0, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, - 0x00, 0x3F, 0xE0, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x01, 0xFE, 0x00, - 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x03, 0xFF, - 0x00, 0x00, 0xC0, 0xFF, 0xE0, 0x00, 0xF8, 0x1F, 0xFE, 0x00, 0x7F, 0x03, - 0xFF, 0xF9, 0xFF, 0xE0, 0x7F, 0xFF, 0xFF, 0xFC, 0x0F, 0xFF, 0xFF, 0xFE, - 0x01, 0xFF, 0xFF, 0xFF, 0x00, 0x3F, 0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xFF, - 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0xFF, 0xFF, - 0xF0, 0x00, 0x0F, 0xFF, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0xFF, 0xE0, 0x0F, - 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x0F, 0xFF, 0xFF, 0xFF, - 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xF8, 0x00, 0xFF, 0xF8, 0xFF, 0x80, - 0x03, 0xFF, 0x8F, 0xF8, 0x00, 0x0F, 0xFC, 0xFF, 0x80, 0x00, 0x7F, 0xEF, - 0xF8, 0x00, 0x03, 0xFE, 0xFF, 0x80, 0x00, 0x3F, 0xEF, 0xF8, 0x00, 0x01, - 0xFF, 0xFF, 0x80, 0x00, 0x1F, 0xFF, 0xF8, 0x00, 0x01, 0xFF, 0xFF, 0x80, - 0x00, 0x0F, 0xFF, 0xF8, 0x00, 0x00, 0xFF, 0xFF, 0x80, 0x00, 0x0F, 0xFF, - 0xF8, 0x00, 0x00, 0xFF, 0xFF, 0x80, 0x00, 0x0F, 0xFF, 0xF8, 0x00, 0x01, - 0xFF, 0xFF, 0x80, 0x00, 0x1F, 0xFF, 0xF8, 0x00, 0x01, 0xFE, 0xFF, 0x80, - 0x00, 0x3F, 0xEF, 0xF8, 0x00, 0x07, 0xFE, 0xFF, 0x80, 0x00, 0xFF, 0xCF, - 0xF8, 0x00, 0x1F, 0xFC, 0xFF, 0x80, 0x07, 0xFF, 0x8F, 0xFF, 0xFF, 0xFF, - 0xF0, 0xFF, 0xFF, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, - 0xFF, 0xF8, 0x0F, 0xFF, 0xFF, 0xFE, 0x00, 0xFF, 0xFF, 0xFF, 0x80, 0x0F, - 0xFF, 0xFF, 0xC0, 0x00, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFE, 0xFF, - 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, - 0xFE, 0xFF, 0xFF, 0xFF, 0xEF, 0xF0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x0F, - 0xF0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFF, 0x00, - 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xF8, - 0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0x8F, 0xFF, - 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0x8F, 0xF0, 0x00, 0x00, 0xFF, 0x00, 0x00, - 0x0F, 0xF0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFF, - 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x0F, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, - 0x00, 0xFF, 0x80, 0x00, 0x1F, 0xF0, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x7F, - 0xC0, 0x00, 0x0F, 0xF8, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x3F, 0xE0, 0x00, - 0x07, 0xFC, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, 0xF3, 0xFF, - 0xFF, 0xFE, 0x7F, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xFF, - 0x3F, 0xFF, 0xFF, 0xE7, 0xFC, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x1F, 0xF0, - 0x00, 0x03, 0xFE, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x0F, 0xF8, 0x00, 0x01, - 0xFF, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x07, 0xFC, 0x00, 0x00, 0xFF, 0x80, - 0x00, 0x1F, 0xF0, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x00, - 0x00, 0x07, 0xFF, 0xC0, 0x00, 0x03, 0xFF, 0xFF, 0x00, 0x01, 0xFF, 0xFF, - 0xF8, 0x00, 0xFF, 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0xFF, 0xF8, 0x0F, 0xFF, - 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xF0, 0x07, 0xFC, 0x1F, - 0xF8, 0x00, 0x3F, 0x07, 0xFE, 0x00, 0x01, 0xC0, 0xFF, 0x80, 0x00, 0x10, - 0x3F, 0xE0, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x00, - 0x00, 0x3F, 0xE0, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0xFF, 0x00, - 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0xFF, 0x7F, - 0x80, 0x00, 0x1F, 0xEF, 0xF8, 0x00, 0x03, 0xFD, 0xFF, 0x00, 0x00, 0x7F, - 0xBF, 0xE0, 0x00, 0x0F, 0xF3, 0xFE, 0x00, 0x01, 0xFE, 0x7F, 0xC0, 0x00, - 0x3F, 0xCF, 0xFC, 0x00, 0x07, 0xF8, 0xFF, 0xC0, 0x00, 0xFF, 0x1F, 0xFC, - 0x00, 0x1F, 0xE1, 0xFF, 0xE0, 0x07, 0xFC, 0x1F, 0xFF, 0xCF, 0xFF, 0x81, - 0xFF, 0xFF, 0xFF, 0xF0, 0x1F, 0xFF, 0xFF, 0xFE, 0x01, 0xFF, 0xFF, 0xFF, - 0x80, 0x1F, 0xFF, 0xFF, 0xE0, 0x00, 0xFF, 0xFF, 0xF0, 0x00, 0x07, 0xFF, - 0xF0, 0x00, 0x00, 0x03, 0x80, 0x00, 0xFF, 0x80, 0x00, 0x7F, 0xFF, 0xC0, - 0x00, 0x3F, 0xFF, 0xE0, 0x00, 0x1F, 0xFF, 0xF0, 0x00, 0x0F, 0xFF, 0xF8, - 0x00, 0x07, 0xFF, 0xFC, 0x00, 0x03, 0xFF, 0xFE, 0x00, 0x01, 0xFF, 0xFF, - 0x00, 0x00, 0xFF, 0xFF, 0x80, 0x00, 0x7F, 0xFF, 0xC0, 0x00, 0x3F, 0xFF, - 0xE0, 0x00, 0x1F, 0xFF, 0xF0, 0x00, 0x0F, 0xFF, 0xF8, 0x00, 0x07, 0xFF, - 0xFC, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x03, - 0xFF, 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x80, 0x00, - 0x7F, 0xFF, 0xC0, 0x00, 0x3F, 0xFF, 0xE0, 0x00, 0x1F, 0xFF, 0xF0, 0x00, - 0x0F, 0xFF, 0xF8, 0x00, 0x07, 0xFF, 0xFC, 0x00, 0x03, 0xFF, 0xFE, 0x00, - 0x01, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x80, 0x00, 0x7F, 0xFF, 0xC0, - 0x00, 0x3F, 0xFF, 0xE0, 0x00, 0x1F, 0xFF, 0xF0, 0x00, 0x0F, 0xF0, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0x87, 0xFF, 0xFF, 0xC3, 0xFF, - 0xFF, 0xE1, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xF8, 0x7F, 0xFF, 0xFC, 0x3F, - 0xFF, 0xFE, 0x00, 0x01, 0xFF, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x7F, 0xC0, - 0x00, 0x3F, 0xE0, 0x00, 0x1F, 0xF0, 0x00, 0x0F, 0xF8, 0x00, 0x07, 0xFC, - 0x00, 0x03, 0xFE, 0x00, 0x01, 0xFF, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x7F, - 0xC0, 0x00, 0x3F, 0xE0, 0x00, 0x1F, 0xF0, 0x00, 0x0F, 0xF8, 0x00, 0x07, - 0xFC, 0x00, 0x03, 0xFE, 0x00, 0x01, 0xFF, 0x00, 0x00, 0xFF, 0x80, 0x00, - 0x7F, 0xC2, 0x00, 0x3F, 0xC3, 0x80, 0x1F, 0xE1, 0xE0, 0x1F, 0xF1, 0xFC, - 0x3F, 0xF9, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xFC, 0x7F, 0xFF, 0xFC, 0x1F, - 0xFF, 0xFC, 0x03, 0xFF, 0xFC, 0x00, 0x7F, 0xF8, 0x00, 0x01, 0x80, 0x00, - 0xFF, 0x00, 0x00, 0xFF, 0xBF, 0xC0, 0x00, 0x7F, 0xCF, 0xF0, 0x00, 0x3F, - 0xE3, 0xFC, 0x00, 0x1F, 0xF0, 0xFF, 0x00, 0x0F, 0xFC, 0x3F, 0xC0, 0x07, - 0xFE, 0x0F, 0xF0, 0x03, 0xFF, 0x03, 0xFC, 0x01, 0xFF, 0x80, 0xFF, 0x00, - 0xFF, 0xC0, 0x3F, 0xC0, 0x7F, 0xE0, 0x0F, 0xF0, 0x1F, 0xF0, 0x03, 0xFC, - 0x0F, 0xF8, 0x00, 0xFF, 0x07, 0xFC, 0x00, 0x3F, 0xC3, 0xFE, 0x00, 0x0F, - 0xF1, 0xFF, 0x00, 0x03, 0xFC, 0xFF, 0x80, 0x00, 0xFF, 0x7F, 0xE0, 0x00, - 0x3F, 0xFF, 0xFC, 0x00, 0x0F, 0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xFF, 0xE0, - 0x00, 0xFF, 0xFF, 0xFC, 0x00, 0x3F, 0xFF, 0xFF, 0x80, 0x0F, 0xFF, 0xBF, - 0xF0, 0x03, 0xFF, 0xCF, 0xFC, 0x00, 0xFF, 0xE1, 0xFF, 0x80, 0x3F, 0xF0, - 0x3F, 0xF0, 0x0F, 0xF8, 0x07, 0xFE, 0x03, 0xFC, 0x00, 0xFF, 0xC0, 0xFF, - 0x00, 0x1F, 0xF0, 0x3F, 0xC0, 0x07, 0xFE, 0x0F, 0xF0, 0x00, 0xFF, 0xC3, - 0xFC, 0x00, 0x1F, 0xF8, 0xFF, 0x00, 0x03, 0xFF, 0x3F, 0xC0, 0x00, 0x7F, - 0xCF, 0xF0, 0x00, 0x1F, 0xFB, 0xFC, 0x00, 0x03, 0xFF, 0xFF, 0x80, 0x00, - 0x3F, 0xE0, 0x00, 0x0F, 0xF8, 0x00, 0x03, 0xFE, 0x00, 0x00, 0xFF, 0x80, - 0x00, 0x3F, 0xE0, 0x00, 0x0F, 0xF8, 0x00, 0x03, 0xFE, 0x00, 0x00, 0xFF, - 0x80, 0x00, 0x3F, 0xE0, 0x00, 0x0F, 0xF8, 0x00, 0x03, 0xFE, 0x00, 0x00, - 0xFF, 0x80, 0x00, 0x3F, 0xE0, 0x00, 0x0F, 0xF8, 0x00, 0x03, 0xFE, 0x00, - 0x00, 0xFF, 0x80, 0x00, 0x3F, 0xE0, 0x00, 0x0F, 0xF8, 0x00, 0x03, 0xFE, - 0x00, 0x00, 0xFF, 0x80, 0x00, 0x3F, 0xE0, 0x00, 0x0F, 0xF8, 0x00, 0x03, - 0xFE, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x3F, 0xE0, 0x00, 0x0F, 0xF8, 0x00, - 0x03, 0xFE, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x7F, 0xFF, - 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x80, 0x00, - 0x00, 0xFF, 0xFF, 0xC0, 0x00, 0x01, 0xFF, 0xFF, 0xC0, 0x00, 0x03, 0xFF, - 0xFF, 0xE0, 0x00, 0x03, 0xFF, 0xFF, 0xE0, 0x00, 0x07, 0xFF, 0xFF, 0xF0, - 0x00, 0x07, 0xFF, 0xFF, 0xF8, 0x00, 0x0F, 0xFF, 0xFF, 0xF8, 0x00, 0x0F, - 0xFF, 0xFF, 0xFC, 0x00, 0x1F, 0xFF, 0xFF, 0xFC, 0x00, 0x3F, 0xFF, 0xFF, - 0xFE, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x00, - 0x7F, 0x7F, 0xFF, 0x7F, 0x80, 0xFF, 0x7F, 0xFF, 0x7F, 0x81, 0xFE, 0x7F, - 0xFF, 0x3F, 0xC1, 0xFC, 0x7F, 0xFF, 0x1F, 0xE3, 0xFC, 0x7F, 0xFF, 0x1F, - 0xE3, 0xF8, 0x7F, 0xFF, 0x0F, 0xF7, 0xF8, 0x7F, 0xFF, 0x07, 0xFF, 0xF0, - 0x7F, 0xFF, 0x07, 0xFF, 0xE0, 0x7F, 0xFF, 0x03, 0xFF, 0xE0, 0x7F, 0xFF, - 0x03, 0xFF, 0xC0, 0x7F, 0xFF, 0x01, 0xFF, 0xC0, 0x7F, 0xFF, 0x00, 0xFF, - 0x80, 0x7F, 0xFF, 0x00, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0x00, 0x7F, - 0xFF, 0x00, 0x7E, 0x00, 0x7F, 0xFF, 0x00, 0x3E, 0x00, 0x7F, 0xFF, 0x00, - 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, - 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x7F, 0xFF, 0x80, - 0x00, 0x3F, 0xFF, 0xE0, 0x00, 0x1F, 0xFF, 0xF8, 0x00, 0x0F, 0xFF, 0xFE, - 0x00, 0x07, 0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xFF, 0xC0, 0x01, 0xFF, 0xFF, - 0xF0, 0x00, 0xFF, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0xFF, 0x00, 0x3F, 0xFF, - 0xFF, 0x80, 0x1F, 0xFF, 0xFF, 0xE0, 0x0F, 0xFF, 0xFF, 0xF8, 0x07, 0xFF, - 0xFF, 0xFE, 0x03, 0xFF, 0xFD, 0xFF, 0x81, 0xFF, 0xFE, 0xFF, 0xE0, 0xFF, - 0xFF, 0x3F, 0xF0, 0x7F, 0xFF, 0x8F, 0xFC, 0x3F, 0xFF, 0xC3, 0xFF, 0x1F, - 0xFF, 0xE0, 0xFF, 0xCF, 0xFF, 0xF0, 0x7F, 0xF7, 0xFF, 0xF8, 0x1F, 0xFB, - 0xFF, 0xFC, 0x07, 0xFF, 0xFF, 0xFE, 0x01, 0xFF, 0xFF, 0xFF, 0x00, 0x7F, - 0xFF, 0xFF, 0x80, 0x1F, 0xFF, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xE0, 0x03, - 0xFF, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0xF8, 0x00, 0x3F, 0xFF, 0xFC, 0x00, - 0x0F, 0xFF, 0xFE, 0x00, 0x07, 0xFF, 0xFF, 0x00, 0x01, 0xFF, 0xFF, 0x80, - 0x00, 0x7F, 0xFF, 0xC0, 0x00, 0x1F, 0xFF, 0xE0, 0x00, 0x07, 0xF0, 0x00, - 0x07, 0xFF, 0xC0, 0x00, 0x00, 0x3F, 0xFF, 0xE0, 0x00, 0x01, 0xFF, 0xFF, - 0xF0, 0x00, 0x0F, 0xFF, 0xFF, 0xF8, 0x00, 0x3F, 0xFF, 0xFF, 0xF8, 0x00, - 0xFF, 0xFF, 0xFF, 0xF8, 0x03, 0xFF, 0xFF, 0xFF, 0xF8, 0x0F, 0xFF, 0x00, - 0x7F, 0xF8, 0x1F, 0xF8, 0x00, 0x3F, 0xF0, 0x7F, 0xE0, 0x00, 0x3F, 0xF0, - 0xFF, 0x80, 0x00, 0x3F, 0xE3, 0xFE, 0x00, 0x00, 0x3F, 0xE7, 0xFC, 0x00, - 0x00, 0x7F, 0xCF, 0xF0, 0x00, 0x00, 0x7F, 0xBF, 0xE0, 0x00, 0x00, 0xFF, - 0xFF, 0xC0, 0x00, 0x01, 0xFF, 0xFF, 0x00, 0x00, 0x01, 0xFF, 0xFE, 0x00, - 0x00, 0x03, 0xFF, 0xFC, 0x00, 0x00, 0x07, 0xFF, 0xF8, 0x00, 0x00, 0x0F, - 0xFF, 0xF8, 0x00, 0x00, 0x3F, 0xFF, 0xF0, 0x00, 0x00, 0x7F, 0xFF, 0xE0, - 0x00, 0x00, 0xFF, 0xBF, 0xE0, 0x00, 0x01, 0xFE, 0x7F, 0xC0, 0x00, 0x07, - 0xFC, 0xFF, 0xC0, 0x00, 0x1F, 0xF8, 0xFF, 0xC0, 0x00, 0x7F, 0xE1, 0xFF, - 0xC0, 0x01, 0xFF, 0xC1, 0xFF, 0xE0, 0x0F, 0xFF, 0x01, 0xFF, 0xFD, 0xFF, - 0xFC, 0x01, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0xFF, 0xC0, 0x01, - 0xFF, 0xFF, 0xFF, 0x00, 0x01, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0xFF, 0xFF, - 0xE0, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, - 0xFF, 0xFF, 0xC0, 0x01, 0xFF, 0xFF, 0xFC, 0x03, 0xFF, 0xFF, 0xFE, 0x07, - 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0xFF, 0x3F, - 0xFF, 0xFF, 0xFE, 0x7F, 0xC0, 0x0F, 0xFE, 0xFF, 0x80, 0x07, 0xFD, 0xFF, - 0x00, 0x07, 0xFF, 0xFE, 0x00, 0x0F, 0xFF, 0xFC, 0x00, 0x0F, 0xFF, 0xF8, - 0x00, 0x1F, 0xFF, 0xF0, 0x00, 0x3F, 0xFF, 0xE0, 0x00, 0x7F, 0xFF, 0xC0, - 0x01, 0xFF, 0xFF, 0x80, 0x03, 0xFF, 0xFF, 0x00, 0x0F, 0xFF, 0xFE, 0x00, - 0x3F, 0xF7, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, - 0xFE, 0x3F, 0xFF, 0xFF, 0xF8, 0x7F, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFF, - 0x01, 0xFF, 0xFF, 0xF0, 0x03, 0xFE, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, - 0x0F, 0xF8, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x00, - 0x7F, 0xC0, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x03, - 0xFE, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xC0, - 0x00, 0x00, 0x0F, 0xFF, 0xF8, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0x00, 0x00, - 0x3F, 0xFF, 0xFF, 0xE0, 0x00, 0x3F, 0xFF, 0xFF, 0xF8, 0x00, 0x3F, 0xFF, - 0xFF, 0xFE, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x80, 0x3F, 0xFC, 0x01, 0xFF, - 0xE0, 0x1F, 0xF8, 0x00, 0x3F, 0xF0, 0x1F, 0xF8, 0x00, 0x0F, 0xFC, 0x0F, - 0xF8, 0x00, 0x03, 0xFE, 0x0F, 0xF8, 0x00, 0x00, 0xFF, 0x87, 0xFC, 0x00, - 0x00, 0x7F, 0xC3, 0xFC, 0x00, 0x00, 0x1F, 0xF3, 0xFE, 0x00, 0x00, 0x0F, - 0xF9, 0xFF, 0x00, 0x00, 0x07, 0xFC, 0xFF, 0x00, 0x00, 0x01, 0xFE, 0x7F, - 0x80, 0x00, 0x00, 0xFF, 0x3F, 0xC0, 0x00, 0x00, 0x7F, 0x9F, 0xE0, 0x00, - 0x00, 0x3F, 0xCF, 0xF8, 0x00, 0x00, 0x3F, 0xE7, 0xFC, 0x00, 0x00, 0x1F, - 0xF3, 0xFE, 0x00, 0x00, 0x0F, 0xF8, 0xFF, 0x80, 0x00, 0x0F, 0xF8, 0x7F, - 0xC0, 0x00, 0x07, 0xFC, 0x3F, 0xF0, 0x00, 0x07, 0xFE, 0x0F, 0xFC, 0x00, - 0x07, 0xFE, 0x07, 0xFF, 0x00, 0x07, 0xFF, 0x01, 0xFF, 0xE0, 0x0F, 0xFF, - 0x00, 0x7F, 0xFF, 0x7F, 0xFF, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0x00, 0x07, - 0xFF, 0xFF, 0xFF, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x7F, 0xFF, - 0xFF, 0x00, 0x00, 0x0F, 0xFF, 0xFE, 0x00, 0x00, 0x01, 0xFF, 0xFC, 0x00, - 0x00, 0x00, 0x07, 0xFE, 0x00, 0xC0, 0x00, 0x01, 0xFF, 0xC1, 0xF0, 0x00, - 0x00, 0x7F, 0xFF, 0xFC, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0x00, 0x00, 0x07, - 0xFF, 0xFF, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x3F, 0xFF, - 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0xFF, 0xFF, 0xE0, 0x00, 0xFF, 0xFF, - 0xFE, 0x00, 0xFF, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, - 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0xF8, 0xFF, 0x80, - 0x1F, 0xFC, 0xFF, 0x80, 0x07, 0xFC, 0xFF, 0x80, 0x03, 0xFE, 0xFF, 0x80, - 0x03, 0xFE, 0xFF, 0x80, 0x01, 0xFE, 0xFF, 0x80, 0x01, 0xFE, 0xFF, 0x80, - 0x01, 0xFE, 0xFF, 0x80, 0x01, 0xFE, 0xFF, 0x80, 0x03, 0xFE, 0xFF, 0x80, - 0x03, 0xFE, 0xFF, 0x80, 0x07, 0xFE, 0xFF, 0x80, 0x0F, 0xFC, 0xFF, 0xFF, - 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, - 0xFF, 0xE0, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, - 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0x7F, 0xC0, 0xFF, 0x80, - 0x3F, 0xE0, 0xFF, 0x80, 0x3F, 0xE0, 0xFF, 0x80, 0x1F, 0xF0, 0xFF, 0x80, - 0x0F, 0xF8, 0xFF, 0x80, 0x0F, 0xF8, 0xFF, 0x80, 0x07, 0xFC, 0xFF, 0x80, - 0x03, 0xFE, 0xFF, 0x80, 0x01, 0xFF, 0x00, 0x3F, 0xFE, 0x00, 0x07, 0xFF, - 0xFF, 0x00, 0x7F, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, - 0xF0, 0x7F, 0xFF, 0xFF, 0xC3, 0xFF, 0xC1, 0xFE, 0x0F, 0xF8, 0x00, 0x78, - 0x7F, 0xC0, 0x00, 0x41, 0xFE, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x1F, - 0xF0, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x01, 0xFF, 0xC0, 0x00, 0x03, 0xFF, - 0xE0, 0x00, 0x0F, 0xFF, 0xFC, 0x00, 0x1F, 0xFF, 0xFE, 0x00, 0x3F, 0xFF, - 0xFE, 0x00, 0x7F, 0xFF, 0xFE, 0x00, 0x7F, 0xFF, 0xFC, 0x00, 0x3F, 0xFF, - 0xF8, 0x00, 0x0F, 0xFF, 0xE0, 0x00, 0x03, 0xFF, 0xC0, 0x00, 0x03, 0xFF, - 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x0F, 0xF1, 0x00, 0x00, 0x3F, 0xC6, - 0x00, 0x00, 0xFF, 0x3E, 0x00, 0x07, 0xFC, 0xFF, 0x80, 0x7F, 0xE7, 0xFF, - 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, - 0xFF, 0x00, 0xFF, 0xFF, 0xF8, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x07, 0x40, - 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x07, 0xF8, 0x00, 0x00, 0x0F, 0xF0, 0x00, - 0x00, 0x1F, 0xE0, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x00, 0x7F, 0x80, 0x00, - 0x00, 0xFF, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, - 0x07, 0xF8, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x00, - 0x3F, 0xC0, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x01, - 0xFE, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x0F, - 0xF0, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x00, 0x7F, - 0x80, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x03, 0xFC, - 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x1F, 0xE0, - 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x00, 0x7F, 0x80, 0x00, 0xFF, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x80, 0x00, - 0xFF, 0xFF, 0x80, 0x01, 0xFF, 0x7F, 0xC0, 0x01, 0xFE, 0x7F, 0xC0, 0x03, - 0xFE, 0x7F, 0xF0, 0x07, 0xFE, 0x3F, 0xFE, 0x7F, 0xFC, 0x1F, 0xFF, 0xFF, - 0xFC, 0x1F, 0xFF, 0xFF, 0xF8, 0x0F, 0xFF, 0xFF, 0xF0, 0x07, 0xFF, 0xFF, - 0xE0, 0x01, 0xFF, 0xFF, 0x80, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x01, 0xE0, - 0x00, 0xFF, 0x80, 0x00, 0x03, 0xFD, 0xFF, 0x00, 0x00, 0x07, 0xFB, 0xFE, - 0x00, 0x00, 0x1F, 0xF3, 0xFE, 0x00, 0x00, 0x3F, 0xC7, 0xFC, 0x00, 0x00, - 0x7F, 0x87, 0xFC, 0x00, 0x01, 0xFE, 0x0F, 0xF8, 0x00, 0x03, 0xFC, 0x0F, - 0xF8, 0x00, 0x0F, 0xF0, 0x1F, 0xF0, 0x00, 0x1F, 0xE0, 0x1F, 0xE0, 0x00, - 0x7F, 0xC0, 0x3F, 0xE0, 0x00, 0xFF, 0x00, 0x7F, 0xC0, 0x03, 0xFE, 0x00, - 0x7F, 0xC0, 0x07, 0xF8, 0x00, 0xFF, 0x80, 0x0F, 0xF0, 0x00, 0xFF, 0x80, - 0x3F, 0xC0, 0x01, 0xFF, 0x00, 0x7F, 0x80, 0x01, 0xFE, 0x01, 0xFF, 0x00, - 0x03, 0xFE, 0x03, 0xFC, 0x00, 0x07, 0xFC, 0x0F, 0xF8, 0x00, 0x07, 0xFC, - 0x1F, 0xE0, 0x00, 0x0F, 0xF8, 0x3F, 0xC0, 0x00, 0x0F, 0xF8, 0xFF, 0x00, - 0x00, 0x1F, 0xF1, 0xFE, 0x00, 0x00, 0x1F, 0xE7, 0xFC, 0x00, 0x00, 0x3F, - 0xEF, 0xF0, 0x00, 0x00, 0x7F, 0xFF, 0xE0, 0x00, 0x00, 0x7F, 0xFF, 0x80, - 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFC, 0x00, 0x00, 0x01, - 0xFF, 0xF8, 0x00, 0x00, 0x01, 0xFF, 0xE0, 0x00, 0x00, 0x03, 0xFF, 0xC0, - 0x00, 0x00, 0x07, 0xFF, 0x80, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x00, - 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFF, 0x80, 0x00, - 0x7F, 0x80, 0x00, 0x7F, 0xBF, 0xC0, 0x00, 0x3F, 0xC0, 0x00, 0x3F, 0xDF, - 0xE0, 0x00, 0x3F, 0xF0, 0x00, 0x1F, 0xCF, 0xF8, 0x00, 0x1F, 0xF8, 0x00, - 0x1F, 0xE3, 0xFC, 0x00, 0x0F, 0xFC, 0x00, 0x0F, 0xF1, 0xFE, 0x00, 0x0F, - 0xFE, 0x00, 0x07, 0xF8, 0xFF, 0x80, 0x07, 0xFF, 0x80, 0x07, 0xF8, 0x7F, - 0xC0, 0x03, 0xFF, 0xC0, 0x03, 0xFC, 0x1F, 0xE0, 0x03, 0xFF, 0xE0, 0x01, - 0xFE, 0x0F, 0xF8, 0x01, 0xFF, 0xF8, 0x01, 0xFE, 0x07, 0xFC, 0x00, 0xFF, - 0xFC, 0x00, 0xFF, 0x01, 0xFE, 0x00, 0xFF, 0xFE, 0x00, 0x7F, 0x80, 0xFF, - 0x80, 0x7F, 0xFF, 0x80, 0x7F, 0x80, 0x7F, 0xC0, 0x3F, 0xBF, 0xC0, 0x3F, - 0xC0, 0x1F, 0xE0, 0x3F, 0xCF, 0xE0, 0x1F, 0xE0, 0x0F, 0xF8, 0x1F, 0xE7, - 0xF8, 0x1F, 0xE0, 0x07, 0xFC, 0x0F, 0xE3, 0xFC, 0x0F, 0xF0, 0x01, 0xFE, - 0x0F, 0xF0, 0xFE, 0x07, 0xF8, 0x00, 0xFF, 0x87, 0xF8, 0x7F, 0x87, 0xF8, - 0x00, 0x7F, 0xC3, 0xF8, 0x3F, 0xC3, 0xFC, 0x00, 0x1F, 0xE3, 0xFC, 0x0F, - 0xE1, 0xFE, 0x00, 0x0F, 0xF9, 0xFE, 0x07, 0xF9, 0xFE, 0x00, 0x07, 0xFC, - 0xFE, 0x03, 0xFC, 0xFF, 0x00, 0x01, 0xFE, 0xFF, 0x00, 0xFE, 0x7F, 0x80, - 0x00, 0xFF, 0x7F, 0x80, 0x7F, 0xFF, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x3F, - 0xFF, 0xC0, 0x00, 0x1F, 0xFF, 0xC0, 0x0F, 0xFF, 0xE0, 0x00, 0x0F, 0xFF, - 0xE0, 0x07, 0xFF, 0xE0, 0x00, 0x07, 0xFF, 0xE0, 0x03, 0xFF, 0xF0, 0x00, - 0x01, 0xFF, 0xF0, 0x00, 0xFF, 0xF8, 0x00, 0x00, 0xFF, 0xF8, 0x00, 0x7F, - 0xF8, 0x00, 0x00, 0x7F, 0xF8, 0x00, 0x3F, 0xFC, 0x00, 0x00, 0x1F, 0xFC, - 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x07, 0xFE, 0x00, 0x00, - 0x07, 0xFE, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x01, 0xFF, - 0x80, 0x00, 0x7F, 0xC0, 0x00, 0x3F, 0xE3, 0xFE, 0x00, 0x03, 0xFE, 0x3F, - 0xF0, 0x00, 0x7F, 0xC1, 0xFF, 0x00, 0x0F, 0xF8, 0x0F, 0xF8, 0x01, 0xFF, - 0x00, 0x7F, 0xC0, 0x1F, 0xF0, 0x07, 0xFE, 0x03, 0xFE, 0x00, 0x3F, 0xE0, - 0x7F, 0xC0, 0x01, 0xFF, 0x07, 0xF8, 0x00, 0x1F, 0xF8, 0xFF, 0x80, 0x00, - 0xFF, 0x9F, 0xF0, 0x00, 0x07, 0xFD, 0xFE, 0x00, 0x00, 0x3F, 0xFF, 0xE0, - 0x00, 0x03, 0xFF, 0xFC, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x00, 0xFF, - 0xF0, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x00, 0x7F, 0xE0, 0x00, 0x00, - 0x07, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xF0, 0x00, 0x00, 0x1F, 0xFF, 0x80, - 0x00, 0x01, 0xFF, 0xFC, 0x00, 0x00, 0x3F, 0xFF, 0xE0, 0x00, 0x07, 0xFF, - 0xFE, 0x00, 0x00, 0xFF, 0xDF, 0xF0, 0x00, 0x0F, 0xF9, 0xFF, 0x80, 0x01, - 0xFF, 0x0F, 0xF8, 0x00, 0x3F, 0xE0, 0x7F, 0xC0, 0x03, 0xFE, 0x03, 0xFE, - 0x00, 0x7F, 0xC0, 0x3F, 0xF0, 0x0F, 0xF8, 0x01, 0xFF, 0x01, 0xFF, 0x80, - 0x0F, 0xF8, 0x1F, 0xF0, 0x00, 0xFF, 0xC3, 0xFE, 0x00, 0x07, 0xFC, 0x7F, - 0xE0, 0x00, 0x3F, 0xE7, 0xFC, 0x00, 0x03, 0xFF, 0xFF, 0x80, 0x00, 0x0F, - 0xF7, 0xFC, 0x00, 0x01, 0xFF, 0x3F, 0xC0, 0x00, 0x1F, 0xE3, 0xFE, 0x00, - 0x03, 0xFC, 0x1F, 0xF0, 0x00, 0x3F, 0xC1, 0xFF, 0x00, 0x07, 0xF8, 0x0F, - 0xF8, 0x00, 0xFF, 0x80, 0x7F, 0x80, 0x0F, 0xF0, 0x07, 0xFC, 0x01, 0xFE, - 0x00, 0x3F, 0xE0, 0x1F, 0xE0, 0x03, 0xFE, 0x03, 0xFC, 0x00, 0x1F, 0xF0, - 0x7F, 0xC0, 0x00, 0xFF, 0x07, 0xF8, 0x00, 0x0F, 0xF8, 0xFF, 0x00, 0x00, - 0x7F, 0xCF, 0xF0, 0x00, 0x07, 0xFD, 0xFE, 0x00, 0x00, 0x3F, 0xFF, 0xE0, - 0x00, 0x01, 0xFF, 0xFC, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x00, 0xFF, - 0xF8, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x00, 0x7F, 0xE0, 0x00, 0x00, - 0x03, 0xFE, 0x00, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x00, 0x03, 0xFC, 0x00, - 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x3F, - 0xC0, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x00, - 0x03, 0xFC, 0x00, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x00, 0x03, 0xFC, 0x00, - 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x3F, - 0xC0, 0x00, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, - 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, - 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x3F, - 0xF0, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x07, 0xFE, - 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x7F, 0xE0, 0x00, 0x01, 0xFF, 0x80, - 0x00, 0x07, 0xFE, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x3F, 0xF0, 0x00, - 0x00, 0xFF, 0xC0, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, - 0x3F, 0xF0, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x07, - 0xFE, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x7F, 0xE0, 0x00, 0x00, 0xFF, - 0x80, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x3F, 0xC0, - 0xFF, 0x03, 0xFC, 0x0F, 0xF0, 0x3F, 0xC0, 0xFF, 0x03, 0xFC, 0x0F, 0xF0, - 0x3F, 0xC0, 0xFF, 0x03, 0xFC, 0x0F, 0xF0, 0x3F, 0xC0, 0xFF, 0x03, 0xFC, - 0x0F, 0xF0, 0x3F, 0xC0, 0xFF, 0x03, 0xFC, 0x0F, 0xF0, 0x3F, 0xC0, 0xFF, - 0x03, 0xFC, 0x0F, 0xF0, 0x3F, 0xC0, 0xFF, 0x03, 0xFC, 0x0F, 0xF0, 0x3F, - 0xC0, 0xFF, 0x03, 0xFC, 0x0F, 0xF0, 0x3F, 0xC0, 0xFF, 0x03, 0xFC, 0x0F, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, - 0x00, 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, - 0x00, 0x3F, 0x80, 0x00, 0x3F, 0x80, 0x00, 0x3F, 0xC0, 0x00, 0x1F, 0xC0, - 0x00, 0x1F, 0xC0, 0x00, 0x1F, 0xE0, 0x00, 0x0F, 0xE0, 0x00, 0x0F, 0xE0, - 0x00, 0x07, 0xF0, 0x00, 0x07, 0xF0, 0x00, 0x07, 0xF0, 0x00, 0x03, 0xF8, - 0x00, 0x03, 0xF8, 0x00, 0x03, 0xF8, 0x00, 0x01, 0xFC, 0x00, 0x01, 0xFC, - 0x00, 0x01, 0xFC, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, - 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x3F, - 0x80, 0x00, 0x3F, 0x80, 0x00, 0x3F, 0xC0, 0x00, 0x1F, 0xC0, 0x00, 0x1F, - 0xC0, 0x00, 0x0F, 0xE0, 0x00, 0x0F, 0xE0, 0x00, 0x0F, 0xE0, 0x00, 0x07, - 0xF0, 0x00, 0x07, 0xF0, 0x00, 0x07, 0xF0, 0x00, 0x03, 0xF8, 0x00, 0x03, - 0xF8, 0x00, 0x03, 0xF8, 0x00, 0x01, 0xFC, 0x00, 0x01, 0xFC, 0x00, 0x01, - 0xFC, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x3F, 0xC0, 0xFF, - 0x03, 0xFC, 0x0F, 0xF0, 0x3F, 0xC0, 0xFF, 0x03, 0xFC, 0x0F, 0xF0, 0x3F, - 0xC0, 0xFF, 0x03, 0xFC, 0x0F, 0xF0, 0x3F, 0xC0, 0xFF, 0x03, 0xFC, 0x0F, - 0xF0, 0x3F, 0xC0, 0xFF, 0x03, 0xFC, 0x0F, 0xF0, 0x3F, 0xC0, 0xFF, 0x03, - 0xFC, 0x0F, 0xF0, 0x3F, 0xC0, 0xFF, 0x03, 0xFC, 0x0F, 0xF0, 0x3F, 0xC0, - 0xFF, 0x03, 0xFC, 0x0F, 0xF0, 0x3F, 0xC0, 0xFF, 0x03, 0xFC, 0x0F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x7F, - 0x00, 0x00, 0x3F, 0x80, 0x00, 0x3F, 0xC0, 0x00, 0x1F, 0xF0, 0x00, 0x1F, - 0xF8, 0x00, 0x0F, 0xFE, 0x00, 0x07, 0xFF, 0x00, 0x07, 0xEF, 0xC0, 0x03, - 0xF7, 0xE0, 0x03, 0xF3, 0xF0, 0x01, 0xF8, 0xFC, 0x01, 0xF8, 0x7E, 0x00, - 0xFC, 0x1F, 0x80, 0xFC, 0x0F, 0xC0, 0x7E, 0x03, 0xF0, 0x3F, 0x01, 0xF8, - 0x3F, 0x00, 0xFC, 0x1F, 0x80, 0x3F, 0x1F, 0x80, 0x1F, 0x8F, 0xC0, 0x07, - 0xEF, 0xE0, 0x03, 0xF7, 0xE0, 0x01, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, - 0x7F, 0xC0, 0x1F, 0xE0, 0x0F, 0xF0, 0x07, 0xF8, 0x03, 0xFC, 0x00, 0xFE, - 0x00, 0x7E, 0x00, 0x7F, 0x80, 0x01, 0xFF, 0xFC, 0x01, 0xFF, 0xFF, 0xC1, - 0xFF, 0xFF, 0xF8, 0x7F, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xC3, 0xFE, 0xFF, - 0xF8, 0x70, 0x03, 0xFE, 0x10, 0x00, 0x7F, 0xC0, 0x00, 0x0F, 0xF0, 0x00, - 0x03, 0xFC, 0x00, 0x00, 0xFF, 0x03, 0xFF, 0xFF, 0xC3, 0xFF, 0xFF, 0xF3, - 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xE0, 0x0F, - 0xFF, 0xF0, 0x03, 0xFF, 0xFC, 0x00, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0xC0, - 0x1F, 0xFF, 0xF8, 0x1F, 0xFD, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xCF, - 0xFF, 0xFF, 0xF1, 0xFF, 0xFB, 0xFC, 0x1F, 0xF8, 0xFF, 0xFF, 0x00, 0x00, - 0x03, 0xFC, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x00, - 0xFF, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x3F, - 0xC0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x0F, 0xF0, - 0x7E, 0x00, 0x3F, 0xCF, 0xFF, 0x00, 0xFF, 0x7F, 0xFF, 0x03, 0xFF, 0xFF, - 0xFE, 0x0F, 0xFF, 0xFF, 0xFC, 0x3F, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, - 0xF3, 0xFF, 0x80, 0xFF, 0xCF, 0xFC, 0x01, 0xFF, 0xBF, 0xE0, 0x03, 0xFE, - 0xFF, 0x00, 0x07, 0xFB, 0xFC, 0x00, 0x1F, 0xEF, 0xF0, 0x00, 0x7F, 0xBF, - 0xC0, 0x01, 0xFF, 0xFF, 0x00, 0x07, 0xFF, 0xFC, 0x00, 0x1F, 0xFF, 0xF0, - 0x00, 0x7F, 0xBF, 0xC0, 0x01, 0xFE, 0xFF, 0x80, 0x0F, 0xFB, 0xFE, 0x00, - 0x3F, 0xEF, 0xFC, 0x01, 0xFF, 0x3F, 0xFC, 0x1F, 0xFC, 0xFF, 0xFF, 0xFF, - 0xE3, 0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xFC, 0x3F, 0xBF, 0xFF, 0xE0, - 0xFE, 0x7F, 0xFE, 0x03, 0xF8, 0x7F, 0xE0, 0x00, 0x00, 0x0F, 0xC0, 0x00, - 0x1F, 0xFF, 0x80, 0x0F, 0xFF, 0xF8, 0x03, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, - 0xFC, 0x3F, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xFB, 0xFF, 0x01, 0xFF, 0x7F, - 0xC0, 0x0F, 0x9F, 0xF0, 0x01, 0xC3, 0xFC, 0x00, 0x00, 0x7F, 0x80, 0x00, - 0x0F, 0xF0, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x07, 0xF8, - 0x00, 0x00, 0xFF, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x03, 0xFE, 0x00, 0x10, - 0x3F, 0xC0, 0x07, 0x87, 0xFC, 0x01, 0xF8, 0x7F, 0xE0, 0xFF, 0xCF, 0xFF, - 0xFF, 0xF8, 0xFF, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xE0, - 0x07, 0xFF, 0xF8, 0x00, 0x3F, 0xFC, 0x00, 0x00, 0x00, 0x03, 0xFC, 0x00, - 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x00, 0xFF, 0x00, 0x00, - 0x03, 0xFC, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x00, - 0xFF, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x0F, 0xF0, 0x01, 0xF8, 0x3F, - 0xC0, 0x7F, 0xF8, 0xFF, 0x07, 0xFF, 0xFB, 0xFC, 0x3F, 0xFF, 0xFF, 0xF1, - 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFD, 0xFF, - 0x80, 0xFF, 0xF7, 0xFC, 0x00, 0xFF, 0xFF, 0xE0, 0x03, 0xFF, 0xFF, 0x80, - 0x07, 0xFF, 0xFC, 0x00, 0x1F, 0xFF, 0xF0, 0x00, 0x3F, 0xFF, 0xC0, 0x00, - 0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xFC, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0x3F, - 0xFF, 0xC0, 0x01, 0xFF, 0xFF, 0x80, 0x07, 0xFD, 0xFF, 0x00, 0x3F, 0xF7, - 0xFE, 0x01, 0xFF, 0xDF, 0xFE, 0x1F, 0xFF, 0x3F, 0xFF, 0xFF, 0xFC, 0x7F, - 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xC1, 0xFF, 0xFE, 0xFF, 0x03, 0xFF, - 0xF3, 0xFC, 0x03, 0xFF, 0x0F, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0x07, 0xFF, - 0xC0, 0x00, 0xFF, 0xFF, 0x80, 0x1F, 0xFF, 0xFE, 0x01, 0xFF, 0xFF, 0xF8, - 0x0F, 0xFF, 0xFF, 0xE0, 0xFF, 0xC1, 0xFF, 0x0F, 0xF8, 0x03, 0xFC, 0x7F, - 0x80, 0x0F, 0xE7, 0xF8, 0x00, 0x7F, 0xBF, 0xC0, 0x01, 0xFD, 0xFE, 0x00, - 0x0F, 0xEF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xF8, 0x00, 0x00, 0x3F, - 0xC0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x60, 0x1F, 0xF8, - 0x0F, 0x80, 0xFF, 0xFF, 0xFE, 0x03, 0xFF, 0xFF, 0xF8, 0x0F, 0xFF, 0xFF, - 0xC0, 0x3F, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0xC0, 0x00, 0xFF, 0xF0, 0x00, - 0x00, 0x1F, 0xF0, 0x03, 0xFF, 0xC0, 0x7F, 0xFE, 0x03, 0xFF, 0xF0, 0x3F, - 0xFF, 0x03, 0xFF, 0xF8, 0x1F, 0xF0, 0x80, 0xFF, 0x00, 0x07, 0xF8, 0x00, - 0x3F, 0x80, 0x01, 0xFC, 0x01, 0xFF, 0xFF, 0xCF, 0xFF, 0xFE, 0x7F, 0xFF, - 0xF3, 0xFF, 0xFF, 0x9F, 0xFF, 0xFC, 0xFF, 0xFF, 0xE0, 0x3F, 0xC0, 0x01, - 0xFE, 0x00, 0x0F, 0xF0, 0x00, 0x7F, 0x80, 0x03, 0xFC, 0x00, 0x1F, 0xE0, - 0x00, 0xFF, 0x00, 0x07, 0xF8, 0x00, 0x3F, 0xC0, 0x01, 0xFE, 0x00, 0x0F, - 0xF0, 0x00, 0x7F, 0x80, 0x03, 0xFC, 0x00, 0x1F, 0xE0, 0x00, 0xFF, 0x00, - 0x07, 0xF8, 0x00, 0x3F, 0xC0, 0x01, 0xFE, 0x00, 0x0F, 0xF0, 0x00, 0x7F, - 0x80, 0x03, 0xFC, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x07, 0xFF, 0x8F, 0xF0, - 0x7F, 0xFF, 0xBF, 0xC3, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0xFC, 0xFF, - 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xDF, 0xF8, 0x07, 0xFF, 0xFF, 0xC0, - 0x0F, 0xFF, 0xFE, 0x00, 0x1F, 0xFF, 0xF0, 0x00, 0x3F, 0xFF, 0xC0, 0x00, - 0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xFC, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0x3F, - 0xFF, 0xC0, 0x00, 0xFF, 0xFF, 0x00, 0x07, 0xFF, 0xFE, 0x00, 0x1F, 0xF7, - 0xFC, 0x00, 0xFF, 0xDF, 0xFC, 0x0F, 0xFF, 0x3F, 0xFF, 0xFF, 0xFC, 0xFF, - 0xFF, 0xFF, 0xF1, 0xFF, 0xFF, 0xFF, 0xC3, 0xFF, 0xFF, 0xFF, 0x03, 0xFF, - 0xFB, 0xFC, 0x07, 0xFF, 0x8F, 0xF0, 0x00, 0xE0, 0x3F, 0xC0, 0x00, 0x00, - 0xFF, 0x00, 0x00, 0x07, 0xF8, 0x20, 0x00, 0x1F, 0xE1, 0xE0, 0x00, 0xFF, - 0x87, 0xF0, 0x1F, 0xFC, 0x3F, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0x87, - 0xFF, 0xFF, 0xFC, 0x0F, 0xFF, 0xFF, 0xE0, 0x0F, 0xFF, 0xFE, 0x00, 0x03, - 0xFF, 0xE0, 0x00, 0xFF, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFF, 0x00, - 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, - 0xFF, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x0F, 0xF0, - 0x00, 0x00, 0xFF, 0x07, 0xF0, 0x0F, 0xF3, 0xFF, 0xC0, 0xFF, 0x7F, 0xFF, - 0x0F, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xFC, 0xFF, - 0xFF, 0xFF, 0xEF, 0xFF, 0x07, 0xFE, 0xFF, 0xC0, 0x3F, 0xEF, 0xF8, 0x01, - 0xFF, 0xFF, 0x00, 0x1F, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0x00, 0x0F, 0xFF, - 0xF0, 0x00, 0xFF, 0xFF, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0x00, - 0x0F, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0xFF, - 0xFF, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0x00, 0x0F, 0xFF, 0xF0, - 0x00, 0xFF, 0xFF, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0x00, 0x0F, - 0xFF, 0xF0, 0x00, 0xFF, 0x1F, 0x1F, 0xE7, 0xFF, 0xFF, 0xFF, 0xDF, 0xF7, - 0xFC, 0xFE, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF3, 0xFC, 0xFF, - 0x3F, 0xCF, 0xF3, 0xFC, 0xFF, 0x3F, 0xCF, 0xF3, 0xFC, 0xFF, 0x3F, 0xCF, - 0xF3, 0xFC, 0xFF, 0x3F, 0xCF, 0xF3, 0xFC, 0xFF, 0x3F, 0xCF, 0xF3, 0xFC, - 0xFF, 0x3F, 0xCF, 0xF3, 0xFC, 0xFF, 0x00, 0x1F, 0x00, 0x1F, 0xE0, 0x07, - 0xFC, 0x03, 0xFF, 0x00, 0xFF, 0xC0, 0x1F, 0xF0, 0x07, 0xFC, 0x00, 0xFE, - 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x1F, 0xE0, 0x07, 0xF8, 0x01, 0xFE, 0x00, 0x7F, 0x80, 0x1F, 0xE0, 0x07, - 0xF8, 0x01, 0xFE, 0x00, 0x7F, 0x80, 0x1F, 0xE0, 0x07, 0xF8, 0x01, 0xFE, - 0x00, 0x7F, 0x80, 0x1F, 0xE0, 0x07, 0xF8, 0x01, 0xFE, 0x00, 0x7F, 0x80, - 0x1F, 0xE0, 0x07, 0xF8, 0x01, 0xFE, 0x00, 0x7F, 0x80, 0x1F, 0xE0, 0x07, - 0xF8, 0x01, 0xFE, 0x00, 0x7F, 0x80, 0x1F, 0xE0, 0x07, 0xF8, 0x01, 0xFE, - 0x00, 0x7F, 0x80, 0x1F, 0xE0, 0x0F, 0xF8, 0x87, 0xFE, 0x3F, 0xFF, 0x1F, - 0xFF, 0xC7, 0xFF, 0xE1, 0xFF, 0xF0, 0xFF, 0xF8, 0x0F, 0xF8, 0x00, 0xFF, - 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x3F, 0xC0, - 0x00, 0x00, 0xFF, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x0F, 0xF0, 0x00, - 0x00, 0x3F, 0xC0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, - 0x0F, 0xF0, 0x00, 0x00, 0x3F, 0xC0, 0x0F, 0xFC, 0xFF, 0x00, 0x7F, 0xE3, - 0xFC, 0x03, 0xFF, 0x0F, 0xF0, 0x1F, 0xF8, 0x3F, 0xC0, 0xFF, 0xC0, 0xFF, - 0x07, 0xFE, 0x03, 0xFC, 0x3F, 0xF0, 0x0F, 0xF1, 0xFF, 0x80, 0x3F, 0xCF, - 0xFC, 0x00, 0xFF, 0x7F, 0xE0, 0x03, 0xFF, 0xFF, 0x00, 0x0F, 0xFF, 0xFC, - 0x00, 0x3F, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0xE0, 0x03, 0xFF, 0xFF, 0xC0, - 0x0F, 0xFF, 0xFF, 0x80, 0x3F, 0xFB, 0xFF, 0x00, 0xFF, 0xCF, 0xFC, 0x03, - 0xFE, 0x1F, 0xF8, 0x0F, 0xF0, 0x3F, 0xF0, 0x3F, 0xC0, 0x7F, 0xE0, 0xFF, - 0x00, 0xFF, 0x83, 0xFC, 0x03, 0xFF, 0x0F, 0xF0, 0x07, 0xFE, 0x3F, 0xC0, - 0x0F, 0xFC, 0xFF, 0x00, 0x1F, 0xFB, 0xFC, 0x00, 0x3F, 0xE0, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x07, 0xC0, 0x00, 0xFC, 0x03, 0xF8, 0xFF, 0xF0, 0x1F, 0xFE, 0x0F, - 0xE7, 0xFF, 0xE1, 0xFF, 0xFC, 0x3F, 0xFF, 0xFF, 0xCF, 0xFF, 0xF8, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xF8, 0x3F, 0xFF, 0x07, 0xFE, 0xFF, 0xC0, - 0x7F, 0xF8, 0x07, 0xFF, 0xFE, 0x00, 0xFF, 0xC0, 0x1F, 0xFF, 0xF0, 0x03, - 0xFE, 0x00, 0x3F, 0xFF, 0xC0, 0x07, 0xF8, 0x00, 0xFF, 0xFF, 0x00, 0x1F, - 0xE0, 0x03, 0xFF, 0xFC, 0x00, 0x7F, 0x80, 0x0F, 0xFF, 0xF0, 0x01, 0xFE, - 0x00, 0x3F, 0xFF, 0xC0, 0x07, 0xF8, 0x00, 0xFF, 0xFF, 0x00, 0x1F, 0xE0, - 0x03, 0xFF, 0xFC, 0x00, 0x7F, 0x80, 0x0F, 0xFF, 0xF0, 0x01, 0xFE, 0x00, - 0x3F, 0xFF, 0xC0, 0x07, 0xF8, 0x00, 0xFF, 0xFF, 0x00, 0x1F, 0xE0, 0x03, - 0xFF, 0xFC, 0x00, 0x7F, 0x80, 0x0F, 0xFF, 0xF0, 0x01, 0xFE, 0x00, 0x3F, - 0xFF, 0xC0, 0x07, 0xF8, 0x00, 0xFF, 0xFF, 0x00, 0x1F, 0xE0, 0x03, 0xFF, - 0xFC, 0x00, 0x7F, 0x80, 0x0F, 0xFF, 0xF0, 0x01, 0xFE, 0x00, 0x3F, 0xFF, - 0xC0, 0x07, 0xF8, 0x00, 0xFF, 0x00, 0x07, 0xF0, 0x0F, 0xE3, 0xFF, 0xC0, - 0xFE, 0x7F, 0xFF, 0x0F, 0xEF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, - 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0x07, 0xFE, 0xFF, 0xC0, 0x3F, - 0xEF, 0xF8, 0x01, 0xFF, 0xFF, 0x00, 0x1F, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, - 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0x00, 0x0F, 0xFF, 0xF0, 0x00, - 0xFF, 0xFF, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0x00, 0x0F, 0xFF, - 0xF0, 0x00, 0xFF, 0xFF, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0x00, - 0x0F, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0xFF, - 0xFF, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xC0, 0x00, 0x03, - 0xFF, 0xF0, 0x00, 0x3F, 0xFF, 0xE0, 0x01, 0xFF, 0xFF, 0xE0, 0x0F, 0xFF, - 0xFF, 0xC0, 0x7F, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0xFF, 0x1F, 0xF8, 0x0F, - 0xFC, 0x7F, 0xC0, 0x1F, 0xFB, 0xFE, 0x00, 0x3F, 0xEF, 0xF0, 0x00, 0x7F, - 0xBF, 0xC0, 0x01, 0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xFC, 0x00, 0x0F, 0xFF, - 0xF0, 0x00, 0x3F, 0xFF, 0xC0, 0x00, 0xFF, 0xFF, 0x00, 0x07, 0xFF, 0xFC, - 0x00, 0x1F, 0xEF, 0xF8, 0x00, 0x7F, 0x9F, 0xE0, 0x03, 0xFE, 0x7F, 0xC0, - 0x1F, 0xF0, 0xFF, 0xC1, 0xFF, 0xC3, 0xFF, 0xFF, 0xFE, 0x07, 0xFF, 0xFF, - 0xF0, 0x0F, 0xFF, 0xFF, 0x80, 0x1F, 0xFF, 0xFC, 0x00, 0x1F, 0xFF, 0xE0, - 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x07, 0xE0, 0x03, 0xF8, 0xFF, 0xF0, 0x0F, - 0xEF, 0xFF, 0xF0, 0x3F, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFF, 0xC3, 0xFF, - 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xFF, 0x3F, 0xF8, 0x0F, 0xFC, 0xFF, 0xC0, - 0x1F, 0xFB, 0xFE, 0x00, 0x3F, 0xEF, 0xF0, 0x00, 0x7F, 0xBF, 0xC0, 0x01, - 0xFE, 0xFF, 0x00, 0x07, 0xFB, 0xFC, 0x00, 0x1F, 0xFF, 0xF0, 0x00, 0x7F, - 0xFF, 0xC0, 0x01, 0xFF, 0xFF, 0x00, 0x07, 0xFB, 0xFC, 0x00, 0x1F, 0xEF, - 0xF8, 0x00, 0xFF, 0xBF, 0xE0, 0x03, 0xFE, 0xFF, 0xC0, 0x1F, 0xF3, 0xFF, - 0xC1, 0xFF, 0xCF, 0xFF, 0xFF, 0xFE, 0x3F, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, - 0xFF, 0xC3, 0xFF, 0xFF, 0xFE, 0x0F, 0xF7, 0xFF, 0xE0, 0x3F, 0xC7, 0xFE, - 0x00, 0xFF, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, - 0x3F, 0xC0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x0F, - 0xF0, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x03, 0xFC, - 0x00, 0x00, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x07, 0xFF, 0x8F, 0xF0, 0x7F, - 0xFF, 0xBF, 0xC3, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, - 0xFF, 0xF3, 0xFF, 0xFF, 0xFF, 0xDF, 0xF8, 0x0F, 0xFF, 0x7F, 0xC0, 0x1F, - 0xFF, 0xFE, 0x00, 0x3F, 0xFF, 0xF0, 0x00, 0x7F, 0xFF, 0xC0, 0x01, 0xFF, - 0xFF, 0x00, 0x03, 0xFF, 0xFC, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0x3F, 0xFF, - 0xC0, 0x00, 0xFF, 0xFF, 0x00, 0x07, 0xFF, 0xFC, 0x00, 0x1F, 0xFF, 0xF8, - 0x00, 0x7F, 0xFF, 0xE0, 0x03, 0xFF, 0x7F, 0xC0, 0x1F, 0xFD, 0xFF, 0xC1, - 0xFF, 0xF3, 0xFF, 0xFF, 0xFF, 0xC7, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, - 0xFC, 0x1F, 0xFF, 0xEF, 0xF0, 0x3F, 0xFF, 0x3F, 0xC0, 0x3F, 0xF0, 0xFF, - 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x3F, 0xC0, - 0x00, 0x00, 0xFF, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x0F, 0xF0, 0x00, - 0x00, 0x3F, 0xC0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, - 0x0F, 0xF0, 0x00, 0x07, 0xFF, 0x1F, 0xFF, 0x9F, 0xFF, 0xDF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF, 0xE0, 0x7F, 0xC0, 0x3F, - 0xE0, 0x1F, 0xE0, 0x0F, 0xF0, 0x07, 0xF8, 0x03, 0xFC, 0x01, 0xFE, 0x00, - 0xFF, 0x00, 0x7F, 0x80, 0x3F, 0xC0, 0x1F, 0xE0, 0x0F, 0xF0, 0x07, 0xF8, - 0x03, 0xFC, 0x01, 0xFE, 0x00, 0xFF, 0x00, 0x7F, 0x80, 0x3F, 0xC0, 0x1F, - 0xE0, 0x00, 0x00, 0x7F, 0x80, 0x01, 0xFF, 0xFE, 0x03, 0xFF, 0xFF, 0xC3, - 0xFF, 0xFF, 0xC3, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0xF1, 0xFF, 0x83, 0xF0, - 0xFF, 0x00, 0x18, 0x7F, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x1F, 0xF0, 0x00, - 0x0F, 0xFF, 0x80, 0x07, 0xFF, 0xFE, 0x01, 0xFF, 0xFF, 0xC0, 0x7F, 0xFF, - 0xF8, 0x1F, 0xFF, 0xFE, 0x01, 0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xC0, 0x00, - 0x3F, 0xE0, 0x00, 0x0F, 0xF3, 0x00, 0x07, 0xF9, 0xF0, 0x07, 0xFD, 0xFF, - 0xFF, 0xFC, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFE, 0x7F, 0xFF, 0xFE, 0x0F, - 0xFF, 0xFE, 0x00, 0xFF, 0xF8, 0x00, 0x07, 0xF8, 0x00, 0x3F, 0xC0, 0x01, - 0xFE, 0x00, 0x0F, 0xF0, 0x00, 0x7F, 0x80, 0x03, 0xFC, 0x00, 0x1F, 0xE0, - 0x1F, 0xFF, 0xFC, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0x3F, 0xFF, 0xF9, 0xFF, - 0xFF, 0xCF, 0xFF, 0xFE, 0x03, 0xFC, 0x00, 0x1F, 0xE0, 0x00, 0xFF, 0x00, - 0x07, 0xF8, 0x00, 0x3F, 0xC0, 0x01, 0xFE, 0x00, 0x0F, 0xF0, 0x00, 0x7F, - 0x80, 0x03, 0xFC, 0x00, 0x1F, 0xE0, 0x00, 0xFF, 0x00, 0x07, 0xF8, 0x00, - 0x3F, 0xC0, 0x01, 0xFE, 0x00, 0x0F, 0xF8, 0x00, 0x7F, 0xFF, 0x01, 0xFF, - 0xF8, 0x0F, 0xFF, 0xE0, 0x3F, 0xFF, 0x00, 0xFF, 0xF8, 0x01, 0xFF, 0x80, - 0xFE, 0x00, 0x1F, 0xFF, 0xC0, 0x03, 0xFF, 0xF8, 0x00, 0x7F, 0xFF, 0x00, - 0x0F, 0xFF, 0xE0, 0x01, 0xFF, 0xFC, 0x00, 0x3F, 0xFF, 0x80, 0x07, 0xFF, - 0xF0, 0x00, 0xFF, 0xFE, 0x00, 0x1F, 0xFF, 0xC0, 0x03, 0xFF, 0xF8, 0x00, - 0x7F, 0xFF, 0x00, 0x0F, 0xFF, 0xE0, 0x01, 0xFF, 0xFC, 0x00, 0x3F, 0xFF, - 0x80, 0x07, 0xFF, 0xF8, 0x00, 0xFF, 0xFF, 0x00, 0x1F, 0xFF, 0xE0, 0x07, - 0xFF, 0xFE, 0x00, 0xFF, 0xFF, 0xE0, 0x3F, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, - 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0xEF, - 0xE1, 0xFF, 0xF9, 0xFC, 0x0F, 0xFC, 0x3F, 0x80, 0xFF, 0x00, 0x01, 0xFF, - 0xFF, 0x00, 0x07, 0xF9, 0xFE, 0x00, 0x0F, 0xF3, 0xFC, 0x00, 0x1F, 0xC3, - 0xFC, 0x00, 0x7F, 0x87, 0xF8, 0x00, 0xFE, 0x07, 0xF8, 0x03, 0xFC, 0x0F, - 0xF0, 0x07, 0xF8, 0x1F, 0xE0, 0x1F, 0xE0, 0x1F, 0xE0, 0x3F, 0xC0, 0x3F, - 0xC0, 0x7F, 0x00, 0x3F, 0xC1, 0xFE, 0x00, 0x7F, 0x83, 0xF8, 0x00, 0xFF, - 0x0F, 0xF0, 0x00, 0xFF, 0x1F, 0xE0, 0x01, 0xFE, 0x3F, 0x80, 0x01, 0xFE, - 0xFF, 0x00, 0x03, 0xFD, 0xFC, 0x00, 0x03, 0xFF, 0xF8, 0x00, 0x07, 0xFF, - 0xF0, 0x00, 0x0F, 0xFF, 0xC0, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0x1F, 0xFE, - 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0x3F, 0xE0, - 0x00, 0x00, 0x7F, 0xC0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFE, 0x7F, - 0x00, 0x0F, 0xF0, 0x00, 0xFE, 0x7F, 0x80, 0x0F, 0xF8, 0x00, 0xFE, 0x7F, - 0x80, 0x1F, 0xF8, 0x01, 0xFC, 0x3F, 0x80, 0x1F, 0xF8, 0x01, 0xFC, 0x3F, - 0xC0, 0x1F, 0xFC, 0x01, 0xFC, 0x1F, 0xC0, 0x3F, 0xFC, 0x03, 0xF8, 0x1F, - 0xC0, 0x3F, 0xFC, 0x03, 0xF8, 0x1F, 0xE0, 0x7F, 0xFE, 0x07, 0xF8, 0x0F, - 0xE0, 0x7F, 0xFE, 0x07, 0xF0, 0x0F, 0xE0, 0x7F, 0xFE, 0x07, 0xF0, 0x0F, - 0xF0, 0xFE, 0x7F, 0x0F, 0xE0, 0x07, 0xF0, 0xFE, 0x7F, 0x0F, 0xE0, 0x07, - 0xF0, 0xFE, 0x7F, 0x0F, 0xE0, 0x07, 0xF9, 0xFC, 0x3F, 0x9F, 0xC0, 0x03, - 0xF9, 0xFC, 0x3F, 0x9F, 0xC0, 0x03, 0xF9, 0xFC, 0x3F, 0x9F, 0xC0, 0x01, - 0xFF, 0xF8, 0x1F, 0xFF, 0x80, 0x01, 0xFF, 0xF8, 0x1F, 0xFF, 0x80, 0x01, - 0xFF, 0xF0, 0x1F, 0xFF, 0x80, 0x00, 0xFF, 0xF0, 0x0F, 0xFF, 0x00, 0x00, - 0xFF, 0xF0, 0x0F, 0xFF, 0x00, 0x00, 0xFF, 0xE0, 0x0F, 0xFE, 0x00, 0x00, - 0x7F, 0xE0, 0x07, 0xFE, 0x00, 0x00, 0x7F, 0xE0, 0x07, 0xFE, 0x00, 0x00, - 0x7F, 0xC0, 0x03, 0xFC, 0x00, 0x00, 0x3F, 0xC0, 0x03, 0xFC, 0x00, 0x7F, - 0xC0, 0x07, 0xF8, 0xFF, 0x80, 0x3F, 0xC1, 0xFF, 0x01, 0xFF, 0x03, 0xFC, - 0x0F, 0xF8, 0x0F, 0xF8, 0x3F, 0xC0, 0x1F, 0xF1, 0xFE, 0x00, 0x3F, 0xEF, - 0xF0, 0x00, 0x7F, 0xFF, 0xC0, 0x01, 0xFF, 0xFE, 0x00, 0x03, 0xFF, 0xF0, - 0x00, 0x07, 0xFF, 0x80, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x3F, 0xF0, 0x00, - 0x00, 0xFF, 0xC0, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, - 0xFF, 0xFC, 0x00, 0x07, 0xFF, 0xF8, 0x00, 0x1F, 0xFF, 0xF0, 0x00, 0xFF, - 0x3F, 0xC0, 0x07, 0xFC, 0xFF, 0x80, 0x3F, 0xE1, 0xFF, 0x00, 0xFF, 0x03, - 0xFE, 0x07, 0xF8, 0x07, 0xFC, 0x3F, 0xE0, 0x1F, 0xF1, 0xFF, 0x00, 0x3F, - 0xE7, 0xF8, 0x00, 0x7F, 0xC0, 0x7F, 0x80, 0x00, 0xFF, 0x7F, 0xC0, 0x01, - 0xFE, 0x3F, 0xC0, 0x01, 0xFE, 0x3F, 0xC0, 0x01, 0xFC, 0x1F, 0xE0, 0x03, - 0xFC, 0x1F, 0xE0, 0x03, 0xF8, 0x0F, 0xF0, 0x07, 0xF8, 0x0F, 0xF0, 0x07, - 0xF8, 0x0F, 0xF0, 0x07, 0xF0, 0x07, 0xF8, 0x0F, 0xF0, 0x07, 0xF8, 0x0F, - 0xE0, 0x03, 0xFC, 0x1F, 0xE0, 0x03, 0xFC, 0x1F, 0xC0, 0x01, 0xFE, 0x3F, - 0xC0, 0x01, 0xFE, 0x3F, 0xC0, 0x01, 0xFE, 0x3F, 0x80, 0x00, 0xFF, 0x7F, - 0x80, 0x00, 0xFF, 0x7F, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x7F, 0xFE, - 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x3F, 0xFC, - 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x0F, 0xF8, - 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x0F, 0xF0, - 0x00, 0x10, 0x1F, 0xE0, 0x00, 0x1C, 0x3F, 0xE0, 0x00, 0x3F, 0xFF, 0xC0, - 0x00, 0x3F, 0xFF, 0xC0, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x7F, 0xFF, 0x00, - 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFE, 0x00, 0x07, 0xFC, 0x00, 0x0F, 0xF8, 0x00, 0x1F, 0xF0, - 0x00, 0x1F, 0xE0, 0x00, 0x3F, 0xE0, 0x00, 0x7F, 0xC0, 0x00, 0xFF, 0x80, - 0x01, 0xFF, 0x00, 0x03, 0xFE, 0x00, 0x07, 0xFC, 0x00, 0x07, 0xFC, 0x00, - 0x0F, 0xF8, 0x00, 0x1F, 0xF0, 0x00, 0x3F, 0xE0, 0x00, 0x7F, 0xC0, 0x00, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x3F, 0x01, 0xFF, 0x03, 0xFF, - 0x07, 0xFF, 0x07, 0xFF, 0x0F, 0xFF, 0x0F, 0xFC, 0x0F, 0xF0, 0x0F, 0xF0, - 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, - 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x1F, 0xE0, 0x1F, 0xE0, - 0xFF, 0xE0, 0xFF, 0xE0, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0xC0, 0xFF, 0xE0, - 0x1F, 0xE0, 0x1F, 0xE0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, - 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, - 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xFC, 0x0F, 0xFF, 0x07, 0xFF, 0x07, 0xFF, - 0x03, 0xFF, 0x01, 0xFF, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0x80, 0xFF, 0xC0, - 0xFF, 0xE0, 0xFF, 0xE0, 0xFF, 0xF0, 0x7F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, - 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, - 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x07, 0xF8, - 0x07, 0xFF, 0x07, 0xFF, 0x01, 0xFF, 0x01, 0xFF, 0x07, 0xFF, 0x07, 0xFF, - 0x07, 0xF8, 0x0F, 0xF8, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, - 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, - 0x0F, 0xF0, 0x0F, 0xF0, 0x3F, 0xF0, 0xFF, 0xF0, 0xFF, 0xE0, 0xFF, 0xE0, - 0xFF, 0xC0, 0xFF, 0x80, 0xFC, 0x00, 0x0F, 0xC0, 0x0F, 0x8F, 0xF8, 0x07, - 0xCF, 0xFE, 0x03, 0xEF, 0xFF, 0xC3, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, - 0xFB, 0xF0, 0xFF, 0xFD, 0xF0, 0x3F, 0xFC, 0xF8, 0x0F, 0xFC, 0x7C, 0x01, - 0xFC, 0x00 }; - -const GFXglyph Montserrat_Bold26pt7bGlyphs[] PROGMEM = { - { 0, 1, 1, 14, 0, 0 }, // 0x20 ' ' - { 1, 10, 36, 15, 2, -35 }, // 0x21 '!' - { 46, 18, 15, 22, 2, -35 }, // 0x22 '"' - { 80, 35, 36, 37, 1, -35 }, // 0x23 '#' - { 238, 30, 48, 33, 1, -41 }, // 0x24 '$' - { 418, 42, 36, 45, 1, -35 }, // 0x25 '%' - { 607, 34, 37, 37, 2, -35 }, // 0x26 '&' - { 765, 7, 15, 12, 2, -35 }, // 0x27 ''' - { 779, 14, 48, 18, 4, -37 }, // 0x28 '(' - { 863, 14, 48, 18, 1, -37 }, // 0x29 ')' - { 947, 20, 20, 22, 1, -37 }, // 0x2A '*' - { 997, 24, 24, 31, 3, -29 }, // 0x2B '+' - { 1069, 10, 17, 13, 2, -8 }, // 0x2C ',' - { 1091, 14, 7, 20, 3, -17 }, // 0x2D '-' - { 1104, 10, 9, 13, 2, -8 }, // 0x2E '.' - { 1116, 24, 48, 20, -2, -42 }, // 0x2F '/' - { 1260, 31, 37, 35, 2, -35 }, // 0x30 '0' - { 1404, 16, 36, 20, 0, -35 }, // 0x31 '1' - { 1476, 29, 36, 30, 0, -35 }, // 0x32 '2' - { 1607, 28, 37, 30, 0, -35 }, // 0x33 '3' - { 1737, 33, 36, 35, 2, -35 }, // 0x34 '4' - { 1886, 28, 37, 30, 1, -35 }, // 0x35 '5' - { 2016, 29, 37, 32, 2, -35 }, // 0x36 '6' - { 2151, 29, 36, 32, 1, -35 }, // 0x37 '7' - { 2282, 30, 37, 34, 2, -35 }, // 0x38 '8' - { 2421, 30, 37, 32, 1, -35 }, // 0x39 '9' - { 2560, 10, 27, 13, 2, -26 }, // 0x3A ':' - { 2594, 10, 35, 13, 2, -26 }, // 0x3B ';' - { 2638, 24, 25, 31, 3, -29 }, // 0x3C '<' - { 2713, 24, 19, 31, 3, -26 }, // 0x3D '=' - { 2770, 24, 25, 31, 3, -29 }, // 0x3E '>' - { 2845, 27, 36, 30, 0, -35 }, // 0x3F '?' - { 2967, 49, 47, 53, 2, -35 }, // 0x40 '@' - { 3255, 40, 36, 39, 0, -35 }, // 0x41 'A' - { 3435, 33, 36, 39, 4, -35 }, // 0x42 'B' - { 3584, 34, 37, 37, 2, -35 }, // 0x43 'C' - { 3742, 36, 36, 42, 4, -35 }, // 0x44 'D' - { 3904, 28, 36, 34, 4, -35 }, // 0x45 'E' - { 4030, 27, 36, 33, 4, -35 }, // 0x46 'F' - { 4152, 35, 37, 39, 2, -35 }, // 0x47 'G' - { 4314, 33, 36, 41, 4, -35 }, // 0x48 'H' - { 4463, 9, 36, 17, 4, -35 }, // 0x49 'I' - { 4504, 25, 37, 28, -1, -35 }, // 0x4A 'J' - { 4620, 34, 36, 38, 4, -35 }, // 0x4B 'K' - { 4773, 26, 36, 31, 4, -35 }, // 0x4C 'L' - { 4890, 40, 36, 49, 4, -35 }, // 0x4D 'M' - { 5070, 33, 36, 41, 4, -35 }, // 0x4E 'N' - { 5219, 39, 37, 43, 2, -35 }, // 0x4F 'O' - { 5400, 31, 36, 37, 4, -35 }, // 0x50 'P' - { 5540, 41, 44, 43, 2, -35 }, // 0x51 'Q' - { 5766, 32, 36, 37, 4, -35 }, // 0x52 'R' - { 5910, 30, 37, 33, 1, -35 }, // 0x53 'S' - { 6049, 31, 36, 32, 0, -35 }, // 0x54 'T' - { 6189, 32, 37, 40, 4, -35 }, // 0x55 'U' - { 6337, 39, 36, 38, 0, -35 }, // 0x56 'V' - { 6513, 57, 36, 59, 1, -35 }, // 0x57 'W' - { 6770, 36, 36, 36, 0, -35 }, // 0x58 'X' - { 6932, 36, 36, 34, -1, -35 }, // 0x59 'Y' - { 7094, 31, 36, 34, 2, -35 }, // 0x5A 'Z' - { 7234, 14, 48, 19, 4, -37 }, // 0x5B '[' - { 7318, 24, 48, 20, -2, -42 }, // 0x5C '\' - { 7462, 14, 48, 19, 1, -37 }, // 0x5D ']' - { 7546, 25, 22, 31, 3, -28 }, // 0x5E '^' - { 7615, 26, 5, 26, 0, 1 }, // 0x5F '_' - { 7632, 16, 7, 31, 4, -37 }, // 0x60 '`' - { 7646, 26, 28, 31, 2, -27 }, // 0x61 'a' - { 7737, 30, 38, 35, 4, -37 }, // 0x62 'b' - { 7880, 27, 28, 30, 2, -27 }, // 0x63 'c' - { 7975, 30, 38, 35, 2, -37 }, // 0x64 'd' - { 8118, 29, 28, 32, 2, -27 }, // 0x65 'e' - { 8220, 21, 38, 20, 0, -37 }, // 0x66 'f' - { 8320, 30, 38, 36, 2, -27 }, // 0x67 'g' - { 8463, 28, 38, 35, 4, -37 }, // 0x68 'h' - { 8596, 10, 40, 15, 2, -39 }, // 0x69 'i' - { 8646, 18, 50, 16, -5, -39 }, // 0x6A 'j' - { 8759, 30, 38, 33, 4, -37 }, // 0x6B 'k' - { 8902, 8, 38, 15, 4, -37 }, // 0x6C 'l' - { 8940, 46, 28, 54, 4, -27 }, // 0x6D 'm' - { 9101, 28, 28, 35, 4, -27 }, // 0x6E 'n' - { 9199, 30, 28, 33, 2, -27 }, // 0x6F 'o' - { 9304, 30, 38, 35, 4, -27 }, // 0x70 'p' - { 9447, 30, 38, 35, 2, -27 }, // 0x71 'q' - { 9590, 17, 28, 22, 4, -27 }, // 0x72 'r' - { 9650, 25, 28, 27, 1, -27 }, // 0x73 's' - { 9738, 21, 34, 22, 0, -33 }, // 0x74 't' - { 9828, 27, 27, 35, 4, -26 }, // 0x75 'u' - { 9920, 31, 27, 31, 0, -26 }, // 0x76 'v' - { 10025, 48, 27, 48, 0, -26 }, // 0x77 'w' - { 10187, 30, 27, 30, 0, -26 }, // 0x78 'x' - { 10289, 32, 37, 31, -1, -26 }, // 0x79 'y' - { 10437, 24, 27, 28, 2, -26 }, // 0x7A 'z' - { 10518, 16, 48, 20, 3, -37 }, // 0x7B '{' - { 10614, 8, 48, 16, 4, -37 }, // 0x7C '|' - { 10662, 16, 48, 20, 1, -37 }, // 0x7D '}' - { 10758, 25, 10, 31, 3, -22 } }; // 0x7E '~' - -const GFXfont Montserrat_Bold26pt7b PROGMEM = { - (uint8_t *)Montserrat_Bold26pt7bBitmaps, - (GFXglyph *)Montserrat_Bold26pt7bGlyphs, - 0x20, 0x7E, 62 }; - -// Approx. 11462 bytes - -#endif // MONTSERRATBOLD26PT7B_H diff --git a/examples/companion_radio/ui-new/fonts/NotoSans12pt8b.h b/examples/companion_radio/ui-new/fonts/NotoSans12pt8b.h deleted file mode 100644 index bf50843e..00000000 --- a/examples/companion_radio/ui-new/fonts/NotoSans12pt8b.h +++ /dev/null @@ -1,1103 +0,0 @@ -// NotoSans12pt8b.h -// -// Adafruit GFX font header — Latin Extended-A coverage (U+0020 to U+017F). -// Source: Noto Sans at 12pt. -// 352 glyphs covering ASCII, Latin-1 Supplement, and Latin Extended-A. -// Supports Czech, Polish, German, French, Spanish, Italian, Croatian, -// Hungarian, Slovak, Romanian, and other European languages. -// -// Codepoints 0x7F-0x9F (C0/C1 control codes) are present as empty glyphs. -// They are never rendered in normal use because UTF-8 decoding does not -// produce them as standalone codepoints. -// -// To render glyphs above 0x7F, use a drawCodepoint(font, x, y, cp) helper -// that walks the glyph table directly. Adafruit GFX's print() / write() / -// drawChar() are byte-oriented (uint8_t) and cannot address indices > 255. - -#ifndef NOTOSANS12PT8B_H -#define NOTOSANS12PT8B_H - -const uint8_t NotoSans12pt8bBitmaps[] PROGMEM = { - 0x00, 0xDB, 0x6D, 0xB6, 0xDB, 0x60, 0x37, 0xC0, 0xCF, 0x3C, 0xF3, 0x8E, - 0x30, 0x06, 0x30, 0x10, 0x80, 0xC6, 0x03, 0x18, 0x0C, 0x63, 0xFF, 0xFF, - 0xFF, 0xC6, 0x30, 0x18, 0xC0, 0x63, 0x01, 0x8C, 0x3F, 0xFE, 0x31, 0x80, - 0xC6, 0x03, 0x18, 0x0C, 0x60, 0x21, 0x00, 0x04, 0x00, 0x80, 0x7E, 0x1F, - 0xF6, 0x45, 0xC8, 0x39, 0x03, 0x20, 0x7C, 0x03, 0xF0, 0x1F, 0x02, 0x70, - 0x46, 0x08, 0xF1, 0x3F, 0xFE, 0x3F, 0x00, 0x80, 0x10, 0x00, 0x38, 0x0C, - 0x36, 0x06, 0x31, 0x86, 0x18, 0xC3, 0x0C, 0x63, 0x06, 0x31, 0x03, 0x19, - 0x81, 0x8D, 0x9E, 0x66, 0xD9, 0xBE, 0xC8, 0xC4, 0x6C, 0x20, 0x66, 0x10, - 0x33, 0x08, 0x30, 0x84, 0x10, 0x46, 0x18, 0x33, 0x18, 0x0F, 0x00, 0x0F, - 0x00, 0x3F, 0xC0, 0x30, 0xC0, 0x30, 0xC0, 0x30, 0xC0, 0x31, 0xC0, 0x1B, - 0x80, 0x0F, 0x00, 0x1E, 0x00, 0x73, 0x06, 0x61, 0x8E, 0xE0, 0xEC, 0xC0, - 0x7C, 0xE0, 0x38, 0x60, 0x7C, 0x7F, 0xEE, 0x3F, 0x87, 0xFF, 0xA0, 0x19, - 0x8C, 0xC6, 0x33, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x8C, 0x63, 0x0C, 0x71, - 0x80, 0xC3, 0x18, 0x63, 0x18, 0x63, 0x18, 0xC6, 0x31, 0x8C, 0x66, 0x31, - 0x98, 0xCC, 0x00, 0x0E, 0x01, 0x80, 0x10, 0x42, 0x1F, 0x5F, 0xFF, 0xC3, - 0x80, 0xD8, 0x3B, 0x8E, 0x30, 0x44, 0x00, 0x06, 0x00, 0xC0, 0x18, 0x03, - 0x00, 0x61, 0xFF, 0xFF, 0xF8, 0x30, 0x06, 0x00, 0xC0, 0x18, 0x00, 0x76, - 0x66, 0xCC, 0xFF, 0xF0, 0xDF, 0x00, 0x03, 0x81, 0x80, 0xC0, 0xC0, 0x60, - 0x30, 0x30, 0x18, 0x18, 0x0C, 0x06, 0x06, 0x03, 0x01, 0x81, 0x80, 0xC0, - 0xC0, 0x00, 0x1F, 0x07, 0xF1, 0xC3, 0x30, 0x76, 0x07, 0x80, 0xF0, 0x1E, - 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x36, 0x06, 0xC1, 0xD8, 0x31, 0xFE, - 0x1F, 0x00, 0x0C, 0x73, 0xFB, 0x4C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, - 0x30, 0xC3, 0x0C, 0x1F, 0x0F, 0xF3, 0x83, 0x00, 0x60, 0x0E, 0x01, 0x80, - 0x30, 0x0E, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x07, - 0xFF, 0xFF, 0xE0, 0x3F, 0x1F, 0xF9, 0x03, 0x00, 0x70, 0x0E, 0x01, 0x80, - 0x70, 0xFC, 0x1F, 0x00, 0x38, 0x03, 0x80, 0x30, 0x06, 0x00, 0xE0, 0x3F, - 0xFE, 0x7F, 0x80, 0x00, 0xE0, 0x0F, 0x00, 0x58, 0x06, 0xC0, 0x66, 0x03, - 0x30, 0x31, 0x83, 0x0C, 0x18, 0x61, 0x83, 0x18, 0x19, 0xFF, 0xFF, 0xFF, - 0x80, 0x30, 0x01, 0x80, 0x0C, 0x00, 0x60, 0x7F, 0xCF, 0xF9, 0x80, 0x30, - 0x06, 0x00, 0xC0, 0x18, 0x03, 0xFC, 0x77, 0xC0, 0x1C, 0x01, 0x80, 0x30, - 0x06, 0x00, 0xE0, 0x37, 0xFE, 0x7F, 0x00, 0x07, 0xC3, 0xF8, 0xE0, 0x18, - 0x06, 0x00, 0xC0, 0x18, 0x86, 0xFE, 0xF0, 0xFC, 0x0F, 0x81, 0xE0, 0x36, - 0x06, 0xC0, 0xDC, 0x39, 0xFE, 0x1F, 0x80, 0xFF, 0xFF, 0xFC, 0x01, 0x80, - 0x70, 0x0C, 0x03, 0x80, 0x60, 0x0C, 0x03, 0x00, 0x60, 0x18, 0x03, 0x00, - 0xE0, 0x18, 0x07, 0x00, 0xC0, 0x38, 0x00, 0x1F, 0x07, 0xF9, 0x83, 0x30, - 0x36, 0x06, 0xC1, 0x8C, 0x70, 0xFC, 0x1F, 0x07, 0x79, 0x83, 0xE0, 0x3C, - 0x07, 0x80, 0xF8, 0x1B, 0xDE, 0x3F, 0x80, 0x1F, 0x07, 0xF1, 0x83, 0x70, - 0x7C, 0x07, 0x80, 0xF0, 0x1F, 0x03, 0x60, 0xE7, 0xEC, 0x79, 0x80, 0x30, - 0x0C, 0x01, 0x80, 0x63, 0x7C, 0x7E, 0x00, 0xDF, 0x00, 0x00, 0x03, 0x7C, - 0x67, 0x60, 0x00, 0x00, 0x00, 0x66, 0x6C, 0xCC, 0x00, 0x20, 0x1C, 0x0E, - 0x07, 0x03, 0x81, 0xC0, 0x3C, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0x80, - 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xC0, 0xC0, 0x1E, 0x00, - 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xC0, 0x78, 0x3C, 0x3E, 0x1E, 0x03, 0x00, - 0x00, 0x3E, 0x3F, 0xE4, 0x18, 0x03, 0x00, 0xC0, 0x60, 0x18, 0x1C, 0x0E, - 0x03, 0x01, 0x80, 0x60, 0x00, 0x00, 0x01, 0x80, 0x70, 0x1C, 0x00, 0x00, - 0xF8, 0x00, 0xFF, 0xC0, 0x38, 0x0C, 0x0C, 0x00, 0xC3, 0x00, 0x0C, 0xC3, - 0xF8, 0x98, 0xE3, 0x1A, 0x18, 0x63, 0xC6, 0x0C, 0x78, 0xC1, 0x0F, 0x18, - 0x21, 0xE3, 0x0C, 0x24, 0x31, 0xCC, 0xC7, 0xCF, 0x18, 0x00, 0x01, 0x80, - 0x00, 0x38, 0x00, 0x03, 0xF7, 0x80, 0x1F, 0xE0, 0x00, 0x03, 0x80, 0x07, - 0x00, 0x0A, 0x00, 0x36, 0x00, 0x6C, 0x01, 0xCC, 0x03, 0x18, 0x06, 0x30, - 0x18, 0x30, 0x30, 0x60, 0x7F, 0xC1, 0xFF, 0xC3, 0x01, 0x8E, 0x03, 0x98, - 0x03, 0x30, 0x06, 0xC0, 0x06, 0xFF, 0x0F, 0xFC, 0xC0, 0xEC, 0x06, 0xC0, - 0x6C, 0x06, 0xC0, 0x6F, 0xFC, 0xFF, 0x8C, 0x0E, 0xC0, 0x7C, 0x03, 0xC0, - 0x3C, 0x07, 0xC0, 0x6F, 0xFE, 0xFF, 0x80, 0x07, 0xF0, 0xFF, 0xCF, 0x02, - 0x60, 0x07, 0x00, 0x30, 0x01, 0x80, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x18, - 0x00, 0xC0, 0x06, 0x00, 0x38, 0x00, 0xE0, 0x03, 0xFE, 0x0F, 0xF0, 0xFF, - 0x03, 0xFF, 0x0C, 0x0F, 0x30, 0x0C, 0xC0, 0x1B, 0x00, 0x6C, 0x01, 0xF0, - 0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x06, 0xC0, 0x1B, 0x00, 0xCC, - 0x0F, 0x3F, 0xF8, 0xFF, 0x00, 0xFF, 0xFF, 0xFC, 0x03, 0x00, 0xC0, 0x30, - 0x0C, 0x03, 0xFE, 0xFF, 0xB0, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, - 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFC, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, - 0x00, 0xFF, 0xBF, 0xEC, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, - 0x00, 0x03, 0xF8, 0x3F, 0xF1, 0xC0, 0x4C, 0x00, 0x70, 0x01, 0x80, 0x06, - 0x00, 0x38, 0x00, 0xE0, 0x7F, 0x81, 0xF6, 0x00, 0xD8, 0x03, 0x60, 0x0C, - 0xC0, 0x33, 0x80, 0xC7, 0xFF, 0x07, 0xFC, 0xC0, 0x1E, 0x00, 0xF0, 0x07, - 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x7F, 0xFF, 0xFF, 0xFE, 0x00, 0xF0, - 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x18, 0xFF, - 0xF3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x1E, 0xFC, - 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, - 0x0C, 0x30, 0xEF, 0xF8, 0xC0, 0x36, 0x03, 0x30, 0x31, 0x83, 0x0C, 0x30, - 0x63, 0x83, 0x38, 0x1B, 0x80, 0xFC, 0x07, 0xF0, 0x31, 0xC1, 0x87, 0x0C, - 0x18, 0x60, 0xE3, 0x03, 0x98, 0x0C, 0xC0, 0x38, 0xC0, 0x30, 0x0C, 0x03, - 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, - 0x30, 0x0C, 0x03, 0xFF, 0xFF, 0xC0, 0xF0, 0x03, 0xF8, 0x03, 0xFC, 0x01, - 0xFB, 0x00, 0xFD, 0x80, 0xDE, 0xC0, 0x6F, 0x30, 0x27, 0x98, 0x33, 0xCE, - 0x19, 0xE3, 0x18, 0xF1, 0x8C, 0x78, 0x66, 0x3C, 0x36, 0x1E, 0x1B, 0x0F, - 0x07, 0x07, 0x83, 0x83, 0xC1, 0xC1, 0x80, 0xE0, 0x0F, 0xC0, 0x3F, 0x00, - 0xFE, 0x03, 0xD8, 0x0F, 0x30, 0x3C, 0xE0, 0xF1, 0x83, 0xC3, 0x0F, 0x0E, - 0x3C, 0x18, 0xF0, 0x33, 0xC0, 0xEF, 0x01, 0xBC, 0x07, 0xF0, 0x0F, 0xC0, - 0x1C, 0x07, 0xE0, 0x1F, 0xF8, 0x38, 0x1C, 0x30, 0x0E, 0x60, 0x06, 0x60, - 0x07, 0x60, 0x07, 0xE0, 0x03, 0xE0, 0x03, 0xE0, 0x03, 0x60, 0x03, 0x60, - 0x07, 0x60, 0x06, 0x70, 0x0E, 0x38, 0x1C, 0x1F, 0xF8, 0x0F, 0xF0, 0xFE, - 0x1F, 0xFB, 0x07, 0x60, 0x7C, 0x07, 0x80, 0xF0, 0x1E, 0x07, 0xC7, 0xDF, - 0xF3, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x00, 0x07, - 0xE0, 0x1F, 0xF8, 0x38, 0x1C, 0x30, 0x0E, 0x60, 0x06, 0x60, 0x07, 0x60, - 0x07, 0xE0, 0x03, 0xE0, 0x03, 0xE0, 0x03, 0x60, 0x03, 0x60, 0x07, 0x60, - 0x06, 0x70, 0x0E, 0x38, 0x1C, 0x1F, 0xF8, 0x0F, 0xF0, 0x00, 0x70, 0x00, - 0x38, 0x00, 0x1C, 0x00, 0x0E, 0xFF, 0x0F, 0xFC, 0xC1, 0xCC, 0x0E, 0xC0, - 0x6C, 0x06, 0xC0, 0x6C, 0x0C, 0xFF, 0x8F, 0xF0, 0xC3, 0x0C, 0x18, 0xC1, - 0xCC, 0x0C, 0xC0, 0xEC, 0x06, 0xC0, 0x70, 0x1F, 0x8F, 0xF9, 0x81, 0x70, - 0x0E, 0x00, 0xC0, 0x1C, 0x01, 0xE0, 0x1F, 0x00, 0xF8, 0x07, 0x00, 0x70, - 0x06, 0x00, 0xE0, 0x37, 0xFE, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xC1, 0xC0, - 0x0E, 0x00, 0x70, 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x38, 0x01, - 0xC0, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0xC0, - 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, - 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xF0, 0x1D, 0xC0, 0xC7, - 0xFC, 0x1F, 0xC0, 0xC0, 0x0F, 0x80, 0x76, 0x01, 0x98, 0x06, 0x30, 0x38, - 0xC0, 0xC3, 0x03, 0x06, 0x1C, 0x18, 0x60, 0x61, 0x80, 0xCC, 0x03, 0x30, - 0x0C, 0xC0, 0x1E, 0x00, 0x78, 0x01, 0xE0, 0x03, 0x00, 0xE0, 0x30, 0x1D, - 0x81, 0xC0, 0x66, 0x07, 0x81, 0x98, 0x1E, 0x0E, 0x70, 0xD8, 0x30, 0xC3, - 0x30, 0xC3, 0x0C, 0xC3, 0x0C, 0x33, 0x1C, 0x39, 0x8C, 0x60, 0x66, 0x19, - 0x81, 0x98, 0x66, 0x06, 0xC1, 0xB8, 0x0F, 0x03, 0xC0, 0x3C, 0x0F, 0x00, - 0xF0, 0x3C, 0x03, 0x80, 0xE0, 0x06, 0x01, 0x80, 0xE0, 0x19, 0xC0, 0xC3, - 0x03, 0x06, 0x18, 0x18, 0xE0, 0x33, 0x00, 0xF8, 0x01, 0xE0, 0x07, 0x00, - 0x1E, 0x00, 0xDC, 0x03, 0x30, 0x18, 0x60, 0xE1, 0x83, 0x03, 0x18, 0x0E, - 0xE0, 0x1C, 0xC0, 0x1B, 0x01, 0xDC, 0x0C, 0x60, 0xE3, 0x86, 0x0C, 0x60, - 0x73, 0x01, 0xB0, 0x0F, 0x80, 0x38, 0x00, 0xC0, 0x06, 0x00, 0x30, 0x01, - 0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, 0xFF, 0xEF, 0xFE, 0x00, 0xE0, 0x0C, - 0x01, 0xC0, 0x38, 0x03, 0x00, 0x70, 0x0E, 0x00, 0xC0, 0x1C, 0x03, 0x80, - 0x30, 0x07, 0x00, 0xE0, 0x0F, 0xFF, 0xFF, 0xF0, 0xFF, 0xF1, 0x8C, 0x63, - 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0xC6, 0x31, 0xFF, 0x80, 0xC0, 0x30, - 0x18, 0x0C, 0x03, 0x01, 0x80, 0x60, 0x30, 0x18, 0x06, 0x03, 0x01, 0x80, - 0x60, 0x30, 0x0C, 0x06, 0x03, 0x80, 0xFF, 0xC6, 0x31, 0x8C, 0x63, 0x18, - 0xC6, 0x31, 0x8C, 0x63, 0x18, 0xC7, 0xFF, 0x80, 0x04, 0x00, 0xE0, 0x0A, - 0x01, 0xB0, 0x19, 0x03, 0x18, 0x30, 0x86, 0x0C, 0x60, 0x4C, 0x06, 0xC0, - 0x30, 0xFF, 0xFF, 0xF0, 0xE3, 0x0C, 0x30, 0x1F, 0x1F, 0xE2, 0x0C, 0x03, - 0x00, 0xC0, 0xF3, 0xFD, 0x83, 0xC0, 0xF0, 0x3C, 0x1D, 0xDF, 0x7E, 0x40, - 0xC0, 0x18, 0x03, 0x00, 0x60, 0x0C, 0x01, 0x9E, 0x37, 0xE7, 0x06, 0xE0, - 0xF8, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1F, 0x06, 0xFF, 0xDB, - 0xF0, 0x0F, 0x4F, 0xE7, 0x09, 0x80, 0x60, 0x38, 0x0C, 0x03, 0x00, 0xE0, - 0x18, 0x07, 0x00, 0xFE, 0x1F, 0x80, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, - 0x06, 0x1C, 0xCF, 0xFB, 0x87, 0x60, 0x7C, 0x0F, 0x81, 0xE0, 0x3C, 0x07, - 0xC0, 0xD8, 0x1B, 0x03, 0x3F, 0xA3, 0xE4, 0x0F, 0x07, 0xF1, 0xC3, 0x30, - 0x36, 0x07, 0xFF, 0xFF, 0xFF, 0x00, 0xE0, 0x0C, 0x01, 0xC0, 0x1F, 0xE1, - 0xFC, 0x0F, 0x8F, 0xC6, 0x03, 0x01, 0x81, 0xFB, 0xFC, 0x30, 0x18, 0x0C, - 0x06, 0x03, 0x01, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x00, 0x0E, 0x27, - 0xF5, 0xC3, 0xB0, 0x36, 0x07, 0xC0, 0xF0, 0x1E, 0x03, 0xE0, 0x6C, 0x0D, - 0x81, 0x9F, 0xF1, 0xF6, 0x00, 0xC0, 0x18, 0x03, 0x60, 0xEF, 0xF8, 0x38, - 0x00, 0xC0, 0x18, 0x03, 0x00, 0x60, 0x0C, 0x01, 0x9E, 0x37, 0xF7, 0x06, - 0xE0, 0xF8, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, - 0x78, 0x0C, 0xF0, 0xFF, 0xFF, 0xFF, 0xC0, 0x18, 0xC0, 0x01, 0x8C, 0x63, - 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0xC6, 0x33, 0xFB, 0x00, 0xC0, 0x30, - 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x7C, 0x1B, 0x0C, 0xC6, 0x33, 0x0D, 0x83, - 0xE0, 0xEC, 0x33, 0x8C, 0x73, 0x0C, 0xC1, 0xB0, 0x70, 0xFF, 0xFF, 0xFF, - 0xFF, 0xF0, 0xCF, 0x0F, 0x37, 0xEF, 0xEE, 0x1E, 0x1F, 0x83, 0x83, 0xC0, - 0xC0, 0xF0, 0x30, 0x3C, 0x0C, 0x0F, 0x03, 0x03, 0xC0, 0xC0, 0xF0, 0x30, - 0x3C, 0x0C, 0x0F, 0x03, 0x03, 0xC0, 0xC0, 0xC0, 0xCF, 0x1B, 0xFB, 0x83, - 0x70, 0x7C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, - 0x3C, 0x06, 0x0F, 0x03, 0xFC, 0x70, 0xE6, 0x06, 0x60, 0x3E, 0x03, 0xC0, - 0x3C, 0x03, 0xE0, 0x36, 0x07, 0x70, 0x63, 0xFC, 0x1F, 0x80, 0xCF, 0x1B, - 0xF3, 0x83, 0x70, 0x7C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, - 0x83, 0x7F, 0xED, 0xF9, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x18, 0x03, 0x00, - 0x00, 0x0E, 0x27, 0xF5, 0xC3, 0xB0, 0x3E, 0x07, 0xC0, 0xF0, 0x1E, 0x03, - 0xE0, 0x6C, 0x0D, 0x81, 0x9F, 0xF1, 0xF6, 0x00, 0xC0, 0x18, 0x03, 0x00, - 0x60, 0x0C, 0x01, 0x80, 0xCF, 0xBF, 0xC7, 0x0C, 0x18, 0x30, 0x60, 0xC1, - 0x83, 0x06, 0x0C, 0x00, 0x1E, 0x3F, 0xF8, 0x38, 0x0E, 0x03, 0xC0, 0xF8, - 0x0E, 0x01, 0x80, 0xC0, 0x7E, 0xFF, 0xE0, 0x10, 0x30, 0x7F, 0xFF, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x1D, 0x1F, 0xC0, 0xF8, - 0x1F, 0x03, 0xE0, 0x7C, 0x0F, 0x81, 0xF0, 0x3E, 0x07, 0xC0, 0xF8, 0x1F, - 0x03, 0xBF, 0xB7, 0xE6, 0xC0, 0x3E, 0x07, 0x60, 0x66, 0x06, 0x30, 0xC3, - 0x0C, 0x30, 0xC1, 0x98, 0x19, 0x81, 0xB0, 0x0F, 0x00, 0xF0, 0x06, 0x00, - 0xC0, 0xC0, 0xD8, 0x38, 0x36, 0x1E, 0x0D, 0x87, 0x86, 0x61, 0xB1, 0x8C, - 0x4C, 0x63, 0x33, 0x38, 0xCC, 0x6C, 0x33, 0x1B, 0x07, 0x86, 0xC1, 0xE0, - 0xA0, 0x78, 0x38, 0x0C, 0x0E, 0x00, 0x60, 0x77, 0x06, 0x30, 0xC1, 0x9C, - 0x0D, 0x80, 0xF0, 0x06, 0x00, 0xF0, 0x0D, 0x81, 0x9C, 0x30, 0xC7, 0x06, - 0xE0, 0x70, 0xC0, 0x3E, 0x07, 0x60, 0x66, 0x06, 0x30, 0xC3, 0x0C, 0x38, - 0xC1, 0x98, 0x19, 0x80, 0xD8, 0x0F, 0x00, 0xF0, 0x06, 0x00, 0x60, 0x06, - 0x00, 0xC0, 0x1C, 0x0F, 0x80, 0xE0, 0x00, 0xFF, 0xFF, 0xC0, 0xE0, 0x60, - 0x60, 0x60, 0x30, 0x30, 0x30, 0x38, 0x18, 0x1F, 0xFF, 0xF8, 0x02, 0x3C, - 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x31, 0xE3, 0x03, 0x83, 0x03, 0x06, 0x0C, - 0x18, 0x30, 0x60, 0xF0, 0x20, 0xFF, 0xFF, 0xFF, 0x81, 0xE0, 0xC1, 0x83, - 0x06, 0x0C, 0x18, 0x38, 0x3C, 0x18, 0xE3, 0x86, 0x0C, 0x18, 0x30, 0x60, - 0xC7, 0x08, 0x00, 0x78, 0x3F, 0xEE, 0x1F, 0x80, 0xFF, 0xE0, 0x18, 0x06, - 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, - 0x60, 0x18, 0x06, 0x01, 0xFF, 0xC0, 0xFF, 0xE0, 0x18, 0x06, 0x01, 0x80, - 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, - 0x06, 0x01, 0xFF, 0xC0, 0xFF, 0xE0, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, - 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, - 0xFF, 0xC0, 0xFF, 0xE0, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, - 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0xFF, 0xC0, - 0xFF, 0xE0, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, - 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0xFF, 0xC0, 0xFF, 0xE0, - 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, - 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0xFF, 0xC0, 0xFF, 0xE0, 0x18, 0x06, - 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, - 0x60, 0x18, 0x06, 0x01, 0xFF, 0xC0, 0xFF, 0xE0, 0x18, 0x06, 0x01, 0x80, - 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, - 0x06, 0x01, 0xFF, 0xC0, 0xFF, 0xE0, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, - 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, - 0xFF, 0xC0, 0xFF, 0xE0, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, - 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0xFF, 0xC0, - 0xFF, 0xE0, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, - 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0xFF, 0xC0, 0xFF, 0xE0, - 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, - 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0xFF, 0xC0, 0xFF, 0xE0, 0x18, 0x06, - 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, - 0x60, 0x18, 0x06, 0x01, 0xFF, 0xC0, 0xFF, 0xE0, 0x18, 0x06, 0x01, 0x80, - 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, - 0x06, 0x01, 0xFF, 0xC0, 0xFF, 0xE0, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, - 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, - 0xFF, 0xC0, 0xFF, 0xE0, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, - 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0xFF, 0xC0, - 0xFF, 0xE0, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, - 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0xFF, 0xC0, 0xFF, 0xE0, - 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, - 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0xFF, 0xC0, 0xFF, 0xE0, 0x18, 0x06, - 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, - 0x60, 0x18, 0x06, 0x01, 0xFF, 0xC0, 0xFF, 0xE0, 0x18, 0x06, 0x01, 0x80, - 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, - 0x06, 0x01, 0xFF, 0xC0, 0xFF, 0xE0, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, - 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, - 0xFF, 0xC0, 0xFF, 0xE0, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, - 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0xFF, 0xC0, - 0xFF, 0xE0, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, - 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0xFF, 0xC0, 0xFF, 0xE0, - 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, - 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0xFF, 0xC0, 0xFF, 0xE0, 0x18, 0x06, - 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, - 0x60, 0x18, 0x06, 0x01, 0xFF, 0xC0, 0xFF, 0xE0, 0x18, 0x06, 0x01, 0x80, - 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, - 0x06, 0x01, 0xFF, 0xC0, 0xFF, 0xE0, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, - 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, - 0xFF, 0xC0, 0xFF, 0xE0, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, - 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0xFF, 0xC0, - 0xFF, 0xE0, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, - 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0xFF, 0xC0, 0xFF, 0xE0, - 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, - 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0xFF, 0xC0, 0xFF, 0xE0, 0x18, 0x06, - 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, - 0x60, 0x18, 0x06, 0x01, 0xFF, 0xC0, 0xFF, 0xE0, 0x18, 0x06, 0x01, 0x80, - 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, - 0x06, 0x01, 0xFF, 0xC0, 0xFF, 0xE0, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, - 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, - 0xFF, 0xC0, 0x00, 0xDF, 0x81, 0xB6, 0xDB, 0x6D, 0xB6, 0xC0, 0x04, 0x02, - 0x07, 0xE7, 0xF6, 0x03, 0x03, 0x01, 0x80, 0xC0, 0x60, 0x30, 0x0C, 0x07, - 0x09, 0xFC, 0x7E, 0x08, 0x04, 0x00, 0x0F, 0xC1, 0xFE, 0x38, 0x23, 0x00, - 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0xFF, 0x83, 0x00, 0x30, 0x03, 0x00, - 0x30, 0x03, 0x00, 0x60, 0x0F, 0xFF, 0xFF, 0xF0, 0x40, 0x5D, 0xED, 0xFF, - 0x18, 0x66, 0x04, 0xC0, 0x98, 0x13, 0x06, 0x39, 0xDF, 0xFD, 0x01, 0x00, - 0xE0, 0x1B, 0x01, 0x8C, 0x0C, 0x60, 0xC1, 0x86, 0x0C, 0x60, 0x33, 0x01, - 0xB0, 0x07, 0x81, 0xFF, 0x0F, 0xF8, 0x06, 0x03, 0xFE, 0x1F, 0xF0, 0x0C, - 0x00, 0x60, 0x03, 0x00, 0xFF, 0x81, 0xFF, 0x3F, 0x1F, 0xE6, 0x01, 0x80, - 0x70, 0x0F, 0x07, 0xF1, 0x86, 0x40, 0x98, 0x37, 0x18, 0xFE, 0x0F, 0x00, - 0x60, 0x18, 0x06, 0xF7, 0x9F, 0xC0, 0x67, 0xCC, 0x03, 0xF0, 0x07, 0x0E, - 0x0E, 0x01, 0x84, 0x18, 0x66, 0x3F, 0x12, 0x30, 0x8F, 0x18, 0x03, 0x88, - 0x01, 0x8C, 0x00, 0xE2, 0x00, 0x71, 0x80, 0x28, 0xC0, 0x16, 0x3F, 0x19, - 0x0F, 0x18, 0xC0, 0x18, 0x38, 0x38, 0x07, 0xF0, 0x00, 0xF9, 0x30, 0x5F, - 0xE6, 0x1C, 0xDD, 0x18, 0xC6, 0x63, 0x39, 0x8C, 0xC6, 0x39, 0x86, 0x30, - 0xC6, 0x18, 0xC4, 0x20, 0xFF, 0xFF, 0xFC, 0x00, 0x80, 0x10, 0x02, 0x00, - 0x40, 0xFF, 0xF0, 0x03, 0xF0, 0x07, 0x0E, 0x0E, 0x01, 0x84, 0x70, 0x66, - 0x3F, 0x12, 0x11, 0x8F, 0x08, 0xC3, 0x84, 0x61, 0x83, 0xF0, 0xE1, 0xF0, - 0x70, 0x98, 0x28, 0x46, 0x16, 0x23, 0x19, 0x10, 0xD8, 0xC0, 0x18, 0x38, - 0x38, 0x07, 0xF0, 0x00, 0xFF, 0xF0, 0x3C, 0x66, 0xC3, 0xC3, 0xC3, 0x66, - 0x3C, 0x06, 0x00, 0xC0, 0x18, 0x03, 0x00, 0x61, 0xFF, 0xC1, 0x80, 0x30, - 0x06, 0x00, 0xC0, 0x18, 0x00, 0x0F, 0xFF, 0xFF, 0xC0, 0x7B, 0x30, 0x43, - 0x0C, 0x63, 0x18, 0xC3, 0xF0, 0x7C, 0xE6, 0x02, 0x06, 0x3C, 0x3E, 0x02, - 0x03, 0x86, 0xFE, 0x3B, 0x99, 0x80, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, - 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0xF8, 0x1F, 0x83, 0xFF, 0xBF, 0xE7, - 0x80, 0x30, 0x06, 0x00, 0xC0, 0x18, 0x03, 0x00, 0x00, 0x1F, 0xF3, 0xF1, - 0x7F, 0x17, 0xF1, 0xFF, 0x1F, 0xF1, 0xFF, 0x1F, 0xF1, 0x7F, 0x17, 0xF1, - 0x3F, 0x11, 0xF1, 0x01, 0x10, 0x11, 0x01, 0x10, 0x11, 0x01, 0x10, 0x11, - 0x01, 0x10, 0x11, 0x01, 0x10, 0xDF, 0x00, 0x33, 0x86, 0x3F, 0xF0, 0x3B, - 0xF6, 0x31, 0x8C, 0x63, 0x18, 0xC0, 0x79, 0x9A, 0x1C, 0x18, 0x38, 0xF1, - 0x3C, 0xC6, 0x39, 0x87, 0x30, 0xC6, 0x18, 0xC6, 0x73, 0x39, 0x8C, 0xC6, - 0x11, 0x00, 0x38, 0x0C, 0x78, 0x18, 0xD8, 0x18, 0x98, 0x30, 0x18, 0x20, - 0x18, 0x60, 0x18, 0xC0, 0x18, 0xC6, 0x19, 0x8E, 0x19, 0x1E, 0x03, 0x16, - 0x06, 0x26, 0x04, 0x66, 0x0C, 0x7F, 0x18, 0x7F, 0x18, 0x06, 0x30, 0x06, - 0x30, 0x18, 0x70, 0x10, 0xD0, 0x30, 0x90, 0x60, 0x10, 0x60, 0x10, 0xC0, - 0x10, 0x80, 0x11, 0xBE, 0x13, 0x23, 0x13, 0x03, 0x06, 0x03, 0x04, 0x02, - 0x0C, 0x06, 0x18, 0x0C, 0x18, 0x18, 0x30, 0x30, 0x60, 0x7F, 0x3C, 0x03, - 0x3B, 0x81, 0x80, 0x60, 0x60, 0x18, 0x30, 0x3C, 0x08, 0x0F, 0x86, 0x00, - 0x23, 0x00, 0x0C, 0xC6, 0x86, 0x63, 0xBF, 0x91, 0xE0, 0x0C, 0xD8, 0x06, - 0x26, 0x01, 0x99, 0x80, 0xCF, 0xF0, 0x23, 0xFC, 0x18, 0x06, 0x0C, 0x01, - 0x80, 0x0C, 0x06, 0x03, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x18, 0x18, - 0x18, 0x18, 0x0C, 0x06, 0x03, 0x01, 0xC6, 0x7F, 0x8C, 0x00, 0x0E, 0x00, - 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x70, 0x00, 0xE0, 0x01, - 0x40, 0x06, 0xC0, 0x0D, 0x80, 0x39, 0x80, 0x63, 0x00, 0xC6, 0x03, 0x06, - 0x06, 0x0C, 0x0F, 0xF8, 0x3F, 0xF8, 0x60, 0x31, 0xC0, 0x73, 0x00, 0x66, - 0x00, 0xD8, 0x00, 0xC0, 0x00, 0xE0, 0x03, 0x80, 0x06, 0x00, 0x18, 0x00, - 0x00, 0x00, 0x70, 0x00, 0xE0, 0x01, 0x40, 0x06, 0xC0, 0x0D, 0x80, 0x39, - 0x80, 0x63, 0x00, 0xC6, 0x03, 0x06, 0x06, 0x0C, 0x0F, 0xF8, 0x3F, 0xF8, - 0x60, 0x31, 0xC0, 0x73, 0x00, 0x66, 0x00, 0xD8, 0x00, 0xC0, 0x03, 0x80, - 0x07, 0x80, 0x19, 0x80, 0x61, 0x80, 0x00, 0x00, 0x70, 0x00, 0xE0, 0x01, - 0x40, 0x06, 0xC0, 0x0D, 0x80, 0x39, 0x80, 0x63, 0x00, 0xC6, 0x03, 0x06, - 0x06, 0x0C, 0x0F, 0xF8, 0x3F, 0xF8, 0x60, 0x31, 0xC0, 0x73, 0x00, 0x66, - 0x00, 0xD8, 0x00, 0xC0, 0x0F, 0x30, 0x37, 0xC0, 0x43, 0x00, 0x00, 0x00, - 0x38, 0x00, 0x70, 0x00, 0xA0, 0x03, 0x60, 0x06, 0xC0, 0x1C, 0xC0, 0x31, - 0x80, 0x63, 0x01, 0x83, 0x03, 0x06, 0x07, 0xFC, 0x1F, 0xFC, 0x30, 0x18, - 0xE0, 0x39, 0x80, 0x33, 0x00, 0x6C, 0x00, 0x60, 0x06, 0x60, 0x1C, 0xC0, - 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x70, 0x00, 0xA0, 0x03, 0x60, 0x06, - 0xC0, 0x1C, 0xC0, 0x31, 0x80, 0x63, 0x01, 0x83, 0x03, 0x06, 0x07, 0xFC, - 0x1F, 0xFC, 0x30, 0x18, 0xE0, 0x39, 0x80, 0x33, 0x00, 0x6C, 0x00, 0x60, - 0x03, 0x80, 0x08, 0x80, 0x11, 0x00, 0x3E, 0x00, 0x38, 0x00, 0x50, 0x01, - 0xB0, 0x03, 0x60, 0x0E, 0x60, 0x18, 0xC0, 0x31, 0x80, 0xC1, 0x81, 0x83, - 0x03, 0xFE, 0x0F, 0xFE, 0x18, 0x0C, 0x70, 0x1C, 0xC0, 0x19, 0x80, 0x36, - 0x00, 0x30, 0x00, 0xFF, 0xE0, 0x3F, 0xFC, 0x06, 0x60, 0x01, 0xCC, 0x00, - 0x31, 0x80, 0x0E, 0x30, 0x01, 0x86, 0x00, 0x70, 0xFF, 0x0C, 0x1F, 0xE1, - 0x83, 0x00, 0x7F, 0xE0, 0x0F, 0xFC, 0x03, 0x01, 0x80, 0x60, 0x30, 0x18, - 0x06, 0x03, 0x00, 0xFF, 0xC0, 0x1F, 0xE0, 0x07, 0xF0, 0xFF, 0xCF, 0x02, - 0x60, 0x07, 0x00, 0x30, 0x01, 0x80, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x18, - 0x00, 0xC0, 0x06, 0x00, 0x38, 0x00, 0xE0, 0x03, 0xFE, 0x0F, 0xF0, 0x08, - 0x00, 0xE0, 0x01, 0x80, 0x0C, 0x03, 0xE0, 0x1C, 0x00, 0x38, 0x06, 0x00, - 0xC0, 0x18, 0x00, 0x3F, 0xFF, 0xFF, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, - 0xFF, 0xBF, 0xEC, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xFF, 0xFF, - 0xF0, 0x03, 0x81, 0xC0, 0x60, 0x30, 0x00, 0x3F, 0xFF, 0xFF, 0x00, 0xC0, - 0x30, 0x0C, 0x03, 0x00, 0xFF, 0xBF, 0xEC, 0x03, 0x00, 0xC0, 0x30, 0x0C, - 0x03, 0x00, 0xFF, 0xFF, 0xF0, 0x1C, 0x07, 0x83, 0x31, 0x86, 0x00, 0x3F, - 0xFF, 0xFF, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xFF, 0xBF, 0xEC, 0x03, - 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xFF, 0xFF, 0xF0, 0x33, 0x1C, 0xC0, - 0x00, 0x00, 0xFF, 0xFF, 0xFC, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0xFE, - 0xFF, 0xB0, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0xFF, 0xFF, 0xC0, - 0xE1, 0x83, 0x06, 0x03, 0xFF, 0xCC, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, - 0x30, 0xC3, 0x0C, 0x7B, 0xF0, 0x0E, 0x38, 0x61, 0x80, 0x1F, 0xBF, 0x18, - 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x87, 0x9F, - 0x80, 0x38, 0x3C, 0x66, 0xC3, 0x00, 0x7E, 0x7E, 0x18, 0x18, 0x18, 0x18, - 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x7E, 0x67, - 0xCC, 0x00, 0x07, 0xEF, 0xC6, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, - 0x0C, 0x18, 0x30, 0x61, 0xE7, 0xE0, 0x7F, 0x80, 0xFF, 0xC1, 0xC1, 0xE3, - 0x80, 0xC7, 0x00, 0xCE, 0x01, 0x9C, 0x03, 0xB8, 0x07, 0xFF, 0x0F, 0xFE, - 0x1D, 0xC0, 0x3B, 0x80, 0x67, 0x00, 0xCE, 0x03, 0x1C, 0x1E, 0x3F, 0xF8, - 0x7F, 0x80, 0x0F, 0x30, 0x6F, 0x81, 0x0C, 0x00, 0x00, 0xE0, 0x0F, 0xC0, - 0x3F, 0x00, 0xFE, 0x03, 0xD8, 0x0F, 0x30, 0x3C, 0xE0, 0xF1, 0x83, 0xC3, - 0x0F, 0x0E, 0x3C, 0x18, 0xF0, 0x33, 0xC0, 0xEF, 0x01, 0xBC, 0x07, 0xF0, - 0x0F, 0xC0, 0x1C, 0x07, 0x00, 0x03, 0x00, 0x01, 0x80, 0x00, 0xC0, 0x00, - 0x00, 0x07, 0xE0, 0x1F, 0xF8, 0x38, 0x1C, 0x30, 0x0E, 0x60, 0x06, 0x60, - 0x07, 0x60, 0x07, 0xE0, 0x03, 0xE0, 0x03, 0xE0, 0x03, 0x60, 0x03, 0x60, - 0x07, 0x60, 0x06, 0x70, 0x0E, 0x38, 0x1C, 0x1F, 0xF8, 0x0F, 0xF0, 0x00, - 0x70, 0x00, 0xE0, 0x00, 0xC0, 0x01, 0x80, 0x00, 0x00, 0x07, 0xE0, 0x1F, - 0xF8, 0x38, 0x1C, 0x30, 0x0E, 0x60, 0x06, 0x60, 0x07, 0x60, 0x07, 0xE0, - 0x03, 0xE0, 0x03, 0xE0, 0x03, 0x60, 0x03, 0x60, 0x07, 0x60, 0x06, 0x70, - 0x0E, 0x38, 0x1C, 0x1F, 0xF8, 0x0F, 0xF0, 0x03, 0x80, 0x03, 0xC0, 0x06, - 0x60, 0x0C, 0x30, 0x00, 0x00, 0x07, 0xE0, 0x1F, 0xF8, 0x38, 0x1C, 0x30, - 0x0E, 0x60, 0x06, 0x60, 0x07, 0x60, 0x07, 0xE0, 0x03, 0xE0, 0x03, 0xE0, - 0x03, 0x60, 0x03, 0x60, 0x07, 0x60, 0x06, 0x70, 0x0E, 0x38, 0x1C, 0x1F, - 0xF8, 0x0F, 0xF0, 0x07, 0x98, 0x0D, 0xF0, 0x08, 0x60, 0x00, 0x00, 0x07, - 0xE0, 0x1F, 0xF8, 0x38, 0x1C, 0x30, 0x0E, 0x60, 0x06, 0x60, 0x07, 0x60, - 0x07, 0xE0, 0x03, 0xE0, 0x03, 0xE0, 0x03, 0x60, 0x03, 0x60, 0x07, 0x60, - 0x06, 0x70, 0x0E, 0x38, 0x1C, 0x1F, 0xF8, 0x0F, 0xF0, 0x06, 0x60, 0x0E, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0x1F, 0xF8, 0x38, 0x1C, 0x30, - 0x0E, 0x60, 0x06, 0x60, 0x07, 0x60, 0x07, 0xE0, 0x03, 0xE0, 0x03, 0xE0, - 0x03, 0x60, 0x03, 0x60, 0x07, 0x60, 0x06, 0x70, 0x0E, 0x38, 0x1C, 0x1F, - 0xF8, 0x0F, 0xF0, 0xE0, 0x6E, 0x18, 0xE6, 0x0F, 0x80, 0xE0, 0x1E, 0x06, - 0xE1, 0x8E, 0x60, 0xE8, 0x08, 0x00, 0x04, 0x07, 0xE6, 0x1F, 0xFC, 0x38, - 0x1C, 0x30, 0x1E, 0x60, 0x36, 0x60, 0x67, 0x60, 0x67, 0xE0, 0xC3, 0xE1, - 0x83, 0xE3, 0x83, 0x63, 0x03, 0x66, 0x07, 0x6C, 0x06, 0x7C, 0x0E, 0x38, - 0x1C, 0x3F, 0xF8, 0x7F, 0xF0, 0x20, 0x00, 0x0E, 0x00, 0x30, 0x00, 0xC0, - 0x03, 0x00, 0x00, 0x60, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, - 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, - 0xF8, 0x0E, 0xE0, 0x63, 0xFE, 0x0F, 0xE0, 0x01, 0xC0, 0x1C, 0x00, 0xC0, - 0x0C, 0x00, 0x00, 0x60, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, - 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, - 0xF8, 0x0E, 0xE0, 0x63, 0xFE, 0x0F, 0xE0, 0x07, 0x00, 0x3C, 0x03, 0x30, - 0x30, 0xC0, 0x00, 0x60, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, - 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, - 0xF8, 0x0E, 0xE0, 0x63, 0xFE, 0x0F, 0xE0, 0x0C, 0xC0, 0xE6, 0x00, 0x00, - 0x00, 0x0C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, - 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1F, 0x01, - 0xDC, 0x0C, 0x7F, 0xC1, 0xFC, 0x00, 0x01, 0xC0, 0x1C, 0x00, 0xC0, 0x0C, - 0x00, 0x00, 0x60, 0x0D, 0x80, 0xEE, 0x06, 0x30, 0x71, 0xC3, 0x06, 0x30, - 0x39, 0x80, 0xD8, 0x07, 0xC0, 0x1C, 0x00, 0x60, 0x03, 0x00, 0x18, 0x00, - 0xC0, 0x06, 0x00, 0x30, 0x01, 0x80, 0xC0, 0x18, 0x03, 0x00, 0x7F, 0x8F, - 0xFD, 0x83, 0xB0, 0x3E, 0x03, 0xC0, 0x78, 0x0F, 0x03, 0x63, 0xEF, 0xF1, - 0x80, 0x30, 0x06, 0x00, 0xC0, 0x00, 0x3F, 0x07, 0xFC, 0xE0, 0xCC, 0x0C, - 0xC0, 0xCC, 0x1C, 0xC3, 0x8C, 0x60, 0xC6, 0x0C, 0x70, 0xC3, 0x8C, 0x1C, - 0xC0, 0x6C, 0x03, 0xC0, 0x3C, 0x03, 0xCE, 0xEC, 0xFC, 0x1C, 0x03, 0x00, - 0x60, 0x0C, 0x00, 0x07, 0xC7, 0xF8, 0x83, 0x00, 0xC0, 0x30, 0x3C, 0xFF, - 0x60, 0xF0, 0x3C, 0x0F, 0x07, 0x77, 0xDF, 0x90, 0x03, 0x81, 0xC0, 0x60, - 0x30, 0x00, 0x07, 0xC7, 0xF8, 0x83, 0x00, 0xC0, 0x30, 0x3C, 0xFF, 0x60, - 0xF0, 0x3C, 0x0F, 0x07, 0x77, 0xDF, 0x90, 0x0E, 0x03, 0xC1, 0x98, 0xC3, - 0x00, 0x07, 0xC7, 0xF8, 0x83, 0x00, 0xC0, 0x30, 0x3C, 0xFF, 0x60, 0xF0, - 0x3C, 0x0F, 0x07, 0x77, 0xDF, 0x90, 0x3C, 0xDB, 0xE4, 0x30, 0x00, 0x1F, - 0x1F, 0xE2, 0x0C, 0x03, 0x00, 0xC0, 0xF3, 0xFD, 0x83, 0xC0, 0xF0, 0x3C, - 0x1D, 0xDF, 0x7E, 0x40, 0x19, 0x8E, 0x60, 0x00, 0x00, 0x1F, 0x1F, 0xE2, - 0x0C, 0x03, 0x00, 0xC0, 0xF3, 0xFD, 0x83, 0xC0, 0xF0, 0x3C, 0x1D, 0xDF, - 0x7E, 0x40, 0x0E, 0x04, 0x41, 0x10, 0x6C, 0x0E, 0x00, 0x01, 0xF1, 0xFE, - 0x20, 0xC0, 0x30, 0x0C, 0x0F, 0x3F, 0xD8, 0x3C, 0x0F, 0x03, 0xC1, 0xDD, - 0xF7, 0xE4, 0x1E, 0x1E, 0x1F, 0xEF, 0xE2, 0x1E, 0x18, 0x03, 0x83, 0x00, - 0xC0, 0xC0, 0xFF, 0xF3, 0xFF, 0xFD, 0x83, 0x00, 0xC0, 0xC0, 0x30, 0x30, - 0x0C, 0x1E, 0x01, 0xDD, 0xFF, 0x7E, 0x1F, 0x80, 0x0F, 0x4F, 0xE7, 0x09, - 0x80, 0x60, 0x38, 0x0C, 0x03, 0x00, 0xE0, 0x18, 0x07, 0x00, 0xFE, 0x1F, - 0x81, 0x00, 0xE0, 0x0C, 0x03, 0x07, 0xC1, 0xC0, 0x1C, 0x01, 0x80, 0x18, - 0x01, 0x80, 0x00, 0x1E, 0x0F, 0xE3, 0x86, 0x60, 0x6C, 0x0F, 0xFF, 0xFF, - 0xFE, 0x01, 0xC0, 0x18, 0x03, 0x80, 0x3F, 0xC3, 0xF8, 0x01, 0xC0, 0x70, - 0x0C, 0x03, 0x00, 0x00, 0x1E, 0x0F, 0xE3, 0x86, 0x60, 0x6C, 0x0F, 0xFF, - 0xFF, 0xFE, 0x01, 0xC0, 0x18, 0x03, 0x80, 0x3F, 0xC3, 0xF8, 0x0E, 0x01, - 0xE0, 0x66, 0x18, 0x60, 0x00, 0x1E, 0x0F, 0xE3, 0x86, 0x60, 0x6C, 0x0F, - 0xFF, 0xFF, 0xFE, 0x01, 0xC0, 0x18, 0x03, 0x80, 0x3F, 0xC3, 0xF8, 0x19, - 0x87, 0x30, 0x00, 0x00, 0x00, 0xF0, 0x7F, 0x1C, 0x33, 0x03, 0x60, 0x7F, - 0xFF, 0xFF, 0xF0, 0x0E, 0x00, 0xC0, 0x1C, 0x01, 0xFE, 0x1F, 0xC0, 0xE3, - 0x0C, 0x30, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0xC6, 0x31, 0x80, 0x3B, - 0x99, 0x80, 0x63, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0xC6, 0x00, 0x38, - 0x3C, 0x66, 0xC3, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, - 0x18, 0x18, 0x18, 0x18, 0x18, 0x67, 0xCC, 0x00, 0x01, 0x83, 0x06, 0x0C, - 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x08, 0x41, 0xFE, 0x07, - 0x80, 0xF8, 0x19, 0xC0, 0x0C, 0x00, 0x61, 0xFE, 0x3F, 0xF6, 0x07, 0x60, - 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0x60, 0x76, 0x06, 0x3F, 0xC1, 0xF8, 0x3C, - 0xCD, 0xF1, 0x0C, 0x00, 0x0C, 0xF1, 0xBF, 0xB8, 0x37, 0x07, 0xC0, 0x78, - 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x60, 0x1C, - 0x00, 0xC0, 0x06, 0x00, 0x30, 0x00, 0x00, 0xF0, 0x3F, 0xC7, 0x0E, 0x60, - 0x66, 0x03, 0xE0, 0x3C, 0x03, 0xC0, 0x3E, 0x03, 0x60, 0x77, 0x06, 0x3F, - 0xC1, 0xF8, 0x01, 0xC0, 0x38, 0x03, 0x00, 0x60, 0x00, 0x00, 0xF0, 0x3F, - 0xC7, 0x0E, 0x60, 0x66, 0x03, 0xE0, 0x3C, 0x03, 0xC0, 0x3E, 0x03, 0x60, - 0x77, 0x06, 0x3F, 0xC1, 0xF8, 0x0E, 0x00, 0xF0, 0x19, 0x83, 0x0C, 0x00, - 0x00, 0xF0, 0x3F, 0xC7, 0x0E, 0x60, 0x66, 0x03, 0xE0, 0x3C, 0x03, 0xC0, - 0x3E, 0x03, 0x60, 0x77, 0x06, 0x3F, 0xC1, 0xF8, 0x1E, 0x63, 0x7C, 0x21, - 0x80, 0x00, 0x0F, 0x03, 0xFC, 0x70, 0xE6, 0x06, 0x60, 0x3E, 0x03, 0xC0, - 0x3C, 0x03, 0xE0, 0x36, 0x07, 0x70, 0x63, 0xFC, 0x1F, 0x80, 0x19, 0x83, - 0x98, 0x00, 0x00, 0x00, 0x0F, 0x03, 0xFC, 0x70, 0xE6, 0x06, 0x60, 0x3E, - 0x03, 0xC0, 0x3C, 0x03, 0xE0, 0x36, 0x07, 0x70, 0x63, 0xFC, 0x1F, 0x80, - 0x04, 0x01, 0xC0, 0x18, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xF8, 0x00, 0x04, - 0x01, 0xC0, 0x18, 0x00, 0x0F, 0x33, 0xFE, 0x70, 0xE6, 0x1E, 0xE1, 0xBE, - 0x33, 0xC6, 0x3E, 0x63, 0xEC, 0x37, 0x87, 0x70, 0x63, 0xFC, 0x7F, 0x84, - 0x00, 0x38, 0x03, 0x00, 0x30, 0x03, 0x00, 0x01, 0x81, 0xF0, 0x3E, 0x07, - 0xC0, 0xF8, 0x1F, 0x03, 0xE0, 0x7C, 0x0F, 0x81, 0xF0, 0x3E, 0x07, 0x7F, - 0x6F, 0xCC, 0x03, 0x80, 0xE0, 0x18, 0x06, 0x00, 0x01, 0x81, 0xF0, 0x3E, - 0x07, 0xC0, 0xF8, 0x1F, 0x03, 0xE0, 0x7C, 0x0F, 0x81, 0xF0, 0x3E, 0x07, - 0x7F, 0x6F, 0xCC, 0x1C, 0x03, 0xC0, 0xCC, 0x30, 0xC0, 0x01, 0x81, 0xF0, - 0x3E, 0x07, 0xC0, 0xF8, 0x1F, 0x03, 0xE0, 0x7C, 0x0F, 0x81, 0xF0, 0x3E, - 0x07, 0x7F, 0x6F, 0xCC, 0x33, 0x0E, 0x60, 0x00, 0x00, 0x0C, 0x0F, 0x81, - 0xF0, 0x3E, 0x07, 0xC0, 0xF8, 0x1F, 0x03, 0xE0, 0x7C, 0x0F, 0x81, 0xF0, - 0x3B, 0xFB, 0x7E, 0x60, 0x01, 0xC0, 0x38, 0x03, 0x00, 0x60, 0x00, 0x0C, - 0x03, 0xE0, 0x76, 0x06, 0x60, 0x63, 0x0C, 0x30, 0xC3, 0x8C, 0x19, 0x81, - 0x98, 0x0D, 0x80, 0xF0, 0x0F, 0x00, 0x60, 0x06, 0x00, 0x60, 0x0C, 0x01, - 0xC0, 0xF8, 0x0E, 0x00, 0xC0, 0x18, 0x03, 0x00, 0x60, 0x0C, 0x01, 0x9E, - 0x37, 0xE7, 0x06, 0xE0, 0xF8, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, - 0x1F, 0x06, 0xFF, 0xDB, 0xF3, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, - 0x00, 0x19, 0x83, 0x98, 0x00, 0x00, 0x00, 0xC0, 0x3E, 0x07, 0x60, 0x66, - 0x06, 0x30, 0xC3, 0x0C, 0x38, 0xC1, 0x98, 0x19, 0x80, 0xD8, 0x0F, 0x00, - 0xF0, 0x06, 0x00, 0x60, 0x06, 0x00, 0xC0, 0x1C, 0x0F, 0x80, 0xE0, 0x00, - 0x0F, 0xE0, 0x1F, 0xC0, 0x00, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x50, 0x01, - 0xB0, 0x03, 0x60, 0x0E, 0x60, 0x18, 0xC0, 0x31, 0x80, 0xC1, 0x81, 0x83, - 0x03, 0xFE, 0x0F, 0xFE, 0x18, 0x0C, 0x70, 0x1C, 0xC0, 0x19, 0x80, 0x36, - 0x00, 0x30, 0x3F, 0x8F, 0xE0, 0x00, 0x7C, 0x7F, 0x88, 0x30, 0x0C, 0x03, - 0x03, 0xCF, 0xF6, 0x0F, 0x03, 0xC0, 0xF0, 0x77, 0x7D, 0xF9, 0x0C, 0x20, - 0x0F, 0xC0, 0x0E, 0x00, 0x00, 0x00, 0x38, 0x00, 0x70, 0x00, 0xA0, 0x03, - 0x60, 0x06, 0xC0, 0x1C, 0xC0, 0x31, 0x80, 0x63, 0x01, 0x83, 0x03, 0x06, - 0x07, 0xFC, 0x1F, 0xFC, 0x30, 0x18, 0xE0, 0x39, 0x80, 0x33, 0x00, 0x6C, - 0x00, 0x60, 0x30, 0x87, 0xE0, 0xE0, 0x00, 0x1F, 0x1F, 0xE2, 0x0C, 0x03, - 0x00, 0xC0, 0xF3, 0xFD, 0x83, 0xC0, 0xF0, 0x3C, 0x1D, 0xDF, 0x7E, 0x40, - 0x03, 0x80, 0x07, 0x00, 0x0A, 0x00, 0x36, 0x00, 0x6C, 0x01, 0xCC, 0x03, - 0x18, 0x06, 0x30, 0x18, 0x30, 0x30, 0x60, 0x7F, 0xC1, 0xFF, 0xC3, 0x01, - 0x8E, 0x03, 0x98, 0x03, 0x30, 0x06, 0xC0, 0x06, 0x00, 0x18, 0x00, 0x60, - 0x00, 0xC0, 0x01, 0x80, 0x03, 0xC0, 0x1F, 0x0F, 0xF0, 0x83, 0x00, 0x60, - 0x0C, 0x07, 0x8F, 0xF3, 0x06, 0xC0, 0xD8, 0x1B, 0x07, 0x3B, 0xE7, 0xE4, - 0x01, 0x80, 0x60, 0x0C, 0x01, 0x80, 0x3C, 0x00, 0x70, 0x07, 0x00, 0x30, - 0x03, 0x00, 0x00, 0x03, 0xF8, 0x7F, 0xE7, 0x81, 0x30, 0x03, 0x80, 0x18, - 0x00, 0xC0, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, - 0x1C, 0x00, 0x70, 0x01, 0xFF, 0x07, 0xF8, 0x03, 0x81, 0xC0, 0x60, 0x30, - 0x00, 0x03, 0xD3, 0xF9, 0xC2, 0x60, 0x18, 0x0E, 0x03, 0x00, 0xC0, 0x38, - 0x06, 0x01, 0xC0, 0x3F, 0x87, 0xE0, 0x03, 0x80, 0x1E, 0x01, 0x98, 0x18, - 0x60, 0x00, 0x03, 0xF8, 0x7F, 0xE7, 0x81, 0x30, 0x03, 0x80, 0x18, 0x00, - 0xC0, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x1C, - 0x00, 0x70, 0x01, 0xFF, 0x07, 0xF8, 0x0E, 0x03, 0xC1, 0x98, 0xC3, 0x00, - 0x03, 0xD3, 0xF9, 0xC2, 0x60, 0x18, 0x0E, 0x03, 0x00, 0xC0, 0x38, 0x06, - 0x01, 0xC0, 0x3F, 0x87, 0xE0, 0x01, 0x80, 0x0C, 0x00, 0x00, 0x00, 0x00, - 0x7F, 0x0F, 0xFC, 0xF0, 0x26, 0x00, 0x70, 0x03, 0x00, 0x18, 0x01, 0xC0, - 0x0E, 0x00, 0x70, 0x01, 0x80, 0x0C, 0x00, 0x60, 0x03, 0x80, 0x0E, 0x00, - 0x3F, 0xE0, 0xFF, 0x00, 0x06, 0x01, 0x80, 0x00, 0x00, 0x0F, 0x4F, 0xE7, - 0x09, 0x80, 0x60, 0x38, 0x0C, 0x03, 0x00, 0xE0, 0x18, 0x07, 0x00, 0xFE, - 0x1F, 0x80, 0x0C, 0x30, 0x33, 0x00, 0xF0, 0x03, 0x00, 0x00, 0x03, 0xF8, - 0x7F, 0xE7, 0x81, 0x30, 0x03, 0x80, 0x18, 0x00, 0xC0, 0x0E, 0x00, 0x70, - 0x03, 0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x1C, 0x00, 0x70, 0x01, 0xFF, - 0x07, 0xF8, 0x30, 0xC6, 0x60, 0xF0, 0x18, 0x00, 0x03, 0xD3, 0xF9, 0xC2, - 0x60, 0x18, 0x0E, 0x03, 0x00, 0xC0, 0x38, 0x06, 0x01, 0xC0, 0x3F, 0x87, - 0xE0, 0x18, 0x60, 0x33, 0x00, 0x78, 0x00, 0xC0, 0x00, 0x03, 0xFC, 0x0F, - 0xFC, 0x30, 0x3C, 0xC0, 0x33, 0x00, 0x6C, 0x01, 0xB0, 0x07, 0xC0, 0x1F, - 0x00, 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x1B, 0x00, 0x6C, 0x03, 0x30, 0x3C, - 0xFF, 0xE3, 0xFC, 0x00, 0x00, 0x66, 0x00, 0xCC, 0x01, 0x90, 0x03, 0x60, - 0x06, 0x01, 0xCC, 0x0F, 0xF8, 0x38, 0x70, 0x60, 0x61, 0xC0, 0xC3, 0x81, - 0x86, 0x03, 0x0C, 0x06, 0x1C, 0x0C, 0x18, 0x18, 0x30, 0x30, 0x3F, 0xA0, - 0x3E, 0x40, 0x7F, 0x80, 0xFF, 0xC1, 0xC1, 0xE3, 0x80, 0xC7, 0x00, 0xCE, - 0x01, 0x9C, 0x03, 0xB8, 0x07, 0xFF, 0x0F, 0xFE, 0x1D, 0xC0, 0x3B, 0x80, - 0x67, 0x00, 0xCE, 0x03, 0x1C, 0x1E, 0x3F, 0xF8, 0x7F, 0x80, 0x00, 0x60, - 0x03, 0x03, 0xFE, 0x1F, 0xF0, 0x06, 0x07, 0x30, 0xFF, 0x8E, 0x1C, 0x60, - 0x67, 0x03, 0x38, 0x19, 0x80, 0xCC, 0x06, 0x70, 0x31, 0x81, 0x8C, 0x0C, - 0x3F, 0xE0, 0xF9, 0x00, 0x3F, 0x8F, 0xE0, 0x03, 0xFF, 0xFF, 0xF0, 0x0C, - 0x03, 0x00, 0xC0, 0x30, 0x0F, 0xFB, 0xFE, 0xC0, 0x30, 0x0C, 0x03, 0x00, - 0xC0, 0x30, 0x0F, 0xFF, 0xFF, 0x3F, 0x87, 0xF0, 0x00, 0x07, 0x83, 0xF8, - 0xE1, 0x98, 0x1B, 0x03, 0xFF, 0xFF, 0xFF, 0x80, 0x70, 0x06, 0x00, 0xE0, - 0x0F, 0xF0, 0xFE, 0x30, 0x87, 0xE0, 0xE0, 0x00, 0xFF, 0xFF, 0xFC, 0x03, - 0x00, 0xC0, 0x30, 0x0C, 0x03, 0xFE, 0xFF, 0xB0, 0x0C, 0x03, 0x00, 0xC0, - 0x30, 0x0C, 0x03, 0xFF, 0xFF, 0xC0, 0x30, 0x83, 0xF0, 0x38, 0x00, 0x00, - 0xF0, 0x7F, 0x1C, 0x33, 0x03, 0x60, 0x7F, 0xFF, 0xFF, 0xF0, 0x0E, 0x00, - 0xC0, 0x1C, 0x01, 0xFE, 0x1F, 0xC0, 0x0C, 0x03, 0x00, 0x00, 0x00, 0xFF, - 0xFF, 0xFC, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0xFE, 0xFF, 0xB0, 0x0C, - 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0xFF, 0xFF, 0xC0, 0x06, 0x00, 0xC0, - 0x00, 0x00, 0x00, 0xF0, 0x7F, 0x1C, 0x33, 0x03, 0x60, 0x7F, 0xFF, 0xFF, - 0xF0, 0x0E, 0x00, 0xC0, 0x1C, 0x01, 0xFE, 0x1F, 0xC0, 0xFF, 0xFF, 0xFC, - 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0xFE, 0xFF, 0xB0, 0x0C, 0x03, 0x00, - 0xC0, 0x30, 0x0C, 0x03, 0xFF, 0xFF, 0xC0, 0x60, 0x30, 0x0C, 0x03, 0x00, - 0xF0, 0x0F, 0x07, 0xF1, 0xC3, 0x30, 0x36, 0x07, 0xFF, 0xFF, 0xFF, 0x00, - 0xE0, 0x0C, 0x01, 0xC0, 0x1F, 0xE1, 0xFC, 0x01, 0x00, 0x40, 0x18, 0x03, - 0x00, 0x38, 0x61, 0x8C, 0xC1, 0xE0, 0x30, 0x00, 0x3F, 0xFF, 0xFF, 0x00, - 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xFF, 0xBF, 0xEC, 0x03, 0x00, 0xC0, 0x30, - 0x0C, 0x03, 0x00, 0xFF, 0xFF, 0xF0, 0x30, 0xC3, 0x30, 0x3C, 0x03, 0x00, - 0x00, 0x1E, 0x0F, 0xE3, 0x86, 0x60, 0x6C, 0x0F, 0xFF, 0xFF, 0xFE, 0x01, - 0xC0, 0x18, 0x03, 0x80, 0x3F, 0xC3, 0xF8, 0x01, 0xC0, 0x07, 0x80, 0x33, - 0x01, 0x86, 0x00, 0x00, 0x0F, 0xE0, 0xFF, 0xC7, 0x01, 0x30, 0x01, 0xC0, - 0x06, 0x00, 0x18, 0x00, 0xE0, 0x03, 0x81, 0xFE, 0x07, 0xD8, 0x03, 0x60, - 0x0D, 0x80, 0x33, 0x00, 0xCE, 0x03, 0x1F, 0xFC, 0x1F, 0xF0, 0x0E, 0x01, - 0xE0, 0x66, 0x18, 0x60, 0x00, 0x1C, 0x4F, 0xEB, 0x87, 0x60, 0x6C, 0x0F, - 0x81, 0xE0, 0x3C, 0x07, 0xC0, 0xD8, 0x1B, 0x03, 0x3F, 0xE3, 0xEC, 0x01, - 0x80, 0x30, 0x06, 0xC1, 0xDF, 0xF0, 0x70, 0x06, 0x10, 0x0F, 0xC0, 0x1C, - 0x00, 0x00, 0x03, 0xF8, 0x3F, 0xF1, 0xC0, 0x4C, 0x00, 0x70, 0x01, 0x80, - 0x06, 0x00, 0x38, 0x00, 0xE0, 0x7F, 0x81, 0xF6, 0x00, 0xD8, 0x03, 0x60, - 0x0C, 0xC0, 0x33, 0x80, 0xC7, 0xFF, 0x07, 0xFC, 0x30, 0x83, 0xF0, 0x38, - 0x00, 0x00, 0xE2, 0x7F, 0x5C, 0x3B, 0x03, 0x60, 0x7C, 0x0F, 0x01, 0xE0, - 0x3E, 0x06, 0xC0, 0xD8, 0x19, 0xFF, 0x1F, 0x60, 0x0C, 0x01, 0x80, 0x36, - 0x0E, 0xFF, 0x83, 0x80, 0x01, 0x80, 0x06, 0x00, 0x00, 0x00, 0x00, 0x03, - 0xF8, 0x3F, 0xF1, 0xC0, 0x4C, 0x00, 0x70, 0x01, 0x80, 0x06, 0x00, 0x38, - 0x00, 0xE0, 0x7F, 0x81, 0xF6, 0x00, 0xD8, 0x03, 0x60, 0x0C, 0xC0, 0x33, - 0x80, 0xC7, 0xFF, 0x07, 0xFC, 0x06, 0x00, 0xC0, 0x00, 0x00, 0x00, 0xE2, - 0x7F, 0x5C, 0x3B, 0x03, 0x60, 0x7C, 0x0F, 0x01, 0xE0, 0x3E, 0x06, 0xC0, - 0xD8, 0x19, 0xFF, 0x1F, 0x60, 0x0C, 0x01, 0x80, 0x36, 0x0E, 0xFF, 0x83, - 0x80, 0x03, 0xF8, 0x3F, 0xF1, 0xC0, 0x4C, 0x00, 0x70, 0x01, 0x80, 0x06, - 0x00, 0x38, 0x00, 0xE0, 0x7F, 0x81, 0xF6, 0x00, 0xD8, 0x03, 0x60, 0x0C, - 0xC0, 0x33, 0x80, 0xC7, 0xFF, 0x07, 0xFC, 0x00, 0x00, 0x1C, 0x00, 0x60, - 0x01, 0x80, 0x0C, 0x00, 0x03, 0x00, 0xC0, 0x18, 0x07, 0x00, 0x00, 0x1C, - 0x4F, 0xEB, 0x87, 0x60, 0x6C, 0x0F, 0x81, 0xE0, 0x3C, 0x07, 0xC0, 0xD8, - 0x1B, 0x03, 0x3F, 0xE3, 0xEC, 0x01, 0x80, 0x30, 0x06, 0xC1, 0xDF, 0xF0, - 0x70, 0x07, 0x00, 0x3C, 0x03, 0x30, 0x30, 0xC0, 0x00, 0x60, 0x0F, 0x00, - 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3F, 0xFF, 0xFF, 0xFF, - 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, - 0x0C, 0x38, 0x00, 0xF0, 0x06, 0x60, 0x30, 0xC0, 0x00, 0x00, 0x60, 0x01, - 0x80, 0x06, 0x00, 0x18, 0x00, 0x60, 0x01, 0x9E, 0x06, 0xFE, 0x1C, 0x18, - 0x70, 0x71, 0x80, 0xC6, 0x03, 0x18, 0x0C, 0x60, 0x31, 0x80, 0xC6, 0x03, - 0x18, 0x0C, 0x60, 0x31, 0x80, 0xC0, 0x30, 0x06, 0x18, 0x03, 0x0C, 0x01, - 0x9F, 0xFF, 0xFF, 0xFF, 0xF9, 0x80, 0x30, 0xC0, 0x18, 0x7F, 0xFC, 0x3F, - 0xFE, 0x18, 0x03, 0x0C, 0x01, 0x86, 0x00, 0xC3, 0x00, 0x61, 0x80, 0x30, - 0xC0, 0x18, 0x60, 0x0C, 0x30, 0x06, 0x00, 0x30, 0x01, 0x80, 0x3F, 0xE1, - 0xFF, 0x03, 0x00, 0x18, 0x00, 0xDF, 0x87, 0x8E, 0x38, 0x31, 0x81, 0xCC, - 0x06, 0x60, 0x33, 0x01, 0x98, 0x0C, 0xC0, 0x66, 0x03, 0x30, 0x19, 0x80, - 0xC0, 0x79, 0xEF, 0xA1, 0x80, 0x07, 0xE3, 0xF0, 0x60, 0x30, 0x18, 0x0C, - 0x06, 0x03, 0x01, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x07, 0x87, - 0xE0, 0x79, 0xEF, 0xA1, 0x80, 0x01, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0C, - 0x06, 0x03, 0x01, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x00, 0xFF, 0xFC, 0x07, - 0xEF, 0xC6, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30, - 0x61, 0xE7, 0xE0, 0xFF, 0xFC, 0x01, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x60, - 0xC1, 0x83, 0x06, 0x0C, 0x18, 0xC2, 0xFC, 0xE0, 0x07, 0xEF, 0xC6, 0x0C, - 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x61, 0xE7, 0xE0, - 0xC2, 0xFC, 0xE0, 0x01, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, - 0x06, 0x0C, 0x18, 0xFF, 0xF3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, - 0x30, 0xC3, 0x1E, 0xFC, 0x63, 0x0C, 0x30, 0xF0, 0x66, 0x00, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x66, 0xCC, 0xCF, 0x30, 0xC0, 0x00, 0xFF, 0xF3, - 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x1E, 0xFC, 0xFF, - 0xFF, 0xFF, 0xC0, 0xFC, 0x7F, 0x8C, 0xC1, 0x98, 0x33, 0x06, 0x60, 0xCC, - 0x19, 0x83, 0x30, 0x66, 0x0C, 0xC1, 0x98, 0x33, 0x06, 0x60, 0xCC, 0x1B, - 0xC3, 0xFC, 0x60, 0x0C, 0x01, 0x82, 0xF0, 0x7C, 0xC3, 0xC3, 0x00, 0x00, - 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, - 0xC3, 0x03, 0x03, 0x03, 0x07, 0x1E, 0x18, 0x1C, 0x0F, 0x0C, 0xCC, 0x30, - 0x00, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xC0, 0x60, 0x30, - 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xC0, 0x60, 0x30, 0x18, 0xBC, 0x7C, - 0x00, 0x38, 0x3C, 0x66, 0xC3, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, - 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x38, 0xF0, - 0xC0, 0xC0, 0x36, 0x03, 0x30, 0x31, 0x83, 0x0C, 0x30, 0x63, 0x83, 0x38, - 0x1B, 0x80, 0xFC, 0x07, 0xF0, 0x31, 0xC1, 0x87, 0x0C, 0x18, 0x60, 0xE3, - 0x03, 0x98, 0x0C, 0xC0, 0x38, 0x00, 0x01, 0xC0, 0x0C, 0x00, 0x60, 0x06, - 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x7C, 0x1B, 0x0C, 0xC6, - 0x33, 0x0D, 0x83, 0xE0, 0xEC, 0x33, 0x8C, 0x73, 0x0C, 0xC1, 0xB0, 0x70, - 0x00, 0x70, 0x18, 0x06, 0x03, 0x00, 0xC1, 0xF0, 0x6C, 0x33, 0x18, 0xCC, - 0x37, 0x0F, 0xC3, 0xF0, 0xC6, 0x31, 0xCC, 0x3B, 0x06, 0xC0, 0xC0, 0x38, - 0x1C, 0x06, 0x03, 0x00, 0x00, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, - 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, - 0xFF, 0xFF, 0xF0, 0x3B, 0x99, 0x80, 0x63, 0x18, 0xC6, 0x31, 0x8C, 0x63, - 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, - 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, - 0x03, 0xFF, 0xFF, 0xC0, 0x00, 0xE0, 0x30, 0x0C, 0x06, 0x00, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x07, 0x66, 0xC0, 0xC0, 0xF0, - 0x6C, 0x1B, 0x04, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, - 0x00, 0xC0, 0x30, 0x0C, 0x03, 0xFF, 0xFF, 0xC0, 0xCF, 0x3D, 0xB4, 0xC3, - 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x00, 0xC0, 0x30, - 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC3, 0x30, 0xCC, 0x03, - 0x00, 0xC0, 0x30, 0x0C, 0x03, 0xFF, 0xFF, 0xC0, 0xC6, 0x31, 0x8C, 0x63, - 0x18, 0xDE, 0xF1, 0x8C, 0x63, 0x18, 0xC6, 0x00, 0x30, 0x03, 0x00, 0x30, - 0x03, 0x00, 0x30, 0x03, 0x00, 0x31, 0x03, 0x70, 0x3E, 0x03, 0x80, 0xF0, - 0x07, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0xFF, 0x3F, 0xF0, 0x30, 0xC3, - 0x0C, 0x30, 0xC3, 0x0D, 0x3C, 0xEF, 0x3C, 0x30, 0xC3, 0x0C, 0x30, 0xC0, - 0x00, 0xE0, 0x07, 0x00, 0x18, 0x00, 0xC0, 0x00, 0x03, 0x80, 0x3F, 0x00, - 0xFC, 0x03, 0xF8, 0x0F, 0x60, 0x3C, 0xC0, 0xF3, 0x83, 0xC6, 0x0F, 0x0C, - 0x3C, 0x38, 0xF0, 0x63, 0xC0, 0xCF, 0x03, 0xBC, 0x06, 0xF0, 0x1F, 0xC0, - 0x3F, 0x00, 0x70, 0x03, 0x80, 0xE0, 0x18, 0x06, 0x00, 0x01, 0x9E, 0x37, - 0xF7, 0x06, 0xE0, 0xF8, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, - 0x03, 0xC0, 0x78, 0x0C, 0xE0, 0x0F, 0xC0, 0x3F, 0x00, 0xFE, 0x03, 0xD8, - 0x0F, 0x30, 0x3C, 0xE0, 0xF1, 0x83, 0xC3, 0x0F, 0x0E, 0x3C, 0x18, 0xF0, - 0x33, 0xC0, 0xEF, 0x01, 0xBC, 0x07, 0xF0, 0x0F, 0xC0, 0x1C, 0x00, 0x00, - 0x38, 0x00, 0xC0, 0x03, 0x00, 0x18, 0x00, 0xCF, 0x1B, 0xFB, 0x83, 0x70, - 0x7C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, - 0x06, 0x00, 0x03, 0x80, 0x60, 0x0C, 0x03, 0x00, 0x18, 0x60, 0x33, 0x00, - 0x78, 0x00, 0xC0, 0x00, 0x03, 0x80, 0x3F, 0x00, 0xFC, 0x03, 0xF8, 0x0F, - 0x60, 0x3C, 0xC0, 0xF3, 0x83, 0xC6, 0x0F, 0x0C, 0x3C, 0x38, 0xF0, 0x63, - 0xC0, 0xCF, 0x03, 0xBC, 0x06, 0xF0, 0x1F, 0xC0, 0x3F, 0x00, 0x70, 0x61, - 0x86, 0x60, 0x78, 0x06, 0x00, 0x01, 0x9E, 0x37, 0xF7, 0x06, 0xE0, 0xF8, - 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0C, - 0x70, 0x00, 0xE0, 0x01, 0x80, 0x03, 0x00, 0x04, 0xCF, 0x19, 0xBF, 0x83, - 0x83, 0x07, 0x07, 0x0C, 0x06, 0x18, 0x0C, 0x30, 0x18, 0x60, 0x30, 0xC0, - 0x61, 0x80, 0xC3, 0x01, 0x86, 0x03, 0x0C, 0x06, 0xE0, 0x0F, 0xC0, 0x3F, - 0x00, 0xFE, 0x03, 0xDC, 0x0F, 0x30, 0x3C, 0xE0, 0xF1, 0xC3, 0xC3, 0x0F, - 0x06, 0x3C, 0x1C, 0xF0, 0x33, 0xC0, 0x6F, 0x01, 0xFC, 0x03, 0xF0, 0x07, - 0xC0, 0x1C, 0x00, 0x30, 0x01, 0x80, 0x4E, 0x01, 0xF0, 0xCF, 0x1B, 0xFB, - 0x83, 0x70, 0x7C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, - 0xE0, 0x3C, 0x06, 0x00, 0xC0, 0x18, 0x03, 0x00, 0xC0, 0x78, 0x0C, 0x00, - 0x07, 0xF0, 0x07, 0xF0, 0x00, 0x00, 0x07, 0xE0, 0x1F, 0xF8, 0x38, 0x1C, - 0x30, 0x0E, 0x60, 0x06, 0x60, 0x07, 0x60, 0x07, 0xE0, 0x03, 0xE0, 0x03, - 0xE0, 0x03, 0x60, 0x03, 0x60, 0x07, 0x60, 0x06, 0x70, 0x0E, 0x38, 0x1C, - 0x1F, 0xF8, 0x0F, 0xF0, 0x1F, 0xC1, 0xFC, 0x00, 0x00, 0xF0, 0x3F, 0xC7, - 0x0E, 0x60, 0x66, 0x03, 0xE0, 0x3C, 0x03, 0xC0, 0x3E, 0x03, 0x60, 0x77, - 0x06, 0x3F, 0xC1, 0xF8, 0x06, 0x10, 0x03, 0xF0, 0x01, 0xC0, 0x00, 0x00, - 0x07, 0xE0, 0x1F, 0xF8, 0x38, 0x1C, 0x30, 0x0E, 0x60, 0x06, 0x60, 0x07, - 0x60, 0x07, 0xE0, 0x03, 0xE0, 0x03, 0xE0, 0x03, 0x60, 0x03, 0x60, 0x07, - 0x60, 0x06, 0x70, 0x0E, 0x38, 0x1C, 0x1F, 0xF8, 0x0F, 0xF0, 0x18, 0x40, - 0xFC, 0x07, 0x00, 0x00, 0x0F, 0x03, 0xFC, 0x70, 0xE6, 0x06, 0x60, 0x3E, - 0x03, 0xC0, 0x3C, 0x03, 0xE0, 0x36, 0x07, 0x70, 0x63, 0xFC, 0x1F, 0x80, - 0x03, 0x30, 0x06, 0x60, 0x04, 0x60, 0x08, 0xC0, 0x00, 0x00, 0x07, 0xE0, - 0x1F, 0xF8, 0x38, 0x1C, 0x30, 0x0E, 0x60, 0x06, 0x60, 0x07, 0x60, 0x07, - 0xE0, 0x03, 0xE0, 0x03, 0xE0, 0x03, 0x60, 0x03, 0x60, 0x07, 0x60, 0x06, - 0x70, 0x0E, 0x38, 0x1C, 0x1F, 0xF8, 0x0F, 0xF0, 0x0C, 0xC1, 0x98, 0x11, - 0x82, 0x30, 0x00, 0x00, 0xF0, 0x3F, 0xC7, 0x0E, 0x60, 0x66, 0x03, 0xE0, - 0x3C, 0x03, 0xC0, 0x3E, 0x03, 0x60, 0x77, 0x06, 0x3F, 0xC1, 0xF8, 0x07, - 0xFF, 0xE3, 0xFF, 0xFC, 0xE0, 0x60, 0x18, 0x0C, 0x06, 0x01, 0x80, 0xC0, - 0x30, 0x18, 0x06, 0x07, 0x00, 0xFF, 0xE0, 0x1F, 0xFC, 0x03, 0x01, 0x80, - 0x60, 0x30, 0x0C, 0x06, 0x01, 0x80, 0xE0, 0x30, 0x0E, 0x06, 0x00, 0xFF, - 0xFF, 0x0F, 0xFF, 0xE0, 0x0F, 0x07, 0x83, 0xFC, 0xFC, 0x70, 0xD8, 0x66, - 0x07, 0x07, 0xE0, 0x70, 0x3E, 0x07, 0xFF, 0xC0, 0x7F, 0xFC, 0x07, 0x00, - 0xE0, 0x70, 0x06, 0x07, 0x00, 0x60, 0xF8, 0x03, 0xFD, 0xFE, 0x1F, 0x8F, - 0xE0, 0x03, 0x80, 0x70, 0x06, 0x00, 0xC0, 0x00, 0x0F, 0xF0, 0xFF, 0xCC, - 0x1C, 0xC0, 0xEC, 0x06, 0xC0, 0x6C, 0x06, 0xC0, 0xCF, 0xF8, 0xFF, 0x0C, - 0x30, 0xC1, 0x8C, 0x1C, 0xC0, 0xCC, 0x0E, 0xC0, 0x6C, 0x07, 0x0E, 0x38, - 0x61, 0x80, 0x19, 0xF7, 0xF8, 0xE1, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x60, - 0xC1, 0x80, 0xFF, 0x0F, 0xFC, 0xC1, 0xCC, 0x0E, 0xC0, 0x6C, 0x06, 0xC0, - 0x6C, 0x0C, 0xFF, 0x8F, 0xF0, 0xC3, 0x0C, 0x18, 0xC1, 0xCC, 0x0C, 0xC0, - 0xEC, 0x06, 0xC0, 0x70, 0x00, 0x07, 0x00, 0x60, 0x06, 0x00, 0xC0, 0x67, - 0x6F, 0x78, 0x70, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x00, 0x70, 0x60, 0x60, 0xC0, 0x61, 0x83, 0x30, 0x1E, 0x00, 0xC0, 0x00, - 0x0F, 0xF0, 0xFF, 0xCC, 0x1C, 0xC0, 0xEC, 0x06, 0xC0, 0x6C, 0x06, 0xC0, - 0xCF, 0xF8, 0xFF, 0x0C, 0x30, 0xC1, 0x8C, 0x1C, 0xC0, 0xCC, 0x0E, 0xC0, - 0x6C, 0x07, 0xC3, 0x66, 0x3C, 0x18, 0x00, 0xCE, 0xDE, 0xF0, 0xE0, 0xC0, - 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x01, 0xC0, 0x70, 0x0C, - 0x03, 0x00, 0x00, 0x3F, 0x1F, 0xF3, 0x02, 0xE0, 0x1C, 0x01, 0x80, 0x38, - 0x03, 0xC0, 0x3E, 0x01, 0xF0, 0x0E, 0x00, 0xE0, 0x0C, 0x01, 0xC0, 0x6F, - 0xFD, 0xFE, 0x00, 0x07, 0x07, 0x03, 0x03, 0x00, 0x00, 0xF1, 0xFF, 0xC1, - 0xC0, 0x70, 0x1E, 0x07, 0xC0, 0x70, 0x0C, 0x06, 0x03, 0xF7, 0xFF, 0x00, - 0x0E, 0x01, 0xE0, 0x66, 0x18, 0x60, 0x00, 0x3F, 0x1F, 0xF3, 0x02, 0xE0, - 0x1C, 0x01, 0x80, 0x38, 0x03, 0xC0, 0x3E, 0x01, 0xF0, 0x0E, 0x00, 0xE0, - 0x0C, 0x01, 0xC0, 0x6F, 0xFD, 0xFE, 0x00, 0x1C, 0x0F, 0x0C, 0xCC, 0x30, - 0x00, 0xF1, 0xFF, 0xC1, 0xC0, 0x70, 0x1E, 0x07, 0xC0, 0x70, 0x0C, 0x06, - 0x03, 0xF7, 0xFF, 0x00, 0x1F, 0x8F, 0xF9, 0x81, 0x70, 0x0E, 0x00, 0xC0, - 0x1C, 0x01, 0xE0, 0x1F, 0x00, 0xF8, 0x07, 0x00, 0x70, 0x06, 0x00, 0xE0, - 0x37, 0xFE, 0xFF, 0x01, 0x00, 0x70, 0x03, 0x00, 0x60, 0x7C, 0x0E, 0x00, - 0x1E, 0x3F, 0xF8, 0x38, 0x0E, 0x03, 0xC0, 0xF8, 0x0E, 0x01, 0x80, 0xC0, - 0x7E, 0xFF, 0xE0, 0x40, 0x70, 0x0C, 0x06, 0x1F, 0x0E, 0x00, 0x30, 0xC3, - 0x30, 0x3C, 0x03, 0x00, 0x00, 0x3F, 0x1F, 0xF3, 0x02, 0xE0, 0x1C, 0x01, - 0x80, 0x38, 0x03, 0xC0, 0x3E, 0x01, 0xF0, 0x0E, 0x00, 0xE0, 0x0C, 0x01, - 0xC0, 0x6F, 0xFD, 0xFE, 0x00, 0x61, 0x99, 0x87, 0x81, 0x80, 0x00, 0xF1, - 0xFF, 0xC1, 0xC0, 0x70, 0x1E, 0x07, 0xC0, 0x70, 0x0C, 0x06, 0x03, 0xF7, - 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xC1, 0xC0, 0x0E, 0x00, 0x70, 0x03, 0x80, - 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x38, 0x01, 0xC0, 0x0E, 0x00, 0x70, 0x03, - 0x80, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x10, 0x01, 0xC0, 0x03, 0x00, 0x18, - 0x07, 0xC0, 0x38, 0x00, 0x10, 0x30, 0x7F, 0xFF, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x1D, 0x1F, 0x08, 0x1C, 0x06, 0x06, 0x3E, - 0x38, 0x18, 0x60, 0x66, 0x01, 0xE0, 0x06, 0x00, 0x00, 0x7F, 0xFF, 0xFF, - 0xE0, 0xE0, 0x07, 0x00, 0x38, 0x01, 0xC0, 0x0E, 0x00, 0x70, 0x03, 0x80, - 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x38, 0x01, 0xC0, 0x0E, 0x00, 0x70, 0x03, - 0x80, 0x00, 0x60, 0x0C, 0x01, 0x08, 0x63, 0x00, 0xFE, 0x3F, 0xC1, 0x80, - 0x30, 0x06, 0x00, 0xC0, 0x18, 0x03, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x1D, - 0x03, 0xE0, 0xFF, 0xFF, 0xFF, 0xC1, 0xC0, 0x0E, 0x00, 0x70, 0x03, 0x80, - 0x1C, 0x00, 0xE0, 0x3F, 0xE0, 0x38, 0x01, 0xC0, 0x0E, 0x00, 0x70, 0x03, - 0x80, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x10, 0x30, 0x7F, 0xFF, 0x30, 0x30, - 0x30, 0x7F, 0x30, 0x30, 0x30, 0x30, 0x30, 0x1D, 0x1F, 0x1E, 0x61, 0xBE, - 0x08, 0x60, 0x00, 0x0C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, - 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, - 0x1F, 0x01, 0xDC, 0x0C, 0x7F, 0xC1, 0xFC, 0x00, 0x3C, 0xCD, 0xF1, 0x0C, - 0x00, 0x0C, 0x0F, 0x81, 0xF0, 0x3E, 0x07, 0xC0, 0xF8, 0x1F, 0x03, 0xE0, - 0x7C, 0x0F, 0x81, 0xF0, 0x3B, 0xFB, 0x7E, 0x60, 0x1F, 0xC0, 0xFE, 0x00, - 0x01, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, - 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xE0, 0x3B, - 0x81, 0x8F, 0xF8, 0x3F, 0x80, 0x3F, 0x87, 0xF0, 0x00, 0x60, 0x7C, 0x0F, - 0x81, 0xF0, 0x3E, 0x07, 0xC0, 0xF8, 0x1F, 0x03, 0xE0, 0x7C, 0x0F, 0x81, - 0xDF, 0xDB, 0xF3, 0x18, 0x40, 0x7E, 0x01, 0xC0, 0x00, 0x0C, 0x01, 0xE0, - 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, - 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1F, 0x01, 0xDC, 0x0C, 0x7F, 0xC1, - 0xFC, 0x00, 0x30, 0x83, 0xF0, 0x38, 0x00, 0x0C, 0x0F, 0x81, 0xF0, 0x3E, - 0x07, 0xC0, 0xF8, 0x1F, 0x03, 0xE0, 0x7C, 0x0F, 0x81, 0xF0, 0x3B, 0xFB, - 0x7E, 0x60, 0x07, 0x00, 0x44, 0x02, 0x20, 0x1B, 0x00, 0x70, 0x00, 0x03, - 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, - 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0xC0, 0x77, 0x03, - 0x1F, 0xF0, 0x7F, 0x00, 0x0E, 0x02, 0x20, 0x44, 0x0D, 0x80, 0xE0, 0x00, - 0x30, 0x3E, 0x07, 0xC0, 0xF8, 0x1F, 0x03, 0xE0, 0x7C, 0x0F, 0x81, 0xF0, - 0x3E, 0x07, 0xC0, 0xEF, 0xED, 0xF9, 0x80, 0x0C, 0xC0, 0xCC, 0x04, 0x60, - 0x46, 0x00, 0x00, 0x60, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, - 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, - 0xF8, 0x0E, 0xE0, 0x63, 0xFE, 0x0F, 0xE0, 0x19, 0x86, 0x60, 0x8C, 0x23, - 0x00, 0x01, 0x81, 0xF0, 0x3E, 0x07, 0xC0, 0xF8, 0x1F, 0x03, 0xE0, 0x7C, - 0x0F, 0x81, 0xF0, 0x3E, 0x07, 0x7F, 0x6F, 0xCC, 0xC0, 0x1E, 0x00, 0xF0, - 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, - 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xF0, 0x1D, 0xC0, 0xC7, 0xFC, 0x1F, 0xC0, - 0x06, 0x00, 0x20, 0x03, 0x00, 0x18, 0x00, 0x70, 0xC0, 0xF8, 0x1F, 0x03, - 0xE0, 0x7C, 0x0F, 0x81, 0xF0, 0x3E, 0x07, 0xC0, 0xF8, 0x1F, 0x03, 0xBF, - 0xB7, 0xE6, 0x01, 0x80, 0x60, 0x0C, 0x01, 0x80, 0x3C, 0x00, 0x70, 0x00, - 0x01, 0xE0, 0x00, 0x0C, 0xC0, 0x00, 0x61, 0x80, 0x00, 0x00, 0x03, 0x80, - 0xC0, 0x76, 0x07, 0x01, 0x98, 0x1E, 0x06, 0x60, 0x78, 0x39, 0xC3, 0x60, - 0xC3, 0x0C, 0xC3, 0x0C, 0x33, 0x0C, 0x30, 0xCC, 0x70, 0xE6, 0x31, 0x81, - 0x98, 0x66, 0x06, 0x61, 0x98, 0x1B, 0x06, 0xE0, 0x3C, 0x0F, 0x00, 0xF0, - 0x3C, 0x03, 0xC0, 0xF0, 0x0E, 0x03, 0x80, 0x18, 0x06, 0x00, 0x01, 0xC0, - 0x00, 0x78, 0x00, 0x33, 0x00, 0x18, 0x60, 0x00, 0x00, 0x30, 0x30, 0x36, - 0x0E, 0x0D, 0x87, 0x83, 0x61, 0xE1, 0x98, 0x6C, 0x63, 0x13, 0x18, 0xCC, - 0xCE, 0x33, 0x1B, 0x0C, 0xC6, 0xC1, 0xE1, 0xB0, 0x78, 0x28, 0x1E, 0x0E, - 0x03, 0x03, 0x80, 0x07, 0x00, 0x3C, 0x03, 0x30, 0x30, 0xC0, 0x00, 0x60, - 0x0D, 0x80, 0xEE, 0x06, 0x30, 0x71, 0xC3, 0x06, 0x30, 0x39, 0x80, 0xD8, - 0x07, 0xC0, 0x1C, 0x00, 0x60, 0x03, 0x00, 0x18, 0x00, 0xC0, 0x06, 0x00, - 0x30, 0x01, 0x80, 0x0E, 0x00, 0xF0, 0x19, 0x83, 0x0C, 0x00, 0x0C, 0x03, - 0xE0, 0x76, 0x06, 0x60, 0x63, 0x0C, 0x30, 0xC3, 0x8C, 0x19, 0x81, 0x98, - 0x0D, 0x80, 0xF0, 0x0F, 0x00, 0x60, 0x06, 0x00, 0x60, 0x0C, 0x01, 0xC0, - 0xF8, 0x0E, 0x00, 0x0C, 0xC0, 0xE6, 0x00, 0x00, 0x00, 0x0C, 0x01, 0xB0, - 0x1D, 0xC0, 0xC6, 0x0E, 0x38, 0x60, 0xC6, 0x07, 0x30, 0x1B, 0x00, 0xF8, - 0x03, 0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x18, 0x00, 0xC0, 0x06, 0x00, - 0x30, 0x00, 0x01, 0xC0, 0x38, 0x03, 0x00, 0x60, 0x00, 0x0F, 0xFE, 0xFF, - 0xE0, 0x0E, 0x00, 0xC0, 0x1C, 0x03, 0x80, 0x30, 0x07, 0x00, 0xE0, 0x0C, - 0x01, 0xC0, 0x38, 0x03, 0x00, 0x70, 0x0E, 0x00, 0xFF, 0xFF, 0xFF, 0x07, - 0x07, 0x03, 0x03, 0x00, 0x07, 0xFF, 0xFE, 0x07, 0x03, 0x03, 0x03, 0x01, - 0x81, 0x81, 0x81, 0xC0, 0xC0, 0xFF, 0xFF, 0xC0, 0x06, 0x00, 0x60, 0x00, - 0x00, 0x00, 0xFF, 0xEF, 0xFE, 0x00, 0xE0, 0x0C, 0x01, 0xC0, 0x38, 0x03, - 0x00, 0x70, 0x0E, 0x00, 0xC0, 0x1C, 0x03, 0x80, 0x30, 0x07, 0x00, 0xE0, - 0x0F, 0xFF, 0xFF, 0xF0, 0x18, 0x0C, 0x00, 0x00, 0x0F, 0xFF, 0xFC, 0x0E, - 0x06, 0x06, 0x06, 0x03, 0x03, 0x03, 0x03, 0x81, 0x81, 0xFF, 0xFF, 0x80, - 0x30, 0xC1, 0x98, 0x0F, 0x00, 0x60, 0x00, 0x0F, 0xFE, 0xFF, 0xE0, 0x0E, - 0x00, 0xC0, 0x1C, 0x03, 0x80, 0x30, 0x07, 0x00, 0xE0, 0x0C, 0x01, 0xC0, - 0x38, 0x03, 0x00, 0x70, 0x0E, 0x00, 0xFF, 0xFF, 0xFF, 0x61, 0x99, 0x87, - 0x81, 0x80, 0x07, 0xFF, 0xFE, 0x07, 0x03, 0x03, 0x03, 0x01, 0x81, 0x81, - 0x81, 0xC0, 0xC0, 0xFF, 0xFF, 0xC0, 0x3E, 0xFB, 0x86, 0x0C, 0x18, 0x30, - 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x80 }; - -const GFXglyph NotoSans12pt8bGlyphs[] PROGMEM = { - { 0, 1, 1, 6, 0, 0 }, // 0x20 ' ' - { 1, 3, 17, 6, 2, -16 }, // 0x21 '!' - { 8, 6, 6, 10, 2, -16 }, // 0x22 '"' - { 13, 14, 17, 15, 1, -16 }, // 0x23 '#' - { 43, 11, 19, 13, 1, -17 }, // 0x24 '$' - { 70, 17, 17, 20, 1, -16 }, // 0x25 '%' - { 107, 16, 17, 17, 1, -16 }, // 0x26 '&' - { 141, 2, 6, 5, 2, -16 }, // 0x27 ''' - { 143, 5, 21, 7, 1, -16 }, // 0x28 '(' - { 157, 5, 21, 7, 1, -16 }, // 0x29 ')' - { 171, 11, 11, 13, 1, -17 }, // 0x2A '*' - { 187, 11, 11, 13, 1, -13 }, // 0x2B '+' - { 203, 4, 6, 6, 1, -2 }, // 0x2C ',' - { 206, 6, 2, 8, 1, -6 }, // 0x2D '-' - { 208, 3, 3, 6, 2, -2 }, // 0x2E '.' - { 210, 9, 17, 9, 0, -16 }, // 0x2F '/' - { 230, 11, 17, 13, 1, -16 }, // 0x30 '0' - { 254, 6, 17, 13, 2, -16 }, // 0x31 '1' - { 267, 11, 17, 13, 1, -16 }, // 0x32 '2' - { 291, 11, 17, 13, 1, -16 }, // 0x33 '3' - { 315, 13, 17, 13, 0, -16 }, // 0x34 '4' - { 343, 11, 17, 13, 1, -16 }, // 0x35 '5' - { 367, 11, 17, 13, 1, -16 }, // 0x36 '6' - { 391, 11, 17, 13, 1, -16 }, // 0x37 '7' - { 415, 11, 17, 13, 1, -16 }, // 0x38 '8' - { 439, 11, 17, 13, 1, -16 }, // 0x39 '9' - { 463, 3, 13, 6, 2, -12 }, // 0x3A ':' - { 468, 4, 16, 6, 1, -12 }, // 0x3B ';' - { 476, 11, 11, 13, 1, -13 }, // 0x3C '<' - { 492, 11, 6, 13, 1, -10 }, // 0x3D '=' - { 501, 11, 11, 13, 1, -13 }, // 0x3E '>' - { 517, 10, 17, 10, 0, -16 }, // 0x3F '?' - { 539, 19, 19, 21, 1, -16 }, // 0x40 '@' - { 585, 15, 17, 15, 0, -16 }, // 0x41 'A' - { 617, 12, 17, 15, 2, -16 }, // 0x42 'B' - { 643, 13, 17, 15, 1, -16 }, // 0x43 'C' - { 671, 14, 17, 17, 2, -16 }, // 0x44 'D' - { 701, 10, 17, 13, 2, -16 }, // 0x45 'E' - { 723, 10, 17, 12, 2, -16 }, // 0x46 'F' - { 745, 14, 17, 17, 1, -16 }, // 0x47 'G' - { 775, 13, 17, 17, 2, -16 }, // 0x48 'H' - { 803, 6, 17, 8, 1, -16 }, // 0x49 'I' - { 816, 6, 21, 6, -2, -16 }, // 0x4A 'J' - { 832, 13, 17, 15, 2, -16 }, // 0x4B 'K' - { 860, 10, 17, 12, 2, -16 }, // 0x4C 'L' - { 882, 17, 17, 21, 2, -16 }, // 0x4D 'M' - { 919, 14, 17, 18, 2, -16 }, // 0x4E 'N' - { 949, 16, 17, 18, 1, -16 }, // 0x4F 'O' - { 983, 11, 17, 14, 2, -16 }, // 0x50 'P' - { 1007, 16, 21, 18, 1, -16 }, // 0x51 'Q' - { 1049, 12, 17, 15, 2, -16 }, // 0x52 'R' - { 1075, 11, 17, 13, 1, -16 }, // 0x53 'S' - { 1099, 13, 17, 13, 0, -16 }, // 0x54 'T' - { 1127, 13, 17, 17, 2, -16 }, // 0x55 'U' - { 1155, 14, 17, 14, 0, -16 }, // 0x56 'V' - { 1185, 22, 17, 22, 0, -16 }, // 0x57 'W' - { 1232, 14, 17, 14, 0, -16 }, // 0x58 'X' - { 1262, 13, 17, 13, 0, -16 }, // 0x59 'Y' - { 1290, 12, 17, 13, 1, -16 }, // 0x5A 'Z' - { 1316, 5, 21, 8, 2, -16 }, // 0x5B '[' - { 1330, 9, 17, 9, 0, -16 }, // 0x5C '\' - { 1350, 5, 21, 8, 1, -16 }, // 0x5D ']' - { 1364, 12, 11, 13, 1, -16 }, // 0x5E '^' - { 1381, 10, 2, 10, 0, 3 }, // 0x5F '_' - { 1384, 5, 4, 7, 1, -17 }, // 0x60 '`' - { 1387, 10, 13, 13, 1, -12 }, // 0x61 'a' - { 1404, 11, 18, 14, 2, -17 }, // 0x62 'b' - { 1429, 10, 13, 11, 1, -12 }, // 0x63 'c' - { 1446, 11, 18, 14, 1, -17 }, // 0x64 'd' - { 1471, 11, 13, 13, 1, -12 }, // 0x65 'e' - { 1489, 9, 18, 8, 0, -17 }, // 0x66 'f' - { 1510, 11, 19, 14, 1, -12 }, // 0x67 'g' - { 1537, 11, 18, 15, 2, -17 }, // 0x68 'h' - { 1562, 2, 17, 6, 2, -16 }, // 0x69 'i' - { 1567, 5, 23, 6, -1, -16 }, // 0x6A 'j' - { 1582, 10, 18, 13, 2, -17 }, // 0x6B 'k' - { 1605, 2, 18, 6, 2, -17 }, // 0x6C 'l' - { 1610, 18, 13, 22, 2, -12 }, // 0x6D 'm' - { 1640, 11, 13, 15, 2, -12 }, // 0x6E 'n' - { 1658, 12, 13, 14, 1, -12 }, // 0x6F 'o' - { 1678, 11, 19, 14, 2, -12 }, // 0x70 'p' - { 1705, 11, 19, 14, 1, -12 }, // 0x71 'q' - { 1732, 7, 13, 10, 2, -12 }, // 0x72 'r' - { 1744, 9, 13, 11, 1, -12 }, // 0x73 's' - { 1759, 8, 15, 8, 0, -14 }, // 0x74 't' - { 1774, 11, 13, 15, 2, -12 }, // 0x75 'u' - { 1792, 12, 13, 12, 0, -12 }, // 0x76 'v' - { 1812, 18, 13, 18, 0, -12 }, // 0x77 'w' - { 1842, 12, 13, 12, 0, -12 }, // 0x78 'x' - { 1862, 12, 19, 12, 0, -12 }, // 0x79 'y' - { 1891, 9, 13, 11, 1, -12 }, // 0x7A 'z' - { 1906, 7, 21, 9, 1, -16 }, // 0x7B '{' - { 1925, 1, 24, 13, 6, -17 }, // 0x7C '|' - { 1928, 7, 21, 9, 1, -16 }, // 0x7D '}' - { 1947, 11, 3, 13, 1, -9 }, // 0x7E '~' - { 1952, 10, 17, 14, 2, -16 }, // 0x7F - { 1974, 10, 17, 14, 2, -16 }, // 0x80 - { 1996, 10, 17, 14, 2, -16 }, // 0x81 - { 2018, 10, 17, 14, 2, -16 }, // 0x82 - { 2040, 10, 17, 14, 2, -16 }, // 0x83 - { 2062, 10, 17, 14, 2, -16 }, // 0x84 - { 2084, 10, 17, 14, 2, -16 }, // 0x85 - { 2106, 10, 17, 14, 2, -16 }, // 0x86 - { 2128, 10, 17, 14, 2, -16 }, // 0x87 - { 2150, 10, 17, 14, 2, -16 }, // 0x88 - { 2172, 10, 17, 14, 2, -16 }, // 0x89 - { 2194, 10, 17, 14, 2, -16 }, // 0x8A - { 2216, 10, 17, 14, 2, -16 }, // 0x8B - { 2238, 10, 17, 14, 2, -16 }, // 0x8C - { 2260, 10, 17, 14, 2, -16 }, // 0x8D - { 2282, 10, 17, 14, 2, -16 }, // 0x8E - { 2304, 10, 17, 14, 2, -16 }, // 0x8F - { 2326, 10, 17, 14, 2, -16 }, // 0x90 - { 2348, 10, 17, 14, 2, -16 }, // 0x91 - { 2370, 10, 17, 14, 2, -16 }, // 0x92 - { 2392, 10, 17, 14, 2, -16 }, // 0x93 - { 2414, 10, 17, 14, 2, -16 }, // 0x94 - { 2436, 10, 17, 14, 2, -16 }, // 0x95 - { 2458, 10, 17, 14, 2, -16 }, // 0x96 - { 2480, 10, 17, 14, 2, -16 }, // 0x97 - { 2502, 10, 17, 14, 2, -16 }, // 0x98 - { 2524, 10, 17, 14, 2, -16 }, // 0x99 - { 2546, 10, 17, 14, 2, -16 }, // 0x9A - { 2568, 10, 17, 14, 2, -16 }, // 0x9B - { 2590, 10, 17, 14, 2, -16 }, // 0x9C - { 2612, 10, 17, 14, 2, -16 }, // 0x9D - { 2634, 10, 17, 14, 2, -16 }, // 0x9E - { 2656, 10, 17, 14, 2, -16 }, // 0x9F - { 2678, 1, 1, 6, 0, 0 }, // 0xA0 - { 2679, 3, 17, 6, 2, -12 }, // 0xA1 - { 2686, 9, 17, 13, 2, -16 }, // 0xA2 - { 2706, 12, 17, 13, 1, -16 }, // 0xA3 - { 2732, 11, 11, 13, 1, -13 }, // 0xA4 - { 2748, 13, 17, 13, 0, -16 }, // 0xA5 - { 2776, 1, 24, 13, 6, -17 }, // 0xA6 - { 2779, 10, 18, 12, 1, -17 }, // 0xA7 - { 2802, 7, 2, 14, 3, -16 }, // 0xA8 - { 2804, 17, 17, 20, 1, -16 }, // 0xA9 - { 2841, 6, 8, 8, 1, -16 }, // 0xAA - { 2847, 10, 10, 12, 1, -10 }, // 0xAB - { 2860, 11, 6, 13, 1, -8 }, // 0xAC - { 2869, 6, 2, 8, 1, -6 }, // 0xAD - { 2871, 17, 17, 20, 1, -16 }, // 0xAE - { 2908, 12, 1, 12, 0, -18 }, // 0xAF - { 2910, 8, 7, 10, 1, -16 }, // 0xB0 - { 2917, 11, 14, 13, 1, -13 }, // 0xB1 - { 2937, 6, 10, 8, 1, -19 }, // 0xB2 - { 2945, 8, 10, 8, 0, -19 }, // 0xB3 - { 2955, 5, 4, 7, 1, -17 }, // 0xB4 - { 2958, 11, 19, 15, 2, -12 }, // 0xB5 - { 2985, 12, 21, 15, 1, -17 }, // 0xB6 - { 3017, 3, 3, 6, 2, -9 }, // 0xB7 - { 3019, 5, 6, 5, 0, 1 }, // 0xB8 - { 3023, 5, 10, 8, 1, -19 }, // 0xB9 - { 3030, 7, 8, 9, 1, -16 }, // 0xBA - { 3037, 10, 10, 12, 1, -10 }, // 0xBB - { 3050, 16, 17, 18, 1, -16 }, // 0xBC - { 3084, 16, 17, 18, 1, -16 }, // 0xBD - { 3118, 18, 17, 18, 0, -16 }, // 0xBE - { 3157, 9, 18, 10, 1, -12 }, // 0xBF - { 3178, 15, 22, 15, 0, -21 }, // 0xC0 - { 3220, 15, 22, 15, 0, -21 }, // 0xC1 - { 3262, 15, 22, 15, 0, -21 }, // 0xC2 - { 3304, 15, 21, 15, 0, -20 }, // 0xC3 - { 3344, 15, 21, 15, 0, -20 }, // 0xC4 - { 3384, 15, 20, 15, 0, -19 }, // 0xC5 - { 3422, 19, 17, 21, 0, -16 }, // 0xC6 - { 3463, 13, 23, 15, 1, -16 }, // 0xC7 - { 3501, 10, 22, 13, 2, -21 }, // 0xC8 - { 3529, 10, 22, 13, 2, -21 }, // 0xC9 - { 3557, 10, 22, 13, 2, -21 }, // 0xCA - { 3585, 10, 21, 13, 2, -20 }, // 0xCB - { 3612, 6, 22, 8, 1, -21 }, // 0xCC - { 3629, 7, 22, 8, 1, -21 }, // 0xCD - { 3649, 8, 22, 8, 0, -21 }, // 0xCE - { 3671, 7, 21, 8, 0, -20 }, // 0xCF - { 3690, 15, 17, 17, 1, -16 }, // 0xD0 - { 3722, 14, 21, 18, 2, -20 }, // 0xD1 - { 3759, 16, 22, 18, 1, -21 }, // 0xD2 - { 3803, 16, 22, 18, 1, -21 }, // 0xD3 - { 3847, 16, 22, 18, 1, -21 }, // 0xD4 - { 3891, 16, 21, 18, 1, -20 }, // 0xD5 - { 3933, 16, 21, 18, 1, -20 }, // 0xD6 - { 3975, 11, 10, 13, 1, -12 }, // 0xD7 - { 3989, 16, 19, 18, 1, -17 }, // 0xD8 - { 4027, 13, 22, 17, 2, -21 }, // 0xD9 - { 4063, 13, 22, 17, 2, -21 }, // 0xDA - { 4099, 13, 22, 17, 2, -21 }, // 0xDB - { 4135, 13, 21, 17, 2, -20 }, // 0xDC - { 4170, 13, 22, 13, 0, -21 }, // 0xDD - { 4206, 11, 17, 14, 2, -16 }, // 0xDE - { 4230, 12, 18, 15, 2, -17 }, // 0xDF - { 4257, 10, 18, 13, 1, -17 }, // 0xE0 - { 4280, 10, 18, 13, 1, -17 }, // 0xE1 - { 4303, 10, 18, 13, 1, -17 }, // 0xE2 - { 4326, 10, 17, 13, 1, -16 }, // 0xE3 - { 4348, 10, 17, 13, 1, -16 }, // 0xE4 - { 4370, 10, 19, 13, 1, -18 }, // 0xE5 - { 4394, 18, 13, 20, 1, -12 }, // 0xE6 - { 4424, 10, 19, 11, 1, -12 }, // 0xE7 - { 4448, 11, 18, 13, 1, -17 }, // 0xE8 - { 4473, 11, 18, 13, 1, -17 }, // 0xE9 - { 4498, 11, 18, 13, 1, -17 }, // 0xEA - { 4523, 11, 17, 13, 1, -16 }, // 0xEB - { 4547, 5, 18, 6, 0, -17 }, // 0xEC - { 4559, 5, 18, 6, 2, -17 }, // 0xED - { 4571, 8, 18, 6, -1, -17 }, // 0xEE - { 4589, 7, 17, 6, -1, -16 }, // 0xEF - { 4604, 12, 18, 14, 1, -17 }, // 0xF0 - { 4631, 11, 17, 15, 2, -16 }, // 0xF1 - { 4655, 12, 18, 14, 1, -17 }, // 0xF2 - { 4682, 12, 18, 14, 1, -17 }, // 0xF3 - { 4709, 12, 18, 14, 1, -17 }, // 0xF4 - { 4736, 12, 17, 14, 1, -16 }, // 0xF5 - { 4762, 12, 17, 14, 1, -16 }, // 0xF6 - { 4788, 11, 11, 13, 1, -13 }, // 0xF7 - { 4804, 12, 14, 14, 1, -12 }, // 0xF8 - { 4825, 11, 18, 15, 2, -17 }, // 0xF9 - { 4850, 11, 18, 15, 2, -17 }, // 0xFA - { 4875, 11, 18, 15, 2, -17 }, // 0xFB - { 4900, 11, 17, 15, 2, -16 }, // 0xFC - { 4924, 12, 24, 12, 0, -17 }, // 0xFD - { 4960, 11, 24, 14, 2, -17 }, // 0xFE - { 4993, 12, 23, 12, 0, -16 }, // 0xFF - { 5028, 15, 20, 15, 0, -19 }, // 0x100 - { 5066, 10, 16, 13, 1, -15 }, // 0x101 - { 5086, 15, 21, 15, 0, -20 }, // 0x102 - { 5126, 10, 17, 13, 1, -16 }, // 0x103 - { 5148, 15, 22, 15, 0, -16 }, // 0x104 - { 5190, 11, 18, 13, 1, -12 }, // 0x105 - { 5215, 13, 22, 15, 1, -21 }, // 0x106 - { 5251, 10, 18, 11, 1, -17 }, // 0x107 - { 5274, 13, 22, 15, 1, -21 }, // 0x108 - { 5310, 10, 18, 11, 1, -17 }, // 0x109 - { 5333, 13, 21, 15, 1, -20 }, // 0x10A - { 5368, 10, 17, 11, 1, -16 }, // 0x10B - { 5390, 13, 22, 15, 1, -21 }, // 0x10C - { 5426, 10, 18, 11, 1, -17 }, // 0x10D - { 5449, 14, 22, 17, 2, -21 }, // 0x10E - { 5488, 15, 18, 14, 1, -17 }, // 0x10F - { 5522, 15, 17, 17, 1, -16 }, // 0x110 - { 5554, 13, 18, 15, 1, -17 }, // 0x111 - { 5584, 10, 20, 13, 2, -19 }, // 0x112 - { 5609, 11, 16, 13, 1, -15 }, // 0x113 - { 5631, 10, 21, 13, 2, -20 }, // 0x114 - { 5658, 11, 17, 13, 1, -16 }, // 0x115 - { 5682, 10, 21, 13, 2, -20 }, // 0x116 - { 5709, 11, 17, 13, 1, -16 }, // 0x117 - { 5733, 10, 22, 13, 2, -16 }, // 0x118 - { 5761, 11, 18, 13, 1, -12 }, // 0x119 - { 5786, 10, 22, 13, 2, -21 }, // 0x11A - { 5814, 11, 18, 13, 1, -17 }, // 0x11B - { 5839, 14, 22, 17, 1, -21 }, // 0x11C - { 5878, 11, 24, 14, 1, -17 }, // 0x11D - { 5911, 14, 21, 17, 1, -20 }, // 0x11E - { 5948, 11, 23, 14, 1, -16 }, // 0x11F - { 5980, 14, 21, 17, 1, -20 }, // 0x120 - { 6017, 11, 23, 14, 1, -16 }, // 0x121 - { 6049, 14, 22, 17, 1, -16 }, // 0x122 - { 6088, 11, 24, 14, 1, -17 }, // 0x123 - { 6121, 13, 22, 17, 2, -21 }, // 0x124 - { 6157, 14, 23, 15, -1, -22 }, // 0x125 - { 6198, 17, 17, 17, 0, -16 }, // 0x126 - { 6235, 13, 18, 15, 0, -17 }, // 0x127 - { 6265, 9, 21, 8, 0, -20 }, // 0x128 - { 6289, 9, 17, 6, -1, -16 }, // 0x129 - { 6309, 7, 20, 8, 1, -19 }, // 0x12A - { 6327, 7, 16, 6, 0, -15 }, // 0x12B - { 6341, 7, 21, 8, 0, -20 }, // 0x12C - { 6360, 7, 17, 6, -1, -16 }, // 0x12D - { 6375, 6, 22, 8, 1, -16 }, // 0x12E - { 6392, 4, 22, 6, 1, -16 }, // 0x12F - { 6403, 6, 21, 8, 1, -20 }, // 0x130 - { 6419, 2, 13, 6, 2, -12 }, // 0x131 - { 6423, 11, 21, 14, 1, -16 }, // 0x132 - { 6452, 8, 23, 12, 2, -16 }, // 0x133 - { 6475, 9, 26, 6, -2, -21 }, // 0x134 - { 6505, 8, 24, 6, -1, -17 }, // 0x135 - { 6529, 13, 22, 15, 2, -16 }, // 0x136 - { 6565, 10, 23, 13, 2, -17 }, // 0x137 - { 6594, 10, 13, 13, 2, -12 }, // 0x138 - { 6611, 10, 22, 12, 2, -21 }, // 0x139 - { 6639, 5, 23, 6, 2, -22 }, // 0x13A - { 6654, 10, 22, 12, 2, -16 }, // 0x13B - { 6682, 4, 23, 6, 1, -17 }, // 0x13C - { 6694, 10, 17, 12, 2, -16 }, // 0x13D - { 6716, 6, 18, 6, 2, -17 }, // 0x13E - { 6730, 10, 17, 12, 2, -16 }, // 0x13F - { 6752, 5, 18, 6, 2, -17 }, // 0x140 - { 6764, 12, 17, 12, 0, -16 }, // 0x141 - { 6790, 6, 18, 6, 0, -17 }, // 0x142 - { 6804, 14, 22, 18, 2, -21 }, // 0x143 - { 6843, 11, 18, 15, 2, -17 }, // 0x144 - { 6868, 14, 22, 18, 2, -16 }, // 0x145 - { 6907, 11, 18, 15, 2, -12 }, // 0x146 - { 6932, 14, 22, 18, 2, -21 }, // 0x147 - { 6971, 11, 18, 15, 2, -17 }, // 0x148 - { 6996, 15, 17, 16, 0, -16 }, // 0x149 - { 7028, 14, 21, 18, 2, -16 }, // 0x14A - { 7065, 11, 19, 15, 2, -12 }, // 0x14B - { 7092, 16, 20, 18, 1, -19 }, // 0x14C - { 7132, 12, 16, 14, 1, -15 }, // 0x14D - { 7156, 16, 21, 18, 1, -20 }, // 0x14E - { 7198, 12, 17, 14, 1, -16 }, // 0x14F - { 7224, 16, 22, 18, 1, -21 }, // 0x150 - { 7268, 12, 18, 14, 1, -17 }, // 0x151 - { 7295, 19, 17, 22, 1, -16 }, // 0x152 - { 7336, 20, 13, 22, 1, -12 }, // 0x153 - { 7369, 12, 22, 15, 2, -21 }, // 0x154 - { 7402, 7, 18, 10, 2, -17 }, // 0x155 - { 7418, 12, 22, 15, 2, -16 }, // 0x156 - { 7451, 8, 18, 10, 1, -12 }, // 0x157 - { 7469, 12, 22, 15, 2, -21 }, // 0x158 - { 7502, 8, 18, 10, 2, -17 }, // 0x159 - { 7520, 11, 22, 13, 1, -21 }, // 0x15A - { 7551, 9, 18, 11, 1, -17 }, // 0x15B - { 7572, 11, 22, 13, 1, -21 }, // 0x15C - { 7603, 9, 18, 11, 1, -17 }, // 0x15D - { 7624, 11, 23, 13, 1, -16 }, // 0x15E - { 7656, 9, 19, 11, 1, -12 }, // 0x15F - { 7678, 11, 22, 13, 1, -21 }, // 0x160 - { 7709, 9, 18, 11, 1, -17 }, // 0x161 - { 7730, 13, 23, 13, 0, -16 }, // 0x162 - { 7768, 8, 21, 8, 0, -14 }, // 0x163 - { 7789, 13, 22, 13, 0, -21 }, // 0x164 - { 7825, 11, 18, 8, 0, -17 }, // 0x165 - { 7850, 13, 17, 13, 0, -16 }, // 0x166 - { 7878, 8, 15, 8, 0, -14 }, // 0x167 - { 7893, 13, 21, 17, 2, -20 }, // 0x168 - { 7928, 11, 17, 15, 2, -16 }, // 0x169 - { 7952, 13, 20, 17, 2, -19 }, // 0x16A - { 7985, 11, 16, 15, 2, -15 }, // 0x16B - { 8007, 13, 21, 17, 2, -20 }, // 0x16C - { 8042, 11, 17, 15, 2, -16 }, // 0x16D - { 8066, 13, 23, 17, 2, -22 }, // 0x16E - { 8104, 11, 19, 15, 2, -18 }, // 0x16F - { 8131, 13, 22, 17, 2, -21 }, // 0x170 - { 8167, 11, 18, 15, 2, -17 }, // 0x171 - { 8192, 13, 22, 17, 2, -16 }, // 0x172 - { 8228, 11, 18, 15, 2, -12 }, // 0x173 - { 8253, 22, 22, 22, 0, -21 }, // 0x174 - { 8314, 18, 18, 18, 0, -17 }, // 0x175 - { 8355, 13, 22, 13, 0, -21 }, // 0x176 - { 8391, 12, 24, 12, 0, -17 }, // 0x177 - { 8427, 13, 21, 13, 0, -20 }, // 0x178 - { 8462, 12, 22, 13, 1, -21 }, // 0x179 - { 8495, 9, 18, 11, 1, -17 }, // 0x17A - { 8516, 12, 21, 13, 1, -20 }, // 0x17B - { 8548, 9, 17, 11, 1, -16 }, // 0x17C - { 8568, 12, 22, 13, 1, -21 }, // 0x17D - { 8601, 9, 18, 11, 1, -17 }, // 0x17E - { 8622, 7, 18, 8, 2, -17 } }; // 0x17F - -const GFXfont NotoSans12pt8b PROGMEM = { - (uint8_t *)NotoSans12pt8bBitmaps, - (GFXglyph *)NotoSans12pt8bGlyphs, - 0x20, 0x17F, 32 }; - -// Approx. 11109 bytes - -#endif // NOTOSANS12PT8B_H diff --git a/examples/companion_radio/ui-new/fonts/NotoSans18pt7b.h b/examples/companion_radio/ui-new/fonts/NotoSans18pt7b.h deleted file mode 100644 index bc55045f..00000000 --- a/examples/companion_radio/ui-new/fonts/NotoSans18pt7b.h +++ /dev/null @@ -1,464 +0,0 @@ -#ifndef NOTOSANS18PT7B_H -#define NOTOSANS18PT7B_H -const uint8_t NotoSans_Regular18pt7bBitmaps[] PROGMEM = { - 0x00, 0xFF, 0xFE, 0xEE, 0xEE, 0xEE, 0xEE, 0xE6, 0x66, 0x66, 0x00, 0x0E, - 0xFF, 0xF4, 0xF1, 0xFC, 0x76, 0x1D, 0x87, 0x61, 0xD8, 0x76, 0x1D, 0x87, - 0x61, 0x80, 0x00, 0xC1, 0xC0, 0x0E, 0x0C, 0x00, 0x70, 0x60, 0x03, 0x83, - 0x00, 0x18, 0x38, 0x00, 0xC1, 0xC0, 0x0E, 0x0E, 0x0F, 0xFF, 0xFF, 0x7F, - 0xFF, 0xFB, 0xFF, 0xFF, 0xC0, 0xC1, 0xC0, 0x06, 0x0E, 0x00, 0x70, 0x60, - 0x03, 0x83, 0x00, 0x18, 0x38, 0x1F, 0xFF, 0xFE, 0xFF, 0xFF, 0xF7, 0xFF, - 0xFF, 0x83, 0x83, 0x00, 0x1C, 0x38, 0x00, 0xC1, 0xC0, 0x06, 0x0E, 0x00, - 0x70, 0x60, 0x03, 0x83, 0x00, 0x1C, 0x38, 0x00, 0x01, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x03, 0xE0, 0x1F, 0xFE, 0x3F, 0xFE, 0x79, 0x8E, 0xF1, 0x80, - 0xE1, 0x80, 0xE1, 0x80, 0xF1, 0x80, 0x79, 0x80, 0x7F, 0x80, 0x3F, 0xE0, - 0x0F, 0xF8, 0x01, 0xFE, 0x01, 0xBE, 0x01, 0x8F, 0x01, 0x87, 0x01, 0x87, - 0x01, 0x87, 0x81, 0x8F, 0xFD, 0xFE, 0xFF, 0xFC, 0x7F, 0xF0, 0x01, 0x80, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x08, 0x00, 0x00, 0x0F, 0xC0, 0x0E, - 0x07, 0xF8, 0x07, 0x03, 0x86, 0x01, 0xC0, 0xE1, 0xC0, 0xE0, 0x38, 0x70, - 0x30, 0x0C, 0x1C, 0x1C, 0x03, 0x03, 0x06, 0x00, 0xC0, 0xC3, 0x80, 0x30, - 0x31, 0xC0, 0x0C, 0x1C, 0x70, 0x03, 0x87, 0x39, 0xF8, 0xE1, 0xCE, 0xFF, - 0x1C, 0xE7, 0x38, 0xE7, 0xF9, 0x8C, 0x38, 0xFC, 0xE7, 0x06, 0x00, 0x31, - 0xC1, 0x80, 0x1C, 0x70, 0x70, 0x0E, 0x1C, 0x1C, 0x03, 0x87, 0x07, 0x01, - 0xC1, 0xC1, 0x80, 0x70, 0x70, 0x60, 0x38, 0x0C, 0x38, 0x0C, 0x03, 0x8E, - 0x07, 0x00, 0x7F, 0x03, 0x80, 0x0F, 0x80, 0x00, 0x80, 0x00, 0x0F, 0xF8, - 0x00, 0x1F, 0xFC, 0x00, 0x1E, 0x3C, 0x00, 0x3C, 0x1E, 0x00, 0x38, 0x0E, - 0x00, 0x38, 0x0E, 0x00, 0x3C, 0x1E, 0x00, 0x1C, 0x1C, 0x00, 0x1E, 0x3C, - 0x00, 0x0F, 0xF0, 0x00, 0x07, 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x1F, 0xE0, - 0x1C, 0x3C, 0xF0, 0x1C, 0x78, 0x78, 0x3C, 0xF0, 0x3C, 0x38, 0xE0, 0x1E, - 0x38, 0xE0, 0x0F, 0x70, 0xE0, 0x07, 0xF0, 0xE0, 0x03, 0xE0, 0xF0, 0x03, - 0xE0, 0xF0, 0x07, 0xF0, 0x7E, 0x7F, 0x78, 0x3F, 0xFE, 0x3C, 0x1F, 0xF8, - 0x1F, 0xFF, 0x66, 0x66, 0x66, 0x60, 0x07, 0x87, 0x03, 0x83, 0x81, 0xC1, - 0xC0, 0xE0, 0xF0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x07, 0x83, 0xC1, 0xE0, - 0xF0, 0x78, 0x1C, 0x0E, 0x07, 0x03, 0x81, 0xE0, 0x70, 0x38, 0x1E, 0x07, - 0x03, 0xC0, 0xE0, 0x38, 0x0C, 0xF0, 0x70, 0x38, 0x38, 0x1C, 0x1C, 0x0E, - 0x0E, 0x0E, 0x0F, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x0F, 0x0E, 0x0E, 0x0E, 0x1E, 0x1C, 0x3C, 0x38, 0x78, 0x70, 0xE0, - 0x01, 0xC0, 0x00, 0xE0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x1C, 0x02, 0x0E, - 0x09, 0xF3, 0x7E, 0xFF, 0xFF, 0x9F, 0xFE, 0x01, 0xF0, 0x00, 0xDC, 0x00, - 0xEE, 0x00, 0xE3, 0x80, 0xF1, 0xE0, 0x78, 0x78, 0x08, 0x30, 0x01, 0x80, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x3C, 0xE3, 0x8E, 0x71, - 0xC7, 0x18, 0xE0, 0xFF, 0xFF, 0xFF, 0xE0, 0xEF, 0xFF, 0x40, 0x00, 0x78, - 0x03, 0x80, 0x1C, 0x01, 0xC0, 0x0E, 0x00, 0x70, 0x07, 0x00, 0x38, 0x03, - 0xC0, 0x1C, 0x00, 0xE0, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x38, 0x01, 0xC0, - 0x0E, 0x00, 0xE0, 0x07, 0x00, 0x70, 0x03, 0x80, 0x1C, 0x01, 0xC0, 0x0E, - 0x00, 0xF0, 0x00, 0x00, 0x80, 0x0F, 0xF0, 0x1F, 0xF8, 0x3C, 0x3C, 0x78, - 0x1E, 0x70, 0x0E, 0x70, 0x0F, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, - 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, - 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0x70, 0x0F, 0x70, 0x0E, 0x38, - 0x1E, 0x3E, 0x7C, 0x1F, 0xF8, 0x0F, 0xF0, 0x03, 0xC1, 0xF1, 0xFC, 0xF7, - 0x79, 0xFC, 0xF6, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, - 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, - 0x0F, 0x03, 0xC0, 0x01, 0x00, 0x1F, 0xF0, 0x7F, 0xFC, 0xF8, 0x3C, 0x60, - 0x1E, 0x40, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, - 0x1E, 0x00, 0x1C, 0x00, 0x3C, 0x00, 0x78, 0x00, 0xF0, 0x00, 0xE0, 0x01, - 0xC0, 0x03, 0x80, 0x07, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x70, - 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x80, 0x3F, 0xF0, 0x7F, - 0xFC, 0xF8, 0x3C, 0x40, 0x1E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, - 0x0E, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0xF8, 0x1F, 0xE0, 0x1F, 0xF8, 0x01, - 0xFC, 0x00, 0x1E, 0x00, 0x0F, 0x00, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, - 0x07, 0x00, 0x0F, 0x80, 0x1E, 0xF8, 0x7E, 0xFF, 0xFC, 0x7F, 0xF0, 0x00, - 0x1E, 0x00, 0x0F, 0x80, 0x03, 0xE0, 0x01, 0xF8, 0x00, 0xEE, 0x00, 0x73, - 0x80, 0x1C, 0xE0, 0x0E, 0x38, 0x07, 0x0E, 0x01, 0xC3, 0x80, 0xE0, 0xE0, - 0x70, 0x38, 0x1C, 0x0E, 0x0E, 0x03, 0x87, 0x00, 0xE1, 0x80, 0x38, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x03, - 0x80, 0x00, 0xE0, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x3F, 0xFC, 0x3F, 0xFC, - 0x3F, 0xFC, 0x70, 0x00, 0x70, 0x00, 0x70, 0x00, 0x70, 0x00, 0x70, 0x00, - 0x70, 0x00, 0x70, 0x00, 0x7F, 0xF0, 0x7F, 0xFC, 0x30, 0x7E, 0x00, 0x1E, - 0x00, 0x0F, 0x00, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x07, - 0x00, 0x0E, 0x80, 0x1E, 0xF8, 0x7C, 0xFF, 0xF8, 0x7F, 0xF0, 0x00, 0x10, - 0x01, 0xFF, 0x01, 0xFF, 0x83, 0xE0, 0x01, 0xC0, 0x01, 0xC0, 0x01, 0xE0, - 0x00, 0xE0, 0x00, 0x70, 0x00, 0x78, 0x00, 0x38, 0x78, 0x1C, 0xFF, 0x8E, - 0xFF, 0xE7, 0xC0, 0x73, 0xC0, 0x1D, 0xE0, 0x0E, 0xE0, 0x07, 0x70, 0x03, - 0xF8, 0x01, 0xDC, 0x00, 0xE7, 0x00, 0x73, 0x80, 0x38, 0xE0, 0x38, 0x7C, - 0x7C, 0x1F, 0xFC, 0x03, 0xF8, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x07, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x1E, 0x00, 0x1C, 0x00, 0x3C, - 0x00, 0x38, 0x00, 0x78, 0x00, 0x70, 0x00, 0x70, 0x00, 0xE0, 0x00, 0xE0, - 0x01, 0xC0, 0x01, 0xC0, 0x03, 0xC0, 0x03, 0x80, 0x07, 0x80, 0x07, 0x00, - 0x0F, 0x00, 0x0E, 0x00, 0x1E, 0x00, 0x1C, 0x00, 0x01, 0x80, 0x0F, 0xF8, - 0x3F, 0xFC, 0x78, 0x1E, 0x70, 0x0E, 0x70, 0x0F, 0x70, 0x07, 0x70, 0x0F, - 0x70, 0x0E, 0x78, 0x1E, 0x3C, 0x3C, 0x1F, 0xF8, 0x0F, 0xE0, 0x0F, 0xF0, - 0x3E, 0xFC, 0x78, 0x1E, 0xF0, 0x0F, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, - 0xE0, 0x07, 0xE0, 0x07, 0xF0, 0x0F, 0x7C, 0x1E, 0x3F, 0xFC, 0x1F, 0xF8, - 0x01, 0x00, 0x0F, 0xF0, 0x3F, 0xF8, 0x7C, 0x3C, 0x70, 0x1E, 0xF0, 0x0E, - 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, - 0xF0, 0x0F, 0x78, 0x3F, 0x3F, 0xF7, 0x1F, 0xE7, 0x07, 0x07, 0x00, 0x07, - 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x3C, 0x41, 0xF8, - 0x3F, 0xF0, 0x3F, 0xC0, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, - 0xFF, 0xF4, 0x39, 0xF7, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x0E, 0x39, 0xE7, 0x1C, 0x71, 0x8E, 0x30, 0x00, 0x03, 0x00, 0x0F, - 0x00, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xF8, 0x00, - 0xE0, 0x00, 0xF8, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0x7E, - 0x00, 0x1F, 0x00, 0x07, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, - 0xC0, 0x00, 0xF0, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0, - 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x07, 0x00, 0x1F, 0x00, 0x7C, 0x03, 0xF0, - 0x0F, 0xC0, 0x7F, 0x00, 0xF8, 0x00, 0xE0, 0x00, 0x80, 0x00, 0x01, 0x00, - 0xFF, 0xCF, 0xFF, 0x9E, 0x1F, 0x40, 0x1C, 0x00, 0x70, 0x01, 0xC0, 0x07, - 0x00, 0x1C, 0x00, 0xF0, 0x03, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x38, - 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x70, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0x20, 0x00, 0x00, 0x3F, - 0xE0, 0x00, 0x0F, 0xFF, 0xC0, 0x03, 0xF0, 0x3E, 0x00, 0x78, 0x00, 0xF0, - 0x0E, 0x00, 0x03, 0x81, 0xC0, 0x00, 0x1C, 0x38, 0x00, 0x00, 0xC3, 0x81, - 0xFF, 0x0E, 0x70, 0x3F, 0xF0, 0x67, 0x07, 0x07, 0x06, 0x60, 0xE0, 0x70, - 0x7E, 0x0C, 0x07, 0x07, 0xE1, 0xC0, 0x70, 0x7E, 0x1C, 0x07, 0x07, 0xE1, - 0xC0, 0x70, 0x6E, 0x1C, 0x07, 0x06, 0xE1, 0xC0, 0xF0, 0xEE, 0x0C, 0x0F, - 0x0E, 0xE0, 0xE1, 0xB1, 0xC6, 0x07, 0xFB, 0xF8, 0x70, 0x3F, 0x1F, 0x07, - 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x1E, 0x00, - 0x08, 0x00, 0xFC, 0x0F, 0x80, 0x03, 0xFF, 0xF8, 0x00, 0x0F, 0xFC, 0x00, - 0x00, 0x38, 0x00, 0x01, 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x3F, 0x00, 0x00, - 0xEE, 0x00, 0x03, 0xB8, 0x00, 0x1C, 0xE0, 0x00, 0x71, 0xC0, 0x03, 0x87, - 0x00, 0x0E, 0x1C, 0x00, 0x38, 0x38, 0x01, 0xC0, 0xE0, 0x07, 0x01, 0xC0, - 0x3C, 0x07, 0x00, 0xFF, 0xFC, 0x03, 0xFF, 0xF8, 0x1F, 0xFF, 0xE0, 0x70, - 0x03, 0xC1, 0xC0, 0x07, 0x0E, 0x00, 0x1C, 0x38, 0x00, 0x79, 0xE0, 0x00, - 0xE7, 0x00, 0x03, 0xDC, 0x00, 0x07, 0xE0, 0x00, 0x1C, 0xFF, 0xF8, 0x3F, - 0xFF, 0x8F, 0xFF, 0xF3, 0xC0, 0x3E, 0xF0, 0x07, 0xBC, 0x00, 0xEF, 0x00, - 0x3B, 0xC0, 0x0E, 0xF0, 0x07, 0xBC, 0x01, 0xCF, 0x07, 0xE3, 0xFF, 0xE0, - 0xFF, 0xFE, 0x3C, 0x07, 0xCF, 0x00, 0x7B, 0xC0, 0x0F, 0xF0, 0x03, 0xFC, - 0x00, 0x7F, 0x00, 0x1F, 0xC0, 0x0F, 0xF0, 0x03, 0xFC, 0x01, 0xEF, 0xFF, - 0xF3, 0xFF, 0xF8, 0xFF, 0xF8, 0x00, 0x00, 0x18, 0x00, 0x3F, 0xF8, 0x1F, - 0xFF, 0x87, 0xE1, 0xE1, 0xF0, 0x04, 0x78, 0x00, 0x0E, 0x00, 0x03, 0xC0, - 0x00, 0x70, 0x00, 0x0E, 0x00, 0x03, 0xC0, 0x00, 0x78, 0x00, 0x0F, 0x00, - 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x07, 0x80, 0x00, 0xF0, 0x00, 0x0E, 0x00, - 0x01, 0xC0, 0x00, 0x3C, 0x00, 0x03, 0x80, 0x00, 0x78, 0x00, 0x07, 0xC0, - 0x00, 0x7F, 0xBE, 0x07, 0xFF, 0xC0, 0x3F, 0xF8, 0xFF, 0xF8, 0x07, 0xFF, - 0xF0, 0x3F, 0xFF, 0xE1, 0xE0, 0x0F, 0x8F, 0x00, 0x3E, 0x78, 0x00, 0xF3, - 0xC0, 0x03, 0xDE, 0x00, 0x1E, 0xF0, 0x00, 0x77, 0x80, 0x03, 0xBC, 0x00, - 0x1D, 0xE0, 0x00, 0xFF, 0x00, 0x07, 0xF8, 0x00, 0x3F, 0xC0, 0x01, 0xDE, - 0x00, 0x0E, 0xF0, 0x00, 0x77, 0x80, 0x07, 0xBC, 0x00, 0x39, 0xE0, 0x03, - 0xCF, 0x00, 0x3C, 0x78, 0x07, 0xC3, 0xFF, 0xFC, 0x1F, 0xFF, 0xC0, 0xFF, - 0xF0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xF0, 0x03, 0xC0, - 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x3C, - 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x00, - 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, - 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, - 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x00, 0x00, 0x04, 0x00, 0x0F, 0xFF, 0x81, - 0xFF, 0xFE, 0x1F, 0xC3, 0xE1, 0xF0, 0x01, 0x1E, 0x00, 0x00, 0xF0, 0x00, - 0x0F, 0x00, 0x00, 0x70, 0x00, 0x03, 0x80, 0x00, 0x3C, 0x00, 0x01, 0xE0, - 0x00, 0x0F, 0x00, 0x00, 0x70, 0x07, 0xFF, 0x80, 0x3F, 0xFE, 0x01, 0xFF, - 0xF0, 0x00, 0x3B, 0x80, 0x01, 0xDC, 0x00, 0x0E, 0xF0, 0x00, 0x73, 0x80, - 0x03, 0x9E, 0x00, 0x1C, 0x7C, 0x00, 0xE1, 0xFE, 0x3F, 0x07, 0xFF, 0xF8, - 0x0F, 0xFF, 0x00, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, - 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, - 0x00, 0xFF, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, - 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, - 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xF0, 0xFF, 0xFF, 0xF1, 0xE0, 0x78, 0x1E, - 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x81, - 0xE0, 0x78, 0x1E, 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x81, 0xE3, 0xFF, - 0xFF, 0xC0, 0x03, 0x81, 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, - 0x81, 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, 0x81, 0xC0, 0xE0, - 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, 0x81, 0xC0, 0xE0, 0x70, 0x7F, 0xFB, - 0xF8, 0xF0, 0xF0, 0x03, 0xDE, 0x00, 0xF3, 0xC0, 0x3C, 0x78, 0x0F, 0x0F, - 0x01, 0xC1, 0xE0, 0x70, 0x3C, 0x1C, 0x07, 0x87, 0x00, 0xF1, 0xE0, 0x1E, - 0x78, 0x03, 0xDE, 0x00, 0x7F, 0xC0, 0x0F, 0xFC, 0x01, 0xFB, 0x80, 0x3C, - 0x78, 0x07, 0x87, 0x80, 0xF0, 0x78, 0x1E, 0x07, 0x03, 0xC0, 0xF0, 0x78, - 0x0F, 0x0F, 0x00, 0xF1, 0xE0, 0x1E, 0x3C, 0x01, 0xE7, 0x80, 0x1E, 0xF0, - 0x01, 0xE0, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x80, 0x0F, 0x00, 0x1E, - 0x00, 0x3C, 0x00, 0x78, 0x00, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x80, - 0x0F, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0x78, 0x00, 0xF0, 0x01, 0xE0, 0x03, - 0xC0, 0x07, 0x80, 0x0F, 0x00, 0x1E, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFE, 0xF8, 0x00, 0x07, 0xFF, 0x00, 0x03, 0xFF, 0xC0, 0x00, 0xFF, 0xF0, - 0x00, 0x77, 0xEE, 0x00, 0x1D, 0xFB, 0x80, 0x07, 0xFE, 0x70, 0x03, 0xBF, - 0x9C, 0x00, 0xEF, 0xE7, 0x00, 0x33, 0xF8, 0xE0, 0x1C, 0xFE, 0x38, 0x07, - 0x3F, 0x8E, 0x03, 0x8F, 0xE1, 0xC0, 0xE3, 0xF8, 0x70, 0x38, 0xFE, 0x0E, - 0x1C, 0x3F, 0x83, 0x87, 0x0F, 0xE0, 0xE3, 0x83, 0xF8, 0x1C, 0xE0, 0xFE, - 0x07, 0x38, 0x3F, 0x81, 0xFC, 0x0F, 0xE0, 0x3F, 0x03, 0xF8, 0x0F, 0x80, - 0xFE, 0x01, 0xE0, 0x3F, 0x80, 0x78, 0x0F, 0xE0, 0x1C, 0x03, 0xC0, 0xF8, - 0x00, 0x7F, 0x80, 0x07, 0xFC, 0x00, 0x7F, 0xC0, 0x07, 0xFE, 0x00, 0x7E, - 0xF0, 0x07, 0xE7, 0x00, 0x7E, 0x78, 0x07, 0xE3, 0xC0, 0x7E, 0x1C, 0x07, - 0xE1, 0xE0, 0x7E, 0x0F, 0x07, 0xE0, 0x70, 0x7E, 0x07, 0x87, 0xE0, 0x3C, - 0x7E, 0x01, 0xC7, 0xE0, 0x1E, 0x7E, 0x00, 0xE7, 0xE0, 0x0F, 0x3E, 0x00, - 0x7B, 0xE0, 0x03, 0xBE, 0x00, 0x3F, 0xE0, 0x01, 0xFE, 0x00, 0x0F, 0xE0, - 0x00, 0xF0, 0x00, 0x10, 0x00, 0x07, 0xFF, 0x00, 0x1F, 0xFF, 0x80, 0xFC, - 0x1F, 0x81, 0xE0, 0x07, 0x87, 0x80, 0x07, 0x1E, 0x00, 0x0F, 0x3C, 0x00, - 0x0E, 0x70, 0x00, 0x1F, 0xE0, 0x00, 0x1F, 0xC0, 0x00, 0x3F, 0x80, 0x00, - 0x7F, 0x00, 0x00, 0xFE, 0x00, 0x01, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x07, - 0xF0, 0x00, 0x0E, 0xE0, 0x00, 0x1D, 0xC0, 0x00, 0x7B, 0xC0, 0x00, 0xE3, - 0x80, 0x03, 0xC7, 0x80, 0x0F, 0x07, 0x80, 0x3E, 0x07, 0xF3, 0xF8, 0x07, - 0xFF, 0xE0, 0x03, 0xFF, 0x00, 0xFF, 0xF0, 0x7F, 0xFE, 0x3F, 0xFF, 0x9E, - 0x03, 0xEF, 0x00, 0xF7, 0x80, 0x3B, 0xC0, 0x1D, 0xE0, 0x0F, 0xF0, 0x07, - 0x78, 0x03, 0xBC, 0x03, 0xDE, 0x03, 0xCF, 0xFF, 0xE7, 0xFF, 0xC3, 0xFF, - 0x81, 0xE0, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x0F, - 0x00, 0x07, 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x07, 0xFF, 0x00, 0x1F, 0xFF, 0x80, 0xFC, 0x1F, 0x81, 0xE0, - 0x07, 0x87, 0x80, 0x07, 0x1E, 0x00, 0x0F, 0x3C, 0x00, 0x0E, 0x70, 0x00, - 0x1F, 0xE0, 0x00, 0x1F, 0xC0, 0x00, 0x3F, 0x80, 0x00, 0x7F, 0x00, 0x00, - 0xFE, 0x00, 0x01, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x0E, - 0xE0, 0x00, 0x1D, 0xC0, 0x00, 0x7B, 0xC0, 0x00, 0xE3, 0x80, 0x03, 0xC7, - 0x80, 0x0F, 0x07, 0x80, 0x3E, 0x07, 0xF3, 0xF8, 0x07, 0xFF, 0xE0, 0x03, - 0xFF, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x1E, 0x00, 0x00, - 0x3E, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x3E, 0xFF, 0xF0, 0x3F, 0xFF, 0x0F, - 0xFF, 0xE3, 0xC0, 0x3C, 0xF0, 0x07, 0x3C, 0x01, 0xCF, 0x00, 0x7B, 0xC0, - 0x1E, 0xF0, 0x07, 0x3C, 0x01, 0xCF, 0x00, 0xF3, 0xC0, 0xF8, 0xFF, 0xFC, - 0x3F, 0xFC, 0x0F, 0xFF, 0x03, 0xC1, 0xE0, 0xF0, 0x38, 0x3C, 0x0F, 0x0F, - 0x01, 0xC3, 0xC0, 0x78, 0xF0, 0x0F, 0x3C, 0x01, 0xCF, 0x00, 0x7B, 0xC0, - 0x0E, 0xF0, 0x03, 0xC0, 0x00, 0x80, 0x1F, 0xFC, 0x3F, 0xFE, 0x7E, 0x3E, - 0x70, 0x04, 0xF0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xF0, 0x00, 0x70, 0x00, - 0x78, 0x00, 0x3F, 0x00, 0x1F, 0xC0, 0x07, 0xF0, 0x01, 0xFC, 0x00, 0x7E, - 0x00, 0x1E, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x07, 0x00, 0x0F, 0x00, 0x0E, - 0x80, 0x1E, 0xFC, 0xFC, 0xFF, 0xF8, 0x7F, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0x80, 0x70, 0x00, 0x0E, 0x00, 0x01, 0xC0, 0x00, 0x38, - 0x00, 0x07, 0x00, 0x00, 0xE0, 0x00, 0x1C, 0x00, 0x03, 0x80, 0x00, 0x70, - 0x00, 0x0E, 0x00, 0x01, 0xC0, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0xE0, - 0x00, 0x1C, 0x00, 0x03, 0x80, 0x00, 0x70, 0x00, 0x0E, 0x00, 0x01, 0xC0, - 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xFE, 0x00, - 0x0F, 0xE0, 0x00, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0xFE, 0x00, 0x0F, 0xE0, - 0x00, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0xFE, - 0x00, 0x0F, 0xE0, 0x00, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0xFE, 0x00, 0x0F, - 0xE0, 0x00, 0xFE, 0x00, 0x0E, 0xF0, 0x00, 0xE7, 0x00, 0x0E, 0x78, 0x01, - 0xE3, 0xC0, 0x3C, 0x3F, 0x9F, 0x81, 0xFF, 0xF0, 0x07, 0xFE, 0x00, 0xF0, - 0x00, 0x3B, 0x80, 0x03, 0xDC, 0x00, 0x1C, 0xF0, 0x01, 0xE3, 0x80, 0x0F, - 0x1C, 0x00, 0x70, 0xF0, 0x07, 0x83, 0x80, 0x38, 0x1C, 0x01, 0xC0, 0xF0, - 0x1E, 0x03, 0x80, 0xE0, 0x1C, 0x07, 0x00, 0x70, 0x78, 0x03, 0x83, 0x80, - 0x1C, 0x1C, 0x00, 0x71, 0xE0, 0x03, 0x8E, 0x00, 0x1E, 0x70, 0x00, 0x77, - 0x80, 0x03, 0xB8, 0x00, 0x1D, 0xC0, 0x00, 0x7C, 0x00, 0x03, 0xE0, 0x00, - 0x1F, 0x00, 0x00, 0x70, 0x00, 0xF0, 0x03, 0xC0, 0x07, 0x70, 0x03, 0xC0, - 0x07, 0x70, 0x03, 0xE0, 0x0F, 0x78, 0x03, 0xE0, 0x0E, 0x38, 0x07, 0xE0, - 0x0E, 0x38, 0x07, 0x70, 0x0E, 0x38, 0x07, 0x70, 0x1E, 0x3C, 0x0E, 0x70, - 0x1C, 0x1C, 0x0E, 0x38, 0x1C, 0x1C, 0x0E, 0x38, 0x1C, 0x1C, 0x1E, 0x38, - 0x3C, 0x0E, 0x1C, 0x38, 0x38, 0x0E, 0x1C, 0x1C, 0x38, 0x0E, 0x1C, 0x1C, - 0x38, 0x0E, 0x38, 0x1C, 0x70, 0x07, 0x38, 0x0E, 0x70, 0x07, 0x38, 0x0E, - 0x70, 0x07, 0x30, 0x0E, 0x70, 0x07, 0x70, 0x0E, 0xE0, 0x03, 0xF0, 0x07, - 0xE0, 0x03, 0xF0, 0x07, 0xE0, 0x03, 0xE0, 0x07, 0xE0, 0x03, 0xE0, 0x03, - 0xC0, 0x01, 0xE0, 0x03, 0xC0, 0x01, 0xC0, 0x03, 0xC0, 0x78, 0x00, 0xF1, - 0xC0, 0x0F, 0x0F, 0x00, 0x70, 0x38, 0x07, 0x80, 0xE0, 0x38, 0x07, 0x83, - 0x80, 0x1C, 0x3C, 0x00, 0x71, 0xC0, 0x03, 0xDC, 0x00, 0x0F, 0xE0, 0x00, - 0x3E, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x80, 0x00, 0xFC, 0x00, 0x07, 0xF0, - 0x00, 0x73, 0x80, 0x03, 0x8E, 0x00, 0x38, 0x78, 0x03, 0xC1, 0xC0, 0x1C, - 0x07, 0x01, 0xC0, 0x3C, 0x1E, 0x00, 0xE0, 0xE0, 0x07, 0x8E, 0x00, 0x1E, - 0xF0, 0x00, 0x78, 0xF0, 0x00, 0xF7, 0x00, 0x0E, 0x78, 0x01, 0xE3, 0x80, - 0x1C, 0x1C, 0x03, 0x81, 0xC0, 0x38, 0x0E, 0x07, 0x00, 0xE0, 0xF0, 0x07, - 0x0E, 0x00, 0x79, 0xE0, 0x03, 0x9C, 0x00, 0x3F, 0xC0, 0x01, 0xF8, 0x00, - 0x1F, 0x80, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, - 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, - 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x7F, 0xFF, 0x9F, 0xFF, 0xE7, 0xFF, - 0xF8, 0x00, 0x1E, 0x00, 0x0F, 0x00, 0x03, 0x80, 0x01, 0xE0, 0x00, 0xF0, - 0x00, 0x38, 0x00, 0x1E, 0x00, 0x0F, 0x00, 0x03, 0x80, 0x01, 0xE0, 0x00, - 0xF0, 0x00, 0x38, 0x00, 0x1E, 0x00, 0x0F, 0x00, 0x03, 0x80, 0x01, 0xE0, - 0x00, 0xF0, 0x00, 0x38, 0x00, 0x1E, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, - 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, - 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xFF, 0xFF, 0xFF, 0xF0, 0x03, - 0x80, 0x1C, 0x00, 0x70, 0x03, 0x80, 0x1E, 0x00, 0x70, 0x03, 0x80, 0x0E, - 0x00, 0x70, 0x03, 0x80, 0x0E, 0x00, 0x70, 0x03, 0xC0, 0x0E, 0x00, 0x70, - 0x01, 0xC0, 0x0E, 0x00, 0x70, 0x01, 0xC0, 0x0E, 0x00, 0x70, 0x01, 0xC0, - 0x0E, 0x00, 0x38, 0xFF, 0xFF, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xFF, 0xFF, 0xFF, 0x01, 0xC0, - 0x00, 0x78, 0x00, 0x3E, 0x00, 0x0D, 0xC0, 0x03, 0x30, 0x01, 0xCE, 0x00, - 0x61, 0x80, 0x38, 0x70, 0x0C, 0x0C, 0x07, 0x03, 0x81, 0x80, 0x60, 0xE0, - 0x1C, 0x30, 0x03, 0x1C, 0x00, 0xE7, 0x00, 0x1B, 0x80, 0x07, 0xFF, 0xFF, - 0xFF, 0xFF, 0xF0, 0x78, 0x3C, 0x1C, 0x0E, 0x07, 0x0F, 0xF0, 0x7F, 0xF0, - 0xF9, 0xF1, 0x00, 0xF0, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x80, 0x07, 0x0F, - 0xFE, 0x7F, 0xFD, 0xE0, 0x3F, 0x80, 0x7E, 0x00, 0xFC, 0x01, 0xF8, 0x07, - 0xF0, 0x1F, 0xF8, 0xFE, 0xFF, 0xDC, 0xFF, 0x18, 0xE0, 0x00, 0x70, 0x00, - 0x38, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x03, 0x80, 0x01, 0xC0, - 0x00, 0xE7, 0xF0, 0x77, 0xFE, 0x3F, 0x9F, 0x9F, 0x01, 0xCF, 0x00, 0xF7, - 0x80, 0x3B, 0x80, 0x1D, 0xC0, 0x0F, 0xE0, 0x07, 0xF0, 0x01, 0xF8, 0x01, - 0xFC, 0x00, 0xFE, 0x00, 0x7F, 0x80, 0x3B, 0xC0, 0x1D, 0xF0, 0x1E, 0xFE, - 0x3E, 0x77, 0xFE, 0x31, 0xFE, 0x00, 0x07, 0xF8, 0x7F, 0xF3, 0xF7, 0x9E, - 0x00, 0x70, 0x03, 0xC0, 0x0E, 0x00, 0x38, 0x00, 0xE0, 0x03, 0x80, 0x0E, - 0x00, 0x38, 0x00, 0xE0, 0x03, 0xC0, 0x07, 0x00, 0x1E, 0x00, 0x3E, 0x38, - 0x7F, 0xE0, 0xFF, 0x80, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x00, 0xE0, 0x00, - 0x70, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x07, 0x0F, 0xE3, 0x8F, - 0xFD, 0xCF, 0x9F, 0xEF, 0x01, 0xF7, 0x00, 0x7F, 0x80, 0x3F, 0xC0, 0x1F, - 0xC0, 0x0F, 0xE0, 0x03, 0xF0, 0x01, 0xF8, 0x00, 0xFC, 0x00, 0x7E, 0x00, - 0x7F, 0x80, 0x3D, 0xC0, 0x1E, 0xF0, 0x1F, 0x3E, 0x3F, 0x8F, 0xFD, 0xC3, - 0xF8, 0xE0, 0x07, 0xF0, 0x1F, 0xF8, 0x3E, 0x3C, 0x78, 0x1E, 0x70, 0x0E, - 0x70, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, - 0xE0, 0x00, 0xE0, 0x00, 0xF0, 0x00, 0x70, 0x00, 0x78, 0x01, 0x3F, 0x1E, - 0x1F, 0xFE, 0x07, 0xFC, 0x03, 0xF8, 0x3F, 0x83, 0xFC, 0x3C, 0x01, 0xC0, - 0x0E, 0x00, 0x70, 0x03, 0x80, 0x7F, 0xE7, 0xFF, 0x3F, 0xF8, 0x38, 0x01, - 0xC0, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x38, - 0x01, 0xC0, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x07, 0x00, - 0x0F, 0xE3, 0x8F, 0xFD, 0xCF, 0x9F, 0xEF, 0x01, 0xF7, 0x00, 0x7F, 0x80, - 0x3F, 0x80, 0x1F, 0xC0, 0x07, 0xE0, 0x03, 0xF0, 0x01, 0xF8, 0x00, 0xFC, - 0x00, 0x7E, 0x00, 0x7F, 0x80, 0x3D, 0xC0, 0x1E, 0xF0, 0x1F, 0x3E, 0x3F, - 0x8F, 0xFD, 0xC3, 0xF8, 0xE0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x3C, 0x00, - 0x1C, 0x80, 0x1E, 0x78, 0x1E, 0x3F, 0xFF, 0x0F, 0xFE, 0x00, 0xE0, 0x00, - 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, - 0xE0, 0x00, 0xE3, 0xF8, 0xEF, 0xFC, 0xFE, 0x3E, 0xF8, 0x0E, 0xF0, 0x0F, - 0xF0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, - 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, - 0xE0, 0x07, 0xE0, 0x07, 0xFF, 0xF0, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFC, 0x07, 0x07, 0x07, 0x07, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x0F, 0xFE, 0xFC, - 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, - 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x1E, 0xE0, 0x3C, 0xE0, 0x78, 0xE0, 0xF0, - 0xE1, 0xE0, 0xE3, 0xC0, 0xE7, 0x80, 0xEF, 0x00, 0xEF, 0x00, 0xFF, 0x00, - 0xFF, 0x80, 0xF3, 0xC0, 0xE1, 0xE0, 0xE0, 0xE0, 0xE0, 0xF0, 0xE0, 0x78, - 0xE0, 0x3C, 0xE0, 0x1C, 0xE0, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0xE7, 0xF0, 0x7F, 0x1D, 0xFF, 0x9F, 0xFB, - 0xF9, 0xF7, 0x9F, 0x7C, 0x0F, 0xC0, 0xFF, 0x00, 0xF0, 0x0F, 0xE0, 0x1C, - 0x01, 0xF8, 0x03, 0x80, 0x3F, 0x00, 0x70, 0x07, 0xE0, 0x0E, 0x00, 0xFC, - 0x01, 0xC0, 0x1F, 0x80, 0x38, 0x03, 0xF0, 0x07, 0x00, 0x7E, 0x00, 0xE0, - 0x0F, 0xC0, 0x1C, 0x01, 0xF8, 0x03, 0x80, 0x3F, 0x00, 0x70, 0x07, 0xE0, - 0x0E, 0x00, 0xFC, 0x01, 0xC0, 0x1F, 0x80, 0x38, 0x03, 0x80, 0xE3, 0xF8, - 0xEF, 0xFC, 0xFF, 0x3E, 0xF8, 0x0E, 0xF0, 0x0F, 0xF0, 0x07, 0xE0, 0x07, - 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, - 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, - 0x07, 0xF0, 0x0F, 0xFE, 0x0F, 0xCF, 0x8F, 0x01, 0xE7, 0x00, 0x77, 0x80, - 0x1F, 0x80, 0x0F, 0xC0, 0x07, 0xE0, 0x03, 0xF0, 0x01, 0xF8, 0x00, 0xFC, - 0x00, 0x7E, 0x00, 0x3B, 0x80, 0x1D, 0xC0, 0x1C, 0xF0, 0x1E, 0x3E, 0x1E, - 0x0F, 0xFE, 0x01, 0xFE, 0x00, 0xE3, 0xF0, 0x77, 0xFE, 0x3F, 0x9F, 0x9F, - 0x01, 0xCF, 0x00, 0xF7, 0x80, 0x3B, 0x80, 0x1D, 0xC0, 0x0F, 0xE0, 0x07, - 0xF0, 0x01, 0xF8, 0x01, 0xFC, 0x00, 0xFE, 0x00, 0x77, 0x80, 0x3B, 0xC0, - 0x3D, 0xF0, 0x1C, 0xFC, 0x3E, 0x77, 0xFE, 0x39, 0xFE, 0x1C, 0x00, 0x0E, - 0x00, 0x07, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x00, 0xE0, 0x00, 0x70, 0x00, - 0x38, 0x00, 0x00, 0x0F, 0xE3, 0x8F, 0xFD, 0xCF, 0x9E, 0xEF, 0x01, 0xF7, - 0x00, 0x7F, 0x80, 0x3F, 0xC0, 0x1F, 0xC0, 0x0F, 0xE0, 0x03, 0xF0, 0x01, - 0xF8, 0x00, 0xFC, 0x00, 0x7E, 0x00, 0x7F, 0x80, 0x3D, 0xC0, 0x1E, 0xF0, - 0x1F, 0x3E, 0x3F, 0x8F, 0xFD, 0xC3, 0xF8, 0xE0, 0x00, 0x70, 0x00, 0x38, - 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x00, - 0xE0, 0xE3, 0xFC, 0xFF, 0xBF, 0xFE, 0x0F, 0x81, 0xE0, 0x38, 0x07, 0x00, - 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, - 0x1C, 0x03, 0x80, 0x00, 0x1F, 0xF3, 0xFF, 0xFE, 0x3D, 0xC0, 0x0E, 0x00, - 0x70, 0x03, 0xC0, 0x0F, 0x80, 0x3F, 0x00, 0xFF, 0x00, 0xFC, 0x01, 0xF0, - 0x03, 0x80, 0x1C, 0x00, 0xF0, 0x07, 0xE0, 0xFF, 0xFF, 0x9F, 0xF0, 0x18, - 0x03, 0x00, 0x60, 0x1C, 0x07, 0xFF, 0xFF, 0xFF, 0xF9, 0xC0, 0x38, 0x07, - 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00, - 0xE0, 0x1E, 0x01, 0xE2, 0x3F, 0xC3, 0xF8, 0xE0, 0x07, 0xE0, 0x07, 0xE0, - 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, - 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x0F, 0xE0, 0x0F, 0xE0, - 0x0F, 0xF0, 0x1F, 0x78, 0x7F, 0x7F, 0xF7, 0x1F, 0xC7, 0xE0, 0x03, 0xDC, - 0x00, 0xE7, 0x00, 0x39, 0xE0, 0x1E, 0x38, 0x07, 0x0E, 0x01, 0xC3, 0xC0, - 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x03, 0x87, 0x00, 0xE1, 0xC0, 0x38, 0xF0, - 0x07, 0x38, 0x01, 0xCE, 0x00, 0x77, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, - 0x78, 0x00, 0x1E, 0x00, 0xF0, 0x0F, 0x00, 0xEE, 0x01, 0xE0, 0x1D, 0xC0, - 0x7C, 0x07, 0xB8, 0x0F, 0xC0, 0xE3, 0x81, 0xF8, 0x1C, 0x70, 0x77, 0x03, - 0x8E, 0x0E, 0x70, 0xF1, 0xE1, 0xCE, 0x1C, 0x1C, 0x31, 0xC3, 0x83, 0x8E, - 0x18, 0x70, 0x71, 0xC3, 0x9C, 0x07, 0x30, 0x73, 0x80, 0xEE, 0x0E, 0x70, - 0x1D, 0xC0, 0xEE, 0x03, 0xB8, 0x1F, 0x80, 0x36, 0x03, 0xF0, 0x07, 0xC0, - 0x3E, 0x00, 0xF8, 0x07, 0x80, 0x1E, 0x00, 0xF0, 0x00, 0xF0, 0x07, 0xB8, - 0x07, 0x8E, 0x03, 0x87, 0x83, 0x81, 0xE3, 0xC0, 0x73, 0xC0, 0x3D, 0xC0, - 0x0F, 0xC0, 0x03, 0xE0, 0x01, 0xE0, 0x00, 0xF8, 0x00, 0xFE, 0x00, 0xF7, - 0x00, 0x71, 0xC0, 0x70, 0xF0, 0x78, 0x3C, 0x78, 0x0E, 0x38, 0x07, 0xB8, - 0x01, 0xE0, 0xF0, 0x03, 0xDC, 0x00, 0xE7, 0x00, 0x39, 0xE0, 0x1E, 0x38, - 0x07, 0x0E, 0x01, 0xC1, 0xC0, 0xF0, 0x70, 0x38, 0x1E, 0x0E, 0x03, 0x87, - 0x00, 0xE1, 0xC0, 0x1C, 0x70, 0x07, 0x38, 0x01, 0xCE, 0x00, 0x3B, 0x80, - 0x0F, 0xC0, 0x01, 0xF0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x07, 0x80, 0x01, - 0xC0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x0F, 0x00, 0x3F, 0xC0, - 0x0F, 0xC0, 0x00, 0x7F, 0xFD, 0xFF, 0xF7, 0xFF, 0xC0, 0x0E, 0x00, 0x78, - 0x03, 0xC0, 0x0E, 0x00, 0x70, 0x03, 0xC0, 0x0E, 0x00, 0x70, 0x03, 0xC0, - 0x1E, 0x00, 0x70, 0x03, 0x80, 0x1E, 0x00, 0x70, 0x03, 0xFF, 0xFF, 0xFF, - 0xC0, 0x00, 0xE0, 0x7C, 0x1F, 0x83, 0x80, 0xF0, 0x1C, 0x03, 0x80, 0x70, - 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x7C, 0x3E, 0x07, 0x80, 0xFC, - 0x03, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, - 0xC0, 0x3C, 0x03, 0xC0, 0x7E, 0x03, 0xC0, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xF0, 0x1F, - 0x81, 0xF0, 0x0F, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0, - 0x38, 0x07, 0x00, 0xF0, 0x0F, 0x00, 0xF8, 0x0F, 0x07, 0xE1, 0xE0, 0x38, - 0x07, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x1F, - 0x0F, 0xC1, 0xF0, 0x30, 0x00, 0x1C, 0x01, 0xFF, 0x81, 0xFF, 0xFF, 0xC1, - 0xFF, 0x80, 0x3C }; - -const GFXglyph NotoSans_Regular18pt7bGlyphs[] PROGMEM = { - { 0, 1, 1, 9, 0, 0 }, // 0x20 ' ' - { 1, 4, 26, 9, 3, -24 }, // 0x21 '!' - { 14, 10, 9, 14, 2, -24 }, // 0x22 '"' - { 26, 21, 25, 23, 1, -24 }, // 0x23 '#' - { 92, 16, 29, 20, 2, -26 }, // 0x24 '$' - { 150, 26, 26, 29, 2, -25 }, // 0x25 '%' - { 235, 24, 26, 26, 2, -25 }, // 0x26 '&' - { 313, 4, 9, 8, 2, -24 }, // 0x27 ''' - { 318, 9, 31, 11, 1, -24 }, // 0x28 '(' - { 353, 8, 31, 11, 1, -24 }, // 0x29 ')' - { 384, 17, 16, 19, 1, -26 }, // 0x2A '*' - { 418, 16, 17, 20, 2, -20 }, // 0x2B '+' - { 452, 6, 9, 9, 1, -3 }, // 0x2C ',' - { 459, 9, 3, 11, 1, -10 }, // 0x2D '-' - { 463, 4, 5, 9, 3, -3 }, // 0x2E '.' - { 466, 13, 25, 13, 0, -24 }, // 0x2F '/' - { 507, 16, 26, 20, 2, -25 }, // 0x30 '0' - { 559, 10, 25, 20, 3, -24 }, // 0x31 '1' - { 591, 16, 26, 20, 2, -25 }, // 0x32 '2' - { 643, 16, 26, 20, 2, -25 }, // 0x33 '3' - { 695, 18, 25, 20, 1, -24 }, // 0x34 '4' - { 752, 16, 25, 20, 2, -24 }, // 0x35 '5' - { 802, 17, 26, 20, 2, -25 }, // 0x36 '6' - { 858, 16, 25, 20, 2, -24 }, // 0x37 '7' - { 908, 16, 26, 20, 2, -25 }, // 0x38 '8' - { 960, 16, 26, 20, 2, -25 }, // 0x39 '9' - { 1012, 4, 20, 9, 3, -18 }, // 0x3A ':' - { 1022, 6, 24, 9, 1, -18 }, // 0x3B ';' - { 1040, 16, 17, 20, 2, -20 }, // 0x3C '<' - { 1074, 16, 9, 20, 2, -16 }, // 0x3D '=' - { 1092, 16, 17, 20, 2, -20 }, // 0x3E '>' - { 1126, 14, 27, 15, 0, -25 }, // 0x3F '?' - { 1174, 28, 28, 32, 2, -24 }, // 0x40 '@' - { 1272, 22, 25, 23, 0, -24 }, // 0x41 'A' - { 1341, 18, 25, 23, 3, -24 }, // 0x42 'B' - { 1398, 19, 26, 22, 2, -25 }, // 0x43 'C' - { 1460, 21, 25, 26, 3, -24 }, // 0x44 'D' - { 1526, 14, 25, 20, 3, -24 }, // 0x45 'E' - { 1570, 14, 25, 18, 3, -24 }, // 0x46 'F' - { 1614, 21, 26, 26, 2, -25 }, // 0x47 'G' - { 1683, 20, 25, 26, 3, -24 }, // 0x48 'H' - { 1746, 10, 25, 12, 1, -24 }, // 0x49 'I' - { 1778, 9, 32, 10, -3, -24 }, // 0x4A 'J' - { 1814, 19, 25, 22, 3, -24 }, // 0x4B 'K' - { 1874, 15, 25, 18, 3, -24 }, // 0x4C 'L' - { 1921, 26, 25, 32, 3, -24 }, // 0x4D 'M' - { 2003, 20, 25, 27, 3, -24 }, // 0x4E 'N' - { 2066, 23, 26, 28, 2, -25 }, // 0x4F 'O' - { 2141, 17, 25, 21, 3, -24 }, // 0x50 'P' - { 2195, 23, 32, 28, 2, -25 }, // 0x51 'Q' - { 2287, 18, 25, 22, 3, -24 }, // 0x52 'R' - { 2344, 16, 26, 19, 2, -25 }, // 0x53 'S' - { 2396, 19, 25, 20, 0, -24 }, // 0x54 'T' - { 2456, 20, 25, 26, 3, -24 }, // 0x55 'U' - { 2519, 21, 25, 21, 0, -24 }, // 0x56 'V' - { 2585, 32, 25, 33, 0, -24 }, // 0x57 'W' - { 2685, 21, 25, 21, 0, -24 }, // 0x58 'X' - { 2751, 20, 25, 20, 0, -24 }, // 0x59 'Y' - { 2814, 18, 25, 20, 1, -24 }, // 0x5A 'Z' - { 2871, 8, 31, 12, 3, -24 }, // 0x5B '[' - { 2902, 13, 25, 13, 0, -24 }, // 0x5C '\' - { 2943, 8, 31, 12, 1, -24 }, // 0x5D ']' - { 2974, 18, 16, 20, 1, -24 }, // 0x5E '^' - { 3010, 16, 2, 16, 0, 4 }, // 0x5F '_' - { 3014, 8, 6, 10, 1, -26 }, // 0x60 '`' - { 3020, 15, 19, 20, 2, -18 }, // 0x61 'a' - { 3056, 17, 27, 22, 3, -26 }, // 0x62 'b' - { 3114, 14, 19, 17, 2, -18 }, // 0x63 'c' - { 3148, 17, 27, 22, 2, -26 }, // 0x64 'd' - { 3206, 16, 19, 20, 2, -18 }, // 0x65 'e' - { 3244, 13, 27, 12, 1, -26 }, // 0x66 'f' - { 3288, 17, 27, 22, 2, -18 }, // 0x67 'g' - { 3346, 16, 27, 22, 3, -26 }, // 0x68 'h' - { 3400, 3, 26, 9, 3, -25 }, // 0x69 'i' - { 3410, 8, 34, 9, -2, -25 }, // 0x6A 'j' - { 3444, 16, 27, 19, 3, -26 }, // 0x6B 'k' - { 3498, 3, 27, 9, 3, -26 }, // 0x6C 'l' - { 3509, 27, 19, 33, 3, -18 }, // 0x6D 'm' - { 3574, 16, 19, 22, 3, -18 }, // 0x6E 'n' - { 3612, 17, 19, 21, 2, -18 }, // 0x6F 'o' - { 3653, 17, 27, 22, 3, -18 }, // 0x70 'p' - { 3711, 17, 27, 22, 2, -18 }, // 0x71 'q' - { 3769, 11, 19, 15, 3, -18 }, // 0x72 'r' - { 3796, 13, 19, 17, 2, -18 }, // 0x73 's' - { 3827, 11, 23, 13, 1, -22 }, // 0x74 't' - { 3859, 16, 19, 22, 3, -18 }, // 0x75 'u' - { 3897, 18, 19, 18, 0, -18 }, // 0x76 'v' - { 3940, 27, 19, 28, 0, -18 }, // 0x77 'w' - { 4005, 17, 19, 19, 1, -18 }, // 0x78 'x' - { 4046, 18, 27, 18, 0, -18 }, // 0x79 'y' - { 4107, 14, 19, 17, 1, -18 }, // 0x7A 'z' - { 4141, 11, 31, 13, 1, -24 }, // 0x7B '{' - { 4184, 3, 36, 19, 8, -26 }, // 0x7C '|' - { 4198, 11, 31, 13, 1, -24 }, // 0x7D '}' - { 4241, 16, 5, 20, 2, -14 } }; // 0x7E '~' - -const GFXfont NotoSans_Regular18pt7b PROGMEM = { - (uint8_t *)NotoSans_Regular18pt7bBitmaps, - (GFXglyph *)NotoSans_Regular18pt7bGlyphs, - 0x20, 0x7E, 48 }; - -// Approx. 4923 bytes - -#endif // NOTOSANS18PT7B_H diff --git a/examples/companion_radio/ui-new/fonts/NotoSans20pt7b.h b/examples/companion_radio/ui-new/fonts/NotoSans20pt7b.h deleted file mode 100644 index 30556cd6..00000000 --- a/examples/companion_radio/ui-new/fonts/NotoSans20pt7b.h +++ /dev/null @@ -1,545 +0,0 @@ -#ifndef NOTOSANS20PT7B_H -#define NOTOSANS20PT7B_H -const uint8_t NotoSans_Regular20pt7bBitmaps[] PROGMEM = { - 0x00, 0xF7, 0xBD, 0xEF, 0x7B, 0xCE, 0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x73, - 0x98, 0xC0, 0x00, 0x0C, 0xF7, 0xFF, 0xE2, 0x00, 0xE1, 0xF8, 0x7E, 0x1F, - 0x87, 0xE1, 0xF8, 0x7E, 0x1F, 0x87, 0xE1, 0xF8, 0x70, 0x00, 0x70, 0x70, - 0x01, 0xC0, 0xE0, 0x03, 0x81, 0x80, 0x07, 0x03, 0x00, 0x0E, 0x0E, 0x00, - 0x1C, 0x1C, 0x00, 0x70, 0x38, 0x00, 0xE0, 0x60, 0x7F, 0xFF, 0xFE, 0xFF, - 0xFF, 0xFD, 0xFF, 0xFF, 0xF8, 0x0C, 0x0E, 0x00, 0x38, 0x1C, 0x00, 0x70, - 0x70, 0x00, 0xE0, 0xE0, 0x01, 0xC1, 0xC0, 0x03, 0x03, 0x81, 0xFF, 0xFF, - 0xFB, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xE0, 0x70, 0x70, 0x00, 0xC0, 0xE0, - 0x03, 0x81, 0xC0, 0x07, 0x03, 0x00, 0x0E, 0x0E, 0x00, 0x1C, 0x1C, 0x00, - 0x30, 0x38, 0x00, 0xE0, 0x70, 0x00, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x0C, - 0x00, 0x03, 0x00, 0x0F, 0xFF, 0x07, 0xFF, 0xE3, 0xFF, 0xF9, 0xE3, 0x04, - 0x70, 0xC0, 0x3C, 0x30, 0x0F, 0x0C, 0x01, 0xC3, 0x00, 0x78, 0xC0, 0x1F, - 0xB0, 0x03, 0xFC, 0x00, 0x3F, 0xE0, 0x03, 0xFE, 0x00, 0x3F, 0xE0, 0x0C, - 0xFC, 0x03, 0x0F, 0x00, 0xC1, 0xC0, 0x30, 0x70, 0x0C, 0x1E, 0x03, 0x0F, - 0xF0, 0xCF, 0xBF, 0xFF, 0xEF, 0xFF, 0xE0, 0x7F, 0xE0, 0x00, 0xC0, 0x00, - 0x30, 0x00, 0x0C, 0x00, 0x03, 0x00, 0x1F, 0x80, 0x0F, 0x01, 0xFE, 0x00, - 0x70, 0x1C, 0x70, 0x07, 0x00, 0xE1, 0xC0, 0x38, 0x0E, 0x0E, 0x03, 0x80, - 0x70, 0x70, 0x3C, 0x03, 0x81, 0x81, 0xC0, 0x1C, 0x0C, 0x1C, 0x00, 0xE0, - 0x70, 0xE0, 0x07, 0x03, 0x0E, 0x00, 0x38, 0x18, 0x70, 0x01, 0xC1, 0xC7, - 0x1F, 0x0E, 0x0E, 0x39, 0xFE, 0x38, 0x73, 0x9E, 0xF1, 0xEF, 0x3C, 0xE1, - 0xC7, 0xF9, 0xCE, 0x0E, 0x1F, 0x1C, 0x70, 0x30, 0x00, 0xE3, 0x81, 0xC0, - 0x0E, 0x1C, 0x0E, 0x00, 0x70, 0xE0, 0x70, 0x07, 0x07, 0x03, 0x80, 0x38, - 0x38, 0x1C, 0x03, 0x81, 0xC0, 0xC0, 0x1C, 0x0E, 0x0E, 0x01, 0xC0, 0x38, - 0x70, 0x1C, 0x01, 0xC7, 0x00, 0xE0, 0x07, 0xF8, 0x0E, 0x00, 0x1F, 0x80, - 0x03, 0xFC, 0x00, 0x01, 0xFF, 0xC0, 0x00, 0x7E, 0xFC, 0x00, 0x0F, 0x07, - 0x80, 0x01, 0xC0, 0x78, 0x00, 0x38, 0x0F, 0x00, 0x07, 0x01, 0xE0, 0x00, - 0xE0, 0x38, 0x00, 0x1E, 0x0F, 0x00, 0x01, 0xE3, 0xC0, 0x00, 0x3E, 0xF0, - 0x00, 0x03, 0xFC, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x07, - 0xFE, 0x01, 0xE1, 0xF3, 0xE0, 0x38, 0x7C, 0x3E, 0x07, 0x0F, 0x03, 0xE1, - 0xE3, 0xC0, 0x3E, 0x38, 0x78, 0x03, 0xEF, 0x0F, 0x00, 0x3F, 0xC1, 0xE0, - 0x03, 0xF8, 0x3C, 0x00, 0x3E, 0x07, 0xC0, 0x0F, 0xE0, 0x7C, 0x07, 0xFE, - 0x07, 0xFF, 0xFB, 0xE0, 0x7F, 0xFC, 0x3E, 0x07, 0xFE, 0x03, 0xF0, 0xFF, - 0xFF, 0xFF, 0xFC, 0x07, 0x87, 0x87, 0x83, 0x83, 0xC1, 0xC1, 0xE0, 0xF0, - 0x70, 0x78, 0x3C, 0x1E, 0x0E, 0x07, 0x03, 0x81, 0xC0, 0xE0, 0x70, 0x38, - 0x1C, 0x0E, 0x07, 0x03, 0xC1, 0xE0, 0xF0, 0x38, 0x1E, 0x0F, 0x03, 0x81, - 0xE0, 0x70, 0x3C, 0x0E, 0x03, 0xC0, 0xF0, 0x3C, 0x0E, 0x07, 0x81, 0xC0, - 0xF0, 0x38, 0x1E, 0x0F, 0x03, 0x81, 0xC0, 0xF0, 0x78, 0x3C, 0x0E, 0x07, - 0x03, 0x81, 0xC0, 0xE0, 0x70, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x07, 0x83, - 0xC1, 0xC1, 0xE0, 0xF0, 0xF0, 0x70, 0x78, 0x78, 0x00, 0x01, 0xE0, 0x00, - 0x70, 0x00, 0x1C, 0x00, 0x07, 0x00, 0x01, 0xC0, 0x00, 0x70, 0x0E, 0x1C, - 0x3B, 0xFB, 0x7F, 0xFF, 0xFF, 0xC7, 0xFF, 0x80, 0x3E, 0x00, 0x1D, 0xC0, - 0x07, 0x78, 0x03, 0xCE, 0x01, 0xE3, 0xC0, 0xF8, 0x78, 0x1C, 0x1C, 0x01, - 0x02, 0x00, 0x00, 0xE0, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x03, 0x80, 0x00, - 0xE0, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x03, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFC, 0x03, 0x80, 0x00, 0xE0, 0x00, 0x38, 0x00, 0x0E, 0x00, - 0x03, 0x80, 0x00, 0xE0, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x3D, 0xE7, 0x9E, - 0x71, 0xCF, 0x38, 0xE3, 0x00, 0xFF, 0xFF, 0xFF, 0xE0, 0x67, 0xBF, 0xFF, - 0x10, 0x00, 0x1C, 0x00, 0xF0, 0x03, 0x80, 0x0E, 0x00, 0x78, 0x01, 0xC0, - 0x0F, 0x00, 0x38, 0x00, 0xE0, 0x07, 0x80, 0x1C, 0x00, 0x70, 0x03, 0xC0, - 0x0E, 0x00, 0x78, 0x01, 0xC0, 0x07, 0x00, 0x3C, 0x00, 0xE0, 0x03, 0x80, - 0x1E, 0x00, 0x70, 0x03, 0xC0, 0x0E, 0x00, 0x38, 0x01, 0xE0, 0x07, 0x00, - 0x3C, 0x00, 0x07, 0xF8, 0x03, 0xFF, 0x81, 0xFF, 0xF0, 0xF0, 0x3C, 0x78, - 0x07, 0x9E, 0x00, 0xE7, 0x00, 0x3D, 0xC0, 0x0F, 0xF0, 0x01, 0xFC, 0x00, - 0x7F, 0x00, 0x1F, 0x80, 0x07, 0xE0, 0x01, 0xF8, 0x00, 0x7E, 0x00, 0x1F, - 0x80, 0x07, 0xE0, 0x01, 0xFC, 0x00, 0x7F, 0x00, 0x1F, 0xC0, 0x07, 0x70, - 0x03, 0xDC, 0x00, 0xF7, 0x80, 0x38, 0xE0, 0x1E, 0x3C, 0x0F, 0x07, 0xFF, - 0xC0, 0xFF, 0xE0, 0x1F, 0xE0, 0x01, 0xE0, 0x7C, 0x1F, 0x87, 0xF3, 0xEF, - 0xF9, 0xDC, 0x39, 0x07, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, - 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0, - 0x38, 0x07, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0F, 0xF8, 0x0F, 0xFF, - 0x87, 0xFF, 0xF3, 0xE0, 0x3C, 0x60, 0x07, 0x80, 0x01, 0xE0, 0x00, 0x38, - 0x00, 0x0E, 0x00, 0x03, 0x80, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x1C, 0x00, - 0x0F, 0x00, 0x07, 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00, 0x78, - 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xC0, 0x01, - 0xE0, 0x00, 0x70, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, - 0xF8, 0x1F, 0xFF, 0x8F, 0xFF, 0xF1, 0xC0, 0x3E, 0x40, 0x07, 0x80, 0x00, - 0xE0, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, 0xF0, - 0x00, 0xF8, 0x0F, 0xFC, 0x03, 0xFC, 0x00, 0xFF, 0xE0, 0x00, 0x7C, 0x00, - 0x07, 0x80, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x07, 0x00, 0x01, 0xC0, 0x00, - 0xF0, 0x00, 0x3C, 0x00, 0x1F, 0xC0, 0x0F, 0xBF, 0xFF, 0xCF, 0xFF, 0xE1, - 0xFF, 0xE0, 0x00, 0x07, 0x80, 0x00, 0x7C, 0x00, 0x07, 0xE0, 0x00, 0x7F, - 0x00, 0x03, 0xF8, 0x00, 0x3B, 0xC0, 0x03, 0xDE, 0x00, 0x1C, 0xF0, 0x01, - 0xC7, 0x80, 0x1E, 0x3C, 0x00, 0xE1, 0xE0, 0x0E, 0x0F, 0x00, 0xE0, 0x78, - 0x0F, 0x03, 0xC0, 0x70, 0x1E, 0x07, 0x00, 0xF0, 0x78, 0x07, 0x83, 0x80, - 0x3C, 0x38, 0x01, 0xE1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, - 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x3C, 0x00, 0x01, - 0xE0, 0x00, 0x0F, 0x00, 0x3F, 0xFF, 0x0F, 0xFF, 0xC3, 0xFF, 0xF0, 0xE0, - 0x00, 0x38, 0x00, 0x0E, 0x00, 0x03, 0x80, 0x00, 0xE0, 0x00, 0x38, 0x00, - 0x1E, 0x00, 0x07, 0x80, 0x01, 0xFF, 0xE0, 0x7F, 0xFE, 0x0F, 0xFF, 0xC0, - 0x00, 0xF8, 0x00, 0x1E, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x1C, 0x00, - 0x07, 0x00, 0x01, 0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x1E, 0xC0, 0x0F, - 0xBF, 0xFF, 0xCF, 0xFF, 0xE0, 0xFF, 0xE0, 0x00, 0xFF, 0x00, 0x7F, 0xE0, - 0x3F, 0xEC, 0x07, 0x80, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x0E, 0x00, 0x03, - 0xC0, 0x00, 0x70, 0x00, 0x0E, 0x00, 0x01, 0xC0, 0x80, 0x79, 0xFF, 0x0F, - 0x7F, 0xF1, 0xFE, 0x1F, 0x3F, 0x00, 0xF7, 0xC0, 0x1E, 0xF0, 0x01, 0xDE, - 0x00, 0x3B, 0xC0, 0x07, 0xF8, 0x00, 0xF7, 0x00, 0x1C, 0xE0, 0x03, 0x9E, - 0x00, 0x71, 0xC0, 0x1E, 0x3C, 0x07, 0x83, 0xFF, 0xF0, 0x3F, 0xFC, 0x01, - 0xFE, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x07, 0x00, - 0x03, 0xC0, 0x00, 0xE0, 0x00, 0x78, 0x00, 0x1C, 0x00, 0x0F, 0x00, 0x03, - 0x80, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0x80, - 0x01, 0xE0, 0x00, 0x70, 0x00, 0x3C, 0x00, 0x0E, 0x00, 0x07, 0x80, 0x01, - 0xE0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x07, 0x80, 0x03, 0xC0, - 0x00, 0xF0, 0x00, 0x78, 0x00, 0x07, 0xFC, 0x07, 0xFF, 0x83, 0xFB, 0xF1, - 0xF0, 0x1E, 0x78, 0x03, 0x9C, 0x00, 0xE7, 0x00, 0x3D, 0xC0, 0x0E, 0x78, - 0x03, 0x8E, 0x01, 0xE3, 0xE0, 0xF0, 0x7E, 0xF8, 0x0F, 0xF8, 0x01, 0xFE, - 0x00, 0xFF, 0xE0, 0xF8, 0xFC, 0x7C, 0x0F, 0x9E, 0x00, 0xFF, 0x00, 0x3F, - 0x80, 0x07, 0xE0, 0x01, 0xF8, 0x00, 0x7F, 0x00, 0x1F, 0xC0, 0x0F, 0x78, - 0x07, 0xDF, 0xCF, 0xE3, 0xFF, 0xF0, 0x3F, 0xF0, 0x07, 0xF8, 0x07, 0xFF, - 0x03, 0xFF, 0xE1, 0xF0, 0x3C, 0x78, 0x07, 0xBC, 0x00, 0xEF, 0x00, 0x3F, - 0x80, 0x07, 0xE0, 0x01, 0xF8, 0x00, 0x7E, 0x00, 0x1F, 0xC0, 0x0F, 0xF0, - 0x03, 0xDE, 0x01, 0xF7, 0xE1, 0xFC, 0xFF, 0xF7, 0x0F, 0xF1, 0xC0, 0x40, - 0x70, 0x00, 0x3C, 0x00, 0x0E, 0x00, 0x03, 0x80, 0x01, 0xE0, 0x00, 0x70, - 0x00, 0x3C, 0x00, 0x3E, 0x0C, 0xFF, 0x03, 0xFF, 0x80, 0xFF, 0x80, 0x27, - 0xBF, 0xFF, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x3D, 0xFF, - 0xF8, 0x80, 0x08, 0x78, 0xF9, 0xF3, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0xF1, 0xE3, 0x8F, 0x1E, 0x38, 0x70, - 0xC3, 0x80, 0x00, 0x00, 0x40, 0x00, 0x30, 0x00, 0x3C, 0x00, 0x3F, 0x00, - 0x3F, 0x00, 0x3F, 0x00, 0x3F, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3E, 0x00, - 0x0F, 0x00, 0x03, 0xF8, 0x00, 0x1F, 0x80, 0x01, 0xFC, 0x00, 0x1F, 0xC0, - 0x01, 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0xF0, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x80, 0x00, - 0x38, 0x00, 0x0F, 0x80, 0x03, 0xF8, 0x00, 0x1F, 0x80, 0x01, 0xF8, 0x00, - 0x1F, 0x80, 0x01, 0xF8, 0x00, 0x1F, 0x80, 0x01, 0xF0, 0x00, 0x3C, 0x00, - 0x3F, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x7E, 0x00, 0xFE, 0x00, 0xFE, 0x00, - 0x3C, 0x00, 0x0C, 0x00, 0x00, 0x1F, 0xF0, 0xFF, 0xFC, 0x7F, 0xFE, 0x70, - 0x1E, 0x00, 0x0F, 0x00, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x0F, 0x00, - 0x0E, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0x78, 0x00, 0xF0, 0x01, 0xE0, 0x03, - 0xC0, 0x03, 0x80, 0x03, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x03, 0x00, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0x07, - 0x80, 0x01, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x03, - 0xFF, 0xFE, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x78, 0x00, 0x0F, 0x01, 0xE0, - 0x00, 0x0E, 0x07, 0x80, 0x00, 0x0E, 0x0E, 0x00, 0x00, 0x0E, 0x38, 0x07, - 0xFC, 0x1C, 0x70, 0x3F, 0xF8, 0x39, 0xC0, 0xF0, 0x70, 0x3B, 0x83, 0xC0, - 0xE0, 0x77, 0x07, 0x01, 0xC0, 0xEC, 0x1E, 0x03, 0x81, 0xF8, 0x38, 0x07, - 0x03, 0xF0, 0x70, 0x0E, 0x07, 0xE0, 0xE0, 0x1C, 0x0F, 0xC1, 0xC0, 0x38, - 0x1F, 0x83, 0x80, 0xF0, 0x77, 0x03, 0x81, 0xE0, 0xE6, 0x07, 0x87, 0xE3, - 0x8E, 0x07, 0xFD, 0xFF, 0x1C, 0x0F, 0xF1, 0xFC, 0x38, 0x03, 0x80, 0xE0, - 0x38, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, - 0x78, 0x00, 0x10, 0x00, 0x7E, 0x01, 0xE0, 0x00, 0x3F, 0xFF, 0xC0, 0x00, - 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x0F, - 0x80, 0x00, 0x07, 0xE0, 0x00, 0x07, 0x70, 0x00, 0x03, 0xB8, 0x00, 0x03, - 0xDE, 0x00, 0x01, 0xC7, 0x00, 0x00, 0xE3, 0x80, 0x00, 0xF1, 0xE0, 0x00, - 0x70, 0x70, 0x00, 0x78, 0x3C, 0x00, 0x38, 0x0E, 0x00, 0x1C, 0x07, 0x00, - 0x1E, 0x03, 0xC0, 0x0E, 0x00, 0xE0, 0x0F, 0xFF, 0xF8, 0x07, 0xFF, 0xFC, - 0x03, 0xFF, 0xFE, 0x03, 0xC0, 0x07, 0x81, 0xC0, 0x03, 0xC0, 0xE0, 0x00, - 0xE0, 0xF0, 0x00, 0x78, 0x70, 0x00, 0x1C, 0x78, 0x00, 0x0F, 0x3C, 0x00, - 0x07, 0x9C, 0x00, 0x01, 0xDE, 0x00, 0x00, 0xF0, 0xFF, 0xF8, 0x1F, 0xFF, - 0xE3, 0xFF, 0xFE, 0x70, 0x07, 0xEE, 0x00, 0x3D, 0xC0, 0x07, 0xB8, 0x00, - 0x77, 0x00, 0x0E, 0xE0, 0x01, 0xDC, 0x00, 0x7B, 0x80, 0x0E, 0x70, 0x07, - 0xCF, 0xFF, 0xE1, 0xFF, 0xF8, 0x3F, 0xFF, 0xE7, 0x00, 0x3E, 0xE0, 0x03, - 0xFC, 0x00, 0x3F, 0x80, 0x07, 0xF0, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x03, - 0xF8, 0x00, 0x7F, 0x00, 0x1F, 0xE0, 0x07, 0xDF, 0xFF, 0xF3, 0xFF, 0xFC, - 0x7F, 0xFE, 0x00, 0x00, 0x7F, 0xF0, 0x0F, 0xFF, 0xF0, 0x7F, 0xFF, 0x83, - 0xF0, 0x0E, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x03, 0xC0, 0x00, 0x1F, 0x00, - 0x00, 0x78, 0x00, 0x01, 0xE0, 0x00, 0x07, 0x00, 0x00, 0x1C, 0x00, 0x00, - 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x3C, 0x00, 0x00, 0xF0, - 0x00, 0x01, 0xC0, 0x00, 0x07, 0x80, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, - 0x00, 0xF0, 0x00, 0x03, 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x0F, 0x80, 0x10, - 0x1F, 0xFF, 0xC0, 0x3F, 0xFF, 0x00, 0x3F, 0xFC, 0xFF, 0xF8, 0x03, 0xFF, - 0xFC, 0x0F, 0xFF, 0xF8, 0x38, 0x03, 0xF0, 0xE0, 0x03, 0xE3, 0x80, 0x03, - 0xCE, 0x00, 0x0F, 0xB8, 0x00, 0x1E, 0xE0, 0x00, 0x3B, 0x80, 0x00, 0xFE, - 0x00, 0x03, 0xF8, 0x00, 0x0F, 0xE0, 0x00, 0x3F, 0x80, 0x00, 0xFE, 0x00, - 0x03, 0xF8, 0x00, 0x0F, 0xE0, 0x00, 0x3F, 0x80, 0x00, 0xFE, 0x00, 0x03, - 0xF8, 0x00, 0x1E, 0xE0, 0x00, 0x7B, 0x80, 0x03, 0xEE, 0x00, 0x1F, 0x38, - 0x00, 0xF8, 0xE0, 0x1F, 0xC3, 0xFF, 0xFE, 0x0F, 0xFF, 0xE0, 0x3F, 0xFC, - 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x0E, 0x00, 0x1C, 0x00, - 0x38, 0x00, 0x70, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x80, 0x07, 0x00, 0x0F, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x80, - 0x07, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x70, 0x00, 0xE0, 0x01, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x70, 0x00, 0xE0, 0x01, 0xC0, - 0x03, 0x80, 0x07, 0x00, 0x0E, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xE0, 0x01, 0xC0, 0x03, 0x80, 0x07, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x38, - 0x00, 0x70, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x80, 0x07, 0x00, 0x00, 0x00, - 0x7F, 0xF8, 0x01, 0xFF, 0xFE, 0x07, 0xFF, 0xFE, 0x0F, 0xC0, 0x0C, 0x1F, - 0x00, 0x00, 0x1E, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x78, - 0x00, 0x00, 0x78, 0x00, 0x00, 0x70, 0x00, 0x00, 0x70, 0x00, 0x00, 0xF0, - 0x00, 0x00, 0xF0, 0x03, 0xFF, 0xF0, 0x03, 0xFF, 0xF0, 0x03, 0xFF, 0x70, - 0x00, 0x0F, 0x70, 0x00, 0x0F, 0x78, 0x00, 0x0F, 0x78, 0x00, 0x0F, 0x78, - 0x00, 0x0F, 0x3C, 0x00, 0x0F, 0x3E, 0x00, 0x0F, 0x1F, 0x00, 0x0F, 0x0F, - 0xC0, 0x0F, 0x07, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0x00, 0xFF, 0xFC, 0xE0, - 0x00, 0x3F, 0x00, 0x01, 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0x7E, 0x00, 0x03, - 0xF0, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00, 0x07, 0xE0, 0x00, 0x3F, 0x00, - 0x01, 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFC, 0x00, 0x07, 0xE0, 0x00, 0x3F, 0x00, 0x01, 0xF8, 0x00, - 0x0F, 0xC0, 0x00, 0x7E, 0x00, 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0xFC, - 0x00, 0x07, 0xE0, 0x00, 0x3F, 0x00, 0x01, 0xF8, 0x00, 0x0F, 0xC0, 0x00, - 0x70, 0xFF, 0xFF, 0xF7, 0xF0, 0x70, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1C, - 0x07, 0x01, 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1C, 0x07, 0x01, - 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1C, 0x0F, 0xCF, 0xFF, 0xFF, - 0x01, 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xC0, - 0x70, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1C, - 0x07, 0x01, 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1C, 0x07, 0x01, - 0xC0, 0xF0, 0x3C, 0x1E, 0xFF, 0xBF, 0xCF, 0xE0, 0xE0, 0x01, 0xFE, 0x00, - 0x3C, 0xE0, 0x07, 0xCE, 0x00, 0x78, 0xE0, 0x0F, 0x0E, 0x01, 0xE0, 0xE0, - 0x3C, 0x0E, 0x07, 0x80, 0xE0, 0xF0, 0x0E, 0x1E, 0x00, 0xE3, 0xC0, 0x0E, - 0x78, 0x00, 0xEF, 0x80, 0x0E, 0xFC, 0x00, 0xFF, 0xC0, 0x0F, 0x9E, 0x00, - 0xF0, 0xF0, 0x0E, 0x0F, 0x80, 0xE0, 0x78, 0x0E, 0x03, 0xC0, 0xE0, 0x1E, - 0x0E, 0x01, 0xF0, 0xE0, 0x0F, 0x0E, 0x00, 0x78, 0xE0, 0x07, 0xCE, 0x00, - 0x3C, 0xE0, 0x01, 0xEE, 0x00, 0x0F, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, - 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, - 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, - 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, - 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xF8, 0x00, 0x03, 0xFF, 0xC0, 0x00, 0x3F, 0xFC, 0x00, 0x03, - 0xFF, 0xC0, 0x00, 0x7F, 0xFE, 0x00, 0x07, 0xFE, 0xE0, 0x00, 0xFF, 0xEE, - 0x00, 0x0E, 0xFE, 0xF0, 0x00, 0xEF, 0xE7, 0x00, 0x1C, 0xFE, 0x78, 0x01, - 0xCF, 0xE3, 0x80, 0x1C, 0xFE, 0x38, 0x03, 0x8F, 0xE3, 0xC0, 0x38, 0xFE, - 0x1C, 0x07, 0x8F, 0xE1, 0xC0, 0x70, 0xFE, 0x1E, 0x07, 0x0F, 0xE0, 0xE0, - 0xE0, 0xFE, 0x0F, 0x0E, 0x0F, 0xE0, 0x71, 0xE0, 0xFE, 0x07, 0x1C, 0x0F, - 0xE0, 0x79, 0xC0, 0xFE, 0x03, 0xBC, 0x0F, 0xE0, 0x3B, 0x80, 0xFE, 0x03, - 0xF8, 0x0F, 0xE0, 0x1F, 0x00, 0xFE, 0x01, 0xF0, 0x0F, 0xE0, 0x0F, 0x00, - 0xFE, 0x00, 0xE0, 0x0F, 0xF0, 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0x80, 0x01, - 0xFF, 0x00, 0x07, 0xFE, 0x00, 0x1F, 0xF8, 0x00, 0x7E, 0xF0, 0x01, 0xF9, - 0xE0, 0x07, 0xE7, 0x80, 0x1F, 0x8F, 0x00, 0x7E, 0x1E, 0x01, 0xF8, 0x78, - 0x07, 0xE0, 0xF0, 0x1F, 0x81, 0xE0, 0x7E, 0x07, 0x81, 0xF8, 0x0F, 0x07, - 0xE0, 0x3C, 0x1F, 0x80, 0x78, 0x7E, 0x00, 0xF1, 0xF8, 0x03, 0xC7, 0xE0, - 0x07, 0x9F, 0x80, 0x0F, 0x7E, 0x00, 0x3D, 0xF8, 0x00, 0x7F, 0xE0, 0x00, - 0xFF, 0x80, 0x03, 0xFE, 0x00, 0x07, 0xF8, 0x00, 0x0F, 0x00, 0xFF, 0xE0, - 0x00, 0xFF, 0xFE, 0x00, 0x7F, 0xFF, 0xC0, 0x3E, 0x00, 0xF8, 0x1F, 0x00, - 0x1F, 0x0F, 0x80, 0x03, 0xC3, 0xC0, 0x00, 0x79, 0xE0, 0x00, 0x1E, 0x78, - 0x00, 0x03, 0x9E, 0x00, 0x00, 0xF7, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x0F, - 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x3F, 0xC0, 0x00, - 0x0F, 0x70, 0x00, 0x03, 0xDC, 0x00, 0x00, 0xF7, 0x80, 0x00, 0x3D, 0xE0, - 0x00, 0x0E, 0x78, 0x00, 0x07, 0x8F, 0x00, 0x01, 0xE3, 0xC0, 0x00, 0xF0, - 0x7C, 0x00, 0x7C, 0x0F, 0x80, 0x3E, 0x01, 0xFF, 0xFF, 0x00, 0x3F, 0xFF, - 0x80, 0x03, 0xFF, 0x80, 0xFF, 0xF0, 0x3F, 0xFF, 0x0F, 0xFF, 0xF3, 0x80, - 0xFC, 0xE0, 0x0F, 0xB8, 0x01, 0xEE, 0x00, 0x3F, 0x80, 0x0F, 0xE0, 0x03, - 0xF8, 0x00, 0xFE, 0x00, 0x3B, 0x80, 0x1E, 0xE0, 0x0F, 0xB8, 0x07, 0xCF, - 0xFF, 0xE3, 0xFF, 0xF0, 0xFF, 0xF0, 0x38, 0x00, 0x0E, 0x00, 0x03, 0x80, - 0x00, 0xE0, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x03, 0x80, 0x00, 0xE0, 0x00, - 0x38, 0x00, 0x0E, 0x00, 0x03, 0x80, 0x00, 0x00, 0xFF, 0xE0, 0x00, 0xFF, - 0xFE, 0x00, 0x7F, 0xFF, 0xC0, 0x3E, 0x00, 0xF8, 0x1F, 0x00, 0x1F, 0x0F, - 0x80, 0x03, 0xC3, 0xC0, 0x00, 0x79, 0xE0, 0x00, 0x1E, 0x78, 0x00, 0x03, - 0x9E, 0x00, 0x00, 0xF7, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x0F, 0xF0, 0x00, - 0x03, 0xFC, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x0F, 0x70, - 0x00, 0x03, 0xDC, 0x00, 0x00, 0xF7, 0x80, 0x00, 0x3D, 0xE0, 0x00, 0x0E, - 0x78, 0x00, 0x07, 0x8F, 0x00, 0x01, 0xE3, 0xC0, 0x00, 0xF0, 0x7C, 0x00, - 0x7C, 0x0F, 0x80, 0x3E, 0x01, 0xFF, 0xFF, 0x00, 0x3F, 0xFF, 0x80, 0x03, - 0xFF, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x0F, 0x80, - 0x00, 0x01, 0xF0, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, - 0xF8, 0xFF, 0xF0, 0x0F, 0xFF, 0xC0, 0xFF, 0xFF, 0x0E, 0x01, 0xF8, 0xE0, - 0x07, 0x8E, 0x00, 0x78, 0xE0, 0x03, 0xCE, 0x00, 0x3C, 0xE0, 0x03, 0xCE, - 0x00, 0x3C, 0xE0, 0x03, 0x8E, 0x00, 0x78, 0xE0, 0x0F, 0x0F, 0xFF, 0xE0, - 0xFF, 0xFC, 0x0F, 0xFF, 0x00, 0xE0, 0x78, 0x0E, 0x03, 0x80, 0xE0, 0x3C, - 0x0E, 0x01, 0xE0, 0xE0, 0x1E, 0x0E, 0x00, 0xF0, 0xE0, 0x0F, 0x0E, 0x00, - 0x78, 0xE0, 0x03, 0xCE, 0x00, 0x3C, 0xE0, 0x01, 0xEE, 0x00, 0x1F, 0x07, - 0xFE, 0x07, 0xFF, 0xE3, 0xFF, 0xF9, 0xF0, 0x0C, 0x78, 0x00, 0x3C, 0x00, - 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x07, 0xC0, 0x00, - 0xFC, 0x00, 0x1F, 0xC0, 0x03, 0xFE, 0x00, 0x3F, 0xC0, 0x01, 0xFC, 0x00, - 0x1F, 0x80, 0x01, 0xE0, 0x00, 0x38, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, - 0xF0, 0x00, 0x38, 0x00, 0x1E, 0xC0, 0x0F, 0xBF, 0xFF, 0xCF, 0xFF, 0xE1, - 0xFF, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0xF0, - 0x00, 0x07, 0x80, 0x00, 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, - 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, - 0x00, 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, - 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x3C, 0x00, - 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, - 0x00, 0x00, 0xF0, 0x00, 0xE0, 0x00, 0x3F, 0x00, 0x01, 0xF8, 0x00, 0x0F, - 0xC0, 0x00, 0x7E, 0x00, 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00, - 0x07, 0xE0, 0x00, 0x3F, 0x00, 0x01, 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0x7E, - 0x00, 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00, 0x07, 0xE0, 0x00, - 0x3F, 0x00, 0x01, 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0xFE, 0x00, 0x07, 0xF8, - 0x00, 0x3F, 0xC0, 0x03, 0xCF, 0x00, 0x1E, 0x7C, 0x03, 0xE1, 0xFF, 0xFE, - 0x07, 0xFF, 0xE0, 0x0F, 0xFC, 0x00, 0xF0, 0x00, 0x0F, 0x70, 0x00, 0x1E, - 0x78, 0x00, 0x1E, 0x78, 0x00, 0x1C, 0x38, 0x00, 0x3C, 0x3C, 0x00, 0x3C, - 0x3C, 0x00, 0x78, 0x1C, 0x00, 0x78, 0x1E, 0x00, 0x70, 0x1E, 0x00, 0xF0, - 0x0E, 0x00, 0xF0, 0x0F, 0x00, 0xE0, 0x0F, 0x01, 0xE0, 0x07, 0x01, 0xE0, - 0x07, 0x81, 0xC0, 0x03, 0x83, 0xC0, 0x03, 0x83, 0xC0, 0x03, 0xC3, 0x80, - 0x01, 0xC7, 0x80, 0x01, 0xE7, 0x80, 0x01, 0xE7, 0x00, 0x00, 0xEF, 0x00, - 0x00, 0xEE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7C, 0x00, - 0x00, 0x7C, 0x00, 0x00, 0x3C, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF7, 0x80, - 0x0F, 0x00, 0x0F, 0x78, 0x00, 0xF8, 0x00, 0xE7, 0x80, 0x1F, 0x80, 0x1E, - 0x38, 0x01, 0xF8, 0x01, 0xE3, 0xC0, 0x1F, 0xC0, 0x1C, 0x3C, 0x03, 0xDC, - 0x01, 0xC3, 0xC0, 0x39, 0xC0, 0x3C, 0x1C, 0x03, 0x9C, 0x03, 0xC1, 0xE0, - 0x79, 0xE0, 0x38, 0x1E, 0x07, 0x8E, 0x03, 0x80, 0xE0, 0x70, 0xE0, 0x78, - 0x0E, 0x07, 0x0F, 0x07, 0x80, 0xF0, 0xF0, 0x70, 0x70, 0x0F, 0x0E, 0x07, - 0x07, 0x00, 0x70, 0xE0, 0x78, 0xF0, 0x07, 0x1E, 0x03, 0x8F, 0x00, 0x79, - 0xE0, 0x38, 0xE0, 0x07, 0x9C, 0x03, 0x8E, 0x00, 0x39, 0xC0, 0x3D, 0xE0, - 0x03, 0xBC, 0x01, 0xDC, 0x00, 0x3B, 0x80, 0x1D, 0xC0, 0x03, 0xF8, 0x01, - 0xDC, 0x00, 0x1F, 0x80, 0x0F, 0xC0, 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x1F, - 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x0F, 0x00, 0x07, 0x80, - 0x78, 0x00, 0x3C, 0x78, 0x00, 0xF0, 0xF0, 0x01, 0xE0, 0xF0, 0x07, 0x80, - 0xE0, 0x0E, 0x01, 0xE0, 0x3C, 0x01, 0xE0, 0xF0, 0x01, 0xC1, 0xC0, 0x03, - 0xC7, 0x80, 0x03, 0xDE, 0x00, 0x03, 0xB8, 0x00, 0x07, 0xF0, 0x00, 0x07, - 0xC0, 0x00, 0x0F, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x7F, 0x00, 0x01, 0xEE, - 0x00, 0x03, 0x9E, 0x00, 0x0F, 0x1E, 0x00, 0x1C, 0x1C, 0x00, 0x78, 0x3C, - 0x01, 0xE0, 0x3C, 0x03, 0x80, 0x78, 0x0F, 0x00, 0x78, 0x3C, 0x00, 0x78, - 0x70, 0x00, 0xF1, 0xE0, 0x00, 0xF7, 0x80, 0x01, 0xF0, 0xF0, 0x00, 0x3D, - 0xE0, 0x00, 0xE7, 0x80, 0x07, 0x8F, 0x00, 0x1C, 0x3C, 0x00, 0xF0, 0x78, - 0x07, 0x81, 0xE0, 0x1E, 0x03, 0xC0, 0xF0, 0x07, 0x03, 0xC0, 0x1E, 0x1E, - 0x00, 0x38, 0x70, 0x00, 0xF3, 0xC0, 0x01, 0xCE, 0x00, 0x07, 0xF8, 0x00, - 0x0F, 0xC0, 0x00, 0x3F, 0x00, 0x00, 0x78, 0x00, 0x01, 0xE0, 0x00, 0x07, - 0x80, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x01, 0xE0, 0x00, 0x07, 0x80, - 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x01, 0xE0, 0x00, 0x07, 0x80, 0x00, - 0x1E, 0x00, 0x7F, 0xFF, 0xE7, 0xFF, 0xFE, 0x7F, 0xFF, 0xE0, 0x00, 0x1E, - 0x00, 0x03, 0xC0, 0x00, 0x3C, 0x00, 0x07, 0x80, 0x00, 0xF0, 0x00, 0x0F, - 0x00, 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x03, 0xC0, 0x00, 0x78, 0x00, 0x0F, - 0x00, 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x03, 0xC0, 0x00, 0x3C, 0x00, 0x07, - 0x80, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x03, - 0xC0, 0x00, 0x78, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFE, 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, - 0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, - 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xFF, - 0xFF, 0xFF, 0xC0, 0xF0, 0x01, 0xC0, 0x07, 0x80, 0x0E, 0x00, 0x38, 0x00, - 0xF0, 0x01, 0xC0, 0x07, 0x80, 0x0E, 0x00, 0x38, 0x00, 0xF0, 0x01, 0xC0, - 0x07, 0x00, 0x1E, 0x00, 0x38, 0x00, 0xF0, 0x01, 0xC0, 0x07, 0x00, 0x1E, - 0x00, 0x38, 0x00, 0xE0, 0x03, 0xC0, 0x07, 0x00, 0x1E, 0x00, 0x38, 0x00, - 0xE0, 0x03, 0xC0, 0x07, 0xFF, 0xFF, 0xFF, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, - 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, - 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF0, - 0x78, 0x3C, 0x1F, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0xE0, 0x00, 0x0F, 0x00, - 0x00, 0xF0, 0x00, 0x1F, 0x80, 0x01, 0xB8, 0x00, 0x39, 0xC0, 0x03, 0x1C, - 0x00, 0x70, 0xE0, 0x07, 0x0E, 0x00, 0xE0, 0x70, 0x0E, 0x07, 0x01, 0xC0, - 0x38, 0x1C, 0x03, 0x83, 0x80, 0x1C, 0x38, 0x01, 0xC7, 0x00, 0x0E, 0x70, - 0x00, 0xEF, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xF1, 0xE1, 0xE1, - 0xE1, 0xC1, 0xC0, 0x0F, 0xFC, 0x1F, 0xFF, 0x07, 0xEF, 0xC2, 0x01, 0xE0, - 0x00, 0x78, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x0F, 0x00, 0x7F, 0x87, 0xFF, - 0xCF, 0xFF, 0xEF, 0x80, 0xFF, 0x00, 0x7F, 0x80, 0x3F, 0x80, 0x1F, 0xC0, - 0x0F, 0xF0, 0x0F, 0xF8, 0x0F, 0xDF, 0x3E, 0xEF, 0xFE, 0x71, 0xFE, 0x38, - 0xF0, 0x00, 0x1E, 0x00, 0x03, 0xC0, 0x00, 0x78, 0x00, 0x0F, 0x00, 0x01, - 0xE0, 0x00, 0x3C, 0x00, 0x07, 0x80, 0x00, 0xF0, 0x00, 0x1E, 0x7F, 0x83, - 0xDF, 0xFC, 0x7F, 0xFF, 0xCF, 0xC0, 0x79, 0xF0, 0x07, 0xBE, 0x00, 0x77, - 0x80, 0x0F, 0xF0, 0x01, 0xFE, 0x00, 0x3F, 0xC0, 0x07, 0xF8, 0x00, 0xFF, - 0x00, 0x1F, 0xE0, 0x03, 0xFC, 0x00, 0x7F, 0x80, 0x0F, 0xF8, 0x03, 0xDF, - 0x00, 0x7B, 0xF0, 0x1E, 0x77, 0xDF, 0xCE, 0x7F, 0xF1, 0xC7, 0xF8, 0x00, - 0x07, 0xFF, 0x0F, 0xFE, 0x1F, 0xFE, 0x3C, 0x02, 0x78, 0x00, 0x78, 0x00, - 0x70, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, - 0xF0, 0x00, 0xF0, 0x00, 0x70, 0x00, 0x78, 0x00, 0x78, 0x00, 0x3C, 0x02, - 0x1F, 0xFE, 0x0F, 0xFE, 0x07, 0xFE, 0x00, 0x01, 0xE0, 0x00, 0x3C, 0x00, - 0x07, 0x80, 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x03, 0xC0, 0x00, 0x78, 0x00, - 0x0F, 0x00, 0x01, 0xE0, 0xFF, 0x3C, 0x7F, 0xF7, 0x9F, 0xDF, 0x73, 0xC0, - 0x7E, 0xF0, 0x07, 0xDE, 0x00, 0x7B, 0x80, 0x0F, 0xF0, 0x01, 0xFE, 0x00, - 0x3F, 0xC0, 0x07, 0xF8, 0x00, 0xFF, 0x00, 0x1F, 0xE0, 0x03, 0xFC, 0x00, - 0x7B, 0x80, 0x0F, 0x78, 0x01, 0xEF, 0x00, 0x7C, 0xF0, 0x1F, 0x9F, 0xDF, - 0x71, 0xFF, 0xCE, 0x0F, 0xF1, 0xC0, 0x07, 0xFC, 0x03, 0xFF, 0x81, 0xFB, - 0xF0, 0xF0, 0x1E, 0x78, 0x07, 0x9E, 0x00, 0xF7, 0x00, 0x3F, 0xC0, 0x0F, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0xF0, 0x00, 0x3C, - 0x00, 0x07, 0x00, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x0F, 0x80, 0x21, 0xFF, - 0xF8, 0x3F, 0xFE, 0x03, 0xFF, 0x00, 0x01, 0xF8, 0x1F, 0xF0, 0xFF, 0xC3, - 0xC0, 0x0E, 0x00, 0x78, 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x01, 0xFF, 0xCF, - 0xFF, 0x3F, 0xFC, 0x1E, 0x00, 0x78, 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00, - 0x78, 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x01, 0xE0, 0x07, 0x80, - 0x1E, 0x00, 0x78, 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x00, 0x07, - 0xF8, 0xE3, 0xFF, 0x9C, 0xFF, 0xFB, 0x9E, 0x03, 0xF7, 0x80, 0x3E, 0xF0, - 0x03, 0xDC, 0x00, 0x7F, 0x80, 0x0F, 0xF0, 0x01, 0xFE, 0x00, 0x3F, 0xC0, - 0x07, 0xF8, 0x00, 0xFF, 0x00, 0x1F, 0xE0, 0x03, 0xDC, 0x00, 0x7B, 0xC0, - 0x0F, 0x78, 0x03, 0xE7, 0x80, 0xFC, 0xFE, 0xFF, 0x8F, 0xFE, 0xF0, 0x7F, - 0x9E, 0x00, 0x03, 0xC0, 0x00, 0x78, 0x00, 0x0F, 0x00, 0x01, 0xC0, 0x00, - 0x78, 0x80, 0x1F, 0x1F, 0xDF, 0xC3, 0xFF, 0xF0, 0x3F, 0xF8, 0x00, 0xF0, - 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x00, - 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x7F, 0x8F, 0x7F, 0xF3, - 0xFF, 0xFE, 0xFC, 0x07, 0xBE, 0x00, 0xFF, 0x80, 0x3F, 0xC0, 0x07, 0xF0, - 0x01, 0xFC, 0x00, 0x7F, 0x00, 0x1F, 0xC0, 0x07, 0xF0, 0x01, 0xFC, 0x00, - 0x7F, 0x00, 0x1F, 0xC0, 0x07, 0xF0, 0x01, 0xFC, 0x00, 0x7F, 0x00, 0x1F, - 0xC0, 0x07, 0xF0, 0x01, 0xFC, 0x00, 0x70, 0x6F, 0xFF, 0x20, 0x00, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x03, 0x03, - 0xC1, 0xE0, 0xF0, 0x10, 0x00, 0x00, 0x00, 0x07, 0x83, 0xC1, 0xE0, 0xF0, - 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, - 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, - 0xC1, 0xDB, 0xEF, 0xF7, 0xE0, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, - 0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0, - 0x00, 0x3C, 0x03, 0xEF, 0x00, 0xF3, 0xC0, 0x78, 0xF0, 0x3C, 0x3C, 0x1E, - 0x0F, 0x0F, 0x03, 0xC7, 0x80, 0xF3, 0xC0, 0x3D, 0xE0, 0x0F, 0xF8, 0x03, - 0xFF, 0x00, 0xFF, 0xC0, 0x3E, 0x78, 0x0F, 0x0F, 0x03, 0xC1, 0xE0, 0xF0, - 0x78, 0x3C, 0x0F, 0x0F, 0x01, 0xE3, 0xC0, 0x3C, 0xF0, 0x0F, 0x3C, 0x01, - 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xE3, 0xFC, 0x1F, 0xE3, 0x9F, 0xF8, 0xFF, 0xEF, - 0xFF, 0xF7, 0xFF, 0xBF, 0x03, 0xF8, 0x0F, 0xF8, 0x07, 0xC0, 0x3F, 0xC0, - 0x1F, 0x00, 0x7F, 0x00, 0x38, 0x01, 0xFC, 0x00, 0xE0, 0x07, 0xF0, 0x03, - 0x80, 0x1F, 0xC0, 0x0E, 0x00, 0x7F, 0x00, 0x38, 0x01, 0xFC, 0x00, 0xE0, - 0x07, 0xF0, 0x03, 0x80, 0x1F, 0xC0, 0x0E, 0x00, 0x7F, 0x00, 0x38, 0x01, - 0xFC, 0x00, 0xE0, 0x07, 0xF0, 0x03, 0x80, 0x1F, 0xC0, 0x0E, 0x00, 0x7F, - 0x00, 0x38, 0x01, 0xFC, 0x00, 0xE0, 0x07, 0xF0, 0x03, 0x80, 0x1C, 0xE3, - 0xFE, 0x39, 0xFF, 0xCF, 0xFF, 0xFB, 0xF0, 0x1E, 0xF8, 0x03, 0xFE, 0x00, - 0xFF, 0x00, 0x1F, 0xC0, 0x07, 0xF0, 0x01, 0xFC, 0x00, 0x7F, 0x00, 0x1F, - 0xC0, 0x07, 0xF0, 0x01, 0xFC, 0x00, 0x7F, 0x00, 0x1F, 0xC0, 0x07, 0xF0, - 0x01, 0xFC, 0x00, 0x7F, 0x00, 0x1F, 0xC0, 0x07, 0xF0, 0x01, 0xC0, 0x07, - 0xFC, 0x00, 0xFF, 0xF0, 0x1F, 0xFF, 0x83, 0xC0, 0x7C, 0x78, 0x03, 0xC7, - 0x80, 0x1E, 0x70, 0x01, 0xEF, 0x00, 0x0E, 0xF0, 0x00, 0xEF, 0x00, 0x0F, - 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xEF, 0x00, 0x0E, 0x70, 0x01, - 0xE7, 0x80, 0x1E, 0x78, 0x03, 0xC3, 0xC0, 0x7C, 0x1F, 0xFF, 0x80, 0xFF, - 0xF0, 0x03, 0xFC, 0x00, 0xE3, 0xFC, 0x1C, 0xFF, 0xE3, 0xFF, 0xFE, 0x7E, - 0x03, 0xCF, 0x80, 0x3D, 0xE0, 0x07, 0xBC, 0x00, 0x7F, 0x80, 0x0F, 0xF0, - 0x01, 0xFE, 0x00, 0x3F, 0xC0, 0x07, 0xF8, 0x00, 0xFF, 0x00, 0x1F, 0xE0, - 0x03, 0xFC, 0x00, 0x7F, 0xC0, 0x1E, 0xF8, 0x03, 0xDF, 0x80, 0xF3, 0xFE, - 0xFE, 0x7B, 0xFF, 0x8F, 0x3F, 0xC1, 0xE0, 0x00, 0x3C, 0x00, 0x07, 0x80, - 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x03, 0xC0, 0x00, 0x78, 0x00, 0x0F, 0x00, - 0x01, 0xE0, 0x00, 0x00, 0x07, 0xF8, 0xE3, 0xFF, 0x9C, 0xFE, 0xFB, 0x9E, - 0x03, 0xF7, 0x80, 0x3E, 0xF0, 0x03, 0xDC, 0x00, 0x7F, 0x80, 0x0F, 0xF0, - 0x01, 0xFE, 0x00, 0x3F, 0xC0, 0x07, 0xF8, 0x00, 0xFF, 0x00, 0x1F, 0xE0, - 0x03, 0xDC, 0x00, 0x7B, 0xC0, 0x0F, 0x78, 0x03, 0xE7, 0x80, 0xFC, 0xFE, - 0xFF, 0x8F, 0xFE, 0xF0, 0x7F, 0x9E, 0x00, 0x03, 0xC0, 0x00, 0x78, 0x00, - 0x0F, 0x00, 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x07, 0x80, 0x00, 0xF0, 0x00, - 0x1E, 0x00, 0x03, 0xC0, 0xE1, 0xFF, 0x1F, 0xB9, 0xFD, 0xFC, 0x0F, 0xC0, - 0x7C, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, - 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, - 0x0F, 0x00, 0x00, 0x1F, 0xF8, 0x7F, 0xFD, 0xFB, 0xF7, 0x80, 0x2E, 0x00, - 0x1C, 0x00, 0x3C, 0x00, 0x7C, 0x00, 0x7F, 0x00, 0x7F, 0x80, 0x3F, 0xC0, - 0x0F, 0xC0, 0x07, 0xC0, 0x03, 0xC0, 0x07, 0x80, 0x07, 0x00, 0x1F, 0x00, - 0x3F, 0xE3, 0xF7, 0xFF, 0xC7, 0xFE, 0x00, 0x0C, 0x00, 0xC0, 0x1C, 0x01, - 0xC0, 0x1C, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0x1C, 0x01, 0xC0, 0x1C, 0x01, - 0xC0, 0x1C, 0x01, 0xC0, 0x1C, 0x01, 0xC0, 0x1C, 0x01, 0xC0, 0x1C, 0x01, - 0xC0, 0x1C, 0x01, 0xC0, 0x1E, 0x01, 0xFB, 0x0F, 0xF0, 0x7F, 0xF0, 0x03, - 0xFC, 0x00, 0xFF, 0x00, 0x3F, 0xC0, 0x0F, 0xF0, 0x03, 0xFC, 0x00, 0xFF, - 0x00, 0x3F, 0xC0, 0x0F, 0xF0, 0x03, 0xFC, 0x00, 0xFF, 0x00, 0x3F, 0xC0, - 0x0F, 0xF0, 0x03, 0xFC, 0x00, 0xFF, 0x00, 0x3F, 0xC0, 0x0F, 0xF0, 0x07, - 0xDE, 0x03, 0xF7, 0xF7, 0xDC, 0xFF, 0xE7, 0x1F, 0xF1, 0xC0, 0xF0, 0x00, - 0xF7, 0x00, 0x0E, 0x78, 0x01, 0xE7, 0x80, 0x1E, 0x38, 0x01, 0xC3, 0xC0, - 0x3C, 0x3C, 0x03, 0x81, 0xC0, 0x78, 0x1E, 0x07, 0x80, 0xE0, 0x70, 0x0E, - 0x0F, 0x00, 0xF0, 0xF0, 0x07, 0x0E, 0x00, 0x79, 0xE0, 0x07, 0x9C, 0x00, - 0x39, 0xC0, 0x03, 0xBC, 0x00, 0x1F, 0x80, 0x01, 0xF8, 0x00, 0x1F, 0x00, - 0x00, 0xF0, 0x00, 0xF0, 0x07, 0x80, 0x1D, 0xC0, 0x1F, 0x00, 0xF7, 0x80, - 0x7C, 0x03, 0xDE, 0x03, 0xF0, 0x0E, 0x38, 0x0E, 0xE0, 0x38, 0xE0, 0x3B, - 0x81, 0xE3, 0xC1, 0xEE, 0x07, 0x8F, 0x07, 0x3C, 0x1C, 0x1C, 0x1C, 0x70, - 0x70, 0x70, 0x71, 0xC3, 0xC1, 0xE3, 0x87, 0x8E, 0x03, 0x8E, 0x0E, 0x38, - 0x0E, 0x38, 0x38, 0xE0, 0x39, 0xC0, 0xE7, 0x80, 0xF7, 0x01, 0xDC, 0x01, - 0xDC, 0x07, 0x70, 0x07, 0x70, 0x1D, 0xC0, 0x1F, 0x80, 0x7F, 0x00, 0x3E, - 0x00, 0xF8, 0x00, 0xF8, 0x03, 0xE0, 0x03, 0xC0, 0x0F, 0x80, 0xF0, 0x03, - 0xEF, 0x00, 0x78, 0xF0, 0x1E, 0x0E, 0x07, 0x81, 0xE0, 0xE0, 0x1E, 0x3C, - 0x01, 0xCF, 0x00, 0x3D, 0xC0, 0x03, 0xF8, 0x00, 0x3E, 0x00, 0x07, 0xC0, - 0x01, 0xF8, 0x00, 0x3F, 0x80, 0x0F, 0x78, 0x03, 0xC7, 0x00, 0x70, 0xF0, - 0x1E, 0x0F, 0x07, 0x80, 0xF1, 0xE0, 0x1E, 0x3C, 0x01, 0xEF, 0x00, 0x1E, - 0xF0, 0x00, 0xF7, 0x00, 0x0E, 0x78, 0x01, 0xE7, 0x80, 0x1E, 0x38, 0x01, - 0xC3, 0xC0, 0x3C, 0x1C, 0x03, 0xC1, 0xE0, 0x38, 0x1E, 0x07, 0x80, 0xE0, - 0x70, 0x0F, 0x0F, 0x00, 0x70, 0xF0, 0x07, 0x0E, 0x00, 0x79, 0xE0, 0x03, - 0x9E, 0x00, 0x39, 0xC0, 0x01, 0xFC, 0x00, 0x1F, 0x80, 0x01, 0xF8, 0x00, - 0x0F, 0x80, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xE0, 0x00, 0x0E, 0x00, - 0x01, 0xE0, 0x00, 0x1C, 0x00, 0x03, 0xC0, 0x0D, 0xF8, 0x00, 0xFF, 0x00, - 0x0F, 0xE0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x01, 0xE0, 0x03, - 0x80, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x01, 0xC0, 0x07, 0x80, 0x1E, 0x00, - 0x38, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x1E, 0x00, 0x78, 0x01, 0xE0, - 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x78, 0x0F, 0xC0, 0xFE, - 0x0F, 0x80, 0x78, 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x38, 0x01, - 0xC0, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x3C, 0x0F, 0xC0, 0xFC, 0x07, 0xC0, - 0x3F, 0x80, 0x1E, 0x00, 0x70, 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x07, 0x00, - 0x38, 0x01, 0xC0, 0x0E, 0x00, 0x70, 0x03, 0xC0, 0x1E, 0x00, 0x7F, 0x01, - 0xF8, 0x03, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xF0, 0x07, 0xE0, 0x3F, 0x80, 0x3C, - 0x00, 0xF0, 0x07, 0x80, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x38, 0x01, 0xC0, - 0x0E, 0x00, 0x70, 0x03, 0x80, 0x1E, 0x00, 0x7E, 0x01, 0xF8, 0x07, 0xC0, - 0xFE, 0x0F, 0x00, 0x70, 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x38, - 0x01, 0xC0, 0x0E, 0x00, 0x70, 0x07, 0x80, 0x7C, 0x1F, 0xC0, 0xFC, 0x07, - 0x80, 0x00, 0x7F, 0x80, 0x7F, 0xF8, 0x3F, 0x7F, 0xFF, 0x03, 0xFE, 0x80, - 0x1E, 0x00 }; - -const GFXglyph NotoSans_Regular20pt7bGlyphs[] PROGMEM = { - { 0, 1, 1, 10, 0, 0 }, // 0x20 ' ' - { 1, 5, 29, 11, 3, -27 }, // 0x21 '!' - { 20, 10, 10, 16, 3, -27 }, // 0x22 '"' - { 33, 23, 28, 25, 1, -27 }, // 0x23 '#' - { 114, 18, 32, 22, 2, -29 }, // 0x24 '$' - { 186, 29, 28, 33, 2, -27 }, // 0x25 '%' - { 288, 27, 28, 29, 2, -27 }, // 0x26 '&' - { 383, 3, 10, 9, 3, -27 }, // 0x27 ''' - { 387, 9, 34, 12, 2, -27 }, // 0x28 '(' - { 426, 9, 34, 12, 1, -27 }, // 0x29 ')' - { 465, 18, 18, 22, 2, -29 }, // 0x2A '*' - { 506, 18, 19, 22, 2, -22 }, // 0x2B '+' - { 549, 6, 10, 11, 2, -4 }, // 0x2C ',' - { 557, 9, 3, 13, 2, -11 }, // 0x2D '-' - { 561, 5, 6, 11, 3, -4 }, // 0x2E '.' - { 565, 14, 28, 15, 0, -27 }, // 0x2F '/' - { 614, 18, 28, 22, 2, -27 }, // 0x30 '0' - { 677, 11, 28, 22, 3, -27 }, // 0x31 '1' - { 716, 18, 28, 22, 2, -27 }, // 0x32 '2' - { 779, 18, 28, 22, 2, -27 }, // 0x33 '3' - { 842, 21, 28, 22, 1, -27 }, // 0x34 '4' - { 916, 18, 28, 22, 2, -27 }, // 0x35 '5' - { 979, 19, 28, 22, 2, -27 }, // 0x36 '6' - { 1046, 18, 28, 22, 2, -27 }, // 0x37 '7' - { 1109, 18, 28, 22, 2, -27 }, // 0x38 '8' - { 1172, 18, 28, 22, 2, -27 }, // 0x39 '9' - { 1235, 5, 23, 11, 3, -21 }, // 0x3A ':' - { 1250, 7, 27, 11, 1, -21 }, // 0x3B ';' - { 1274, 18, 19, 22, 2, -23 }, // 0x3C '<' - { 1317, 18, 11, 22, 2, -18 }, // 0x3D '=' - { 1342, 18, 19, 22, 2, -23 }, // 0x3E '>' - { 1385, 16, 29, 17, 0, -27 }, // 0x3F '?' - { 1443, 31, 31, 35, 2, -27 }, // 0x40 '@' - { 1564, 25, 28, 25, 0, -27 }, // 0x41 'A' - { 1652, 19, 28, 25, 4, -27 }, // 0x42 'B' - { 1719, 22, 28, 25, 2, -27 }, // 0x43 'C' - { 1796, 22, 28, 29, 4, -27 }, // 0x44 'D' - { 1873, 15, 28, 22, 4, -27 }, // 0x45 'E' - { 1926, 15, 28, 20, 4, -27 }, // 0x46 'F' - { 1979, 24, 28, 29, 2, -27 }, // 0x47 'G' - { 2063, 21, 28, 29, 4, -27 }, // 0x48 'H' - { 2137, 10, 28, 13, 2, -27 }, // 0x49 'I' - { 2172, 10, 35, 11, -3, -27 }, // 0x4A 'J' - { 2216, 20, 28, 24, 4, -27 }, // 0x4B 'K' - { 2286, 16, 28, 21, 4, -27 }, // 0x4C 'L' - { 2342, 28, 28, 36, 4, -27 }, // 0x4D 'M' - { 2440, 22, 28, 30, 4, -27 }, // 0x4E 'N' - { 2517, 26, 28, 31, 2, -27 }, // 0x4F 'O' - { 2608, 18, 28, 24, 4, -27 }, // 0x50 'P' - { 2671, 26, 35, 31, 2, -27 }, // 0x51 'Q' - { 2785, 20, 28, 24, 4, -27 }, // 0x52 'R' - { 2855, 18, 28, 22, 2, -27 }, // 0x53 'S' - { 2918, 21, 28, 22, 0, -27 }, // 0x54 'T' - { 2992, 21, 28, 29, 4, -27 }, // 0x55 'U' - { 3066, 24, 28, 24, 0, -27 }, // 0x56 'V' - { 3150, 36, 28, 36, 0, -27 }, // 0x57 'W' - { 3276, 23, 28, 23, 0, -27 }, // 0x58 'X' - { 3357, 22, 28, 22, 0, -27 }, // 0x59 'Y' - { 3434, 20, 28, 22, 1, -27 }, // 0x5A 'Z' - { 3504, 9, 34, 13, 3, -27 }, // 0x5B '[' - { 3543, 14, 28, 15, 0, -27 }, // 0x5C '\' - { 3592, 9, 34, 13, 1, -27 }, // 0x5D ']' - { 3631, 20, 18, 22, 1, -27 }, // 0x5E '^' - { 3676, 17, 2, 17, 0, 5 }, // 0x5F '_' - { 3681, 7, 6, 11, 2, -29 }, // 0x60 '`' - { 3687, 17, 21, 22, 2, -20 }, // 0x61 'a' - { 3732, 19, 30, 24, 3, -29 }, // 0x62 'b' - { 3804, 16, 21, 19, 2, -20 }, // 0x63 'c' - { 3846, 19, 30, 24, 2, -29 }, // 0x64 'd' - { 3918, 18, 21, 22, 2, -20 }, // 0x65 'e' - { 3966, 14, 30, 13, 1, -29 }, // 0x66 'f' - { 4019, 19, 30, 24, 2, -20 }, // 0x67 'g' - { 4091, 18, 30, 24, 3, -29 }, // 0x68 'h' - { 4159, 4, 29, 10, 3, -28 }, // 0x69 'i' - { 4174, 9, 38, 10, -2, -28 }, // 0x6A 'j' - { 4217, 18, 30, 21, 3, -29 }, // 0x6B 'k' - { 4285, 4, 30, 10, 3, -29 }, // 0x6C 'l' - { 4300, 30, 21, 37, 3, -20 }, // 0x6D 'm' - { 4379, 18, 21, 24, 3, -20 }, // 0x6E 'n' - { 4427, 20, 21, 24, 2, -20 }, // 0x6F 'o' - { 4480, 19, 30, 24, 3, -20 }, // 0x70 'p' - { 4552, 19, 30, 24, 2, -20 }, // 0x71 'q' - { 4624, 13, 21, 16, 3, -20 }, // 0x72 'r' - { 4659, 15, 21, 19, 2, -20 }, // 0x73 's' - { 4699, 12, 26, 14, 1, -25 }, // 0x74 't' - { 4738, 18, 21, 24, 3, -20 }, // 0x75 'u' - { 4786, 20, 21, 20, 0, -20 }, // 0x76 'v' - { 4839, 30, 21, 31, 0, -20 }, // 0x77 'w' - { 4918, 19, 21, 21, 1, -20 }, // 0x78 'x' - { 4968, 20, 30, 20, 0, -20 }, // 0x79 'y' - { 5043, 15, 21, 18, 2, -20 }, // 0x7A 'z' - { 5083, 13, 34, 15, 1, -27 }, // 0x7B '{' - { 5139, 3, 39, 22, 9, -29 }, // 0x7C '|' - { 5154, 13, 34, 15, 1, -27 }, // 0x7D '}' - { 5210, 18, 5, 22, 2, -15 } }; // 0x7E '~' - -const GFXfont NotoSans_Regular20pt7b PROGMEM = { - (uint8_t *)NotoSans_Regular20pt7bBitmaps, - (GFXglyph *)NotoSans_Regular20pt7bGlyphs, - 0x20, 0x7E, 53 }; - -// Approx. 5894 bytes - -#endif // NOTOSANS20PT7B_H diff --git a/examples/companion_radio/ui-new/fonts/NotoSans22pt7b.h b/examples/companion_radio/ui-new/fonts/NotoSans22pt7b.h deleted file mode 100644 index 916501e4..00000000 --- a/examples/companion_radio/ui-new/fonts/NotoSans22pt7b.h +++ /dev/null @@ -1,639 +0,0 @@ -#ifndef NOTOSANS22PT7B_H -#define NOTOSANS22PT7B_H -const uint8_t NotoSans_Regular22pt7bBitmaps[] PROGMEM = { - 0x00, 0xFB, 0xDE, 0xF7, 0xBD, 0xEF, 0x7B, 0xDE, 0xF7, 0xB9, 0xCE, 0x73, - 0x9C, 0xE7, 0x18, 0x00, 0x00, 0x1F, 0xFF, 0xFD, 0xE4, 0xF0, 0xFF, 0x0F, - 0xF0, 0xFF, 0x0F, 0xF0, 0xEF, 0x0E, 0xE0, 0xEE, 0x0E, 0xE0, 0xE6, 0x0E, - 0x60, 0xE0, 0x00, 0x38, 0x1C, 0x00, 0x1E, 0x07, 0x00, 0x07, 0x01, 0xC0, - 0x01, 0xC0, 0xE0, 0x00, 0x70, 0x38, 0x00, 0x1C, 0x0E, 0x00, 0x0F, 0x03, - 0x80, 0x03, 0x80, 0xE0, 0x00, 0xE0, 0x70, 0x0F, 0xFF, 0xFF, 0xF3, 0xFF, - 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0x01, 0xC0, 0x70, 0x00, 0x70, 0x38, 0x00, - 0x1C, 0x0E, 0x00, 0x07, 0x03, 0x80, 0x01, 0xC0, 0xE0, 0x00, 0xE0, 0x38, - 0x00, 0x38, 0x1C, 0x03, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, - 0xFF, 0xC0, 0x70, 0x1C, 0x00, 0x1C, 0x0F, 0x00, 0x07, 0x03, 0x80, 0x01, - 0xC0, 0xE0, 0x00, 0x70, 0x38, 0x00, 0x3C, 0x0E, 0x00, 0x0E, 0x07, 0x80, - 0x03, 0x81, 0xC0, 0x00, 0xE0, 0x70, 0x00, 0x00, 0xE0, 0x00, 0x1C, 0x00, - 0x03, 0x80, 0x00, 0x70, 0x00, 0x7F, 0xE0, 0x3F, 0xFF, 0x8F, 0xFF, 0xF3, - 0xF7, 0x7E, 0xF0, 0xE0, 0x9E, 0x1C, 0x03, 0x83, 0x80, 0x70, 0x70, 0x0F, - 0x0E, 0x01, 0xE1, 0xC0, 0x3F, 0x38, 0x03, 0xFF, 0x00, 0x3F, 0xF0, 0x01, - 0xFF, 0xC0, 0x07, 0xFE, 0x00, 0x7F, 0xE0, 0x0E, 0x7E, 0x01, 0xC3, 0xC0, - 0x38, 0x78, 0x07, 0x07, 0x00, 0xE1, 0xE0, 0x1C, 0x3F, 0x03, 0x8F, 0xFF, - 0x7F, 0xEF, 0xFF, 0xF9, 0xFF, 0xFC, 0x07, 0xFC, 0x00, 0x07, 0x00, 0x00, - 0xE0, 0x00, 0x1C, 0x00, 0x03, 0x80, 0x00, 0x70, 0x00, 0x1F, 0x80, 0x01, - 0xC0, 0x3F, 0xE0, 0x03, 0x80, 0x3F, 0xE0, 0x07, 0x80, 0x70, 0xF0, 0x07, - 0x00, 0x70, 0x70, 0x0F, 0x00, 0xF0, 0x70, 0x0E, 0x00, 0xE0, 0x38, 0x1E, - 0x00, 0xE0, 0x38, 0x1C, 0x00, 0xE0, 0x38, 0x3C, 0x00, 0xE0, 0x38, 0x38, - 0x00, 0xE0, 0x38, 0x70, 0x00, 0xE0, 0x38, 0x70, 0x00, 0xE0, 0x78, 0xE1, - 0xE0, 0x70, 0x71, 0xE7, 0xF8, 0x70, 0x71, 0xC7, 0xFC, 0x78, 0xF3, 0xCF, - 0x1E, 0x3F, 0xE3, 0x8E, 0x0E, 0x3F, 0xE7, 0x9E, 0x0E, 0x0F, 0x87, 0x1C, - 0x0E, 0x00, 0x0E, 0x1C, 0x0F, 0x00, 0x0E, 0x1C, 0x0F, 0x00, 0x1C, 0x1C, - 0x07, 0x00, 0x3C, 0x1C, 0x07, 0x00, 0x38, 0x1C, 0x0F, 0x00, 0x78, 0x1C, - 0x0F, 0x00, 0x70, 0x1C, 0x0E, 0x00, 0xF0, 0x1E, 0x0E, 0x00, 0xE0, 0x0E, - 0x1E, 0x01, 0xC0, 0x0F, 0xBC, 0x01, 0xC0, 0x07, 0xFC, 0x03, 0x80, 0x03, - 0xF8, 0x01, 0xFE, 0x00, 0x00, 0x3F, 0xFC, 0x00, 0x03, 0xFF, 0xE0, 0x00, - 0x1F, 0x0F, 0x80, 0x01, 0xE0, 0x3C, 0x00, 0x0F, 0x00, 0xE0, 0x00, 0x78, - 0x07, 0x80, 0x03, 0xC0, 0x38, 0x00, 0x1E, 0x03, 0xC0, 0x00, 0x78, 0x1E, - 0x00, 0x03, 0xE1, 0xE0, 0x00, 0x0F, 0x3E, 0x00, 0x00, 0x3F, 0xE0, 0x00, - 0x00, 0xFE, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x01, 0xFF, 0x00, 0x02, 0x1F, - 0xFE, 0x01, 0xE1, 0xF1, 0xF8, 0x0F, 0x1F, 0x07, 0xE0, 0x78, 0xF0, 0x1F, - 0x87, 0x87, 0x80, 0x7E, 0x3C, 0x78, 0x00, 0xFB, 0xC3, 0xC0, 0x03, 0xFE, - 0x1E, 0x00, 0x0F, 0xE0, 0xF0, 0x00, 0x3E, 0x03, 0xC0, 0x01, 0xF8, 0x1F, - 0x00, 0x3F, 0xE0, 0xFC, 0x07, 0xEF, 0x83, 0xFF, 0xFE, 0x3E, 0x0F, 0xFF, - 0xE0, 0xF8, 0x1F, 0xF8, 0x03, 0xE0, 0xFF, 0xFF, 0xFF, 0xEE, 0xE6, 0x60, - 0x03, 0xC1, 0xE0, 0xF0, 0x38, 0x1E, 0x07, 0x03, 0xC0, 0xF0, 0x78, 0x1E, - 0x07, 0x81, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, - 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x01, 0xE0, 0x78, - 0x1E, 0x03, 0xC0, 0xF0, 0x1C, 0x07, 0x80, 0xE0, 0x3C, 0x07, 0x80, 0xF0, - 0xF0, 0x1E, 0x03, 0xC0, 0xF0, 0x1E, 0x07, 0x80, 0xF0, 0x3C, 0x07, 0x01, - 0xE0, 0x78, 0x1E, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, - 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x78, 0x1E, 0x07, - 0x81, 0xE0, 0xF0, 0x3C, 0x1E, 0x07, 0x83, 0xC0, 0xF0, 0x78, 0x3C, 0x00, - 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xE0, - 0x00, 0x0E, 0x00, 0x80, 0xE0, 0x2F, 0x8E, 0x1E, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0x0F, 0xFF, 0x00, 0x1F, 0x00, 0x03, 0xF8, 0x00, 0x3B, 0xC0, 0x07, - 0x9E, 0x00, 0xF1, 0xE0, 0x1F, 0x0F, 0x01, 0xE0, 0xF8, 0x0E, 0x06, 0x00, - 0x20, 0x40, 0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0x70, 0x00, 0x07, 0x00, - 0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0x70, - 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x70, 0x00, 0x07, - 0x00, 0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0x70, 0x00, 0x07, 0x00, 0x00, - 0x70, 0x00, 0x07, 0x00, 0x00, 0x70, 0x00, 0x3C, 0xF7, 0xDE, 0x79, 0xE7, - 0x3C, 0xE3, 0x8E, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x7F, 0xFF, 0xF7, 0x98, - 0x00, 0x0F, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1C, 0x00, 0x3C, 0x00, 0x3C, - 0x00, 0x38, 0x00, 0x78, 0x00, 0x78, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xE0, - 0x01, 0xE0, 0x01, 0xE0, 0x01, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x07, 0x80, - 0x07, 0x80, 0x07, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x0E, 0x00, 0x1E, 0x00, - 0x1E, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x38, 0x00, 0x78, 0x00, 0x78, 0x00, - 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x3F, 0xF8, 0x07, 0xFF, 0xE0, 0x3E, 0x0F, - 0x83, 0xC0, 0x3C, 0x1E, 0x00, 0xF1, 0xE0, 0x07, 0x8F, 0x00, 0x1E, 0x78, - 0x00, 0xF3, 0x80, 0x07, 0xBC, 0x00, 0x3D, 0xE0, 0x00, 0xEF, 0x00, 0x07, - 0x78, 0x00, 0x3B, 0xC0, 0x01, 0xFE, 0x00, 0x0F, 0xF0, 0x00, 0x7F, 0x80, - 0x03, 0xBC, 0x00, 0x1D, 0xE0, 0x00, 0xEF, 0x00, 0x0F, 0x38, 0x00, 0x79, - 0xE0, 0x03, 0xCF, 0x00, 0x1E, 0x78, 0x01, 0xE1, 0xE0, 0x0F, 0x0F, 0x00, - 0xF8, 0x3C, 0x0F, 0x81, 0xFF, 0xF8, 0x07, 0xFF, 0x80, 0x0F, 0xF8, 0x00, - 0x00, 0xE0, 0x3C, 0x1F, 0x87, 0xF1, 0xEE, 0xF9, 0xFE, 0x3F, 0x87, 0x60, - 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, - 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x1C, - 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x03, 0xFC, 0x01, 0xFF, 0xF0, - 0x3F, 0xFF, 0x8F, 0xE0, 0xFC, 0x78, 0x03, 0xC2, 0x00, 0x1E, 0x00, 0x01, - 0xE0, 0x00, 0x1E, 0x00, 0x01, 0xE0, 0x00, 0x1E, 0x00, 0x01, 0xE0, 0x00, - 0x1E, 0x00, 0x03, 0xC0, 0x00, 0x3C, 0x00, 0x07, 0x80, 0x00, 0xF0, 0x00, - 0x1F, 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, - 0x3E, 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, - 0x7C, 0x00, 0x0F, 0x80, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF0, 0x07, 0xFC, 0x01, 0xFF, 0xF0, 0x7F, 0xFF, 0x8F, 0xC0, 0x7C, 0x70, - 0x03, 0xE2, 0x00, 0x1E, 0x00, 0x01, 0xE0, 0x00, 0x1E, 0x00, 0x01, 0xE0, - 0x00, 0x1E, 0x00, 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x0F, 0x80, 0x0F, 0xF0, - 0x07, 0xFC, 0x00, 0x7F, 0xE0, 0x07, 0xFF, 0x80, 0x00, 0x7E, 0x00, 0x01, - 0xE0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, - 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x1F, 0x80, 0x01, 0xEE, 0x00, 0x7E, 0xFF, - 0xFF, 0xCF, 0xFF, 0xF0, 0x3F, 0xFE, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x0F, - 0x80, 0x00, 0x1F, 0x00, 0x00, 0x7E, 0x00, 0x01, 0xFC, 0x00, 0x03, 0xB8, - 0x00, 0x0E, 0x70, 0x00, 0x3C, 0xE0, 0x00, 0xF1, 0xC0, 0x01, 0xC3, 0x80, - 0x07, 0x87, 0x00, 0x1E, 0x0E, 0x00, 0x38, 0x1C, 0x00, 0xF0, 0x38, 0x03, - 0xC0, 0x70, 0x07, 0x00, 0xE0, 0x1E, 0x01, 0xC0, 0x78, 0x03, 0x81, 0xE0, - 0x07, 0x03, 0x80, 0x0E, 0x0F, 0x00, 0x1C, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x80, 0x00, 0x07, - 0x00, 0x00, 0x0E, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x38, 0x00, 0x00, 0x70, - 0x00, 0x3F, 0xFF, 0x8F, 0xFF, 0xF1, 0xFF, 0xFE, 0x3F, 0xFF, 0xC7, 0x80, - 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x03, 0xC0, 0x00, 0x70, 0x00, 0x0E, 0x00, - 0x01, 0xC0, 0x00, 0x38, 0x00, 0x07, 0x7F, 0x00, 0xFF, 0xFC, 0x3F, 0xFF, - 0xC1, 0xC3, 0xFC, 0x00, 0x07, 0xC0, 0x00, 0x7C, 0x00, 0x07, 0x80, 0x00, - 0xF0, 0x00, 0x1E, 0x00, 0x03, 0xC0, 0x00, 0x78, 0x00, 0x0F, 0x00, 0x01, - 0xE0, 0x00, 0x7A, 0x00, 0x1F, 0x70, 0x07, 0xCF, 0xFF, 0xF1, 0xFF, 0xFC, - 0x1F, 0xFE, 0x00, 0x00, 0x7F, 0xC0, 0x0F, 0xFE, 0x00, 0xFF, 0xF0, 0x0F, - 0xC0, 0x00, 0xF8, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x07, 0x80, 0x00, - 0x38, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x0F, - 0xF0, 0x39, 0xFF, 0xC3, 0xDF, 0xFF, 0x1F, 0xE0, 0x7C, 0xFC, 0x01, 0xF7, - 0xC0, 0x07, 0xBE, 0x00, 0x1D, 0xE0, 0x00, 0xFF, 0x00, 0x07, 0xB8, 0x00, - 0x3D, 0xC0, 0x01, 0xEF, 0x00, 0x0E, 0x78, 0x00, 0xF1, 0xE0, 0x07, 0x8F, - 0x80, 0x78, 0x3E, 0x07, 0xC0, 0xFF, 0xFC, 0x03, 0xFF, 0xC0, 0x07, 0xF8, - 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, - 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x07, 0x80, 0x00, 0x3C, 0x00, 0x03, - 0xC0, 0x00, 0x1E, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, - 0x07, 0x80, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x01, 0xE0, - 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x78, 0x00, 0x03, - 0xC0, 0x00, 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x1F, 0x00, 0x00, 0xF0, 0x00, - 0x0F, 0x80, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x3C, 0x00, 0x00, 0x03, - 0xFE, 0x00, 0xFF, 0xF8, 0x1F, 0xFF, 0xC3, 0xE0, 0x7E, 0x3C, 0x01, 0xE7, - 0x80, 0x1E, 0x78, 0x00, 0xE7, 0x80, 0x0F, 0x78, 0x00, 0xE7, 0x80, 0x1E, - 0x3C, 0x01, 0xE3, 0xE0, 0x3C, 0x1F, 0x8F, 0x80, 0xFF, 0xF0, 0x03, 0xFC, - 0x00, 0x7F, 0xE0, 0x0F, 0xFF, 0x81, 0xF0, 0xFC, 0x3C, 0x03, 0xE7, 0x80, - 0x1F, 0x70, 0x00, 0xFF, 0x00, 0x07, 0xF0, 0x00, 0x7F, 0x00, 0x07, 0xF0, - 0x00, 0x7F, 0x00, 0x0F, 0x78, 0x00, 0xF7, 0xC0, 0x3E, 0x3F, 0xFF, 0xC1, - 0xFF, 0xF8, 0x07, 0xFE, 0x00, 0x03, 0xFC, 0x00, 0xFF, 0xF0, 0x1F, 0xFF, - 0x83, 0xE0, 0xFC, 0x7C, 0x03, 0xC7, 0x80, 0x1E, 0x78, 0x01, 0xEF, 0x00, - 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0x7F, 0x00, 0x0F, 0xF0, - 0x00, 0xF7, 0x80, 0x0F, 0x78, 0x01, 0xF7, 0xC0, 0x3F, 0x3F, 0xFF, 0x71, - 0xFF, 0xEF, 0x0F, 0xF8, 0xF0, 0x08, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0E, - 0x00, 0x01, 0xE0, 0x00, 0x1E, 0x00, 0x03, 0xC0, 0x00, 0x3C, 0x00, 0x07, - 0x80, 0x01, 0xF0, 0x3F, 0xFE, 0x03, 0xFF, 0xC0, 0x3F, 0xF0, 0x00, 0x37, - 0xFF, 0xFF, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, - 0xFF, 0xEF, 0x30, 0x0C, 0x7C, 0xF9, 0xF3, 0xE3, 0xC0, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF3, 0xE7, 0x8F, 0x1E, - 0x78, 0xF1, 0xC3, 0x87, 0x1C, 0x00, 0x00, 0x00, 0x10, 0x00, 0x07, 0x00, - 0x01, 0xF0, 0x00, 0x7F, 0x00, 0x1F, 0xC0, 0x07, 0xF0, 0x01, 0xF8, 0x00, - 0x7E, 0x00, 0x1F, 0x80, 0x07, 0xE0, 0x00, 0xF8, 0x00, 0x0F, 0xC0, 0x00, - 0x7F, 0x00, 0x01, 0xFE, 0x00, 0x03, 0xF8, 0x00, 0x0F, 0xE0, 0x00, 0x3F, - 0xC0, 0x00, 0xFF, 0x00, 0x01, 0xF0, 0x00, 0x07, 0x00, 0x00, 0x10, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0xFC, 0x00, - 0x07, 0xF0, 0x00, 0x1F, 0xC0, 0x00, 0x7F, 0x00, 0x01, 0xFC, 0x00, 0x07, - 0xF0, 0x00, 0x1F, 0xC0, 0x00, 0x7F, 0x00, 0x00, 0xF0, 0x00, 0x1F, 0x00, - 0x0F, 0xE0, 0x03, 0xF8, 0x00, 0xFE, 0x00, 0x7F, 0x80, 0x1F, 0xC0, 0x0F, - 0xF0, 0x00, 0xFC, 0x00, 0x0F, 0x00, 0x00, 0x80, 0x00, 0x00, 0x1F, 0xF0, - 0x7F, 0xFE, 0x3F, 0xFF, 0x9F, 0x07, 0xE4, 0x00, 0xF0, 0x00, 0x38, 0x00, - 0x1E, 0x00, 0x0F, 0x00, 0x07, 0x80, 0x03, 0x80, 0x03, 0xC0, 0x03, 0xC0, - 0x03, 0xE0, 0x03, 0xE0, 0x03, 0xE0, 0x03, 0xE0, 0x03, 0xC0, 0x01, 0xC0, - 0x01, 0xE0, 0x00, 0xE0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00, - 0x7C, 0x00, 0x3E, 0x00, 0x06, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x07, - 0xFF, 0xE0, 0x00, 0x07, 0xFF, 0xFE, 0x00, 0x03, 0xF8, 0x0F, 0xE0, 0x03, - 0xF0, 0x00, 0x7C, 0x01, 0xF0, 0x00, 0x07, 0x80, 0x78, 0x00, 0x00, 0xF0, - 0x3C, 0x00, 0x00, 0x1C, 0x1E, 0x00, 0x00, 0x07, 0x87, 0x00, 0xFF, 0xC0, - 0xE3, 0x80, 0xFF, 0xF8, 0x3C, 0xE0, 0x7E, 0x3E, 0x07, 0x78, 0x1E, 0x07, - 0x81, 0xDC, 0x0F, 0x01, 0xE0, 0x77, 0x03, 0x80, 0x78, 0x1D, 0xC1, 0xE0, - 0x1E, 0x07, 0x70, 0x78, 0x07, 0x81, 0xDC, 0x1E, 0x01, 0xC0, 0x7F, 0x07, - 0x00, 0x70, 0x1F, 0xC1, 0xE0, 0x1C, 0x07, 0x70, 0x78, 0x07, 0x03, 0x9C, - 0x0E, 0x03, 0xC0, 0xE7, 0x03, 0xC1, 0xF8, 0x79, 0xC0, 0xFD, 0xE7, 0x3C, - 0x70, 0x1F, 0xF9, 0xFE, 0x0E, 0x01, 0xF8, 0x3F, 0x03, 0x80, 0x00, 0x00, - 0x00, 0xF0, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x03, 0xC0, 0x00, - 0x00, 0x00, 0x7C, 0x00, 0x04, 0x00, 0x0F, 0xC0, 0x1F, 0x00, 0x01, 0xFF, - 0xFF, 0xC0, 0x00, 0x1F, 0xFF, 0xE0, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, - 0x0F, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x0F, 0xC0, - 0x00, 0x03, 0xF8, 0x00, 0x00, 0x77, 0x80, 0x00, 0x0E, 0xF0, 0x00, 0x03, - 0xCE, 0x00, 0x00, 0x71, 0xE0, 0x00, 0x1E, 0x3C, 0x00, 0x03, 0xC3, 0xC0, - 0x00, 0x70, 0x78, 0x00, 0x1E, 0x07, 0x00, 0x03, 0xC0, 0xF0, 0x00, 0xF0, - 0x1E, 0x00, 0x1E, 0x01, 0xC0, 0x03, 0x80, 0x3C, 0x00, 0xF0, 0x07, 0x80, - 0x1F, 0xFF, 0xF8, 0x07, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xE0, 0x1E, 0x00, - 0x1E, 0x07, 0x80, 0x03, 0xC0, 0xF0, 0x00, 0x3C, 0x1C, 0x00, 0x07, 0x87, - 0x80, 0x00, 0xF0, 0xF0, 0x00, 0x0F, 0x3C, 0x00, 0x01, 0xE7, 0x80, 0x00, - 0x3E, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x78, 0xFF, 0xF0, 0x03, 0xFF, - 0xFE, 0x0F, 0xFF, 0xFE, 0x3F, 0xFF, 0xF8, 0xF0, 0x03, 0xF3, 0xC0, 0x03, - 0xCF, 0x00, 0x0F, 0xBC, 0x00, 0x1E, 0xF0, 0x00, 0x7B, 0xC0, 0x01, 0xCF, - 0x00, 0x0F, 0x3C, 0x00, 0x3C, 0xF0, 0x01, 0xE3, 0xFF, 0xFF, 0x0F, 0xFF, - 0xE0, 0x3F, 0xFF, 0xE0, 0xFF, 0xFF, 0xE3, 0xC0, 0x07, 0xCF, 0x00, 0x0F, - 0xBC, 0x00, 0x1E, 0xF0, 0x00, 0x7F, 0xC0, 0x00, 0xFF, 0x00, 0x03, 0xFC, - 0x00, 0x1F, 0xF0, 0x00, 0x7B, 0xC0, 0x03, 0xEF, 0x00, 0x1F, 0xBC, 0x03, - 0xFC, 0xFF, 0xFF, 0xE3, 0xFF, 0xFF, 0x0F, 0xFF, 0xE0, 0x00, 0x00, 0x7F, - 0xF0, 0x03, 0xFF, 0xFC, 0x1F, 0xFF, 0xF0, 0x7F, 0x83, 0xE1, 0xF8, 0x00, - 0xC7, 0xE0, 0x00, 0x0F, 0x80, 0x00, 0x3E, 0x00, 0x00, 0x78, 0x00, 0x01, - 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x07, 0x80, 0x00, 0x0F, 0x00, 0x00, 0x1E, - 0x00, 0x00, 0x3C, 0x00, 0x00, 0x78, 0x00, 0x00, 0xF0, 0x00, 0x01, 0xE0, - 0x00, 0x03, 0xC0, 0x00, 0x07, 0x80, 0x00, 0x0F, 0x00, 0x00, 0x1F, 0x00, - 0x00, 0x1E, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x7C, 0x00, - 0x00, 0x7C, 0x00, 0x00, 0xFF, 0x00, 0xE0, 0xFF, 0xFF, 0xC0, 0x7F, 0xFF, - 0x80, 0x3F, 0xFE, 0x00, 0xFF, 0xF0, 0x00, 0x7F, 0xFF, 0xC0, 0x3F, 0xFF, - 0xF8, 0x1F, 0xFF, 0xFE, 0x0F, 0x00, 0x1F, 0x87, 0x80, 0x03, 0xE3, 0xC0, - 0x00, 0xF9, 0xE0, 0x00, 0x3C, 0xF0, 0x00, 0x1F, 0x78, 0x00, 0x07, 0xBC, - 0x00, 0x03, 0xDE, 0x00, 0x01, 0xEF, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x3F, - 0xC0, 0x00, 0x1F, 0xE0, 0x00, 0x0F, 0xF0, 0x00, 0x07, 0xF8, 0x00, 0x03, - 0xFC, 0x00, 0x03, 0xFE, 0x00, 0x01, 0xEF, 0x00, 0x00, 0xF7, 0x80, 0x00, - 0x7B, 0xC0, 0x00, 0x7D, 0xE0, 0x00, 0x3C, 0xF0, 0x00, 0x3E, 0x78, 0x00, - 0x3E, 0x3C, 0x00, 0x7E, 0x1E, 0x03, 0xFE, 0x0F, 0xFF, 0xFE, 0x07, 0xFF, - 0xFC, 0x03, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0x00, 0x07, 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00, - 0x78, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x0F, 0x00, 0x07, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x0F, - 0x00, 0x07, 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00, 0x78, 0x00, - 0x3C, 0x00, 0x1E, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x07, 0x80, 0x03, - 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x1E, 0x00, - 0x0F, 0x00, 0x07, 0x80, 0x03, 0xC0, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFC, 0x00, 0x1E, 0x00, 0x0F, 0x00, 0x07, 0x80, 0x03, 0xC0, 0x01, - 0xE0, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x0F, 0x00, - 0x07, 0x80, 0x03, 0xC0, 0x00, 0x00, 0x3F, 0xF8, 0x00, 0x7F, 0xFF, 0xC0, - 0xFF, 0xFF, 0xC1, 0xFF, 0x07, 0xE1, 0xF8, 0x00, 0x30, 0xF8, 0x00, 0x00, - 0xF8, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x78, 0x00, 0x00, 0x3C, 0x00, 0x00, - 0x3C, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x07, 0x80, 0x00, - 0x03, 0xC0, 0x00, 0x01, 0xE0, 0x03, 0xFF, 0xF0, 0x01, 0xFF, 0xF8, 0x00, - 0xFF, 0xFC, 0x00, 0x01, 0xFE, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x7F, 0xC0, - 0x00, 0x3D, 0xE0, 0x00, 0x1E, 0xF8, 0x00, 0x0F, 0x3C, 0x00, 0x07, 0x9F, - 0x00, 0x03, 0xC7, 0xE0, 0x01, 0xE1, 0xFC, 0x00, 0xF0, 0x7F, 0xFF, 0xF8, - 0x1F, 0xFF, 0xFC, 0x03, 0xFF, 0xF8, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, - 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, - 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, - 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x0F, - 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, - 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, - 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, - 0xF0, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0x01, 0xE0, 0x3C, 0x07, - 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, - 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, - 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x07, 0xFD, 0xFF, 0xFF, 0xF8, 0x01, 0xE0, - 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, - 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07, - 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, - 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x0F, 0x47, 0xEF, - 0xF9, 0xFE, 0x3F, 0x00, 0xF0, 0x00, 0x7D, 0xE0, 0x00, 0xF3, 0xC0, 0x03, - 0xC7, 0x80, 0x0F, 0x0F, 0x00, 0x3C, 0x1E, 0x00, 0xF0, 0x3C, 0x03, 0xE0, - 0x78, 0x0F, 0x80, 0xF0, 0x3E, 0x01, 0xE0, 0xF8, 0x03, 0xC3, 0xE0, 0x07, - 0x87, 0x80, 0x0F, 0x1E, 0x00, 0x1E, 0x78, 0x00, 0x3D, 0xF8, 0x00, 0x7F, - 0xF0, 0x00, 0xFF, 0xF0, 0x01, 0xF9, 0xF0, 0x03, 0xE1, 0xF0, 0x07, 0x81, - 0xE0, 0x0F, 0x03, 0xE0, 0x1E, 0x03, 0xE0, 0x3C, 0x03, 0xC0, 0x78, 0x03, - 0xC0, 0xF0, 0x07, 0xC1, 0xE0, 0x07, 0xC3, 0xC0, 0x07, 0x87, 0x80, 0x0F, - 0x8F, 0x00, 0x0F, 0x9E, 0x00, 0x0F, 0xBC, 0x00, 0x0F, 0x80, 0xF0, 0x00, - 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, - 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, - 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, - 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, - 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, - 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFC, 0x00, 0x00, 0x7F, - 0xF8, 0x00, 0x00, 0xFF, 0xF8, 0x00, 0x03, 0xFF, 0xF0, 0x00, 0x07, 0xFE, - 0xF0, 0x00, 0x0F, 0xFF, 0xE0, 0x00, 0x3F, 0xFD, 0xC0, 0x00, 0x77, 0xFB, - 0xC0, 0x01, 0xEF, 0xF7, 0x80, 0x03, 0xDF, 0xE7, 0x00, 0x07, 0x3F, 0xCF, - 0x00, 0x1E, 0x7F, 0x9E, 0x00, 0x38, 0xFF, 0x1E, 0x00, 0xF1, 0xFE, 0x3C, - 0x01, 0xE3, 0xFC, 0x38, 0x03, 0x87, 0xF8, 0x78, 0x0F, 0x0F, 0xF0, 0xF0, - 0x1C, 0x1F, 0xE0, 0xE0, 0x38, 0x3F, 0xC1, 0xE0, 0xF0, 0x7F, 0x83, 0xC1, - 0xC0, 0xFF, 0x03, 0xC7, 0x81, 0xFE, 0x07, 0x8F, 0x03, 0xFC, 0x07, 0x1C, - 0x07, 0xF8, 0x0F, 0x78, 0x0F, 0xF0, 0x1E, 0xE0, 0x1F, 0xE0, 0x1F, 0xC0, - 0x3F, 0xC0, 0x3F, 0x80, 0x7F, 0x80, 0x7E, 0x00, 0xFF, 0x00, 0x7C, 0x01, - 0xFE, 0x00, 0xF8, 0x03, 0xFC, 0x00, 0xE0, 0x07, 0x80, 0xF8, 0x00, 0x07, - 0xFC, 0x00, 0x03, 0xFF, 0x00, 0x01, 0xFF, 0xC0, 0x00, 0xFF, 0xE0, 0x00, - 0x7F, 0x78, 0x00, 0x3F, 0xBE, 0x00, 0x1F, 0xEF, 0x00, 0x0F, 0xF3, 0xC0, - 0x07, 0xF9, 0xF0, 0x03, 0xFC, 0x78, 0x01, 0xFE, 0x3E, 0x00, 0xFF, 0x0F, - 0x80, 0x7F, 0x83, 0xC0, 0x3F, 0xC1, 0xF0, 0x1F, 0xE0, 0x7C, 0x0F, 0xF0, - 0x1E, 0x07, 0xF8, 0x0F, 0x83, 0xFC, 0x03, 0xC1, 0xFE, 0x00, 0xF0, 0xFF, - 0x00, 0x7C, 0x7F, 0x80, 0x1E, 0x3F, 0xC0, 0x07, 0x9F, 0xE0, 0x03, 0xEF, - 0xF0, 0x00, 0xF7, 0xF8, 0x00, 0x7F, 0xFC, 0x00, 0x1F, 0xFE, 0x00, 0x07, - 0xFF, 0x00, 0x03, 0xFF, 0x80, 0x00, 0xFF, 0xC0, 0x00, 0x3E, 0x00, 0x7F, - 0xE0, 0x00, 0x3F, 0xFF, 0x80, 0x07, 0xFF, 0xFE, 0x00, 0xFE, 0x07, 0xF0, - 0x1F, 0x00, 0x1F, 0x83, 0xE0, 0x00, 0x78, 0x3C, 0x00, 0x03, 0xC7, 0x80, - 0x00, 0x3C, 0x78, 0x00, 0x01, 0xEF, 0x80, 0x00, 0x1E, 0xF0, 0x00, 0x01, - 0xEF, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x0F, 0xF0, - 0x00, 0x00, 0xFF, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFF, 0x00, 0x00, - 0x0F, 0xF0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x01, 0xFF, - 0x80, 0x00, 0x1E, 0x78, 0x00, 0x01, 0xE7, 0x80, 0x00, 0x3E, 0x7C, 0x00, - 0x03, 0xC3, 0xE0, 0x00, 0x7C, 0x1F, 0x00, 0x0F, 0x81, 0xFC, 0x03, 0xF0, - 0x07, 0xFF, 0xFE, 0x00, 0x3F, 0xFF, 0xC0, 0x00, 0xFF, 0xF0, 0x00, 0xFF, - 0xF0, 0x0F, 0xFF, 0xE0, 0xFF, 0xFF, 0x8F, 0xFF, 0xFC, 0xF0, 0x07, 0xEF, - 0x00, 0x3E, 0xF0, 0x01, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, - 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x01, 0xEF, 0x00, 0x1E, 0xF0, 0x07, - 0xCF, 0x03, 0xFC, 0xFF, 0xFF, 0x8F, 0xFF, 0xE0, 0xFF, 0xF8, 0x0F, 0x00, - 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, - 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, - 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x7F, 0xE0, 0x00, 0x3F, 0xFF, 0x80, - 0x07, 0xFF, 0xFE, 0x00, 0xFE, 0x07, 0xF0, 0x1F, 0x00, 0x1F, 0x83, 0xE0, - 0x00, 0x78, 0x3C, 0x00, 0x03, 0xC7, 0x80, 0x00, 0x3C, 0x78, 0x00, 0x01, - 0xEF, 0x80, 0x00, 0x1E, 0xF0, 0x00, 0x01, 0xEF, 0x00, 0x00, 0x0F, 0xF0, - 0x00, 0x00, 0xFF, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFF, 0x00, 0x00, - 0x0F, 0xF0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFF, - 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x1E, 0x78, 0x00, - 0x01, 0xE7, 0x80, 0x00, 0x3E, 0x7C, 0x00, 0x03, 0xC3, 0xE0, 0x00, 0x7C, - 0x1F, 0x00, 0x0F, 0x81, 0xFC, 0x03, 0xF0, 0x07, 0xFF, 0xFE, 0x00, 0x3F, - 0xFF, 0xC0, 0x00, 0xFF, 0xE0, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0xF8, - 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x03, 0xF0, 0x00, - 0x00, 0x1F, 0x80, 0x00, 0x00, 0xFC, 0xFF, 0xF0, 0x03, 0xFF, 0xFC, 0x0F, - 0xFF, 0xF8, 0x3F, 0xFF, 0xF0, 0xF0, 0x07, 0xE3, 0xC0, 0x07, 0x8F, 0x00, - 0x1F, 0x3C, 0x00, 0x3C, 0xF0, 0x00, 0xF3, 0xC0, 0x03, 0xCF, 0x00, 0x0F, - 0x3C, 0x00, 0x7C, 0xF0, 0x01, 0xE3, 0xC0, 0x0F, 0x8F, 0x00, 0xFC, 0x3F, - 0xFF, 0xE0, 0xFF, 0xFE, 0x03, 0xFF, 0xF0, 0x0F, 0x03, 0xC0, 0x3C, 0x07, - 0x80, 0xF0, 0x1F, 0x03, 0xC0, 0x3C, 0x0F, 0x00, 0x78, 0x3C, 0x01, 0xF0, - 0xF0, 0x03, 0xC3, 0xC0, 0x0F, 0x8F, 0x00, 0x1E, 0x3C, 0x00, 0x3C, 0xF0, - 0x00, 0xFB, 0xC0, 0x01, 0xEF, 0x00, 0x07, 0xC0, 0x03, 0xFF, 0x00, 0xFF, - 0xFE, 0x1F, 0xFF, 0xE3, 0xF0, 0x7C, 0x7C, 0x00, 0x47, 0x80, 0x00, 0x78, - 0x00, 0x07, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, 0x00, 0x78, 0x00, 0x07, - 0xC0, 0x00, 0x3F, 0x00, 0x01, 0xFC, 0x00, 0x0F, 0xF8, 0x00, 0x3F, 0xE0, - 0x00, 0xFF, 0x80, 0x03, 0xFC, 0x00, 0x07, 0xC0, 0x00, 0x3E, 0x00, 0x01, - 0xE0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xE0, 0x00, - 0x1E, 0x80, 0x03, 0xEF, 0x00, 0x7C, 0xFF, 0xFF, 0x8F, 0xFF, 0xF0, 0x7F, - 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xF0, 0x03, 0xC0, 0x00, 0x07, 0x80, 0x00, 0x0F, 0x00, 0x00, 0x1E, - 0x00, 0x00, 0x3C, 0x00, 0x00, 0x78, 0x00, 0x00, 0xF0, 0x00, 0x01, 0xE0, - 0x00, 0x03, 0xC0, 0x00, 0x07, 0x80, 0x00, 0x0F, 0x00, 0x00, 0x1E, 0x00, - 0x00, 0x3C, 0x00, 0x00, 0x78, 0x00, 0x00, 0xF0, 0x00, 0x01, 0xE0, 0x00, - 0x03, 0xC0, 0x00, 0x07, 0x80, 0x00, 0x0F, 0x00, 0x00, 0x1E, 0x00, 0x00, - 0x3C, 0x00, 0x00, 0x78, 0x00, 0x00, 0xF0, 0x00, 0x01, 0xE0, 0x00, 0x03, - 0xC0, 0x00, 0x07, 0x80, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0xF0, - 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, - 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, - 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, - 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, - 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, - 0x00, 0x0E, 0xF0, 0x00, 0x1E, 0xF0, 0x00, 0x1E, 0x78, 0x00, 0x1E, 0x78, - 0x00, 0x3C, 0x7C, 0x00, 0x7C, 0x3F, 0x01, 0xF8, 0x1F, 0xFF, 0xF0, 0x0F, - 0xFF, 0xE0, 0x03, 0xFF, 0x80, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x01, 0xE7, - 0x80, 0x00, 0x79, 0xE0, 0x00, 0x1E, 0x3C, 0x00, 0x0F, 0x0F, 0x00, 0x03, - 0xC3, 0xC0, 0x00, 0xF0, 0x78, 0x00, 0x78, 0x1E, 0x00, 0x1E, 0x07, 0x80, - 0x0F, 0x80, 0xF0, 0x03, 0xC0, 0x3C, 0x00, 0xF0, 0x0F, 0x00, 0x78, 0x01, - 0xE0, 0x1E, 0x00, 0x78, 0x07, 0x80, 0x1E, 0x03, 0xC0, 0x03, 0xC0, 0xF0, - 0x00, 0xF0, 0x3C, 0x00, 0x1C, 0x1E, 0x00, 0x07, 0x87, 0x80, 0x01, 0xE1, - 0xE0, 0x00, 0x3C, 0xF0, 0x00, 0x0F, 0x3C, 0x00, 0x03, 0xCF, 0x00, 0x00, - 0x77, 0x80, 0x00, 0x1F, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x00, 0xFC, 0x00, - 0x00, 0x3F, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x01, 0xE0, 0x00, 0xF0, 0x00, - 0x78, 0x00, 0x3F, 0xE0, 0x01, 0xF0, 0x00, 0x7B, 0xC0, 0x03, 0xF0, 0x00, - 0xF7, 0x80, 0x07, 0xE0, 0x01, 0xE7, 0x80, 0x0F, 0xC0, 0x07, 0x8F, 0x00, - 0x3F, 0x80, 0x0F, 0x1E, 0x00, 0x7F, 0x80, 0x1E, 0x3C, 0x00, 0xEF, 0x00, - 0x3C, 0x3C, 0x03, 0xCE, 0x00, 0xF0, 0x78, 0x07, 0x9E, 0x01, 0xE0, 0xF0, - 0x0F, 0x3C, 0x03, 0xC0, 0xE0, 0x1C, 0x38, 0x07, 0x81, 0xE0, 0x78, 0x78, - 0x1E, 0x03, 0xC0, 0xF0, 0xF0, 0x3C, 0x07, 0x81, 0xC1, 0xE0, 0x78, 0x07, - 0x07, 0x81, 0xE0, 0xE0, 0x0F, 0x0F, 0x03, 0xC3, 0xC0, 0x1E, 0x1E, 0x07, - 0x87, 0x80, 0x3C, 0x38, 0x07, 0x0F, 0x00, 0x38, 0xF0, 0x0F, 0x1C, 0x00, - 0x79, 0xE0, 0x1E, 0x78, 0x00, 0xF3, 0x80, 0x1C, 0xF0, 0x01, 0xEF, 0x00, - 0x39, 0xE0, 0x01, 0xDE, 0x00, 0x7B, 0x80, 0x03, 0xF8, 0x00, 0xFF, 0x00, - 0x07, 0xF0, 0x00, 0xFE, 0x00, 0x0F, 0xE0, 0x01, 0xFC, 0x00, 0x0F, 0xC0, - 0x03, 0xF0, 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, 0x3E, 0x00, 0x07, 0xC0, - 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x0F, 0x1E, 0x00, 0x0F, - 0x8F, 0x80, 0x07, 0x83, 0xC0, 0x07, 0x80, 0xF0, 0x03, 0xC0, 0x78, 0x03, - 0xC0, 0x1E, 0x03, 0xC0, 0x07, 0x81, 0xE0, 0x03, 0xC1, 0xE0, 0x00, 0xF1, - 0xE0, 0x00, 0x7C, 0xF0, 0x00, 0x1E, 0xF0, 0x00, 0x07, 0xF0, 0x00, 0x03, - 0xF8, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x7F, 0x00, 0x00, - 0x3F, 0x80, 0x00, 0x3D, 0xE0, 0x00, 0x3C, 0x78, 0x00, 0x1E, 0x3C, 0x00, - 0x1E, 0x0F, 0x00, 0x0F, 0x03, 0xC0, 0x0F, 0x01, 0xE0, 0x0F, 0x00, 0x78, - 0x07, 0x80, 0x3E, 0x07, 0x80, 0x0F, 0x07, 0x80, 0x03, 0xC3, 0xC0, 0x01, - 0xE3, 0xC0, 0x00, 0x7B, 0xE0, 0x00, 0x3E, 0xF0, 0x00, 0x0F, 0x78, 0x00, - 0x0F, 0x78, 0x00, 0x1E, 0x3C, 0x00, 0x3E, 0x3C, 0x00, 0x3C, 0x1E, 0x00, - 0x7C, 0x1F, 0x00, 0x78, 0x0F, 0x00, 0xF0, 0x0F, 0x80, 0xF0, 0x07, 0x81, - 0xE0, 0x03, 0xC1, 0xE0, 0x03, 0xC3, 0xC0, 0x01, 0xE3, 0xC0, 0x01, 0xE7, - 0x80, 0x00, 0xF7, 0x80, 0x00, 0xFF, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7E, - 0x00, 0x00, 0x3C, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x3C, - 0x00, 0x00, 0x3C, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x3C, - 0x00, 0x00, 0x3C, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x3C, - 0x00, 0x00, 0x3C, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xE0, 0x00, 0x1F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, - 0xF8, 0x00, 0x07, 0x80, 0x00, 0x78, 0x00, 0x07, 0xC0, 0x00, 0x3C, 0x00, - 0x03, 0xC0, 0x00, 0x3E, 0x00, 0x01, 0xE0, 0x00, 0x1E, 0x00, 0x01, 0xF0, - 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x78, 0x00, 0x07, - 0x80, 0x00, 0x7C, 0x00, 0x03, 0xC0, 0x00, 0x3C, 0x00, 0x03, 0xE0, 0x00, - 0x1E, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, - 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, - 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, - 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xFF, 0xFF, - 0xFF, 0xF0, 0xF0, 0x00, 0x78, 0x00, 0x78, 0x00, 0x38, 0x00, 0x3C, 0x00, - 0x3C, 0x00, 0x1C, 0x00, 0x1E, 0x00, 0x0E, 0x00, 0x0F, 0x00, 0x0F, 0x00, - 0x07, 0x00, 0x07, 0x80, 0x07, 0x80, 0x03, 0x80, 0x03, 0xC0, 0x03, 0xC0, - 0x01, 0xE0, 0x01, 0xE0, 0x00, 0xE0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0x70, - 0x00, 0x78, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x1C, 0x00, 0x1E, - 0x00, 0x1E, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFC, 0x0F, 0x03, 0xC0, 0xF0, - 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, - 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, - 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3F, - 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x60, 0x00, 0x07, 0x80, 0x00, 0x3C, 0x00, - 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x01, 0xCE, 0x00, 0x0E, 0x70, 0x00, 0xE1, - 0xC0, 0x07, 0x0E, 0x00, 0x70, 0x38, 0x03, 0x81, 0xC0, 0x3C, 0x07, 0x01, - 0xC0, 0x38, 0x1E, 0x00, 0xE0, 0xE0, 0x07, 0x0F, 0x00, 0x1C, 0x70, 0x00, - 0xE3, 0x80, 0x03, 0xB8, 0x00, 0x1D, 0xC0, 0x00, 0x70, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0xF0, 0xF8, 0x7C, 0x3C, 0x1E, 0x0F, 0x07, - 0x07, 0xFE, 0x03, 0xFF, 0xF0, 0x7F, 0xFF, 0x0E, 0x03, 0xE0, 0x00, 0x3C, - 0x00, 0x03, 0xC0, 0x00, 0x78, 0x00, 0x0F, 0x00, 0x01, 0xE0, 0x1F, 0xFC, - 0x3F, 0xFF, 0x9F, 0xFF, 0xF7, 0xE0, 0x1E, 0xF0, 0x03, 0xFC, 0x00, 0x7F, - 0x80, 0x0F, 0xF0, 0x03, 0xFE, 0x00, 0x7F, 0xC0, 0x1F, 0xFC, 0x07, 0xF7, - 0xFF, 0xDE, 0x7F, 0xF1, 0xC7, 0xFC, 0x38, 0xE0, 0x00, 0x0E, 0x00, 0x00, - 0xE0, 0x00, 0x0E, 0x00, 0x00, 0xE0, 0x00, 0x0E, 0x00, 0x00, 0xE0, 0x00, - 0x0E, 0x00, 0x00, 0xE0, 0x00, 0x0E, 0x00, 0x00, 0xE3, 0xFE, 0x0E, 0x7F, - 0xF0, 0xEF, 0xFF, 0xCF, 0xC0, 0x7C, 0xF8, 0x03, 0xEF, 0x00, 0x1E, 0xF0, - 0x01, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xE0, 0x00, 0xFE, - 0x00, 0x0F, 0xE0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, - 0xF0, 0x01, 0xFF, 0x80, 0x1E, 0xF8, 0x03, 0xEF, 0xC0, 0x7C, 0xEF, 0xFF, - 0x8E, 0x7F, 0xF0, 0xE3, 0xFE, 0x00, 0x00, 0x10, 0x01, 0xFF, 0xC3, 0xFF, - 0xE3, 0xFF, 0xF3, 0xF0, 0x11, 0xE0, 0x01, 0xF0, 0x00, 0xF0, 0x00, 0x78, - 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x0F, 0x00, 0x07, 0x80, 0x03, - 0xC0, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x1F, 0x00, 0x07, 0x80, - 0x03, 0xF0, 0x18, 0xFF, 0xFC, 0x3F, 0xFE, 0x07, 0xFE, 0x00, 0x00, 0x78, - 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, - 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x03, 0x03, 0xC1, - 0xFF, 0x1E, 0x1F, 0xFE, 0xF1, 0xFF, 0xFF, 0x9F, 0x01, 0xFC, 0xF0, 0x07, - 0xEF, 0x80, 0x1F, 0x78, 0x00, 0xFB, 0xC0, 0x03, 0xDE, 0x00, 0x1F, 0xE0, - 0x00, 0xFF, 0x00, 0x07, 0xF8, 0x00, 0x3F, 0xC0, 0x01, 0xFE, 0x00, 0x0F, - 0x78, 0x00, 0x7B, 0xC0, 0x03, 0xDE, 0x00, 0x3E, 0xF8, 0x01, 0xF3, 0xC0, - 0x1F, 0x9F, 0x01, 0xFC, 0x7F, 0xFF, 0xE1, 0xFF, 0xEF, 0x03, 0xFC, 0x38, - 0x00, 0x20, 0x00, 0x3F, 0xE0, 0x0F, 0xFF, 0x81, 0xFF, 0xFC, 0x1E, 0x03, - 0xC3, 0xC0, 0x1E, 0x78, 0x01, 0xE7, 0x80, 0x0F, 0x78, 0x00, 0xF7, 0x00, - 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xF0, - 0x00, 0x07, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, 0x00, 0x7C, 0x00, 0x03, - 0xE0, 0x00, 0x1F, 0x00, 0x61, 0xFF, 0xFE, 0x07, 0xFF, 0xE0, 0x3F, 0xFC, - 0x00, 0xFE, 0x03, 0xFF, 0x07, 0xFE, 0x07, 0xC2, 0x0F, 0x00, 0x0F, 0x00, - 0x0F, 0x00, 0x0F, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x7F, 0xF8, 0xFF, 0xF8, - 0xFF, 0xF8, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, - 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, - 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, - 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x00, 0x60, 0x00, 0x3F, 0xE1, 0xC3, - 0xFF, 0xCE, 0x3F, 0xFF, 0xF3, 0xE0, 0x3F, 0x9E, 0x00, 0xFD, 0xF0, 0x03, - 0xEF, 0x00, 0x1F, 0x78, 0x00, 0x7B, 0xC0, 0x03, 0xFC, 0x00, 0x1F, 0xE0, - 0x00, 0xFF, 0x00, 0x07, 0xF8, 0x00, 0x3F, 0xE0, 0x01, 0xEF, 0x00, 0x0F, - 0x78, 0x00, 0x7B, 0xC0, 0x03, 0xDF, 0x00, 0x3E, 0x78, 0x03, 0xF3, 0xE0, - 0x3F, 0x8F, 0xFF, 0xFC, 0x3F, 0xFD, 0xE0, 0x7F, 0x8F, 0x00, 0x00, 0x78, - 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x10, 0x00, - 0xF8, 0xE0, 0x0F, 0x87, 0xFF, 0xFC, 0x3F, 0xFF, 0xC0, 0x7F, 0xF8, 0x00, - 0xE0, 0x00, 0x1C, 0x00, 0x03, 0x80, 0x00, 0x70, 0x00, 0x0E, 0x00, 0x01, - 0xC0, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0xE0, 0x00, 0x1C, 0x00, 0x03, - 0x8F, 0xFC, 0x73, 0xFF, 0xCE, 0xFF, 0xFD, 0xF8, 0x0F, 0xBE, 0x00, 0xFF, - 0xC0, 0x0F, 0xF0, 0x01, 0xFE, 0x00, 0x3F, 0xC0, 0x07, 0xF8, 0x00, 0xFE, - 0x00, 0x1F, 0xC0, 0x03, 0xF8, 0x00, 0x7F, 0x00, 0x0F, 0xE0, 0x01, 0xFC, - 0x00, 0x3F, 0x80, 0x07, 0xF0, 0x00, 0xFE, 0x00, 0x1F, 0xC0, 0x03, 0xF8, - 0x00, 0x7F, 0x00, 0x0F, 0xE0, 0x01, 0xE0, 0x33, 0xFF, 0xF7, 0x00, 0x00, - 0x03, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9C, - 0xE7, 0x39, 0xCE, 0x01, 0x80, 0xF0, 0x7C, 0x1F, 0x03, 0x80, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xE0, 0x38, 0x0E, 0x03, 0x80, 0xE0, 0x38, 0x0E, 0x03, - 0x80, 0xE0, 0x38, 0x0E, 0x03, 0x80, 0xE0, 0x38, 0x0E, 0x03, 0x80, 0xE0, - 0x38, 0x0E, 0x03, 0x80, 0xE0, 0x38, 0x0E, 0x03, 0x80, 0xE0, 0x38, 0x0E, - 0x03, 0x81, 0xE0, 0x7B, 0xFE, 0xFF, 0x3F, 0x80, 0xE0, 0x00, 0x1C, 0x00, - 0x03, 0x80, 0x00, 0x70, 0x00, 0x0E, 0x00, 0x01, 0xC0, 0x00, 0x38, 0x00, - 0x07, 0x00, 0x00, 0xE0, 0x00, 0x1C, 0x00, 0x03, 0x80, 0x1F, 0x70, 0x07, - 0x8E, 0x01, 0xF1, 0xC0, 0x7C, 0x38, 0x1F, 0x07, 0x07, 0xC0, 0xE1, 0xF0, - 0x1C, 0x7C, 0x03, 0x9F, 0x00, 0x73, 0xC0, 0x0E, 0xF8, 0x01, 0xFF, 0x80, - 0x3F, 0xF8, 0x07, 0xCF, 0x00, 0xE0, 0xF0, 0x1C, 0x1F, 0x03, 0x81, 0xF0, - 0x70, 0x1E, 0x0E, 0x01, 0xE1, 0xC0, 0x3E, 0x38, 0x03, 0xE7, 0x00, 0x3C, - 0xE0, 0x03, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x20, 0x00, 0xC0, 0x71, 0xFF, 0x03, 0xFE, - 0x39, 0xFF, 0xC7, 0xFF, 0x9D, 0xFF, 0xF7, 0xFF, 0xEF, 0xC0, 0x7F, 0x81, - 0xF7, 0xC0, 0x3F, 0x80, 0x7B, 0xC0, 0x0F, 0x80, 0x1F, 0xE0, 0x07, 0xC0, - 0x0F, 0xF0, 0x03, 0xC0, 0x07, 0xF8, 0x01, 0xE0, 0x03, 0xFC, 0x00, 0xF0, - 0x01, 0xFC, 0x00, 0x78, 0x00, 0xFE, 0x00, 0x3C, 0x00, 0x7F, 0x00, 0x1E, - 0x00, 0x3F, 0x80, 0x0F, 0x00, 0x1F, 0xC0, 0x07, 0x80, 0x0F, 0xE0, 0x03, - 0xC0, 0x07, 0xF0, 0x01, 0xE0, 0x03, 0xF8, 0x00, 0xF0, 0x01, 0xFC, 0x00, - 0x78, 0x00, 0xFE, 0x00, 0x3C, 0x00, 0x7F, 0x00, 0x1E, 0x00, 0x3F, 0x80, - 0x0F, 0x00, 0x1F, 0xC0, 0x07, 0x80, 0x0F, 0x00, 0x30, 0x1C, 0x7F, 0xE3, - 0x9F, 0xFE, 0x77, 0xFF, 0xEF, 0xC0, 0x7D, 0xF0, 0x07, 0xFC, 0x00, 0x7F, - 0x80, 0x0F, 0xF0, 0x01, 0xFE, 0x00, 0x3F, 0xC0, 0x07, 0xF0, 0x00, 0xFE, - 0x00, 0x1F, 0xC0, 0x03, 0xF8, 0x00, 0x7F, 0x00, 0x0F, 0xE0, 0x01, 0xFC, - 0x00, 0x3F, 0x80, 0x07, 0xF0, 0x00, 0xFE, 0x00, 0x1F, 0xC0, 0x03, 0xF8, - 0x00, 0x7F, 0x00, 0x0F, 0x00, 0x10, 0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xFC, - 0x07, 0xFF, 0xF8, 0x3E, 0x03, 0xE0, 0xF0, 0x03, 0xC7, 0xC0, 0x0F, 0x9E, - 0x00, 0x1E, 0x78, 0x00, 0x79, 0xE0, 0x00, 0xEF, 0x00, 0x03, 0xFC, 0x00, - 0x0F, 0xF0, 0x00, 0x3F, 0xC0, 0x00, 0xFF, 0x00, 0x03, 0xDE, 0x00, 0x0E, - 0x78, 0x00, 0x79, 0xE0, 0x01, 0xE3, 0xC0, 0x0F, 0x8F, 0x00, 0x3C, 0x1F, - 0x03, 0xE0, 0x3F, 0xFF, 0x80, 0x7F, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x20, - 0x0E, 0x3F, 0xE0, 0xE7, 0xFF, 0x8E, 0xFF, 0xFC, 0xFC, 0x07, 0xCF, 0x80, - 0x3E, 0xF0, 0x01, 0xEF, 0x00, 0x1F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, - 0x00, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0xFE, 0x00, 0x0F, 0xF0, 0x00, 0xFF, - 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x1E, 0xF8, 0x01, 0xEF, 0x80, 0x3E, - 0xFE, 0x07, 0xCE, 0xFF, 0xF8, 0xE7, 0xFF, 0x0E, 0x3F, 0xE0, 0xE0, 0x00, - 0x0E, 0x00, 0x00, 0xE0, 0x00, 0x0E, 0x00, 0x00, 0xE0, 0x00, 0x0E, 0x00, - 0x00, 0xE0, 0x00, 0x0E, 0x00, 0x00, 0xE0, 0x00, 0x0E, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x1F, 0xE1, 0xC3, 0xFF, 0xCE, 0x3F, 0xFF, 0xF3, 0xE0, 0x3F, - 0x9E, 0x00, 0xFD, 0xF0, 0x03, 0xEF, 0x00, 0x1F, 0x78, 0x00, 0x7B, 0xC0, - 0x03, 0xFC, 0x00, 0x1F, 0xE0, 0x00, 0xFF, 0x00, 0x07, 0xF8, 0x00, 0x3F, - 0xC0, 0x01, 0xEF, 0x00, 0x0F, 0x78, 0x00, 0x7B, 0xC0, 0x07, 0xDF, 0x00, - 0x3E, 0x78, 0x03, 0xF3, 0xE0, 0x3F, 0x8F, 0xFF, 0xFC, 0x3F, 0xFD, 0xE0, - 0x7F, 0x8F, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, - 0xF0, 0x00, 0x07, 0x80, 0x00, 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00, - 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x27, 0x0F, 0xF9, 0xFF, 0xDF, 0xFE, - 0xF0, 0x7E, 0x03, 0xE0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xC0, - 0x0E, 0x00, 0x70, 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x38, 0x01, - 0xC0, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x1C, 0x00, 0x00, 0xC0, 0x07, 0xFF, - 0x0F, 0xFF, 0xCF, 0xFF, 0xE7, 0x80, 0x67, 0x80, 0x03, 0xC0, 0x01, 0xE0, - 0x00, 0xF8, 0x00, 0x3F, 0x00, 0x0F, 0xE0, 0x03, 0xFE, 0x00, 0x7F, 0xC0, - 0x0F, 0xF0, 0x00, 0xFC, 0x00, 0x1E, 0x00, 0x07, 0x80, 0x03, 0xC0, 0x01, - 0xE0, 0x00, 0xEE, 0x00, 0xF7, 0xFF, 0xF3, 0xFF, 0xF8, 0xFF, 0xF0, 0x0E, - 0x00, 0x38, 0x00, 0xE0, 0x07, 0x80, 0x1E, 0x01, 0xFF, 0xEF, 0xFF, 0xBF, - 0xFE, 0x1E, 0x00, 0x78, 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x01, - 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00, - 0x78, 0x01, 0xE0, 0x07, 0x80, 0x1F, 0x00, 0x3F, 0xF0, 0x7F, 0xC0, 0xFF, - 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, - 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, - 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, - 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xF7, 0x80, 0x1F, 0x78, 0x03, 0xF7, - 0xC0, 0x7F, 0x3F, 0xFF, 0xF1, 0xFF, 0xE7, 0x0F, 0xF8, 0x70, 0xF0, 0x00, - 0x3D, 0xE0, 0x01, 0xE7, 0x80, 0x07, 0x9E, 0x00, 0x1E, 0x3C, 0x00, 0xF0, - 0xF0, 0x03, 0xC1, 0xC0, 0x1E, 0x07, 0x80, 0x78, 0x1E, 0x01, 0xE0, 0x3C, - 0x0F, 0x00, 0xF0, 0x3C, 0x03, 0xC0, 0xE0, 0x07, 0x87, 0x80, 0x1E, 0x1E, - 0x00, 0x38, 0x70, 0x00, 0xF3, 0xC0, 0x03, 0xCF, 0x00, 0x07, 0x38, 0x00, - 0x1F, 0xE0, 0x00, 0x7F, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xF0, 0x00, 0x07, - 0x80, 0x00, 0xF8, 0x01, 0xE0, 0x07, 0xBC, 0x01, 0xF8, 0x03, 0xDE, 0x00, - 0xFC, 0x01, 0xEF, 0x00, 0x7E, 0x00, 0xE3, 0xC0, 0x7F, 0x00, 0xF1, 0xE0, - 0x3B, 0xC0, 0x78, 0xF0, 0x1C, 0xE0, 0x3C, 0x38, 0x1E, 0x70, 0x1C, 0x1E, - 0x0F, 0x3C, 0x1E, 0x0F, 0x07, 0x1E, 0x0F, 0x07, 0x83, 0x87, 0x07, 0x01, - 0xC3, 0xC3, 0xC7, 0x80, 0xF1, 0xC1, 0xE3, 0xC0, 0x78, 0xE0, 0x71, 0xE0, - 0x3C, 0xF0, 0x38, 0xE0, 0x0E, 0x70, 0x1E, 0xF0, 0x07, 0xB8, 0x07, 0x78, - 0x03, 0xDC, 0x03, 0xBC, 0x00, 0xFE, 0x01, 0xDC, 0x00, 0x7E, 0x00, 0xFE, - 0x00, 0x3F, 0x00, 0x3F, 0x00, 0x1F, 0x80, 0x1F, 0x00, 0x07, 0x80, 0x0F, - 0x80, 0xF8, 0x00, 0xFB, 0xE0, 0x0F, 0x0F, 0x00, 0x78, 0x3C, 0x07, 0x81, - 0xF0, 0x78, 0x07, 0x83, 0xC0, 0x1E, 0x3C, 0x00, 0x7B, 0xC0, 0x03, 0xFE, - 0x00, 0x0F, 0xE0, 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x1F, 0xC0, 0x01, - 0xFE, 0x00, 0x0F, 0x78, 0x00, 0xF1, 0xE0, 0x0F, 0x8F, 0x00, 0x78, 0x3C, - 0x07, 0x80, 0xF0, 0x78, 0x07, 0xC3, 0xC0, 0x1E, 0x3C, 0x00, 0x7B, 0xC0, - 0x03, 0xE0, 0xF0, 0x00, 0x3D, 0xE0, 0x01, 0xE7, 0x80, 0x07, 0x9E, 0x00, - 0x1E, 0x3C, 0x00, 0xF0, 0xF0, 0x03, 0xC1, 0xE0, 0x1E, 0x07, 0x80, 0x78, - 0x1E, 0x01, 0xE0, 0x3C, 0x0F, 0x00, 0xF0, 0x3C, 0x01, 0xC0, 0xF0, 0x07, - 0x87, 0x80, 0x0E, 0x1E, 0x00, 0x3C, 0x70, 0x00, 0xF3, 0xC0, 0x01, 0xCF, - 0x00, 0x07, 0xB8, 0x00, 0x1F, 0xE0, 0x00, 0x3F, 0x80, 0x00, 0xFC, 0x00, - 0x01, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x03, - 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00, - 0x0F, 0xFC, 0x00, 0x3F, 0xE0, 0x00, 0xFE, 0x00, 0x00, 0xFF, 0xFF, 0x7F, - 0xFF, 0xBF, 0xFF, 0xC0, 0x01, 0xE0, 0x01, 0xE0, 0x01, 0xE0, 0x00, 0xF0, - 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF8, 0x00, 0x78, 0x00, 0x78, 0x00, 0x78, - 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x3E, 0x00, 0x1E, 0x00, 0x1E, - 0x00, 0x1E, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x1C, - 0x01, 0xF0, 0x1F, 0xC0, 0xFE, 0x03, 0xC0, 0x0F, 0x00, 0x78, 0x01, 0xE0, - 0x07, 0x80, 0x1E, 0x00, 0x78, 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x78, - 0x01, 0xE0, 0x0F, 0x83, 0xFC, 0x0F, 0xC0, 0x3F, 0x00, 0xFF, 0x00, 0x3E, - 0x00, 0x78, 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x01, 0xE0, 0x07, - 0x80, 0x1E, 0x00, 0x78, 0x01, 0xE0, 0x03, 0xC0, 0x0F, 0x00, 0x3F, 0x80, - 0x7F, 0x00, 0xFC, 0x00, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0xE0, 0x03, - 0xF0, 0x0F, 0xE0, 0x1F, 0xC0, 0x0F, 0x00, 0x1E, 0x00, 0x78, 0x01, 0xE0, - 0x07, 0x80, 0x1E, 0x00, 0x78, 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x78, - 0x01, 0xE0, 0x03, 0xC0, 0x07, 0xF0, 0x0F, 0xC0, 0x1F, 0x01, 0xFC, 0x0F, - 0x00, 0x78, 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x01, 0xE0, 0x07, - 0x80, 0x1E, 0x00, 0x78, 0x01, 0xE0, 0x07, 0x80, 0x3C, 0x07, 0xF0, 0x3F, - 0x80, 0xFC, 0x03, 0x80, 0x00, 0x1F, 0x80, 0x17, 0xFE, 0x01, 0xFF, 0xFE, - 0xFE, 0x0F, 0xFF, 0xC0, 0x3F, 0xE8, 0x00, 0x78 }; - -const GFXglyph NotoSans_Regular22pt7bGlyphs[] PROGMEM = { - { 0, 1, 1, 11, 0, 0 }, // 0x20 ' ' - { 1, 5, 32, 12, 3, -30 }, // 0x21 '!' - { 21, 12, 11, 18, 3, -30 }, // 0x22 '"' - { 38, 26, 31, 28, 1, -30 }, // 0x23 '#' - { 139, 19, 36, 25, 3, -32 }, // 0x24 '$' - { 225, 32, 31, 36, 2, -30 }, // 0x25 '%' - { 349, 29, 31, 32, 2, -30 }, // 0x26 '&' - { 462, 4, 11, 10, 3, -30 }, // 0x27 ''' - { 468, 10, 38, 13, 2, -30 }, // 0x28 '(' - { 516, 10, 38, 13, 1, -30 }, // 0x29 ')' - { 564, 20, 20, 24, 2, -32 }, // 0x2A '*' - { 614, 20, 21, 25, 2, -25 }, // 0x2B '+' - { 667, 6, 11, 12, 2, -4 }, // 0x2C ',' - { 676, 10, 3, 14, 2, -12 }, // 0x2D '-' - { 680, 5, 6, 12, 3, -4 }, // 0x2E '.' - { 684, 16, 31, 16, 0, -30 }, // 0x2F '/' - { 746, 21, 31, 25, 2, -30 }, // 0x30 '0' - { 828, 11, 31, 25, 4, -30 }, // 0x31 '1' - { 871, 20, 31, 25, 2, -30 }, // 0x32 '2' - { 949, 20, 31, 25, 2, -30 }, // 0x33 '3' - { 1027, 23, 31, 25, 1, -30 }, // 0x34 '4' - { 1117, 19, 31, 25, 3, -30 }, // 0x35 '5' - { 1191, 21, 31, 25, 2, -30 }, // 0x36 '6' - { 1273, 21, 31, 25, 2, -30 }, // 0x37 '7' - { 1355, 20, 31, 25, 2, -30 }, // 0x38 '8' - { 1433, 20, 31, 25, 2, -30 }, // 0x39 '9' - { 1511, 5, 25, 12, 3, -23 }, // 0x3A ':' - { 1527, 7, 30, 12, 1, -23 }, // 0x3B ';' - { 1554, 20, 21, 25, 2, -25 }, // 0x3C '<' - { 1607, 20, 12, 25, 2, -20 }, // 0x3D '=' - { 1637, 20, 21, 25, 2, -25 }, // 0x3E '>' - { 1690, 17, 32, 19, 1, -30 }, // 0x3F '?' - { 1758, 34, 35, 39, 2, -30 }, // 0x40 '@' - { 1907, 27, 31, 28, 0, -30 }, // 0x41 'A' - { 2012, 22, 31, 28, 4, -30 }, // 0x42 'B' - { 2098, 23, 31, 27, 3, -30 }, // 0x43 'C' - { 2188, 25, 31, 31, 4, -30 }, // 0x44 'D' - { 2285, 17, 31, 24, 4, -30 }, // 0x45 'E' - { 2351, 17, 31, 22, 4, -30 }, // 0x46 'F' - { 2417, 25, 31, 31, 3, -30 }, // 0x47 'G' - { 2514, 24, 31, 32, 4, -30 }, // 0x48 'H' - { 2607, 11, 31, 15, 2, -30 }, // 0x49 'I' - { 2650, 11, 39, 12, -3, -30 }, // 0x4A 'J' - { 2704, 23, 31, 27, 4, -30 }, // 0x4B 'K' - { 2794, 18, 31, 23, 4, -30 }, // 0x4C 'L' - { 2864, 31, 31, 39, 4, -30 }, // 0x4D 'M' - { 2985, 25, 31, 33, 4, -30 }, // 0x4E 'N' - { 3082, 28, 31, 34, 3, -30 }, // 0x4F 'O' - { 3191, 20, 31, 26, 4, -30 }, // 0x50 'P' - { 3269, 28, 38, 34, 3, -30 }, // 0x51 'Q' - { 3402, 22, 31, 27, 4, -30 }, // 0x52 'R' - { 3488, 20, 31, 24, 2, -30 }, // 0x53 'S' - { 3566, 23, 31, 24, 0, -30 }, // 0x54 'T' - { 3656, 24, 31, 31, 4, -30 }, // 0x55 'U' - { 3749, 26, 31, 26, 0, -30 }, // 0x56 'V' - { 3850, 39, 31, 40, 1, -30 }, // 0x57 'W' - { 4002, 25, 31, 25, 0, -30 }, // 0x58 'X' - { 4099, 24, 31, 24, 0, -30 }, // 0x59 'Y' - { 4192, 21, 31, 25, 2, -30 }, // 0x5A 'Z' - { 4274, 10, 38, 14, 3, -30 }, // 0x5B '[' - { 4322, 16, 31, 16, 0, -30 }, // 0x5C '\' - { 4384, 10, 38, 14, 1, -30 }, // 0x5D ']' - { 4432, 21, 20, 25, 2, -30 }, // 0x5E '^' - { 4485, 19, 3, 19, 0, 5 }, // 0x5F '_' - { 4493, 8, 7, 12, 2, -32 }, // 0x60 '`' - { 4500, 19, 23, 24, 2, -22 }, // 0x61 'a' - { 4555, 20, 33, 27, 4, -32 }, // 0x62 'b' - { 4638, 17, 24, 21, 2, -23 }, // 0x63 'c' - { 4689, 21, 33, 27, 2, -32 }, // 0x64 'd' - { 4776, 20, 24, 24, 2, -23 }, // 0x65 'e' - { 4836, 16, 33, 15, 1, -32 }, // 0x66 'f' - { 4902, 21, 34, 27, 2, -23 }, // 0x67 'g' - { 4992, 19, 33, 27, 4, -32 }, // 0x68 'h' - { 5071, 5, 32, 11, 3, -31 }, // 0x69 'i' - { 5091, 10, 42, 11, -2, -31 }, // 0x6A 'j' - { 5144, 19, 33, 23, 4, -32 }, // 0x6B 'k' - { 5223, 3, 33, 11, 4, -32 }, // 0x6C 'l' - { 5236, 33, 24, 40, 4, -23 }, // 0x6D 'm' - { 5335, 19, 24, 27, 4, -23 }, // 0x6E 'n' - { 5392, 22, 24, 26, 2, -23 }, // 0x6F 'o' - { 5458, 20, 34, 27, 4, -23 }, // 0x70 'p' - { 5543, 21, 34, 27, 2, -23 }, // 0x71 'q' - { 5633, 13, 24, 18, 4, -23 }, // 0x72 'r' - { 5672, 17, 24, 21, 2, -23 }, // 0x73 's' - { 5723, 14, 28, 16, 1, -27 }, // 0x74 't' - { 5772, 20, 23, 27, 3, -22 }, // 0x75 'u' - { 5830, 22, 23, 22, 0, -22 }, // 0x76 'v' - { 5894, 33, 23, 34, 0, -22 }, // 0x77 'w' - { 5989, 21, 23, 23, 1, -22 }, // 0x78 'x' - { 6050, 22, 33, 22, 0, -22 }, // 0x79 'y' - { 6141, 17, 23, 20, 2, -22 }, // 0x7A 'z' - { 6190, 14, 38, 16, 1, -30 }, // 0x7B '{' - { 6257, 3, 43, 24, 10, -32 }, // 0x7C '|' - { 6274, 14, 38, 16, 1, -30 }, // 0x7D '}' - { 6341, 20, 6, 25, 2, -17 } }; // 0x7E '~' - -const GFXfont NotoSans_Regular22pt7b PROGMEM = { - (uint8_t *)NotoSans_Regular22pt7bBitmaps, - (GFXglyph *)NotoSans_Regular22pt7bGlyphs, - 0x20, 0x7E, 59 }; - -// Approx. 7028 bytes - -#endif // NOTOSANS22PT7B_H diff --git a/examples/companion_radio/ui-new/fonts/NotoSansBold18pt7b.h b/examples/companion_radio/ui-new/fonts/NotoSansBold18pt7b.h deleted file mode 100644 index 9bce340b..00000000 --- a/examples/companion_radio/ui-new/fonts/NotoSansBold18pt7b.h +++ /dev/null @@ -1,498 +0,0 @@ -#ifndef NOTOSANSBOLD18PT7B_H -#define NOTOSANSBOLD18PT7B_H -const uint8_t NotoSans_Bold18pt7bBitmaps[] PROGMEM = { - 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x9E, 0x79, 0xE7, - 0x9E, 0x78, 0x00, 0x00, 0x7B, 0xFF, 0xFF, 0x78, 0xF8, 0xFF, 0xC7, 0xFE, - 0x3F, 0xF1, 0xE7, 0x8F, 0x3C, 0x79, 0xE3, 0xCF, 0x1E, 0x78, 0xF0, 0x01, - 0xE3, 0xC0, 0x0F, 0x1E, 0x00, 0x78, 0xF0, 0x03, 0x87, 0x80, 0x3C, 0x38, - 0x01, 0xE3, 0xC0, 0x0F, 0x1E, 0x0F, 0xFF, 0xFF, 0x7F, 0xFF, 0xFB, 0xFF, - 0xFF, 0xC1, 0xE3, 0xC0, 0x0F, 0x1E, 0x00, 0x78, 0xF0, 0x03, 0x87, 0x83, - 0xFF, 0xFF, 0xDF, 0xFF, 0xFE, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0x83, 0xC7, - 0x80, 0x1C, 0x38, 0x01, 0xE3, 0xC0, 0x0F, 0x1E, 0x00, 0x78, 0xF0, 0x03, - 0xC7, 0x80, 0x1C, 0x38, 0x00, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x60, 0x01, - 0xFF, 0x83, 0xFF, 0xF3, 0xFF, 0xFB, 0xFF, 0xFD, 0xFB, 0x1C, 0xF9, 0x80, - 0x7C, 0xC0, 0x3F, 0x60, 0x1F, 0xF0, 0x07, 0xFC, 0x01, 0xFF, 0xC0, 0x7F, - 0xF0, 0x0F, 0xFC, 0x01, 0xFF, 0x00, 0xDF, 0xC0, 0x67, 0xE0, 0x31, 0xFC, - 0x19, 0xFF, 0xFF, 0xFB, 0xFF, 0xFD, 0xFF, 0xFC, 0xFF, 0xF8, 0x01, 0xE0, - 0x00, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, 0x04, 0x00, 0x00, 0x00, 0x7E, - 0x00, 0x7C, 0x03, 0xFC, 0x01, 0xE0, 0x1F, 0xF8, 0x0F, 0x00, 0x79, 0xE0, - 0x3C, 0x03, 0xE3, 0xC1, 0xE0, 0x0F, 0x0F, 0x07, 0x80, 0x3C, 0x3C, 0x3C, - 0x00, 0xF0, 0xF1, 0xF0, 0x03, 0xC3, 0xC7, 0x80, 0x0F, 0x0F, 0x3E, 0x00, - 0x3E, 0x7C, 0xF3, 0xF8, 0x79, 0xE7, 0x9F, 0xF1, 0xFF, 0x9E, 0x7F, 0xE3, - 0xFC, 0xF3, 0xE7, 0x87, 0xE3, 0xCF, 0x1E, 0x00, 0x1E, 0x3C, 0x7C, 0x00, - 0xF8, 0xF0, 0xF0, 0x03, 0xC3, 0xC3, 0xC0, 0x1F, 0x0F, 0x0F, 0x00, 0x78, - 0x3C, 0x7C, 0x03, 0xC0, 0xF1, 0xE0, 0x0F, 0x03, 0xE7, 0x80, 0x78, 0x07, - 0xFE, 0x01, 0xE0, 0x0F, 0xF0, 0x0F, 0x00, 0x1F, 0x80, 0x00, 0x60, 0x00, - 0x03, 0xFE, 0x00, 0x03, 0xFF, 0xC0, 0x03, 0xFF, 0xE0, 0x01, 0xFF, 0xF8, - 0x00, 0xF8, 0x7C, 0x00, 0x78, 0x3E, 0x00, 0x3E, 0x1F, 0x00, 0x1F, 0x1F, - 0x00, 0x0F, 0xDF, 0x80, 0x03, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x00, 0xFF, - 0x81, 0xF0, 0xFF, 0xC0, 0xF8, 0xFF, 0xF0, 0xFC, 0xFF, 0xFC, 0x7C, 0x7E, - 0x7F, 0x7E, 0x3E, 0x1F, 0xFF, 0x3F, 0x07, 0xFF, 0x1F, 0x81, 0xFF, 0x07, - 0xC0, 0x7F, 0x83, 0xF8, 0x7F, 0xC1, 0xFF, 0xFF, 0xF0, 0x7F, 0xFF, 0xFC, - 0x1F, 0xFF, 0x7F, 0x03, 0xFE, 0x1F, 0xC0, 0xFF, 0xFF, 0xF7, 0xBD, 0xEF, - 0x78, 0x07, 0xC3, 0xE0, 0xF0, 0x7C, 0x1E, 0x0F, 0x83, 0xC1, 0xF0, 0x7C, - 0x1F, 0x07, 0x81, 0xE0, 0x78, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x07, - 0x81, 0xE0, 0x7C, 0x1F, 0x07, 0xC0, 0xF0, 0x3E, 0x0F, 0x81, 0xE0, 0x7C, - 0x0F, 0x81, 0xE0, 0x3C, 0xF8, 0x1F, 0x03, 0xC0, 0xF8, 0x1E, 0x07, 0xC1, - 0xF0, 0x3C, 0x0F, 0x83, 0xE0, 0x78, 0x1E, 0x07, 0x81, 0xE0, 0x7C, 0x1F, - 0x07, 0xC1, 0xE0, 0x78, 0x1E, 0x0F, 0x83, 0xE0, 0xF8, 0x3C, 0x1F, 0x07, - 0xC3, 0xE0, 0xF8, 0x7C, 0x1E, 0x0F, 0x00, 0x03, 0xE0, 0x01, 0xF0, 0x00, - 0x78, 0x00, 0x38, 0x00, 0x1C, 0x03, 0x0E, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0x83, 0xF8, 0x01, 0xFC, 0x01, 0xEF, 0x00, 0xF7, 0x80, 0xF9, - 0xE0, 0xF8, 0xF8, 0x1C, 0x30, 0x04, 0x10, 0x00, 0x03, 0xC0, 0x01, 0xE0, - 0x00, 0xF0, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x0F, 0x01, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xF0, 0x00, 0x78, 0x00, 0x3C, 0x00, - 0x1E, 0x00, 0x0F, 0x00, 0x07, 0x80, 0x03, 0xC0, 0x00, 0x3E, 0x7D, 0xF3, - 0xE7, 0xCF, 0x1E, 0x78, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x7B, - 0xFF, 0xFF, 0x78, 0x00, 0x7C, 0x01, 0xF0, 0x07, 0x80, 0x3E, 0x00, 0xF8, - 0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x03, 0xE0, 0x0F, 0x80, 0x3C, 0x01, 0xF0, - 0x07, 0xC0, 0x1E, 0x00, 0xF8, 0x03, 0xE0, 0x1F, 0x00, 0x7C, 0x01, 0xF0, - 0x0F, 0x80, 0x3E, 0x00, 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0xF8, 0x00, 0x00, - 0x40, 0x01, 0xFE, 0x01, 0xFF, 0xE0, 0xFF, 0xF8, 0x3F, 0xFF, 0x1F, 0x87, - 0xE7, 0xC0, 0xF9, 0xF0, 0x3E, 0x7C, 0x0F, 0xBF, 0x03, 0xFF, 0xC0, 0xFF, - 0xF0, 0x1F, 0xFC, 0x07, 0xFF, 0x01, 0xFF, 0xC0, 0x7F, 0xF0, 0x3F, 0xFC, - 0x0F, 0xDF, 0x03, 0xF7, 0xC0, 0xF9, 0xF0, 0x3E, 0x7E, 0x0F, 0x8F, 0x87, - 0xE3, 0xFF, 0xF0, 0x7F, 0xF8, 0x0F, 0xFE, 0x01, 0xFE, 0x00, 0x01, 0xF8, - 0x1F, 0xC1, 0xFE, 0x1F, 0xF3, 0xFF, 0xBF, 0xFF, 0xF7, 0xEF, 0x3F, 0x31, - 0xF8, 0x0F, 0xC0, 0x7E, 0x03, 0xF0, 0x1F, 0x80, 0xFC, 0x07, 0xE0, 0x3F, - 0x01, 0xF8, 0x0F, 0xC0, 0x7E, 0x03, 0xF0, 0x1F, 0x80, 0xFC, 0x07, 0xE0, - 0x3F, 0x01, 0xF8, 0x00, 0x40, 0x03, 0xFF, 0x03, 0xFF, 0xE1, 0xFF, 0xFC, - 0xFF, 0xFF, 0x8F, 0x07, 0xE3, 0x80, 0xF8, 0x40, 0x3E, 0x00, 0x0F, 0x80, - 0x03, 0xE0, 0x01, 0xF8, 0x00, 0x7C, 0x00, 0x3F, 0x00, 0x1F, 0x80, 0x0F, - 0xC0, 0x07, 0xE0, 0x03, 0xF0, 0x01, 0xF8, 0x00, 0xFC, 0x00, 0x7E, 0x00, - 0x3F, 0x00, 0x1F, 0x80, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xF0, 0x00, 0xC0, 0x07, 0xFF, 0x07, 0xFF, 0xE3, 0xFF, 0xFC, 0x7F, - 0xFF, 0x8E, 0x07, 0xE2, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x07, - 0xC0, 0x03, 0xF0, 0x3F, 0xF0, 0x0F, 0xF0, 0x03, 0xFF, 0x00, 0xFF, 0xF0, - 0x00, 0xFE, 0x00, 0x0F, 0x80, 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x3F, 0x80, - 0x0F, 0xF8, 0x0F, 0xEF, 0xFF, 0xFB, 0xFF, 0xFC, 0xFF, 0xFE, 0x0F, 0xFE, - 0x00, 0x00, 0x3F, 0x00, 0x0F, 0xE0, 0x01, 0xFC, 0x00, 0x7F, 0x80, 0x1F, - 0xF0, 0x03, 0xFE, 0x00, 0xFF, 0xC0, 0x3F, 0xF8, 0x07, 0xBF, 0x01, 0xE7, - 0xE0, 0x7C, 0xFC, 0x0F, 0x1F, 0x83, 0xC3, 0xF0, 0xF8, 0x7E, 0x1E, 0x0F, - 0xC7, 0x81, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF0, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x3F, - 0x00, 0x7F, 0xFE, 0x3F, 0xFF, 0x1F, 0xFF, 0x8F, 0xFF, 0xC7, 0xC0, 0x03, - 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x78, 0x00, 0x7F, 0xF8, 0x3F, 0xFF, - 0x1F, 0xFF, 0xCF, 0xFF, 0xF1, 0x87, 0xF8, 0x00, 0xFC, 0x00, 0x3E, 0x00, - 0x1F, 0x80, 0x0F, 0xC0, 0x07, 0xD0, 0x07, 0xEE, 0x07, 0xF7, 0xFF, 0xF3, - 0xFF, 0xF9, 0xFF, 0xF0, 0x7F, 0xF0, 0x00, 0x01, 0xFF, 0x01, 0xFF, 0xC0, - 0xFF, 0xF0, 0x7F, 0xFC, 0x3F, 0x80, 0x0F, 0x80, 0x07, 0xC0, 0x01, 0xF0, - 0x00, 0x7C, 0x00, 0x1E, 0x7F, 0x8F, 0xBF, 0xF3, 0xFF, 0xFE, 0xFF, 0xFF, - 0xBF, 0x83, 0xFF, 0xC0, 0xFF, 0xF0, 0x1F, 0xFC, 0x07, 0xFF, 0x01, 0xF7, - 0xC0, 0x7D, 0xF0, 0x3F, 0x7E, 0x1F, 0x8F, 0xFF, 0xE1, 0xFF, 0xF0, 0x3F, - 0xF8, 0x07, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0x00, 0x0F, 0x80, 0x03, 0xE0, 0x01, 0xF8, 0x00, 0x7C, 0x00, 0x3F, - 0x00, 0x0F, 0x80, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0x7C, 0x00, 0x3F, 0x00, - 0x0F, 0x80, 0x07, 0xE0, 0x01, 0xF0, 0x00, 0xFC, 0x00, 0x3E, 0x00, 0x1F, - 0x80, 0x07, 0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x3E, 0x00, 0x1F, 0x80, - 0x00, 0x0F, 0xFC, 0x07, 0xFF, 0x83, 0xFF, 0xF1, 0xFC, 0xFE, 0x7C, 0x0F, - 0x9F, 0x03, 0xE7, 0xC0, 0xF9, 0xF0, 0x3E, 0x3E, 0x1F, 0x0F, 0xFF, 0xC1, - 0xFF, 0xE0, 0x3F, 0xE0, 0x0F, 0xFC, 0x07, 0xFF, 0x83, 0xF3, 0xF1, 0xF8, - 0x7E, 0x7C, 0x0F, 0xFE, 0x01, 0xFF, 0x80, 0x7F, 0xE0, 0x1F, 0xFC, 0x0F, - 0xDF, 0xFF, 0xE7, 0xFF, 0xF8, 0xFF, 0xF8, 0x0F, 0xFC, 0x00, 0x0F, 0xF8, - 0x07, 0xFF, 0x03, 0xFF, 0xE1, 0xFF, 0xFC, 0x7E, 0x1F, 0xBF, 0x03, 0xEF, - 0x80, 0xFB, 0xE0, 0x3F, 0xF8, 0x07, 0xFE, 0x03, 0xFF, 0xC0, 0xFD, 0xF8, - 0x7F, 0x7F, 0xFF, 0xCF, 0xFF, 0xF3, 0xFF, 0x7C, 0x3F, 0x9E, 0x00, 0x07, - 0x80, 0x03, 0xE0, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x7F, 0x0F, 0xFF, 0x83, - 0xFF, 0xC0, 0xFF, 0xE0, 0x3F, 0xE0, 0x00, 0x33, 0xFF, 0xFF, 0xFD, 0xE0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xFF, 0xFF, 0xDE, 0x18, 0xFD, - 0xFB, 0xF7, 0xE7, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x3E, 0x7D, 0xF3, 0xE7, 0xCF, 0x1E, 0x78, 0xF0, 0x00, 0x00, 0x80, 0x01, - 0xC0, 0x03, 0xE0, 0x07, 0xF0, 0x0F, 0xF0, 0x1F, 0xE0, 0x3F, 0x80, 0x7F, - 0x00, 0xFE, 0x00, 0x7C, 0x00, 0x3F, 0x80, 0x0F, 0xF8, 0x01, 0xFF, 0x00, - 0x3F, 0xE0, 0x07, 0xFE, 0x00, 0x7F, 0x00, 0x0F, 0x80, 0x01, 0xC0, 0x00, - 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xE0, 0x80, 0x00, 0x70, 0x00, 0x3E, 0x00, 0x1F, 0xC0, 0x0F, 0xF8, 0x00, - 0xFF, 0x00, 0x1F, 0xE0, 0x03, 0xFC, 0x00, 0x7F, 0x80, 0x0F, 0xC0, 0x1F, - 0xE0, 0x3F, 0xC0, 0xFF, 0x81, 0xFF, 0x03, 0xFE, 0x01, 0xF8, 0x00, 0xF0, - 0x00, 0x60, 0x00, 0x20, 0x00, 0x00, 0x00, 0x80, 0x1F, 0xF8, 0xFF, 0xFC, - 0x7F, 0xFE, 0x7F, 0xFF, 0x30, 0x3F, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F, - 0x00, 0x3F, 0x00, 0x7E, 0x00, 0xFC, 0x03, 0xF8, 0x03, 0xF0, 0x07, 0xC0, - 0x07, 0xC0, 0x07, 0x80, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x07, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0x07, 0xC0, 0x00, 0x7F, - 0xF0, 0x00, 0x1F, 0xFF, 0xC0, 0x07, 0xFF, 0xFF, 0x00, 0xFE, 0x01, 0xF8, - 0x1F, 0x80, 0x07, 0xC3, 0xE0, 0x00, 0x3C, 0x3C, 0x0F, 0xC1, 0xE7, 0x83, - 0xFF, 0x9E, 0x78, 0x7F, 0xF8, 0xFF, 0x0F, 0xCF, 0x8F, 0xF1, 0xF0, 0x78, - 0xFF, 0x1E, 0x07, 0x8F, 0xF1, 0xE0, 0xF0, 0xFF, 0x1E, 0x0F, 0x0F, 0xF1, - 0xE0, 0xF0, 0xFF, 0x1E, 0x0F, 0x0F, 0xF1, 0xE0, 0xF1, 0xEF, 0x1F, 0x1F, - 0x9E, 0xF0, 0xFF, 0xFF, 0xCF, 0x0F, 0xFB, 0xF8, 0x78, 0x3E, 0x1F, 0x07, - 0xC0, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x03, 0xF0, 0x00, 0xC0, 0x1F, 0xFB, - 0xFC, 0x00, 0x7F, 0xFF, 0xC0, 0x01, 0xFF, 0xF8, 0x00, 0x03, 0xF8, 0x00, - 0x00, 0x7F, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x80, - 0x01, 0xFF, 0x80, 0x01, 0xF7, 0xC0, 0x03, 0xE7, 0xC0, 0x03, 0xE7, 0xC0, - 0x03, 0xE7, 0xE0, 0x07, 0xE3, 0xE0, 0x07, 0xC3, 0xE0, 0x07, 0xC3, 0xF0, - 0x0F, 0xC1, 0xF0, 0x0F, 0x81, 0xF0, 0x0F, 0x81, 0xF8, 0x1F, 0xFF, 0xF8, - 0x1F, 0xFF, 0xF8, 0x1F, 0xFF, 0xFC, 0x3F, 0xFF, 0xFC, 0x3F, 0x00, 0x7C, - 0x3E, 0x00, 0x7E, 0x7E, 0x00, 0x7E, 0x7E, 0x00, 0x3F, 0x7C, 0x00, 0x3F, - 0xFC, 0x00, 0x3F, 0xFF, 0xFC, 0x1F, 0xFF, 0xE3, 0xFF, 0xFE, 0x7F, 0xFF, - 0xEF, 0x81, 0xFD, 0xF0, 0x1F, 0xBE, 0x03, 0xF7, 0xC0, 0x7E, 0xF8, 0x0F, - 0xDF, 0x03, 0xF3, 0xFF, 0xFC, 0x7F, 0xFE, 0x0F, 0xFF, 0xF1, 0xFF, 0xFF, - 0x3E, 0x07, 0xF7, 0xC0, 0x3E, 0xF8, 0x07, 0xFF, 0x00, 0xFF, 0xE0, 0x1F, - 0xFC, 0x07, 0xEF, 0x81, 0xFD, 0xFF, 0xFF, 0xBF, 0xFF, 0xE7, 0xFF, 0xF8, - 0xFF, 0xF8, 0x00, 0x00, 0x18, 0x00, 0x1F, 0xFC, 0x07, 0xFF, 0xF0, 0xFF, - 0xFE, 0x1F, 0xFF, 0xE3, 0xF8, 0x1C, 0x7F, 0x00, 0x07, 0xE0, 0x00, 0x7C, - 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x0F, - 0xC0, 0x00, 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x0F, 0xC0, 0x00, - 0x7C, 0x00, 0x07, 0xE0, 0x00, 0x7F, 0x00, 0x23, 0xFC, 0x1E, 0x3F, 0xFF, - 0xE1, 0xFF, 0xFE, 0x07, 0xFF, 0xE0, 0x3F, 0xF8, 0xFF, 0xF8, 0x07, 0xFF, - 0xF8, 0x3F, 0xFF, 0xE1, 0xFF, 0xFF, 0x8F, 0x83, 0xFE, 0x7C, 0x03, 0xF3, - 0xE0, 0x0F, 0xDF, 0x00, 0x7E, 0xF8, 0x01, 0xFF, 0xC0, 0x0F, 0xFE, 0x00, - 0x7F, 0xF0, 0x03, 0xFF, 0x80, 0x1F, 0xFC, 0x00, 0xFF, 0xE0, 0x07, 0xFF, - 0x00, 0x3F, 0xF8, 0x01, 0xF7, 0xC0, 0x1F, 0xBE, 0x01, 0xFD, 0xF0, 0x1F, - 0xCF, 0x87, 0xFC, 0x7F, 0xFF, 0xE3, 0xFF, 0xFC, 0x1F, 0xFF, 0xC0, 0xFF, - 0xF0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x1F, - 0x80, 0x3F, 0x00, 0x7E, 0x00, 0xFC, 0x01, 0xF8, 0x03, 0xFF, 0xF7, 0xFF, - 0xEF, 0xFF, 0xDF, 0xFF, 0xBF, 0x00, 0x7E, 0x00, 0xFC, 0x01, 0xF8, 0x03, - 0xF0, 0x07, 0xE0, 0x0F, 0xC0, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x1F, 0x00, - 0x3E, 0x00, 0x7C, 0x00, 0xF8, 0x01, 0xF0, 0x03, 0xE0, 0x07, 0xFF, 0xEF, - 0xFF, 0xDF, 0xFF, 0xBF, 0xFF, 0x7C, 0x00, 0xF8, 0x01, 0xF0, 0x03, 0xE0, - 0x07, 0xC0, 0x0F, 0x80, 0x1F, 0x00, 0x3E, 0x00, 0x7C, 0x00, 0xF8, 0x00, - 0x00, 0x04, 0x00, 0x0F, 0xFF, 0x01, 0xFF, 0xFE, 0x1F, 0xFF, 0xE1, 0xFF, - 0xFF, 0x1F, 0xE0, 0x30, 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0x7E, 0x00, 0x07, - 0xE0, 0x00, 0x3F, 0x00, 0x01, 0xF8, 0x00, 0x0F, 0xC1, 0xFF, 0xFE, 0x0F, - 0xFF, 0xF0, 0x7F, 0xFF, 0x83, 0xFF, 0xFC, 0x01, 0xFF, 0xE0, 0x0F, 0xDF, - 0x00, 0x7E, 0xFC, 0x03, 0xF7, 0xF0, 0x1F, 0x9F, 0xE0, 0xFC, 0x7F, 0xFF, - 0xE1, 0xFF, 0xFF, 0x07, 0xFF, 0xF8, 0x0F, 0xFF, 0x00, 0xFC, 0x01, 0xFF, - 0xE0, 0x0F, 0xFF, 0x00, 0x7F, 0xF8, 0x03, 0xFF, 0xC0, 0x1F, 0xFE, 0x00, - 0xFF, 0xF0, 0x07, 0xFF, 0x80, 0x3F, 0xFC, 0x01, 0xFF, 0xE0, 0x0F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x07, - 0xFF, 0x80, 0x3F, 0xFC, 0x01, 0xFF, 0xE0, 0x0F, 0xFF, 0x00, 0x7F, 0xF8, - 0x03, 0xFF, 0xC0, 0x1F, 0xFE, 0x00, 0xFF, 0xF0, 0x07, 0xFF, 0x80, 0x3F, - 0xFC, 0x01, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xFC, 0x1F, 0x81, 0xF8, - 0x1F, 0x81, 0xF8, 0x1F, 0x81, 0xF8, 0x1F, 0x81, 0xF8, 0x1F, 0x81, 0xF8, - 0x1F, 0x81, 0xF8, 0x1F, 0x81, 0xF8, 0x1F, 0x81, 0xF8, 0x1F, 0x87, 0xFE, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x03, 0xF0, 0x3F, 0x03, 0xF0, 0x3F, 0x03, - 0xF0, 0x3F, 0x03, 0xF0, 0x3F, 0x03, 0xF0, 0x3F, 0x03, 0xF0, 0x3F, 0x03, - 0xF0, 0x3F, 0x03, 0xF0, 0x3F, 0x03, 0xF0, 0x3F, 0x03, 0xF0, 0x3F, 0x03, - 0xF0, 0x3F, 0x03, 0xF0, 0x3F, 0x03, 0xE0, 0x3E, 0x03, 0xE0, 0x7E, 0xFF, - 0xEF, 0xFC, 0xFF, 0x8F, 0xF0, 0xFC, 0x03, 0xFF, 0xC0, 0x7E, 0xFC, 0x0F, - 0xCF, 0xC1, 0xF8, 0xFC, 0x1F, 0x8F, 0xC3, 0xF0, 0xFC, 0x7E, 0x0F, 0xCF, - 0xC0, 0xFC, 0xFC, 0x0F, 0xDF, 0x80, 0xFF, 0xF0, 0x0F, 0xFF, 0x00, 0xFF, - 0xF8, 0x0F, 0xFF, 0x80, 0xFF, 0xFC, 0x0F, 0xCF, 0xC0, 0xFC, 0x7E, 0x0F, - 0xC3, 0xF0, 0xFC, 0x3F, 0x0F, 0xC1, 0xF8, 0xFC, 0x0F, 0xCF, 0xC0, 0xFC, - 0xFC, 0x07, 0xEF, 0xC0, 0x7E, 0xFC, 0x03, 0xF0, 0xF8, 0x00, 0xF8, 0x00, - 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, - 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, - 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, - 0xF8, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, - 0x0F, 0xFF, 0xE0, 0x03, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0xC0, 0x0F, 0xFF, - 0xF8, 0x03, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0xE0, 0x0F, 0xFF, 0xFE, 0x03, - 0xDF, 0xFB, 0xC0, 0x7B, 0xFF, 0x78, 0x0F, 0x7F, 0xEF, 0x83, 0xEF, 0xFC, - 0xF0, 0x79, 0xFF, 0x9E, 0x0F, 0x3F, 0xF3, 0xE3, 0xE7, 0xFE, 0x3C, 0x78, - 0xFF, 0xC7, 0x8F, 0x1F, 0xF8, 0xFB, 0xE3, 0xFF, 0x0F, 0x78, 0x7F, 0xE1, - 0xEF, 0x0F, 0xFC, 0x3F, 0xE1, 0xFF, 0x87, 0xF8, 0x3F, 0xF0, 0x7F, 0x07, - 0xFE, 0x0F, 0xE0, 0xFF, 0xC1, 0xF8, 0x1F, 0xF8, 0x1F, 0x03, 0xE0, 0xFE, - 0x00, 0x3F, 0xFC, 0x00, 0xFF, 0xF0, 0x03, 0xFF, 0xE0, 0x0F, 0xFF, 0xC0, - 0x3F, 0xFF, 0x00, 0xFF, 0xFE, 0x03, 0xFE, 0xF8, 0x0F, 0xFB, 0xF0, 0x3F, - 0xE7, 0xE0, 0xFF, 0x9F, 0x83, 0xFE, 0x3F, 0x0F, 0xF8, 0x7C, 0x3F, 0xE1, - 0xF8, 0xFF, 0x83, 0xE3, 0xFE, 0x0F, 0xCF, 0xF8, 0x1F, 0xBF, 0xE0, 0x7E, - 0xFF, 0x80, 0xFF, 0xFE, 0x01, 0xFF, 0xF8, 0x07, 0xFF, 0xE0, 0x0F, 0xFF, - 0x80, 0x3F, 0xFE, 0x00, 0x7F, 0xF8, 0x01, 0xFC, 0x00, 0x18, 0x00, 0x03, - 0xFF, 0xC0, 0x0F, 0xFF, 0xE0, 0x1F, 0xFF, 0xF8, 0x3F, 0xFF, 0xF8, 0x3F, - 0x81, 0xFC, 0x7F, 0x00, 0xFE, 0x7E, 0x00, 0x7E, 0x7C, 0x00, 0x7E, 0xFC, - 0x00, 0x3F, 0xFC, 0x00, 0x3F, 0xFC, 0x00, 0x3F, 0xFC, 0x00, 0x3F, 0xFC, - 0x00, 0x3F, 0xFC, 0x00, 0x3F, 0xFC, 0x00, 0x3F, 0xFC, 0x00, 0x3F, 0xFC, - 0x00, 0x3F, 0x7E, 0x00, 0x7E, 0x7E, 0x00, 0x7E, 0x7F, 0x00, 0xFC, 0x3F, - 0xC3, 0xFC, 0x1F, 0xFF, 0xF8, 0x0F, 0xFF, 0xF0, 0x07, 0xFF, 0xE0, 0x01, - 0xFF, 0x80, 0xFF, 0xF8, 0x7F, 0xFF, 0x3F, 0xFF, 0xDF, 0xFF, 0xEF, 0x83, - 0xFF, 0xC0, 0xFF, 0xE0, 0x3F, 0xF0, 0x1F, 0xF8, 0x0F, 0xFC, 0x07, 0xFE, - 0x07, 0xFF, 0x1F, 0xFF, 0xFF, 0xF7, 0xFF, 0xF3, 0xFF, 0xF1, 0xFF, 0xE0, - 0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, - 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x18, 0x00, 0x03, - 0xFF, 0xC0, 0x0F, 0xFF, 0xE0, 0x1F, 0xFF, 0xF8, 0x3F, 0xFF, 0xF8, 0x3F, - 0x81, 0xFC, 0x7F, 0x00, 0xFE, 0x7E, 0x00, 0x7E, 0x7C, 0x00, 0x7E, 0xFC, - 0x00, 0x3F, 0xFC, 0x00, 0x3F, 0xFC, 0x00, 0x3F, 0xFC, 0x00, 0x3F, 0xFC, - 0x00, 0x3F, 0xFC, 0x00, 0x3F, 0xFC, 0x00, 0x3F, 0xFC, 0x00, 0x3F, 0xFC, - 0x00, 0x3F, 0x7E, 0x00, 0x7E, 0x7E, 0x00, 0x7E, 0x7F, 0x00, 0xFC, 0x3F, - 0xC3, 0xFC, 0x1F, 0xFF, 0xF8, 0x0F, 0xFF, 0xF0, 0x07, 0xFF, 0xE0, 0x01, - 0xFF, 0xC0, 0x00, 0x07, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x03, 0xF8, 0x00, - 0x01, 0xFC, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFF, 0xFF, 0xF8, 0x0F, 0xFF, - 0xE0, 0xFF, 0xFF, 0x0F, 0xFF, 0xF8, 0xF8, 0x3F, 0x8F, 0x80, 0xF8, 0xF8, - 0x0F, 0xCF, 0x80, 0xFC, 0xF8, 0x0F, 0x8F, 0x80, 0xF8, 0xF8, 0x1F, 0x8F, - 0xFF, 0xF0, 0xFF, 0xFE, 0x0F, 0xFF, 0xC0, 0xFF, 0xF8, 0x0F, 0x8F, 0xC0, - 0xF8, 0x7E, 0x0F, 0x83, 0xE0, 0xF8, 0x3F, 0x0F, 0x81, 0xF8, 0xF8, 0x1F, - 0x8F, 0x80, 0xFC, 0xF8, 0x07, 0xEF, 0x80, 0x7E, 0xF8, 0x03, 0xF0, 0x00, - 0x80, 0x0F, 0xFC, 0x3F, 0xFF, 0x7F, 0xFE, 0x7F, 0xFE, 0xFC, 0x0E, 0xF8, - 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xFC, 0x00, 0xFF, 0x00, 0x7F, 0xC0, 0x3F, - 0xF0, 0x1F, 0xF8, 0x07, 0xFC, 0x01, 0xFE, 0x00, 0x7F, 0x00, 0x3F, 0x00, - 0x1F, 0x00, 0x1F, 0x80, 0x3F, 0xF0, 0x7F, 0xFF, 0xFE, 0xFF, 0xFC, 0xFF, - 0xF8, 0x7F, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF0, 0x3F, 0x00, 0x07, 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0, - 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xE0, - 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x0F, 0xC0, - 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0x80, - 0x03, 0xF0, 0x00, 0xF8, 0x01, 0xFF, 0xC0, 0x0F, 0xFE, 0x00, 0x7F, 0xF0, - 0x03, 0xFF, 0x80, 0x1F, 0xFC, 0x00, 0xFF, 0xE0, 0x07, 0xFF, 0x00, 0x3F, - 0xF8, 0x01, 0xFF, 0xC0, 0x0F, 0xFE, 0x00, 0x7F, 0xF0, 0x03, 0xFF, 0x80, - 0x1F, 0xFC, 0x00, 0xFF, 0xE0, 0x07, 0xFF, 0x00, 0x3F, 0xF8, 0x01, 0xFF, - 0xE0, 0x0F, 0xFF, 0x00, 0x7C, 0xF8, 0x07, 0xE7, 0xF0, 0x7F, 0x1F, 0xFF, - 0xF0, 0xFF, 0xFF, 0x03, 0xFF, 0xF0, 0x07, 0xFE, 0x00, 0xFC, 0x00, 0x7E, - 0xF8, 0x00, 0xF9, 0xF0, 0x01, 0xF3, 0xF0, 0x07, 0xE3, 0xE0, 0x0F, 0x87, - 0xC0, 0x1F, 0x0F, 0x80, 0x7E, 0x0F, 0x80, 0xF8, 0x1F, 0x01, 0xF0, 0x3E, - 0x07, 0xE0, 0x3E, 0x0F, 0x80, 0x7C, 0x1F, 0x00, 0xF8, 0x7E, 0x00, 0xF8, - 0xF8, 0x01, 0xF1, 0xF0, 0x03, 0xE3, 0xE0, 0x03, 0xEF, 0x80, 0x07, 0xDF, - 0x00, 0x0F, 0xBE, 0x00, 0x0F, 0x78, 0x00, 0x1F, 0xF0, 0x00, 0x3F, 0xE0, - 0x00, 0x3F, 0x80, 0x00, 0x7F, 0x00, 0x00, 0xFE, 0x00, 0xF8, 0x03, 0xF0, - 0x07, 0xFF, 0x00, 0xFC, 0x03, 0xF7, 0xC0, 0x3F, 0x00, 0xF9, 0xF0, 0x0F, - 0xE0, 0x3E, 0x7C, 0x07, 0xF8, 0x0F, 0x9F, 0x81, 0xFE, 0x07, 0xE3, 0xE0, - 0x7F, 0x81, 0xF0, 0xF8, 0x1F, 0xF0, 0x7C, 0x3E, 0x0F, 0xFC, 0x1F, 0x0F, - 0xC3, 0xCF, 0x07, 0xC1, 0xF0, 0xF3, 0xC3, 0xE0, 0x7C, 0x7C, 0xF8, 0xF8, - 0x1F, 0x1F, 0x3E, 0x3E, 0x07, 0xC7, 0x87, 0x8F, 0x80, 0xF9, 0xE1, 0xE7, - 0xC0, 0x3E, 0xF8, 0x7D, 0xF0, 0x0F, 0xBE, 0x1F, 0x7C, 0x01, 0xEF, 0x03, - 0xDF, 0x00, 0x7B, 0xC0, 0xF7, 0x80, 0x1F, 0xF0, 0x3F, 0xE0, 0x07, 0xFC, - 0x0F, 0xF8, 0x00, 0xFE, 0x01, 0xFE, 0x00, 0x3F, 0x80, 0x7F, 0x00, 0x0F, - 0xE0, 0x1F, 0xC0, 0x03, 0xF8, 0x07, 0xF0, 0x00, 0x7E, 0x00, 0xFE, 0x7E, - 0x01, 0xF8, 0xFC, 0x07, 0xE0, 0xFC, 0x0F, 0xC0, 0xF8, 0x3F, 0x01, 0xF8, - 0xFC, 0x01, 0xF9, 0xF8, 0x01, 0xF7, 0xE0, 0x03, 0xFF, 0x80, 0x03, 0xFF, - 0x00, 0x07, 0xFC, 0x00, 0x07, 0xF8, 0x00, 0x0F, 0xE0, 0x00, 0x3F, 0xE0, - 0x00, 0x7F, 0xC0, 0x01, 0xFF, 0xC0, 0x03, 0xEF, 0xC0, 0x0F, 0xCF, 0x80, - 0x3F, 0x1F, 0x80, 0x7E, 0x1F, 0x81, 0xF8, 0x3F, 0x07, 0xE0, 0x3F, 0x0F, - 0xC0, 0x3F, 0x3F, 0x00, 0x7E, 0xFC, 0x00, 0x7E, 0xFC, 0x00, 0xFD, 0xF8, - 0x07, 0xE7, 0xE0, 0x1F, 0x8F, 0xC0, 0xFC, 0x3F, 0x03, 0xF0, 0x7E, 0x1F, - 0x80, 0xF8, 0x7C, 0x03, 0xF3, 0xF0, 0x07, 0xCF, 0x80, 0x1F, 0xFE, 0x00, - 0x3F, 0xF0, 0x00, 0xFF, 0xC0, 0x01, 0xFE, 0x00, 0x07, 0xF8, 0x00, 0x0F, - 0xC0, 0x00, 0x3F, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xF0, 0x00, 0x0F, 0xC0, - 0x00, 0x3F, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xF0, 0x00, 0x0F, 0xC0, 0x00, - 0x3F, 0x00, 0x00, 0xFC, 0x00, 0xFF, 0xFF, 0xDF, 0xFF, 0xFB, 0xFF, 0xFF, - 0x7F, 0xFF, 0xE0, 0x00, 0xF8, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x01, 0xF0, - 0x00, 0x7E, 0x00, 0x1F, 0x80, 0x03, 0xE0, 0x00, 0xFC, 0x00, 0x3F, 0x00, - 0x0F, 0xC0, 0x01, 0xF0, 0x00, 0x7E, 0x00, 0x1F, 0x80, 0x03, 0xE0, 0x00, - 0xFC, 0x00, 0x3F, 0x00, 0x07, 0xC0, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x87, 0xC3, - 0xE1, 0xF0, 0xF8, 0x7C, 0x3E, 0x1F, 0x0F, 0x87, 0xC3, 0xE1, 0xF0, 0xF8, - 0x7C, 0x3E, 0x1F, 0x0F, 0x87, 0xC3, 0xE1, 0xF0, 0xF8, 0x7C, 0x3E, 0x1F, - 0xFF, 0xFF, 0xFF, 0xFE, 0xF8, 0x01, 0xF0, 0x07, 0xC0, 0x0F, 0x00, 0x3E, - 0x00, 0xF8, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x3E, 0x00, 0xF8, 0x01, - 0xE0, 0x07, 0xC0, 0x1F, 0x00, 0x3C, 0x00, 0xF8, 0x03, 0xE0, 0x07, 0xC0, - 0x1F, 0x00, 0x7C, 0x00, 0xF8, 0x03, 0xE0, 0x07, 0x80, 0x1F, 0x00, 0x7C, - 0xFF, 0xFF, 0xFF, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, - 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, - 0x0F, 0x0F, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0xC0, 0x00, 0x78, 0x00, - 0x3E, 0x00, 0x0F, 0xC0, 0x07, 0xF0, 0x01, 0xDE, 0x00, 0xF7, 0x80, 0x3C, - 0xF0, 0x1E, 0x3C, 0x07, 0x87, 0x83, 0xC1, 0xE0, 0xF0, 0x3C, 0x78, 0x0F, - 0x9E, 0x01, 0xE7, 0x80, 0x7F, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF8, 0xFE, 0x0F, 0x81, 0xF0, 0x3E, 0x07, 0xC0, 0x70, 0x00, 0x60, 0x03, - 0xFF, 0x83, 0xFF, 0xF0, 0x7F, 0xFE, 0x1F, 0x1F, 0x82, 0x03, 0xE0, 0x00, - 0xFC, 0x00, 0x3F, 0x03, 0xFF, 0xC7, 0xFF, 0xF3, 0xFF, 0xFD, 0xFC, 0x3F, - 0x7C, 0x0F, 0xFF, 0x03, 0xFF, 0xC0, 0xFF, 0xF0, 0x7F, 0x7F, 0xFF, 0xDF, - 0xFF, 0xF3, 0xFF, 0x7C, 0x7F, 0x0F, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x80, - 0x03, 0xE0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x03, 0xE0, 0x80, - 0xF9, 0xFC, 0x3F, 0xFF, 0x8F, 0xFF, 0xF3, 0xFF, 0xFE, 0xFC, 0x1F, 0xBE, - 0x03, 0xEF, 0x80, 0xFB, 0xE0, 0x3E, 0xF8, 0x0F, 0xFE, 0x03, 0xFF, 0x80, - 0xFF, 0xE0, 0x3E, 0xF8, 0x0F, 0xBF, 0x07, 0xEF, 0xE3, 0xFB, 0xFF, 0xFC, - 0xFF, 0xFF, 0x3D, 0xFF, 0x8F, 0x1F, 0xC0, 0x00, 0xC0, 0x1F, 0xFC, 0x7F, - 0xF9, 0xFF, 0xF7, 0xFF, 0xCF, 0xC0, 0xBF, 0x00, 0x7C, 0x00, 0xF8, 0x01, - 0xF0, 0x03, 0xE0, 0x07, 0xC0, 0x0F, 0x80, 0x1F, 0x80, 0x3F, 0x00, 0x3F, - 0x07, 0x7F, 0xFE, 0x7F, 0xFC, 0x7F, 0xF8, 0x3F, 0xE0, 0x00, 0x0F, 0xC0, - 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, - 0xFC, 0x0C, 0x3F, 0x1F, 0xEF, 0xCF, 0xFD, 0xF7, 0xFF, 0xFD, 0xFF, 0xFF, - 0xFE, 0x1F, 0xFF, 0x03, 0xFF, 0x80, 0xFF, 0xE0, 0x1F, 0xF8, 0x07, 0xFE, - 0x01, 0xFF, 0x80, 0x7F, 0xE0, 0x1F, 0xF8, 0x0F, 0xFF, 0x03, 0xFF, 0xE1, - 0xFD, 0xFF, 0xFF, 0x7F, 0xFF, 0xCF, 0xFD, 0xF0, 0xFC, 0x7C, 0x00, 0xC0, - 0x07, 0xFE, 0x07, 0xFF, 0x87, 0xFF, 0xE7, 0xE3, 0xF3, 0xE0, 0x7F, 0xF0, - 0x3F, 0xF0, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x80, 0x07, 0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x02, 0x7F, 0xFF, 0x1F, 0xFF, - 0x87, 0xFF, 0xC0, 0xFF, 0xC0, 0x03, 0xF8, 0x3F, 0xF1, 0xFF, 0xC7, 0xFE, - 0x1F, 0x88, 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x7F, 0xF3, 0xFF, 0xCF, 0xFF, - 0x3F, 0xFC, 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x7C, - 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x1F, - 0x00, 0x7C, 0x01, 0xF0, 0x00, 0x03, 0x00, 0x07, 0xF9, 0xF3, 0xFF, 0x7D, - 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0x07, 0xFF, 0xC0, 0xFF, 0xE0, 0x3F, 0xF8, - 0x07, 0xFE, 0x01, 0xFF, 0x80, 0x7F, 0xE0, 0x1F, 0xF8, 0x07, 0xFE, 0x03, - 0xFF, 0xC0, 0xFF, 0xF8, 0x7F, 0x7F, 0xFF, 0xDF, 0xFF, 0xF3, 0xFF, 0xFC, - 0x3F, 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xF9, 0x80, 0x7E, 0x7F, - 0xFF, 0x9F, 0xFF, 0xC7, 0xFF, 0xE1, 0xFF, 0xE0, 0xF8, 0x00, 0x7C, 0x00, - 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, - 0x60, 0xF9, 0xFE, 0x7F, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0xFF, - 0xE0, 0x7F, 0xE0, 0x3F, 0xF0, 0x1F, 0xF8, 0x0F, 0xFC, 0x07, 0xFE, 0x03, - 0xFF, 0x01, 0xFF, 0x80, 0xFF, 0xC0, 0x7F, 0xE0, 0x3F, 0xF0, 0x1F, 0xF8, - 0x0F, 0xFC, 0x07, 0xFE, 0x03, 0xE0, 0x39, 0xFF, 0xFF, 0x7C, 0x00, 0x00, - 0x7D, 0xF7, 0xDF, 0x7D, 0xF7, 0xDF, 0x7D, 0xF7, 0xDF, 0x7D, 0xF7, 0xDF, - 0x7D, 0xF7, 0xC0, 0x03, 0x81, 0xF0, 0xFC, 0x3F, 0x07, 0xC0, 0x00, 0x00, - 0x00, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, - 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, - 0x7C, 0x1F, 0x07, 0xC3, 0xF0, 0xFF, 0xFF, 0xFF, 0xBF, 0xCF, 0xE0, 0xF8, - 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x0F, 0x80, 0x01, 0xF0, - 0x00, 0x3E, 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x0F, 0xDF, 0x03, 0xF3, 0xE0, - 0xFC, 0x7C, 0x3F, 0x0F, 0x8F, 0xC1, 0xF3, 0xF0, 0x3E, 0xFC, 0x07, 0xDF, - 0x00, 0xFF, 0xE0, 0x1F, 0xFE, 0x03, 0xFF, 0xE0, 0x7F, 0xFC, 0x0F, 0xCF, - 0xC1, 0xF0, 0xFC, 0x3E, 0x0F, 0xC7, 0xC1, 0xF8, 0xF8, 0x1F, 0x9F, 0x01, - 0xFB, 0xE0, 0x3F, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x20, 0x06, - 0x07, 0x9F, 0xF1, 0xFE, 0x3D, 0xFF, 0xDF, 0xFD, 0xFF, 0xFF, 0xFF, 0xEF, - 0xFF, 0xFF, 0xFF, 0xFE, 0x0F, 0xE0, 0xFF, 0xF0, 0x7F, 0x07, 0xFF, 0x03, - 0xF0, 0x3F, 0xF8, 0x0F, 0x80, 0xFF, 0xC0, 0x7C, 0x07, 0xFE, 0x03, 0xE0, - 0x3F, 0xF0, 0x1F, 0x01, 0xFF, 0x80, 0xF8, 0x0F, 0xFC, 0x07, 0xC0, 0x7F, - 0xE0, 0x3E, 0x03, 0xFF, 0x01, 0xF0, 0x1F, 0xF8, 0x0F, 0x80, 0xFF, 0xC0, - 0x7C, 0x07, 0xFE, 0x03, 0xE0, 0x3F, 0xF0, 0x1F, 0x01, 0xF0, 0x00, 0x20, - 0x79, 0xFF, 0x3D, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0xFF, 0xF0, - 0x3F, 0xF0, 0x1F, 0xF8, 0x0F, 0xFC, 0x07, 0xFE, 0x03, 0xFF, 0x01, 0xFF, - 0x80, 0xFF, 0xC0, 0x7F, 0xE0, 0x3F, 0xF0, 0x1F, 0xF8, 0x0F, 0xFC, 0x07, - 0xFE, 0x03, 0xFF, 0x01, 0xF0, 0x00, 0xE0, 0x03, 0xFF, 0x01, 0xFF, 0xE0, - 0xFF, 0xFC, 0x7F, 0xFF, 0x9F, 0x03, 0xEF, 0xC0, 0xFF, 0xE0, 0x1F, 0xF8, - 0x07, 0xFE, 0x01, 0xFF, 0x80, 0x7F, 0xE0, 0x1F, 0xF8, 0x07, 0xFE, 0x01, - 0xFF, 0xC0, 0xFD, 0xF8, 0x7E, 0x7F, 0xFF, 0x8F, 0xFF, 0xC1, 0xFF, 0xE0, - 0x1F, 0xE0, 0x00, 0x30, 0x3C, 0x7F, 0x0F, 0x7F, 0xE3, 0xFF, 0xFC, 0xFF, - 0xFF, 0xBF, 0x07, 0xEF, 0x80, 0xFB, 0xE0, 0x3E, 0xF8, 0x0F, 0xFE, 0x03, - 0xFF, 0x80, 0xFF, 0xE0, 0x3F, 0xF8, 0x0F, 0xBE, 0x03, 0xEF, 0xC1, 0xFB, - 0xF8, 0xFE, 0xFF, 0xFF, 0x3F, 0xFF, 0xCF, 0xFF, 0xE3, 0xE7, 0xF0, 0xF8, - 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x03, 0xE0, 0x00, 0xF8, 0x00, 0x3E, 0x00, - 0x0F, 0x80, 0x03, 0xE0, 0x00, 0x03, 0x00, 0x07, 0xF9, 0xF3, 0xFF, 0x7D, - 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0x07, 0xFF, 0xC0, 0xFF, 0xE0, 0x3F, 0xF8, - 0x07, 0xFE, 0x01, 0xFF, 0x80, 0x7F, 0xE0, 0x1F, 0xF8, 0x07, 0xFE, 0x03, - 0xFF, 0xC0, 0xFF, 0xF8, 0x7F, 0x7F, 0xFF, 0xDF, 0xFF, 0xF3, 0xFF, 0xFC, - 0x3F, 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x3F, 0x00, - 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x3F, 0x1F, 0xF3, - 0xFF, 0x7F, 0xFF, 0xFF, 0xF9, 0xFC, 0x0F, 0xC0, 0xF8, 0x0F, 0x80, 0xF8, - 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xF8, - 0x0F, 0x80, 0x03, 0x00, 0xFF, 0xE7, 0xFF, 0xFF, 0xFE, 0xF8, 0x3B, 0xE0, - 0x2F, 0x80, 0x3F, 0x80, 0xFF, 0x81, 0xFF, 0x83, 0xFF, 0x83, 0xFF, 0x01, - 0xFC, 0x03, 0xF0, 0x07, 0xE0, 0x1F, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xBF, - 0xF8, 0x0F, 0x00, 0x78, 0x07, 0xC0, 0x3E, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0x3F, 0x01, 0xF8, 0x0F, 0xC0, 0x7E, 0x03, 0xF0, 0x1F, 0x80, - 0xFC, 0x07, 0xE0, 0x3F, 0x01, 0xF8, 0x0F, 0xC0, 0x3F, 0xF1, 0xFF, 0x87, - 0xFC, 0x1F, 0xE0, 0xFC, 0x07, 0xFF, 0x01, 0xFF, 0xC0, 0x7F, 0xF0, 0x1F, - 0xFC, 0x07, 0xFF, 0x01, 0xFF, 0xC0, 0x7F, 0xF0, 0x1F, 0xFC, 0x07, 0xFF, - 0x01, 0xFF, 0xC0, 0x7F, 0xF0, 0x1F, 0xFC, 0x07, 0xDF, 0x03, 0xF7, 0xE1, - 0xFD, 0xFF, 0xFF, 0x7F, 0xFF, 0xCF, 0xFC, 0xF1, 0xFE, 0x3C, 0xFC, 0x03, - 0xF7, 0xC0, 0x3E, 0x7C, 0x03, 0xE7, 0xE0, 0x7E, 0x3E, 0x07, 0xC3, 0xE0, - 0x7C, 0x1F, 0x0F, 0xC1, 0xF0, 0xF8, 0x1F, 0x0F, 0x80, 0xF9, 0xF0, 0x0F, - 0x9F, 0x00, 0xF9, 0xF0, 0x07, 0xFE, 0x00, 0x7F, 0xE0, 0x03, 0xFE, 0x00, - 0x3F, 0xC0, 0x03, 0xFC, 0x00, 0x1F, 0x80, 0x01, 0xF8, 0x00, 0xFC, 0x0F, - 0xC0, 0xFD, 0xF0, 0x3F, 0x03, 0xE7, 0xC0, 0xFE, 0x0F, 0x9F, 0x87, 0xF8, - 0x3E, 0x3E, 0x1F, 0xE1, 0xF0, 0xF8, 0x7B, 0x87, 0xC3, 0xE3, 0xCF, 0x1F, - 0x07, 0xCF, 0x3C, 0x7C, 0x1F, 0x3C, 0xF3, 0xE0, 0x7C, 0xF3, 0xCF, 0x81, - 0xF3, 0x87, 0xBE, 0x03, 0xDE, 0x1E, 0xF0, 0x0F, 0xF8, 0x7B, 0xC0, 0x3F, - 0xE1, 0xFF, 0x00, 0x7F, 0x83, 0xFC, 0x01, 0xFC, 0x0F, 0xE0, 0x07, 0xF0, - 0x3F, 0x80, 0x1F, 0xC0, 0xFE, 0x00, 0x3F, 0x03, 0xF0, 0x00, 0xFE, 0x07, - 0xF3, 0xF0, 0x7E, 0x3F, 0x0F, 0xC1, 0xF8, 0xF8, 0x0F, 0x9F, 0x80, 0xFF, - 0xF0, 0x07, 0xFE, 0x00, 0x3F, 0xE0, 0x03, 0xFC, 0x00, 0x3F, 0xC0, 0x03, - 0xFE, 0x00, 0x7F, 0xE0, 0x0F, 0xFF, 0x00, 0xFD, 0xF8, 0x1F, 0x9F, 0x83, - 0xF0, 0xFC, 0x3F, 0x07, 0xE7, 0xE0, 0x7E, 0xFC, 0x03, 0xF0, 0xFC, 0x03, - 0xF7, 0xC0, 0x3E, 0x7E, 0x03, 0xE7, 0xE0, 0x7E, 0x3E, 0x07, 0xC3, 0xF0, - 0x7C, 0x1F, 0x0F, 0xC1, 0xF0, 0xF8, 0x1F, 0x0F, 0x80, 0xF9, 0xF0, 0x0F, - 0x9F, 0x00, 0x79, 0xF0, 0x07, 0xDE, 0x00, 0x3F, 0xE0, 0x03, 0xFE, 0x00, - 0x3F, 0xC0, 0x01, 0xFC, 0x00, 0x1F, 0x80, 0x00, 0xF8, 0x00, 0x1F, 0x80, - 0x01, 0xF0, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x07, 0xFE, 0x00, 0x7F, 0xC0, - 0x07, 0xF8, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0xFE, 0xFF, 0xFD, 0xFF, 0xFB, - 0xFF, 0xF0, 0x0F, 0xC0, 0x1F, 0x00, 0x7E, 0x01, 0xF8, 0x07, 0xE0, 0x0F, - 0x80, 0x3F, 0x00, 0xFC, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x80, 0x7F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x03, 0xE0, 0xFC, 0x3F, 0x87, 0xF0, - 0xF8, 0x1F, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x81, 0xF1, - 0xFE, 0x3F, 0x07, 0xC0, 0xFE, 0x0F, 0xE0, 0x7C, 0x07, 0x80, 0xF0, 0x1E, - 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xF0, 0x3F, 0x07, 0xF0, 0x7E, 0x07, 0xC0, - 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFC, 0x0F, 0xE0, 0xFF, 0x0F, - 0xF0, 0x1F, 0x01, 0xF0, 0x1F, 0x01, 0xF0, 0x1F, 0x01, 0xF0, 0x1F, 0x01, - 0xF0, 0x0F, 0x80, 0xFF, 0x07, 0xF0, 0x3F, 0x0F, 0xF0, 0xFE, 0x1F, 0x81, - 0xF0, 0x1F, 0x01, 0xF0, 0x1F, 0x01, 0xF0, 0x1F, 0x01, 0xF0, 0x3F, 0x0F, - 0xF0, 0xFE, 0x0F, 0xC0, 0x80, 0x00, 0x7F, 0x00, 0xFF, 0xF1, 0xFF, 0xFF, - 0xFD, 0xFF, 0xF8, 0x0F, 0xF4, 0x00, 0x00 }; - -const GFXglyph NotoSans_Bold18pt7bGlyphs[] PROGMEM = { - { 0, 1, 1, 9, 0, 0 }, // 0x20 ' ' - { 1, 6, 25, 10, 2, -24 }, // 0x21 '!' - { 20, 13, 9, 17, 2, -24 }, // 0x22 '"' - { 35, 21, 25, 23, 1, -24 }, // 0x23 '#' - { 101, 17, 29, 20, 2, -26 }, // 0x24 '$' - { 163, 30, 26, 32, 1, -25 }, // 0x25 '%' - { 261, 25, 26, 26, 1, -25 }, // 0x26 '&' - { 343, 5, 9, 9, 2, -24 }, // 0x27 ''' - { 349, 10, 31, 12, 1, -24 }, // 0x28 '(' - { 388, 10, 31, 12, 1, -24 }, // 0x29 ')' - { 427, 17, 17, 19, 1, -26 }, // 0x2A '*' - { 464, 17, 17, 20, 2, -20 }, // 0x2B '+' - { 501, 7, 9, 10, 1, -3 }, // 0x2C ',' - { 509, 9, 5, 11, 1, -11 }, // 0x2D '-' - { 515, 6, 5, 10, 2, -4 }, // 0x2E '.' - { 519, 14, 25, 15, 0, -24 }, // 0x2F '/' - { 563, 18, 26, 20, 1, -25 }, // 0x30 '0' - { 622, 13, 25, 20, 2, -24 }, // 0x31 '1' - { 663, 18, 26, 20, 1, -25 }, // 0x32 '2' - { 722, 18, 26, 20, 1, -25 }, // 0x33 '3' - { 781, 19, 25, 20, 1, -24 }, // 0x34 '4' - { 841, 17, 25, 20, 2, -24 }, // 0x35 '5' - { 895, 18, 25, 20, 1, -24 }, // 0x36 '6' - { 952, 18, 25, 20, 1, -24 }, // 0x37 '7' - { 1009, 18, 25, 20, 1, -24 }, // 0x38 '8' - { 1066, 18, 25, 20, 1, -24 }, // 0x39 '9' - { 1123, 6, 20, 10, 2, -19 }, // 0x3A ':' - { 1138, 7, 25, 10, 1, -19 }, // 0x3B ';' - { 1160, 17, 19, 20, 2, -21 }, // 0x3C '<' - { 1201, 17, 11, 20, 2, -17 }, // 0x3D '=' - { 1225, 17, 19, 20, 2, -21 }, // 0x3E '>' - { 1266, 16, 26, 17, 0, -25 }, // 0x3F '?' - { 1318, 28, 28, 32, 2, -24 }, // 0x40 '@' - { 1416, 24, 25, 24, 0, -24 }, // 0x41 'A' - { 1491, 19, 25, 23, 3, -24 }, // 0x42 'B' - { 1551, 20, 26, 23, 2, -25 }, // 0x43 'C' - { 1616, 21, 25, 26, 3, -24 }, // 0x44 'D' - { 1682, 15, 25, 20, 3, -24 }, // 0x45 'E' - { 1729, 15, 25, 19, 3, -24 }, // 0x46 'F' - { 1776, 21, 26, 26, 2, -25 }, // 0x47 'G' - { 1845, 21, 25, 27, 3, -24 }, // 0x48 'H' - { 1911, 12, 25, 14, 1, -24 }, // 0x49 'I' - { 1949, 12, 32, 12, -3, -24 }, // 0x4A 'J' - { 1997, 20, 25, 23, 3, -24 }, // 0x4B 'K' - { 2060, 16, 25, 20, 3, -24 }, // 0x4C 'L' - { 2110, 27, 25, 33, 3, -24 }, // 0x4D 'M' - { 2195, 22, 25, 29, 3, -24 }, // 0x4E 'N' - { 2264, 24, 26, 28, 2, -25 }, // 0x4F 'O' - { 2342, 17, 25, 22, 3, -24 }, // 0x50 'P' - { 2396, 24, 32, 28, 2, -25 }, // 0x51 'Q' - { 2492, 20, 25, 23, 3, -24 }, // 0x52 'R' - { 2555, 16, 26, 19, 2, -25 }, // 0x53 'S' - { 2607, 19, 25, 20, 1, -24 }, // 0x54 'T' - { 2667, 21, 25, 27, 3, -24 }, // 0x55 'U' - { 2733, 23, 25, 23, 0, -24 }, // 0x56 'V' - { 2805, 34, 25, 34, 0, -24 }, // 0x57 'W' - { 2912, 23, 25, 24, 0, -24 }, // 0x58 'X' - { 2984, 22, 25, 22, 0, -24 }, // 0x59 'Y' - { 3053, 19, 25, 20, 1, -24 }, // 0x5A 'Z' - { 3113, 9, 31, 12, 2, -24 }, // 0x5B '[' - { 3148, 14, 25, 15, 0, -24 }, // 0x5C '\' - { 3192, 8, 31, 12, 1, -24 }, // 0x5D ']' - { 3223, 18, 16, 20, 1, -24 }, // 0x5E '^' - { 3259, 15, 3, 14, 0, 4 }, // 0x5F '_' - { 3265, 10, 6, 13, 1, -26 }, // 0x60 '`' - { 3273, 18, 20, 21, 1, -19 }, // 0x61 'a' - { 3318, 18, 27, 22, 3, -26 }, // 0x62 'b' - { 3379, 15, 20, 18, 2, -19 }, // 0x63 'c' - { 3417, 18, 27, 22, 2, -26 }, // 0x64 'd' - { 3478, 17, 20, 21, 2, -19 }, // 0x65 'e' - { 3521, 14, 27, 14, 1, -26 }, // 0x66 'f' - { 3569, 18, 28, 22, 2, -19 }, // 0x67 'g' - { 3632, 17, 27, 23, 3, -26 }, // 0x68 'h' - { 3690, 6, 27, 11, 2, -26 }, // 0x69 'i' - { 3711, 10, 35, 11, -2, -26 }, // 0x6A 'j' - { 3755, 19, 27, 22, 3, -26 }, // 0x6B 'k' - { 3820, 5, 27, 11, 3, -26 }, // 0x6C 'l' - { 3837, 29, 20, 34, 3, -19 }, // 0x6D 'm' - { 3910, 17, 20, 23, 3, -19 }, // 0x6E 'n' - { 3953, 18, 20, 22, 2, -19 }, // 0x6F 'o' - { 3998, 18, 28, 22, 3, -19 }, // 0x70 'p' - { 4061, 18, 28, 22, 2, -19 }, // 0x71 'q' - { 4124, 12, 20, 16, 3, -19 }, // 0x72 'r' - { 4154, 14, 20, 18, 2, -19 }, // 0x73 's' - { 4189, 13, 23, 15, 1, -22 }, // 0x74 't' - { 4227, 18, 19, 23, 2, -18 }, // 0x75 'u' - { 4270, 20, 19, 20, 0, -18 }, // 0x76 'v' - { 4318, 30, 19, 30, 0, -18 }, // 0x77 'w' - { 4390, 20, 19, 20, 0, -18 }, // 0x78 'x' - { 4438, 20, 27, 20, 0, -18 }, // 0x79 'y' - { 4506, 15, 19, 17, 1, -18 }, // 0x7A 'z' - { 4542, 11, 31, 14, 1, -24 }, // 0x7B '{' - { 4585, 4, 35, 19, 8, -26 }, // 0x7C '|' - { 4603, 12, 31, 14, 1, -24 }, // 0x7D '}' - { 4650, 17, 6, 20, 2, -14 } }; // 0x7E '~' - -const GFXfont NotoSans_Bold18pt7b PROGMEM = { - (uint8_t *)NotoSans_Bold18pt7bBitmaps, - (GFXglyph *)NotoSans_Bold18pt7bGlyphs, - 0x20, 0x7E, 48 }; - -// Approx. 5335 bytes - -#endif // NOTOSANSBOLD18PT7B_H diff --git a/examples/companion_radio/ui-new/fonts/NotoSansBold24pt7b.h b/examples/companion_radio/ui-new/fonts/NotoSansBold24pt7b.h deleted file mode 100644 index a6be5d57..00000000 --- a/examples/companion_radio/ui-new/fonts/NotoSansBold24pt7b.h +++ /dev/null @@ -1,801 +0,0 @@ -#ifndef NOTOSANSBOLD24PT7B_H -#define NOTOSANSBOLD24PT7B_H -const uint8_t NotoSans_Bold24pt7bBitmaps[] PROGMEM = { - 0x00, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, - 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, - 0x00, 0x00, 0x00, 0x00, 0x7C, 0xFE, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0x10, - 0xFE, 0x3F, 0xFF, 0x1F, 0xFF, 0x0F, 0xDF, 0x87, 0xEF, 0xC3, 0xF7, 0xE1, - 0xFB, 0xF0, 0xFD, 0xF8, 0x7E, 0xFC, 0x1F, 0x3E, 0x0F, 0x9F, 0x07, 0xCF, - 0x83, 0xE7, 0xC1, 0xF0, 0x00, 0x3E, 0x0F, 0x80, 0x03, 0xE1, 0xF0, 0x00, - 0x3E, 0x1F, 0x00, 0x03, 0xE1, 0xF0, 0x00, 0x7C, 0x1F, 0x00, 0x07, 0xC1, - 0xF0, 0x00, 0x7C, 0x1E, 0x00, 0x07, 0xC3, 0xE0, 0x00, 0x7C, 0x3E, 0x00, - 0x0F, 0x83, 0xE0, 0x3F, 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, - 0xFF, 0xF3, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xF0, 0x1F, 0x07, 0xC0, - 0x01, 0xF0, 0x7C, 0x00, 0x1F, 0x0F, 0x80, 0x01, 0xF0, 0xF8, 0x00, 0x3E, - 0x0F, 0x80, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, - 0xEF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xE0, 0x7C, 0x1F, 0x00, 0x07, - 0xC1, 0xF0, 0x00, 0x7C, 0x3E, 0x00, 0x07, 0xC3, 0xE0, 0x00, 0x7C, 0x3E, - 0x00, 0x0F, 0x83, 0xE0, 0x00, 0xF8, 0x3E, 0x00, 0x0F, 0x87, 0xC0, 0x00, - 0xF8, 0x7C, 0x00, 0x00, 0x38, 0x00, 0x00, 0x70, 0x00, 0x00, 0xE0, 0x00, - 0x01, 0xC0, 0x00, 0x3F, 0xFE, 0x01, 0xFF, 0xFF, 0xC7, 0xFF, 0xFF, 0x1F, - 0xFF, 0xFE, 0x7F, 0xFF, 0xF9, 0xFF, 0xF7, 0xF3, 0xFC, 0xE0, 0xE7, 0xF1, - 0xC0, 0x0F, 0xE3, 0x80, 0x1F, 0xE7, 0x00, 0x3F, 0xEE, 0x00, 0x3F, 0xFC, - 0x00, 0x7F, 0xFC, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFF, 0x00, 0x3F, 0xFF, - 0x80, 0x1F, 0xFF, 0x80, 0x07, 0xFF, 0x80, 0x0F, 0xFF, 0x00, 0x1D, 0xFF, - 0x00, 0x38, 0xFE, 0x00, 0x71, 0xFE, 0x00, 0xE3, 0xFF, 0x81, 0xCF, 0xFF, - 0xF3, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFE, 0x7F, 0xFF, 0xF8, 0x7F, - 0xFF, 0xE0, 0x1F, 0xFE, 0x00, 0x00, 0xE0, 0x00, 0x01, 0xC0, 0x00, 0x03, - 0x80, 0x00, 0x07, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x1F, - 0x00, 0x0F, 0xF8, 0x00, 0x3F, 0x00, 0x1F, 0xFC, 0x00, 0x7E, 0x00, 0x3F, - 0xFE, 0x00, 0x7E, 0x00, 0x7F, 0xFE, 0x00, 0xFC, 0x00, 0x7E, 0x3F, 0x00, - 0xF8, 0x00, 0x7C, 0x3F, 0x01, 0xF8, 0x00, 0x7C, 0x1F, 0x01, 0xF0, 0x00, - 0xFC, 0x1F, 0x03, 0xF0, 0x00, 0xFC, 0x1F, 0x03, 0xE0, 0x00, 0xFC, 0x1F, - 0x07, 0xE0, 0x00, 0xFC, 0x1F, 0x0F, 0xC0, 0x00, 0xFC, 0x1F, 0x0F, 0xC0, - 0x00, 0x7C, 0x1F, 0x1F, 0x83, 0xC0, 0x7C, 0x3F, 0x1F, 0x0F, 0xF0, 0x7E, - 0x3F, 0x3F, 0x3F, 0xF8, 0x7F, 0xFE, 0x3E, 0x3F, 0xFC, 0x3F, 0xFE, 0x7E, - 0x7F, 0xFE, 0x1F, 0xFC, 0x7C, 0x7E, 0x7E, 0x0F, 0xF8, 0xFC, 0xFC, 0x3E, - 0x07, 0xF0, 0xF8, 0xFC, 0x3F, 0x00, 0x01, 0xF8, 0xFC, 0x3F, 0x00, 0x03, - 0xF0, 0xFC, 0x3F, 0x00, 0x03, 0xE0, 0xFC, 0x3F, 0x00, 0x07, 0xE0, 0xFC, - 0x3F, 0x00, 0x07, 0xC0, 0xFC, 0x3F, 0x00, 0x0F, 0xC0, 0xFC, 0x3F, 0x00, - 0x0F, 0x80, 0xFC, 0x3F, 0x00, 0x1F, 0x80, 0x7C, 0x3E, 0x00, 0x1F, 0x00, - 0x7E, 0x7E, 0x00, 0x3F, 0x00, 0x7F, 0xFE, 0x00, 0x7E, 0x00, 0x3F, 0xFC, - 0x00, 0x7C, 0x00, 0x1F, 0xF8, 0x00, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x7F, - 0x00, 0x00, 0x01, 0xFF, 0xF0, 0x00, 0x01, 0xFF, 0xFC, 0x00, 0x01, 0xFF, - 0xFF, 0x00, 0x01, 0xFF, 0xFF, 0x80, 0x00, 0xFF, 0xBF, 0xE0, 0x00, 0x7F, - 0x07, 0xF0, 0x00, 0x3F, 0x03, 0xF8, 0x00, 0x1F, 0x81, 0xFC, 0x00, 0x0F, - 0xC0, 0xFE, 0x00, 0x07, 0xF0, 0xFE, 0x00, 0x03, 0xF8, 0xFF, 0x00, 0x00, - 0xFE, 0xFF, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, - 0x07, 0xFF, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0xFF, 0x0F, 0xFF, 0x80, 0x7F, - 0x0F, 0xFF, 0xE0, 0x3F, 0x8F, 0xFF, 0xF8, 0x3F, 0xC7, 0xF9, 0xFE, 0x1F, - 0xC7, 0xF8, 0x7F, 0x8F, 0xE3, 0xFC, 0x1F, 0xEF, 0xE1, 0xFC, 0x07, 0xFF, - 0xF0, 0xFE, 0x01, 0xFF, 0xF0, 0x7F, 0x00, 0x7F, 0xF8, 0x3F, 0xC0, 0x1F, - 0xF8, 0x1F, 0xF0, 0x0F, 0xFC, 0x07, 0xFF, 0x7F, 0xFF, 0x03, 0xFF, 0xFF, - 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, 0xF0, 0x3F, 0xFF, 0xFF, 0xFC, 0x0F, 0xFF, - 0xF1, 0xFF, 0x01, 0xFF, 0xE0, 0x7F, 0xC0, 0xFF, 0xFF, 0xF7, 0xEF, 0xDF, - 0xBF, 0x7E, 0xFC, 0xF9, 0xF3, 0xE7, 0xC0, 0x01, 0xF8, 0x1F, 0x81, 0xF8, - 0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0x7E, 0x07, 0xF0, 0x3F, 0x01, 0xF8, 0x1F, - 0xC0, 0xFC, 0x07, 0xE0, 0x3F, 0x03, 0xF8, 0x1F, 0x80, 0xFC, 0x07, 0xE0, - 0x3F, 0x01, 0xF8, 0x0F, 0xC0, 0x7E, 0x03, 0xF0, 0x1F, 0x80, 0xFC, 0x07, - 0xE0, 0x3F, 0x01, 0xFC, 0x07, 0xE0, 0x3F, 0x01, 0xF8, 0x0F, 0xE0, 0x3F, - 0x01, 0xF8, 0x0F, 0xE0, 0x3F, 0x01, 0xFC, 0x07, 0xE0, 0x1F, 0x80, 0xFC, - 0x03, 0xF0, 0xFC, 0x03, 0xF0, 0x0F, 0xC0, 0x7E, 0x01, 0xF8, 0x0F, 0xE0, - 0x3F, 0x01, 0xF8, 0x07, 0xE0, 0x3F, 0x01, 0xFC, 0x07, 0xE0, 0x3F, 0x01, - 0xF8, 0x0F, 0xC0, 0x7F, 0x01, 0xF8, 0x0F, 0xC0, 0x7E, 0x03, 0xF0, 0x1F, - 0x80, 0xFC, 0x07, 0xE0, 0x3F, 0x01, 0xF8, 0x0F, 0xC0, 0x7E, 0x07, 0xE0, - 0x3F, 0x01, 0xF8, 0x0F, 0xC0, 0xFE, 0x07, 0xE0, 0x3F, 0x03, 0xF0, 0x1F, - 0x81, 0xF8, 0x0F, 0xC0, 0xFC, 0x07, 0xE0, 0xFE, 0x00, 0x00, 0x7E, 0x00, - 0x00, 0xFC, 0x00, 0x01, 0xF8, 0x00, 0x03, 0xE0, 0x00, 0x07, 0xC0, 0x00, - 0x0F, 0x80, 0x10, 0x1F, 0x00, 0xBC, 0x3E, 0x1E, 0x7F, 0xBD, 0xFE, 0xFF, - 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x7F, 0xFE, 0x00, 0x1F, - 0xE0, 0x00, 0x7F, 0xE0, 0x01, 0xF7, 0xC0, 0x07, 0xEF, 0xC0, 0x0F, 0xCF, - 0xC0, 0x3F, 0x1F, 0xC0, 0xFE, 0x1F, 0x80, 0x78, 0x3E, 0x00, 0x30, 0x30, - 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x01, 0xF0, 0x00, 0x03, 0xE0, - 0x00, 0x07, 0xC0, 0x00, 0x0F, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x3E, 0x00, - 0x00, 0x7C, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x1F, 0x00, 0x00, 0x3E, 0x00, 0x00, - 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x01, 0xF0, 0x00, 0x03, 0xE0, 0x00, 0x07, - 0xC0, 0x00, 0x0F, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x1F, 0xCF, 0xE3, 0xF8, - 0xFC, 0x3F, 0x0F, 0xC7, 0xE1, 0xF8, 0x7E, 0x1F, 0x0F, 0xC0, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x7C, 0xFE, 0xFF, 0xFF, - 0xFF, 0xFE, 0xFE, 0x10, 0x00, 0x07, 0xE0, 0x01, 0xFC, 0x00, 0x3F, 0x00, - 0x07, 0xE0, 0x01, 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xE0, 0x01, 0xFC, 0x00, - 0x3F, 0x00, 0x0F, 0xE0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x0F, 0xE0, 0x01, - 0xF8, 0x00, 0x3F, 0x00, 0x0F, 0xE0, 0x01, 0xF8, 0x00, 0x7F, 0x00, 0x0F, - 0xE0, 0x01, 0xF8, 0x00, 0x7F, 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x7F, - 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x7F, 0x00, 0x0F, 0xC0, 0x03, 0xF8, - 0x00, 0x7F, 0x00, 0x0F, 0xC0, 0x03, 0xF8, 0x00, 0x7E, 0x00, 0x1F, 0xC0, - 0x00, 0x01, 0xFE, 0x00, 0x0F, 0xFF, 0x00, 0x3F, 0xFF, 0x80, 0xFF, 0xFF, - 0x83, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0x1F, 0xE0, 0xFE, 0x3F, 0x80, 0xFE, - 0x7F, 0x01, 0xFD, 0xFC, 0x03, 0xFB, 0xF8, 0x03, 0xFF, 0xF0, 0x07, 0xFF, - 0xE0, 0x0F, 0xFF, 0xC0, 0x1F, 0xFF, 0x80, 0x3F, 0xFF, 0x00, 0x7F, 0xFE, - 0x00, 0xFF, 0xFC, 0x01, 0xFF, 0xF8, 0x03, 0xFF, 0xF0, 0x07, 0xFF, 0xE0, - 0x0F, 0xFF, 0xC0, 0x1F, 0xFF, 0x80, 0x3F, 0xFF, 0x00, 0x7F, 0xFE, 0x01, - 0xFE, 0xFE, 0x03, 0xF9, 0xFC, 0x07, 0xF3, 0xFC, 0x1F, 0xE3, 0xFC, 0x7F, - 0x87, 0xFF, 0xFF, 0x07, 0xFF, 0xFC, 0x07, 0xFF, 0xF0, 0x07, 0xFF, 0xC0, - 0x07, 0xFE, 0x00, 0x00, 0x3F, 0x00, 0x7F, 0x00, 0xFF, 0x01, 0xFF, 0x07, - 0xFF, 0x0F, 0xFF, 0x1F, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7E, - 0x7F, 0x38, 0x7F, 0x10, 0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x00, - 0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x00, - 0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x00, - 0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x01, - 0xFF, 0x00, 0x1F, 0xFF, 0x80, 0x7F, 0xFF, 0x83, 0xFF, 0xFF, 0x8F, 0xFF, - 0xFF, 0x9F, 0xFF, 0xFF, 0x9F, 0xC0, 0xFF, 0x1E, 0x00, 0xFE, 0x18, 0x01, - 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xE0, 0x00, 0x1F, - 0xC0, 0x00, 0x7F, 0x80, 0x00, 0xFE, 0x00, 0x03, 0xFC, 0x00, 0x0F, 0xF0, - 0x00, 0x3F, 0xC0, 0x00, 0xFF, 0x00, 0x03, 0xFC, 0x00, 0x0F, 0xF0, 0x00, - 0x3F, 0xC0, 0x00, 0xFF, 0x00, 0x03, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x3F, - 0xC0, 0x00, 0xFF, 0x00, 0x03, 0xFC, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFC, 0x03, 0xFE, 0x00, 0x3F, 0xFF, 0x81, 0xFF, 0xFF, 0xC7, 0xFF, 0xFF, - 0xC7, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0x8F, 0x00, 0xFF, 0x08, 0x00, 0xFE, - 0x00, 0x01, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xC0, - 0x00, 0x3F, 0x80, 0x01, 0xFE, 0x01, 0xFF, 0xF8, 0x03, 0xFF, 0xC0, 0x07, - 0xFE, 0x00, 0x0F, 0xFF, 0xC0, 0x1F, 0xFF, 0xC0, 0x07, 0xFF, 0xC0, 0x00, - 0x3F, 0xC0, 0x00, 0x3F, 0xC0, 0x00, 0x7F, 0x80, 0x00, 0x7F, 0x00, 0x00, - 0xFE, 0x00, 0x03, 0xFC, 0x00, 0x07, 0xFE, 0x00, 0x1F, 0xEF, 0xC0, 0xFF, - 0xDF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFE, 0x7F, 0xFF, 0xF8, 0xFF, 0xFF, 0xC0, - 0x7F, 0xFE, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x01, 0xFC, 0x00, 0x01, 0xFE, - 0x00, 0x01, 0xFF, 0x00, 0x00, 0xFF, 0x80, 0x00, 0xFF, 0xC0, 0x00, 0xFF, - 0xE0, 0x00, 0x7F, 0xF0, 0x00, 0x7F, 0xF8, 0x00, 0x7F, 0xFC, 0x00, 0x3E, - 0xFE, 0x00, 0x3F, 0x7F, 0x00, 0x3F, 0x3F, 0x80, 0x1F, 0x1F, 0xC0, 0x1F, - 0x8F, 0xE0, 0x1F, 0x87, 0xF0, 0x0F, 0x83, 0xF8, 0x0F, 0xC1, 0xFC, 0x0F, - 0xC0, 0xFE, 0x07, 0xC0, 0x7F, 0x07, 0xE0, 0x3F, 0x87, 0xE0, 0x1F, 0xC3, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x7F, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x1F, - 0xC0, 0x00, 0x0F, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x03, 0xF8, 0x00, 0x01, - 0xFC, 0x00, 0x3F, 0xFF, 0xF0, 0x7F, 0xFF, 0xE0, 0xFF, 0xFF, 0xC1, 0xFF, - 0xFF, 0x83, 0xFF, 0xFF, 0x07, 0xFF, 0xFE, 0x0F, 0xC0, 0x00, 0x1F, 0x80, - 0x00, 0x3F, 0x00, 0x00, 0x7E, 0x00, 0x01, 0xFC, 0x00, 0x03, 0xF8, 0x00, - 0x07, 0xF0, 0x00, 0x0F, 0xFF, 0xF0, 0x1F, 0xFF, 0xF8, 0x3F, 0xFF, 0xF8, - 0x7F, 0xFF, 0xF8, 0xFF, 0xFF, 0xF8, 0x78, 0x7F, 0xF0, 0x00, 0x1F, 0xE0, - 0x00, 0x1F, 0xE0, 0x00, 0x3F, 0xC0, 0x00, 0x7F, 0x80, 0x00, 0x7F, 0x00, - 0x01, 0xFE, 0x00, 0x03, 0xF8, 0x00, 0x07, 0xF7, 0x00, 0x1F, 0xEF, 0xE1, - 0xFF, 0xDF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFC, 0x7F, 0xFF, 0xF0, 0xFF, 0xFF, - 0xC0, 0x7F, 0xFE, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0xFF, 0xF0, 0x07, 0xFF, - 0xE0, 0x3F, 0xFF, 0xC0, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0x07, 0xF8, 0x00, - 0x1F, 0xE0, 0x00, 0x3F, 0x80, 0x00, 0xFE, 0x00, 0x01, 0xF8, 0x00, 0x03, - 0xF0, 0x00, 0x0F, 0xE1, 0xF8, 0x1F, 0x8F, 0xFC, 0x3F, 0x3F, 0xFC, 0x7E, - 0xFF, 0xFC, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFB, 0xFE, 0x07, 0xFF, 0xF8, - 0x07, 0xFF, 0xE0, 0x0F, 0xFF, 0xC0, 0x1F, 0xFF, 0x80, 0x3F, 0xFF, 0x00, - 0x7F, 0xFE, 0x00, 0xFF, 0xFC, 0x01, 0xFD, 0xFC, 0x03, 0xFB, 0xFC, 0x0F, - 0xF3, 0xFC, 0x7F, 0xC7, 0xFF, 0xFF, 0x87, 0xFF, 0xFE, 0x07, 0xFF, 0xF8, - 0x07, 0xFF, 0xE0, 0x03, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x7F, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x01, 0xFC, - 0x00, 0x01, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x03, 0xF8, 0x00, 0x03, 0xF8, - 0x00, 0x07, 0xF0, 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xE0, 0x00, 0x0F, 0xE0, - 0x00, 0x1F, 0xC0, 0x00, 0x1F, 0xC0, 0x00, 0x3F, 0xC0, 0x00, 0x3F, 0x80, - 0x00, 0x7F, 0x80, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0xFE, 0x00, - 0x00, 0xFE, 0x00, 0x01, 0xFC, 0x00, 0x01, 0xFC, 0x00, 0x03, 0xFC, 0x00, - 0x03, 0xF8, 0x00, 0x07, 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xF0, 0x00, - 0x00, 0xFE, 0x00, 0x0F, 0xFF, 0x80, 0x7F, 0xFF, 0xC1, 0xFF, 0xFF, 0xC3, - 0xFF, 0xFF, 0x8F, 0xF8, 0xFF, 0x9F, 0xC0, 0x7F, 0x3F, 0x80, 0xFE, 0x7E, - 0x01, 0xFC, 0xFC, 0x03, 0xF9, 0xFC, 0x07, 0xF3, 0xFC, 0x1F, 0xC3, 0xFC, - 0x7F, 0x83, 0xFF, 0xFE, 0x03, 0xFF, 0xF8, 0x03, 0xFF, 0xE0, 0x03, 0xFF, - 0x80, 0x1F, 0xFF, 0x80, 0x7F, 0xFF, 0xC1, 0xFF, 0xFF, 0xC7, 0xF8, 0x7F, - 0xCF, 0xE0, 0x7F, 0xBF, 0x80, 0x3F, 0xFE, 0x00, 0x7F, 0xFC, 0x00, 0x7F, - 0xF8, 0x00, 0xFF, 0xF0, 0x03, 0xFF, 0xF0, 0x07, 0xFF, 0xF0, 0x1F, 0xEF, - 0xFF, 0xFF, 0x9F, 0xFF, 0xFE, 0x1F, 0xFF, 0xFC, 0x1F, 0xFF, 0xE0, 0x0F, - 0xFF, 0x00, 0x00, 0xFE, 0x00, 0x03, 0xFF, 0xC0, 0x0F, 0xFF, 0xE0, 0x1F, - 0xFF, 0xF0, 0x3F, 0xFF, 0xF8, 0x3F, 0xFF, 0xFC, 0x7F, 0x81, 0xFE, 0x7F, - 0x00, 0xFE, 0x7F, 0x00, 0xFE, 0x7F, 0x00, 0x7F, 0x7F, 0x00, 0x7F, 0xFE, - 0x00, 0x7F, 0x7E, 0x00, 0x7F, 0x7F, 0x00, 0x7F, 0x7F, 0x00, 0xFF, 0x7F, - 0x80, 0xFF, 0x7F, 0xC3, 0xFF, 0x3F, 0xFF, 0xFF, 0x3F, 0xFF, 0xBF, 0x1F, - 0xFF, 0xBF, 0x0F, 0xFF, 0x7F, 0x03, 0xFC, 0x7F, 0x00, 0x00, 0x7E, 0x00, - 0x00, 0x7E, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFC, 0x00, 0x01, 0xFC, 0x00, - 0x03, 0xF8, 0x20, 0x1F, 0xF8, 0x1F, 0xFF, 0xF0, 0x1F, 0xFF, 0xE0, 0x1F, - 0xFF, 0xC0, 0x1F, 0xFF, 0x00, 0x1F, 0xFC, 0x00, 0x7C, 0xFE, 0xFF, 0xFF, - 0xFF, 0xFE, 0xFE, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x7C, 0xFE, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0x10, 0x1F, - 0x0F, 0xE3, 0xFC, 0xFF, 0x3F, 0xCF, 0xE1, 0xF8, 0x38, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x07, 0xF3, 0xF8, 0xFE, 0x3F, 0x0F, 0xC3, 0xF1, 0xF8, 0x7E, 0x1F, - 0x87, 0xC3, 0xF0, 0x00, 0x00, 0x06, 0x00, 0x00, 0x3C, 0x00, 0x01, 0xF8, - 0x00, 0x0F, 0xF0, 0x00, 0x7F, 0xE0, 0x03, 0xFF, 0x80, 0x1F, 0xFC, 0x00, - 0xFF, 0xE0, 0x07, 0xFF, 0x00, 0x3F, 0xF0, 0x01, 0xFF, 0x80, 0x07, 0xFC, - 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0xF8, 0x00, 0x3F, 0xFC, 0x00, 0x0F, 0xFF, - 0x00, 0x07, 0xFF, 0x80, 0x03, 0xFF, 0xE0, 0x00, 0xFF, 0xF0, 0x00, 0x7F, - 0xF0, 0x00, 0x3F, 0xE0, 0x00, 0x1F, 0xC0, 0x00, 0x07, 0x80, 0x00, 0x03, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x03, 0xF0, - 0x00, 0x07, 0xF8, 0x00, 0x0F, 0xFC, 0x00, 0x0F, 0xFE, 0x00, 0x07, 0xFF, - 0x00, 0x03, 0xFF, 0x80, 0x01, 0xFF, 0xC0, 0x00, 0xFF, 0xE0, 0x00, 0x3F, - 0xF0, 0x00, 0x1F, 0xF0, 0x00, 0x1F, 0xE0, 0x00, 0xFF, 0xC0, 0x07, 0xFF, - 0x00, 0x7F, 0xF8, 0x03, 0xFF, 0xC0, 0x3F, 0xFE, 0x01, 0xFF, 0xE0, 0x07, - 0xFF, 0x00, 0x0F, 0xF8, 0x00, 0x1F, 0x80, 0x00, 0x3C, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x03, 0xFE, 0x00, 0xFF, 0xFE, 0x1F, 0xFF, 0xF9, 0xFF, 0xFF, - 0xE7, 0xFF, 0xFF, 0x9F, 0xFF, 0xFC, 0xF0, 0x0F, 0xE6, 0x00, 0x7F, 0x00, - 0x01, 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0xFE, 0x00, 0x07, 0xF0, 0x00, 0x7F, - 0x00, 0x07, 0xF8, 0x00, 0xFF, 0x80, 0x0F, 0xF8, 0x00, 0xFF, 0x80, 0x0F, - 0xF0, 0x00, 0x7F, 0x00, 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0xF8, 0x00, - 0x07, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x03, 0xE0, 0x00, 0x3F, 0x80, 0x01, 0xFE, 0x00, 0x0F, 0xF0, 0x00, - 0x7F, 0x80, 0x03, 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x7F, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xC0, 0x00, 0x03, 0xFF, 0xFF, 0xC0, - 0x00, 0x1F, 0xFF, 0xFF, 0xC0, 0x01, 0xFF, 0xFF, 0xFF, 0x80, 0x0F, 0xF0, - 0x00, 0xFF, 0x00, 0x7F, 0x00, 0x00, 0xFE, 0x03, 0xF8, 0x00, 0x01, 0xF8, - 0x0F, 0xC0, 0x00, 0x03, 0xF0, 0x7E, 0x03, 0xFF, 0x07, 0xE3, 0xF0, 0x3F, - 0xFF, 0x0F, 0x8F, 0x81, 0xFF, 0xFC, 0x3E, 0x3E, 0x0F, 0xFF, 0xF0, 0xFD, - 0xF8, 0x7F, 0x07, 0xC1, 0xF7, 0xC3, 0xF8, 0x1F, 0x07, 0xDF, 0x0F, 0xC0, - 0x7C, 0x1F, 0xFC, 0x3E, 0x01, 0xF0, 0x7F, 0xF0, 0xF8, 0x07, 0xC1, 0xFF, - 0x87, 0xE0, 0x1F, 0x07, 0xFE, 0x1F, 0x80, 0xFC, 0x1F, 0xF8, 0x7E, 0x03, - 0xF0, 0x7F, 0xE0, 0xF8, 0x0F, 0xC3, 0xEF, 0x83, 0xE0, 0x3F, 0x0F, 0xBF, - 0x0F, 0xC1, 0xFC, 0x7E, 0x7C, 0x3F, 0xDF, 0xFB, 0xF1, 0xF0, 0x7F, 0xFF, - 0xFF, 0x87, 0xC0, 0xFF, 0xE7, 0xFE, 0x1F, 0x81, 0xFF, 0x0F, 0xF0, 0x3F, - 0x01, 0xF0, 0x0E, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, - 0x00, 0x03, 0xF8, 0x00, 0x01, 0x00, 0x0F, 0xF8, 0x00, 0x7C, 0x00, 0x1F, - 0xFF, 0xFF, 0xF0, 0x00, 0x1F, 0xFF, 0xFF, 0xC0, 0x00, 0x3F, 0xFF, 0xFF, - 0x00, 0x00, 0x1F, 0xFF, 0xE0, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x00, - 0x0F, 0xF8, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, - 0x03, 0xFF, 0x80, 0x00, 0x03, 0xFF, 0xC0, 0x00, 0x01, 0xFF, 0xE0, 0x00, - 0x00, 0xFF, 0xF8, 0x00, 0x00, 0xFE, 0xFC, 0x00, 0x00, 0x7F, 0x7F, 0x00, - 0x00, 0x3F, 0x3F, 0x80, 0x00, 0x3F, 0x8F, 0xC0, 0x00, 0x1F, 0xC7, 0xF0, - 0x00, 0x0F, 0xE3, 0xF8, 0x00, 0x0F, 0xE1, 0xFC, 0x00, 0x07, 0xF0, 0x7F, - 0x00, 0x07, 0xF8, 0x3F, 0x80, 0x03, 0xF8, 0x1F, 0xC0, 0x01, 0xFC, 0x07, - 0xF0, 0x01, 0xFE, 0x03, 0xF8, 0x00, 0xFE, 0x01, 0xFC, 0x00, 0x7F, 0xFF, - 0xFF, 0x00, 0x7F, 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, - 0xFF, 0xF0, 0x1F, 0xFF, 0xFF, 0xF8, 0x0F, 0xFF, 0xFF, 0xFE, 0x07, 0xF0, - 0x00, 0xFF, 0x07, 0xF8, 0x00, 0x3F, 0x83, 0xFC, 0x00, 0x1F, 0xE1, 0xFC, - 0x00, 0x0F, 0xF1, 0xFE, 0x00, 0x03, 0xF8, 0xFF, 0x00, 0x01, 0xFE, 0x7F, - 0x00, 0x00, 0xFF, 0x7F, 0x80, 0x00, 0x3F, 0xC0, 0xFF, 0xF0, 0x00, 0x7F, - 0xFF, 0xF0, 0x3F, 0xFF, 0xFE, 0x1F, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xE7, - 0xFF, 0xFF, 0xF3, 0xF8, 0x0F, 0xFD, 0xFC, 0x01, 0xFE, 0xFE, 0x00, 0xFF, - 0x7F, 0x00, 0x3F, 0xBF, 0x80, 0x1F, 0xDF, 0xC0, 0x1F, 0xEF, 0xE0, 0x0F, - 0xE7, 0xF0, 0x1F, 0xF3, 0xFF, 0xFF, 0xF1, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, - 0xE0, 0x7F, 0xFF, 0xFC, 0x3F, 0xFF, 0xFF, 0x9F, 0xC0, 0x7F, 0xEF, 0xE0, - 0x0F, 0xF7, 0xF0, 0x03, 0xFF, 0xF8, 0x01, 0xFF, 0xFC, 0x00, 0xFF, 0xFE, - 0x00, 0x7F, 0xFF, 0x00, 0x3F, 0xFF, 0x80, 0x1F, 0xFF, 0xC0, 0x1F, 0xEF, - 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xF8, - 0xFF, 0xFF, 0xF0, 0x7F, 0xFF, 0xC0, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x3F, - 0xFF, 0xC0, 0x3F, 0xFF, 0xFC, 0x1F, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0x87, - 0xFF, 0xFF, 0xC3, 0xFF, 0x80, 0xF0, 0xFF, 0x80, 0x0C, 0x7F, 0xC0, 0x00, - 0x1F, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0xFF, 0x00, - 0x00, 0x3F, 0x80, 0x00, 0x0F, 0xE0, 0x00, 0x03, 0xF8, 0x00, 0x00, 0xFE, - 0x00, 0x00, 0x3F, 0x80, 0x00, 0x0F, 0xE0, 0x00, 0x03, 0xF8, 0x00, 0x00, - 0xFE, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x0F, 0xF0, 0x00, 0x03, 0xFC, 0x00, - 0x00, 0x7F, 0x80, 0x00, 0x1F, 0xE0, 0x00, 0x07, 0xFC, 0x00, 0x00, 0xFF, - 0xC0, 0x0C, 0x3F, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xF0, - 0x1F, 0xFF, 0xFC, 0x01, 0xFF, 0xFF, 0x00, 0x1F, 0xFF, 0x00, 0xFF, 0xF0, - 0x00, 0x0F, 0xFF, 0xFC, 0x00, 0xFF, 0xFF, 0xF8, 0x0F, 0xFF, 0xFF, 0xC0, - 0xFF, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0xF0, 0xFE, 0x07, 0xFF, 0x8F, 0xE0, - 0x0F, 0xFC, 0xFE, 0x00, 0x3F, 0xCF, 0xE0, 0x03, 0xFE, 0xFE, 0x00, 0x1F, - 0xEF, 0xE0, 0x01, 0xFE, 0xFE, 0x00, 0x0F, 0xEF, 0xE0, 0x00, 0xFF, 0xFE, - 0x00, 0x0F, 0xFF, 0xE0, 0x00, 0xFF, 0xFE, 0x00, 0x0F, 0xFF, 0xE0, 0x00, - 0xFF, 0xFE, 0x00, 0x0F, 0xFF, 0xE0, 0x00, 0xFF, 0xFE, 0x00, 0x0F, 0xFF, - 0xE0, 0x00, 0xFE, 0xFE, 0x00, 0x1F, 0xEF, 0xE0, 0x01, 0xFE, 0xFE, 0x00, - 0x3F, 0xEF, 0xE0, 0x03, 0xFC, 0xFE, 0x00, 0xFF, 0xCF, 0xE0, 0x3F, 0xF8, - 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFC, 0x0F, 0xFF, - 0xFF, 0x80, 0xFF, 0xFF, 0xE0, 0x0F, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0xFE, 0x00, - 0x0F, 0xE0, 0x00, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0xFF, 0xFF, 0xEF, 0xFF, - 0xFE, 0xFF, 0xFF, 0xEF, 0xFF, 0xFE, 0xFF, 0xFF, 0xEF, 0xE0, 0x00, 0xFE, - 0x00, 0x0F, 0xE0, 0x00, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0xFE, 0x00, 0x0F, - 0xE0, 0x00, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0x80, 0x07, 0xF0, 0x00, 0xFE, 0x00, 0x1F, 0xC0, 0x03, 0xF8, 0x00, - 0x7F, 0x00, 0x0F, 0xE0, 0x01, 0xFC, 0x00, 0x3F, 0x80, 0x07, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFC, 0x00, 0x3F, 0x80, 0x07, 0xF0, 0x00, 0xFE, 0x00, 0x1F, 0xC0, 0x03, - 0xF8, 0x00, 0x7F, 0x00, 0x0F, 0xE0, 0x01, 0xFC, 0x00, 0x3F, 0x80, 0x07, - 0xF0, 0x00, 0xFE, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x0F, - 0xFF, 0xF8, 0x07, 0xFF, 0xFF, 0x81, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFC, - 0x3F, 0xFF, 0xFF, 0x87, 0xFF, 0x00, 0xE1, 0xFF, 0x80, 0x04, 0x3F, 0xC0, - 0x00, 0x0F, 0xF0, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x0F, - 0xF0, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x07, 0xF0, 0x1F, - 0xFF, 0xFE, 0x03, 0xFF, 0xFF, 0xC0, 0x7F, 0xFF, 0xF8, 0x0F, 0xFF, 0xFF, - 0x01, 0xFF, 0xFF, 0xE0, 0x3F, 0xFF, 0xFC, 0x00, 0x1F, 0xFF, 0xC0, 0x03, - 0xFF, 0xF8, 0x00, 0x7F, 0x7F, 0x80, 0x0F, 0xEF, 0xF0, 0x01, 0xFD, 0xFF, - 0x00, 0x3F, 0x9F, 0xF0, 0x07, 0xF1, 0xFF, 0xE7, 0xFE, 0x3F, 0xFF, 0xFF, - 0xC3, 0xFF, 0xFF, 0xF8, 0x3F, 0xFF, 0xFF, 0x01, 0xFF, 0xFF, 0xE0, 0x0F, - 0xFF, 0xE0, 0xFE, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x7F, 0xFE, 0x00, 0x07, - 0xFF, 0xE0, 0x00, 0x7F, 0xFE, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x7F, 0xFE, - 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x7F, 0xFE, 0x00, 0x07, 0xFF, 0xE0, 0x00, - 0x7F, 0xFE, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x7F, 0xFE, 0x00, 0x07, 0xFF, - 0xE0, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFE, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x7F, 0xFE, 0x00, 0x07, 0xFF, 0xE0, - 0x00, 0x7F, 0xFE, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x7F, 0xFE, 0x00, 0x07, - 0xFF, 0xE0, 0x00, 0x7F, 0xFE, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x7F, 0xFE, - 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x7F, 0xFE, 0x00, 0x07, 0xFF, 0xE0, 0x00, - 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0x1F, - 0xFC, 0x07, 0xF0, 0x07, 0xF0, 0x07, 0xF0, 0x07, 0xF0, 0x07, 0xF0, 0x07, - 0xF0, 0x07, 0xF0, 0x07, 0xF0, 0x07, 0xF0, 0x07, 0xF0, 0x07, 0xF0, 0x07, - 0xF0, 0x07, 0xF0, 0x07, 0xF0, 0x07, 0xF0, 0x07, 0xF0, 0x07, 0xF0, 0x07, - 0xF0, 0x07, 0xF0, 0x07, 0xF0, 0x07, 0xF0, 0x07, 0xF0, 0x0F, 0xF8, 0x7F, - 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0xFC, 0x07, - 0xF0, 0x1F, 0xC0, 0x7F, 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0x7F, 0x01, - 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0x7F, 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0xC0, - 0x7F, 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0x7F, 0x01, 0xFC, 0x07, 0xF0, - 0x1F, 0xC0, 0x7F, 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0x7F, 0x01, 0xFC, - 0x07, 0xF0, 0x1F, 0xC0, 0x7F, 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0x7F, - 0x03, 0xFE, 0x1F, 0xFF, 0xFF, 0xBF, 0xFE, 0xFF, 0xF3, 0xFF, 0x8F, 0xFC, - 0x3F, 0x80, 0xFE, 0x00, 0x1F, 0xFF, 0xC0, 0x07, 0xFB, 0xF8, 0x00, 0xFF, - 0x7F, 0x00, 0x3F, 0xCF, 0xE0, 0x0F, 0xF1, 0xFC, 0x03, 0xFC, 0x3F, 0x80, - 0xFF, 0x07, 0xF0, 0x1F, 0xE0, 0xFE, 0x07, 0xF8, 0x1F, 0xC1, 0xFE, 0x03, - 0xF8, 0x7F, 0x80, 0x7F, 0x1F, 0xE0, 0x0F, 0xE3, 0xFC, 0x01, 0xFC, 0xFF, - 0x00, 0x3F, 0xBF, 0xC0, 0x07, 0xF7, 0xF8, 0x00, 0xFF, 0xFF, 0x00, 0x1F, - 0xFF, 0xF0, 0x03, 0xFF, 0xFE, 0x00, 0x7F, 0xFF, 0xE0, 0x0F, 0xF9, 0xFE, - 0x01, 0xFE, 0x3F, 0xC0, 0x3F, 0x83, 0xFC, 0x07, 0xF0, 0x3F, 0xC0, 0xFE, - 0x07, 0xF8, 0x1F, 0xC0, 0x7F, 0x83, 0xF8, 0x0F, 0xF0, 0x7F, 0x00, 0xFF, - 0x0F, 0xE0, 0x0F, 0xF1, 0xFC, 0x01, 0xFE, 0x3F, 0x80, 0x1F, 0xE7, 0xF0, - 0x01, 0xFE, 0xFE, 0x00, 0x3F, 0xDF, 0xC0, 0x03, 0xFC, 0xFE, 0x00, 0x07, - 0xF0, 0x00, 0x3F, 0x80, 0x01, 0xFC, 0x00, 0x0F, 0xE0, 0x00, 0x7F, 0x00, - 0x03, 0xF8, 0x00, 0x1F, 0xC0, 0x00, 0xFE, 0x00, 0x07, 0xF0, 0x00, 0x3F, - 0x80, 0x01, 0xFC, 0x00, 0x0F, 0xE0, 0x00, 0x7F, 0x00, 0x03, 0xF8, 0x00, - 0x1F, 0xC0, 0x00, 0xFE, 0x00, 0x07, 0xF0, 0x00, 0x3F, 0x80, 0x01, 0xFC, - 0x00, 0x0F, 0xE0, 0x00, 0x7F, 0x00, 0x03, 0xF8, 0x00, 0x1F, 0xC0, 0x00, - 0xFE, 0x00, 0x07, 0xF0, 0x00, 0x3F, 0x80, 0x01, 0xFC, 0x00, 0x0F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xC0, 0xFF, 0xC0, 0x00, 0x3F, 0xFF, 0xFC, 0x00, 0x03, 0xFF, - 0xFF, 0xE0, 0x00, 0x3F, 0xFF, 0xFE, 0x00, 0x07, 0xFF, 0xFF, 0xE0, 0x00, - 0x7F, 0xFF, 0xFE, 0x00, 0x07, 0xFF, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0xFF, - 0x00, 0x0F, 0xFF, 0xFD, 0xF0, 0x00, 0xFB, 0xFF, 0xDF, 0x80, 0x1F, 0xBF, - 0xFD, 0xF8, 0x01, 0xFB, 0xFF, 0xCF, 0x80, 0x1F, 0x3F, 0xFC, 0xFC, 0x03, - 0xF3, 0xFF, 0xCF, 0xC0, 0x3F, 0x3F, 0xFC, 0xFC, 0x03, 0xE3, 0xFF, 0xE7, - 0xE0, 0x7E, 0x7F, 0xFE, 0x7E, 0x07, 0xE7, 0xFF, 0xE7, 0xE0, 0x7C, 0x7F, - 0xFE, 0x3E, 0x0F, 0xC7, 0xFF, 0xE3, 0xF0, 0xFC, 0x7F, 0xFE, 0x3F, 0x0F, - 0x87, 0xFF, 0xE1, 0xF1, 0xF8, 0x7F, 0xFE, 0x1F, 0x9F, 0x87, 0xFF, 0xE1, - 0xF9, 0xF0, 0x7F, 0xFE, 0x1F, 0x9F, 0x07, 0xFF, 0xE0, 0xFF, 0xF0, 0x7F, - 0xFE, 0x0F, 0xFE, 0x07, 0xFF, 0xE0, 0xFF, 0xE0, 0x7F, 0xFE, 0x07, 0xFE, - 0x07, 0xFF, 0xE0, 0x7F, 0xC0, 0x7F, 0xFE, 0x07, 0xFC, 0x07, 0xFF, 0xE0, - 0x3F, 0xC0, 0x7F, 0xFE, 0x03, 0xF8, 0x07, 0xFF, 0xE0, 0x3F, 0x80, 0x7F, - 0xFF, 0x80, 0x00, 0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xFC, 0x00, 0x0F, 0xFF, - 0xF8, 0x00, 0x3F, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0xC0, 0x03, 0xFF, 0xFF, - 0x80, 0x0F, 0xFF, 0xFE, 0x00, 0x3F, 0xFF, 0xFC, 0x00, 0xFF, 0xF7, 0xF0, - 0x03, 0xFF, 0xDF, 0xE0, 0x0F, 0xFF, 0x3F, 0xC0, 0x3F, 0xFC, 0x7F, 0x00, - 0xFF, 0xF1, 0xFE, 0x03, 0xFF, 0xC3, 0xF8, 0x0F, 0xFF, 0x0F, 0xF0, 0x3F, - 0xFE, 0x1F, 0xE0, 0xFF, 0xF8, 0x7F, 0x83, 0xFF, 0xE0, 0xFF, 0x0F, 0xFF, - 0x81, 0xFC, 0x3F, 0xFE, 0x07, 0xF8, 0xFF, 0xF8, 0x0F, 0xE3, 0xFF, 0xE0, - 0x3F, 0xCF, 0xFF, 0x80, 0x7F, 0xBF, 0xFE, 0x01, 0xFE, 0xFF, 0xF8, 0x03, - 0xFF, 0xFF, 0xE0, 0x07, 0xFF, 0xFF, 0x80, 0x1F, 0xFF, 0xFE, 0x00, 0x3F, - 0xFF, 0xF8, 0x00, 0xFF, 0xFF, 0xE0, 0x01, 0xFF, 0xFF, 0x80, 0x03, 0xFF, - 0xFE, 0x00, 0x0F, 0xFF, 0xF8, 0x00, 0x1F, 0xF0, 0x00, 0x3F, 0xF8, 0x00, - 0x00, 0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xFF, 0x80, 0x07, 0xFF, 0xFF, 0xE0, - 0x0F, 0xFF, 0xFF, 0xF0, 0x1F, 0xFF, 0xFF, 0xF0, 0x3F, 0xF0, 0x1F, 0xF8, - 0x3F, 0xC0, 0x07, 0xFC, 0x7F, 0x80, 0x03, 0xFC, 0x7F, 0x80, 0x03, 0xFC, - 0xFF, 0x00, 0x01, 0xFE, 0xFF, 0x00, 0x01, 0xFE, 0xFF, 0x00, 0x00, 0xFE, - 0xFE, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00, 0xFE, - 0xFE, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0xFF, - 0xFE, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00, 0xFE, 0xFF, 0x00, 0x00, 0xFE, - 0xFF, 0x00, 0x01, 0xFE, 0xFF, 0x00, 0x01, 0xFE, 0x7F, 0x80, 0x01, 0xFC, - 0x7F, 0x80, 0x03, 0xFC, 0x7F, 0xC0, 0x07, 0xFC, 0x3F, 0xE0, 0x0F, 0xF8, - 0x1F, 0xFF, 0xFF, 0xF8, 0x1F, 0xFF, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0xE0, - 0x07, 0xFF, 0xFF, 0xC0, 0x01, 0xFF, 0xFF, 0x00, 0x00, 0x7F, 0xFC, 0x00, - 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0x87, 0xFF, 0xFF, 0x8F, - 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, 0xBF, 0x83, 0xFF, 0x7F, 0x01, 0xFF, 0xFE, - 0x01, 0xFF, 0xFC, 0x01, 0xFF, 0xF8, 0x03, 0xFF, 0xF0, 0x07, 0xFF, 0xE0, - 0x0F, 0xFF, 0xC0, 0x3F, 0xFF, 0x80, 0x7F, 0xFF, 0x03, 0xFE, 0xFF, 0xFF, - 0xFD, 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0x0F, 0xFF, 0xFC, - 0x1F, 0xFF, 0xC0, 0x3F, 0x80, 0x00, 0x7F, 0x00, 0x00, 0xFE, 0x00, 0x01, - 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xE0, 0x00, 0x1F, - 0xC0, 0x00, 0x3F, 0x80, 0x00, 0x7F, 0x00, 0x00, 0xFE, 0x00, 0x01, 0xFC, - 0x00, 0x00, 0x00, 0x3F, 0xF8, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x03, 0xFF, - 0xFF, 0x80, 0x07, 0xFF, 0xFF, 0xE0, 0x0F, 0xFF, 0xFF, 0xF0, 0x1F, 0xFF, - 0xFF, 0xF0, 0x3F, 0xF0, 0x1F, 0xF8, 0x3F, 0xC0, 0x07, 0xFC, 0x7F, 0x80, - 0x03, 0xFC, 0x7F, 0x80, 0x03, 0xFC, 0xFF, 0x00, 0x01, 0xFE, 0xFF, 0x00, - 0x01, 0xFE, 0xFF, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00, 0xFE, 0xFE, 0x00, - 0x00, 0xFE, 0xFE, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00, 0xFF, 0xFE, 0x00, - 0x00, 0xFF, 0xFE, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0xFE, 0xFE, 0x00, - 0x00, 0xFE, 0xFF, 0x00, 0x00, 0xFE, 0xFF, 0x00, 0x01, 0xFE, 0xFF, 0x00, - 0x01, 0xFE, 0x7F, 0x80, 0x01, 0xFE, 0x7F, 0x80, 0x03, 0xFC, 0x7F, 0xC0, - 0x07, 0xFC, 0x3F, 0xE0, 0x0F, 0xF8, 0x1F, 0xFF, 0xFF, 0xF8, 0x1F, 0xFF, - 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0xE0, 0x07, 0xFF, 0xFF, 0xC0, 0x01, 0xFF, - 0xFF, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, - 0x7F, 0xC0, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x00, - 0x1F, 0xF0, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, - 0x03, 0xFE, 0xFF, 0xE0, 0x00, 0x1F, 0xFF, 0xF8, 0x03, 0xFF, 0xFF, 0xC0, - 0x7F, 0xFF, 0xFC, 0x0F, 0xFF, 0xFF, 0xC1, 0xFF, 0xFF, 0xF8, 0x3F, 0x81, - 0xFF, 0x87, 0xF0, 0x0F, 0xF0, 0xFE, 0x00, 0xFE, 0x1F, 0xC0, 0x1F, 0xC3, - 0xF8, 0x03, 0xF8, 0x7F, 0x00, 0x7F, 0x0F, 0xE0, 0x0F, 0xE1, 0xFC, 0x03, - 0xFC, 0x3F, 0x80, 0xFF, 0x07, 0xF0, 0xFF, 0xE0, 0xFF, 0xFF, 0xF8, 0x1F, - 0xFF, 0xFE, 0x03, 0xFF, 0xFF, 0x80, 0x7F, 0xFF, 0xE0, 0x0F, 0xFF, 0xFC, - 0x01, 0xFC, 0x3F, 0xC0, 0x3F, 0x83, 0xF8, 0x07, 0xF0, 0x3F, 0x80, 0xFE, - 0x07, 0xF8, 0x1F, 0xC0, 0x7F, 0x03, 0xF8, 0x0F, 0xF0, 0x7F, 0x00, 0xFF, - 0x0F, 0xE0, 0x1F, 0xE1, 0xFC, 0x01, 0xFE, 0x3F, 0x80, 0x1F, 0xE7, 0xF0, - 0x03, 0xFC, 0xFE, 0x00, 0x3F, 0xDF, 0xC0, 0x07, 0xFC, 0x00, 0xFF, 0x80, - 0x1F, 0xFF, 0xC0, 0xFF, 0xFF, 0xC7, 0xFF, 0xFE, 0x3F, 0xFF, 0xF9, 0xFF, - 0xFF, 0xE7, 0xF8, 0x0F, 0x1F, 0xC0, 0x04, 0x7F, 0x00, 0x01, 0xFC, 0x00, - 0x07, 0xF0, 0x00, 0x1F, 0xC0, 0x00, 0x7F, 0xC0, 0x01, 0xFF, 0xC0, 0x03, - 0xFF, 0xC0, 0x07, 0xFF, 0xC0, 0x0F, 0xFF, 0x80, 0x1F, 0xFF, 0x80, 0x1F, - 0xFF, 0x00, 0x3F, 0xFE, 0x00, 0x3F, 0xF8, 0x00, 0x3F, 0xF0, 0x00, 0x3F, - 0xC0, 0x00, 0x7F, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFC, 0x00, 0x1F, 0xFC, - 0x00, 0xFF, 0xFF, 0x9F, 0xFB, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0x3F, 0xFF, - 0xF8, 0xFF, 0xFF, 0xC0, 0x7F, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFC, 0x01, 0xFC, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x00, - 0x3F, 0x80, 0x00, 0x1F, 0xC0, 0x00, 0x0F, 0xE0, 0x00, 0x07, 0xF0, 0x00, - 0x03, 0xF8, 0x00, 0x01, 0xFC, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7F, 0x00, - 0x00, 0x3F, 0x80, 0x00, 0x1F, 0xC0, 0x00, 0x0F, 0xE0, 0x00, 0x07, 0xF0, - 0x00, 0x03, 0xF8, 0x00, 0x01, 0xFC, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7F, - 0x00, 0x00, 0x3F, 0x80, 0x00, 0x1F, 0xC0, 0x00, 0x0F, 0xE0, 0x00, 0x07, - 0xF0, 0x00, 0x03, 0xF8, 0x00, 0x01, 0xFC, 0x00, 0x00, 0xFE, 0x00, 0x00, - 0x7F, 0x00, 0x00, 0x3F, 0x80, 0x00, 0xFE, 0x00, 0x0F, 0xFF, 0xE0, 0x00, - 0xFF, 0xFE, 0x00, 0x0F, 0xFF, 0xE0, 0x00, 0xFF, 0xFE, 0x00, 0x0F, 0xFF, - 0xE0, 0x00, 0xFF, 0xFE, 0x00, 0x0F, 0xFF, 0xE0, 0x00, 0xFF, 0xFE, 0x00, - 0x0F, 0xFF, 0xE0, 0x00, 0xFF, 0xFE, 0x00, 0x0F, 0xFF, 0xE0, 0x00, 0xFF, - 0xFE, 0x00, 0x0F, 0xFF, 0xE0, 0x00, 0xFF, 0xFE, 0x00, 0x0F, 0xFF, 0xE0, - 0x00, 0xFF, 0xFE, 0x00, 0x0F, 0xFF, 0xE0, 0x00, 0xFF, 0xFE, 0x00, 0x0F, - 0xFF, 0xE0, 0x00, 0xFF, 0xFE, 0x00, 0x0F, 0xFF, 0xE0, 0x00, 0xFF, 0xFE, - 0x00, 0x0F, 0xFF, 0xE0, 0x00, 0xFE, 0xFF, 0x00, 0x0F, 0xEF, 0xF0, 0x00, - 0xFE, 0x7F, 0x80, 0x1F, 0xE7, 0xFC, 0x03, 0xFC, 0x7F, 0xFF, 0xFF, 0xC3, - 0xFF, 0xFF, 0xF8, 0x1F, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xE0, 0x07, 0xFF, - 0xFC, 0x00, 0x1F, 0xFF, 0x00, 0xFE, 0x00, 0x01, 0xFF, 0xFE, 0x00, 0x03, - 0xF9, 0xFC, 0x00, 0x07, 0xF3, 0xF8, 0x00, 0x1F, 0xE7, 0xF0, 0x00, 0x3F, - 0x87, 0xF0, 0x00, 0x7F, 0x0F, 0xE0, 0x01, 0xFE, 0x1F, 0xC0, 0x03, 0xF8, - 0x1F, 0xC0, 0x07, 0xF0, 0x3F, 0x80, 0x1F, 0xC0, 0x7F, 0x00, 0x3F, 0x80, - 0x7F, 0x00, 0x7F, 0x00, 0xFE, 0x00, 0xFC, 0x01, 0xFC, 0x03, 0xF8, 0x01, - 0xFC, 0x07, 0xF0, 0x03, 0xF8, 0x0F, 0xC0, 0x07, 0xF0, 0x3F, 0x80, 0x07, - 0xF0, 0x7F, 0x00, 0x0F, 0xE0, 0xFC, 0x00, 0x1F, 0xC3, 0xF8, 0x00, 0x1F, - 0xC7, 0xF0, 0x00, 0x3F, 0x8F, 0xC0, 0x00, 0x7F, 0x3F, 0x80, 0x00, 0x7E, - 0x7F, 0x00, 0x00, 0xFE, 0xFC, 0x00, 0x01, 0xFD, 0xF8, 0x00, 0x01, 0xFF, - 0xF0, 0x00, 0x03, 0xFF, 0xC0, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x07, 0xFF, - 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x1F, 0xF0, - 0x00, 0x00, 0x3F, 0xC0, 0x00, 0xFE, 0x00, 0x1F, 0xC0, 0x03, 0xFF, 0xF0, - 0x00, 0xFE, 0x00, 0x1F, 0xDF, 0x80, 0x07, 0xF8, 0x00, 0xFE, 0xFE, 0x00, - 0x3F, 0xC0, 0x07, 0xF7, 0xF0, 0x03, 0xFE, 0x00, 0x7F, 0x3F, 0x80, 0x1F, - 0xF0, 0x03, 0xF8, 0xFC, 0x00, 0xFF, 0xC0, 0x1F, 0xC7, 0xF0, 0x07, 0xFE, - 0x00, 0xFE, 0x3F, 0x80, 0x7F, 0xF0, 0x07, 0xE1, 0xFC, 0x03, 0xFF, 0x80, - 0x7F, 0x07, 0xE0, 0x1F, 0x7E, 0x03, 0xF8, 0x3F, 0x81, 0xFB, 0xF0, 0x1F, - 0xC1, 0xFC, 0x0F, 0xDF, 0x80, 0xFC, 0x0F, 0xE0, 0x7E, 0x7C, 0x0F, 0xE0, - 0x3F, 0x03, 0xF3, 0xF0, 0x7F, 0x01, 0xFC, 0x3F, 0x1F, 0x83, 0xF8, 0x0F, - 0xE1, 0xF8, 0xFC, 0x1F, 0x80, 0x7F, 0x0F, 0xC3, 0xF1, 0xFC, 0x01, 0xF8, - 0x7E, 0x1F, 0x8F, 0xE0, 0x0F, 0xC7, 0xE0, 0xFC, 0x7F, 0x00, 0x7F, 0x3F, - 0x07, 0xE3, 0xF0, 0x03, 0xF9, 0xF8, 0x1F, 0x1F, 0x80, 0x0F, 0xCF, 0xC0, - 0xFD, 0xFC, 0x00, 0x7E, 0x7C, 0x07, 0xEF, 0xE0, 0x03, 0xF7, 0xE0, 0x3F, - 0x7E, 0x00, 0x1F, 0xFF, 0x00, 0xFB, 0xF0, 0x00, 0x7F, 0xF8, 0x07, 0xDF, - 0x80, 0x03, 0xFF, 0x80, 0x3F, 0xFC, 0x00, 0x1F, 0xFC, 0x01, 0xFF, 0xC0, - 0x00, 0xFF, 0xE0, 0x07, 0xFE, 0x00, 0x03, 0xFF, 0x00, 0x3F, 0xF0, 0x00, - 0x1F, 0xF0, 0x01, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x0F, 0xF8, 0x00, 0x07, - 0xFC, 0x00, 0x3F, 0xC0, 0x00, 0x7F, 0x80, 0x03, 0xFE, 0xFF, 0x00, 0x07, - 0xF8, 0xFF, 0x00, 0x1F, 0xE0, 0xFF, 0x00, 0x3F, 0xC1, 0xFE, 0x00, 0xFF, - 0x01, 0xFE, 0x03, 0xFC, 0x01, 0xFC, 0x07, 0xF8, 0x03, 0xFC, 0x1F, 0xE0, - 0x03, 0xFC, 0x3F, 0x80, 0x03, 0xF8, 0xFF, 0x00, 0x07, 0xF9, 0xFC, 0x00, - 0x07, 0xF7, 0xF8, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x0F, 0xFF, 0x80, 0x00, - 0x0F, 0xFF, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, - 0x3F, 0xE0, 0x00, 0x00, 0xFF, 0xE0, 0x00, 0x03, 0xFF, 0xE0, 0x00, 0x07, - 0xFF, 0xC0, 0x00, 0x1F, 0xFF, 0xC0, 0x00, 0x3F, 0xBF, 0xC0, 0x00, 0xFF, - 0x3F, 0x80, 0x03, 0xFC, 0x7F, 0x80, 0x07, 0xF0, 0x7F, 0x80, 0x1F, 0xE0, - 0xFF, 0x00, 0x7F, 0x80, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x03, 0xFC, 0x01, - 0xFE, 0x0F, 0xF0, 0x01, 0xFE, 0x1F, 0xE0, 0x03, 0xFE, 0x7F, 0x80, 0x03, - 0xFD, 0xFE, 0x00, 0x03, 0xFC, 0xFF, 0x00, 0x03, 0xFB, 0xF8, 0x00, 0x3F, - 0xDF, 0xE0, 0x01, 0xFC, 0x7F, 0x00, 0x1F, 0xE3, 0xFC, 0x00, 0xFE, 0x0F, - 0xE0, 0x0F, 0xF0, 0x7F, 0x80, 0x7F, 0x01, 0xFC, 0x07, 0xF8, 0x0F, 0xF0, - 0x3F, 0x80, 0x3F, 0x83, 0xFC, 0x01, 0xFE, 0x1F, 0xC0, 0x07, 0xF1, 0xFC, - 0x00, 0x3F, 0xCF, 0xE0, 0x00, 0xFE, 0xFE, 0x00, 0x03, 0xFF, 0xF0, 0x00, - 0x1F, 0xFF, 0x00, 0x00, 0x7F, 0xF8, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x0F, - 0xFC, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x0F, 0xE0, - 0x00, 0x00, 0x7F, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x1F, 0xC0, 0x00, - 0x00, 0xFE, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x01, - 0xFC, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x03, 0xF8, - 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7F, 0xFF, 0xFF, - 0xBF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, - 0xFB, 0xFF, 0xFF, 0xF8, 0x00, 0x03, 0xFC, 0x00, 0x03, 0xFC, 0x00, 0x01, - 0xFC, 0x00, 0x01, 0xFE, 0x00, 0x01, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, - 0xFE, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x7F, 0x00, 0x00, - 0x7F, 0x80, 0x00, 0x7F, 0x80, 0x00, 0x3F, 0x80, 0x00, 0x3F, 0xC0, 0x00, - 0x3F, 0xC0, 0x00, 0x1F, 0xC0, 0x00, 0x1F, 0xE0, 0x00, 0x1F, 0xE0, 0x00, - 0x0F, 0xE0, 0x00, 0x0F, 0xE0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, - 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xF8, 0x3F, 0x07, 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, - 0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, - 0xC1, 0xF8, 0x3F, 0x07, 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, - 0xF8, 0x3F, 0x07, 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0xFE, 0x00, 0x0F, 0xC0, 0x01, 0xFC, 0x00, - 0x3F, 0x80, 0x03, 0xF0, 0x00, 0x7F, 0x00, 0x07, 0xE0, 0x00, 0xFC, 0x00, - 0x1F, 0xC0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xF0, 0x00, 0x7E, 0x00, - 0x0F, 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF8, 0x00, 0x3F, 0x00, - 0x07, 0xE0, 0x00, 0xFE, 0x00, 0x0F, 0xC0, 0x01, 0xFC, 0x00, 0x3F, 0x80, - 0x03, 0xF0, 0x00, 0x7F, 0x00, 0x07, 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0xC0, - 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xF0, 0x00, 0x7E, 0x00, 0x0F, 0xE0, - 0x01, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x0F, 0xC1, 0xF8, - 0x3F, 0x07, 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, - 0x07, 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, - 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xE0, - 0xFC, 0x1F, 0x83, 0xF0, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, - 0x3C, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x0F, 0xC0, 0x00, - 0x0F, 0xF0, 0x00, 0x07, 0xF8, 0x00, 0x07, 0xFE, 0x00, 0x03, 0xFF, 0x00, - 0x03, 0xE7, 0xC0, 0x01, 0xF3, 0xE0, 0x01, 0xF8, 0xF8, 0x00, 0xF8, 0x7C, - 0x00, 0xFC, 0x1F, 0x00, 0x7C, 0x0F, 0x80, 0x3E, 0x03, 0xE0, 0x3E, 0x01, - 0xF0, 0x1F, 0x00, 0x7C, 0x1F, 0x00, 0x3E, 0x0F, 0x80, 0x0F, 0x8F, 0xC0, - 0x07, 0xC7, 0xC0, 0x01, 0xF7, 0xE0, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0x80, 0xFF, 0x03, 0xFC, 0x0F, 0xF0, 0x3F, 0x80, 0xFE, - 0x01, 0xF8, 0x07, 0xE0, 0x1F, 0x01, 0xFF, 0x80, 0x1F, 0xFF, 0xC0, 0x7F, - 0xFF, 0xE0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC1, 0xF0, 0x7F, 0x83, 0x00, - 0x7F, 0x80, 0x00, 0x7F, 0x00, 0x00, 0xFE, 0x00, 0x01, 0xFC, 0x03, 0xFF, - 0xF8, 0x7F, 0xFF, 0xF1, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xDF, 0xF8, 0x3F, - 0xFF, 0x80, 0x7F, 0xFE, 0x00, 0xFF, 0xFC, 0x01, 0xFF, 0xF8, 0x07, 0xFF, - 0xF0, 0x0F, 0xFF, 0xF0, 0x3F, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xBF, - 0xFF, 0x3F, 0x3F, 0xFC, 0x7E, 0x1F, 0xF0, 0x7C, 0xFF, 0x00, 0x00, 0xFF, - 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, - 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, - 0x00, 0x00, 0xFE, 0x1F, 0xC0, 0xFE, 0x3F, 0xF0, 0xFE, 0xFF, 0xF8, 0xFE, - 0xFF, 0xFC, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFE, 0xFF, 0x81, 0xFE, 0xFF, - 0x00, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, - 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, - 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0xFF, 0xFF, - 0x80, 0xFF, 0xFF, 0xE3, 0xFE, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFC, 0xFE, - 0xFF, 0xF8, 0xFE, 0x7F, 0xF0, 0xFC, 0x3F, 0xE0, 0x00, 0x7F, 0xC0, 0x1F, - 0xFF, 0xC1, 0xFF, 0xFE, 0x3F, 0xFF, 0xE1, 0xFF, 0xFF, 0x1F, 0xFF, 0xF1, - 0xFF, 0x00, 0x8F, 0xF0, 0x00, 0x7F, 0x00, 0x03, 0xF8, 0x00, 0x3F, 0xC0, - 0x01, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0x7F, 0x00, 0x03, 0xF8, 0x00, 0x1F, - 0xE0, 0x00, 0xFF, 0x00, 0x03, 0xF8, 0x00, 0x1F, 0xE0, 0x00, 0xFF, 0x00, - 0x23, 0xFE, 0x1F, 0x1F, 0xFF, 0xF8, 0x7F, 0xFF, 0xC1, 0xFF, 0xFE, 0x07, - 0xFF, 0xF0, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, - 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, - 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x01, - 0xFC, 0x7F, 0x07, 0xFE, 0x7F, 0x0F, 0xFF, 0x7F, 0x1F, 0xFF, 0xFF, 0x3F, - 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0x7F, 0xC1, 0xFF, 0x7F, 0x80, 0xFF, 0x7F, - 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x3F, 0xFE, - 0x00, 0x3F, 0xFE, 0x00, 0x3F, 0xFE, 0x00, 0x3F, 0xFF, 0x00, 0x3F, 0xFF, - 0x00, 0x7F, 0x7F, 0x00, 0x7F, 0x7F, 0x00, 0x7F, 0x7F, 0x80, 0xFF, 0x7F, - 0xE3, 0xFF, 0x3F, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0x1F, 0xFF, 0xBF, 0x0F, - 0xFF, 0x3F, 0x03, 0xFC, 0x1F, 0x00, 0xFF, 0x80, 0x03, 0xFF, 0xE0, 0x0F, - 0xFF, 0xF0, 0x1F, 0xFF, 0xF8, 0x1F, 0xFF, 0xFC, 0x3F, 0xC1, 0xFE, 0x7F, - 0x80, 0xFE, 0x7F, 0x00, 0x7E, 0x7F, 0x00, 0x7F, 0x7F, 0x00, 0x7F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, - 0x00, 0x00, 0x7F, 0x80, 0x02, 0x3F, 0xE0, 0x1C, 0x3F, 0xFF, 0xFC, 0x1F, - 0xFF, 0xFC, 0x0F, 0xFF, 0xFC, 0x07, 0xFF, 0xFC, 0x01, 0xFF, 0xF0, 0x00, - 0x7F, 0x80, 0x3F, 0xFC, 0x0F, 0xFF, 0x83, 0xFF, 0xE0, 0xFF, 0xFC, 0x1F, - 0xFF, 0x83, 0xF8, 0x00, 0x7F, 0x00, 0x0F, 0xE0, 0x01, 0xFC, 0x00, 0x7F, - 0xFE, 0x3F, 0xFF, 0xCF, 0xFF, 0xF9, 0xFF, 0xFF, 0x3F, 0xFF, 0xE7, 0xFF, - 0xFC, 0x0F, 0xE0, 0x01, 0xFC, 0x00, 0x3F, 0x80, 0x07, 0xF0, 0x00, 0xFE, - 0x00, 0x1F, 0xC0, 0x03, 0xF8, 0x00, 0x7F, 0x00, 0x0F, 0xE0, 0x01, 0xFC, - 0x00, 0x3F, 0x80, 0x07, 0xF0, 0x00, 0xFE, 0x00, 0x1F, 0xC0, 0x03, 0xF8, - 0x00, 0x7F, 0x00, 0x0F, 0xE0, 0x01, 0xFC, 0x00, 0x3F, 0x80, 0x07, 0xF0, - 0x00, 0x01, 0xFC, 0x3F, 0x07, 0xFE, 0x3F, 0x0F, 0xFF, 0xBF, 0x1F, 0xFF, - 0xBF, 0x3F, 0xFF, 0xFF, 0x3F, 0xF7, 0xFF, 0x7F, 0x80, 0xFF, 0x7F, 0x80, - 0x7F, 0x7F, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, - 0x3F, 0xFE, 0x00, 0x3F, 0xFE, 0x00, 0x3F, 0xFE, 0x00, 0x3F, 0xFF, 0x00, - 0x3F, 0xFF, 0x00, 0x7F, 0x7F, 0x00, 0x7F, 0x7F, 0x00, 0x7F, 0x7F, 0x80, - 0xFF, 0x7F, 0xC1, 0xFF, 0x3F, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0x1F, 0xFF, - 0xFF, 0x0F, 0xFF, 0x7F, 0x03, 0xFC, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, - 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0xFF, 0x30, 0x01, 0xFF, 0x3F, 0x07, - 0xFE, 0x3F, 0xFF, 0xFE, 0x3F, 0xFF, 0xFC, 0x3F, 0xFF, 0xF8, 0x3F, 0xFF, - 0xF0, 0x0F, 0xFF, 0x80, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, - 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, - 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFE, 0x1F, - 0xE0, 0xFE, 0x7F, 0xF8, 0xFE, 0xFF, 0xFC, 0xFE, 0xFF, 0xFE, 0xFF, 0xFF, - 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0x00, - 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, - 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, - 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, - 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, - 0x7F, 0xFF, 0x00, 0x7F, 0x3C, 0x7E, 0xFF, 0xFF, 0xFF, 0x7F, 0x7E, 0x00, - 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0xE0, 0x1F, 0x81, 0xFE, 0x0F, 0xF0, 0x7F, - 0x81, 0xFC, 0x0F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFE, 0x0F, 0xF0, - 0x7F, 0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F, - 0xF0, 0x7F, 0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3F, 0xC1, 0xFE, - 0x0F, 0xF0, 0x7F, 0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3F, 0xC1, - 0xFE, 0x0F, 0xF0, 0x7F, 0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0xF4, 0xFF, - 0xBF, 0xFD, 0xFF, 0xCF, 0xFE, 0x7F, 0xE3, 0xFC, 0x00, 0xFE, 0x00, 0x00, - 0x7F, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x1F, 0xC0, 0x00, 0x0F, 0xE0, 0x00, - 0x07, 0xF0, 0x00, 0x03, 0xF8, 0x00, 0x01, 0xFC, 0x00, 0x00, 0xFE, 0x00, - 0x00, 0x7F, 0x00, 0x00, 0x3F, 0x80, 0x3F, 0xFF, 0xC0, 0x1F, 0xCF, 0xE0, - 0x1F, 0xE7, 0xF0, 0x1F, 0xE3, 0xF8, 0x1F, 0xE1, 0xFC, 0x1F, 0xE0, 0xFE, - 0x1F, 0xE0, 0x7F, 0x1F, 0xE0, 0x3F, 0x9F, 0xE0, 0x1F, 0xDF, 0xE0, 0x0F, - 0xCF, 0xE0, 0x07, 0xEF, 0xE0, 0x03, 0xFF, 0xF8, 0x01, 0xFF, 0xFE, 0x00, - 0xFF, 0xFF, 0x80, 0x7F, 0xFF, 0xC0, 0x3F, 0xEF, 0xF0, 0x1F, 0xC3, 0xFC, - 0x0F, 0xE0, 0xFF, 0x07, 0xF0, 0x7F, 0x83, 0xF8, 0x1F, 0xE1, 0xFC, 0x07, - 0xF8, 0xFE, 0x01, 0xFE, 0x7F, 0x00, 0xFF, 0x3F, 0x80, 0x3F, 0xDF, 0xC0, - 0x0F, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFC, 0x1F, 0xE0, 0x1F, 0xE1, 0xF8, 0xFF, 0xF0, 0xFF, 0xF3, - 0xFB, 0xFF, 0xF3, 0xFF, 0xF7, 0xFF, 0xFF, 0xEF, 0xFF, 0xEF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x7F, 0xE0, 0x7F, - 0xFF, 0xC0, 0x7F, 0xC0, 0x7F, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0xFE, 0x01, - 0xFE, 0x01, 0xFF, 0xFC, 0x03, 0xFC, 0x03, 0xFF, 0xF8, 0x07, 0xF8, 0x07, - 0xFF, 0xF0, 0x0F, 0xF0, 0x0F, 0xFF, 0xE0, 0x1F, 0xE0, 0x1F, 0xFF, 0xC0, - 0x3F, 0xC0, 0x3F, 0xFF, 0x80, 0x7F, 0x80, 0x7F, 0xFF, 0x00, 0xFF, 0x00, - 0xFF, 0xFE, 0x01, 0xFE, 0x01, 0xFF, 0xFC, 0x03, 0xFC, 0x03, 0xFF, 0xF8, - 0x07, 0xF8, 0x07, 0xFF, 0xF0, 0x0F, 0xF0, 0x0F, 0xFF, 0xE0, 0x1F, 0xE0, - 0x1F, 0xFF, 0xC0, 0x3F, 0xC0, 0x3F, 0xFF, 0x80, 0x7F, 0x80, 0x7F, 0xFF, - 0x00, 0xFF, 0x00, 0xFF, 0xFE, 0x01, 0xFE, 0x01, 0xFC, 0xFC, 0x1F, 0xE0, - 0xFC, 0x7F, 0xF8, 0xFE, 0xFF, 0xFC, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFE, - 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0x00, 0x7F, - 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, - 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, - 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, - 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, - 0xFF, 0x00, 0x7F, 0x00, 0xFF, 0x80, 0x01, 0xFF, 0xF0, 0x03, 0xFF, 0xFE, - 0x03, 0xFF, 0xFF, 0x81, 0xFF, 0xFF, 0xE1, 0xFF, 0x1F, 0xF1, 0xFE, 0x03, - 0xFC, 0xFF, 0x00, 0xFE, 0x7F, 0x00, 0x7F, 0xBF, 0x80, 0x3F, 0xFF, 0xC0, - 0x0F, 0xFF, 0xE0, 0x07, 0xFF, 0xE0, 0x03, 0xFF, 0xF0, 0x01, 0xFF, 0xF8, - 0x00, 0xFF, 0xFE, 0x00, 0x7F, 0xFF, 0x00, 0x3F, 0xBF, 0x80, 0x3F, 0xDF, - 0xC0, 0x1F, 0xCF, 0xF0, 0x1F, 0xE3, 0xFC, 0x1F, 0xF0, 0xFF, 0xFF, 0xF0, - 0x7F, 0xFF, 0xF0, 0x1F, 0xFF, 0xF0, 0x03, 0xFF, 0xF0, 0x00, 0xFF, 0xE0, - 0x00, 0xFC, 0x1F, 0xC0, 0xFE, 0x7F, 0xF0, 0xFE, 0xFF, 0xF8, 0xFE, 0xFF, - 0xFC, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFE, 0xFF, 0x81, 0xFF, 0xFF, 0x80, - 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, - 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, - 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0xFF, 0xFF, 0x81, - 0xFF, 0xFF, 0xE3, 0xFE, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFC, 0xFE, 0xFF, - 0xF8, 0xFE, 0x7F, 0xF0, 0xFE, 0x3F, 0xE0, 0xFF, 0x00, 0x00, 0xFF, 0x00, - 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, - 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, - 0x00, 0xFF, 0x00, 0x00, 0x01, 0xFC, 0x3F, 0x07, 0xFE, 0x3F, 0x0F, 0xFF, - 0x3F, 0x1F, 0xFF, 0xBF, 0x3F, 0xFF, 0xFF, 0x3F, 0xE7, 0xFF, 0x7F, 0x80, - 0xFF, 0x7F, 0x80, 0x7F, 0x7F, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, - 0x7F, 0xFF, 0x00, 0x3F, 0xFE, 0x00, 0x3F, 0xFE, 0x00, 0x3F, 0xFE, 0x00, - 0x3F, 0xFF, 0x00, 0x3F, 0xFF, 0x00, 0x7F, 0x7F, 0x00, 0x7F, 0x7F, 0x00, - 0x7F, 0x7F, 0x80, 0xFF, 0x7F, 0xE1, 0xFF, 0x3F, 0xFF, 0xFF, 0x3F, 0xFF, - 0xFF, 0x1F, 0xFF, 0xFF, 0x0F, 0xFF, 0x7F, 0x03, 0xFC, 0x7F, 0x00, 0x00, - 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, - 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, - 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0xFC, 0x0F, 0xFE, 0x1F, 0xFF, - 0x1F, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, - 0xFF, 0x80, 0x7F, 0x80, 0x3F, 0xC0, 0x1F, 0xE0, 0x0F, 0xF0, 0x07, 0xF8, - 0x03, 0xFC, 0x01, 0xFE, 0x00, 0xFF, 0x00, 0x7F, 0x80, 0x3F, 0xC0, 0x1F, - 0xE0, 0x0F, 0xF0, 0x07, 0xF8, 0x03, 0xFC, 0x01, 0xFE, 0x00, 0xFF, 0x00, - 0x7F, 0x80, 0x00, 0x03, 0xFE, 0x01, 0xFF, 0xFE, 0x3F, 0xFF, 0xE7, 0xFF, - 0xFE, 0x7F, 0xFF, 0xCF, 0xF0, 0x3C, 0xFE, 0x00, 0x4F, 0xE0, 0x00, 0xFF, - 0x00, 0x0F, 0xFC, 0x00, 0x7F, 0xF8, 0x03, 0xFF, 0xE0, 0x3F, 0xFF, 0x80, - 0xFF, 0xFC, 0x03, 0xFF, 0xE0, 0x0F, 0xFE, 0x00, 0x1F, 0xE0, 0x00, 0xFF, - 0x00, 0x07, 0xF8, 0x00, 0x7F, 0xF0, 0x0F, 0xEF, 0xFF, 0xFE, 0xFF, 0xFF, - 0xEF, 0xFF, 0xFC, 0xFF, 0xFF, 0x83, 0xFF, 0xE0, 0x03, 0xC0, 0x01, 0xF0, - 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x0F, 0xC0, 0x03, 0xFF, 0xF3, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x7F, 0x00, 0x1F, - 0xC0, 0x07, 0xF0, 0x01, 0xFC, 0x00, 0x7F, 0x00, 0x1F, 0xC0, 0x07, 0xF0, - 0x01, 0xFC, 0x00, 0x7F, 0x00, 0x1F, 0xC0, 0x07, 0xF0, 0x01, 0xFC, 0x00, - 0x7F, 0x00, 0x1F, 0xE0, 0x03, 0xFC, 0x30, 0xFF, 0xFC, 0x3F, 0xFF, 0x07, - 0xFF, 0xC0, 0xFF, 0xF0, 0x1F, 0xF8, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, - 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, - 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, - 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, - 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFF, 0x00, 0xFF, - 0xFF, 0x00, 0xFF, 0xFF, 0x01, 0xFF, 0x7F, 0xC7, 0xFF, 0x7F, 0xFF, 0xFF, - 0x7F, 0xFF, 0xFF, 0x3F, 0xFF, 0xBF, 0x1F, 0xFF, 0x3F, 0x07, 0xFC, 0x3F, - 0xFE, 0x00, 0x1F, 0xFF, 0xE0, 0x03, 0xF9, 0xFC, 0x00, 0x7F, 0x3F, 0x80, - 0x1F, 0xE3, 0xF8, 0x03, 0xF8, 0x7F, 0x00, 0x7F, 0x0F, 0xE0, 0x1F, 0xE0, - 0xFE, 0x03, 0xF8, 0x1F, 0xC0, 0x7F, 0x03, 0xF8, 0x1F, 0xC0, 0x3F, 0x83, - 0xF8, 0x07, 0xF0, 0x7F, 0x00, 0x7E, 0x1F, 0xC0, 0x0F, 0xE3, 0xF8, 0x01, - 0xFC, 0x7E, 0x00, 0x1F, 0x8F, 0xC0, 0x03, 0xFB, 0xF8, 0x00, 0x3F, 0x7E, - 0x00, 0x07, 0xEF, 0xC0, 0x00, 0xFF, 0xF8, 0x00, 0x0F, 0xFE, 0x00, 0x01, - 0xFF, 0xC0, 0x00, 0x3F, 0xF0, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x7F, 0xC0, - 0x00, 0x07, 0xF0, 0x00, 0xFE, 0x00, 0xFF, 0x00, 0x7F, 0x7F, 0x00, 0xFF, - 0x00, 0x7E, 0x7F, 0x00, 0xFF, 0x80, 0xFE, 0x7F, 0x01, 0xFF, 0x80, 0xFE, - 0x3F, 0x81, 0xFF, 0x80, 0xFE, 0x3F, 0x81, 0xFF, 0x80, 0xFC, 0x3F, 0x81, - 0xFF, 0xC1, 0xFC, 0x1F, 0x83, 0xF7, 0xC1, 0xFC, 0x1F, 0xC3, 0xE7, 0xC1, - 0xF8, 0x1F, 0xC3, 0xE7, 0xC3, 0xF8, 0x1F, 0xC3, 0xE7, 0xC3, 0xF8, 0x0F, - 0xC7, 0xE3, 0xE3, 0xF8, 0x0F, 0xE7, 0xC3, 0xE3, 0xF0, 0x0F, 0xE7, 0xC3, - 0xE7, 0xF0, 0x0F, 0xE7, 0xC3, 0xE7, 0xF0, 0x07, 0xE7, 0xC3, 0xF7, 0xE0, - 0x07, 0xEF, 0x81, 0xF7, 0xE0, 0x07, 0xEF, 0x81, 0xF7, 0xE0, 0x03, 0xFF, - 0x81, 0xF7, 0xE0, 0x03, 0xFF, 0x81, 0xFF, 0xC0, 0x03, 0xFF, 0x80, 0xFF, - 0xC0, 0x03, 0xFF, 0x00, 0xFF, 0xC0, 0x01, 0xFF, 0x00, 0xFF, 0x80, 0x01, - 0xFF, 0x00, 0xFF, 0x80, 0x01, 0xFF, 0x00, 0xFF, 0x80, 0x00, 0xFE, 0x00, - 0x7F, 0x80, 0x7F, 0x80, 0x1F, 0xEF, 0xF0, 0x07, 0xF8, 0xFF, 0x01, 0xFE, - 0x0F, 0xF0, 0x3F, 0x81, 0xFE, 0x0F, 0xF0, 0x1F, 0xE3, 0xFC, 0x01, 0xFC, - 0x7F, 0x00, 0x3F, 0xDF, 0xE0, 0x03, 0xFF, 0xF8, 0x00, 0x3F, 0xFE, 0x00, - 0x07, 0xFF, 0xC0, 0x00, 0x7F, 0xF0, 0x00, 0x07, 0xFC, 0x00, 0x00, 0xFF, - 0xC0, 0x00, 0x3F, 0xF8, 0x00, 0x0F, 0xFF, 0x80, 0x01, 0xFF, 0xF8, 0x00, - 0x7F, 0x7F, 0x00, 0x1F, 0xEF, 0xF0, 0x03, 0xF8, 0xFF, 0x00, 0xFF, 0x0F, - 0xE0, 0x3F, 0xC1, 0xFE, 0x07, 0xF0, 0x1F, 0xE1, 0xFE, 0x03, 0xFC, 0x7F, - 0x80, 0x3F, 0xDF, 0xE0, 0x03, 0xFC, 0xFF, 0x00, 0x1F, 0xFF, 0xE0, 0x03, - 0xF9, 0xFC, 0x00, 0x7F, 0x3F, 0xC0, 0x1F, 0xE3, 0xF8, 0x03, 0xF8, 0x7F, - 0x00, 0x7F, 0x0F, 0xE0, 0x1F, 0xE0, 0xFE, 0x03, 0xF8, 0x1F, 0xC0, 0x7F, - 0x01, 0xFC, 0x0F, 0xC0, 0x3F, 0x83, 0xF8, 0x07, 0xF0, 0x7F, 0x00, 0x7E, - 0x0F, 0xC0, 0x0F, 0xE3, 0xF8, 0x00, 0xFC, 0x7F, 0x00, 0x1F, 0x8F, 0xC0, - 0x03, 0xFB, 0xF8, 0x00, 0x3F, 0x7E, 0x00, 0x07, 0xEF, 0xC0, 0x00, 0x7F, - 0xF8, 0x00, 0x0F, 0xFE, 0x00, 0x01, 0xFF, 0xC0, 0x00, 0x1F, 0xF8, 0x00, - 0x03, 0xFE, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x07, 0xF0, 0x00, 0x00, 0xFE, - 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x07, 0xF0, 0x00, 0x01, 0xFE, 0x00, 0x00, - 0x3F, 0x80, 0x01, 0x3F, 0xF0, 0x00, 0x3F, 0xFC, 0x00, 0x07, 0xFF, 0x80, - 0x00, 0xFF, 0xE0, 0x00, 0x1F, 0xF8, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x7F, - 0xFF, 0xF3, 0xFF, 0xFF, 0x9F, 0xFF, 0xFC, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, - 0x3F, 0xFF, 0xF8, 0x00, 0x3F, 0x80, 0x03, 0xF8, 0x00, 0x3F, 0xC0, 0x03, - 0xFC, 0x00, 0x1F, 0xC0, 0x01, 0xFC, 0x00, 0x1F, 0xE0, 0x00, 0xFE, 0x00, - 0x0F, 0xE0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0x7F, 0x00, 0x07, 0xF0, - 0x00, 0x7F, 0x80, 0x07, 0xF8, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x03, 0x00, 0xFF, - 0x01, 0xFF, 0x03, 0xFF, 0x03, 0xFF, 0x03, 0xFF, 0x03, 0xF0, 0x03, 0xF0, - 0x03, 0xF0, 0x03, 0xF0, 0x03, 0xF0, 0x03, 0xF0, 0x03, 0xF0, 0x03, 0xF0, - 0x03, 0xF0, 0x07, 0xF0, 0x07, 0xF0, 0x0F, 0xE0, 0xFF, 0xE0, 0xFF, 0xC0, - 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0xC0, 0xFF, 0xE0, 0x0F, 0xE0, 0x07, 0xF0, - 0x07, 0xF0, 0x03, 0xF0, 0x03, 0xF0, 0x03, 0xF0, 0x03, 0xF0, 0x03, 0xF0, - 0x03, 0xF0, 0x03, 0xF0, 0x03, 0xF0, 0x03, 0xF8, 0x03, 0xFF, 0x03, 0xFF, - 0x03, 0xFF, 0x01, 0xFF, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, - 0x80, 0x00, 0xFE, 0x00, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0xC0, 0xFF, 0xC0, - 0x1F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0, - 0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xE0, 0x0F, 0xF0, - 0x07, 0xFF, 0x03, 0xFF, 0x00, 0xFF, 0x01, 0xFF, 0x07, 0xFF, 0x07, 0xFF, - 0x0F, 0xF0, 0x0F, 0xE0, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0, - 0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F, 0xC0, 0x1F, 0xC0, - 0xFF, 0xC0, 0xFF, 0xC0, 0xFF, 0x80, 0xFF, 0x00, 0xFE, 0x00, 0x3F, 0xE0, - 0x02, 0xFF, 0xF0, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF8, 0x07, 0xFF, 0xA0, 0x03, 0xFE, 0x00 }; - -const GFXglyph NotoSans_Bold24pt7bGlyphs[] PROGMEM = { - { 0, 1, 1, 12, 0, 0 }, // 0x20 ' ' - { 1, 8, 35, 13, 3, -33 }, // 0x21 '!' - { 36, 17, 13, 23, 3, -33 }, // 0x22 '"' - { 64, 28, 34, 30, 1, -33 }, // 0x23 '#' - { 183, 23, 39, 27, 2, -35 }, // 0x24 '$' - { 296, 40, 34, 42, 1, -33 }, // 0x25 '%' - { 466, 33, 34, 35, 2, -33 }, // 0x26 '&' - { 607, 7, 13, 13, 3, -33 }, // 0x27 ''' - { 619, 13, 41, 16, 2, -33 }, // 0x28 '(' - { 686, 13, 41, 16, 1, -33 }, // 0x29 ')' - { 753, 23, 22, 25, 1, -35 }, // 0x2A '*' - { 817, 23, 23, 27, 2, -27 }, // 0x2B '+' - { 884, 10, 11, 13, 1, -4 }, // 0x2C ',' - { 898, 13, 6, 15, 1, -15 }, // 0x2D '-' - { 908, 8, 8, 13, 3, -6 }, // 0x2E '.' - { 916, 19, 34, 20, 0, -33 }, // 0x2F '/' - { 997, 23, 34, 27, 2, -33 }, // 0x30 '0' - { 1095, 16, 34, 27, 3, -33 }, // 0x31 '1' - { 1163, 23, 34, 27, 2, -33 }, // 0x32 '2' - { 1261, 23, 34, 27, 2, -33 }, // 0x33 '3' - { 1359, 25, 34, 27, 1, -33 }, // 0x34 '4' - { 1466, 23, 34, 27, 2, -33 }, // 0x35 '5' - { 1564, 23, 34, 27, 2, -33 }, // 0x36 '6' - { 1662, 24, 34, 27, 1, -33 }, // 0x37 '7' - { 1764, 23, 34, 27, 2, -33 }, // 0x38 '8' - { 1862, 24, 34, 27, 1, -33 }, // 0x39 '9' - { 1964, 8, 27, 13, 3, -25 }, // 0x3A ':' - { 1991, 10, 32, 13, 1, -25 }, // 0x3B ';' - { 2031, 23, 24, 27, 2, -28 }, // 0x3C '<' - { 2100, 23, 14, 27, 2, -23 }, // 0x3D '=' - { 2141, 23, 24, 27, 2, -28 }, // 0x3E '>' - { 2210, 21, 35, 22, 0, -33 }, // 0x3F '?' - { 2302, 38, 38, 42, 2, -33 }, // 0x40 '@' - { 2483, 33, 34, 33, 0, -33 }, // 0x41 'A' - { 2624, 25, 34, 31, 4, -33 }, // 0x42 'B' - { 2731, 26, 34, 30, 3, -33 }, // 0x43 'C' - { 2842, 28, 34, 34, 4, -33 }, // 0x44 'D' - { 2961, 20, 34, 26, 4, -33 }, // 0x45 'E' - { 3046, 19, 34, 26, 4, -33 }, // 0x46 'F' - { 3127, 27, 34, 34, 3, -33 }, // 0x47 'G' - { 3242, 28, 34, 36, 4, -33 }, // 0x48 'H' - { 3361, 16, 34, 18, 1, -33 }, // 0x49 'I' - { 3429, 14, 44, 16, -3, -33 }, // 0x4A 'J' - { 3506, 27, 34, 31, 4, -33 }, // 0x4B 'K' - { 3621, 21, 34, 26, 4, -33 }, // 0x4C 'L' - { 3711, 36, 34, 44, 4, -33 }, // 0x4D 'M' - { 3864, 30, 34, 38, 4, -33 }, // 0x4E 'N' - { 3992, 32, 34, 37, 3, -33 }, // 0x4F 'O' - { 4128, 23, 34, 29, 4, -33 }, // 0x50 'P' - { 4226, 32, 42, 37, 3, -33 }, // 0x51 'Q' - { 4394, 27, 34, 31, 4, -33 }, // 0x52 'R' - { 4509, 22, 34, 26, 2, -33 }, // 0x53 'S' - { 4603, 25, 34, 27, 1, -33 }, // 0x54 'T' - { 4710, 28, 34, 36, 4, -33 }, // 0x55 'U' - { 4829, 31, 34, 31, 0, -33 }, // 0x56 'V' - { 4961, 45, 34, 45, 0, -33 }, // 0x57 'W' - { 5153, 31, 34, 31, 0, -33 }, // 0x58 'X' - { 5285, 29, 34, 29, 0, -33 }, // 0x59 'Y' - { 5409, 25, 34, 27, 1, -33 }, // 0x5A 'Z' - { 5516, 11, 41, 16, 3, -33 }, // 0x5B '[' - { 5573, 19, 34, 20, 0, -33 }, // 0x5C '\' - { 5654, 11, 41, 16, 1, -33 }, // 0x5D ']' - { 5711, 25, 22, 27, 1, -33 }, // 0x5E '^' - { 5780, 19, 3, 19, 0, 5 }, // 0x5F '_' - { 5788, 13, 8, 17, 2, -35 }, // 0x60 '`' - { 5801, 23, 26, 28, 2, -25 }, // 0x61 'a' - { 5876, 24, 36, 30, 3, -35 }, // 0x62 'b' - { 5984, 21, 26, 24, 2, -25 }, // 0x63 'c' - { 6053, 24, 36, 30, 2, -35 }, // 0x64 'd' - { 6161, 24, 26, 28, 2, -25 }, // 0x65 'e' - { 6239, 19, 36, 18, 1, -35 }, // 0x66 'f' - { 6325, 24, 37, 30, 2, -25 }, // 0x67 'g' - { 6436, 24, 36, 31, 3, -35 }, // 0x68 'h' - { 6544, 8, 36, 14, 3, -35 }, // 0x69 'i' - { 6580, 13, 47, 14, -2, -35 }, // 0x6A 'j' - { 6657, 25, 36, 29, 4, -35 }, // 0x6B 'k' - { 6770, 8, 36, 14, 3, -35 }, // 0x6C 'l' - { 6806, 39, 26, 46, 3, -25 }, // 0x6D 'm' - { 6933, 24, 26, 31, 3, -25 }, // 0x6E 'n' - { 7011, 25, 26, 29, 2, -25 }, // 0x6F 'o' - { 7093, 24, 37, 30, 3, -25 }, // 0x70 'p' - { 7204, 24, 37, 30, 2, -25 }, // 0x71 'q' - { 7315, 17, 26, 21, 3, -25 }, // 0x72 'r' - { 7371, 20, 26, 24, 2, -25 }, // 0x73 's' - { 7436, 18, 31, 20, 1, -30 }, // 0x74 't' - { 7506, 24, 26, 31, 3, -25 }, // 0x75 'u' - { 7584, 27, 26, 27, 0, -25 }, // 0x76 'v' - { 7672, 40, 26, 40, 0, -25 }, // 0x77 'w' - { 7802, 27, 26, 27, 0, -25 }, // 0x78 'x' - { 7890, 27, 37, 27, 0, -25 }, // 0x79 'y' - { 8015, 21, 26, 23, 1, -25 }, // 0x7A 'z' - { 8084, 16, 41, 19, 1, -33 }, // 0x7B '{' - { 8166, 5, 47, 26, 10, -35 }, // 0x7C '|' - { 8196, 16, 41, 19, 2, -33 }, // 0x7D '}' - { 8278, 23, 7, 27, 2, -19 } }; // 0x7E '~' - -const GFXfont NotoSans_Bold24pt7b PROGMEM = { - (uint8_t *)NotoSans_Bold24pt7bBitmaps, - (GFXglyph *)NotoSans_Bold24pt7bGlyphs, - 0x20, 0x7E, 64 }; - -// Approx. 8971 bytes - -#endif // NOTOSANSBOLD24PT7B_H diff --git a/examples/companion_radio/ui-orig/UITask.cpp b/examples/companion_radio/ui-orig/UITask.cpp index 5fcd6f3c..cf346ad8 100644 --- a/examples/companion_radio/ui-orig/UITask.cpp +++ b/examples/companion_radio/ui-orig/UITask.cpp @@ -1317,7 +1317,7 @@ if (curr) curr->poll(); if (_low_batt_count >= 3) { // 3 consecutive low readings (~24s) to avoid transient sags // show low battery shutdown alert on e-ink (persists after power loss) - #if defined(THINKNODE_M1) || defined(LILYGO_TECHO) || defined(LilyGo_TDeck_Pro) + #if defined(LilyGo_TDeck_Pro) if (_display != NULL) { _display->startFrame(); _display->setTextSize(2); diff --git a/examples/simple_repeater/MyMesh.cpp b/examples/simple_repeater/MyMesh.cpp index ac20a5b8..eaf1962f 100644 --- a/examples/simple_repeater/MyMesh.cpp +++ b/examples/simple_repeater/MyMesh.cpp @@ -374,7 +374,7 @@ mesh::Packet *MyMesh::createSelfAdvert() { } File MyMesh::openAppend(const char *fname) { -#if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM) +#if defined(STM32_PLATFORM) return _fs->open(fname, FILE_O_WRITE); #elif defined(RP2040_PLATFORM) return _fs->open(fname, "a"); @@ -889,7 +889,7 @@ void MyMesh::applyTempRadioParams(float freq, float bw, uint8_t sf, uint8_t cr, } bool MyMesh::formatFileSystem() { -#if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM) +#if defined(STM32_PLATFORM) return InternalFS.format(); #elif defined(RP2040_PLATFORM) return LittleFS.format(); @@ -1015,7 +1015,7 @@ void MyMesh::formatPacketStatsReply(char *reply) { } void MyMesh::saveIdentity(const mesh::LocalIdentity &new_id) { -#if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM) +#if defined(STM32_PLATFORM) IdentityStore store(*_fs, ""); #elif defined(ESP32) IdentityStore store(*_fs, "/identity"); diff --git a/examples/simple_repeater/MyMesh.h b/examples/simple_repeater/MyMesh.h index e0e590c3..25d332a1 100644 --- a/examples/simple_repeater/MyMesh.h +++ b/examples/simple_repeater/MyMesh.h @@ -5,7 +5,7 @@ #include #include -#if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM) +#if defined(STM32_PLATFORM) #include #elif defined(RP2040_PLATFORM) #include diff --git a/examples/simple_repeater/main.cpp b/examples/simple_repeater/main.cpp index e8a87733..7f82f625 100644 --- a/examples/simple_repeater/main.cpp +++ b/examples/simple_repeater/main.cpp @@ -64,7 +64,7 @@ void setup() { fast_rng.begin(radio_get_rng_seed()); FILESYSTEM* fs; -#if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM) +#if defined(STM32_PLATFORM) InternalFS.begin(); fs = &InternalFS; IdentityStore store(InternalFS, ""); @@ -102,7 +102,6 @@ void setup() { // --------------------------------------------------------------------------- // SD card init — needed for MQTT config on devices with SD slots. // T-Deck Pro: SD shares display SPI bus (HSPI via displaySpi) - // T5S3: SD shares LoRa SPI bus (SCK=14, MOSI=13, MISO=21) // Heltec V4 and others without SD: config lives in SPIFFS (already init'd) // --------------------------------------------------------------------------- #if (defined(HAS_4G_MODEM) || defined(MECK_WIFI_REMOTE)) && (defined(HAS_SDCARD) || defined(SDCARD_CS)) @@ -123,12 +122,7 @@ void setup() { delay(100); for (int i = 0; i < 3; i++) { - #if defined(LilyGo_T5S3_EPaper_Pro) - // T5S3: SD shares LoRa SPI bus — create local HSPI reference - static SPIClass sdSpi(HSPI); - sdSpi.begin(P_LORA_SCLK, P_LORA_MISO, P_LORA_MOSI, SDCARD_CS); - if (SD.begin(SDCARD_CS, sdSpi, 4000000)) { sdCardReady = true; break; } - #elif defined(SDCARD_CS) + #if defined(SDCARD_CS) extern SPIClass displaySpi; if (SD.begin(SDCARD_CS, displaySpi)) { sdCardReady = true; break; } #else diff --git a/examples/simple_room_server/MyMesh.cpp b/examples/simple_room_server/MyMesh.cpp index bb62e618..5db5ad76 100644 --- a/examples/simple_room_server/MyMesh.cpp +++ b/examples/simple_room_server/MyMesh.cpp @@ -120,9 +120,7 @@ mesh::Packet *MyMesh::createSelfAdvert() { } File MyMesh::openAppend(const char *fname) { -#if defined(NRF52_PLATFORM) - return _fs->open(fname, FILE_O_WRITE); -#elif defined(RP2040_PLATFORM) +#if defined(RP2040_PLATFORM) return _fs->open(fname, "a"); #else return _fs->open(fname, "a", true); @@ -663,9 +661,7 @@ void MyMesh::applyTempRadioParams(float freq, float bw, uint8_t sf, uint8_t cr, } bool MyMesh::formatFileSystem() { -#if defined(NRF52_PLATFORM) - return InternalFS.format(); -#elif defined(RP2040_PLATFORM) +#if defined(RP2040_PLATFORM) return LittleFS.format(); #elif defined(ESP32) return SPIFFS.format(); @@ -720,7 +716,7 @@ void MyMesh::setTxPower(uint8_t power_dbm) { } void MyMesh::saveIdentity(const mesh::LocalIdentity &new_id) { -#if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM) +#if defined(STM32_PLATFORM) IdentityStore store(*_fs, ""); #elif defined(ESP32) IdentityStore store(*_fs, "/identity"); diff --git a/examples/simple_room_server/MyMesh.h b/examples/simple_room_server/MyMesh.h index f6adf01e..247b5bfb 100644 --- a/examples/simple_room_server/MyMesh.h +++ b/examples/simple_room_server/MyMesh.h @@ -3,9 +3,7 @@ #include // needed for PlatformIO #include -#if defined(NRF52_PLATFORM) - #include -#elif defined(RP2040_PLATFORM) +#if defined(RP2040_PLATFORM) #include #elif defined(ESP32) #include diff --git a/examples/simple_room_server/main.cpp b/examples/simple_room_server/main.cpp index 1a3b4d6e..57f51e77 100644 --- a/examples/simple_room_server/main.cpp +++ b/examples/simple_room_server/main.cpp @@ -38,11 +38,7 @@ void setup() { fast_rng.begin(radio_get_rng_seed()); FILESYSTEM* fs; -#if defined(NRF52_PLATFORM) - InternalFS.begin(); - fs = &InternalFS; - IdentityStore store(InternalFS, ""); -#elif defined(RP2040_PLATFORM) +#if defined(RP2040_PLATFORM) LittleFS.begin(); fs = &LittleFS; IdentityStore store(LittleFS, "/identity"); diff --git a/examples/simple_secure_chat/main.cpp b/examples/simple_secure_chat/main.cpp index da1bac5b..1b036d63 100644 --- a/examples/simple_secure_chat/main.cpp +++ b/examples/simple_secure_chat/main.cpp @@ -1,9 +1,7 @@ #include // needed for PlatformIO #include -#if defined(NRF52_PLATFORM) - #include -#elif defined(RP2040_PLATFORM) +#if defined(RP2040_PLATFORM) #include #elif defined(ESP32) #include @@ -126,10 +124,7 @@ class MyMesh : public BaseChatMesh, ContactVisitor { } void saveContacts() { -#if defined(NRF52_PLATFORM) - _fs->remove("/contacts"); - File file = _fs->open("/contacts", FILE_O_WRITE); -#elif defined(RP2040_PLATFORM) +#if defined(RP2040_PLATFORM) File file = _fs->open("/contacts", "w"); #else File file = _fs->open("/contacts", "w", true); @@ -297,9 +292,7 @@ public: BaseChatMesh::begin(); - #if defined(NRF52_PLATFORM) - IdentityStore store(fs, ""); - #elif defined(RP2040_PLATFORM) + #if defined(RP2040_PLATFORM) IdentityStore store(fs, "/identity"); store.begin(); #else @@ -340,10 +333,7 @@ public: } void savePrefs() { -#if defined(NRF52_PLATFORM) - _fs->remove("/node_prefs"); - File file = _fs->open("/node_prefs", FILE_O_WRITE); -#elif defined(RP2040_PLATFORM) +#if defined(RP2040_PLATFORM) File file = _fs->open("/node_prefs", "w"); #else File file = _fs->open("/node_prefs", "w", true); @@ -563,10 +553,7 @@ void setup() { fast_rng.begin(radio_get_rng_seed()); -#if defined(NRF52_PLATFORM) - InternalFS.begin(); - the_mesh.begin(InternalFS); -#elif defined(RP2040_PLATFORM) +#if defined(RP2040_PLATFORM) LittleFS.begin(); the_mesh.begin(LittleFS); #elif defined(ESP32) diff --git a/examples/simple_sensor/SensorMesh.cpp b/examples/simple_sensor/SensorMesh.cpp index 201532b9..2895d88c 100644 --- a/examples/simple_sensor/SensorMesh.cpp +++ b/examples/simple_sensor/SensorMesh.cpp @@ -64,7 +64,7 @@ #define ALERT_ACK_EXPIRY_MILLIS 8000 // wait 8 secs for ACKs to alert messages static File openAppend(FILESYSTEM* _fs, const char* fname) { - #if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM) + #if defined(STM32_PLATFORM) return _fs->open(fname, FILE_O_WRITE); #elif defined(RP2040_PLATFORM) return _fs->open(fname, "a"); @@ -752,7 +752,7 @@ void SensorMesh::begin(FILESYSTEM* fs) { } bool SensorMesh::formatFileSystem() { -#if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM) +#if defined(STM32_PLATFORM) return InternalFS.format(); #elif defined(RP2040_PLATFORM) return LittleFS.format(); @@ -765,7 +765,7 @@ bool SensorMesh::formatFileSystem() { } void SensorMesh::saveIdentity(const mesh::LocalIdentity& new_id) { -#if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM) +#if defined(STM32_PLATFORM) IdentityStore store(*_fs, ""); #elif defined(ESP32) IdentityStore store(*_fs, "/identity"); diff --git a/examples/simple_sensor/SensorMesh.h b/examples/simple_sensor/SensorMesh.h index 6046a1df..f26e04fb 100644 --- a/examples/simple_sensor/SensorMesh.h +++ b/examples/simple_sensor/SensorMesh.h @@ -5,7 +5,7 @@ #include "TimeSeriesData.h" -#if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM) +#if defined(STM32_PLATFORM) #include #elif defined(RP2040_PLATFORM) #include diff --git a/examples/simple_sensor/main.cpp b/examples/simple_sensor/main.cpp index a5fcc148..8d29c0bc 100644 --- a/examples/simple_sensor/main.cpp +++ b/examples/simple_sensor/main.cpp @@ -71,7 +71,7 @@ void setup() { fast_rng.begin(radio_get_rng_seed()); FILESYSTEM* fs; -#if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM) +#if defined(STM32_PLATFORM) InternalFS.begin(); fs = &InternalFS; IdentityStore store(InternalFS, ""); diff --git a/include/README b/include/README index 8377c142..29ab5a3b 100644 --- a/include/README +++ b/include/README @@ -1,6 +1,6 @@ ## Meshcore + Fork = Meck -A fork created specifically to focus on enabling BLE & WiFi companion firmware for the LilyGo T-Deck Pro, LilyGo T-Deck Max & LilyGo T5 E-Paper S3 Pro. Created wholly with Claude AI using Meshcore v1.11 code. 100% vibecoded. +A fork created specifically to focus on enabling BLE & WiFi companion firmware for the LilyGo T-Deck Pro & LilyGo T-Deck Max. Created wholly with Claude AI using Meshcore v1.11 code. 100% vibecoded. [Check out the Meck discussion channel on the MeshCore Discord](https://discord.com/channels/1495203904898728149/1496789639556501614) @@ -60,17 +60,6 @@ A fork created specifically to focus on enabling BLE & WiFi companion firmware f - [Multi-Constellation GPS](#multi-constellation-gps) - [Remote Repeater (T-Deck Pro 4G)](#remote-repeater-t-deck-pro-4g) - [WiFi Repeater](#wifi-repeater) -- [T5S3 E-Paper Pro](#t5s3-e-paper-pro) - - [Build Variants](#t5s3-build-variants) - - [Touch Navigation](#touch-navigation) - - [Home Screen](#t5s3-home-screen) - - [Boot Button Controls](#boot-button-controls) - - [Backlight](#backlight) - - [Lock Screen](#lock-screen) - - [Virtual Keyboard](#virtual-keyboard) - - [Display Settings](#display-settings) - - [Clock & RTC](#clock--rtc) - - [Touch Gestures by Screen](#touch-gestures-by-screen) - [Serial Settings (USB)](Serial_Settings_Guide.md) - [Text & EPUB Reader](TXT___EPUB_Reader_Guide.md) - [Web Browser & IRC Guide](Web_App_Guide.md) @@ -100,11 +89,10 @@ Meck currently targets three LilyGo devices and also supports the Heltec V3 and |--------|---------|-------|------|---------|-----|-----| | **T-Deck Pro** | 240×320 e-ink (GxEPD2) | TCA8418 keyboard + optional touch | SX1262 | BQ27220 fuel gauge, 1400 mAh | Yes | No (uses GPS time) | | **T-Deck Max** | 240×320 e-ink (GxEPD2) + frontlight | TCA8418 keyboard + CST328 capacitive touch + 3 capacitive buttons | SX1262 | BQ27220 fuel gauge, 1500 mAh | Yes (multi-constellation) | No (uses GPS time) | -| **T5S3 E-Paper Pro** (V2, H752-B) | 960×540 e-ink (FastEPD, parallel) | GT911 capacitive touch (no keyboard) | SX1262 | BQ27220 fuel gauge, 1500 mAh | No (non-GPS variant) | Yes (PCF8563 hardware RTC) | | **Heltec V3** (remote repeater only) | 0.96" OLED (SSD1306) | — | SX1262 | — | No | No | | **Heltec V4** (remote repeater only) | 0.96" OLED (SSD1306) | — | SX1262 | — | No | No | -The T-Deck Pro, T-Deck Max, and T5S3 use the ESP32-S3 with 16 MB flash and 8 MB PSRAM. The Heltec V3 and V4 use the ESP32-S3 with 8 MB flash and 8 MB PSRAM. +The T-Deck Pro and T-Deck Max use the ESP32-S3 with 16 MB flash and 8 MB PSRAM. The Heltec V3 and V4 use the ESP32-S3 with 8 MB flash and 8 MB PSRAM. --- @@ -112,7 +100,7 @@ The T-Deck Pro, T-Deck Max, and T5S3 use the ESP32-S3 with 16 MB flash and 8 MB **An SD card is essential for Meck to function properly.** Many features — including the e-book reader, notes, bookmarks, web reader cache, audiobook playback, firmware updates, contact import/export, and WiFi credential storage — rely on files stored on the SD card. Without an SD card inserted, the device will boot and handle mesh messaging, but most extended features will be unavailable or will fail silently. -**Recommended:** A **32 GB or larger** microSD card formatted as **FAT32**. Meck's extensive feature set — audiobooks, e-books, voice recordings, contact exports, alarm sounds, web reader cache, notes, and firmware images — can accumulate significant storage over time, so a larger card is worthwhile. MeshCore users have found that **SanDisk** microSD cards are the most reliable across both the T-Deck Pro and T5S3. +**Recommended:** A **32 GB or larger** microSD card formatted as **FAT32**. Meck's extensive feature set — audiobooks, e-books, voice recordings, contact exports, alarm sounds, web reader cache, notes, and firmware images — can accumulate significant storage over time, so a larger card is worthwhile. MeshCore users have found that **SanDisk** microSD cards are the most reliable on the T-Deck Pro. --- @@ -133,7 +121,7 @@ If the device has never had Meck firmware (or you want a clean start), use the * ``` esptool.py --chip esp32s3 --port /dev/ttyACM0 --baud 921600 \ - write_flash 0x0 meck_t5s3_standalone-merged.bin + write_flash 0x0 meck_max_standalone-merged.bin ``` On macOS the port is typically `/dev/cu.usbmodem*`. On Windows it will be a COM port like `COM3`. @@ -155,7 +143,7 @@ If the device is already running Meck (or any MeshCore-based firmware with a val ``` esptool.py --chip esp32s3 --port /dev/ttyACM0 --baud 921600 \ - write_flash 0x10000 meck_t5s3_standalone.bin + write_flash 0x10000 meck_max_standalone.bin ``` > **Tip:** If you're unsure whether the device already has a bootloader, it's always safe to use the merged file and flash at `0x0` — it will overwrite everything cleanly. @@ -171,7 +159,7 @@ If you're loading firmware from an SD card via the LilyGo Launcher firmware, use Once Meck is installed, you can update firmware directly from your phone — no computer or serial cable required. The device creates a temporary WiFi access point and you upload the new `.bin` via your phone's browser. 1. Download the new **non-merged** `.bin` to your phone (from GitHub Releases, Discord, etc.) -2. On the device: **Settings → OTA Tools → Firmware Update → Enter** (T-Deck Pro) or **tap** (T5S3) +2. On the device: **Settings → OTA Tools → Firmware Update → Enter** (T-Deck Pro) 3. The device starts a WiFi network called `Meck-Update-XXXX` and displays connection details 4. On your phone: connect to the `Meck-Update` WiFi network, open a browser, go to `192.168.4.1` 5. Tap **Choose File**, select the `.bin`, tap **Upload** @@ -189,7 +177,7 @@ The partition layout supports dual OTA slots — the old firmware remains on the Meck supports multibyte path hash, bringing it in line with MeshCore firmware v1.14. The path hash controls how many bytes each repeater uses to identify itself in forwarded flood packets. Larger hashes reduce the chance of identity collisions at the cost of fewer maximum hops per packet. -You can configure the path hash size in the device settings (press **S** from the home screen on T-Deck Pro, or open Settings via the tile on T5S3) or set it via USB serial: +You can configure the path hash size in the device settings (press **S** from the home screen on T-Deck Pro) or set it via USB serial: ``` set path.hash.mode 1 @@ -335,8 +323,6 @@ Pressing **M** from the home screen opens the channel picker. All your channels Pressing **X** on any highlighted channel brings up a confirmation overlay. Press **Enter** to confirm deletion or **Q** to cancel. This clears all stored messages for that channel from the circular buffer and saves to SD. The channel itself is not removed -- only its message history. -On the T5S3, swiping left or right on the channel messages screen also opens the channel picker, which displays a **vertical bubble list** matching the Meck P4 aesthetic. Long-press a channel to bring up the delete history confirmation. - ### Contacts Screen Press **C** from the home screen to open the contacts list. All known mesh contacts are shown sorted by most recently heard, with their type prefix, estimated hop count, and time since last advert. @@ -457,7 +443,7 @@ Command responses are displayed in a scrollable view. Use **W / S** to scroll lo The trace route screen lets you build a chain of repeaters and run a trace through them — the same feature available in the MeshCore companion app, but on-device. Each repeater in the chain that recognises its hash appends its receive SNR before forwarding the packet, giving you per-hop signal quality data for the whole route. -Press **R** from the home screen to open the trace screen. T5S3 users with a CardKB attached can use **R** as well. +Press **R** from the home screen to open the trace screen. **Building the path** @@ -526,8 +512,6 @@ You can clear all stored messages for any individual channel or the DM inbox wit From the home screen, press **M** to open the channel picker. Navigate to the channel you want to clear and press **X**. A confirmation overlay appears asking "Delete message history?" -- press **Enter** to confirm or **Q** to cancel. -On the T5S3, long-press the channel in the channel picker to bring up the same confirmation. Tap to confirm or press the Boot button to cancel. - Messages are invalidated in the circular buffer and the change is saved to SD immediately. The unread counter is also reset. New messages will continue to appear as they arrive. ### Per-Channel Notification Preferences (v1.10+) @@ -611,8 +595,6 @@ You can share any channel — public or private — with another Meck user by se The recipient's device automatically adds the channel to their channel list (if it doesn't already exist and there's an empty slot). An alert confirms the channel was added. In the DM conversation, both sender and recipient see a sanitised message ("Shared channel: name") rather than the raw protocol data. -On the T5S3, channel sharing works the same way via the CardKB keyboard. - ### Config Export/Import (v1.11+) The **Export/Import >>** sub-screen in Settings lets you back up and restore your device configuration via JSON files on the SD card. This is useful for migrating settings to a new board, keeping a backup before reflashing, or cloning a configuration across multiple devices. @@ -964,14 +946,13 @@ The WiFi repeater variants turn a device into a dedicated MeshCore repeater with | Variant | Environment | Platform | |---------|------------|----------| | T-Deck Pro WiFi Repeater | `meck_wifi_repeater` | LilyGo T-Deck Pro | -| T5S3 WiFi Repeater | `meck_wifi_repeater_t5s3` | LilyGo T5S3 E-Paper Pro | | Heltec V3 WiFi Repeater | `meck_wifi_repeater_heltec_v3` | Heltec V3 | | Heltec V4 WiFi Repeater | `meck_wifi_repeater_heltec_v4` | Heltec V4 | | Heltec V4 WiFi Repeater (headless) | `meck_wifi_repeater_heltec_v4_headless` | Heltec V4 (no display) | **Sections to write:** -- **Requirements** — device, WiFi network, MQTT broker account, SD card (T-Deck Pro / T5S3) or SPIFFS config (Heltec V4) +- **Requirements** — device, WiFi network, MQTT broker account, SD card (T-Deck Pro) or SPIFFS config (Heltec V4) - **SD card configuration** — `/remote/wifi.cfg` (supports multiple SSIDs) and `/remote/mqtt.cfg` - **Heltec V4 specifics** — no SD card slot, config stored in SPIFFS, headless vs display variant - **OTA updates** — NTP time sync, HTTP firmware download over WiFi @@ -979,270 +960,6 @@ The WiFi repeater variants turn a device into a dedicated MeshCore repeater with --- -## T5S3 E-Paper Pro - -The LilyGo T5S3 E-Paper Pro (V2, H752-B) is a 4.7-inch e-ink device with capacitive touch and no physical keyboard. All navigation is done via touch gestures and the Boot button (GPIO0). The larger 960×540 display provides significantly more screen real estate than the T-Deck Pro's 240×320 panel. - -### T5S3 Build Variants - -| Variant | Environment | BLE | WiFi | Web Reader | Max Contacts | -|---------|------------|-----|------|------------|-------------| -| Standalone | `meck_t5s3_standalone` | — | — | No | 2,000 | -| BLE Companion | `meck_t5s3_ble` | Yes | — | No | 2,000 | -| WiFi Companion | `meck_t5s3_wifi` | — | Yes (TCP:5000) | Yes | 2,000 | -| WiFi Repeater | `meck_wifi_repeater_t5s3` | — | Yes (MQTT) | No | — | - -The WiFi variant connects to the MeshCore web app or meshcore.js over your local network. The web reader shares the same WiFi connection — no extra setup needed. The WiFi Repeater variant is a dedicated remote repeater — see [WiFi Repeater](#wifi-repeater) for details on MQTT-based admin management. - -### Touch Navigation - -The T5S3 uses a combination of touch gestures and the Boot button for all interaction. There is no physical keyboard — text entry uses an on-screen virtual keyboard that appears when needed. - -**Core gesture types:** - -| Gesture | Description | -|---------|-------------| -| **Tap** | Touch and release quickly. Context-dependent: opens tiles on home screen, selects items in lists, advances pages in readers. | -| **Swipe** | Touch, drag at least 60 pixels, and release. Direction determines action (scroll, page turn, switch channel/filter). | -| **Long press (touch)** | Touch and hold for 500ms+. Context-dependent: compose messages, open DMs, delete bookmarks. | - -### T5S3 Home Screen - -The home screen displays a grid of tappable tiles across three rows: - -| | Column 1 | Column 2 | Column 3 | -|---|----------|----------|----------| -| **Row 1** | Messages | Contacts | Settings | -| **Row 2** | Reader | Notes | Browser (WiFi) / Discover (other) | -| **Row 3** | Trace | Games | | - -Tap a tile to open that screen. Tap outside the tile grid (or swipe left/right) to cycle between home pages. The additional home pages show BLE status, battery info, GPS status, and a hibernate option — same as the T-Deck Pro but navigated by swiping or tapping the left/right halves of the screen instead of pressing keys. - -### Boot Button Controls - -The Boot button (GPIO0, bottom of device) provides essential navigation and utility functions: - -| Action | Effect | -|--------|--------| -| **Single click** | On home screen: cycle to next page. On other screens: go back (same as pressing Q on T-Deck Pro). In text reader reading mode: close book and return to file list. | -| **Double-click** | Toggle backlight at full brightness (comfortable for indoor reading). | -| **Triple-click** | Toggle backlight at low brightness (dim nighttime reading). | -| **Long press** | Lock or unlock the screen. While locked, touch is disabled and a lock screen shows the time, battery percentage, and unread message count. | -| **Long press during first 8 seconds after boot** | Enter CLI rescue mode (serial settings interface). | - -### Backlight - -The T5S3 has a warm-tone front-light controlled by PWM on GPIO11. Brightness ranges from 0 (off) to 255 (maximum). - -- **Double-click Boot button** — toggle backlight on at 153/255 brightness (comfortable reading level) -- **Triple-click Boot button** — toggle backlight on at low brightness (4/255, nighttime reading) -- The backlight turns off automatically when the screen locks - -### Lock Screen - -Long press the Boot button to lock the device. The lock screen shows: -- Current time in large text (HH:MM) -- Battery percentage -- Unread message count (if any) -- "Hold button to unlock" hint - -Touch input is completely disabled while locked. Long press the Boot button again to unlock and return to whatever screen you were on. - -An auto-lock timer can be configured in **Settings → Auto Lock** (None / 2 / 5 / 10 / 15 / 30 minutes of idle time). The CPU drops to 40 MHz while locked to reduce power consumption. - -### Virtual Keyboard - -Since the T5S3 has no physical keyboard, a full-screen QWERTY virtual keyboard appears automatically when text input is needed (composing messages, entering WiFi passwords, editing settings, etc.). - -The virtual keyboard supports: -- QWERTY letter layout with a symbol/number layer (tap the **123** key to switch) -- Shift toggle for uppercase -- Backspace (UTF-8 aware — correctly deletes multi-byte emoji) and Enter keys -- **Emoji picker** — tap the **$** key to open a scrollable 8-column grid of 79 emoji sprites with page indicators. Tap an emoji to insert it inline in your message. Tap **Back** to return to the keyboard. Faces and emotions are grouped first for quick access. -- Inline emoji rendering — emoji appear as pixel sprites in the text field as you type -- Phantom keystroke prevention (a brief cooldown after the keyboard opens prevents accidental taps) - -Tap keys to type. Tap **Enter** to submit, or press the **Boot button** to cancel and close the keyboard. - -### External Keyboard (CardKB) - -The T5S3 supports the M5Stack CardKB (or compatible I2C keyboard) connected via the QWIIC port. When detected at boot, the CardKB can be used for all text input — composing messages, entering URLs, editing notes, and navigating menus — without the on-screen virtual keyboard. - -The CardKB is auto-detected on the I2C bus at address `0x5F`. No configuration is needed — just plug it in. - -### Display Settings - -The T5S3 Settings screen includes display options shared with the T-Deck Pro, plus one T5S3-specific setting: - -| Setting | Description | -|---------|-------------| -| **Dark Mode** | Inverts the display — white text on black background. Tap to toggle on/off. Available on both T-Deck Pro and T5S3. | -| **Larger Font** | Increases text size on channel messages, contacts, DM inbox, and repeater admin screens. Tap to toggle on/off. Available on both T-Deck Pro and T5S3. | -| **Font Style** | Choose between Classic (FreeSans), Noto Sans, or Montserrat. Swipe left/right to cycle, tap to apply. Available on both T-Deck Pro and T5S3. | -| **Portrait Mode** | Rotates the display 90° from landscape (960×540) to portrait (540×960). Touch coordinates are automatically remapped. Text reader layout recalculates on orientation change. T5S3 only. | - -These settings are persisted and survive reboots. - -### Clock & RTC - -Unlike the T-Deck Pro (which relies on GPS for time), the T5S3 has a hardware RTC (PCF8563/BM8563) that maintains time across reboots as long as the battery has charge. On first use (or after a full battery drain), the clock needs to be set via USB serial: - -``` -clock sync 1773554535 -``` - -Where the number is a Unix epoch timestamp. Quick one-liner from a macOS/Linux terminal: - -``` -echo "clock sync $(date +%s)" > /dev/ttyACM0 -``` - -Once set, the RTC retains the time across reboots. See the [Serial Settings Guide](Serial_Settings_Guide.md) for full clock sync documentation including the PlatformIO auto-sync feature. - -The UTC offset is configured in the Settings screen (same as T-Deck Pro) and is persisted to flash. - -### Touch Gestures by Screen - -#### Home Screen - -| Gesture | Action | -|---------|--------| -| Tap tile | Open that screen (Messages, Contacts, Settings, Reader, Notes, Browser/Discover) | -| Tap outside tiles (left half) | Previous home page | -| Tap outside tiles (right half) | Next home page | -| Swipe left / right | Next / previous home page | -| Long press (touch) | Activate current page action (toggle BLE, hibernate, etc.) | - -#### Channel Messages - -| Gesture | Action | -|---------|--------| -| Swipe up / down | Scroll messages | -| Swipe left / right | Open channel picker — shows all channels and DM inbox in a vertical bubble list with unread badges. Tap to select. | -| Tap footer area | View relay path of last received message | -| Tap path overlay | Dismiss overlay | -| Long press (touch) | Open virtual keyboard to compose message to current channel | - -#### Contacts - -The contacts list shows all known nodes sorted by most recently heard, with type prefix, estimated hop count, and time since last advert. See the [T-Deck Pro Contacts Screen](#contacts-screen) section for an explanation of the type prefix and hop count display — the same conventions apply on the T5S3. - -**Normal mode** - -| Gesture | Action | -|---------|--------| -| Swipe up / down | Scroll through contacts | -| Swipe left / right | Cycle contact filter (All → Chat → Rptr → Room → Sens → Fav) | -| Tap | Enter select mode (tapped contact is pre-selected) | -| Long press on Chat contact | View unread DMs (if any), then compose DM | -| Long press on Repeater/RS contact | Open repeater admin login | - -> **Note:** The **Fav** filter shows only contacts you have marked as favourites. If it appears empty, no contacts have been favourited yet — use select mode (tap a contact) and then long-press to mark favourites. - -**Select mode** — tap any contact row to enter select mode. The tapped contact is pre-selected (shown with `*`). Swipe or tap to navigate and toggle selections. You can also use a **two-finger tap** anywhere on the contacts screen to toggle select mode on and off. - -| Gesture | Action | -|---------|--------| -| Tap | Toggle selection on tapped row | -| Swipe left | Select all contacts in current filter | -| Swipe right | Deselect all | -| Two-finger tap | Toggle select mode on/off | -| Long press | Exit select mode (confirm favourites / deletions first) | - -Batch operations (favourite toggle, delete) are triggered from the overlay that appears after exiting select mode with contacts selected. - -**Adding contacts** - -1. **Automatic** — if Settings → Contacts → Add Mode is set to *Auto All*, nodes are added as their adverts are heard. *Custom* mode adds only nodes matching the enabled type toggles (Companion, Repeater, Room Server, Sensor). *Manual Only* disables auto-add. - -2. **From the Last Heard screen** — tap the **Discover** tile (or access via the home page on non-WiFi builds) and navigate to Last Heard. Tap any entry to add it to contacts, or tap an existing contact to remove it (favourites require a second tap within 3 seconds to confirm). Entries show `[+]` if already in contacts, `[★]` if a favourite. - - > **Note:** The Last Heard list holds up to 1,000 entries in PSRAM, and advert data is stored persistently on the SD card — so contacts can be added long after the original advertisement was received, even across reboots. This makes Last Heard especially useful when auto-add is set to *Manual Only*, as it provides a passive catalogue of every node heard on the network. - -3. **From the Discovery screen** — tap the Discover tile and run an active scan. Tap any result to add it to contacts. - -**Deleting contacts** - -Tap a contact to enter select mode, select the contacts to remove, exit select mode, and choose delete from the confirmation overlay. - -#### Text Reader (File List) - -| Gesture | Action | -|---------|--------| -| Swipe up / down | Scroll file list | -| Tap | Open selected book | - -#### Text Reader (Reading) - -| Gesture | Action | -|---------|--------| -| Tap anywhere | Next page | -| Tap footer bar | Go to page number (via virtual keyboard) | -| Swipe left | Next page | -| Swipe right | Previous page | -| Swipe up / down | Next / previous page | -| Long press (touch) | Close book, return to file list | -| Tap status bar | Go to home screen | - -#### Web Reader (WiFi variant) - -| Gesture | Action | -|---------|--------| -| Tap URL bar | Open virtual keyboard for URL entry | -| Tap Search | Open virtual keyboard for DuckDuckGo search | -| Tap reading area | Next page | -| Tap footer (if links exist) | Open virtual keyboard to enter link number | -| Swipe left / right (reading) | Next / previous page | -| Swipe up / down (home/lists) | Scroll list | -| Long press (reading) | Navigate back | -| Long press on bookmark | Delete bookmark | -| Long press on home | Exit web reader | - -#### Settings - -| Gesture | Action | -|---------|--------| -| Swipe up / down | Scroll through settings | -| Swipe left / right | Adjust value (same as A/D keys on T-Deck Pro) | -| Tap | Toggle or edit selected setting | - -#### Notes - -| Gesture | Action | -|---------|--------| -| Tap (while editing) | Open virtual keyboard for text entry | -| Long press (while editing) | Save note and exit editor | - -#### Discovery - -| Gesture | Action | -|---------|--------| -| Swipe up / down | Scroll node list | -| Tap | Add selected node to contacts | -| Long press | Rescan for nodes | - -#### Last Heard - -| Gesture | Action | -|---------|--------| -| Swipe up / down | Scroll advert list | -| Tap | Add to or delete from contacts | - -#### Repeater Admin - -| Gesture | Action | -|---------|--------| -| Swipe up / down | Scroll menu / response | -| Long press (password entry) | Open virtual keyboard for admin password | - -#### All Screens - -| Gesture | Action | -|---------|--------| -| Tap status bar (top of screen) | Return to home screen (except in text reader reading mode, where it advances the page) | - ---- - ## Meck-Mycelium Web App The [Meck-Mycelium web app](https://pelgraine.github.io/Meck-Mycelium) is a browser-based companion that connects to your MeshCore device via BLE (using WebBLE in Chrome) or to your MQTT broker for remote repeater management. @@ -1304,9 +1021,9 @@ For developers: **Companion Firmware** -The companion firmware can be connected to via BLE (T-Deck Pro and T5S3 BLE variants) or WiFi (T-Deck Pro WiFi variants and T5S3 WiFi variant, TCP port 5000). +The companion firmware can be connected to via BLE (T-Deck Pro BLE variants) or WiFi (T-Deck Pro WiFi variants, TCP port 5000). -> **Note:** On both the T-Deck Pro and T5S3, BLE and WiFi are disabled by default at boot. On the T-Deck Pro, navigate to the Bluetooth or WiFi home page and press Enter to enable. On the T5S3, navigate to the Bluetooth home page and long-press the screen to toggle BLE on. +> **Note:** On the T-Deck Pro, BLE and WiFi are disabled by default at boot. On the T-Deck Pro, navigate to the Bluetooth or WiFi home page and press Enter to enable. - Web: https://app.meshcore.nz - Meck-Mycelium: https://pelgraine.github.io/Meck-Mycelium (voice playback, remote repeater dashboard) @@ -1317,7 +1034,7 @@ The companion firmware can be connected to via BLE (T-Deck Pro and T5S3 BLE vari ## 🛠 Hardware Compatibility -MeshCore is designed for devices listed in the [MeshCore Flasher](https://flasher.meshcore.io). Meck specifically targets the LilyGo T-Deck Pro, LilyGo T-Deck Max, LilyGo T5S3 E-Paper Pro, Heltec V3 (remote repeater only), and Heltec V4 (remote repeater only). +MeshCore is designed for devices listed in the [MeshCore Flasher](https://flasher.meshcore.io). Meck specifically targets the LilyGo T-Deck Pro, LilyGo T-Deck Max, Heltec V3 (remote repeater only), and Heltec V4 (remote repeater only). ## Contributing @@ -1405,38 +1122,6 @@ There are a number of fairly major features in the pipeline, with no particular - [X] Voice-note recording on MAX (ES8311 ADC capture path) - [ ] BHI260AP gyroscope / IMU support (0x28) -- new on the MAX, not yet used by Meck -**T5S3 E-Paper Pro:** -- [X] Core port: display, touch input, LoRa, battery, RTC -- [X] Touch-navigable home screen with tappable tile grid -- [X] Full virtual keyboard for text entry -- [X] Lock screen with clock, battery, unread count, and auto-lock timer -- [X] Backlight control (double/triple-click Boot button) -- [X] Dark mode and portrait mode display settings -- [X] Channel messages with swipe navigation and touch compose -- [X] Contacts with filter cycling and long-press DM/admin -- [X] Text reader with swipe page turns -- [X] Web reader with virtual keyboard URL/search entry (WiFi variant) -- [X] Settings screen with touch editing -- [X] Serial clock sync for hardware RTC -- [X] CardKB external keyboard support (via QWIIC) -- [X] Last heard passive advert list -- [X] Tap-to-select on contacts, discovery, settings, text reader, notes screens -- [X] OTA firmware update via phone (WiFi variant) -- [X] DM inbox with per-contact unread indicators -- [X] Roomserver message handling and mark-read on login -- [X] Customised user option for larger-font mode -- [X] Contact select mode with batch favourite and delete -- [X] WiFi remote repeater with MQTT admin management -- [X] 2,000 contact support (PSRAM, all variants) -- [X] Channel picker screen with vertical bubble list layout -- [X] Region scope (MeshCore v1.15+ compatibility) -- [X] Selectable font styles (Classic, Noto Sans, Montserrat) -- [X] Virtual keyboard emoji grid with scrollable pages -- [X] Accented character / diacritics support (Czech, Polish, French, German, Latin Extended) -- [X] DM message persistence across reboots (v1.9) -- [X] Expanded Minesweeper grid to 14x14 with 25 mines (v1.11) -- [ ] Improve EPUB rendering and EPUB format handling - **Heltec V4:** - [X] WiFi remote repeater with MQTT admin management - [X] Headless WiFi repeater variant (no display) @@ -1461,9 +1146,8 @@ However, this firmware links against libraries with different license terms. Bec | [MeshCore](https://github.com/meshcore-dev/MeshCore) | MIT | Scott Powell / rippleradios.com | | [RadioLib](https://github.com/jgromes/RadioLib) | MIT | Jan Gromeš | | [GxEPD2](https://github.com/ZinggJM/GxEPD2) | GPL-3.0 | Jean-Marc Zingg (T-Deck Pro) | -| [FastEPD](https://github.com/bitbank2/FastEPD) | Apache-2.0 | Larry Bank / bitbank2 (T5S3) | | [Adafruit GFX Library](https://github.com/adafruit/Adafruit-GFX-Library) | BSD | Adafruit | -| [SensorLib](https://github.com/lewisxhe/SensorLib) | MIT | Lewis He (T5S3 touch/RTC) | +| [SensorLib](https://github.com/lewisxhe/SensorLib) | MIT | Lewis He | | [ESP32-audioI2S](https://github.com/schreibfaul1/ESP32-audioI2S) | GPL-3.0 | schreibfaul1 / Wolle | | [Codec2](https://github.com/sh123/esp32_codec2_arduino) | LGPL-2.1 | sh123 (ESP32 port) | | [JPEGDEC](https://github.com/bitbank2/JPEGDEC) | Apache-2.0 | Larry Bank / bitbank2 | diff --git a/lib/PDM_nrf52/library.json b/lib/PDM_nrf52/library.json deleted file mode 100644 index d6e02b5f..00000000 --- a/lib/PDM_nrf52/library.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "name": "PDM_nrf52", - "version": "1.0.0", - "description": "PDM microphone library for nRF52840 (from Adafruit BSP)", - "license": "LGPL-2.1", - "frameworks": "arduino", - "platforms": "*" -} diff --git a/lib/PDM_nrf52/src/PDM.cpp b/lib/PDM_nrf52/src/PDM.cpp deleted file mode 100644 index 8a219193..00000000 --- a/lib/PDM_nrf52/src/PDM.cpp +++ /dev/null @@ -1,261 +0,0 @@ -/* - PDM.cpp - library to interface with nRF52840 PDM peripheral - Part of Arduino - http://www.arduino.cc/ - - Copyright (c) 2019 Arduino SA - - 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., 59 Temple Place, Suite 330, - Boston, MA 02111-1307 USA -*/ - -#include "PDM.h" -#include - -#include // for Serial - -#define DEFAULT_PDM_GAIN 20 -#define PDM_IRQ_PRIORITY 7 - -#define NRF_PDM_FREQ_1280K (nrf_pdm_freq_t)(0x0A000000UL) ///< PDM_CLK= 1.280 MHz (32 MHz / 25) => Fs= 20000 Hz -#define NRF_PDM_FREQ_2000K (nrf_pdm_freq_t)(0x10000000UL) ///< PDM_CLK= 2.000 MHz (32 MHz / 16) => Fs= 31250 Hz -#define NRF_PDM_FREQ_2667K (nrf_pdm_freq_t)(0x15000000UL) ///< PDM_CLK= 2.667 MHz (32 MHz / 12) => Fs= 41667 Hz -#define NRF_PDM_FREQ_3200K (nrf_pdm_freq_t)(0x19000000UL) ///< PDM_CLK= 3.200 MHz (32 MHz / 10) => Fs= 50000 Hz -#define NRF_PDM_FREQ_4000K (nrf_pdm_freq_t)(0x20000000UL) ///< PDM_CLK= 4.000 MHz (32 MHz / 8) => Fs= 62500 Hz - -PDMClass::PDMClass(int dinPin, int clkPin, int pwrPin) : - _dinPin(dinPin), - _clkPin(clkPin), - _pwrPin(pwrPin), - _onReceive(NULL) -{ -} - -PDMClass::~PDMClass() -{ -} - -void PDMClass::setPins(int dataPin, int clkPin, int pwrPin) -{ - _dinPin = dataPin; - _clkPin = clkPin; - _pwrPin = pwrPin; -} - -int PDMClass::begin(int channels, long sampleRate) -{ - _channels = channels; - - // Enable high frequency oscillator if not already enabled - uint8_t sd_en = 0; - sd_softdevice_is_enabled(&sd_en); - - if (sd_en) - { - uint32_t is_running; - sd_clock_hfclk_is_running(&is_running); - - if (!is_running) { - sd_clock_hfclk_request(); - - while(!is_running) { - yield(); - sd_clock_hfclk_is_running(&is_running); - } - } - } - else - { - if (NRF_CLOCK->EVENTS_HFCLKSTARTED == 0) { - NRF_CLOCK->TASKS_HFCLKSTART = 1; - while (NRF_CLOCK->EVENTS_HFCLKSTARTED == 0) yield(); - } - } - - // configure the sample rate and channels - switch (sampleRate) { - case 16000: - #ifndef NRF52832_XXAA - NRF_PDM->RATIO = ((PDM_RATIO_RATIO_Ratio80 << PDM_RATIO_RATIO_Pos) & PDM_RATIO_RATIO_Msk); - #endif - nrf_pdm_clock_set(NRF_PDM, NRF_PDM_FREQ_1280K); - break; - case 41667: - nrf_pdm_clock_set(NRF_PDM, NRF_PDM_FREQ_2667K); - break; - default: - return 0; // unsupported - } - - switch (channels) { - case 2: - nrf_pdm_mode_set(NRF_PDM, NRF_PDM_MODE_STEREO, NRF_PDM_EDGE_LEFTFALLING); - break; - - case 1: - nrf_pdm_mode_set(NRF_PDM, NRF_PDM_MODE_MONO, NRF_PDM_EDGE_LEFTFALLING); - break; - - default: - return 0; // unsupported - } - - setGain(DEFAULT_PDM_GAIN); - - // configure the I/O and mux - pinMode(_clkPin, OUTPUT); - digitalWrite(_clkPin, LOW); - - pinMode(_dinPin, INPUT); - - nrf_pdm_psel_connect(NRF_PDM, digitalPinToPinName(_clkPin), digitalPinToPinName(_dinPin)); - - // clear events and enable PDM interrupts - nrf_pdm_event_clear(NRF_PDM, NRF_PDM_EVENT_STARTED); - nrf_pdm_event_clear(NRF_PDM, NRF_PDM_EVENT_END); - nrf_pdm_event_clear(NRF_PDM, NRF_PDM_EVENT_STOPPED); - nrf_pdm_int_enable(NRF_PDM, NRF_PDM_INT_STARTED | NRF_PDM_INT_STOPPED); - - if (_pwrPin > -1) { - // power the mic on - pinMode(_pwrPin, OUTPUT); - digitalWrite(_pwrPin, HIGH); - } - - // clear the buffer - _doubleBuffer.reset(); - - // set the PDM IRQ priority and enable - NVIC_SetPriority(PDM_IRQn, PDM_IRQ_PRIORITY); - NVIC_ClearPendingIRQ(PDM_IRQn); - NVIC_EnableIRQ(PDM_IRQn); - - // set the buffer for transfer - // nrf_pdm_buffer_set((uint32_t*)_doubleBuffer.data(), _doubleBuffer.availableForWrite() / (sizeof(int16_t) * _channels)); - // _doubleBuffer.swap(); - - // enable and trigger start task - nrf_pdm_enable(NRF_PDM); - nrf_pdm_event_clear(NRF_PDM, NRF_PDM_EVENT_STARTED); - nrf_pdm_task_trigger(NRF_PDM, NRF_PDM_TASK_START); - - return 1; -} - -void PDMClass::end() -{ - // disable PDM and IRQ - nrf_pdm_disable(NRF_PDM); - - NVIC_DisableIRQ(PDM_IRQn); - - if (_pwrPin > -1) { - // power the mic off - digitalWrite(_pwrPin, LOW); - pinMode(_pwrPin, INPUT); - } - - // Don't disable high frequency oscillator since it could be in use by RADIO - - // unconfigure the I/O and un-mux - nrf_pdm_psel_disconnect(NRF_PDM); - - pinMode(_clkPin, INPUT); -} - -int PDMClass::available() -{ - NVIC_DisableIRQ(PDM_IRQn); - - size_t avail = _doubleBuffer.available(); - - NVIC_EnableIRQ(PDM_IRQn); - - return avail; -} - -int PDMClass::read(void* buffer, size_t size) -{ - NVIC_DisableIRQ(PDM_IRQn); - - int read = _doubleBuffer.read(buffer, size); - - NVIC_EnableIRQ(PDM_IRQn); - - return read; -} - -void PDMClass::onReceive(void(*function)(void)) -{ - _onReceive = function; -} - -void PDMClass::setGain(int gain) -{ - nrf_pdm_gain_set(NRF_PDM, gain, gain); -} - -void PDMClass::setBufferSize(int bufferSize) -{ - _doubleBuffer.setSize(bufferSize); -} - -void PDMClass::IrqHandler() -{ - if (nrf_pdm_event_check(NRF_PDM, NRF_PDM_EVENT_STARTED)) { - nrf_pdm_event_clear(NRF_PDM, NRF_PDM_EVENT_STARTED); - - if (_doubleBuffer.available() == 0) { - // switch to the next buffer - nrf_pdm_buffer_set(NRF_PDM, (uint32_t*)_doubleBuffer.data(), _doubleBuffer.availableForWrite() / (sizeof(int16_t) * _channels)); - - // make the current one available for reading - _doubleBuffer.swap(_doubleBuffer.availableForWrite()); - - // call receive callback if provided - if (_onReceive) { - _onReceive(); - } - } else { - // buffer overflow, stop - nrf_pdm_disable(NRF_PDM); - } - } else if (nrf_pdm_event_check(NRF_PDM, NRF_PDM_EVENT_STOPPED)) { - nrf_pdm_event_clear(NRF_PDM, NRF_PDM_EVENT_STOPPED); - } else if (nrf_pdm_event_check(NRF_PDM, NRF_PDM_EVENT_END)) { - nrf_pdm_event_clear(NRF_PDM, NRF_PDM_EVENT_END); - } -} - -extern "C" -{ - void PDM_IRQHandler(void) - { - PDM.IrqHandler(); - } -} - -#ifndef PIN_PDM_DIN -#define PIN_PDM_DIN -1 -#endif - -#ifndef PIN_PDM_CLK -#define PIN_PDM_CLK -1 -#endif - -#ifndef PIN_PDM_PWR -#define PIN_PDM_PWR -1 -#endif - -PDMClass PDM(PIN_PDM_DIN, PIN_PDM_CLK, PIN_PDM_PWR); diff --git a/lib/PDM_nrf52/src/PDM.h b/lib/PDM_nrf52/src/PDM.h deleted file mode 100644 index 9f1a2895..00000000 --- a/lib/PDM_nrf52/src/PDM.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - Copyright (c) 2019 Arduino LLC. All right reserved. - - 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 _PDM_H_INCLUDED -#define _PDM_H_INCLUDED - -#if !defined(ARDUINO_NRF52_ADAFRUIT) -#error "This library targets only Adafruit NRF52840 boards" -#endif - -#include -#include // for Serial -#include "utility/PDMDoubleBuffer.h" - -class PDMClass -{ -public: - PDMClass(int dataPin, int clkPin, int pwrPin); - virtual ~PDMClass(); - - void setPins(int dataPin, int clkPin, int pwrPin); - int begin(int channels, long sampleRate); - void end(); - - virtual int available(); - virtual int read(void* buffer, size_t size); - - void onReceive(void(*)(void)); - - void setGain(int gain); - void setBufferSize(int bufferSize); - -// private: - void IrqHandler(); - -private: - int _dinPin; - int _clkPin; - int _pwrPin; - - int _channels; - - PDMDoubleBuffer _doubleBuffer; - - void (*_onReceive)(void); -}; - -extern PDMClass PDM; - -#endif diff --git a/lib/PDM_nrf52/src/utility/PDMDoubleBuffer.cpp b/lib/PDM_nrf52/src/utility/PDMDoubleBuffer.cpp deleted file mode 100644 index 15bd9cad..00000000 --- a/lib/PDM_nrf52/src/utility/PDMDoubleBuffer.cpp +++ /dev/null @@ -1,133 +0,0 @@ -/* - Copyright (c) 2016 Arduino LLC. All right reserved. - - 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 -#include - -#include "PDMDoubleBuffer.h" - -PDMDoubleBuffer::PDMDoubleBuffer() : - _size(DEFAULT_PDM_BUFFER_SIZE) -{ - reset(); -} - -PDMDoubleBuffer::~PDMDoubleBuffer() -{ -} - -void PDMDoubleBuffer::setSize(int size) -{ - _size = size; -} - -void PDMDoubleBuffer::reset() -{ - _buffer[0] = (uint8_t*)realloc(_buffer[0], _size); - _buffer[1] = (uint8_t*)realloc(_buffer[1], _size); - - memset(_buffer[0], 0x00, _size); - memset(_buffer[1], 0x00, _size); - - _index = 0; - _length[0] = 0; - _length[1] = 0; - _readOffset[0] = 0; - _readOffset[1] = 0; -} - -size_t PDMDoubleBuffer::availableForWrite() -{ - return (_size - (_length[_index] - _readOffset[_index])); -} - -size_t PDMDoubleBuffer::write(const void *buffer, size_t size) -{ - size_t space = availableForWrite(); - - if (size > space) { - size = space; - } - - if (size == 0) { - return 0; - } - - memcpy(&_buffer[_index][_length[_index]], buffer, size); - - _length[_index] += size; - - return size; -} - -size_t PDMDoubleBuffer::read(void *buffer, size_t size) -{ - size_t avail = available(); - - if (size > avail) { - size = avail; - } - - if (size == 0) { - return 0; - } - - memcpy(buffer, &_buffer[_index][_readOffset[_index]], size); - _readOffset[_index] += size; - - return size; -} - -size_t PDMDoubleBuffer::peek(void *buffer, size_t size) -{ - size_t avail = available(); - - if (size > avail) { - size = avail; - } - - if (size == 0) { - return 0; - } - - memcpy(buffer, &_buffer[_index][_readOffset[_index]], size); - - return size; -} - -void* PDMDoubleBuffer::data() -{ - return (void*)_buffer[_index]; -} - -size_t PDMDoubleBuffer::available() -{ - return _length[_index] - _readOffset[_index]; -} - -void PDMDoubleBuffer::swap(int length) -{ - if (_index == 0) { - _index = 1; - } else { - _index = 0; - } - - _length[_index] = length; - _readOffset[_index] = 0; -} diff --git a/lib/PDM_nrf52/src/utility/PDMDoubleBuffer.h b/lib/PDM_nrf52/src/utility/PDMDoubleBuffer.h deleted file mode 100644 index e410b62d..00000000 --- a/lib/PDM_nrf52/src/utility/PDMDoubleBuffer.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - Copyright (c) 2016 Arduino LLC. All right reserved. - - 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 _PDM_DOUBLE_BUFFER_H_INCLUDED -#define _PDM_DOUBLE_BUFFER_H_INCLUDED - -#include -#include - -#define DEFAULT_PDM_BUFFER_SIZE 512 - -class PDMDoubleBuffer -{ -public: - PDMDoubleBuffer(); - virtual ~PDMDoubleBuffer(); - - void setSize(int size); - - void reset(); - - size_t availableForWrite(); - size_t write(const void *buffer, size_t size); - size_t read(void *buffer, size_t size); - size_t peek(void *buffer, size_t size); - void* data(); - size_t available(); - void swap(int length = 0); - -private: - uint8_t* _buffer[2]; - int _size; - volatile int _length[2]; - volatile int _readOffset[2]; - volatile int _index; -}; - -#endif diff --git a/lib/nrf52/include/ble.h b/lib/nrf52/include/ble.h deleted file mode 100644 index 76a432bf..00000000 --- a/lib/nrf52/include/ble.h +++ /dev/null @@ -1,685 +0,0 @@ -/* - * Copyright (c) 2012 - 2018, Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - @addtogroup BLE_COMMON BLE SoftDevice Common - @{ - @defgroup ble_api Events, type definitions and API calls - @{ - - @brief Module independent events, type definitions and API calls for the BLE SoftDevice. - - */ - -#ifndef BLE_H__ -#define BLE_H__ - -#include -#include "nrf_svc.h" -#include "nrf_error.h" -#include "ble_err.h" -#include "ble_gap.h" -#include "ble_l2cap.h" -#include "ble_gatt.h" -#include "ble_gattc.h" -#include "ble_gatts.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** @addtogroup BLE_COMMON_ENUMERATIONS Enumerations - * @{ */ - -/** - * @brief Common API SVC numbers. - */ -enum BLE_COMMON_SVCS -{ - SD_BLE_ENABLE = BLE_SVC_BASE, /**< Enable and initialize the BLE stack */ - SD_BLE_EVT_GET, /**< Get an event from the pending events queue. */ - SD_BLE_UUID_VS_ADD, /**< Add a Vendor Specific base UUID. */ - SD_BLE_UUID_DECODE, /**< Decode UUID bytes. */ - SD_BLE_UUID_ENCODE, /**< Encode UUID bytes. */ - SD_BLE_VERSION_GET, /**< Get the local version information (company ID, Link Layer Version, Link Layer Subversion). */ - SD_BLE_USER_MEM_REPLY, /**< User Memory Reply. */ - SD_BLE_OPT_SET, /**< Set a BLE option. */ - SD_BLE_OPT_GET, /**< Get a BLE option. */ - SD_BLE_CFG_SET, /**< Add a configuration to the BLE stack. */ - SD_BLE_UUID_VS_REMOVE, /**< Remove a Vendor Specific base UUID. */ -}; - -/** - * @brief BLE Module Independent Event IDs. - */ -enum BLE_COMMON_EVTS -{ - BLE_EVT_USER_MEM_REQUEST = BLE_EVT_BASE + 0, /**< User Memory request. @ref ble_evt_user_mem_request_t */ - BLE_EVT_USER_MEM_RELEASE = BLE_EVT_BASE + 1, /**< User Memory release. @ref ble_evt_user_mem_release_t */ -}; - -/**@brief BLE Connection Configuration IDs. - * - * IDs that uniquely identify a connection configuration. - */ -enum BLE_CONN_CFGS -{ - BLE_CONN_CFG_GAP = BLE_CONN_CFG_BASE + 0, /**< BLE GAP specific connection configuration. */ - BLE_CONN_CFG_GATTC = BLE_CONN_CFG_BASE + 1, /**< BLE GATTC specific connection configuration. */ - BLE_CONN_CFG_GATTS = BLE_CONN_CFG_BASE + 2, /**< BLE GATTS specific connection configuration. */ - BLE_CONN_CFG_GATT = BLE_CONN_CFG_BASE + 3, /**< BLE GATT specific connection configuration. */ - BLE_CONN_CFG_L2CAP = BLE_CONN_CFG_BASE + 4, /**< BLE L2CAP specific connection configuration. */ -}; - -/**@brief BLE Common Configuration IDs. - * - * IDs that uniquely identify a common configuration. - */ -enum BLE_COMMON_CFGS -{ - BLE_COMMON_CFG_VS_UUID = BLE_CFG_BASE, /**< Vendor specific base UUID configuration */ -}; - -/**@brief Common Option IDs. - * IDs that uniquely identify a common option. - */ -enum BLE_COMMON_OPTS -{ - BLE_COMMON_OPT_PA_LNA = BLE_OPT_BASE + 0, /**< PA and LNA options */ - BLE_COMMON_OPT_CONN_EVT_EXT = BLE_OPT_BASE + 1, /**< Extended connection events option */ - BLE_COMMON_OPT_EXTENDED_RC_CAL = BLE_OPT_BASE + 2, /**< Extended RC calibration option */ - BLE_COMMON_OPT_ADV_SCHED_CFG = BLE_OPT_BASE + 3, /**< Advertiser role scheduling configuration option */ -}; - -/** @} */ - -/** @addtogroup BLE_COMMON_DEFINES Defines - * @{ */ - -/** @brief Required pointer alignment for BLE Events. -*/ -#define BLE_EVT_PTR_ALIGNMENT 4 - -/** @brief Leaves the maximum of the two arguments. -*/ -#define BLE_MAX(a, b) ((a) < (b) ? (b) : (a)) - -/** @brief Maximum possible length for BLE Events. - * @note The highest value used for @ref ble_gatt_conn_cfg_t::att_mtu in any connection configuration shall be used as a parameter. - * If that value has not been configured for any connections then @ref BLE_GATT_ATT_MTU_DEFAULT must be used instead. -*/ -#define BLE_EVT_LEN_MAX(ATT_MTU) ( \ - offsetof(ble_evt_t, evt.gattc_evt.params.prim_srvc_disc_rsp.services) + ((ATT_MTU) - 1) / 4 * sizeof(ble_gattc_service_t) \ -) - -/** @defgroup ADV_SCHED_CFG Advertiser Role Scheduling Configuration - * @{ */ -#define ADV_SCHED_CFG_DEFAULT 0 /**< Default advertiser role scheduling configuration. */ -#define ADV_SCHED_CFG_IMPROVED 1 /**< Improved advertiser role scheduling configuration in which the housekeeping time is reduced. */ -/** @} */ - -/** @defgroup BLE_USER_MEM_TYPES User Memory Types - * @{ */ -#define BLE_USER_MEM_TYPE_INVALID 0x00 /**< Invalid User Memory Types. */ -#define BLE_USER_MEM_TYPE_GATTS_QUEUED_WRITES 0x01 /**< User Memory for GATTS queued writes. */ -/** @} */ - -/** @defgroup BLE_UUID_VS_COUNTS Vendor Specific base UUID counts - * @{ - */ -#define BLE_UUID_VS_COUNT_DEFAULT 10 /**< Default VS UUID count. */ -#define BLE_UUID_VS_COUNT_MAX 254 /**< Maximum VS UUID count. */ -/** @} */ - -/** @defgroup BLE_COMMON_CFG_DEFAULTS Configuration defaults. - * @{ - */ -#define BLE_CONN_CFG_TAG_DEFAULT 0 /**< Default configuration tag, SoftDevice default connection configuration. */ - -/** @} */ - -/** @} */ - -/** @addtogroup BLE_COMMON_STRUCTURES Structures - * @{ */ - -/**@brief User Memory Block. */ -typedef struct -{ - uint8_t *p_mem; /**< Pointer to the start of the user memory block. */ - uint16_t len; /**< Length in bytes of the user memory block. */ -} ble_user_mem_block_t; - -/**@brief Event structure for @ref BLE_EVT_USER_MEM_REQUEST. */ -typedef struct -{ - uint8_t type; /**< User memory type, see @ref BLE_USER_MEM_TYPES. */ -} ble_evt_user_mem_request_t; - -/**@brief Event structure for @ref BLE_EVT_USER_MEM_RELEASE. */ -typedef struct -{ - uint8_t type; /**< User memory type, see @ref BLE_USER_MEM_TYPES. */ - ble_user_mem_block_t mem_block; /**< User memory block */ -} ble_evt_user_mem_release_t; - -/**@brief Event structure for events not associated with a specific function module. */ -typedef struct -{ - uint16_t conn_handle; /**< Connection Handle on which this event occurred. */ - union - { - ble_evt_user_mem_request_t user_mem_request; /**< User Memory Request Event Parameters. */ - ble_evt_user_mem_release_t user_mem_release; /**< User Memory Release Event Parameters. */ - } params; /**< Event parameter union. */ -} ble_common_evt_t; - -/**@brief BLE Event header. */ -typedef struct -{ - uint16_t evt_id; /**< Value from a BLE__EVT series. */ - uint16_t evt_len; /**< Length in octets including this header. */ -} ble_evt_hdr_t; - -/**@brief Common BLE Event type, wrapping the module specific event reports. */ -typedef struct -{ - ble_evt_hdr_t header; /**< Event header. */ - union - { - ble_common_evt_t common_evt; /**< Common Event, evt_id in BLE_EVT_* series. */ - ble_gap_evt_t gap_evt; /**< GAP originated event, evt_id in BLE_GAP_EVT_* series. */ - ble_gattc_evt_t gattc_evt; /**< GATT client originated event, evt_id in BLE_GATTC_EVT* series. */ - ble_gatts_evt_t gatts_evt; /**< GATT server originated event, evt_id in BLE_GATTS_EVT* series. */ - ble_l2cap_evt_t l2cap_evt; /**< L2CAP originated event, evt_id in BLE_L2CAP_EVT* series. */ - } evt; /**< Event union. */ -} ble_evt_t; - - -/** - * @brief Version Information. - */ -typedef struct -{ - uint8_t version_number; /**< Link Layer Version number. See https://www.bluetooth.org/en-us/specification/assigned-numbers/link-layer for assigned values. */ - uint16_t company_id; /**< Company ID, Nordic Semiconductor's company ID is 89 (0x0059) (https://www.bluetooth.org/apps/content/Default.aspx?doc_id=49708). */ - uint16_t subversion_number; /**< Link Layer Sub Version number, corresponds to the SoftDevice Config ID or Firmware ID (FWID). */ -} ble_version_t; - -/** - * @brief Configuration parameters for the PA and LNA. - */ -typedef struct -{ - uint8_t enable :1; /**< Enable toggling for this amplifier */ - uint8_t active_high :1; /**< Set the pin to be active high */ - uint8_t gpio_pin :6; /**< The GPIO pin to toggle for this amplifier */ -} ble_pa_lna_cfg_t; - -/** - * @brief PA & LNA GPIO toggle configuration - * - * This option configures the SoftDevice to toggle pins when the radio is active for use with a power amplifier and/or - * a low noise amplifier. - * - * Toggling the pins is achieved by using two PPI channels and a GPIOTE channel. The hardware channel IDs are provided - * by the application and should be regarded as reserved as long as any PA/LNA toggling is enabled. - * - * @note @ref sd_ble_opt_get is not supported for this option. - * @note Setting this option while the radio is in use (i.e. any of the roles are active) may have undefined consequences - * and must be avoided by the application. - */ -typedef struct -{ - ble_pa_lna_cfg_t pa_cfg; /**< Power Amplifier configuration */ - ble_pa_lna_cfg_t lna_cfg; /**< Low Noise Amplifier configuration */ - - uint8_t ppi_ch_id_set; /**< PPI channel used for radio pin setting */ - uint8_t ppi_ch_id_clr; /**< PPI channel used for radio pin clearing */ - uint8_t gpiote_ch_id; /**< GPIOTE channel used for radio pin toggling */ -} ble_common_opt_pa_lna_t; - -/** - * @brief Configuration of extended BLE connection events. - * - * When enabled the SoftDevice will dynamically extend the connection event when possible. - * - * The connection event length is controlled by the connection configuration as set by @ref ble_gap_conn_cfg_t::event_length. - * The connection event can be extended if there is time to send another packet pair before the start of the next connection interval, - * and if there are no conflicts with other BLE roles requesting radio time. - * - * @note @ref sd_ble_opt_get is not supported for this option. - */ -typedef struct -{ - uint8_t enable : 1; /**< Enable extended BLE connection events, disabled by default. */ -} ble_common_opt_conn_evt_ext_t; - -/** - * @brief Enable/disable extended RC calibration. - * - * If extended RC calibration is enabled and the internal RC oscillator (@ref NRF_CLOCK_LF_SRC_RC) is used as the SoftDevice - * LFCLK source, the SoftDevice as a peripheral will by default try to increase the receive window if two consecutive packets - * are not received. If it turns out that the packets were not received due to clock drift, the RC calibration is started. - * This calibration comes in addition to the periodic calibration that is configured by @ref sd_softdevice_enable(). When - * using only peripheral connections, the periodic calibration can therefore be configured with a much longer interval as the - * peripheral will be able to detect and adjust automatically to clock drift, and calibrate on demand. - * - * If extended RC calibration is disabled and the internal RC oscillator is used as the SoftDevice LFCLK source, the - * RC oscillator is calibrated periodically as configured by @ref sd_softdevice_enable(). - * - * @note @ref sd_ble_opt_get is not supported for this option. - */ -typedef struct -{ - uint8_t enable : 1; /**< Enable extended RC calibration, enabled by default. */ -} ble_common_opt_extended_rc_cal_t; - -/** - * @brief Configuration of BLE advertiser role scheduling. - * - * @note @ref sd_ble_opt_get is not supported for this option. - */ -typedef struct -{ - uint8_t sched_cfg; /**< See @ref ADV_SCHED_CFG. */ -} ble_common_opt_adv_sched_cfg_t; - -/**@brief Option structure for common options. */ -typedef union -{ - ble_common_opt_pa_lna_t pa_lna; /**< Parameters for controlling PA and LNA pin toggling. */ - ble_common_opt_conn_evt_ext_t conn_evt_ext; /**< Parameters for enabling extended connection events. */ - ble_common_opt_extended_rc_cal_t extended_rc_cal; /**< Parameters for enabling extended RC calibration. */ - ble_common_opt_adv_sched_cfg_t adv_sched_cfg; /**< Parameters for configuring advertiser role scheduling. */ -} ble_common_opt_t; - -/**@brief Common BLE Option type, wrapping the module specific options. */ -typedef union -{ - ble_common_opt_t common_opt; /**< COMMON options, opt_id in @ref BLE_COMMON_OPTS series. */ - ble_gap_opt_t gap_opt; /**< GAP option, opt_id in @ref BLE_GAP_OPTS series. */ -} ble_opt_t; - -/**@brief BLE connection configuration type, wrapping the module specific configurations, set with - * @ref sd_ble_cfg_set. - * - * @note Connection configurations don't have to be set. - * In the case that no configurations has been set, or fewer connection configurations has been set than enabled connections, - * the default connection configuration will be automatically added for the remaining connections. - * When creating connections with the default configuration, @ref BLE_CONN_CFG_TAG_DEFAULT should be used in - * place of @ref ble_conn_cfg_t::conn_cfg_tag. - * - * @sa sd_ble_gap_adv_start() - * @sa sd_ble_gap_connect() - * - * @mscs - * @mmsc{@ref BLE_CONN_CFG} - * @endmscs - - */ -typedef struct -{ - uint8_t conn_cfg_tag; /**< The application chosen tag it can use with the - @ref sd_ble_gap_adv_start() and @ref sd_ble_gap_connect() calls - to select this configuration when creating a connection. - Must be different for all connection configurations added and not @ref BLE_CONN_CFG_TAG_DEFAULT. */ - union { - ble_gap_conn_cfg_t gap_conn_cfg; /**< GAP connection configuration, cfg_id is @ref BLE_CONN_CFG_GAP. */ - ble_gattc_conn_cfg_t gattc_conn_cfg; /**< GATTC connection configuration, cfg_id is @ref BLE_CONN_CFG_GATTC. */ - ble_gatts_conn_cfg_t gatts_conn_cfg; /**< GATTS connection configuration, cfg_id is @ref BLE_CONN_CFG_GATTS. */ - ble_gatt_conn_cfg_t gatt_conn_cfg; /**< GATT connection configuration, cfg_id is @ref BLE_CONN_CFG_GATT. */ - ble_l2cap_conn_cfg_t l2cap_conn_cfg; /**< L2CAP connection configuration, cfg_id is @ref BLE_CONN_CFG_L2CAP. */ - } params; /**< Connection configuration union. */ -} ble_conn_cfg_t; - -/** - * @brief Configuration of Vendor Specific base UUIDs, set with @ref sd_ble_cfg_set. - * - * @retval ::NRF_ERROR_INVALID_PARAM Too many UUIDs configured. - */ -typedef struct -{ - uint8_t vs_uuid_count; /**< Number of 128-bit Vendor Specific base UUID bases to allocate memory for. - Default value is @ref BLE_UUID_VS_COUNT_DEFAULT. Maximum value is - @ref BLE_UUID_VS_COUNT_MAX. */ -} ble_common_cfg_vs_uuid_t; - -/**@brief Common BLE Configuration type, wrapping the common configurations. */ -typedef union -{ - ble_common_cfg_vs_uuid_t vs_uuid_cfg; /**< Vendor Specific base UUID configuration, cfg_id is @ref BLE_COMMON_CFG_VS_UUID. */ -} ble_common_cfg_t; - -/**@brief BLE Configuration type, wrapping the module specific configurations. */ -typedef union -{ - ble_conn_cfg_t conn_cfg; /**< Connection specific configurations, cfg_id in @ref BLE_CONN_CFGS series. */ - ble_common_cfg_t common_cfg; /**< Global common configurations, cfg_id in @ref BLE_COMMON_CFGS series. */ - ble_gap_cfg_t gap_cfg; /**< Global GAP configurations, cfg_id in @ref BLE_GAP_CFGS series. */ - ble_gatts_cfg_t gatts_cfg; /**< Global GATTS configuration, cfg_id in @ref BLE_GATTS_CFGS series. */ -} ble_cfg_t; - -/** @} */ - -/** @addtogroup BLE_COMMON_FUNCTIONS Functions - * @{ */ - -/**@brief Enable the BLE stack - * - * @param[in, out] p_app_ram_base Pointer to a variable containing the start address of the - * application RAM region (APP_RAM_BASE). On return, this will - * contain the minimum start address of the application RAM region - * required by the SoftDevice for this configuration. - * - * @note The memory requirement for a specific configuration will not increase between SoftDevices - * with the same major version number. - * - * @note At runtime the IC's RAM is split into 2 regions: The SoftDevice RAM region is located - * between 0x20000000 and APP_RAM_BASE-1 and the application's RAM region is located between - * APP_RAM_BASE and the start of the call stack. - * - * @details This call initializes the BLE stack, no BLE related function other than @ref - * sd_ble_cfg_set can be called before this one. - * - * @mscs - * @mmsc{@ref BLE_COMMON_ENABLE} - * @endmscs - * - * @retval ::NRF_SUCCESS The BLE stack has been initialized successfully. - * @retval ::NRF_ERROR_INVALID_STATE The BLE stack had already been initialized and cannot be reinitialized. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid or not sufficiently aligned pointer supplied. - * @retval ::NRF_ERROR_NO_MEM One or more of the following is true: - * - The amount of memory assigned to the SoftDevice by *p_app_ram_base is not - * large enough to fit this configuration's memory requirement. Check *p_app_ram_base - * and set the start address of the application RAM region accordingly. - * - Dynamic part of the SoftDevice RAM region is larger then 64 kB which - * is currently not supported. - * @retval ::NRF_ERROR_RESOURCES The total number of L2CAP Channels configured using @ref sd_ble_cfg_set is too large. - */ -SVCALL(SD_BLE_ENABLE, uint32_t, sd_ble_enable(uint32_t * p_app_ram_base)); - -/**@brief Add configurations for the BLE stack - * - * @param[in] cfg_id Config ID, see @ref BLE_CONN_CFGS, @ref BLE_COMMON_CFGS, @ref - * BLE_GAP_CFGS or @ref BLE_GATTS_CFGS. - * @param[in] p_cfg Pointer to a ble_cfg_t structure containing the configuration value. - * @param[in] app_ram_base The start address of the application RAM region (APP_RAM_BASE). - * See @ref sd_ble_enable for details about APP_RAM_BASE. - * - * @note The memory requirement for a specific configuration will not increase between SoftDevices - * with the same major version number. - * - * @note If a configuration is set more than once, the last one set is the one that takes effect on - * @ref sd_ble_enable. - * - * @note Any part of the BLE stack that is NOT configured with @ref sd_ble_cfg_set will have default - * configuration. - * - * @note @ref sd_ble_cfg_set may be called at any time when the SoftDevice is enabled (see @ref - * sd_softdevice_enable) while the BLE part of the SoftDevice is not enabled (see @ref - * sd_ble_enable). - * - * @note Error codes for the configurations are described in the configuration structs. - * - * @mscs - * @mmsc{@ref BLE_COMMON_ENABLE} - * @endmscs - * - * @retval ::NRF_SUCCESS The configuration has been added successfully. - * @retval ::NRF_ERROR_INVALID_STATE The BLE stack had already been initialized. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid or not sufficiently aligned pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid cfg_id supplied. - * @retval ::NRF_ERROR_NO_MEM The amount of memory assigned to the SoftDevice by app_ram_base is not - * large enough to fit this configuration's memory requirement. - */ -SVCALL(SD_BLE_CFG_SET, uint32_t, sd_ble_cfg_set(uint32_t cfg_id, ble_cfg_t const * p_cfg, uint32_t app_ram_base)); - -/**@brief Get an event from the pending events queue. - * - * @param[out] p_dest Pointer to buffer to be filled in with an event, or NULL to retrieve the event length. - * This buffer must be aligned to the extend defined by @ref BLE_EVT_PTR_ALIGNMENT. - * The buffer should be interpreted as a @ref ble_evt_t struct. - * @param[in, out] p_len Pointer the length of the buffer, on return it is filled with the event length. - * - * @details This call allows the application to pull a BLE event from the BLE stack. The application is signaled that - * an event is available from the BLE stack by the triggering of the SD_EVT_IRQn interrupt. - * The application is free to choose whether to call this function from thread mode (main context) or directly from the - * Interrupt Service Routine that maps to SD_EVT_IRQn. In any case however, and because the BLE stack runs at a higher - * priority than the application, this function should be called in a loop (until @ref NRF_ERROR_NOT_FOUND is returned) - * every time SD_EVT_IRQn is raised to ensure that all available events are pulled from the BLE stack. Failure to do so - * could potentially leave events in the internal queue without the application being aware of this fact. - * - * Sizing the p_dest buffer is equally important, since the application needs to provide all the memory necessary for the event to - * be copied into application memory. If the buffer provided is not large enough to fit the entire contents of the event, - * @ref NRF_ERROR_DATA_SIZE will be returned and the application can then call again with a larger buffer size. - * The maximum possible event length is defined by @ref BLE_EVT_LEN_MAX. The application may also "peek" the event length - * by providing p_dest as a NULL pointer and inspecting the value of *p_len upon return: - * - * \code - * uint16_t len; - * errcode = sd_ble_evt_get(NULL, &len); - * \endcode - * - * @mscs - * @mmsc{@ref BLE_COMMON_IRQ_EVT_MSC} - * @mmsc{@ref BLE_COMMON_THREAD_EVT_MSC} - * @endmscs - * - * @retval ::NRF_SUCCESS Event pulled and stored into the supplied buffer. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid or not sufficiently aligned pointer supplied. - * @retval ::NRF_ERROR_NOT_FOUND No events ready to be pulled. - * @retval ::NRF_ERROR_DATA_SIZE Event ready but could not fit into the supplied buffer. - */ -SVCALL(SD_BLE_EVT_GET, uint32_t, sd_ble_evt_get(uint8_t *p_dest, uint16_t *p_len)); - - -/**@brief Add a Vendor Specific base UUID. - * - * @details This call enables the application to add a Vendor Specific base UUID to the BLE stack's table, for later - * use with all other modules and APIs. This then allows the application to use the shorter, 24-bit @ref ble_uuid_t - * format when dealing with both 16-bit and 128-bit UUIDs without having to check for lengths and having split code - * paths. This is accomplished by extending the grouping mechanism that the Bluetooth SIG standard base UUID uses - * for all other 128-bit UUIDs. The type field in the @ref ble_uuid_t structure is an index (relative to - * @ref BLE_UUID_TYPE_VENDOR_BEGIN) to the table populated by multiple calls to this function, and the UUID field - * in the same structure contains the 2 bytes at indexes 12 and 13. The number of possible 128-bit UUIDs available to - * the application is therefore the number of Vendor Specific UUIDs added with the help of this function times 65536, - * although restricted to modifying bytes 12 and 13 for each of the entries in the supplied array. - * - * @note Bytes 12 and 13 of the provided UUID will not be used internally, since those are always replaced by - * the 16-bit uuid field in @ref ble_uuid_t. - * - * @note If a UUID is already present in the BLE stack's internal table, the corresponding index will be returned in - * p_uuid_type along with an @ref NRF_SUCCESS error code. - * - * @param[in] p_vs_uuid Pointer to a 16-octet (128-bit) little endian Vendor Specific base UUID disregarding - * bytes 12 and 13. - * @param[out] p_uuid_type Pointer to a uint8_t where the type field in @ref ble_uuid_t corresponding to this UUID will be stored. - * - * @retval ::NRF_SUCCESS Successfully added the Vendor Specific base UUID. - * @retval ::NRF_ERROR_INVALID_ADDR If p_vs_uuid or p_uuid_type is NULL or invalid. - * @retval ::NRF_ERROR_NO_MEM If there are no more free slots for VS UUIDs. - */ -SVCALL(SD_BLE_UUID_VS_ADD, uint32_t, sd_ble_uuid_vs_add(ble_uuid128_t const *p_vs_uuid, uint8_t *p_uuid_type)); - - -/**@brief Remove a Vendor Specific base UUID. - * - * @details This call removes a Vendor Specific base UUID that has been added with @ref sd_ble_uuid_vs_add. This function allows - * the application to reuse memory allocated for Vendor Specific base UUIDs. - * - * @note Currently this function can only be called with a p_uuid_type set to @ref BLE_UUID_TYPE_UNKNOWN or the last added UUID type. - * - * @param[in] p_uuid_type Pointer to a uint8_t where the type field in @ref ble_uuid_t::type corresponds to the UUID type that - * shall be removed. If the type is set to @ref BLE_UUID_TYPE_UNKNOWN, or the pointer is NULL, the last - * Vendor Specific base UUID will be removed. - * @param[out] p_uuid_type Pointer to a uint8_t where the type field in @ref ble_uuid_t corresponds to the UUID type that was - * removed. If function returns with a failure, it contains the last type that is in use by the ATT Server. - * - * @retval ::NRF_SUCCESS Successfully removed the Vendor Specific base UUID. - * @retval ::NRF_ERROR_INVALID_ADDR If p_uuid_type is invalid. - * @retval ::NRF_ERROR_INVALID_PARAM If p_uuid_type points to a non-valid UUID type. - * @retval ::NRF_ERROR_FORBIDDEN If the Vendor Specific base UUID is in use by the ATT Server. - */ - -SVCALL(SD_BLE_UUID_VS_REMOVE, uint32_t, sd_ble_uuid_vs_remove(uint8_t *p_uuid_type)); - - -/** @brief Decode little endian raw UUID bytes (16-bit or 128-bit) into a 24 bit @ref ble_uuid_t structure. - * - * @details The raw UUID bytes excluding bytes 12 and 13 (i.e. bytes 0-11 and 14-15) of p_uuid_le are compared - * to the corresponding ones in each entry of the table of Vendor Specific base UUIDs populated with @ref sd_ble_uuid_vs_add - * to look for a match. If there is such a match, bytes 12 and 13 are returned as p_uuid->uuid and the index - * relative to @ref BLE_UUID_TYPE_VENDOR_BEGIN as p_uuid->type. - * - * @note If the UUID length supplied is 2, then the type set by this call will always be @ref BLE_UUID_TYPE_BLE. - * - * @param[in] uuid_le_len Length in bytes of the buffer pointed to by p_uuid_le (must be 2 or 16 bytes). - * @param[in] p_uuid_le Pointer pointing to little endian raw UUID bytes. - * @param[out] p_uuid Pointer to a @ref ble_uuid_t structure to be filled in. - * - * @retval ::NRF_SUCCESS Successfully decoded into the @ref ble_uuid_t structure. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_LENGTH Invalid UUID length. - * @retval ::NRF_ERROR_NOT_FOUND For a 128-bit UUID, no match in the populated table of UUIDs. - */ -SVCALL(SD_BLE_UUID_DECODE, uint32_t, sd_ble_uuid_decode(uint8_t uuid_le_len, uint8_t const *p_uuid_le, ble_uuid_t *p_uuid)); - - -/** @brief Encode a @ref ble_uuid_t structure into little endian raw UUID bytes (16-bit or 128-bit). - * - * @note The pointer to the destination buffer p_uuid_le may be NULL, in which case only the validity and size of p_uuid is computed. - * - * @param[in] p_uuid Pointer to a @ref ble_uuid_t structure that will be encoded into bytes. - * @param[out] p_uuid_le_len Pointer to a uint8_t that will be filled with the encoded length (2 or 16 bytes). - * @param[out] p_uuid_le Pointer to a buffer where the little endian raw UUID bytes (2 or 16) will be stored. - * - * @retval ::NRF_SUCCESS Successfully encoded into the buffer. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid UUID type. - */ -SVCALL(SD_BLE_UUID_ENCODE, uint32_t, sd_ble_uuid_encode(ble_uuid_t const *p_uuid, uint8_t *p_uuid_le_len, uint8_t *p_uuid_le)); - - -/**@brief Get Version Information. - * - * @details This call allows the application to get the BLE stack version information. - * - * @param[out] p_version Pointer to a ble_version_t structure to be filled in. - * - * @retval ::NRF_SUCCESS Version information stored successfully. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_BUSY The BLE stack is busy (typically doing a locally-initiated disconnection procedure). - */ -SVCALL(SD_BLE_VERSION_GET, uint32_t, sd_ble_version_get(ble_version_t *p_version)); - - -/**@brief Provide a user memory block. - * - * @note This call can only be used as a response to a @ref BLE_EVT_USER_MEM_REQUEST event issued to the application. - * - * @param[in] conn_handle Connection handle. - * @param[in] p_block Pointer to a user memory block structure or NULL if memory is managed by the application. - * - * @mscs - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_PEER_CANCEL_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_AUTH_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_NOAUTH_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_BUF_AUTH_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_BUF_NOAUTH_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_QUEUE_FULL_MSC} - * @endmscs - * - * @retval ::NRF_SUCCESS Successfully queued a response to the peer. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_LENGTH Invalid user memory block length supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection state or no user memory request pending. - */ -SVCALL(SD_BLE_USER_MEM_REPLY, uint32_t, sd_ble_user_mem_reply(uint16_t conn_handle, ble_user_mem_block_t const *p_block)); - -/**@brief Set a BLE option. - * - * @details This call allows the application to set the value of an option. - * - * @mscs - * @mmsc{@ref BLE_GAP_PERIPH_BONDING_STATIC_PK_MSC} - * @endmscs - * - * @param[in] opt_id Option ID, see @ref BLE_COMMON_OPTS and @ref BLE_GAP_OPTS. - * @param[in] p_opt Pointer to a ble_opt_t structure containing the option value. - * - * @retval ::NRF_SUCCESS Option set successfully. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, check parameter limits and constraints. - * @retval ::NRF_ERROR_INVALID_STATE Unable to set the parameter at this time. - * @retval ::NRF_ERROR_BUSY The BLE stack is busy or the previous procedure has not completed. - */ -SVCALL(SD_BLE_OPT_SET, uint32_t, sd_ble_opt_set(uint32_t opt_id, ble_opt_t const *p_opt)); - - -/**@brief Get a BLE option. - * - * @details This call allows the application to retrieve the value of an option. - * - * @param[in] opt_id Option ID, see @ref BLE_COMMON_OPTS and @ref BLE_GAP_OPTS. - * @param[out] p_opt Pointer to a ble_opt_t structure to be filled in. - * - * @retval ::NRF_SUCCESS Option retrieved successfully. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, check parameter limits and constraints. - * @retval ::NRF_ERROR_INVALID_STATE Unable to retrieve the parameter at this time. - * @retval ::NRF_ERROR_BUSY The BLE stack is busy or the previous procedure has not completed. - * @retval ::NRF_ERROR_NOT_SUPPORTED This option is not supported. - * - */ -SVCALL(SD_BLE_OPT_GET, uint32_t, sd_ble_opt_get(uint32_t opt_id, ble_opt_t *p_opt)); - -/** @} */ -#ifdef __cplusplus -} -#endif -#endif /* BLE_H__ */ - -/** - @} - @} -*/ diff --git a/lib/nrf52/include/ble_err.h b/lib/nrf52/include/ble_err.h deleted file mode 100644 index 1b4820dc..00000000 --- a/lib/nrf52/include/ble_err.h +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright (c) 2012 - 2018, Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - @addtogroup BLE_COMMON - @{ - @addtogroup nrf_error - @{ - @ingroup BLE_COMMON - @} - - @defgroup ble_err General error codes - @{ - - @brief General error code definitions for the BLE API. - - @ingroup BLE_COMMON -*/ -#ifndef NRF_BLE_ERR_H__ -#define NRF_BLE_ERR_H__ - -#include "nrf_error.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* @defgroup BLE_ERRORS Error Codes - * @{ */ -#define BLE_ERROR_NOT_ENABLED (NRF_ERROR_STK_BASE_NUM+0x001) /**< @ref sd_ble_enable has not been called. */ -#define BLE_ERROR_INVALID_CONN_HANDLE (NRF_ERROR_STK_BASE_NUM+0x002) /**< Invalid connection handle. */ -#define BLE_ERROR_INVALID_ATTR_HANDLE (NRF_ERROR_STK_BASE_NUM+0x003) /**< Invalid attribute handle. */ -#define BLE_ERROR_INVALID_ADV_HANDLE (NRF_ERROR_STK_BASE_NUM+0x004) /**< Invalid advertising handle. */ -#define BLE_ERROR_INVALID_ROLE (NRF_ERROR_STK_BASE_NUM+0x005) /**< Invalid role. */ -#define BLE_ERROR_BLOCKED_BY_OTHER_LINKS (NRF_ERROR_STK_BASE_NUM+0x006) /**< The attempt to change link settings failed due to the scheduling of other links. */ -/** @} */ - - -/** @defgroup BLE_ERROR_SUBRANGES Module specific error code subranges - * @brief Assignment of subranges for module specific error codes. - * @note For specific error codes, see ble_.h or ble_error_.h. - * @{ */ -#define NRF_L2CAP_ERR_BASE (NRF_ERROR_STK_BASE_NUM+0x100) /**< L2CAP specific errors. */ -#define NRF_GAP_ERR_BASE (NRF_ERROR_STK_BASE_NUM+0x200) /**< GAP specific errors. */ -#define NRF_GATTC_ERR_BASE (NRF_ERROR_STK_BASE_NUM+0x300) /**< GATT client specific errors. */ -#define NRF_GATTS_ERR_BASE (NRF_ERROR_STK_BASE_NUM+0x400) /**< GATT server specific errors. */ -/** @} */ - -#ifdef __cplusplus -} -#endif -#endif - - -/** - @} - @} -*/ diff --git a/lib/nrf52/include/ble_gap.h b/lib/nrf52/include/ble_gap.h deleted file mode 100644 index c434fefb..00000000 --- a/lib/nrf52/include/ble_gap.h +++ /dev/null @@ -1,2696 +0,0 @@ -/* - * Copyright (c) 2011 - 2018, Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - @addtogroup BLE_GAP Generic Access Profile (GAP) - @{ - @brief Definitions and prototypes for the GAP interface. - */ - -#ifndef BLE_GAP_H__ -#define BLE_GAP_H__ - -#include -#include "nrf_svc.h" -#include "nrf_error.h" -#include "ble_hci.h" -#include "ble_ranges.h" -#include "ble_types.h" -#include "ble_err.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/**@addtogroup BLE_GAP_ENUMERATIONS Enumerations - * @{ */ - -/**@brief GAP API SVC numbers. - */ -enum BLE_GAP_SVCS -{ - SD_BLE_GAP_ADDR_SET = BLE_GAP_SVC_BASE, /**< Set own Bluetooth Address. */ - SD_BLE_GAP_ADDR_GET = BLE_GAP_SVC_BASE + 1, /**< Get own Bluetooth Address. */ - SD_BLE_GAP_WHITELIST_SET = BLE_GAP_SVC_BASE + 2, /**< Set active whitelist. */ - SD_BLE_GAP_DEVICE_IDENTITIES_SET = BLE_GAP_SVC_BASE + 3, /**< Set device identity list. */ - SD_BLE_GAP_PRIVACY_SET = BLE_GAP_SVC_BASE + 4, /**< Set Privacy settings*/ - SD_BLE_GAP_PRIVACY_GET = BLE_GAP_SVC_BASE + 5, /**< Get Privacy settings*/ - SD_BLE_GAP_ADV_SET_CONFIGURE = BLE_GAP_SVC_BASE + 6, /**< Configure an advertising set. */ - SD_BLE_GAP_ADV_START = BLE_GAP_SVC_BASE + 7, /**< Start Advertising. */ - SD_BLE_GAP_ADV_STOP = BLE_GAP_SVC_BASE + 8, /**< Stop Advertising. */ - SD_BLE_GAP_CONN_PARAM_UPDATE = BLE_GAP_SVC_BASE + 9, /**< Connection Parameter Update. */ - SD_BLE_GAP_DISCONNECT = BLE_GAP_SVC_BASE + 10, /**< Disconnect. */ - SD_BLE_GAP_TX_POWER_SET = BLE_GAP_SVC_BASE + 11, /**< Set TX Power. */ - SD_BLE_GAP_APPEARANCE_SET = BLE_GAP_SVC_BASE + 12, /**< Set Appearance. */ - SD_BLE_GAP_APPEARANCE_GET = BLE_GAP_SVC_BASE + 13, /**< Get Appearance. */ - SD_BLE_GAP_PPCP_SET = BLE_GAP_SVC_BASE + 14, /**< Set PPCP. */ - SD_BLE_GAP_PPCP_GET = BLE_GAP_SVC_BASE + 15, /**< Get PPCP. */ - SD_BLE_GAP_DEVICE_NAME_SET = BLE_GAP_SVC_BASE + 16, /**< Set Device Name. */ - SD_BLE_GAP_DEVICE_NAME_GET = BLE_GAP_SVC_BASE + 17, /**< Get Device Name. */ - SD_BLE_GAP_AUTHENTICATE = BLE_GAP_SVC_BASE + 18, /**< Initiate Pairing/Bonding. */ - SD_BLE_GAP_SEC_PARAMS_REPLY = BLE_GAP_SVC_BASE + 19, /**< Reply with Security Parameters. */ - SD_BLE_GAP_AUTH_KEY_REPLY = BLE_GAP_SVC_BASE + 20, /**< Reply with an authentication key. */ - SD_BLE_GAP_LESC_DHKEY_REPLY = BLE_GAP_SVC_BASE + 21, /**< Reply with an LE Secure Connections DHKey. */ - SD_BLE_GAP_KEYPRESS_NOTIFY = BLE_GAP_SVC_BASE + 22, /**< Notify of a keypress during an authentication procedure. */ - SD_BLE_GAP_LESC_OOB_DATA_GET = BLE_GAP_SVC_BASE + 23, /**< Get the local LE Secure Connections OOB data. */ - SD_BLE_GAP_LESC_OOB_DATA_SET = BLE_GAP_SVC_BASE + 24, /**< Set the remote LE Secure Connections OOB data. */ - SD_BLE_GAP_ENCRYPT = BLE_GAP_SVC_BASE + 25, /**< Initiate encryption procedure. */ - SD_BLE_GAP_SEC_INFO_REPLY = BLE_GAP_SVC_BASE + 26, /**< Reply with Security Information. */ - SD_BLE_GAP_CONN_SEC_GET = BLE_GAP_SVC_BASE + 27, /**< Obtain connection security level. */ - SD_BLE_GAP_RSSI_START = BLE_GAP_SVC_BASE + 28, /**< Start reporting of changes in RSSI. */ - SD_BLE_GAP_RSSI_STOP = BLE_GAP_SVC_BASE + 29, /**< Stop reporting of changes in RSSI. */ - SD_BLE_GAP_SCAN_START = BLE_GAP_SVC_BASE + 30, /**< Start Scanning. */ - SD_BLE_GAP_SCAN_STOP = BLE_GAP_SVC_BASE + 31, /**< Stop Scanning. */ - SD_BLE_GAP_CONNECT = BLE_GAP_SVC_BASE + 32, /**< Connect. */ - SD_BLE_GAP_CONNECT_CANCEL = BLE_GAP_SVC_BASE + 33, /**< Cancel ongoing connection procedure. */ - SD_BLE_GAP_RSSI_GET = BLE_GAP_SVC_BASE + 34, /**< Get the last RSSI sample. */ - SD_BLE_GAP_PHY_UPDATE = BLE_GAP_SVC_BASE + 35, /**< Initiate or respond to a PHY Update Procedure. */ - SD_BLE_GAP_DATA_LENGTH_UPDATE = BLE_GAP_SVC_BASE + 36, /**< Initiate or respond to a Data Length Update Procedure. */ - SD_BLE_GAP_QOS_CHANNEL_SURVEY_START = BLE_GAP_SVC_BASE + 37, /**< Start Quality of Service (QoS) channel survey module. */ - SD_BLE_GAP_QOS_CHANNEL_SURVEY_STOP = BLE_GAP_SVC_BASE + 38, /**< Stop Quality of Service (QoS) channel survey module. */ - SD_BLE_GAP_ADV_ADDR_GET = BLE_GAP_SVC_BASE + 39, /**< Get the Address used on air while Advertising. */ -}; - -/**@brief GAP Event IDs. - * IDs that uniquely identify an event coming from the stack to the application. - */ -enum BLE_GAP_EVTS -{ - BLE_GAP_EVT_CONNECTED = BLE_GAP_EVT_BASE, /**< Connected to peer. \n See @ref ble_gap_evt_connected_t */ - BLE_GAP_EVT_DISCONNECTED = BLE_GAP_EVT_BASE + 1, /**< Disconnected from peer. \n See @ref ble_gap_evt_disconnected_t. */ - BLE_GAP_EVT_CONN_PARAM_UPDATE = BLE_GAP_EVT_BASE + 2, /**< Connection Parameters updated. \n See @ref ble_gap_evt_conn_param_update_t. */ - BLE_GAP_EVT_SEC_PARAMS_REQUEST = BLE_GAP_EVT_BASE + 3, /**< Request to provide security parameters. \n Reply with @ref sd_ble_gap_sec_params_reply. \n See @ref ble_gap_evt_sec_params_request_t. */ - BLE_GAP_EVT_SEC_INFO_REQUEST = BLE_GAP_EVT_BASE + 4, /**< Request to provide security information. \n Reply with @ref sd_ble_gap_sec_info_reply. \n See @ref ble_gap_evt_sec_info_request_t. */ - BLE_GAP_EVT_PASSKEY_DISPLAY = BLE_GAP_EVT_BASE + 5, /**< Request to display a passkey to the user. \n In LESC Numeric Comparison, reply with @ref sd_ble_gap_auth_key_reply. \n See @ref ble_gap_evt_passkey_display_t. */ - BLE_GAP_EVT_KEY_PRESSED = BLE_GAP_EVT_BASE + 6, /**< Notification of a keypress on the remote device.\n See @ref ble_gap_evt_key_pressed_t */ - BLE_GAP_EVT_AUTH_KEY_REQUEST = BLE_GAP_EVT_BASE + 7, /**< Request to provide an authentication key. \n Reply with @ref sd_ble_gap_auth_key_reply. \n See @ref ble_gap_evt_auth_key_request_t. */ - BLE_GAP_EVT_LESC_DHKEY_REQUEST = BLE_GAP_EVT_BASE + 8, /**< Request to calculate an LE Secure Connections DHKey. \n Reply with @ref sd_ble_gap_lesc_dhkey_reply. \n See @ref ble_gap_evt_lesc_dhkey_request_t */ - BLE_GAP_EVT_AUTH_STATUS = BLE_GAP_EVT_BASE + 9, /**< Authentication procedure completed with status. \n See @ref ble_gap_evt_auth_status_t. */ - BLE_GAP_EVT_CONN_SEC_UPDATE = BLE_GAP_EVT_BASE + 10, /**< Connection security updated. \n See @ref ble_gap_evt_conn_sec_update_t. */ - BLE_GAP_EVT_TIMEOUT = BLE_GAP_EVT_BASE + 11, /**< Timeout expired. \n See @ref ble_gap_evt_timeout_t. */ - BLE_GAP_EVT_RSSI_CHANGED = BLE_GAP_EVT_BASE + 12, /**< RSSI report. \n See @ref ble_gap_evt_rssi_changed_t. */ - BLE_GAP_EVT_ADV_REPORT = BLE_GAP_EVT_BASE + 13, /**< Advertising report. \n See @ref ble_gap_evt_adv_report_t. */ - BLE_GAP_EVT_SEC_REQUEST = BLE_GAP_EVT_BASE + 14, /**< Security Request. \n See @ref ble_gap_evt_sec_request_t. */ - BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST = BLE_GAP_EVT_BASE + 15, /**< Connection Parameter Update Request. \n Reply with @ref sd_ble_gap_conn_param_update. \n See @ref ble_gap_evt_conn_param_update_request_t. */ - BLE_GAP_EVT_SCAN_REQ_REPORT = BLE_GAP_EVT_BASE + 16, /**< Scan request report. \n See @ref ble_gap_evt_scan_req_report_t. */ - BLE_GAP_EVT_PHY_UPDATE_REQUEST = BLE_GAP_EVT_BASE + 17, /**< PHY Update Request. \n Reply with @ref sd_ble_gap_phy_update. \n See @ref ble_gap_evt_phy_update_request_t. */ - BLE_GAP_EVT_PHY_UPDATE = BLE_GAP_EVT_BASE + 18, /**< PHY Update Procedure is complete. \n See @ref ble_gap_evt_phy_update_t. */ - BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST = BLE_GAP_EVT_BASE + 19, /**< Data Length Update Request. \n Reply with @ref sd_ble_gap_data_length_update.\n See @ref ble_gap_evt_data_length_update_request_t. */ - BLE_GAP_EVT_DATA_LENGTH_UPDATE = BLE_GAP_EVT_BASE + 20, /**< LL Data Channel PDU payload length updated. \n See @ref ble_gap_evt_data_length_update_t. */ - BLE_GAP_EVT_QOS_CHANNEL_SURVEY_REPORT = BLE_GAP_EVT_BASE + 21, /**< Channel survey report. \n See @ref ble_gap_evt_qos_channel_survey_report_t. */ - BLE_GAP_EVT_ADV_SET_TERMINATED = BLE_GAP_EVT_BASE + 22, /**< Advertising set terminated. \n See @ref ble_gap_evt_adv_set_terminated_t. */ -}; - -/**@brief GAP Option IDs. - * IDs that uniquely identify a GAP option. - */ -enum BLE_GAP_OPTS -{ - BLE_GAP_OPT_CH_MAP = BLE_GAP_OPT_BASE, /**< Channel Map. @ref ble_gap_opt_ch_map_t */ - BLE_GAP_OPT_LOCAL_CONN_LATENCY = BLE_GAP_OPT_BASE + 1, /**< Local connection latency. @ref ble_gap_opt_local_conn_latency_t */ - BLE_GAP_OPT_PASSKEY = BLE_GAP_OPT_BASE + 2, /**< Set passkey. @ref ble_gap_opt_passkey_t */ - BLE_GAP_OPT_COMPAT_MODE_1 = BLE_GAP_OPT_BASE + 3, /**< Compatibility mode. @ref ble_gap_opt_compat_mode_1_t */ - BLE_GAP_OPT_AUTH_PAYLOAD_TIMEOUT = BLE_GAP_OPT_BASE + 4, /**< Set Authenticated payload timeout. @ref ble_gap_opt_auth_payload_timeout_t */ - BLE_GAP_OPT_SLAVE_LATENCY_DISABLE = BLE_GAP_OPT_BASE + 5, /**< Disable slave latency. @ref ble_gap_opt_slave_latency_disable_t */ -}; - -/**@brief GAP Configuration IDs. - * - * IDs that uniquely identify a GAP configuration. - */ -enum BLE_GAP_CFGS -{ - BLE_GAP_CFG_ROLE_COUNT = BLE_GAP_CFG_BASE, /**< Role count configuration. */ - BLE_GAP_CFG_DEVICE_NAME = BLE_GAP_CFG_BASE + 1, /**< Device name configuration. */ -}; - -/**@brief GAP TX Power roles. - */ -enum BLE_GAP_TX_POWER_ROLES -{ - BLE_GAP_TX_POWER_ROLE_ADV = 1, /**< Advertiser role. */ - BLE_GAP_TX_POWER_ROLE_SCAN_INIT = 2, /**< Scanner and initiator role. */ - BLE_GAP_TX_POWER_ROLE_CONN = 3, /**< Connection role. */ -}; - -/** @} */ - -/**@addtogroup BLE_GAP_DEFINES Defines - * @{ */ - -/**@defgroup BLE_ERRORS_GAP SVC return values specific to GAP - * @{ */ -#define BLE_ERROR_GAP_UUID_LIST_MISMATCH (NRF_GAP_ERR_BASE + 0x000) /**< UUID list does not contain an integral number of UUIDs. */ -#define BLE_ERROR_GAP_DISCOVERABLE_WITH_WHITELIST (NRF_GAP_ERR_BASE + 0x001) /**< Use of Whitelist not permitted with discoverable advertising. */ -#define BLE_ERROR_GAP_INVALID_BLE_ADDR (NRF_GAP_ERR_BASE + 0x002) /**< The upper two bits of the address do not correspond to the specified address type. */ -#define BLE_ERROR_GAP_WHITELIST_IN_USE (NRF_GAP_ERR_BASE + 0x003) /**< Attempt to modify the whitelist while already in use by another operation. */ -#define BLE_ERROR_GAP_DEVICE_IDENTITIES_IN_USE (NRF_GAP_ERR_BASE + 0x004) /**< Attempt to modify the device identity list while already in use by another operation. */ -#define BLE_ERROR_GAP_DEVICE_IDENTITIES_DUPLICATE (NRF_GAP_ERR_BASE + 0x005) /**< The device identity list contains entries with duplicate identity addresses. */ -/**@} */ - - -/**@defgroup BLE_GAP_ROLES GAP Roles - * @{ */ -#define BLE_GAP_ROLE_INVALID 0x0 /**< Invalid Role. */ -#define BLE_GAP_ROLE_PERIPH 0x1 /**< Peripheral Role. */ -#define BLE_GAP_ROLE_CENTRAL 0x2 /**< Central Role. */ -/**@} */ - - -/**@defgroup BLE_GAP_TIMEOUT_SOURCES GAP Timeout sources - * @{ */ -#define BLE_GAP_TIMEOUT_SRC_SCAN 0x01 /**< Scanning timeout. */ -#define BLE_GAP_TIMEOUT_SRC_CONN 0x02 /**< Connection timeout. */ -#define BLE_GAP_TIMEOUT_SRC_AUTH_PAYLOAD 0x03 /**< Authenticated payload timeout. */ -/**@} */ - - -/**@defgroup BLE_GAP_ADDR_TYPES GAP Address types - * @{ */ -#define BLE_GAP_ADDR_TYPE_PUBLIC 0x00 /**< Public (identity) address.*/ -#define BLE_GAP_ADDR_TYPE_RANDOM_STATIC 0x01 /**< Random static (identity) address. */ -#define BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE 0x02 /**< Random private resolvable address. */ -#define BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_NON_RESOLVABLE 0x03 /**< Random private non-resolvable address. */ -#define BLE_GAP_ADDR_TYPE_ANONYMOUS 0x7F /**< An advertiser may advertise without its address. - This type of advertising is called anonymous. */ -/**@} */ - - -/**@brief The default interval in seconds at which a private address is refreshed. */ -#define BLE_GAP_DEFAULT_PRIVATE_ADDR_CYCLE_INTERVAL_S (900) /* 15 minutes. */ -/**@brief The maximum interval in seconds at which a private address can be refreshed. */ -#define BLE_GAP_MAX_PRIVATE_ADDR_CYCLE_INTERVAL_S (41400) /* 11 hours 30 minutes. */ - - -/** @brief BLE address length. */ -#define BLE_GAP_ADDR_LEN (6) - -/**@defgroup BLE_GAP_PRIVACY_MODES Privacy modes - * @{ */ -#define BLE_GAP_PRIVACY_MODE_OFF 0x00 /**< Device will send and accept its identity address for its own address. */ -#define BLE_GAP_PRIVACY_MODE_DEVICE_PRIVACY 0x01 /**< Device will send and accept only private addresses for its own address. */ -#define BLE_GAP_PRIVACY_MODE_NETWORK_PRIVACY 0x02 /**< Device will send and accept only private addresses for its own address, - and will not accept a peer using identity address as sender address when - the peer IRK is exchanged, non-zero and added to the identity list. */ -/**@} */ - -/** @brief Invalid power level. */ -#define BLE_GAP_POWER_LEVEL_INVALID 127 - -/** @brief Advertising set handle not set. */ -#define BLE_GAP_ADV_SET_HANDLE_NOT_SET (0xFF) - -/** @brief The default number of advertising sets. */ -#define BLE_GAP_ADV_SET_COUNT_DEFAULT (1) - -/** @brief The maximum number of advertising sets supported by this SoftDevice. */ -#define BLE_GAP_ADV_SET_COUNT_MAX (1) - -/**@defgroup BLE_GAP_ADV_SET_DATA_SIZES Advertising data sizes. - * @{ */ -#define BLE_GAP_ADV_SET_DATA_SIZE_MAX (31) /**< Maximum data length for an advertising set. - If more advertising data is required, use extended advertising instead. */ -#define BLE_GAP_ADV_SET_DATA_SIZE_EXTENDED_MAX_SUPPORTED (255) /**< Maximum supported data length for an extended advertising set. */ - -#define BLE_GAP_ADV_SET_DATA_SIZE_EXTENDED_CONNECTABLE_MAX_SUPPORTED (238) /**< Maximum supported data length for an extended connectable advertising set. */ -/**@}. */ - -/** @brief Set ID not available in advertising report. */ -#define BLE_GAP_ADV_REPORT_SET_ID_NOT_AVAILABLE 0xFF - -/**@defgroup BLE_GAP_EVT_ADV_SET_TERMINATED_REASON GAP Advertising Set Terminated reasons - * @{ */ -#define BLE_GAP_EVT_ADV_SET_TERMINATED_REASON_TIMEOUT 0x01 /**< Timeout value reached. */ -#define BLE_GAP_EVT_ADV_SET_TERMINATED_REASON_LIMIT_REACHED 0x02 /**< @ref ble_gap_adv_params_t::max_adv_evts was reached. */ -/**@} */ - -/**@defgroup BLE_GAP_AD_TYPE_DEFINITIONS GAP Advertising and Scan Response Data format - * @note Found at https://www.bluetooth.org/Technical/AssignedNumbers/generic_access_profile.htm - * @{ */ -#define BLE_GAP_AD_TYPE_FLAGS 0x01 /**< Flags for discoverability. */ -#define BLE_GAP_AD_TYPE_16BIT_SERVICE_UUID_MORE_AVAILABLE 0x02 /**< Partial list of 16 bit service UUIDs. */ -#define BLE_GAP_AD_TYPE_16BIT_SERVICE_UUID_COMPLETE 0x03 /**< Complete list of 16 bit service UUIDs. */ -#define BLE_GAP_AD_TYPE_32BIT_SERVICE_UUID_MORE_AVAILABLE 0x04 /**< Partial list of 32 bit service UUIDs. */ -#define BLE_GAP_AD_TYPE_32BIT_SERVICE_UUID_COMPLETE 0x05 /**< Complete list of 32 bit service UUIDs. */ -#define BLE_GAP_AD_TYPE_128BIT_SERVICE_UUID_MORE_AVAILABLE 0x06 /**< Partial list of 128 bit service UUIDs. */ -#define BLE_GAP_AD_TYPE_128BIT_SERVICE_UUID_COMPLETE 0x07 /**< Complete list of 128 bit service UUIDs. */ -#define BLE_GAP_AD_TYPE_SHORT_LOCAL_NAME 0x08 /**< Short local device name. */ -#define BLE_GAP_AD_TYPE_COMPLETE_LOCAL_NAME 0x09 /**< Complete local device name. */ -#define BLE_GAP_AD_TYPE_TX_POWER_LEVEL 0x0A /**< Transmit power level. */ -#define BLE_GAP_AD_TYPE_CLASS_OF_DEVICE 0x0D /**< Class of device. */ -#define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_HASH_C 0x0E /**< Simple Pairing Hash C. */ -#define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_RANDOMIZER_R 0x0F /**< Simple Pairing Randomizer R. */ -#define BLE_GAP_AD_TYPE_SECURITY_MANAGER_TK_VALUE 0x10 /**< Security Manager TK Value. */ -#define BLE_GAP_AD_TYPE_SECURITY_MANAGER_OOB_FLAGS 0x11 /**< Security Manager Out Of Band Flags. */ -#define BLE_GAP_AD_TYPE_SLAVE_CONNECTION_INTERVAL_RANGE 0x12 /**< Slave Connection Interval Range. */ -#define BLE_GAP_AD_TYPE_SOLICITED_SERVICE_UUIDS_16BIT 0x14 /**< List of 16-bit Service Solicitation UUIDs. */ -#define BLE_GAP_AD_TYPE_SOLICITED_SERVICE_UUIDS_128BIT 0x15 /**< List of 128-bit Service Solicitation UUIDs. */ -#define BLE_GAP_AD_TYPE_SERVICE_DATA 0x16 /**< Service Data - 16-bit UUID. */ -#define BLE_GAP_AD_TYPE_PUBLIC_TARGET_ADDRESS 0x17 /**< Public Target Address. */ -#define BLE_GAP_AD_TYPE_RANDOM_TARGET_ADDRESS 0x18 /**< Random Target Address. */ -#define BLE_GAP_AD_TYPE_APPEARANCE 0x19 /**< Appearance. */ -#define BLE_GAP_AD_TYPE_ADVERTISING_INTERVAL 0x1A /**< Advertising Interval. */ -#define BLE_GAP_AD_TYPE_LE_BLUETOOTH_DEVICE_ADDRESS 0x1B /**< LE Bluetooth Device Address. */ -#define BLE_GAP_AD_TYPE_LE_ROLE 0x1C /**< LE Role. */ -#define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_HASH_C256 0x1D /**< Simple Pairing Hash C-256. */ -#define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_RANDOMIZER_R256 0x1E /**< Simple Pairing Randomizer R-256. */ -#define BLE_GAP_AD_TYPE_SERVICE_DATA_32BIT_UUID 0x20 /**< Service Data - 32-bit UUID. */ -#define BLE_GAP_AD_TYPE_SERVICE_DATA_128BIT_UUID 0x21 /**< Service Data - 128-bit UUID. */ -#define BLE_GAP_AD_TYPE_LESC_CONFIRMATION_VALUE 0x22 /**< LE Secure Connections Confirmation Value */ -#define BLE_GAP_AD_TYPE_LESC_RANDOM_VALUE 0x23 /**< LE Secure Connections Random Value */ -#define BLE_GAP_AD_TYPE_URI 0x24 /**< URI */ -#define BLE_GAP_AD_TYPE_3D_INFORMATION_DATA 0x3D /**< 3D Information Data. */ -#define BLE_GAP_AD_TYPE_MANUFACTURER_SPECIFIC_DATA 0xFF /**< Manufacturer Specific Data. */ -/**@} */ - - -/**@defgroup BLE_GAP_ADV_FLAGS GAP Advertisement Flags - * @{ */ -#define BLE_GAP_ADV_FLAG_LE_LIMITED_DISC_MODE (0x01) /**< LE Limited Discoverable Mode. */ -#define BLE_GAP_ADV_FLAG_LE_GENERAL_DISC_MODE (0x02) /**< LE General Discoverable Mode. */ -#define BLE_GAP_ADV_FLAG_BR_EDR_NOT_SUPPORTED (0x04) /**< BR/EDR not supported. */ -#define BLE_GAP_ADV_FLAG_LE_BR_EDR_CONTROLLER (0x08) /**< Simultaneous LE and BR/EDR, Controller. */ -#define BLE_GAP_ADV_FLAG_LE_BR_EDR_HOST (0x10) /**< Simultaneous LE and BR/EDR, Host. */ -#define BLE_GAP_ADV_FLAGS_LE_ONLY_LIMITED_DISC_MODE (BLE_GAP_ADV_FLAG_LE_LIMITED_DISC_MODE | BLE_GAP_ADV_FLAG_BR_EDR_NOT_SUPPORTED) /**< LE Limited Discoverable Mode, BR/EDR not supported. */ -#define BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE (BLE_GAP_ADV_FLAG_LE_GENERAL_DISC_MODE | BLE_GAP_ADV_FLAG_BR_EDR_NOT_SUPPORTED) /**< LE General Discoverable Mode, BR/EDR not supported. */ -/**@} */ - - -/**@defgroup BLE_GAP_ADV_INTERVALS GAP Advertising interval max and min - * @{ */ -#define BLE_GAP_ADV_INTERVAL_MIN 0x000020 /**< Minimum Advertising interval in 625 us units, i.e. 20 ms. */ -#define BLE_GAP_ADV_INTERVAL_MAX 0x004000 /**< Maximum Advertising interval in 625 us units, i.e. 10.24 s. */ - /**@} */ - - -/**@defgroup BLE_GAP_SCAN_INTERVALS GAP Scan interval max and min - * @{ */ -#define BLE_GAP_SCAN_INTERVAL_MIN 0x0004 /**< Minimum Scan interval in 625 us units, i.e. 2.5 ms. */ -#define BLE_GAP_SCAN_INTERVAL_MAX 0xFFFF /**< Maximum Scan interval in 625 us units, i.e. 40,959.375 s. */ - /** @} */ - - -/**@defgroup BLE_GAP_SCAN_WINDOW GAP Scan window max and min - * @{ */ -#define BLE_GAP_SCAN_WINDOW_MIN 0x0004 /**< Minimum Scan window in 625 us units, i.e. 2.5 ms. */ -#define BLE_GAP_SCAN_WINDOW_MAX 0xFFFF /**< Maximum Scan window in 625 us units, i.e. 40,959.375 s. */ - /** @} */ - - -/**@defgroup BLE_GAP_SCAN_TIMEOUT GAP Scan timeout max and min - * @{ */ -#define BLE_GAP_SCAN_TIMEOUT_MIN 0x0001 /**< Minimum Scan timeout in 10 ms units, i.e 10 ms. */ -#define BLE_GAP_SCAN_TIMEOUT_UNLIMITED 0x0000 /**< Continue to scan forever. */ - /** @} */ - -/**@defgroup BLE_GAP_SCAN_BUFFER_SIZE GAP Minimum scanner buffer size - * - * Scan buffers are used for storing advertising data received from an advertiser. - * If ble_gap_scan_params_t::extended is set to 0, @ref BLE_GAP_SCAN_BUFFER_MIN is the minimum scan buffer length. - * else the minimum scan buffer size is @ref BLE_GAP_SCAN_BUFFER_EXTENDED_MIN. - * @{ */ -#define BLE_GAP_SCAN_BUFFER_MIN (31) /**< Minimum data length for an - advertising set. */ -#define BLE_GAP_SCAN_BUFFER_MAX (31) /**< Maximum data length for an - advertising set. */ -#define BLE_GAP_SCAN_BUFFER_EXTENDED_MIN (255) /**< Minimum data length for an - extended advertising set. */ -#define BLE_GAP_SCAN_BUFFER_EXTENDED_MAX (1650) /**< Maximum data length for an - extended advertising set. */ -#define BLE_GAP_SCAN_BUFFER_EXTENDED_MAX_SUPPORTED (255) /**< Maximum supported data length for - an extended advertising set. */ -/** @} */ - -/**@defgroup BLE_GAP_ADV_TYPES GAP Advertising types - * - * Advertising types defined in Bluetooth Core Specification v5.0, Vol 6, Part B, Section 4.4.2. - * - * The maximum advertising data length is defined by @ref BLE_GAP_ADV_SET_DATA_SIZE_MAX. - * The maximum supported data length for an extended advertiser is defined by - * @ref BLE_GAP_ADV_SET_DATA_SIZE_EXTENDED_MAX_SUPPORTED - * Note that some of the advertising types do not support advertising data. Non-scannable types do not support - * scan response data. - * - * @{ */ -#define BLE_GAP_ADV_TYPE_CONNECTABLE_SCANNABLE_UNDIRECTED 0x01 /**< Connectable and scannable undirected - advertising events. */ -#define BLE_GAP_ADV_TYPE_CONNECTABLE_NONSCANNABLE_DIRECTED_HIGH_DUTY_CYCLE 0x02 /**< Connectable non-scannable directed advertising - events. Advertising interval is less that 3.75 ms. - Use this type for fast reconnections. - @note Advertising data is not supported. */ -#define BLE_GAP_ADV_TYPE_CONNECTABLE_NONSCANNABLE_DIRECTED 0x03 /**< Connectable non-scannable directed advertising - events. - @note Advertising data is not supported. */ -#define BLE_GAP_ADV_TYPE_NONCONNECTABLE_SCANNABLE_UNDIRECTED 0x04 /**< Non-connectable scannable undirected - advertising events. */ -#define BLE_GAP_ADV_TYPE_NONCONNECTABLE_NONSCANNABLE_UNDIRECTED 0x05 /**< Non-connectable non-scannable undirected - advertising events. */ -#define BLE_GAP_ADV_TYPE_EXTENDED_CONNECTABLE_NONSCANNABLE_UNDIRECTED 0x06 /**< Connectable non-scannable undirected advertising - events using extended advertising PDUs. */ -#define BLE_GAP_ADV_TYPE_EXTENDED_CONNECTABLE_NONSCANNABLE_DIRECTED 0x07 /**< Connectable non-scannable directed advertising - events using extended advertising PDUs. */ -#define BLE_GAP_ADV_TYPE_EXTENDED_NONCONNECTABLE_SCANNABLE_UNDIRECTED 0x08 /**< Non-connectable scannable undirected advertising - events using extended advertising PDUs. - @note Only scan response data is supported. */ -#define BLE_GAP_ADV_TYPE_EXTENDED_NONCONNECTABLE_SCANNABLE_DIRECTED 0x09 /**< Non-connectable scannable directed advertising - events using extended advertising PDUs. - @note Only scan response data is supported. */ -#define BLE_GAP_ADV_TYPE_EXTENDED_NONCONNECTABLE_NONSCANNABLE_UNDIRECTED 0x0A /**< Non-connectable non-scannable undirected advertising - events using extended advertising PDUs. */ -#define BLE_GAP_ADV_TYPE_EXTENDED_NONCONNECTABLE_NONSCANNABLE_DIRECTED 0x0B /**< Non-connectable non-scannable directed advertising - events using extended advertising PDUs. */ -/**@} */ - -/**@defgroup BLE_GAP_ADV_FILTER_POLICIES GAP Advertising filter policies - * @{ */ -#define BLE_GAP_ADV_FP_ANY 0x00 /**< Allow scan requests and connect requests from any device. */ -#define BLE_GAP_ADV_FP_FILTER_SCANREQ 0x01 /**< Filter scan requests with whitelist. */ -#define BLE_GAP_ADV_FP_FILTER_CONNREQ 0x02 /**< Filter connect requests with whitelist. */ -#define BLE_GAP_ADV_FP_FILTER_BOTH 0x03 /**< Filter both scan and connect requests with whitelist. */ -/**@} */ - -/**@defgroup BLE_GAP_ADV_DATA_STATUS GAP Advertising data status - * @{ */ -#define BLE_GAP_ADV_DATA_STATUS_COMPLETE 0x00 /**< All data in the advertising event have been received. */ -#define BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA 0x01 /**< More data to be received. - @note This value will only be used if - @ref ble_gap_scan_params_t::report_incomplete_evts and - @ref ble_gap_adv_report_type_t::extended_pdu are set to true. */ -#define BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_TRUNCATED 0x02 /**< Incomplete data. Buffer size insufficient to receive more. - @note This value will only be used if - @ref ble_gap_adv_report_type_t::extended_pdu is set to true. */ -#define BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MISSED 0x03 /**< Failed to receive the remaining data. - @note This value will only be used if - @ref ble_gap_adv_report_type_t::extended_pdu is set to true. */ -/**@} */ - -/**@defgroup BLE_GAP_SCAN_FILTER_POLICIES GAP Scanner filter policies - * @{ */ -#define BLE_GAP_SCAN_FP_ACCEPT_ALL 0x00 /**< Accept all advertising packets except directed advertising packets - not addressed to this device. */ -#define BLE_GAP_SCAN_FP_WHITELIST 0x01 /**< Accept advertising packets from devices in the whitelist except directed - packets not addressed to this device. */ -#define BLE_GAP_SCAN_FP_ALL_NOT_RESOLVED_DIRECTED 0x02 /**< Accept all advertising packets specified in @ref BLE_GAP_SCAN_FP_ACCEPT_ALL. - In addition, accept directed advertising packets, where the advertiser's - address is a resolvable private address that cannot be resolved. */ -#define BLE_GAP_SCAN_FP_WHITELIST_NOT_RESOLVED_DIRECTED 0x03 /**< Accept all advertising packets specified in @ref BLE_GAP_SCAN_FP_WHITELIST. - In addition, accept directed advertising packets, where the advertiser's - address is a resolvable private address that cannot be resolved. */ -/**@} */ - -/**@defgroup BLE_GAP_ADV_TIMEOUT_VALUES GAP Advertising timeout values in 10 ms units - * @{ */ -#define BLE_GAP_ADV_TIMEOUT_HIGH_DUTY_MAX (128) /**< Maximum high duty advertising time in 10 ms units. Corresponds to 1.28 s. */ -#define BLE_GAP_ADV_TIMEOUT_LIMITED_MAX (18000) /**< Maximum advertising time in 10 ms units corresponding to TGAP(lim_adv_timeout) = 180 s in limited discoverable mode. */ -#define BLE_GAP_ADV_TIMEOUT_GENERAL_UNLIMITED (0) /**< Unlimited advertising in general discoverable mode. - For high duty cycle advertising, this corresponds to @ref BLE_GAP_ADV_TIMEOUT_HIGH_DUTY_MAX. */ -/**@} */ - - -/**@defgroup BLE_GAP_DISC_MODES GAP Discovery modes - * @{ */ -#define BLE_GAP_DISC_MODE_NOT_DISCOVERABLE 0x00 /**< Not discoverable discovery Mode. */ -#define BLE_GAP_DISC_MODE_LIMITED 0x01 /**< Limited Discovery Mode. */ -#define BLE_GAP_DISC_MODE_GENERAL 0x02 /**< General Discovery Mode. */ -/**@} */ - - -/**@defgroup BLE_GAP_IO_CAPS GAP IO Capabilities - * @{ */ -#define BLE_GAP_IO_CAPS_DISPLAY_ONLY 0x00 /**< Display Only. */ -#define BLE_GAP_IO_CAPS_DISPLAY_YESNO 0x01 /**< Display and Yes/No entry. */ -#define BLE_GAP_IO_CAPS_KEYBOARD_ONLY 0x02 /**< Keyboard Only. */ -#define BLE_GAP_IO_CAPS_NONE 0x03 /**< No I/O capabilities. */ -#define BLE_GAP_IO_CAPS_KEYBOARD_DISPLAY 0x04 /**< Keyboard and Display. */ -/**@} */ - - -/**@defgroup BLE_GAP_AUTH_KEY_TYPES GAP Authentication Key Types - * @{ */ -#define BLE_GAP_AUTH_KEY_TYPE_NONE 0x00 /**< No key (may be used to reject). */ -#define BLE_GAP_AUTH_KEY_TYPE_PASSKEY 0x01 /**< 6-digit Passkey. */ -#define BLE_GAP_AUTH_KEY_TYPE_OOB 0x02 /**< Out Of Band data. */ -/**@} */ - - -/**@defgroup BLE_GAP_KP_NOT_TYPES GAP Keypress Notification Types - * @{ */ -#define BLE_GAP_KP_NOT_TYPE_PASSKEY_START 0x00 /**< Passkey entry started. */ -#define BLE_GAP_KP_NOT_TYPE_PASSKEY_DIGIT_IN 0x01 /**< Passkey digit entered. */ -#define BLE_GAP_KP_NOT_TYPE_PASSKEY_DIGIT_OUT 0x02 /**< Passkey digit erased. */ -#define BLE_GAP_KP_NOT_TYPE_PASSKEY_CLEAR 0x03 /**< Passkey cleared. */ -#define BLE_GAP_KP_NOT_TYPE_PASSKEY_END 0x04 /**< Passkey entry completed. */ -/**@} */ - - -/**@defgroup BLE_GAP_SEC_STATUS GAP Security status - * @{ */ -#define BLE_GAP_SEC_STATUS_SUCCESS 0x00 /**< Procedure completed with success. */ -#define BLE_GAP_SEC_STATUS_TIMEOUT 0x01 /**< Procedure timed out. */ -#define BLE_GAP_SEC_STATUS_PDU_INVALID 0x02 /**< Invalid PDU received. */ -#define BLE_GAP_SEC_STATUS_RFU_RANGE1_BEGIN 0x03 /**< Reserved for Future Use range #1 begin. */ -#define BLE_GAP_SEC_STATUS_RFU_RANGE1_END 0x80 /**< Reserved for Future Use range #1 end. */ -#define BLE_GAP_SEC_STATUS_PASSKEY_ENTRY_FAILED 0x81 /**< Passkey entry failed (user canceled or other). */ -#define BLE_GAP_SEC_STATUS_OOB_NOT_AVAILABLE 0x82 /**< Out of Band Key not available. */ -#define BLE_GAP_SEC_STATUS_AUTH_REQ 0x83 /**< Authentication requirements not met. */ -#define BLE_GAP_SEC_STATUS_CONFIRM_VALUE 0x84 /**< Confirm value failed. */ -#define BLE_GAP_SEC_STATUS_PAIRING_NOT_SUPP 0x85 /**< Pairing not supported. */ -#define BLE_GAP_SEC_STATUS_ENC_KEY_SIZE 0x86 /**< Encryption key size. */ -#define BLE_GAP_SEC_STATUS_SMP_CMD_UNSUPPORTED 0x87 /**< Unsupported SMP command. */ -#define BLE_GAP_SEC_STATUS_UNSPECIFIED 0x88 /**< Unspecified reason. */ -#define BLE_GAP_SEC_STATUS_REPEATED_ATTEMPTS 0x89 /**< Too little time elapsed since last attempt. */ -#define BLE_GAP_SEC_STATUS_INVALID_PARAMS 0x8A /**< Invalid parameters. */ -#define BLE_GAP_SEC_STATUS_DHKEY_FAILURE 0x8B /**< DHKey check failure. */ -#define BLE_GAP_SEC_STATUS_NUM_COMP_FAILURE 0x8C /**< Numeric Comparison failure. */ -#define BLE_GAP_SEC_STATUS_BR_EDR_IN_PROG 0x8D /**< BR/EDR pairing in progress. */ -#define BLE_GAP_SEC_STATUS_X_TRANS_KEY_DISALLOWED 0x8E /**< BR/EDR Link Key cannot be used for LE keys. */ -#define BLE_GAP_SEC_STATUS_RFU_RANGE2_BEGIN 0x8F /**< Reserved for Future Use range #2 begin. */ -#define BLE_GAP_SEC_STATUS_RFU_RANGE2_END 0xFF /**< Reserved for Future Use range #2 end. */ -/**@} */ - - -/**@defgroup BLE_GAP_SEC_STATUS_SOURCES GAP Security status sources - * @{ */ -#define BLE_GAP_SEC_STATUS_SOURCE_LOCAL 0x00 /**< Local failure. */ -#define BLE_GAP_SEC_STATUS_SOURCE_REMOTE 0x01 /**< Remote failure. */ -/**@} */ - - -/**@defgroup BLE_GAP_CP_LIMITS GAP Connection Parameters Limits - * @{ */ -#define BLE_GAP_CP_MIN_CONN_INTVL_NONE 0xFFFF /**< No new minimum connection interval specified in connect parameters. */ -#define BLE_GAP_CP_MIN_CONN_INTVL_MIN 0x0006 /**< Lowest minimum connection interval permitted, in units of 1.25 ms, i.e. 7.5 ms. */ -#define BLE_GAP_CP_MIN_CONN_INTVL_MAX 0x0C80 /**< Highest minimum connection interval permitted, in units of 1.25 ms, i.e. 4 s. */ -#define BLE_GAP_CP_MAX_CONN_INTVL_NONE 0xFFFF /**< No new maximum connection interval specified in connect parameters. */ -#define BLE_GAP_CP_MAX_CONN_INTVL_MIN 0x0006 /**< Lowest maximum connection interval permitted, in units of 1.25 ms, i.e. 7.5 ms. */ -#define BLE_GAP_CP_MAX_CONN_INTVL_MAX 0x0C80 /**< Highest maximum connection interval permitted, in units of 1.25 ms, i.e. 4 s. */ -#define BLE_GAP_CP_SLAVE_LATENCY_MAX 0x01F3 /**< Highest slave latency permitted, in connection events. */ -#define BLE_GAP_CP_CONN_SUP_TIMEOUT_NONE 0xFFFF /**< No new supervision timeout specified in connect parameters. */ -#define BLE_GAP_CP_CONN_SUP_TIMEOUT_MIN 0x000A /**< Lowest supervision timeout permitted, in units of 10 ms, i.e. 100 ms. */ -#define BLE_GAP_CP_CONN_SUP_TIMEOUT_MAX 0x0C80 /**< Highest supervision timeout permitted, in units of 10 ms, i.e. 32 s. */ -/**@} */ - - -/**@defgroup BLE_GAP_DEVNAME GAP device name defines. - * @{ */ -#define BLE_GAP_DEVNAME_DEFAULT "nRF5x" /**< Default device name value. */ -#define BLE_GAP_DEVNAME_DEFAULT_LEN 31 /**< Default number of octets in device name. */ -#define BLE_GAP_DEVNAME_MAX_LEN 248 /**< Maximum number of octets in device name. */ -/**@} */ - - -/**@brief Disable RSSI events for connections */ -#define BLE_GAP_RSSI_THRESHOLD_INVALID 0xFF - -/**@defgroup BLE_GAP_PHYS GAP PHYs - * @{ */ -#define BLE_GAP_PHY_AUTO 0x00 /**< Automatic PHY selection. Refer @ref sd_ble_gap_phy_update for more information.*/ -#define BLE_GAP_PHY_1MBPS 0x01 /**< 1 Mbps PHY. */ -#define BLE_GAP_PHY_2MBPS 0x02 /**< 2 Mbps PHY. */ -#define BLE_GAP_PHY_CODED 0x04 /**< Coded PHY. */ -#define BLE_GAP_PHY_NOT_SET 0xFF /**< PHY is not configured. */ - -/**@brief Supported PHYs in connections, for scanning, and for advertising. */ -#define BLE_GAP_PHYS_SUPPORTED (BLE_GAP_PHY_1MBPS | BLE_GAP_PHY_2MBPS | BLE_GAP_PHY_CODED) /**< All PHYs are supported. */ - -/**@} */ - -/**@defgroup BLE_GAP_CONN_SEC_MODE_SET_MACROS GAP attribute security requirement setters - * - * See @ref ble_gap_conn_sec_mode_t. - * @{ */ -/**@brief Set sec_mode pointed to by ptr to have no access rights.*/ -#define BLE_GAP_CONN_SEC_MODE_SET_NO_ACCESS(ptr) do {(ptr)->sm = 0; (ptr)->lv = 0;} while(0) -/**@brief Set sec_mode pointed to by ptr to require no protection, open link.*/ -#define BLE_GAP_CONN_SEC_MODE_SET_OPEN(ptr) do {(ptr)->sm = 1; (ptr)->lv = 1;} while(0) -/**@brief Set sec_mode pointed to by ptr to require encryption, but no MITM protection.*/ -#define BLE_GAP_CONN_SEC_MODE_SET_ENC_NO_MITM(ptr) do {(ptr)->sm = 1; (ptr)->lv = 2;} while(0) -/**@brief Set sec_mode pointed to by ptr to require encryption and MITM protection.*/ -#define BLE_GAP_CONN_SEC_MODE_SET_ENC_WITH_MITM(ptr) do {(ptr)->sm = 1; (ptr)->lv = 3;} while(0) -/**@brief Set sec_mode pointed to by ptr to require LESC encryption and MITM protection.*/ -#define BLE_GAP_CONN_SEC_MODE_SET_LESC_ENC_WITH_MITM(ptr) do {(ptr)->sm = 1; (ptr)->lv = 4;} while(0) -/**@brief Set sec_mode pointed to by ptr to require signing or encryption, no MITM protection needed.*/ -#define BLE_GAP_CONN_SEC_MODE_SET_SIGNED_NO_MITM(ptr) do {(ptr)->sm = 2; (ptr)->lv = 1;} while(0) -/**@brief Set sec_mode pointed to by ptr to require signing or encryption with MITM protection.*/ -#define BLE_GAP_CONN_SEC_MODE_SET_SIGNED_WITH_MITM(ptr) do {(ptr)->sm = 2; (ptr)->lv = 2;} while(0) -/**@} */ - - -/**@brief GAP Security Random Number Length. */ -#define BLE_GAP_SEC_RAND_LEN 8 - - -/**@brief GAP Security Key Length. */ -#define BLE_GAP_SEC_KEY_LEN 16 - - -/**@brief GAP LE Secure Connections Elliptic Curve Diffie-Hellman P-256 Public Key Length. */ -#define BLE_GAP_LESC_P256_PK_LEN 64 - - -/**@brief GAP LE Secure Connections Elliptic Curve Diffie-Hellman DHKey Length. */ -#define BLE_GAP_LESC_DHKEY_LEN 32 - - -/**@brief GAP Passkey Length. */ -#define BLE_GAP_PASSKEY_LEN 6 - - -/**@brief Maximum amount of addresses in the whitelist. */ -#define BLE_GAP_WHITELIST_ADDR_MAX_COUNT (8) - - -/**@brief Maximum amount of identities in the device identities list. */ -#define BLE_GAP_DEVICE_IDENTITIES_MAX_COUNT (8) - - -/**@brief Default connection count for a configuration. */ -#define BLE_GAP_CONN_COUNT_DEFAULT (1) - - -/**@defgroup BLE_GAP_EVENT_LENGTH GAP event length defines. - * @{ */ -#define BLE_GAP_EVENT_LENGTH_MIN (2) /**< Minimum event length, in 1.25 ms units. */ -#define BLE_GAP_EVENT_LENGTH_CODED_PHY_MIN (6) /**< The shortest event length in 1.25 ms units supporting LE Coded PHY. */ -#define BLE_GAP_EVENT_LENGTH_DEFAULT (3) /**< Default event length, in 1.25 ms units. */ -/**@} */ - - -/**@defgroup BLE_GAP_ROLE_COUNT GAP concurrent connection count defines. - * @{ */ -#define BLE_GAP_ROLE_COUNT_PERIPH_DEFAULT (1) /**< Default maximum number of connections concurrently acting as peripherals. */ -#define BLE_GAP_ROLE_COUNT_CENTRAL_DEFAULT (3) /**< Default maximum number of connections concurrently acting as centrals. */ -#define BLE_GAP_ROLE_COUNT_CENTRAL_SEC_DEFAULT (1) /**< Default number of SMP instances shared between all connections acting as centrals. */ -#define BLE_GAP_ROLE_COUNT_COMBINED_MAX (20) /**< Maximum supported number of concurrent connections in the peripheral and central roles combined. */ - -/**@} */ - -/**@brief Automatic data length parameter. */ -#define BLE_GAP_DATA_LENGTH_AUTO 0 - -/**@defgroup BLE_GAP_AUTH_PAYLOAD_TIMEOUT Authenticated payload timeout defines. - * @{ */ -#define BLE_GAP_AUTH_PAYLOAD_TIMEOUT_MAX (48000) /**< Maximum authenticated payload timeout in 10 ms units, i.e. 8 minutes. */ -#define BLE_GAP_AUTH_PAYLOAD_TIMEOUT_MIN (1) /**< Minimum authenticated payload timeout in 10 ms units, i.e. 10 ms. */ -/**@} */ - -/**@defgroup GAP_SEC_MODES GAP Security Modes - * @{ */ -#define BLE_GAP_SEC_MODE 0x00 /**< No key (may be used to reject). */ -/**@} */ - -/**@brief The total number of channels in Bluetooth Low Energy. */ -#define BLE_GAP_CHANNEL_COUNT (40) - -/**@defgroup BLE_GAP_QOS_CHANNEL_SURVEY_INTERVALS Quality of Service (QoS) Channel survey interval defines - * @{ */ -#define BLE_GAP_QOS_CHANNEL_SURVEY_INTERVAL_CONTINUOUS (0) /**< Continuous channel survey. */ -#define BLE_GAP_QOS_CHANNEL_SURVEY_INTERVAL_MIN_US (7500) /**< Minimum channel survey interval in microseconds (7.5 ms). */ -#define BLE_GAP_QOS_CHANNEL_SURVEY_INTERVAL_MAX_US (4000000) /**< Maximum channel survey interval in microseconds (4 s). */ - /**@} */ - -/** @} */ - - -/**@addtogroup BLE_GAP_STRUCTURES Structures - * @{ */ - -/**@brief Advertising event properties. */ -typedef struct -{ - uint8_t type; /**< Advertising type. See @ref BLE_GAP_ADV_TYPES. */ - uint8_t anonymous : 1; /**< Omit advertiser's address from all PDUs. - @note Anonymous advertising is only available for - @ref BLE_GAP_ADV_TYPE_EXTENDED_NONCONNECTABLE_NONSCANNABLE_UNDIRECTED and - @ref BLE_GAP_ADV_TYPE_EXTENDED_NONCONNECTABLE_NONSCANNABLE_DIRECTED. */ - uint8_t include_tx_power : 1; /**< This feature is not supported on this SoftDevice. */ -} ble_gap_adv_properties_t; - - -/**@brief Advertising report type. */ -typedef struct -{ - uint16_t connectable : 1; /**< Connectable advertising event type. */ - uint16_t scannable : 1; /**< Scannable advertising event type. */ - uint16_t directed : 1; /**< Directed advertising event type. */ - uint16_t scan_response : 1; /**< Received a scan response. */ - uint16_t extended_pdu : 1; /**< Received an extended advertising set. */ - uint16_t status : 2; /**< Data status. See @ref BLE_GAP_ADV_DATA_STATUS. */ - uint16_t reserved : 9; /**< Reserved for future use. */ -} ble_gap_adv_report_type_t; - -/**@brief Advertising Auxiliary Pointer. */ -typedef struct -{ - uint16_t aux_offset; /**< Time offset from the beginning of advertising packet to the auxiliary packet in 100 us units. */ - uint8_t aux_phy; /**< Indicates the PHY on which the auxiliary advertising packet is sent. See @ref BLE_GAP_PHYS. */ -} ble_gap_aux_pointer_t; - -/**@brief Bluetooth Low Energy address. */ -typedef struct -{ - uint8_t addr_id_peer : 1; /**< Only valid for peer addresses. - This bit is set by the SoftDevice to indicate whether the address has been resolved from - a Resolvable Private Address (when the peer is using privacy). - If set to 1, @ref addr and @ref addr_type refer to the identity address of the resolved address. - - This bit is ignored when a variable of type @ref ble_gap_addr_t is used as input to API functions. */ - uint8_t addr_type : 7; /**< See @ref BLE_GAP_ADDR_TYPES. */ - uint8_t addr[BLE_GAP_ADDR_LEN]; /**< 48-bit address, LSB format. - @ref addr is not used if @ref addr_type is @ref BLE_GAP_ADDR_TYPE_ANONYMOUS. */ -} ble_gap_addr_t; - - -/**@brief GAP connection parameters. - * - * @note When ble_conn_params_t is received in an event, both min_conn_interval and - * max_conn_interval will be equal to the connection interval set by the central. - * - * @note If both conn_sup_timeout and max_conn_interval are specified, then the following constraint applies: - * conn_sup_timeout * 4 > (1 + slave_latency) * max_conn_interval - * that corresponds to the following Bluetooth Spec requirement: - * The Supervision_Timeout in milliseconds shall be larger than - * (1 + Conn_Latency) * Conn_Interval_Max * 2, where Conn_Interval_Max is given in milliseconds. - */ -typedef struct -{ - uint16_t min_conn_interval; /**< Minimum Connection Interval in 1.25 ms units, see @ref BLE_GAP_CP_LIMITS.*/ - uint16_t max_conn_interval; /**< Maximum Connection Interval in 1.25 ms units, see @ref BLE_GAP_CP_LIMITS.*/ - uint16_t slave_latency; /**< Slave Latency in number of connection events, see @ref BLE_GAP_CP_LIMITS.*/ - uint16_t conn_sup_timeout; /**< Connection Supervision Timeout in 10 ms units, see @ref BLE_GAP_CP_LIMITS.*/ -} ble_gap_conn_params_t; - - -/**@brief GAP connection security modes. - * - * Security Mode 0 Level 0: No access permissions at all (this level is not defined by the Bluetooth Core specification).\n - * Security Mode 1 Level 1: No security is needed (aka open link).\n - * Security Mode 1 Level 2: Encrypted link required, MITM protection not necessary.\n - * Security Mode 1 Level 3: MITM protected encrypted link required.\n - * Security Mode 1 Level 4: LESC MITM protected encrypted link using a 128-bit strength encryption key required.\n - * Security Mode 2 Level 1: Signing or encryption required, MITM protection not necessary.\n - * Security Mode 2 Level 2: MITM protected signing required, unless link is MITM protected encrypted.\n - */ -typedef struct -{ - uint8_t sm : 4; /**< Security Mode (1 or 2), 0 for no permissions at all. */ - uint8_t lv : 4; /**< Level (1, 2, 3 or 4), 0 for no permissions at all. */ - -} ble_gap_conn_sec_mode_t; - - -/**@brief GAP connection security status.*/ -typedef struct -{ - ble_gap_conn_sec_mode_t sec_mode; /**< Currently active security mode for this connection.*/ - uint8_t encr_key_size; /**< Length of currently active encryption key, 7 to 16 octets (only applicable for bonding procedures). */ -} ble_gap_conn_sec_t; - -/**@brief Identity Resolving Key. */ -typedef struct -{ - uint8_t irk[BLE_GAP_SEC_KEY_LEN]; /**< Array containing IRK. */ -} ble_gap_irk_t; - - -/**@brief Channel mask (40 bits). - * Every channel is represented with a bit positioned as per channel index defined in Bluetooth Core Specification v5.0, - * Vol 6, Part B, Section 1.4.1. The LSB contained in array element 0 represents channel index 0, and bit 39 represents - * channel index 39. If a bit is set to 1, the channel is not used. - */ -typedef uint8_t ble_gap_ch_mask_t[5]; - - -/**@brief GAP advertising parameters. */ -typedef struct -{ - ble_gap_adv_properties_t properties; /**< The properties of the advertising events. */ - ble_gap_addr_t const *p_peer_addr; /**< Address of a known peer. - @note ble_gap_addr_t::addr_type cannot be - @ref BLE_GAP_ADDR_TYPE_ANONYMOUS. - - When privacy is enabled and the local device uses - @ref BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE addresses, - the device identity list is searched for a matching entry. If - the local IRK for that device identity is set, the local IRK - for that device will be used to generate the advertiser address - field in the advertising packet. - - If @ref ble_gap_adv_properties_t::type is directed, this must be - set to the targeted scanner or initiator. If the peer address is - in the device identity list, the peer IRK for that device will be - used to generate @ref BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE - target addresses used in the advertising event PDUs. */ - uint32_t interval; /**< Advertising interval in 625 us units. @sa BLE_GAP_ADV_INTERVALS. - @note If @ref ble_gap_adv_properties_t::type is set to - @ref BLE_GAP_ADV_TYPE_CONNECTABLE_NONSCANNABLE_DIRECTED_HIGH_DUTY_CYCLE - advertising, this parameter is ignored. */ - uint16_t duration; /**< Advertising duration in 10 ms units. When timeout is reached, - an event of type @ref BLE_GAP_EVT_ADV_SET_TERMINATED is raised. - @sa BLE_GAP_ADV_TIMEOUT_VALUES. - @note The SoftDevice will always complete at least one advertising - event even if the duration is set too low. */ - uint8_t max_adv_evts; /**< Maximum advertising events that shall be sent prior to disabling - advertising. Setting the value to 0 disables the limitation. When - the count of advertising events specified by this parameter - (if not 0) is reached, advertising will be automatically stopped - and an event of type @ref BLE_GAP_EVT_ADV_SET_TERMINATED is raised - @note If @ref ble_gap_adv_properties_t::type is set to - @ref BLE_GAP_ADV_TYPE_CONNECTABLE_NONSCANNABLE_DIRECTED_HIGH_DUTY_CYCLE, - this parameter is ignored. */ - ble_gap_ch_mask_t channel_mask; /**< Channel mask for primary and secondary advertising channels. - At least one of the primary channels, that is channel index 37-39, must be used. - Masking away secondary advertising channels is not supported. */ - uint8_t filter_policy; /**< Filter Policy. @sa BLE_GAP_ADV_FILTER_POLICIES. */ - uint8_t primary_phy; /**< Indicates the PHY on which the primary advertising channel packets - are transmitted. If set to @ref BLE_GAP_PHY_AUTO, @ref BLE_GAP_PHY_1MBPS - will be used. - Valid values are @ref BLE_GAP_PHY_1MBPS and @ref BLE_GAP_PHY_CODED. - @note The primary_phy shall indicate @ref BLE_GAP_PHY_1MBPS if - @ref ble_gap_adv_properties_t::type is not an extended advertising type. */ - uint8_t secondary_phy; /**< Indicates the PHY on which the secondary advertising channel packets - are transmitted. - If set to @ref BLE_GAP_PHY_AUTO, @ref BLE_GAP_PHY_1MBPS will be used. - Valid values are - @ref BLE_GAP_PHY_1MBPS, @ref BLE_GAP_PHY_2MBPS, and @ref BLE_GAP_PHY_CODED. - If @ref ble_gap_adv_properties_t::type is an extended advertising type - and connectable, this is the PHY that will be used to establish a - connection and send AUX_ADV_IND packets on. - @note This parameter will be ignored when - @ref ble_gap_adv_properties_t::type is not an extended advertising type. */ - uint8_t set_id:4; /**< The advertising set identifier distinguishes this advertising set from other - advertising sets transmitted by this and other devices. - @note This parameter will be ignored when - @ref ble_gap_adv_properties_t::type is not an extended advertising type. */ - uint8_t scan_req_notification:1; /**< Enable scan request notifications for this advertising set. When a - scan request is received and the scanner address is allowed - by the filter policy, @ref BLE_GAP_EVT_SCAN_REQ_REPORT is raised. - @note This parameter will be ignored when - @ref ble_gap_adv_properties_t::type is a non-scannable - advertising type. */ -} ble_gap_adv_params_t; - - -/**@brief GAP advertising data buffers. - * - * The application must provide the buffers for advertisement. The memory shall reside in application RAM, and - * shall never be modified while advertising. The data shall be kept alive until either: - * - @ref BLE_GAP_EVT_ADV_SET_TERMINATED is raised. - * - @ref BLE_GAP_EVT_CONNECTED is raised with @ref ble_gap_evt_connected_t::adv_handle set to the corresponding - * advertising handle. - * - Advertising is stopped. - * - Advertising data is changed. - * To update advertising data while advertising, provide new buffers to @ref sd_ble_gap_adv_set_configure. */ -typedef struct -{ - ble_data_t adv_data; /**< Advertising data. - @note - Advertising data can only be specified for a @ref ble_gap_adv_properties_t::type - that is allowed to contain advertising data. */ - ble_data_t scan_rsp_data; /**< Scan response data. - @note - Scan response data can only be specified for a @ref ble_gap_adv_properties_t::type - that is scannable. */ -} ble_gap_adv_data_t; - - -/**@brief GAP scanning parameters. */ -typedef struct -{ - uint8_t extended : 1; /**< If 1, the scanner will accept extended advertising packets. - If set to 0, the scanner will not receive advertising packets - on secondary advertising channels, and will not be able - to receive long advertising PDUs. */ - uint8_t report_incomplete_evts : 1; /**< If 1, events of type @ref ble_gap_evt_adv_report_t may have - @ref ble_gap_adv_report_type_t::status set to - @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA. - This parameter is ignored when used with @ref sd_ble_gap_connect - @note This may be used to abort receiving more packets from an extended - advertising event, and is only available for extended - scanning, see @ref sd_ble_gap_scan_start. - @note This feature is not supported by this SoftDevice. */ - uint8_t active : 1; /**< If 1, perform active scanning by sending scan requests. - This parameter is ignored when used with @ref sd_ble_gap_connect. */ - uint8_t filter_policy : 2; /**< Scanning filter policy. @sa BLE_GAP_SCAN_FILTER_POLICIES. - @note Only @ref BLE_GAP_SCAN_FP_ACCEPT_ALL and - @ref BLE_GAP_SCAN_FP_WHITELIST are valid when used with - @ref sd_ble_gap_connect */ - uint8_t scan_phys; /**< Bitfield of PHYs to scan on. If set to @ref BLE_GAP_PHY_AUTO, - scan_phys will default to @ref BLE_GAP_PHY_1MBPS. - - If @ref ble_gap_scan_params_t::extended is set to 0, the only - supported PHY is @ref BLE_GAP_PHY_1MBPS. - - When used with @ref sd_ble_gap_scan_start, - the bitfield indicates the PHYs the scanner will use for scanning - on primary advertising channels. The scanner will accept - @ref BLE_GAP_PHYS_SUPPORTED as secondary advertising channel PHYs. - - When used with @ref sd_ble_gap_connect, the bitfield indicates - the PHYs the initiator will use for scanning on primary advertising - channels. The initiator will accept connections initiated on either - of the @ref BLE_GAP_PHYS_SUPPORTED PHYs. - If scan_phys contains @ref BLE_GAP_PHY_1MBPS and/or @ref BLE_GAP_PHY_2MBPS, - the primary scan PHY is @ref BLE_GAP_PHY_1MBPS. - If scan_phys also contains @ref BLE_GAP_PHY_CODED, the primary scan - PHY will also contain @ref BLE_GAP_PHY_CODED. If the only scan PHY is - @ref BLE_GAP_PHY_CODED, the primary scan PHY is - @ref BLE_GAP_PHY_CODED only. */ - uint16_t interval; /**< Scan interval in 625 us units. @sa BLE_GAP_SCAN_INTERVALS. */ - uint16_t window; /**< Scan window in 625 us units. @sa BLE_GAP_SCAN_WINDOW. - If scan_phys contains both @ref BLE_GAP_PHY_1MBPS and - @ref BLE_GAP_PHY_CODED interval shall be larger than or - equal to twice the scan window. */ - uint16_t timeout; /**< Scan timeout in 10 ms units. @sa BLE_GAP_SCAN_TIMEOUT. */ - ble_gap_ch_mask_t channel_mask; /**< Channel mask for primary and secondary advertising channels. - At least one of the primary channels, that is channel index 37-39, must be - set to 0. - Masking away secondary channels is not supported. */ -} ble_gap_scan_params_t; - - -/**@brief Privacy. - * - * The privacy feature provides a way for the device to avoid being tracked over a period of time. - * The privacy feature, when enabled, hides the local device identity and replaces it with a private address - * that is automatically refreshed at a specified interval. - * - * If a device still wants to be recognized by other peers, it needs to share it's Identity Resolving Key (IRK). - * With this key, a device can generate a random private address that can only be recognized by peers in possession of that key, - * and devices can establish connections without revealing their real identities. - * - * Both network privacy (@ref BLE_GAP_PRIVACY_MODE_NETWORK_PRIVACY) and device privacy (@ref BLE_GAP_PRIVACY_MODE_DEVICE_PRIVACY) - * are supported. - * - * @note If the device IRK is updated, the new IRK becomes the one to be distributed in all - * bonding procedures performed after @ref sd_ble_gap_privacy_set returns. - * The IRK distributed during bonding procedure is the device IRK that is active when @ref sd_ble_gap_sec_params_reply is called. - */ -typedef struct -{ - uint8_t privacy_mode; /**< Privacy mode, see @ref BLE_GAP_PRIVACY_MODES. Default is @ref BLE_GAP_PRIVACY_MODE_OFF. */ - uint8_t private_addr_type; /**< The private address type must be either @ref BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE or @ref BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_NON_RESOLVABLE. */ - uint16_t private_addr_cycle_s; /**< Private address cycle interval in seconds. Providing an address cycle value of 0 will use the default value defined by @ref BLE_GAP_DEFAULT_PRIVATE_ADDR_CYCLE_INTERVAL_S. */ - ble_gap_irk_t *p_device_irk; /**< When used as input, pointer to IRK structure that will be used as the default IRK. If NULL, the device default IRK will be used. - When used as output, pointer to IRK structure where the current default IRK will be written to. If NULL, this argument is ignored. - By default, the default IRK is used to generate random private resolvable addresses for the local device unless instructed otherwise. */ -} ble_gap_privacy_params_t; - - -/**@brief PHY preferences for TX and RX - * @note tx_phys and rx_phys are bit fields. Multiple bits can be set in them to indicate multiple preferred PHYs for each direction. - * @code - * p_gap_phys->tx_phys = BLE_GAP_PHY_1MBPS | BLE_GAP_PHY_2MBPS; - * p_gap_phys->rx_phys = BLE_GAP_PHY_1MBPS | BLE_GAP_PHY_2MBPS; - * @endcode - * - */ -typedef struct -{ - uint8_t tx_phys; /**< Preferred transmit PHYs, see @ref BLE_GAP_PHYS. */ - uint8_t rx_phys; /**< Preferred receive PHYs, see @ref BLE_GAP_PHYS. */ -} ble_gap_phys_t; - -/** @brief Keys that can be exchanged during a bonding procedure. */ -typedef struct -{ - uint8_t enc : 1; /**< Long Term Key and Master Identification. */ - uint8_t id : 1; /**< Identity Resolving Key and Identity Address Information. */ - uint8_t sign : 1; /**< Connection Signature Resolving Key. */ - uint8_t link : 1; /**< Derive the Link Key from the LTK. */ -} ble_gap_sec_kdist_t; - - -/**@brief GAP security parameters. */ -typedef struct -{ - uint8_t bond : 1; /**< Perform bonding. */ - uint8_t mitm : 1; /**< Enable Man In The Middle protection. */ - uint8_t lesc : 1; /**< Enable LE Secure Connection pairing. */ - uint8_t keypress : 1; /**< Enable generation of keypress notifications. */ - uint8_t io_caps : 3; /**< IO capabilities, see @ref BLE_GAP_IO_CAPS. */ - uint8_t oob : 1; /**< The OOB data flag. - - In LE legacy pairing, this flag is set if a device has out of band authentication data. - The OOB method is used if both of the devices have out of band authentication data. - - In LE Secure Connections pairing, this flag is set if a device has the peer device's out of band authentication data. - The OOB method is used if at least one device has the peer device's OOB data available. */ - uint8_t min_key_size; /**< Minimum encryption key size in octets between 7 and 16. If 0 then not applicable in this instance. */ - uint8_t max_key_size; /**< Maximum encryption key size in octets between min_key_size and 16. */ - ble_gap_sec_kdist_t kdist_own; /**< Key distribution bitmap: keys that the local device will distribute. */ - ble_gap_sec_kdist_t kdist_peer; /**< Key distribution bitmap: keys that the remote device will distribute. */ -} ble_gap_sec_params_t; - - -/**@brief GAP Encryption Information. */ -typedef struct -{ - uint8_t ltk[BLE_GAP_SEC_KEY_LEN]; /**< Long Term Key. */ - uint8_t lesc : 1; /**< Key generated using LE Secure Connections. */ - uint8_t auth : 1; /**< Authenticated Key. */ - uint8_t ltk_len : 6; /**< LTK length in octets. */ -} ble_gap_enc_info_t; - - -/**@brief GAP Master Identification. */ -typedef struct -{ - uint16_t ediv; /**< Encrypted Diversifier. */ - uint8_t rand[BLE_GAP_SEC_RAND_LEN]; /**< Random Number. */ -} ble_gap_master_id_t; - - -/**@brief GAP Signing Information. */ -typedef struct -{ - uint8_t csrk[BLE_GAP_SEC_KEY_LEN]; /**< Connection Signature Resolving Key. */ -} ble_gap_sign_info_t; - - -/**@brief GAP LE Secure Connections P-256 Public Key. */ -typedef struct -{ - uint8_t pk[BLE_GAP_LESC_P256_PK_LEN]; /**< LE Secure Connections Elliptic Curve Diffie-Hellman P-256 Public Key. Stored in the standard SMP protocol format: {X,Y} both in little-endian. */ -} ble_gap_lesc_p256_pk_t; - - -/**@brief GAP LE Secure Connections DHKey. */ -typedef struct -{ - uint8_t key[BLE_GAP_LESC_DHKEY_LEN]; /**< LE Secure Connections Elliptic Curve Diffie-Hellman Key. Stored in little-endian. */ -} ble_gap_lesc_dhkey_t; - - -/**@brief GAP LE Secure Connections OOB data. */ -typedef struct -{ - ble_gap_addr_t addr; /**< Bluetooth address of the device. */ - uint8_t r[BLE_GAP_SEC_KEY_LEN]; /**< Random Number. */ - uint8_t c[BLE_GAP_SEC_KEY_LEN]; /**< Confirm Value. */ -} ble_gap_lesc_oob_data_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_CONNECTED. */ -typedef struct -{ - ble_gap_addr_t peer_addr; /**< Bluetooth address of the peer device. If the peer_addr resolved: @ref ble_gap_addr_t::addr_id_peer is set to 1 - and the address is the device's identity address. */ - uint8_t role; /**< BLE role for this connection, see @ref BLE_GAP_ROLES */ - ble_gap_conn_params_t conn_params; /**< GAP Connection Parameters. */ - uint8_t adv_handle; /**< Advertising handle in which advertising has ended. - This variable is only set if role is set to @ref BLE_GAP_ROLE_PERIPH. */ - ble_gap_adv_data_t adv_data; /**< Advertising buffers corresponding to the terminated - advertising set. The advertising buffers provided in - @ref sd_ble_gap_adv_set_configure are now released. - This variable is only set if role is set to @ref BLE_GAP_ROLE_PERIPH. */ -} ble_gap_evt_connected_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_DISCONNECTED. */ -typedef struct -{ - uint8_t reason; /**< HCI error code, see @ref BLE_HCI_STATUS_CODES. */ -} ble_gap_evt_disconnected_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_CONN_PARAM_UPDATE. */ -typedef struct -{ - ble_gap_conn_params_t conn_params; /**< GAP Connection Parameters. */ -} ble_gap_evt_conn_param_update_t; - -/**@brief Event structure for @ref BLE_GAP_EVT_PHY_UPDATE_REQUEST. */ -typedef struct -{ - ble_gap_phys_t peer_preferred_phys; /**< The PHYs the peer prefers to use. */ -} ble_gap_evt_phy_update_request_t; - -/**@brief Event Structure for @ref BLE_GAP_EVT_PHY_UPDATE. */ -typedef struct -{ - uint8_t status; /**< Status of the procedure, see @ref BLE_HCI_STATUS_CODES.*/ - uint8_t tx_phy; /**< TX PHY for this connection, see @ref BLE_GAP_PHYS. */ - uint8_t rx_phy; /**< RX PHY for this connection, see @ref BLE_GAP_PHYS. */ -} ble_gap_evt_phy_update_t; - -/**@brief Event structure for @ref BLE_GAP_EVT_SEC_PARAMS_REQUEST. */ -typedef struct -{ - ble_gap_sec_params_t peer_params; /**< Initiator Security Parameters. */ -} ble_gap_evt_sec_params_request_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_SEC_INFO_REQUEST. */ -typedef struct -{ - ble_gap_addr_t peer_addr; /**< Bluetooth address of the peer device. */ - ble_gap_master_id_t master_id; /**< Master Identification for LTK lookup. */ - uint8_t enc_info : 1; /**< If 1, Encryption Information required. */ - uint8_t id_info : 1; /**< If 1, Identity Information required. */ - uint8_t sign_info : 1; /**< If 1, Signing Information required. */ -} ble_gap_evt_sec_info_request_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_PASSKEY_DISPLAY. */ -typedef struct -{ - uint8_t passkey[BLE_GAP_PASSKEY_LEN]; /**< 6-digit passkey in ASCII ('0'-'9' digits only). */ - uint8_t match_request : 1; /**< If 1 requires the application to report the match using @ref sd_ble_gap_auth_key_reply - with either @ref BLE_GAP_AUTH_KEY_TYPE_NONE if there is no match or - @ref BLE_GAP_AUTH_KEY_TYPE_PASSKEY if there is a match. */ -} ble_gap_evt_passkey_display_t; - -/**@brief Event structure for @ref BLE_GAP_EVT_KEY_PRESSED. */ -typedef struct -{ - uint8_t kp_not; /**< Keypress notification type, see @ref BLE_GAP_KP_NOT_TYPES. */ -} ble_gap_evt_key_pressed_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_AUTH_KEY_REQUEST. */ -typedef struct -{ - uint8_t key_type; /**< See @ref BLE_GAP_AUTH_KEY_TYPES. */ -} ble_gap_evt_auth_key_request_t; - -/**@brief Event structure for @ref BLE_GAP_EVT_LESC_DHKEY_REQUEST. */ -typedef struct -{ - ble_gap_lesc_p256_pk_t *p_pk_peer; /**< LE Secure Connections remote P-256 Public Key. This will point to the application-supplied memory - inside the keyset during the call to @ref sd_ble_gap_sec_params_reply. */ - uint8_t oobd_req :1; /**< LESC OOB data required. A call to @ref sd_ble_gap_lesc_oob_data_set is required to complete the procedure. */ -} ble_gap_evt_lesc_dhkey_request_t; - - -/**@brief Security levels supported. - * @note See Bluetooth Specification Version 4.2 Volume 3, Part C, Chapter 10, Section 10.2.1. -*/ -typedef struct -{ - uint8_t lv1 : 1; /**< If 1: Level 1 is supported. */ - uint8_t lv2 : 1; /**< If 1: Level 2 is supported. */ - uint8_t lv3 : 1; /**< If 1: Level 3 is supported. */ - uint8_t lv4 : 1; /**< If 1: Level 4 is supported. */ -} ble_gap_sec_levels_t; - - -/**@brief Encryption Key. */ -typedef struct -{ - ble_gap_enc_info_t enc_info; /**< Encryption Information. */ - ble_gap_master_id_t master_id; /**< Master Identification. */ -} ble_gap_enc_key_t; - - -/**@brief Identity Key. */ -typedef struct -{ - ble_gap_irk_t id_info; /**< Identity Resolving Key. */ - ble_gap_addr_t id_addr_info; /**< Identity Address. */ -} ble_gap_id_key_t; - - -/**@brief Security Keys. */ -typedef struct -{ - ble_gap_enc_key_t *p_enc_key; /**< Encryption Key, or NULL. */ - ble_gap_id_key_t *p_id_key; /**< Identity Key, or NULL. */ - ble_gap_sign_info_t *p_sign_key; /**< Signing Key, or NULL. */ - ble_gap_lesc_p256_pk_t *p_pk; /**< LE Secure Connections P-256 Public Key. When in debug mode the application must use the value defined - in the Core Bluetooth Specification v4.2 Vol.3, Part H, Section 2.3.5.6.1 */ -} ble_gap_sec_keys_t; - - -/**@brief Security key set for both local and peer keys. */ -typedef struct -{ - ble_gap_sec_keys_t keys_own; /**< Keys distributed by the local device. For LE Secure Connections the encryption key will be generated locally and will always be stored if bonding. */ - ble_gap_sec_keys_t keys_peer; /**< Keys distributed by the remote device. For LE Secure Connections, p_enc_key must always be NULL. */ -} ble_gap_sec_keyset_t; - - -/**@brief Data Length Update Procedure parameters. */ -typedef struct -{ - uint16_t max_tx_octets; /**< Maximum number of payload octets that a Controller supports for transmission of a single Link Layer Data Channel PDU. */ - uint16_t max_rx_octets; /**< Maximum number of payload octets that a Controller supports for reception of a single Link Layer Data Channel PDU. */ - uint16_t max_tx_time_us; /**< Maximum time, in microseconds, that a Controller supports for transmission of a single Link Layer Data Channel PDU. */ - uint16_t max_rx_time_us; /**< Maximum time, in microseconds, that a Controller supports for reception of a single Link Layer Data Channel PDU. */ -} ble_gap_data_length_params_t; - - -/**@brief Data Length Update Procedure local limitation. */ -typedef struct -{ - uint16_t tx_payload_limited_octets; /**< If > 0, the requested TX packet length is too long by this many octets. */ - uint16_t rx_payload_limited_octets; /**< If > 0, the requested RX packet length is too long by this many octets. */ - uint16_t tx_rx_time_limited_us; /**< If > 0, the requested combination of TX and RX packet lengths is too long by this many microseconds. */ -} ble_gap_data_length_limitation_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_AUTH_STATUS. */ -typedef struct -{ - uint8_t auth_status; /**< Authentication status, see @ref BLE_GAP_SEC_STATUS. */ - uint8_t error_src : 2; /**< On error, source that caused the failure, see @ref BLE_GAP_SEC_STATUS_SOURCES. */ - uint8_t bonded : 1; /**< Procedure resulted in a bond. */ - uint8_t lesc : 1; /**< Procedure resulted in a LE Secure Connection. */ - ble_gap_sec_levels_t sm1_levels; /**< Levels supported in Security Mode 1. */ - ble_gap_sec_levels_t sm2_levels; /**< Levels supported in Security Mode 2. */ - ble_gap_sec_kdist_t kdist_own; /**< Bitmap stating which keys were exchanged (distributed) by the local device. If bonding with LE Secure Connections, the enc bit will be always set. */ - ble_gap_sec_kdist_t kdist_peer; /**< Bitmap stating which keys were exchanged (distributed) by the remote device. If bonding with LE Secure Connections, the enc bit will never be set. */ -} ble_gap_evt_auth_status_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_CONN_SEC_UPDATE. */ -typedef struct -{ - ble_gap_conn_sec_t conn_sec; /**< Connection security level. */ -} ble_gap_evt_conn_sec_update_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_TIMEOUT. */ -typedef struct -{ - uint8_t src; /**< Source of timeout event, see @ref BLE_GAP_TIMEOUT_SOURCES. */ - union - { - ble_data_t adv_report_buffer; /**< If source is set to @ref BLE_GAP_TIMEOUT_SRC_SCAN, the released - scan buffer is contained in this field. */ - } params; /**< Event Parameters. */ -} ble_gap_evt_timeout_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_RSSI_CHANGED. */ -typedef struct -{ - int8_t rssi; /**< Received Signal Strength Indication in dBm. - @note ERRATA-153 requires the rssi sample to be compensated based on a temperature measurement. */ - uint8_t ch_index; /**< Data Channel Index on which the Signal Strength is measured (0-36). */ -} ble_gap_evt_rssi_changed_t; - -/**@brief Event structure for @ref BLE_GAP_EVT_ADV_SET_TERMINATED */ -typedef struct -{ - uint8_t reason; /**< Reason for why the advertising set terminated. See - @ref BLE_GAP_EVT_ADV_SET_TERMINATED_REASON. */ - uint8_t adv_handle; /**< Advertising handle in which advertising has ended. */ - uint8_t num_completed_adv_events; /**< If @ref ble_gap_adv_params_t::max_adv_evts was not set to 0, - this field indicates the number of completed advertising events. */ - ble_gap_adv_data_t adv_data; /**< Advertising buffers corresponding to the terminated - advertising set. The advertising buffers provided in - @ref sd_ble_gap_adv_set_configure are now released. */ -} ble_gap_evt_adv_set_terminated_t; - -/**@brief Event structure for @ref BLE_GAP_EVT_ADV_REPORT. - * - * @note If @ref ble_gap_adv_report_type_t::status is set to @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA, - * not all fields in the advertising report may be available. - * - * @note When ble_gap_adv_report_type_t::status is not set to @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA, - * scanning will be paused. To continue scanning, call @ref sd_ble_gap_scan_start. - */ -typedef struct -{ - ble_gap_adv_report_type_t type; /**< Advertising report type. See @ref ble_gap_adv_report_type_t. */ - ble_gap_addr_t peer_addr; /**< Bluetooth address of the peer device. If the peer_addr is resolved: - @ref ble_gap_addr_t::addr_id_peer is set to 1 and the address is the - peer's identity address. */ - ble_gap_addr_t direct_addr; /**< Contains the target address of the advertising event if - @ref ble_gap_adv_report_type_t::directed is set to 1. If the - SoftDevice was able to resolve the address, - @ref ble_gap_addr_t::addr_id_peer is set to 1 and the direct_addr - contains the local identity address. If the target address of the - advertising event is @ref BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE, - and the SoftDevice was unable to resolve it, the application may try - to resolve this address to find out if the advertising event was - directed to us. */ - uint8_t primary_phy; /**< Indicates the PHY on which the primary advertising packet was received. - See @ref BLE_GAP_PHYS. */ - uint8_t secondary_phy; /**< Indicates the PHY on which the secondary advertising packet was received. - See @ref BLE_GAP_PHYS. This field is set to @ref BLE_GAP_PHY_NOT_SET if no packets - were received on a secondary advertising channel. */ - int8_t tx_power; /**< TX Power reported by the advertiser in the last packet header received. - This field is set to @ref BLE_GAP_POWER_LEVEL_INVALID if the - last received packet did not contain the Tx Power field. - @note TX Power is only included in extended advertising packets. */ - int8_t rssi; /**< Received Signal Strength Indication in dBm of the last packet received. - @note ERRATA-153 requires the rssi sample to be compensated based on a temperature measurement. */ - uint8_t ch_index; /**< Channel Index on which the last advertising packet is received (0-39). */ - uint8_t set_id; /**< Set ID of the received advertising data. Set ID is not present - if set to @ref BLE_GAP_ADV_REPORT_SET_ID_NOT_AVAILABLE. */ - uint16_t data_id:12; /**< The advertising data ID of the received advertising data. Data ID - is not present if @ref ble_gap_evt_adv_report_t::set_id is set to - @ref BLE_GAP_ADV_REPORT_SET_ID_NOT_AVAILABLE. */ - ble_data_t data; /**< Received advertising or scan response data. If - @ref ble_gap_adv_report_type_t::status is not set to - @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA, the data buffer provided - in @ref sd_ble_gap_scan_start is now released. */ - ble_gap_aux_pointer_t aux_pointer; /**< The offset and PHY of the next advertising packet in this extended advertising - event. @note This field is only set if @ref ble_gap_adv_report_type_t::status - is set to @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA. */ -} ble_gap_evt_adv_report_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_SEC_REQUEST. */ -typedef struct -{ - uint8_t bond : 1; /**< Perform bonding. */ - uint8_t mitm : 1; /**< Man In The Middle protection requested. */ - uint8_t lesc : 1; /**< LE Secure Connections requested. */ - uint8_t keypress : 1; /**< Generation of keypress notifications requested. */ -} ble_gap_evt_sec_request_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST. */ -typedef struct -{ - ble_gap_conn_params_t conn_params; /**< GAP Connection Parameters. */ -} ble_gap_evt_conn_param_update_request_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_SCAN_REQ_REPORT. */ -typedef struct -{ - uint8_t adv_handle; /**< Advertising handle for the advertising set which received the Scan Request */ - int8_t rssi; /**< Received Signal Strength Indication in dBm. - @note ERRATA-153 requires the rssi sample to be compensated based on a temperature measurement. */ - ble_gap_addr_t peer_addr; /**< Bluetooth address of the peer device. If the peer_addr resolved: @ref ble_gap_addr_t::addr_id_peer is set to 1 - and the address is the device's identity address. */ -} ble_gap_evt_scan_req_report_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST. */ -typedef struct -{ - ble_gap_data_length_params_t peer_params; /**< Peer data length parameters. */ -} ble_gap_evt_data_length_update_request_t; - -/**@brief Event structure for @ref BLE_GAP_EVT_DATA_LENGTH_UPDATE. */ -typedef struct -{ - ble_gap_data_length_params_t effective_params; /**< The effective data length parameters. */ -} ble_gap_evt_data_length_update_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_QOS_CHANNEL_SURVEY_REPORT. */ -typedef struct -{ - int8_t channel_energy[BLE_GAP_CHANNEL_COUNT]; /**< The measured energy on the Bluetooth Low Energy - channels, in dBm, indexed by Channel Index. - If no measurement is available for the given channel, channel_energy is set to - @ref BLE_GAP_POWER_LEVEL_INVALID. */ -} ble_gap_evt_qos_channel_survey_report_t; - -/**@brief GAP event structure. */ -typedef struct -{ - uint16_t conn_handle; /**< Connection Handle on which event occurred. */ - union /**< union alternative identified by evt_id in enclosing struct. */ - { - ble_gap_evt_connected_t connected; /**< Connected Event Parameters. */ - ble_gap_evt_disconnected_t disconnected; /**< Disconnected Event Parameters. */ - ble_gap_evt_conn_param_update_t conn_param_update; /**< Connection Parameter Update Parameters. */ - ble_gap_evt_sec_params_request_t sec_params_request; /**< Security Parameters Request Event Parameters. */ - ble_gap_evt_sec_info_request_t sec_info_request; /**< Security Information Request Event Parameters. */ - ble_gap_evt_passkey_display_t passkey_display; /**< Passkey Display Event Parameters. */ - ble_gap_evt_key_pressed_t key_pressed; /**< Key Pressed Event Parameters. */ - ble_gap_evt_auth_key_request_t auth_key_request; /**< Authentication Key Request Event Parameters. */ - ble_gap_evt_lesc_dhkey_request_t lesc_dhkey_request; /**< LE Secure Connections DHKey calculation request. */ - ble_gap_evt_auth_status_t auth_status; /**< Authentication Status Event Parameters. */ - ble_gap_evt_conn_sec_update_t conn_sec_update; /**< Connection Security Update Event Parameters. */ - ble_gap_evt_timeout_t timeout; /**< Timeout Event Parameters. */ - ble_gap_evt_rssi_changed_t rssi_changed; /**< RSSI Event Parameters. */ - ble_gap_evt_adv_report_t adv_report; /**< Advertising Report Event Parameters. */ - ble_gap_evt_adv_set_terminated_t adv_set_terminated; /**< Advertising Set Terminated Event Parameters. */ - ble_gap_evt_sec_request_t sec_request; /**< Security Request Event Parameters. */ - ble_gap_evt_conn_param_update_request_t conn_param_update_request; /**< Connection Parameter Update Parameters. */ - ble_gap_evt_scan_req_report_t scan_req_report; /**< Scan Request Report Parameters. */ - ble_gap_evt_phy_update_request_t phy_update_request; /**< PHY Update Request Event Parameters. */ - ble_gap_evt_phy_update_t phy_update; /**< PHY Update Parameters. */ - ble_gap_evt_data_length_update_request_t data_length_update_request; /**< Data Length Update Request Event Parameters. */ - ble_gap_evt_data_length_update_t data_length_update; /**< Data Length Update Event Parameters. */ - ble_gap_evt_qos_channel_survey_report_t qos_channel_survey_report; /**< Quality of Service (QoS) Channel Survey Report Parameters. */ - } params; /**< Event Parameters. */ -} ble_gap_evt_t; - - -/** - * @brief BLE GAP connection configuration parameters, set with @ref sd_ble_cfg_set. - * - * @retval ::NRF_ERROR_CONN_COUNT The connection count for the connection configurations is zero. - * @retval ::NRF_ERROR_INVALID_PARAM One or more of the following is true: - * - The sum of conn_count for all connection configurations combined exceeds UINT8_MAX. - * - The event length is smaller than @ref BLE_GAP_EVENT_LENGTH_MIN. - */ -typedef struct -{ - uint8_t conn_count; /**< The number of concurrent connections the application can create with this configuration. - The default and minimum value is @ref BLE_GAP_CONN_COUNT_DEFAULT. */ - uint16_t event_length; /**< The time set aside for this connection on every connection interval in 1.25 ms units. - The default value is @ref BLE_GAP_EVENT_LENGTH_DEFAULT, the minimum value is @ref BLE_GAP_EVENT_LENGTH_MIN. - The event length and the connection interval are the primary parameters - for setting the throughput of a connection. - See the SoftDevice Specification for details on throughput. */ -} ble_gap_conn_cfg_t; - - -/** - * @brief Configuration of maximum concurrent connections in the different connected roles, set with - * @ref sd_ble_cfg_set. - * - * @retval ::NRF_ERROR_CONN_COUNT The sum of periph_role_count and central_role_count is too - * large. The maximum supported sum of concurrent connections is - * @ref BLE_GAP_ROLE_COUNT_COMBINED_MAX. - * @retval ::NRF_ERROR_INVALID_PARAM central_sec_count is larger than central_role_count. - * @retval ::NRF_ERROR_RESOURCES The adv_set_count is too large. The maximum - * supported advertising handles is - * @ref BLE_GAP_ADV_SET_COUNT_MAX. - */ -typedef struct -{ - uint8_t adv_set_count; /**< Maximum number of advertising sets. Default value is @ref BLE_GAP_ADV_SET_COUNT_DEFAULT. */ - uint8_t periph_role_count; /**< Maximum number of connections concurrently acting as a peripheral. Default value is @ref BLE_GAP_ROLE_COUNT_PERIPH_DEFAULT. */ - uint8_t central_role_count; /**< Maximum number of connections concurrently acting as a central. Default value is @ref BLE_GAP_ROLE_COUNT_CENTRAL_DEFAULT. */ - uint8_t central_sec_count; /**< Number of SMP instances shared between all connections acting as a central. Default value is @ref BLE_GAP_ROLE_COUNT_CENTRAL_SEC_DEFAULT. */ - uint8_t qos_channel_survey_role_available:1; /**< If set, the Quality of Service (QoS) channel survey module is available to the - application using @ref sd_ble_gap_qos_channel_survey_start. */ -} ble_gap_cfg_role_count_t; - - -/** - * @brief Device name and its properties, set with @ref sd_ble_cfg_set. - * - * @note If the device name is not configured, the default device name will be - * @ref BLE_GAP_DEVNAME_DEFAULT, the maximum device name length will be - * @ref BLE_GAP_DEVNAME_DEFAULT_LEN, vloc will be set to @ref BLE_GATTS_VLOC_STACK and the device name - * will have no write access. - * - * @note If @ref max_len is more than @ref BLE_GAP_DEVNAME_DEFAULT_LEN and vloc is set to @ref BLE_GATTS_VLOC_STACK, - * the attribute table size must be increased to have room for the longer device name (see - * @ref sd_ble_cfg_set and @ref ble_gatts_cfg_attr_tab_size_t). - * - * @note If vloc is @ref BLE_GATTS_VLOC_STACK : - * - p_value must point to non-volatile memory (flash) or be NULL. - * - If p_value is NULL, the device name will initially be empty. - * - * @note If vloc is @ref BLE_GATTS_VLOC_USER : - * - p_value cannot be NULL. - * - If the device name is writable, p_value must point to volatile memory (RAM). - * - * @retval ::NRF_ERROR_INVALID_PARAM One or more of the following is true: - * - Invalid device name location (vloc). - * - Invalid device name security mode. - * @retval ::NRF_ERROR_INVALID_LENGTH One or more of the following is true: - * - The device name length is invalid (must be between 0 and @ref BLE_GAP_DEVNAME_MAX_LEN). - * - The device name length is too long for the given Attribute Table. - * @retval ::NRF_ERROR_NOT_SUPPORTED Device name security mode is not supported. - */ -typedef struct -{ - ble_gap_conn_sec_mode_t write_perm; /**< Write permissions. */ - uint8_t vloc:2; /**< Value location, see @ref BLE_GATTS_VLOCS.*/ - uint8_t *p_value; /**< Pointer to where the value (device name) is stored or will be stored. */ - uint16_t current_len; /**< Current length in bytes of the memory pointed to by p_value.*/ - uint16_t max_len; /**< Maximum length in bytes of the memory pointed to by p_value.*/ -} ble_gap_cfg_device_name_t; - - -/**@brief Configuration structure for GAP configurations. */ -typedef union -{ - ble_gap_cfg_role_count_t role_count_cfg; /**< Role count configuration, cfg_id is @ref BLE_GAP_CFG_ROLE_COUNT. */ - ble_gap_cfg_device_name_t device_name_cfg; /**< Device name configuration, cfg_id is @ref BLE_GAP_CFG_DEVICE_NAME. */ -} ble_gap_cfg_t; - - -/**@brief Channel Map option. - * - * @details Used with @ref sd_ble_opt_get to get the current channel map - * or @ref sd_ble_opt_set to set a new channel map. When setting the - * channel map, it applies to all current and future connections. When getting the - * current channel map, it applies to a single connection and the connection handle - * must be supplied. - * - * @note Setting the channel map may take some time, depending on connection parameters. - * The time taken may be different for each connection and the get operation will - * return the previous channel map until the new one has taken effect. - * - * @note After setting the channel map, by spec it can not be set again until at least 1 s has passed. - * See Bluetooth Specification Version 4.1 Volume 2, Part E, Section 7.3.46. - * - * @retval ::NRF_SUCCESS Get or set successful. - * @retval ::NRF_ERROR_INVALID_PARAM One or more of the following is true: - * - Less then two bits in @ref ch_map are set. - * - Bits for primary advertising channels (37-39) are set. - * @retval ::NRF_ERROR_BUSY Channel map was set again before enough time had passed. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied for get. - * - */ -typedef struct -{ - uint16_t conn_handle; /**< Connection Handle (only applicable for get) */ - uint8_t ch_map[5]; /**< Channel Map (37-bit). */ -} ble_gap_opt_ch_map_t; - - -/**@brief Local connection latency option. - * - * @details Local connection latency is a feature which enables the slave to improve - * current consumption by ignoring the slave latency set by the peer. The - * local connection latency can only be set to a multiple of the slave latency, - * and cannot be longer than half of the supervision timeout. - * - * @details Used with @ref sd_ble_opt_set to set the local connection latency. The - * @ref sd_ble_opt_get is not supported for this option, but the actual - * local connection latency (unless set to NULL) is set as a return parameter - * when setting the option. - * - * @note The latency set will be truncated down to the closest slave latency event - * multiple, or the nearest multiple before half of the supervision timeout. - * - * @note The local connection latency is disabled by default, and needs to be enabled for new - * connections and whenever the connection is updated. - * - * @retval ::NRF_SUCCESS Set successfully. - * @retval ::NRF_ERROR_NOT_SUPPORTED Get is not supported. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle parameter. - */ -typedef struct -{ - uint16_t conn_handle; /**< Connection Handle */ - uint16_t requested_latency; /**< Requested local connection latency. */ - uint16_t * p_actual_latency; /**< Pointer to storage for the actual local connection latency (can be set to NULL to skip return value). */ -} ble_gap_opt_local_conn_latency_t; - -/**@brief Disable slave latency - * - * @details Used with @ref sd_ble_opt_set to temporarily disable slave latency of a peripheral connection - * (see @ref ble_gap_conn_params_t::slave_latency). And to re-enable it again. When disabled, the - * peripheral will ignore the slave_latency set by the central. - * - * @note Shall only be called on peripheral links. - * - * @retval ::NRF_SUCCESS Set successfully. - * @retval ::NRF_ERROR_NOT_SUPPORTED Get is not supported. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle parameter. - */ -typedef struct -{ - uint16_t conn_handle; /**< Connection Handle */ - uint8_t disable : 1; /**< Set to 1 to disable slave latency. Set to 0 enable it again.*/ -} ble_gap_opt_slave_latency_disable_t; - -/**@brief Passkey Option. - * - * @details Structure containing the passkey to be used during pairing. This can be used with @ref - * sd_ble_opt_set to make the SoftDevice use a preprogrammed passkey for authentication - * instead of generating a random one. - * - * @note Repeated pairing attempts using the same preprogrammed passkey makes pairing vulnerable to MITM attacks. - * - * @note @ref sd_ble_opt_get is not supported for this option. - * - */ -typedef struct -{ - uint8_t const * p_passkey; /**< Pointer to 6-digit ASCII string (digit 0..9 only, no NULL termination) passkey to be used during pairing. If this is NULL, the SoftDevice will generate a random passkey if required.*/ -} ble_gap_opt_passkey_t; - - -/**@brief Compatibility mode 1 option. - * - * @details This can be used with @ref sd_ble_opt_set to enable and disable - * compatibility mode 1. Compatibility mode 1 is disabled by default. - * - * @note Compatibility mode 1 enables interoperability with devices that do not support a value of - * 0 for the WinOffset parameter in the Link Layer CONNECT_IND packet. This applies to a - * limited set of legacy peripheral devices from another vendor. Enabling this compatibility - * mode will only have an effect if the local device will act as a central device and - * initiate a connection to a peripheral device. In that case it may lead to the connection - * creation taking up to one connection interval longer to complete for all connections. - * - * @retval ::NRF_SUCCESS Set successfully. - * @retval ::NRF_ERROR_INVALID_STATE When connection creation is ongoing while mode 1 is set. - */ -typedef struct -{ - uint8_t enable : 1; /**< Enable compatibility mode 1.*/ -} ble_gap_opt_compat_mode_1_t; - - -/**@brief Authenticated payload timeout option. - * - * @details This can be used with @ref sd_ble_opt_set to change the Authenticated payload timeout to a value other - * than the default of @ref BLE_GAP_AUTH_PAYLOAD_TIMEOUT_MAX. - * - * @note The authenticated payload timeout event ::BLE_GAP_TIMEOUT_SRC_AUTH_PAYLOAD will be generated - * if auth_payload_timeout time has elapsed without receiving a packet with a valid MIC on an encrypted - * link. - * - * @note The LE ping procedure will be initiated before the timer expires to give the peer a chance - * to reset the timer. In addition the stack will try to prioritize running of LE ping over other - * activities to increase chances of finishing LE ping before timer expires. To avoid side-effects - * on other activities, it is recommended to use high timeout values. - * Recommended timeout > 2*(connInterval * (6 + connSlaveLatency)). - * - * @retval ::NRF_SUCCESS Set successfully. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. auth_payload_timeout was outside of allowed range. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle parameter. - */ -typedef struct -{ - uint16_t conn_handle; /**< Connection Handle */ - uint16_t auth_payload_timeout; /**< Requested timeout in 10 ms unit, see @ref BLE_GAP_AUTH_PAYLOAD_TIMEOUT. */ -} ble_gap_opt_auth_payload_timeout_t; - -/**@brief Option structure for GAP options. */ -typedef union -{ - ble_gap_opt_ch_map_t ch_map; /**< Parameters for the Channel Map option. */ - ble_gap_opt_local_conn_latency_t local_conn_latency; /**< Parameters for the Local connection latency option */ - ble_gap_opt_passkey_t passkey; /**< Parameters for the Passkey option.*/ - ble_gap_opt_compat_mode_1_t compat_mode_1; /**< Parameters for the compatibility mode 1 option.*/ - ble_gap_opt_auth_payload_timeout_t auth_payload_timeout; /**< Parameters for the authenticated payload timeout option.*/ - ble_gap_opt_slave_latency_disable_t slave_latency_disable; /**< Parameters for the Disable slave latency option */ -} ble_gap_opt_t; -/**@} */ - - -/**@addtogroup BLE_GAP_FUNCTIONS Functions - * @{ */ - -/**@brief Set the local Bluetooth identity address. - * - * The local Bluetooth identity address is the address that identifies this device to other peers. - * The address type must be either @ref BLE_GAP_ADDR_TYPE_PUBLIC or @ref BLE_GAP_ADDR_TYPE_RANDOM_STATIC. - * - * @note The identity address cannot be changed while advertising, scanning or creating a connection. - * - * @note This address will be distributed to the peer during bonding. - * If the address changes, the address stored in the peer device will not be valid and the ability to - * reconnect using the old address will be lost. - * - * @note By default the SoftDevice will set an address of type @ref BLE_GAP_ADDR_TYPE_RANDOM_STATIC upon being - * enabled. The address is a random number populated during the IC manufacturing process and remains unchanged - * for the lifetime of each IC. - * - * @mscs - * @mmsc{@ref BLE_GAP_ADV_MSC} - * @endmscs - * - * @param[in] p_addr Pointer to address structure. - * - * @retval ::NRF_SUCCESS Address successfully set. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR Invalid address. - * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. - * @retval ::NRF_ERROR_INVALID_STATE The identity address cannot be changed while advertising, - * scanning or creating a connection. - */ -SVCALL(SD_BLE_GAP_ADDR_SET, uint32_t, sd_ble_gap_addr_set(ble_gap_addr_t const *p_addr)); - - -/**@brief Get local Bluetooth identity address. - * - * @note This will always return the identity address irrespective of the privacy settings, - * i.e. the address type will always be either @ref BLE_GAP_ADDR_TYPE_PUBLIC or @ref BLE_GAP_ADDR_TYPE_RANDOM_STATIC. - * - * @param[out] p_addr Pointer to address structure to be filled in. - * - * @retval ::NRF_SUCCESS Address successfully retrieved. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid or NULL pointer supplied. - */ -SVCALL(SD_BLE_GAP_ADDR_GET, uint32_t, sd_ble_gap_addr_get(ble_gap_addr_t *p_addr)); - - -/**@brief Get the Bluetooth device address used by the advertiser. - * - * @note This function will return the local Bluetooth address used in advertising PDUs. When - * using privacy, the SoftDevice will generate a new private address every - * @ref ble_gap_privacy_params_t::private_addr_cycle_s configured using - * @ref sd_ble_gap_privacy_set. Hence depending on when the application calls this API, the - * address returned may not be the latest address that is used in the advertising PDUs. - * - * @param[in] adv_handle The advertising handle to get the address from. - * @param[out] p_addr Pointer to address structure to be filled in. - * - * @retval ::NRF_SUCCESS Address successfully retrieved. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid or NULL pointer supplied. - * @retval ::BLE_ERROR_INVALID_ADV_HANDLE The provided advertising handle was not found. - * @retval ::NRF_ERROR_INVALID_STATE The advertising set is currently not advertising. - */ -SVCALL(SD_BLE_GAP_ADV_ADDR_GET, uint32_t, sd_ble_gap_adv_addr_get(uint8_t adv_handle, ble_gap_addr_t *p_addr)); - - -/**@brief Set the active whitelist in the SoftDevice. - * - * @note Only one whitelist can be used at a time and the whitelist is shared between the BLE roles. - * The whitelist cannot be set if a BLE role is using the whitelist. - * - * @note If an address is resolved using the information in the device identity list, then the whitelist - * filter policy applies to the peer identity address and not the resolvable address sent on air. - * - * @mscs - * @mmsc{@ref BLE_GAP_WL_SHARE_MSC} - * @mmsc{@ref BLE_GAP_PRIVACY_SCAN_PRIVATE_SCAN_MSC} - * @endmscs - * - * @param[in] pp_wl_addrs Pointer to a whitelist of peer addresses, if NULL the whitelist will be cleared. - * @param[in] len Length of the whitelist, maximum @ref BLE_GAP_WHITELIST_ADDR_MAX_COUNT. - * - * @retval ::NRF_SUCCESS The whitelist is successfully set/cleared. - * @retval ::NRF_ERROR_INVALID_ADDR The whitelist (or one of its entries) provided is invalid. - * @retval ::BLE_ERROR_GAP_WHITELIST_IN_USE The whitelist is in use by a BLE role and cannot be set or cleared. - * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR Invalid address type is supplied. - * @retval ::NRF_ERROR_DATA_SIZE The given whitelist size is invalid (zero or too large); this can only return when - * pp_wl_addrs is not NULL. - */ -SVCALL(SD_BLE_GAP_WHITELIST_SET, uint32_t, sd_ble_gap_whitelist_set(ble_gap_addr_t const * const * pp_wl_addrs, uint8_t len)); - - -/**@brief Set device identity list. - * - * @note Only one device identity list can be used at a time and the list is shared between the BLE roles. - * The device identity list cannot be set if a BLE role is using the list. - * - * @param[in] pp_id_keys Pointer to an array of peer identity addresses and peer IRKs, if NULL the device identity list will be cleared. - * @param[in] pp_local_irks Pointer to an array of local IRKs. Each entry in the array maps to the entry in pp_id_keys at the same index. - * To fill in the list with the currently set device IRK for all peers, set to NULL. - * @param[in] len Length of the device identity list, maximum @ref BLE_GAP_DEVICE_IDENTITIES_MAX_COUNT. - * - * @mscs - * @mmsc{@ref BLE_GAP_PRIVACY_ADV_MSC} - * @mmsc{@ref BLE_GAP_PRIVACY_SCAN_MSC} - * @mmsc{@ref BLE_GAP_PRIVACY_SCAN_PRIVATE_SCAN_MSC} - * @mmsc{@ref BLE_GAP_PRIVACY_ADV_DIR_PRIV_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_CONN_PRIV_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_CONN_PRIV_MSC} - * @endmscs - * - * @retval ::NRF_SUCCESS The device identity list successfully set/cleared. - * @retval ::NRF_ERROR_INVALID_ADDR The device identity list (or one of its entries) provided is invalid. - * This code may be returned if the local IRK list also has an invalid entry. - * @retval ::BLE_ERROR_GAP_DEVICE_IDENTITIES_IN_USE The device identity list is in use and cannot be set or cleared. - * @retval ::BLE_ERROR_GAP_DEVICE_IDENTITIES_DUPLICATE The device identity list contains multiple entries with the same identity address. - * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR Invalid address type is supplied. - * @retval ::NRF_ERROR_DATA_SIZE The given device identity list size invalid (zero or too large); this can - * only return when pp_id_keys is not NULL. - */ -SVCALL(SD_BLE_GAP_DEVICE_IDENTITIES_SET, uint32_t, sd_ble_gap_device_identities_set(ble_gap_id_key_t const * const * pp_id_keys, ble_gap_irk_t const * const * pp_local_irks, uint8_t len)); - - -/**@brief Set privacy settings. - * - * @note Privacy settings cannot be changed while advertising, scanning or creating a connection. - * - * @param[in] p_privacy_params Privacy settings. - * - * @mscs - * @mmsc{@ref BLE_GAP_PRIVACY_ADV_MSC} - * @mmsc{@ref BLE_GAP_PRIVACY_SCAN_MSC} - * @mmsc{@ref BLE_GAP_PRIVACY_ADV_DIR_PRIV_MSC} - * @endmscs - * - * @retval ::NRF_SUCCESS Set successfully. - * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. - * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR Invalid address type is supplied. - * @retval ::NRF_ERROR_INVALID_ADDR The pointer to privacy settings is NULL or invalid. - * Otherwise, the p_device_irk pointer in privacy parameter is an invalid pointer. - * @retval ::NRF_ERROR_INVALID_PARAM Out of range parameters are provided. - * @retval ::NRF_ERROR_INVALID_STATE Privacy settings cannot be changed while advertising, scanning - * or creating a connection. - */ -SVCALL(SD_BLE_GAP_PRIVACY_SET, uint32_t, sd_ble_gap_privacy_set(ble_gap_privacy_params_t const *p_privacy_params)); - - -/**@brief Get privacy settings. - * - * @note ::ble_gap_privacy_params_t::p_device_irk must be initialized to NULL or a valid address before this function is called. - * If it is initialized to a valid address, the address pointed to will contain the current device IRK on return. - * - * @param[in,out] p_privacy_params Privacy settings. - * - * @retval ::NRF_SUCCESS Privacy settings read. - * @retval ::NRF_ERROR_INVALID_ADDR The pointer given for returning the privacy settings may be NULL or invalid. - * Otherwise, the p_device_irk pointer in privacy parameter is an invalid pointer. - */ -SVCALL(SD_BLE_GAP_PRIVACY_GET, uint32_t, sd_ble_gap_privacy_get(ble_gap_privacy_params_t *p_privacy_params)); - - -/**@brief Configure an advertising set. Set, clear or update advertising and scan response data. - * - * @note The format of the advertising data will be checked by this call to ensure interoperability. - * Limitations imposed by this API call to the data provided include having a flags data type in the scan response data and - * duplicating the local name in the advertising data and scan response data. - * - * @note In order to update advertising data while advertising, new advertising buffers must be provided. - * - * @mscs - * @mmsc{@ref BLE_GAP_ADV_MSC} - * @mmsc{@ref BLE_GAP_WL_SHARE_MSC} - * @endmscs - * - * @param[in,out] p_adv_handle Provide a pointer to a handle containing @ref BLE_GAP_ADV_SET_HANDLE_NOT_SET to configure - * a new advertising set. On success, a new handle is then returned through the pointer. - * Provide a pointer to an existing advertising handle to configure an existing advertising set. - * @param[in] p_adv_data Advertising data. If set to NULL, no advertising data will be used. See @ref ble_gap_adv_data_t. - * @param[in] p_adv_params Advertising parameters. When this function is used to update advertising data while advertising, - * this parameter must be NULL. See @ref ble_gap_adv_params_t. - * - * @retval ::NRF_SUCCESS Advertising set successfully configured. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied: - * - Invalid advertising data configuration specified. See @ref ble_gap_adv_data_t. - * - Invalid configuration of p_adv_params. See @ref ble_gap_adv_params_t. - * - Use of whitelist requested but whitelist has not been set, - * see @ref sd_ble_gap_whitelist_set. - * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR ble_gap_adv_params_t::p_peer_addr is invalid. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. Either: - * - It is invalid to provide non-NULL advertising set parameters while advertising. - * - It is invalid to provide the same data buffers while advertising. To update - * advertising data, provide new advertising buffers. - * @retval ::BLE_ERROR_GAP_DISCOVERABLE_WITH_WHITELIST Discoverable mode and whitelist incompatible. - * @retval ::BLE_ERROR_INVALID_ADV_HANDLE The provided advertising handle was not found. Use @ref BLE_GAP_ADV_SET_HANDLE_NOT_SET to - * configure a new advertising handle. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_FLAGS Invalid combination of advertising flags supplied. - * @retval ::NRF_ERROR_INVALID_DATA Invalid data type(s) supplied. Check the advertising data format specification - * given in Bluetooth Specification Version 5.0, Volume 3, Part C, Chapter 11. - * @retval ::NRF_ERROR_INVALID_LENGTH Invalid data length(s) supplied. - * @retval ::NRF_ERROR_NOT_SUPPORTED Unsupported data length or advertising parameter configuration. - * @retval ::NRF_ERROR_NO_MEM Not enough memory to configure a new advertising handle. Update an - * existing advertising handle instead. - * @retval ::BLE_ERROR_GAP_UUID_LIST_MISMATCH Invalid UUID list supplied. - */ -SVCALL(SD_BLE_GAP_ADV_SET_CONFIGURE, uint32_t, sd_ble_gap_adv_set_configure(uint8_t *p_adv_handle, ble_gap_adv_data_t const *p_adv_data, ble_gap_adv_params_t const *p_adv_params)); - - -/**@brief Start advertising (GAP Discoverable, Connectable modes, Broadcast Procedure). - * - * @note Only one advertiser may be active at any time. - * - * @events - * @event{@ref BLE_GAP_EVT_CONNECTED, Generated after connection has been established through connectable advertising.} - * @event{@ref BLE_GAP_EVT_ADV_SET_TERMINATED, Advertising set has terminated.} - * @event{@ref BLE_GAP_EVT_SCAN_REQ_REPORT, A scan request was received.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GAP_ADV_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_CONN_PRIV_MSC} - * @mmsc{@ref BLE_GAP_PRIVACY_ADV_DIR_PRIV_MSC} - * @mmsc{@ref BLE_GAP_WL_SHARE_MSC} - * @endmscs - * - * @param[in] adv_handle Advertising handle to advertise on, received from @ref sd_ble_gap_adv_set_configure. - * @param[in] conn_cfg_tag Tag identifying a configuration set by @ref sd_ble_cfg_set or - * @ref BLE_CONN_CFG_TAG_DEFAULT to use the default connection configuration. For non-connectable - * advertising, this is ignored. - * - * @retval ::NRF_SUCCESS The BLE stack has started advertising. - * @retval ::NRF_ERROR_INVALID_STATE adv_handle is not configured or already advertising. - * @retval ::NRF_ERROR_CONN_COUNT The limit of available connections has been reached; connectable advertiser cannot be started. - * @retval ::BLE_ERROR_INVALID_ADV_HANDLE Advertising handle not found. Configure a new adveriting handle with @ref sd_ble_gap_adv_set_configure. - * @retval ::NRF_ERROR_NOT_FOUND conn_cfg_tag not found. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied: - * - Invalid configuration of p_adv_params. See @ref ble_gap_adv_params_t. - * - Use of whitelist requested but whitelist has not been set, see @ref sd_ble_gap_whitelist_set. - * @retval ::NRF_ERROR_RESOURCES Either: - * - adv_handle is configured with connectable advertising, but the event_length parameter - * associated with conn_cfg_tag is too small to be able to establish a connection on - * the selected advertising phys. Use @ref sd_ble_cfg_set to increase the event length. - * - Not enough BLE role slots available. - Stop one or more currently active roles (Central, Peripheral, Broadcaster or Observer) and try again. - * - p_adv_params is configured with connectable advertising, but the event_length parameter - * associated with conn_cfg_tag is too small to be able to establish a connection on - * the selected advertising phys. Use @ref sd_ble_cfg_set to increase the event length. - */ -SVCALL(SD_BLE_GAP_ADV_START, uint32_t, sd_ble_gap_adv_start(uint8_t adv_handle, uint8_t conn_cfg_tag)); - - -/**@brief Stop advertising (GAP Discoverable, Connectable modes, Broadcast Procedure). - * - * @mscs - * @mmsc{@ref BLE_GAP_ADV_MSC} - * @mmsc{@ref BLE_GAP_WL_SHARE_MSC} - * @endmscs - * - * @param[in] adv_handle The advertising handle that should stop advertising. - * - * @retval ::NRF_SUCCESS The BLE stack has stopped advertising. - * @retval ::BLE_ERROR_INVALID_ADV_HANDLE Invalid advertising handle. - * @retval ::NRF_ERROR_INVALID_STATE The advertising handle is not advertising. - */ -SVCALL(SD_BLE_GAP_ADV_STOP, uint32_t, sd_ble_gap_adv_stop(uint8_t adv_handle)); - - - -/**@brief Update connection parameters. - * - * @details In the central role this will initiate a Link Layer connection parameter update procedure, - * otherwise in the peripheral role, this will send the corresponding L2CAP request and wait for - * the central to perform the procedure. In both cases, and regardless of success or failure, the application - * will be informed of the result with a @ref BLE_GAP_EVT_CONN_PARAM_UPDATE event. - * - * @details This function can be used as a central both to reply to a @ref BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST or to start the procedure unrequested. - * - * @events - * @event{@ref BLE_GAP_EVT_CONN_PARAM_UPDATE, Result of the connection parameter update procedure.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GAP_CPU_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_ENC_AUTH_MUTEX_MSC} - * @mmsc{@ref BLE_GAP_MULTILINK_CPU_MSC} - * @mmsc{@ref BLE_GAP_MULTILINK_CTRL_PROC_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_CPU_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] p_conn_params Pointer to desired connection parameters. If NULL is provided on a peripheral role, - * the parameters in the PPCP characteristic of the GAP service will be used instead. - * If NULL is provided on a central role and in response to a @ref BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST, the peripheral request will be rejected - * - * @retval ::NRF_SUCCESS The Connection Update procedure has been started successfully. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, check parameter limits and constraints. - * @retval ::NRF_ERROR_INVALID_STATE Disconnection in progress or link has not been established. - * @retval ::NRF_ERROR_BUSY Procedure already in progress, wait for pending procedures to complete and retry. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation. - */ -SVCALL(SD_BLE_GAP_CONN_PARAM_UPDATE, uint32_t, sd_ble_gap_conn_param_update(uint16_t conn_handle, ble_gap_conn_params_t const *p_conn_params)); - - -/**@brief Disconnect (GAP Link Termination). - * - * @details This call initiates the disconnection procedure, and its completion will be communicated to the application - * with a @ref BLE_GAP_EVT_DISCONNECTED event. - * - * @events - * @event{@ref BLE_GAP_EVT_DISCONNECTED, Generated when disconnection procedure is complete.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GAP_CONN_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] hci_status_code HCI status code, see @ref BLE_HCI_STATUS_CODES (accepted values are @ref BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION and @ref BLE_HCI_CONN_INTERVAL_UNACCEPTABLE). - * - * @retval ::NRF_SUCCESS The disconnection procedure has been started successfully. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - * @retval ::NRF_ERROR_INVALID_STATE Disconnection in progress or link has not been established. - */ -SVCALL(SD_BLE_GAP_DISCONNECT, uint32_t, sd_ble_gap_disconnect(uint16_t conn_handle, uint8_t hci_status_code)); - - -/**@brief Set the radio's transmit power. - * - * @param[in] role The role to set the transmit power for, see @ref BLE_GAP_TX_POWER_ROLES for - * possible roles. - * @param[in] handle The handle parameter is interpreted depending on role: - * - If role is @ref BLE_GAP_TX_POWER_ROLE_CONN, this value is the specific connection handle. - * - If role is @ref BLE_GAP_TX_POWER_ROLE_ADV, the advertising set identified with the advertising handle, - * will use the specified transmit power, and include it in the advertising packet headers if - * @ref ble_gap_adv_properties_t::include_tx_power set. - * - For all other roles handle is ignored. - * @param[in] tx_power Radio transmit power in dBm (see note for accepted values). - * - * @note Supported tx_power values: -40dBm, -20dBm, -16dBm, -12dBm, -8dBm, -4dBm, 0dBm, +2dBm, +3dBm, +4dBm, +5dBm, +6dBm, +7dBm and +8dBm. - * @note The initiator will have the same transmit power as the scanner. - * @note When a connection is created it will inherit the transmit power from the initiator or - * advertiser leading to the connection. - * - * @retval ::NRF_SUCCESS Successfully changed the transmit power. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::BLE_ERROR_INVALID_ADV_HANDLE Advertising handle not found. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - */ -SVCALL(SD_BLE_GAP_TX_POWER_SET, uint32_t, sd_ble_gap_tx_power_set(uint8_t role, uint16_t handle, int8_t tx_power)); - - -/**@brief Set GAP Appearance value. - * - * @param[in] appearance Appearance (16-bit), see @ref BLE_APPEARANCES. - * - * @retval ::NRF_SUCCESS Appearance value set successfully. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - */ -SVCALL(SD_BLE_GAP_APPEARANCE_SET, uint32_t, sd_ble_gap_appearance_set(uint16_t appearance)); - - -/**@brief Get GAP Appearance value. - * - * @param[out] p_appearance Pointer to appearance (16-bit) to be filled in, see @ref BLE_APPEARANCES. - * - * @retval ::NRF_SUCCESS Appearance value retrieved successfully. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - */ -SVCALL(SD_BLE_GAP_APPEARANCE_GET, uint32_t, sd_ble_gap_appearance_get(uint16_t *p_appearance)); - - -/**@brief Set GAP Peripheral Preferred Connection Parameters. - * - * @param[in] p_conn_params Pointer to a @ref ble_gap_conn_params_t structure with the desired parameters. - * - * @retval ::NRF_SUCCESS Peripheral Preferred Connection Parameters set successfully. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - */ -SVCALL(SD_BLE_GAP_PPCP_SET, uint32_t, sd_ble_gap_ppcp_set(ble_gap_conn_params_t const *p_conn_params)); - - -/**@brief Get GAP Peripheral Preferred Connection Parameters. - * - * @param[out] p_conn_params Pointer to a @ref ble_gap_conn_params_t structure where the parameters will be stored. - * - * @retval ::NRF_SUCCESS Peripheral Preferred Connection Parameters retrieved successfully. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - */ -SVCALL(SD_BLE_GAP_PPCP_GET, uint32_t, sd_ble_gap_ppcp_get(ble_gap_conn_params_t *p_conn_params)); - - -/**@brief Set GAP device name. - * - * @note If the device name is located in application flash memory (see @ref ble_gap_cfg_device_name_t), - * it cannot be changed. Then @ref NRF_ERROR_FORBIDDEN will be returned. - * - * @param[in] p_write_perm Write permissions for the Device Name characteristic, see @ref ble_gap_conn_sec_mode_t. - * @param[in] p_dev_name Pointer to a UTF-8 encoded, non NULL-terminated string. - * @param[in] len Length of the UTF-8, non NULL-terminated string pointed to by p_dev_name in octets (must be smaller or equal than @ref BLE_GAP_DEVNAME_MAX_LEN). - * - * @retval ::NRF_SUCCESS GAP device name and permissions set successfully. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied. - * @retval ::NRF_ERROR_FORBIDDEN Device name is not writable. - */ -SVCALL(SD_BLE_GAP_DEVICE_NAME_SET, uint32_t, sd_ble_gap_device_name_set(ble_gap_conn_sec_mode_t const *p_write_perm, uint8_t const *p_dev_name, uint16_t len)); - - -/**@brief Get GAP device name. - * - * @note If the device name is longer than the size of the supplied buffer, - * p_len will return the complete device name length, - * and not the number of bytes actually returned in p_dev_name. - * The application may use this information to allocate a suitable buffer size. - * - * @param[out] p_dev_name Pointer to an empty buffer where the UTF-8 non NULL-terminated string will be placed. Set to NULL to obtain the complete device name length. - * @param[in,out] p_len Length of the buffer pointed by p_dev_name, complete device name length on output. - * - * @retval ::NRF_SUCCESS GAP device name retrieved successfully. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied. - */ -SVCALL(SD_BLE_GAP_DEVICE_NAME_GET, uint32_t, sd_ble_gap_device_name_get(uint8_t *p_dev_name, uint16_t *p_len)); - - -/**@brief Initiate the GAP Authentication procedure. - * - * @details In the central role, this function will send an SMP Pairing Request (or an SMP Pairing Failed if rejected), - * otherwise in the peripheral role, an SMP Security Request will be sent. - * - * @events - * @event{Depending on the security parameters set and the packet exchanges with the peer\, the following events may be generated:} - * @event{@ref BLE_GAP_EVT_SEC_PARAMS_REQUEST} - * @event{@ref BLE_GAP_EVT_SEC_INFO_REQUEST} - * @event{@ref BLE_GAP_EVT_PASSKEY_DISPLAY} - * @event{@ref BLE_GAP_EVT_KEY_PRESSED} - * @event{@ref BLE_GAP_EVT_AUTH_KEY_REQUEST} - * @event{@ref BLE_GAP_EVT_LESC_DHKEY_REQUEST} - * @event{@ref BLE_GAP_EVT_CONN_SEC_UPDATE} - * @event{@ref BLE_GAP_EVT_AUTH_STATUS} - * @event{@ref BLE_GAP_EVT_TIMEOUT} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GAP_PERIPH_SEC_REQ_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_SEC_REQ_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_ENC_AUTH_MUTEX_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_PAIRING_JW_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_BONDING_JW_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_BONDING_PK_PERIPH_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_BONDING_PK_PERIPH_OOB_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_PAIRING_JW_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_NC_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_PKE_PD_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_PKE_CD_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_OOB_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] p_sec_params Pointer to the @ref ble_gap_sec_params_t structure with the security parameters to be used during the pairing or bonding procedure. - * In the peripheral role, only the bond, mitm, lesc and keypress fields of this structure are used. - * In the central role, this pointer may be NULL to reject a Security Request. - * - * @retval ::NRF_SUCCESS Successfully initiated authentication procedure. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. Either: - * - No link has been established. - * - An encryption is already executing or queued. - * @retval ::NRF_ERROR_NO_MEM The maximum number of authentication procedures that can run in parallel for the given role is reached. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - * @retval ::NRF_ERROR_NOT_SUPPORTED Setting of sign or link fields in @ref ble_gap_sec_kdist_t not supported. - * @retval ::NRF_ERROR_TIMEOUT A SMP timeout has occurred, and further SMP operations on this link is prohibited. - */ -SVCALL(SD_BLE_GAP_AUTHENTICATE, uint32_t, sd_ble_gap_authenticate(uint16_t conn_handle, ble_gap_sec_params_t const *p_sec_params)); - - -/**@brief Reply with GAP security parameters. - * - * @details This function is only used to reply to a @ref BLE_GAP_EVT_SEC_PARAMS_REQUEST, calling it at other times will result in an @ref NRF_ERROR_INVALID_STATE. - * @note If the call returns an error code, the request is still pending, and the reply call may be repeated with corrected parameters. - * - * @events - * @event{This function is used during authentication procedures\, see the list of events in the documentation of @ref sd_ble_gap_authenticate.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GAP_PERIPH_PAIRING_JW_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_BONDING_JW_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_BONDING_PK_PERIPH_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_BONDING_PK_CENTRAL_OOB_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_BONDING_STATIC_PK_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_PAIRING_CONFIRM_FAIL_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_LESC_PAIRING_JW_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_NC_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_PKE_PD_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_PKE_CD_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_OOB_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_PAIRING_KS_TOO_SMALL_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_PAIRING_APP_ERROR_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_PAIRING_REMOTE_PAIRING_FAIL_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_PAIRING_TIMEOUT_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_PAIRING_JW_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_BONDING_JW_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_BONDING_PK_PERIPH_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_BONDING_PK_PERIPH_OOB_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_PAIRING_JW_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_NC_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_PKE_PD_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_PKE_CD_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_OOB_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] sec_status Security status, see @ref BLE_GAP_SEC_STATUS. - * @param[in] p_sec_params Pointer to a @ref ble_gap_sec_params_t security parameters structure. In the central role this must be set to NULL, as the parameters have - * already been provided during a previous call to @ref sd_ble_gap_authenticate. - * @param[in,out] p_sec_keyset Pointer to a @ref ble_gap_sec_keyset_t security keyset structure. Any keys generated and/or distributed as a result of the ongoing security procedure - * will be stored into the memory referenced by the pointers inside this structure. The keys will be stored and available to the application - * upon reception of a @ref BLE_GAP_EVT_AUTH_STATUS event. - * Note that the SoftDevice expects the application to provide memory for storing the - * peer's keys. So it must be ensured that the relevant pointers inside this structure are not NULL. The pointers to the local key - * can, however, be NULL, in which case, the local key data will not be available to the application upon reception of the - * @ref BLE_GAP_EVT_AUTH_STATUS event. - * - * @retval ::NRF_SUCCESS Successfully accepted security parameter from the application. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_INVALID_STATE Security parameters has not been requested. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - * @retval ::NRF_ERROR_NOT_SUPPORTED Setting of sign or link fields in @ref ble_gap_sec_kdist_t not supported. - */ -SVCALL(SD_BLE_GAP_SEC_PARAMS_REPLY, uint32_t, sd_ble_gap_sec_params_reply(uint16_t conn_handle, uint8_t sec_status, ble_gap_sec_params_t const *p_sec_params, ble_gap_sec_keyset_t const *p_sec_keyset)); - - -/**@brief Reply with an authentication key. - * - * @details This function is only used to reply to a @ref BLE_GAP_EVT_AUTH_KEY_REQUEST or a @ref BLE_GAP_EVT_PASSKEY_DISPLAY, calling it at other times will result in an @ref NRF_ERROR_INVALID_STATE. - * @note If the call returns an error code, the request is still pending, and the reply call may be repeated with corrected parameters. - * - * @events - * @event{This function is used during authentication procedures\, see the list of events in the documentation of @ref sd_ble_gap_authenticate.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GAP_PERIPH_BONDING_PK_CENTRAL_OOB_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_NC_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_PKE_CD_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_BONDING_PK_PERIPH_OOB_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_NC_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_PKE_CD_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] key_type See @ref BLE_GAP_AUTH_KEY_TYPES. - * @param[in] p_key If key type is @ref BLE_GAP_AUTH_KEY_TYPE_NONE, then NULL. - * If key type is @ref BLE_GAP_AUTH_KEY_TYPE_PASSKEY, then a 6-byte ASCII string (digit 0..9 only, no NULL termination) - * or NULL when confirming LE Secure Connections Numeric Comparison. - * If key type is @ref BLE_GAP_AUTH_KEY_TYPE_OOB, then a 16-byte OOB key value in little-endian format. - * - * @retval ::NRF_SUCCESS Authentication key successfully set. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_INVALID_STATE Authentication key has not been requested. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - */ -SVCALL(SD_BLE_GAP_AUTH_KEY_REPLY, uint32_t, sd_ble_gap_auth_key_reply(uint16_t conn_handle, uint8_t key_type, uint8_t const *p_key)); - - -/**@brief Reply with an LE Secure connections DHKey. - * - * @details This function is only used to reply to a @ref BLE_GAP_EVT_LESC_DHKEY_REQUEST, calling it at other times will result in an @ref NRF_ERROR_INVALID_STATE. - * @note If the call returns an error code, the request is still pending, and the reply call may be repeated with corrected parameters. - * - * @events - * @event{This function is used during authentication procedures\, see the list of events in the documentation of @ref sd_ble_gap_authenticate.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GAP_PERIPH_LESC_PAIRING_JW_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_NC_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_PKE_PD_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_PKE_CD_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_OOB_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_PAIRING_JW_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_NC_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_PKE_PD_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_PKE_CD_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_OOB_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] p_dhkey LE Secure Connections DHKey. - * - * @retval ::NRF_SUCCESS DHKey successfully set. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. Either: - * - The peer is not authenticated. - * - The application has not pulled a @ref BLE_GAP_EVT_LESC_DHKEY_REQUEST event. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - */ -SVCALL(SD_BLE_GAP_LESC_DHKEY_REPLY, uint32_t, sd_ble_gap_lesc_dhkey_reply(uint16_t conn_handle, ble_gap_lesc_dhkey_t const *p_dhkey)); - - -/**@brief Notify the peer of a local keypress. - * - * @mscs - * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_PKE_CD_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_PKE_CD_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] kp_not See @ref BLE_GAP_KP_NOT_TYPES. - * - * @retval ::NRF_SUCCESS Keypress notification successfully queued for transmission. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. Either: - * - Authentication key not requested. - * - Passkey has not been entered. - * - Keypresses have not been enabled by both peers. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - * @retval ::NRF_ERROR_BUSY The BLE stack is busy. Retry at later time. - */ -SVCALL(SD_BLE_GAP_KEYPRESS_NOTIFY, uint32_t, sd_ble_gap_keypress_notify(uint16_t conn_handle, uint8_t kp_not)); - - -/**@brief Generate a set of OOB data to send to a peer out of band. - * - * @note The @ref ble_gap_addr_t included in the OOB data returned will be the currently active one (or, if a connection has already been established, - * the one used during connection setup). The application may manually overwrite it with an updated value. - * - * @mscs - * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_OOB_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_OOB_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. Can be @ref BLE_CONN_HANDLE_INVALID if a BLE connection has not been established yet. - * @param[in] p_pk_own LE Secure Connections local P-256 Public Key. - * @param[out] p_oobd_own The OOB data to be sent out of band to a peer. - * - * @retval ::NRF_SUCCESS OOB data successfully generated. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - */ -SVCALL(SD_BLE_GAP_LESC_OOB_DATA_GET, uint32_t, sd_ble_gap_lesc_oob_data_get(uint16_t conn_handle, ble_gap_lesc_p256_pk_t const *p_pk_own, ble_gap_lesc_oob_data_t *p_oobd_own)); - -/**@brief Provide the OOB data sent/received out of band. - * - * @note An authentication procedure with OOB selected as an algorithm must be in progress when calling this function. - * @note A @ref BLE_GAP_EVT_LESC_DHKEY_REQUEST event with the oobd_req set to 1 must have been received prior to calling this function. - * - * @events - * @event{This function is used during authentication procedures\, see the list of events in the documentation of @ref sd_ble_gap_authenticate.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_OOB_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_OOB_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] p_oobd_own The OOB data sent out of band to a peer or NULL if the peer has not received OOB data. - * Must correspond to @ref ble_gap_sec_params_t::oob flag in @ref BLE_GAP_EVT_SEC_PARAMS_REQUEST. - * @param[in] p_oobd_peer The OOB data received out of band from a peer or NULL if none received. - * Must correspond to @ref ble_gap_sec_params_t::oob flag - * in @ref sd_ble_gap_authenticate in the central role or - * in @ref sd_ble_gap_sec_params_reply in the peripheral role. - * - * @retval ::NRF_SUCCESS OOB data accepted. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. Either: - * - Authentication key not requested - * - Not expecting LESC OOB data - * - Have not actually exchanged passkeys. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - */ -SVCALL(SD_BLE_GAP_LESC_OOB_DATA_SET, uint32_t, sd_ble_gap_lesc_oob_data_set(uint16_t conn_handle, ble_gap_lesc_oob_data_t const *p_oobd_own, ble_gap_lesc_oob_data_t const *p_oobd_peer)); - - -/**@brief Initiate GAP Encryption procedure. - * - * @details In the central role, this function will initiate the encryption procedure using the encryption information provided. - * - * @events - * @event{@ref BLE_GAP_EVT_CONN_SEC_UPDATE, The connection security has been updated.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GAP_CENTRAL_ENC_AUTH_MUTEX_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_ENC_MSC} - * @mmsc{@ref BLE_GAP_MULTILINK_CTRL_PROC_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_SEC_REQ_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] p_master_id Pointer to a @ref ble_gap_master_id_t master identification structure. - * @param[in] p_enc_info Pointer to a @ref ble_gap_enc_info_t encryption information structure. - * - * @retval ::NRF_SUCCESS Successfully initiated authentication procedure. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_STATE No link has been established. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - * @retval ::BLE_ERROR_INVALID_ROLE Operation is not supported in the Peripheral role. - * @retval ::NRF_ERROR_BUSY Procedure already in progress or not allowed at this time, wait for pending procedures to complete and retry. - */ -SVCALL(SD_BLE_GAP_ENCRYPT, uint32_t, sd_ble_gap_encrypt(uint16_t conn_handle, ble_gap_master_id_t const *p_master_id, ble_gap_enc_info_t const *p_enc_info)); - - -/**@brief Reply with GAP security information. - * - * @details This function is only used to reply to a @ref BLE_GAP_EVT_SEC_INFO_REQUEST, calling it at other times will result in @ref NRF_ERROR_INVALID_STATE. - * @note If the call returns an error code, the request is still pending, and the reply call may be repeated with corrected parameters. - * @note Data signing is not yet supported, and p_sign_info must therefore be NULL. - * - * @mscs - * @mmsc{@ref BLE_GAP_PERIPH_ENC_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] p_enc_info Pointer to a @ref ble_gap_enc_info_t encryption information structure. May be NULL to signal none is available. - * @param[in] p_id_info Pointer to a @ref ble_gap_irk_t identity information structure. May be NULL to signal none is available. - * @param[in] p_sign_info Pointer to a @ref ble_gap_sign_info_t signing information structure. May be NULL to signal none is available. - * - * @retval ::NRF_SUCCESS Successfully accepted security information. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. Either: - * - No link has been established. - * - No @ref BLE_GAP_EVT_SEC_REQUEST pending. - * - LE long term key requested command not allowed. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - */ -SVCALL(SD_BLE_GAP_SEC_INFO_REPLY, uint32_t, sd_ble_gap_sec_info_reply(uint16_t conn_handle, ble_gap_enc_info_t const *p_enc_info, ble_gap_irk_t const *p_id_info, ble_gap_sign_info_t const *p_sign_info)); - - -/**@brief Get the current connection security. - * - * @param[in] conn_handle Connection handle. - * @param[out] p_conn_sec Pointer to a @ref ble_gap_conn_sec_t structure to be filled in. - * - * @retval ::NRF_SUCCESS Current connection security successfully retrieved. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - */ -SVCALL(SD_BLE_GAP_CONN_SEC_GET, uint32_t, sd_ble_gap_conn_sec_get(uint16_t conn_handle, ble_gap_conn_sec_t *p_conn_sec)); - - -/**@brief Start reporting the received signal strength to the application. - * - * A new event is reported whenever the RSSI value changes, until @ref sd_ble_gap_rssi_stop is called. - * - * @events - * @event{@ref BLE_GAP_EVT_RSSI_CHANGED, New RSSI data available. How often the event is generated is - * dependent on the settings of the threshold_dbm - * and skip_count input parameters.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GAP_CENTRAL_RSSI_READ_MSC} - * @mmsc{@ref BLE_GAP_RSSI_FILT_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] threshold_dbm Minimum change in dBm before triggering the @ref BLE_GAP_EVT_RSSI_CHANGED event. Events are disabled if threshold_dbm equals @ref BLE_GAP_RSSI_THRESHOLD_INVALID. - * @param[in] skip_count Number of RSSI samples with a change of threshold_dbm or more before sending a new @ref BLE_GAP_EVT_RSSI_CHANGED event. - * - * @retval ::NRF_SUCCESS Successfully activated RSSI reporting. - * @retval ::NRF_ERROR_INVALID_STATE RSSI reporting is already ongoing. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - */ -SVCALL(SD_BLE_GAP_RSSI_START, uint32_t, sd_ble_gap_rssi_start(uint16_t conn_handle, uint8_t threshold_dbm, uint8_t skip_count)); - - -/**@brief Stop reporting the received signal strength. - * - * @note An RSSI change detected before the call but not yet received by the application - * may be reported after @ref sd_ble_gap_rssi_stop has been called. - * - * @mscs - * @mmsc{@ref BLE_GAP_CENTRAL_RSSI_READ_MSC} - * @mmsc{@ref BLE_GAP_RSSI_FILT_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * - * @retval ::NRF_SUCCESS Successfully deactivated RSSI reporting. - * @retval ::NRF_ERROR_INVALID_STATE RSSI reporting is not ongoing. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - */ -SVCALL(SD_BLE_GAP_RSSI_STOP, uint32_t, sd_ble_gap_rssi_stop(uint16_t conn_handle)); - - -/**@brief Get the received signal strength for the last connection event. - * - * @ref sd_ble_gap_rssi_start must be called to start reporting RSSI before using this function. @ref NRF_ERROR_NOT_FOUND - * will be returned until RSSI was sampled for the first time after calling @ref sd_ble_gap_rssi_start. - * @note ERRATA-153 requires the rssi sample to be compensated based on a temperature measurement. - * @mscs - * @mmsc{@ref BLE_GAP_CENTRAL_RSSI_READ_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[out] p_rssi Pointer to the location where the RSSI measurement shall be stored. - * @param[out] p_ch_index Pointer to the location where Channel Index for the RSSI measurement shall be stored. - * - * @retval ::NRF_SUCCESS Successfully read the RSSI. - * @retval ::NRF_ERROR_NOT_FOUND No sample is available. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - * @retval ::NRF_ERROR_INVALID_STATE RSSI reporting is not ongoing. - */ -SVCALL(SD_BLE_GAP_RSSI_GET, uint32_t, sd_ble_gap_rssi_get(uint16_t conn_handle, int8_t *p_rssi, uint8_t *p_ch_index)); - - -/**@brief Start or continue scanning (GAP Discovery procedure, Observer Procedure). - * - * @note A call to this function will require the application to keep the memory pointed by - * p_adv_report_buffer alive until the buffer is released. The buffer is released when the scanner is stopped - * or when this function is called with another buffer. - * - * @note The scanner will automatically stop in the following cases: - * - @ref sd_ble_gap_scan_stop is called. - * - @ref sd_ble_gap_connect is called. - * - A @ref BLE_GAP_EVT_TIMEOUT with source set to @ref BLE_GAP_TIMEOUT_SRC_SCAN is received. - * - When a @ref BLE_GAP_EVT_ADV_REPORT event is received and @ref ble_gap_adv_report_type_t::status is not set to - * @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA. In this case scanning is only paused to let the application - * access received data. The application must call this function to continue scanning, or call @ref sd_ble_gap_scan_stop - * to stop scanning. - * - * @note If a @ref BLE_GAP_EVT_ADV_REPORT event is received with @ref ble_gap_adv_report_type_t::status set to - * @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA, the scanner will continue scanning, and the application will - * receive more reports from this advertising event. The following reports will include the old and new received data. - * - * @events - * @event{@ref BLE_GAP_EVT_ADV_REPORT, An advertising or scan response packet has been received.} - * @event{@ref BLE_GAP_EVT_TIMEOUT, Scanner has timed out.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GAP_SCAN_MSC} - * @mmsc{@ref BLE_GAP_WL_SHARE_MSC} - * @endmscs - * - * @param[in] p_scan_params Pointer to scan parameters structure. When this function is used to continue - * scanning, this parameter must be NULL. - * @param[in] p_adv_report_buffer Pointer to buffer used to store incoming advertising data. - * The memory pointed to should be kept alive until the scanning is stopped. - * See @ref BLE_GAP_SCAN_BUFFER_SIZE for minimum and maximum buffer size. - * If the scanner receives advertising data larger than can be stored in the buffer, - * a @ref BLE_GAP_EVT_ADV_REPORT will be raised with @ref ble_gap_adv_report_type_t::status - * set to @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_TRUNCATED. - * - * @retval ::NRF_SUCCESS Successfully initiated scanning procedure. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. Either: - * - Scanning is already ongoing and p_scan_params was not NULL - * - Scanning is not running and p_scan_params was NULL. - * - The scanner has timed out when this function is called to continue scanning. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. See @ref ble_gap_scan_params_t. - * @retval ::NRF_ERROR_NOT_SUPPORTED Unsupported parameters supplied. See @ref ble_gap_scan_params_t. - * @retval ::NRF_ERROR_INVALID_LENGTH The provided buffer length is invalid. See @ref BLE_GAP_SCAN_BUFFER_MIN. - * @retval ::NRF_ERROR_RESOURCES Not enough BLE role slots available. - * Stop one or more currently active roles (Central, Peripheral or Broadcaster) and try again - */ -SVCALL(SD_BLE_GAP_SCAN_START, uint32_t, sd_ble_gap_scan_start(ble_gap_scan_params_t const *p_scan_params, ble_data_t const * p_adv_report_buffer)); - - -/**@brief Stop scanning (GAP Discovery procedure, Observer Procedure). - * - * @note The buffer provided in @ref sd_ble_gap_scan_start is released. - * - * @mscs - * @mmsc{@ref BLE_GAP_SCAN_MSC} - * @mmsc{@ref BLE_GAP_WL_SHARE_MSC} - * @endmscs - * - * @retval ::NRF_SUCCESS Successfully stopped scanning procedure. - * @retval ::NRF_ERROR_INVALID_STATE Not in the scanning state. - */ -SVCALL(SD_BLE_GAP_SCAN_STOP, uint32_t, sd_ble_gap_scan_stop(void)); - - -/**@brief Create a connection (GAP Link Establishment). - * - * @note If a scanning procedure is currently in progress it will be automatically stopped when calling this function. - * The scanning procedure will be stopped even if the function returns an error. - * - * @events - * @event{@ref BLE_GAP_EVT_CONNECTED, A connection was established.} - * @event{@ref BLE_GAP_EVT_TIMEOUT, Failed to establish a connection.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GAP_WL_SHARE_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_CONN_PRIV_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_CONN_MSC} - * @endmscs - * - * @param[in] p_peer_addr Pointer to peer identity address. If @ref ble_gap_scan_params_t::filter_policy is set to use - * whitelist, then p_peer_addr is ignored. - * @param[in] p_scan_params Pointer to scan parameters structure. - * @param[in] p_conn_params Pointer to desired connection parameters. - * @param[in] conn_cfg_tag Tag identifying a configuration set by @ref sd_ble_cfg_set or - * @ref BLE_CONN_CFG_TAG_DEFAULT to use the default connection configuration. - * - * @retval ::NRF_SUCCESS Successfully initiated connection procedure. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid parameter(s) pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * - Invalid parameter(s) in p_scan_params or p_conn_params. - * - Use of whitelist requested but whitelist has not been set, see @ref sd_ble_gap_whitelist_set. - * - Peer address was not present in the device identity list, see @ref sd_ble_gap_device_identities_set. - * @retval ::NRF_ERROR_NOT_FOUND conn_cfg_tag not found. - * @retval ::NRF_ERROR_INVALID_STATE The SoftDevice is in an invalid state to perform this operation. This may be due to an - * existing locally initiated connect procedure, which must complete before initiating again. - * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR Invalid Peer address. - * @retval ::NRF_ERROR_CONN_COUNT The limit of available connections has been reached. - * @retval ::NRF_ERROR_RESOURCES Either: - * - Not enough BLE role slots available. - * Stop one or more currently active roles (Central, Peripheral or Observer) and try again. - * - The event_length parameter associated with conn_cfg_tag is too small to be able to - * establish a connection on the selected @ref ble_gap_scan_params_t::scan_phys. - * Use @ref sd_ble_cfg_set to increase the event length. - */ -SVCALL(SD_BLE_GAP_CONNECT, uint32_t, sd_ble_gap_connect(ble_gap_addr_t const *p_peer_addr, ble_gap_scan_params_t const *p_scan_params, ble_gap_conn_params_t const *p_conn_params, uint8_t conn_cfg_tag)); - - -/**@brief Cancel a connection establishment. - * - * @mscs - * @mmsc{@ref BLE_GAP_CENTRAL_CONN_MSC} - * @endmscs - * - * @retval ::NRF_SUCCESS Successfully canceled an ongoing connection procedure. - * @retval ::NRF_ERROR_INVALID_STATE No locally initiated connect procedure started or connection - * completed occurred. - */ -SVCALL(SD_BLE_GAP_CONNECT_CANCEL, uint32_t, sd_ble_gap_connect_cancel(void)); - - -/**@brief Initiate or respond to a PHY Update Procedure - * - * @details This function is used to initiate or respond to a PHY Update Procedure. It will always - * generate a @ref BLE_GAP_EVT_PHY_UPDATE event if successfully executed. - * If this function is used to initiate a PHY Update procedure and the only option - * provided in @ref ble_gap_phys_t::tx_phys and @ref ble_gap_phys_t::rx_phys is the - * currently active PHYs in the respective directions, the SoftDevice will generate a - * @ref BLE_GAP_EVT_PHY_UPDATE with the current PHYs set and will not initiate the - * procedure in the Link Layer. - * - * If @ref ble_gap_phys_t::tx_phys or @ref ble_gap_phys_t::rx_phys is @ref BLE_GAP_PHY_AUTO, - * then the stack will select PHYs based on the peer's PHY preferences and the local link - * configuration. The PHY Update procedure will for this case result in a PHY combination - * that respects the time constraints configured with @ref sd_ble_cfg_set and the current - * link layer data length. - * - * When acting as a central, the SoftDevice will select the fastest common PHY in each direction. - * - * If the peer does not support the PHY Update Procedure, then the resulting - * @ref BLE_GAP_EVT_PHY_UPDATE event will have a status set to - * @ref BLE_HCI_UNSUPPORTED_REMOTE_FEATURE. - * - * If the PHY procedure was rejected by the peer due to a procedure collision, the status - * will be @ref BLE_HCI_STATUS_CODE_LMP_ERROR_TRANSACTION_COLLISION or - * @ref BLE_HCI_DIFFERENT_TRANSACTION_COLLISION. - * If the peer responds to the PHY Update procedure with invalid parameters, the status - * will be @ref BLE_HCI_STATUS_CODE_INVALID_LMP_PARAMETERS. - * If the PHY procedure was rejected by the peer for a different reason, the status will - * contain the reason as specified by the peer. - * - * @events - * @event{@ref BLE_GAP_EVT_PHY_UPDATE, Result of the PHY Update Procedure.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GAP_CENTRAL_PHY_UPDATE} - * @mmsc{@ref BLE_GAP_PERIPHERAL_PHY_UPDATE} - * @endmscs - * - * @param[in] conn_handle Connection handle to indicate the connection for which the PHY Update is requested. - * @param[in] p_gap_phys Pointer to PHY structure. - * - * @retval ::NRF_SUCCESS Successfully requested a PHY Update. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_INVALID_STATE No link has been established. - * @retval ::NRF_ERROR_RESOURCES The connection event length configured for this link is not sufficient for the combination of - * @ref ble_gap_phys_t::tx_phys, @ref ble_gap_phys_t::rx_phys, and @ref ble_gap_data_length_params_t. - * The connection event length is configured with @ref BLE_CONN_CFG_GAP using @ref sd_ble_cfg_set. - * @retval ::NRF_ERROR_BUSY Procedure is already in progress or not allowed at this time. Process pending events and wait for the pending procedure to complete and retry. - * - */ -SVCALL(SD_BLE_GAP_PHY_UPDATE, uint32_t, sd_ble_gap_phy_update(uint16_t conn_handle, ble_gap_phys_t const *p_gap_phys)); - - -/**@brief Initiate or respond to a Data Length Update Procedure. - * - * @note If the application uses @ref BLE_GAP_DATA_LENGTH_AUTO for one or more members of - * p_dl_params, the SoftDevice will choose the highest value supported in current - * configuration and connection parameters. - * @note If the link PHY is Coded, the SoftDevice will ensure that the MaxTxTime and/or MaxRxTime - * used in the Data Length Update procedure is at least 2704 us. Otherwise, MaxTxTime and - * MaxRxTime will be limited to maximum 2120 us. - * - * @param[in] conn_handle Connection handle. - * @param[in] p_dl_params Pointer to local parameters to be used in Data Length Update - * Procedure. Set any member to @ref BLE_GAP_DATA_LENGTH_AUTO to let - * the SoftDevice automatically decide the value for that member. - * Set to NULL to use automatic values for all members. - * @param[out] p_dl_limitation Pointer to limitation to be written when local device does not - * have enough resources or does not support the requested Data Length - * Update parameters. Ignored if NULL. - * - * @mscs - * @mmsc{@ref BLE_GAP_DATA_LENGTH_UPDATE_PROCEDURE_MSC} - * @endmscs - * - * @retval ::NRF_SUCCESS Successfully set Data Length Extension initiation/response parameters. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle parameter supplied. - * @retval ::NRF_ERROR_INVALID_STATE No link has been established. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameters supplied. - * @retval ::NRF_ERROR_NOT_SUPPORTED The requested parameters are not supported by the SoftDevice. Inspect - * p_dl_limitation to see which parameter is not supported. - * @retval ::NRF_ERROR_RESOURCES The connection event length configured for this link is not sufficient for the requested parameters. - * Use @ref sd_ble_cfg_set with @ref BLE_CONN_CFG_GAP to increase the connection event length. - * Inspect p_dl_limitation to see where the limitation is. - * @retval ::NRF_ERROR_BUSY Peer has already initiated a Data Length Update Procedure. Process the - * pending @ref BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST event to respond. - */ -SVCALL(SD_BLE_GAP_DATA_LENGTH_UPDATE, uint32_t, sd_ble_gap_data_length_update(uint16_t conn_handle, ble_gap_data_length_params_t const *p_dl_params, ble_gap_data_length_limitation_t *p_dl_limitation)); - -/**@brief Start the Quality of Service (QoS) channel survey module. - * - * @details The channel survey module provides measurements of the energy levels on - * the Bluetooth Low Energy channels. When the module is enabled, @ref BLE_GAP_EVT_QOS_CHANNEL_SURVEY_REPORT - * events will periodically report the measured energy levels for each channel. - * - * @note The measurements are scheduled with lower priority than other Bluetooth Low Energy roles, - * Radio Timeslot API events and Flash API events. - * - * @note The channel survey module will attempt to do measurements so that the average interval - * between measurements will be interval_us. However due to the channel survey module - * having the lowest priority of all roles and modules, this may not be possible. In that - * case fewer than expected channel survey reports may be given. - * - * @note In order to use the channel survey module, @ref ble_gap_cfg_role_count_t::qos_channel_survey_role_available - * must be set. This is done using @ref sd_ble_cfg_set. - * - * @param[in] interval_us Requested average interval for the measurements and reports. See - * @ref BLE_GAP_QOS_CHANNEL_SURVEY_INTERVALS for valid ranges. If set - * to @ref BLE_GAP_QOS_CHANNEL_SURVEY_INTERVAL_CONTINUOUS, the channel - * survey role will be scheduled at every available opportunity. - * - * @retval ::NRF_SUCCESS The module is successfully started. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter supplied. interval_us is out of the - * allowed range. - * @retval ::NRF_ERROR_INVALID_STATE Trying to start the module when already running. - * @retval ::NRF_ERROR_RESOURCES The channel survey module is not available to the application. - * Set @ref ble_gap_cfg_role_count_t::qos_channel_survey_role_available using - * @ref sd_ble_cfg_set. - */ -SVCALL(SD_BLE_GAP_QOS_CHANNEL_SURVEY_START, uint32_t, sd_ble_gap_qos_channel_survey_start(uint32_t interval_us)); - -/**@brief Stop the Quality of Service (QoS) channel survey module. - * - * @retval ::NRF_SUCCESS The module is successfully stopped. - * @retval ::NRF_ERROR_INVALID_STATE Trying to stop the module when it is not running. - */ -SVCALL(SD_BLE_GAP_QOS_CHANNEL_SURVEY_STOP, uint32_t, sd_ble_gap_qos_channel_survey_stop(void)); - - -/** @} */ - -#ifdef __cplusplus -} -#endif -#endif // BLE_GAP_H__ - -/** - @} -*/ diff --git a/lib/nrf52/include/ble_gatt.h b/lib/nrf52/include/ble_gatt.h deleted file mode 100644 index 9cb577cc..00000000 --- a/lib/nrf52/include/ble_gatt.h +++ /dev/null @@ -1,229 +0,0 @@ -/* - * Copyright (c) 2013 - 2018, Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - @addtogroup BLE_GATT Generic Attribute Profile (GATT) Common - @{ - @brief Common definitions and prototypes for the GATT interfaces. - */ - -#ifndef BLE_GATT_H__ -#define BLE_GATT_H__ - -#include -#include "nrf_svc.h" -#include "nrf_error.h" -#include "ble_hci.h" -#include "ble_ranges.h" -#include "ble_types.h" -#include "ble_err.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** @addtogroup BLE_GATT_DEFINES Defines - * @{ */ - -/** @brief Default ATT MTU, in bytes. */ -#define BLE_GATT_ATT_MTU_DEFAULT 23 - -/**@brief Invalid Attribute Handle. */ -#define BLE_GATT_HANDLE_INVALID 0x0000 - -/**@brief First Attribute Handle. */ -#define BLE_GATT_HANDLE_START 0x0001 - -/**@brief Last Attribute Handle. */ -#define BLE_GATT_HANDLE_END 0xFFFF - -/** @defgroup BLE_GATT_TIMEOUT_SOURCES GATT Timeout sources - * @{ */ -#define BLE_GATT_TIMEOUT_SRC_PROTOCOL 0x00 /**< ATT Protocol timeout. */ -/** @} */ - -/** @defgroup BLE_GATT_WRITE_OPS GATT Write operations - * @{ */ -#define BLE_GATT_OP_INVALID 0x00 /**< Invalid Operation. */ -#define BLE_GATT_OP_WRITE_REQ 0x01 /**< Write Request. */ -#define BLE_GATT_OP_WRITE_CMD 0x02 /**< Write Command. */ -#define BLE_GATT_OP_SIGN_WRITE_CMD 0x03 /**< Signed Write Command. */ -#define BLE_GATT_OP_PREP_WRITE_REQ 0x04 /**< Prepare Write Request. */ -#define BLE_GATT_OP_EXEC_WRITE_REQ 0x05 /**< Execute Write Request. */ -/** @} */ - -/** @defgroup BLE_GATT_EXEC_WRITE_FLAGS GATT Execute Write flags - * @{ */ -#define BLE_GATT_EXEC_WRITE_FLAG_PREPARED_CANCEL 0x00 /**< Cancel prepared write. */ -#define BLE_GATT_EXEC_WRITE_FLAG_PREPARED_WRITE 0x01 /**< Execute prepared write. */ -/** @} */ - -/** @defgroup BLE_GATT_HVX_TYPES GATT Handle Value operations - * @{ */ -#define BLE_GATT_HVX_INVALID 0x00 /**< Invalid Operation. */ -#define BLE_GATT_HVX_NOTIFICATION 0x01 /**< Handle Value Notification. */ -#define BLE_GATT_HVX_INDICATION 0x02 /**< Handle Value Indication. */ -/** @} */ - -/** @defgroup BLE_GATT_STATUS_CODES GATT Status Codes - * @{ */ -#define BLE_GATT_STATUS_SUCCESS 0x0000 /**< Success. */ -#define BLE_GATT_STATUS_UNKNOWN 0x0001 /**< Unknown or not applicable status. */ -#define BLE_GATT_STATUS_ATTERR_INVALID 0x0100 /**< ATT Error: Invalid Error Code. */ -#define BLE_GATT_STATUS_ATTERR_INVALID_HANDLE 0x0101 /**< ATT Error: Invalid Attribute Handle. */ -#define BLE_GATT_STATUS_ATTERR_READ_NOT_PERMITTED 0x0102 /**< ATT Error: Read not permitted. */ -#define BLE_GATT_STATUS_ATTERR_WRITE_NOT_PERMITTED 0x0103 /**< ATT Error: Write not permitted. */ -#define BLE_GATT_STATUS_ATTERR_INVALID_PDU 0x0104 /**< ATT Error: Used in ATT as Invalid PDU. */ -#define BLE_GATT_STATUS_ATTERR_INSUF_AUTHENTICATION 0x0105 /**< ATT Error: Authenticated link required. */ -#define BLE_GATT_STATUS_ATTERR_REQUEST_NOT_SUPPORTED 0x0106 /**< ATT Error: Used in ATT as Request Not Supported. */ -#define BLE_GATT_STATUS_ATTERR_INVALID_OFFSET 0x0107 /**< ATT Error: Offset specified was past the end of the attribute. */ -#define BLE_GATT_STATUS_ATTERR_INSUF_AUTHORIZATION 0x0108 /**< ATT Error: Used in ATT as Insufficient Authorization. */ -#define BLE_GATT_STATUS_ATTERR_PREPARE_QUEUE_FULL 0x0109 /**< ATT Error: Used in ATT as Prepare Queue Full. */ -#define BLE_GATT_STATUS_ATTERR_ATTRIBUTE_NOT_FOUND 0x010A /**< ATT Error: Used in ATT as Attribute not found. */ -#define BLE_GATT_STATUS_ATTERR_ATTRIBUTE_NOT_LONG 0x010B /**< ATT Error: Attribute cannot be read or written using read/write blob requests. */ -#define BLE_GATT_STATUS_ATTERR_INSUF_ENC_KEY_SIZE 0x010C /**< ATT Error: Encryption key size used is insufficient. */ -#define BLE_GATT_STATUS_ATTERR_INVALID_ATT_VAL_LENGTH 0x010D /**< ATT Error: Invalid value size. */ -#define BLE_GATT_STATUS_ATTERR_UNLIKELY_ERROR 0x010E /**< ATT Error: Very unlikely error. */ -#define BLE_GATT_STATUS_ATTERR_INSUF_ENCRYPTION 0x010F /**< ATT Error: Encrypted link required. */ -#define BLE_GATT_STATUS_ATTERR_UNSUPPORTED_GROUP_TYPE 0x0110 /**< ATT Error: Attribute type is not a supported grouping attribute. */ -#define BLE_GATT_STATUS_ATTERR_INSUF_RESOURCES 0x0111 /**< ATT Error: Encrypted link required. */ -#define BLE_GATT_STATUS_ATTERR_RFU_RANGE1_BEGIN 0x0112 /**< ATT Error: Reserved for Future Use range #1 begin. */ -#define BLE_GATT_STATUS_ATTERR_RFU_RANGE1_END 0x017F /**< ATT Error: Reserved for Future Use range #1 end. */ -#define BLE_GATT_STATUS_ATTERR_APP_BEGIN 0x0180 /**< ATT Error: Application range begin. */ -#define BLE_GATT_STATUS_ATTERR_APP_END 0x019F /**< ATT Error: Application range end. */ -#define BLE_GATT_STATUS_ATTERR_RFU_RANGE2_BEGIN 0x01A0 /**< ATT Error: Reserved for Future Use range #2 begin. */ -#define BLE_GATT_STATUS_ATTERR_RFU_RANGE2_END 0x01DF /**< ATT Error: Reserved for Future Use range #2 end. */ -#define BLE_GATT_STATUS_ATTERR_RFU_RANGE3_BEGIN 0x01E0 /**< ATT Error: Reserved for Future Use range #3 begin. */ -#define BLE_GATT_STATUS_ATTERR_RFU_RANGE3_END 0x01FC /**< ATT Error: Reserved for Future Use range #3 end. */ -#define BLE_GATT_STATUS_ATTERR_CPS_WRITE_REQ_REJECTED 0x01FC /**< ATT Common Profile and Service Error: Write request rejected. */ -#define BLE_GATT_STATUS_ATTERR_CPS_CCCD_CONFIG_ERROR 0x01FD /**< ATT Common Profile and Service Error: Client Characteristic Configuration Descriptor improperly configured. */ -#define BLE_GATT_STATUS_ATTERR_CPS_PROC_ALR_IN_PROG 0x01FE /**< ATT Common Profile and Service Error: Procedure Already in Progress. */ -#define BLE_GATT_STATUS_ATTERR_CPS_OUT_OF_RANGE 0x01FF /**< ATT Common Profile and Service Error: Out Of Range. */ -/** @} */ - - -/** @defgroup BLE_GATT_CPF_FORMATS Characteristic Presentation Formats - * @note Found at http://developer.bluetooth.org/gatt/descriptors/Pages/DescriptorViewer.aspx?u=org.bluetooth.descriptor.gatt.characteristic_presentation_format.xml - * @{ */ -#define BLE_GATT_CPF_FORMAT_RFU 0x00 /**< Reserved For Future Use. */ -#define BLE_GATT_CPF_FORMAT_BOOLEAN 0x01 /**< Boolean. */ -#define BLE_GATT_CPF_FORMAT_2BIT 0x02 /**< Unsigned 2-bit integer. */ -#define BLE_GATT_CPF_FORMAT_NIBBLE 0x03 /**< Unsigned 4-bit integer. */ -#define BLE_GATT_CPF_FORMAT_UINT8 0x04 /**< Unsigned 8-bit integer. */ -#define BLE_GATT_CPF_FORMAT_UINT12 0x05 /**< Unsigned 12-bit integer. */ -#define BLE_GATT_CPF_FORMAT_UINT16 0x06 /**< Unsigned 16-bit integer. */ -#define BLE_GATT_CPF_FORMAT_UINT24 0x07 /**< Unsigned 24-bit integer. */ -#define BLE_GATT_CPF_FORMAT_UINT32 0x08 /**< Unsigned 32-bit integer. */ -#define BLE_GATT_CPF_FORMAT_UINT48 0x09 /**< Unsigned 48-bit integer. */ -#define BLE_GATT_CPF_FORMAT_UINT64 0x0A /**< Unsigned 64-bit integer. */ -#define BLE_GATT_CPF_FORMAT_UINT128 0x0B /**< Unsigned 128-bit integer. */ -#define BLE_GATT_CPF_FORMAT_SINT8 0x0C /**< Signed 2-bit integer. */ -#define BLE_GATT_CPF_FORMAT_SINT12 0x0D /**< Signed 12-bit integer. */ -#define BLE_GATT_CPF_FORMAT_SINT16 0x0E /**< Signed 16-bit integer. */ -#define BLE_GATT_CPF_FORMAT_SINT24 0x0F /**< Signed 24-bit integer. */ -#define BLE_GATT_CPF_FORMAT_SINT32 0x10 /**< Signed 32-bit integer. */ -#define BLE_GATT_CPF_FORMAT_SINT48 0x11 /**< Signed 48-bit integer. */ -#define BLE_GATT_CPF_FORMAT_SINT64 0x12 /**< Signed 64-bit integer. */ -#define BLE_GATT_CPF_FORMAT_SINT128 0x13 /**< Signed 128-bit integer. */ -#define BLE_GATT_CPF_FORMAT_FLOAT32 0x14 /**< IEEE-754 32-bit floating point. */ -#define BLE_GATT_CPF_FORMAT_FLOAT64 0x15 /**< IEEE-754 64-bit floating point. */ -#define BLE_GATT_CPF_FORMAT_SFLOAT 0x16 /**< IEEE-11073 16-bit SFLOAT. */ -#define BLE_GATT_CPF_FORMAT_FLOAT 0x17 /**< IEEE-11073 32-bit FLOAT. */ -#define BLE_GATT_CPF_FORMAT_DUINT16 0x18 /**< IEEE-20601 format. */ -#define BLE_GATT_CPF_FORMAT_UTF8S 0x19 /**< UTF-8 string. */ -#define BLE_GATT_CPF_FORMAT_UTF16S 0x1A /**< UTF-16 string. */ -#define BLE_GATT_CPF_FORMAT_STRUCT 0x1B /**< Opaque Structure. */ -/** @} */ - -/** @defgroup BLE_GATT_CPF_NAMESPACES GATT Bluetooth Namespaces - * @{ - */ -#define BLE_GATT_CPF_NAMESPACE_BTSIG 0x01 /**< Bluetooth SIG defined Namespace. */ -#define BLE_GATT_CPF_NAMESPACE_DESCRIPTION_UNKNOWN 0x0000 /**< Namespace Description Unknown. */ -/** @} */ - -/** @} */ - -/** @addtogroup BLE_GATT_STRUCTURES Structures - * @{ */ - -/** - * @brief BLE GATT connection configuration parameters, set with @ref sd_ble_cfg_set. - * - * @retval ::NRF_ERROR_INVALID_PARAM att_mtu is smaller than @ref BLE_GATT_ATT_MTU_DEFAULT. - */ -typedef struct -{ - uint16_t att_mtu; /**< Maximum size of ATT packet the SoftDevice can send or receive. - The default and minimum value is @ref BLE_GATT_ATT_MTU_DEFAULT. - @mscs - @mmsc{@ref BLE_GATTC_MTU_EXCHANGE} - @mmsc{@ref BLE_GATTS_MTU_EXCHANGE} - @endmscs - */ -} ble_gatt_conn_cfg_t; - -/**@brief GATT Characteristic Properties. */ -typedef struct -{ - /* Standard properties */ - uint8_t broadcast :1; /**< Broadcasting of the value permitted. */ - uint8_t read :1; /**< Reading the value permitted. */ - uint8_t write_wo_resp :1; /**< Writing the value with Write Command permitted. */ - uint8_t write :1; /**< Writing the value with Write Request permitted. */ - uint8_t notify :1; /**< Notification of the value permitted. */ - uint8_t indicate :1; /**< Indications of the value permitted. */ - uint8_t auth_signed_wr :1; /**< Writing the value with Signed Write Command permitted. */ -} ble_gatt_char_props_t; - -/**@brief GATT Characteristic Extended Properties. */ -typedef struct -{ - /* Extended properties */ - uint8_t reliable_wr :1; /**< Writing the value with Queued Write operations permitted. */ - uint8_t wr_aux :1; /**< Writing the Characteristic User Description descriptor permitted. */ -} ble_gatt_char_ext_props_t; - -/** @} */ - -#ifdef __cplusplus -} -#endif -#endif // BLE_GATT_H__ - -/** @} */ diff --git a/lib/nrf52/include/ble_gattc.h b/lib/nrf52/include/ble_gattc.h deleted file mode 100644 index 7fb39202..00000000 --- a/lib/nrf52/include/ble_gattc.h +++ /dev/null @@ -1,715 +0,0 @@ -/* - * Copyright (c) 2011 - 2017, Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - @addtogroup BLE_GATTC Generic Attribute Profile (GATT) Client - @{ - @brief Definitions and prototypes for the GATT Client interface. - */ - -#ifndef BLE_GATTC_H__ -#define BLE_GATTC_H__ - -#include -#include "nrf.h" -#include "nrf_svc.h" -#include "nrf_error.h" -#include "ble_ranges.h" -#include "ble_types.h" -#include "ble_err.h" -#include "ble_gatt.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** @addtogroup BLE_GATTC_ENUMERATIONS Enumerations - * @{ */ - -/**@brief GATTC API SVC numbers. */ -enum BLE_GATTC_SVCS -{ - SD_BLE_GATTC_PRIMARY_SERVICES_DISCOVER = BLE_GATTC_SVC_BASE, /**< Primary Service Discovery. */ - SD_BLE_GATTC_RELATIONSHIPS_DISCOVER, /**< Relationship Discovery. */ - SD_BLE_GATTC_CHARACTERISTICS_DISCOVER, /**< Characteristic Discovery. */ - SD_BLE_GATTC_DESCRIPTORS_DISCOVER, /**< Characteristic Descriptor Discovery. */ - SD_BLE_GATTC_ATTR_INFO_DISCOVER, /**< Attribute Information Discovery. */ - SD_BLE_GATTC_CHAR_VALUE_BY_UUID_READ, /**< Read Characteristic Value by UUID. */ - SD_BLE_GATTC_READ, /**< Generic read. */ - SD_BLE_GATTC_CHAR_VALUES_READ, /**< Read multiple Characteristic Values. */ - SD_BLE_GATTC_WRITE, /**< Generic write. */ - SD_BLE_GATTC_HV_CONFIRM, /**< Handle Value Confirmation. */ - SD_BLE_GATTC_EXCHANGE_MTU_REQUEST, /**< Exchange MTU Request. */ -}; - -/** - * @brief GATT Client Event IDs. - */ -enum BLE_GATTC_EVTS -{ - BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP = BLE_GATTC_EVT_BASE, /**< Primary Service Discovery Response event. \n See @ref ble_gattc_evt_prim_srvc_disc_rsp_t. */ - BLE_GATTC_EVT_REL_DISC_RSP, /**< Relationship Discovery Response event. \n See @ref ble_gattc_evt_rel_disc_rsp_t. */ - BLE_GATTC_EVT_CHAR_DISC_RSP, /**< Characteristic Discovery Response event. \n See @ref ble_gattc_evt_char_disc_rsp_t. */ - BLE_GATTC_EVT_DESC_DISC_RSP, /**< Descriptor Discovery Response event. \n See @ref ble_gattc_evt_desc_disc_rsp_t. */ - BLE_GATTC_EVT_ATTR_INFO_DISC_RSP, /**< Attribute Information Response event. \n See @ref ble_gattc_evt_attr_info_disc_rsp_t. */ - BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP, /**< Read By UUID Response event. \n See @ref ble_gattc_evt_char_val_by_uuid_read_rsp_t. */ - BLE_GATTC_EVT_READ_RSP, /**< Read Response event. \n See @ref ble_gattc_evt_read_rsp_t. */ - BLE_GATTC_EVT_CHAR_VALS_READ_RSP, /**< Read multiple Response event. \n See @ref ble_gattc_evt_char_vals_read_rsp_t. */ - BLE_GATTC_EVT_WRITE_RSP, /**< Write Response event. \n See @ref ble_gattc_evt_write_rsp_t. */ - BLE_GATTC_EVT_HVX, /**< Handle Value Notification or Indication event. \n Confirm indication with @ref sd_ble_gattc_hv_confirm. \n See @ref ble_gattc_evt_hvx_t. */ - BLE_GATTC_EVT_EXCHANGE_MTU_RSP, /**< Exchange MTU Response event. \n See @ref ble_gattc_evt_exchange_mtu_rsp_t. */ - BLE_GATTC_EVT_TIMEOUT, /**< Timeout event. \n See @ref ble_gattc_evt_timeout_t. */ - BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE /**< Write without Response transmission complete. \n See @ref ble_gattc_evt_write_cmd_tx_complete_t. */ -}; - -/** @} */ - -/** @addtogroup BLE_GATTC_DEFINES Defines - * @{ */ - -/** @defgroup BLE_ERRORS_GATTC SVC return values specific to GATTC - * @{ */ -#define BLE_ERROR_GATTC_PROC_NOT_PERMITTED (NRF_GATTC_ERR_BASE + 0x000) /**< Procedure not Permitted. */ -/** @} */ - -/** @defgroup BLE_GATTC_ATTR_INFO_FORMAT Attribute Information Formats - * @{ */ -#define BLE_GATTC_ATTR_INFO_FORMAT_16BIT 1 /**< 16-bit Attribute Information Format. */ -#define BLE_GATTC_ATTR_INFO_FORMAT_128BIT 2 /**< 128-bit Attribute Information Format. */ -/** @} */ - -/** @defgroup BLE_GATTC_DEFAULTS GATT Client defaults - * @{ */ -#define BLE_GATTC_WRITE_CMD_TX_QUEUE_SIZE_DEFAULT 1 /**< Default number of Write without Response that can be queued for transmission. */ -/** @} */ - -/** @} */ - -/** @addtogroup BLE_GATTC_STRUCTURES Structures - * @{ */ - -/** - * @brief BLE GATTC connection configuration parameters, set with @ref sd_ble_cfg_set. - */ -typedef struct -{ - uint8_t write_cmd_tx_queue_size; /**< The guaranteed minimum number of Write without Response that can be queued for transmission. - The default value is @ref BLE_GATTC_WRITE_CMD_TX_QUEUE_SIZE_DEFAULT */ -} ble_gattc_conn_cfg_t; - -/**@brief Operation Handle Range. */ -typedef struct -{ - uint16_t start_handle; /**< Start Handle. */ - uint16_t end_handle; /**< End Handle. */ -} ble_gattc_handle_range_t; - - -/**@brief GATT service. */ -typedef struct -{ - ble_uuid_t uuid; /**< Service UUID. */ - ble_gattc_handle_range_t handle_range; /**< Service Handle Range. */ -} ble_gattc_service_t; - - -/**@brief GATT include. */ -typedef struct -{ - uint16_t handle; /**< Include Handle. */ - ble_gattc_service_t included_srvc; /**< Handle of the included service. */ -} ble_gattc_include_t; - - -/**@brief GATT characteristic. */ -typedef struct -{ - ble_uuid_t uuid; /**< Characteristic UUID. */ - ble_gatt_char_props_t char_props; /**< Characteristic Properties. */ - uint8_t char_ext_props : 1; /**< Extended properties present. */ - uint16_t handle_decl; /**< Handle of the Characteristic Declaration. */ - uint16_t handle_value; /**< Handle of the Characteristic Value. */ -} ble_gattc_char_t; - - -/**@brief GATT descriptor. */ -typedef struct -{ - uint16_t handle; /**< Descriptor Handle. */ - ble_uuid_t uuid; /**< Descriptor UUID. */ -} ble_gattc_desc_t; - - -/**@brief Write Parameters. */ -typedef struct -{ - uint8_t write_op; /**< Write Operation to be performed, see @ref BLE_GATT_WRITE_OPS. */ - uint8_t flags; /**< Flags, see @ref BLE_GATT_EXEC_WRITE_FLAGS. */ - uint16_t handle; /**< Handle to the attribute to be written. */ - uint16_t offset; /**< Offset in bytes. @note For WRITE_CMD and WRITE_REQ, offset must be 0. */ - uint16_t len; /**< Length of data in bytes. */ - uint8_t const *p_value; /**< Pointer to the value data. */ -} ble_gattc_write_params_t; - -/**@brief Attribute Information for 16-bit Attribute UUID. */ -typedef struct -{ - uint16_t handle; /**< Attribute handle. */ - ble_uuid_t uuid; /**< 16-bit Attribute UUID. */ -} ble_gattc_attr_info16_t; - -/**@brief Attribute Information for 128-bit Attribute UUID. */ -typedef struct -{ - uint16_t handle; /**< Attribute handle. */ - ble_uuid128_t uuid; /**< 128-bit Attribute UUID. */ -} ble_gattc_attr_info128_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP. */ -typedef struct -{ - uint16_t count; /**< Service count. */ - ble_gattc_service_t services[1]; /**< Service data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ -} ble_gattc_evt_prim_srvc_disc_rsp_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_REL_DISC_RSP. */ -typedef struct -{ - uint16_t count; /**< Include count. */ - ble_gattc_include_t includes[1]; /**< Include data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ -} ble_gattc_evt_rel_disc_rsp_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_CHAR_DISC_RSP. */ -typedef struct -{ - uint16_t count; /**< Characteristic count. */ - ble_gattc_char_t chars[1]; /**< Characteristic data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ -} ble_gattc_evt_char_disc_rsp_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_DESC_DISC_RSP. */ -typedef struct -{ - uint16_t count; /**< Descriptor count. */ - ble_gattc_desc_t descs[1]; /**< Descriptor data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ -} ble_gattc_evt_desc_disc_rsp_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_ATTR_INFO_DISC_RSP. */ -typedef struct -{ - uint16_t count; /**< Attribute count. */ - uint8_t format; /**< Attribute information format, see @ref BLE_GATTC_ATTR_INFO_FORMAT. */ - union { - ble_gattc_attr_info16_t attr_info16[1]; /**< Attribute information for 16-bit Attribute UUID. - @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ - ble_gattc_attr_info128_t attr_info128[1]; /**< Attribute information for 128-bit Attribute UUID. - @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ - } info; /**< Attribute information union. */ -} ble_gattc_evt_attr_info_disc_rsp_t; - -/**@brief GATT read by UUID handle value pair. */ -typedef struct -{ - uint16_t handle; /**< Attribute Handle. */ - uint8_t *p_value; /**< Pointer to the Attribute Value, length is available in @ref ble_gattc_evt_char_val_by_uuid_read_rsp_t::value_len. */ -} ble_gattc_handle_value_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP. */ -typedef struct -{ - uint16_t count; /**< Handle-Value Pair Count. */ - uint16_t value_len; /**< Length of the value in Handle-Value(s) list. */ - uint8_t handle_value[1]; /**< Handle-Value(s) list. To iterate through the list use @ref sd_ble_gattc_evt_char_val_by_uuid_read_rsp_iter. - @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ -} ble_gattc_evt_char_val_by_uuid_read_rsp_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_READ_RSP. */ -typedef struct -{ - uint16_t handle; /**< Attribute Handle. */ - uint16_t offset; /**< Offset of the attribute data. */ - uint16_t len; /**< Attribute data length. */ - uint8_t data[1]; /**< Attribute data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ -} ble_gattc_evt_read_rsp_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_CHAR_VALS_READ_RSP. */ -typedef struct -{ - uint16_t len; /**< Concatenated Attribute values length. */ - uint8_t values[1]; /**< Attribute values. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ -} ble_gattc_evt_char_vals_read_rsp_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_WRITE_RSP. */ -typedef struct -{ - uint16_t handle; /**< Attribute Handle. */ - uint8_t write_op; /**< Type of write operation, see @ref BLE_GATT_WRITE_OPS. */ - uint16_t offset; /**< Data offset. */ - uint16_t len; /**< Data length. */ - uint8_t data[1]; /**< Data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ -} ble_gattc_evt_write_rsp_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_HVX. */ -typedef struct -{ - uint16_t handle; /**< Handle to which the HVx operation applies. */ - uint8_t type; /**< Indication or Notification, see @ref BLE_GATT_HVX_TYPES. */ - uint16_t len; /**< Attribute data length. */ - uint8_t data[1]; /**< Attribute data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ -} ble_gattc_evt_hvx_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_EXCHANGE_MTU_RSP. */ -typedef struct -{ - uint16_t server_rx_mtu; /**< Server RX MTU size. */ -} ble_gattc_evt_exchange_mtu_rsp_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_TIMEOUT. */ -typedef struct -{ - uint8_t src; /**< Timeout source, see @ref BLE_GATT_TIMEOUT_SOURCES. */ -} ble_gattc_evt_timeout_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE. */ -typedef struct -{ - uint8_t count; /**< Number of write without response transmissions completed. */ -} ble_gattc_evt_write_cmd_tx_complete_t; - -/**@brief GATTC event structure. */ -typedef struct -{ - uint16_t conn_handle; /**< Connection Handle on which event occurred. */ - uint16_t gatt_status; /**< GATT status code for the operation, see @ref BLE_GATT_STATUS_CODES. */ - uint16_t error_handle; /**< In case of error: The handle causing the error. In all other cases @ref BLE_GATT_HANDLE_INVALID. */ - union - { - ble_gattc_evt_prim_srvc_disc_rsp_t prim_srvc_disc_rsp; /**< Primary Service Discovery Response Event Parameters. */ - ble_gattc_evt_rel_disc_rsp_t rel_disc_rsp; /**< Relationship Discovery Response Event Parameters. */ - ble_gattc_evt_char_disc_rsp_t char_disc_rsp; /**< Characteristic Discovery Response Event Parameters. */ - ble_gattc_evt_desc_disc_rsp_t desc_disc_rsp; /**< Descriptor Discovery Response Event Parameters. */ - ble_gattc_evt_char_val_by_uuid_read_rsp_t char_val_by_uuid_read_rsp; /**< Characteristic Value Read by UUID Response Event Parameters. */ - ble_gattc_evt_read_rsp_t read_rsp; /**< Read Response Event Parameters. */ - ble_gattc_evt_char_vals_read_rsp_t char_vals_read_rsp; /**< Characteristic Values Read Response Event Parameters. */ - ble_gattc_evt_write_rsp_t write_rsp; /**< Write Response Event Parameters. */ - ble_gattc_evt_hvx_t hvx; /**< Handle Value Notification/Indication Event Parameters. */ - ble_gattc_evt_exchange_mtu_rsp_t exchange_mtu_rsp; /**< Exchange MTU Response Event Parameters. */ - ble_gattc_evt_timeout_t timeout; /**< Timeout Event Parameters. */ - ble_gattc_evt_attr_info_disc_rsp_t attr_info_disc_rsp; /**< Attribute Information Discovery Event Parameters. */ - ble_gattc_evt_write_cmd_tx_complete_t write_cmd_tx_complete; /**< Write without Response transmission complete Event Parameters. */ - } params; /**< Event Parameters. @note Only valid if @ref gatt_status == @ref BLE_GATT_STATUS_SUCCESS. */ -} ble_gattc_evt_t; -/** @} */ - -/** @addtogroup BLE_GATTC_FUNCTIONS Functions - * @{ */ - -/**@brief Initiate or continue a GATT Primary Service Discovery procedure. - * - * @details This function initiates or resumes a Primary Service discovery procedure, starting from the supplied handle. - * If the last service has not been reached, this function must be called again with an updated start handle value to continue the search. - * - * @note If any of the discovered services have 128-bit UUIDs which are not present in the table provided to ble_vs_uuids_assign, a UUID structure with - * type @ref BLE_UUID_TYPE_UNKNOWN will be received in the corresponding event. - * - * @events - * @event{@ref BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GATTC_PRIM_SRVC_DISC_MSC} - * @endmscs - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] start_handle Handle to start searching from. - * @param[in] p_srvc_uuid Pointer to the service UUID to be found. If it is NULL, all primary services will be returned. - * - * @retval ::NRF_SUCCESS Successfully started or resumed the Primary Service Discovery procedure. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_BUSY Client procedure already in progress. - * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. - */ -SVCALL(SD_BLE_GATTC_PRIMARY_SERVICES_DISCOVER, uint32_t, sd_ble_gattc_primary_services_discover(uint16_t conn_handle, uint16_t start_handle, ble_uuid_t const *p_srvc_uuid)); - - -/**@brief Initiate or continue a GATT Relationship Discovery procedure. - * - * @details This function initiates or resumes the Find Included Services sub-procedure. If the last included service has not been reached, - * this must be called again with an updated handle range to continue the search. - * - * @events - * @event{@ref BLE_GATTC_EVT_REL_DISC_RSP} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GATTC_REL_DISC_MSC} - * @endmscs - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] p_handle_range A pointer to the range of handles of the Service to perform this procedure on. - * - * @retval ::NRF_SUCCESS Successfully started or resumed the Relationship Discovery procedure. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_BUSY Client procedure already in progress. - * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. - */ -SVCALL(SD_BLE_GATTC_RELATIONSHIPS_DISCOVER, uint32_t, sd_ble_gattc_relationships_discover(uint16_t conn_handle, ble_gattc_handle_range_t const *p_handle_range)); - - -/**@brief Initiate or continue a GATT Characteristic Discovery procedure. - * - * @details This function initiates or resumes a Characteristic discovery procedure. If the last Characteristic has not been reached, - * this must be called again with an updated handle range to continue the discovery. - * - * @note If any of the discovered characteristics have 128-bit UUIDs which are not present in the table provided to ble_vs_uuids_assign, a UUID structure with - * type @ref BLE_UUID_TYPE_UNKNOWN will be received in the corresponding event. - * - * @events - * @event{@ref BLE_GATTC_EVT_CHAR_DISC_RSP} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GATTC_CHAR_DISC_MSC} - * @endmscs - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] p_handle_range A pointer to the range of handles of the Service to perform this procedure on. - * - * @retval ::NRF_SUCCESS Successfully started or resumed the Characteristic Discovery procedure. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_BUSY Client procedure already in progress. - * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. - */ -SVCALL(SD_BLE_GATTC_CHARACTERISTICS_DISCOVER, uint32_t, sd_ble_gattc_characteristics_discover(uint16_t conn_handle, ble_gattc_handle_range_t const *p_handle_range)); - - -/**@brief Initiate or continue a GATT Characteristic Descriptor Discovery procedure. - * - * @details This function initiates or resumes a Characteristic Descriptor discovery procedure. If the last Descriptor has not been reached, - * this must be called again with an updated handle range to continue the discovery. - * - * @events - * @event{@ref BLE_GATTC_EVT_DESC_DISC_RSP} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GATTC_DESC_DISC_MSC} - * @endmscs - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] p_handle_range A pointer to the range of handles of the Characteristic to perform this procedure on. - * - * @retval ::NRF_SUCCESS Successfully started or resumed the Descriptor Discovery procedure. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_BUSY Client procedure already in progress. - * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. - */ -SVCALL(SD_BLE_GATTC_DESCRIPTORS_DISCOVER, uint32_t, sd_ble_gattc_descriptors_discover(uint16_t conn_handle, ble_gattc_handle_range_t const *p_handle_range)); - - -/**@brief Initiate or continue a GATT Read using Characteristic UUID procedure. - * - * @details This function initiates or resumes a Read using Characteristic UUID procedure. If the last Characteristic has not been reached, - * this must be called again with an updated handle range to continue the discovery. - * - * @events - * @event{@ref BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GATTC_READ_UUID_MSC} - * @endmscs - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] p_uuid Pointer to a Characteristic value UUID to read. - * @param[in] p_handle_range A pointer to the range of handles to perform this procedure on. - * - * @retval ::NRF_SUCCESS Successfully started or resumed the Read using Characteristic UUID procedure. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_BUSY Client procedure already in progress. - * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. - */ -SVCALL(SD_BLE_GATTC_CHAR_VALUE_BY_UUID_READ, uint32_t, sd_ble_gattc_char_value_by_uuid_read(uint16_t conn_handle, ble_uuid_t const *p_uuid, ble_gattc_handle_range_t const *p_handle_range)); - - -/**@brief Initiate or continue a GATT Read (Long) Characteristic or Descriptor procedure. - * - * @details This function initiates or resumes a GATT Read (Long) Characteristic or Descriptor procedure. If the Characteristic or Descriptor - * to be read is longer than ATT_MTU - 1, this function must be called multiple times with appropriate offset to read the - * complete value. - * - * @events - * @event{@ref BLE_GATTC_EVT_READ_RSP} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GATTC_VALUE_READ_MSC} - * @endmscs - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] handle The handle of the attribute to be read. - * @param[in] offset Offset into the attribute value to be read. - * - * @retval ::NRF_SUCCESS Successfully started or resumed the Read (Long) procedure. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. - * @retval ::NRF_ERROR_BUSY Client procedure already in progress. - * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. - */ -SVCALL(SD_BLE_GATTC_READ, uint32_t, sd_ble_gattc_read(uint16_t conn_handle, uint16_t handle, uint16_t offset)); - - -/**@brief Initiate a GATT Read Multiple Characteristic Values procedure. - * - * @details This function initiates a GATT Read Multiple Characteristic Values procedure. - * - * @events - * @event{@ref BLE_GATTC_EVT_CHAR_VALS_READ_RSP} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GATTC_READ_MULT_MSC} - * @endmscs - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] p_handles A pointer to the handle(s) of the attribute(s) to be read. - * @param[in] handle_count The number of handles in p_handles. - * - * @retval ::NRF_SUCCESS Successfully started the Read Multiple Characteristic Values procedure. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_BUSY Client procedure already in progress. - * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. - */ -SVCALL(SD_BLE_GATTC_CHAR_VALUES_READ, uint32_t, sd_ble_gattc_char_values_read(uint16_t conn_handle, uint16_t const *p_handles, uint16_t handle_count)); - - -/**@brief Perform a Write (Characteristic Value or Descriptor, with or without response, signed or not, long or reliable) procedure. - * - * @details This function can perform all write procedures described in GATT. - * - * @note Only one write with response procedure can be ongoing per connection at a time. - * If the application tries to write with response while another write with response procedure is ongoing, - * the function call will return @ref NRF_ERROR_BUSY. - * A @ref BLE_GATTC_EVT_WRITE_RSP event will be issued as soon as the write response arrives from the peer. - * - * @note The number of Write without Response that can be queued is configured by @ref ble_gattc_conn_cfg_t::write_cmd_tx_queue_size - * When the queue is full, the function call will return @ref NRF_ERROR_RESOURCES. - * A @ref BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE event will be issued as soon as the transmission of the write without response is complete. - * - * @note The application can keep track of the available queue element count for writes without responses by following the procedure below: - * - Store initial queue element count in a variable. - * - Decrement the variable, which stores the currently available queue element count, by one when a call to this function returns @ref NRF_SUCCESS. - * - Increment the variable, which stores the current available queue element count, by the count variable in @ref BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE event. - * - * @events - * @event{@ref BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE, Write without response transmission complete.} - * @event{@ref BLE_GATTC_EVT_WRITE_RSP, Write response received from the peer.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GATTC_VALUE_WRITE_WITHOUT_RESP_MSC} - * @mmsc{@ref BLE_GATTC_VALUE_WRITE_MSC} - * @mmsc{@ref BLE_GATTC_VALUE_LONG_WRITE_MSC} - * @mmsc{@ref BLE_GATTC_VALUE_RELIABLE_WRITE_MSC} - * @endmscs - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] p_write_params A pointer to a write parameters structure. - * - * @retval ::NRF_SUCCESS Successfully started the Write procedure. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied. - * @retval ::NRF_ERROR_BUSY For write with response, procedure already in progress. Wait for a @ref BLE_GATTC_EVT_WRITE_RSP event and retry. - * @retval ::NRF_ERROR_RESOURCES Too many writes without responses queued. - * Wait for a @ref BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE event and retry. - * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. - */ -SVCALL(SD_BLE_GATTC_WRITE, uint32_t, sd_ble_gattc_write(uint16_t conn_handle, ble_gattc_write_params_t const *p_write_params)); - - -/**@brief Send a Handle Value Confirmation to the GATT Server. - * - * @mscs - * @mmsc{@ref BLE_GATTC_HVI_MSC} - * @endmscs - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] handle The handle of the attribute in the indication. - * - * @retval ::NRF_SUCCESS Successfully queued the Handle Value Confirmation for transmission. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State or no Indication pending to be confirmed. - * @retval ::BLE_ERROR_INVALID_ATTR_HANDLE Invalid attribute handle. - * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. - */ -SVCALL(SD_BLE_GATTC_HV_CONFIRM, uint32_t, sd_ble_gattc_hv_confirm(uint16_t conn_handle, uint16_t handle)); - -/**@brief Discovers information about a range of attributes on a GATT server. - * - * @events - * @event{@ref BLE_GATTC_EVT_ATTR_INFO_DISC_RSP, Generated when information about a range of attributes has been received.} - * @endevents - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] p_handle_range The range of handles to request information about. - * - * @retval ::NRF_SUCCESS Successfully started an attribute information discovery procedure. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid connection state - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_BUSY Client procedure already in progress. - * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. - */ -SVCALL(SD_BLE_GATTC_ATTR_INFO_DISCOVER, uint32_t, sd_ble_gattc_attr_info_discover(uint16_t conn_handle, ble_gattc_handle_range_t const * p_handle_range)); - -/**@brief Start an ATT_MTU exchange by sending an Exchange MTU Request to the server. - * - * @details The SoftDevice sets ATT_MTU to the minimum of: - * - The Client RX MTU value, and - * - The Server RX MTU value from @ref BLE_GATTC_EVT_EXCHANGE_MTU_RSP. - * - * However, the SoftDevice never sets ATT_MTU lower than @ref BLE_GATT_ATT_MTU_DEFAULT. - * - * @events - * @event{@ref BLE_GATTC_EVT_EXCHANGE_MTU_RSP} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GATTC_MTU_EXCHANGE} - * @endmscs - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] client_rx_mtu Client RX MTU size. - * - The minimum value is @ref BLE_GATT_ATT_MTU_DEFAULT. - * - The maximum value is @ref ble_gatt_conn_cfg_t::att_mtu in the connection configuration - used for this connection. - * - The value must be equal to Server RX MTU size given in @ref sd_ble_gatts_exchange_mtu_reply - * if an ATT_MTU exchange has already been performed in the other direction. - * - * @retval ::NRF_SUCCESS Successfully sent request to the server. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid connection state or an ATT_MTU exchange was already requested once. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid Client RX MTU size supplied. - * @retval ::NRF_ERROR_BUSY Client procedure already in progress. - * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. - */ -SVCALL(SD_BLE_GATTC_EXCHANGE_MTU_REQUEST, uint32_t, sd_ble_gattc_exchange_mtu_request(uint16_t conn_handle, uint16_t client_rx_mtu)); - -/**@brief Iterate through Handle-Value(s) list in @ref BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP event. - * - * @param[in] p_gattc_evt Pointer to event buffer containing @ref BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP event. - * @note If the buffer contains different event, behavior is undefined. - * @param[in,out] p_iter Iterator, points to @ref ble_gattc_handle_value_t structure that will be filled in with - * the next Handle-Value pair in each iteration. If the function returns other than - * @ref NRF_SUCCESS, it will not be changed. - * - To start iteration, initialize the structure to zero. - * - To continue, pass the value from previous iteration. - * - * \code - * ble_gattc_handle_value_t iter; - * memset(&iter, 0, sizeof(ble_gattc_handle_value_t)); - * while (sd_ble_gattc_evt_char_val_by_uuid_read_rsp_iter(&ble_evt.evt.gattc_evt, &iter) == NRF_SUCCESS) - * { - * app_handle = iter.handle; - * memcpy(app_value, iter.p_value, ble_evt.evt.gattc_evt.params.char_val_by_uuid_read_rsp.value_len); - * } - * \endcode - * - * @retval ::NRF_SUCCESS Successfully retrieved the next Handle-Value pair. - * @retval ::NRF_ERROR_NOT_FOUND No more Handle-Value pairs available in the list. - */ -__STATIC_INLINE uint32_t sd_ble_gattc_evt_char_val_by_uuid_read_rsp_iter(ble_gattc_evt_t *p_gattc_evt, ble_gattc_handle_value_t *p_iter); - -/** @} */ - -#ifndef SUPPRESS_INLINE_IMPLEMENTATION - -__STATIC_INLINE uint32_t sd_ble_gattc_evt_char_val_by_uuid_read_rsp_iter(ble_gattc_evt_t *p_gattc_evt, ble_gattc_handle_value_t *p_iter) -{ - uint32_t value_len = p_gattc_evt->params.char_val_by_uuid_read_rsp.value_len; - uint8_t *p_first = p_gattc_evt->params.char_val_by_uuid_read_rsp.handle_value; - uint8_t *p_next = p_iter->p_value ? p_iter->p_value + value_len : p_first; - - if ((p_next - p_first) / (sizeof(uint16_t) + value_len) < p_gattc_evt->params.char_val_by_uuid_read_rsp.count) - { - p_iter->handle = (uint16_t)p_next[1] << 8 | p_next[0]; - p_iter->p_value = p_next + sizeof(uint16_t); - return NRF_SUCCESS; - } - else - { - return NRF_ERROR_NOT_FOUND; - } -} - -#endif /* SUPPRESS_INLINE_IMPLEMENTATION */ - -#ifdef __cplusplus -} -#endif -#endif /* BLE_GATTC_H__ */ - -/** - @} -*/ diff --git a/lib/nrf52/include/ble_gatts.h b/lib/nrf52/include/ble_gatts.h deleted file mode 100644 index 394d8d18..00000000 --- a/lib/nrf52/include/ble_gatts.h +++ /dev/null @@ -1,845 +0,0 @@ -/* - * Copyright (c) 2011 - 2018, Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - @addtogroup BLE_GATTS Generic Attribute Profile (GATT) Server - @{ - @brief Definitions and prototypes for the GATTS interface. - */ - -#ifndef BLE_GATTS_H__ -#define BLE_GATTS_H__ - -#include -#include "nrf_svc.h" -#include "nrf_error.h" -#include "ble_hci.h" -#include "ble_ranges.h" -#include "ble_types.h" -#include "ble_err.h" -#include "ble_gatt.h" -#include "ble_gap.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** @addtogroup BLE_GATTS_ENUMERATIONS Enumerations - * @{ */ - -/** - * @brief GATTS API SVC numbers. - */ -enum BLE_GATTS_SVCS -{ - SD_BLE_GATTS_SERVICE_ADD = BLE_GATTS_SVC_BASE, /**< Add a service. */ - SD_BLE_GATTS_INCLUDE_ADD, /**< Add an included service. */ - SD_BLE_GATTS_CHARACTERISTIC_ADD, /**< Add a characteristic. */ - SD_BLE_GATTS_DESCRIPTOR_ADD, /**< Add a generic attribute. */ - SD_BLE_GATTS_VALUE_SET, /**< Set an attribute value. */ - SD_BLE_GATTS_VALUE_GET, /**< Get an attribute value. */ - SD_BLE_GATTS_HVX, /**< Handle Value Notification or Indication. */ - SD_BLE_GATTS_SERVICE_CHANGED, /**< Perform a Service Changed Indication to one or more peers. */ - SD_BLE_GATTS_RW_AUTHORIZE_REPLY, /**< Reply to an authorization request for a read or write operation on one or more attributes. */ - SD_BLE_GATTS_SYS_ATTR_SET, /**< Set the persistent system attributes for a connection. */ - SD_BLE_GATTS_SYS_ATTR_GET, /**< Retrieve the persistent system attributes. */ - SD_BLE_GATTS_INITIAL_USER_HANDLE_GET, /**< Retrieve the first valid user handle. */ - SD_BLE_GATTS_ATTR_GET, /**< Retrieve the UUID and/or metadata of an attribute. */ - SD_BLE_GATTS_EXCHANGE_MTU_REPLY /**< Reply to Exchange MTU Request. */ -}; - -/** - * @brief GATT Server Event IDs. - */ -enum BLE_GATTS_EVTS -{ - BLE_GATTS_EVT_WRITE = BLE_GATTS_EVT_BASE, /**< Write operation performed. \n See @ref ble_gatts_evt_write_t. */ - BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST, /**< Read/Write Authorization request. \n Reply with @ref sd_ble_gatts_rw_authorize_reply. \n See @ref ble_gatts_evt_rw_authorize_request_t. */ - BLE_GATTS_EVT_SYS_ATTR_MISSING, /**< A persistent system attribute access is pending. \n Respond with @ref sd_ble_gatts_sys_attr_set. \n See @ref ble_gatts_evt_sys_attr_missing_t. */ - BLE_GATTS_EVT_HVC, /**< Handle Value Confirmation. \n See @ref ble_gatts_evt_hvc_t. */ - BLE_GATTS_EVT_SC_CONFIRM, /**< Service Changed Confirmation. \n No additional event structure applies. */ - BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST, /**< Exchange MTU Request. \n Reply with @ref sd_ble_gatts_exchange_mtu_reply. \n See @ref ble_gatts_evt_exchange_mtu_request_t. */ - BLE_GATTS_EVT_TIMEOUT, /**< Peer failed to respond to an ATT request in time. \n See @ref ble_gatts_evt_timeout_t. */ - BLE_GATTS_EVT_HVN_TX_COMPLETE /**< Handle Value Notification transmission complete. \n See @ref ble_gatts_evt_hvn_tx_complete_t. */ -}; - -/**@brief GATTS Configuration IDs. - * - * IDs that uniquely identify a GATTS configuration. - */ -enum BLE_GATTS_CFGS -{ - BLE_GATTS_CFG_SERVICE_CHANGED = BLE_GATTS_CFG_BASE, /**< Service changed configuration. */ - BLE_GATTS_CFG_ATTR_TAB_SIZE, /**< Attribute table size configuration. */ -}; - -/** @} */ - -/** @addtogroup BLE_GATTS_DEFINES Defines - * @{ */ - -/** @defgroup BLE_ERRORS_GATTS SVC return values specific to GATTS - * @{ */ -#define BLE_ERROR_GATTS_INVALID_ATTR_TYPE (NRF_GATTS_ERR_BASE + 0x000) /**< Invalid attribute type. */ -#define BLE_ERROR_GATTS_SYS_ATTR_MISSING (NRF_GATTS_ERR_BASE + 0x001) /**< System Attributes missing. */ -/** @} */ - -/** @defgroup BLE_GATTS_ATTR_LENS_MAX Maximum attribute lengths - * @{ */ -#define BLE_GATTS_FIX_ATTR_LEN_MAX (510) /**< Maximum length for fixed length Attribute Values. */ -#define BLE_GATTS_VAR_ATTR_LEN_MAX (512) /**< Maximum length for variable length Attribute Values. */ -/** @} */ - -/** @defgroup BLE_GATTS_SRVC_TYPES GATT Server Service Types - * @{ */ -#define BLE_GATTS_SRVC_TYPE_INVALID 0x00 /**< Invalid Service Type. */ -#define BLE_GATTS_SRVC_TYPE_PRIMARY 0x01 /**< Primary Service. */ -#define BLE_GATTS_SRVC_TYPE_SECONDARY 0x02 /**< Secondary Type. */ -/** @} */ - - -/** @defgroup BLE_GATTS_ATTR_TYPES GATT Server Attribute Types - * @{ */ -#define BLE_GATTS_ATTR_TYPE_INVALID 0x00 /**< Invalid Attribute Type. */ -#define BLE_GATTS_ATTR_TYPE_PRIM_SRVC_DECL 0x01 /**< Primary Service Declaration. */ -#define BLE_GATTS_ATTR_TYPE_SEC_SRVC_DECL 0x02 /**< Secondary Service Declaration. */ -#define BLE_GATTS_ATTR_TYPE_INC_DECL 0x03 /**< Include Declaration. */ -#define BLE_GATTS_ATTR_TYPE_CHAR_DECL 0x04 /**< Characteristic Declaration. */ -#define BLE_GATTS_ATTR_TYPE_CHAR_VAL 0x05 /**< Characteristic Value. */ -#define BLE_GATTS_ATTR_TYPE_DESC 0x06 /**< Descriptor. */ -#define BLE_GATTS_ATTR_TYPE_OTHER 0x07 /**< Other, non-GATT specific type. */ -/** @} */ - - -/** @defgroup BLE_GATTS_OPS GATT Server Operations - * @{ */ -#define BLE_GATTS_OP_INVALID 0x00 /**< Invalid Operation. */ -#define BLE_GATTS_OP_WRITE_REQ 0x01 /**< Write Request. */ -#define BLE_GATTS_OP_WRITE_CMD 0x02 /**< Write Command. */ -#define BLE_GATTS_OP_SIGN_WRITE_CMD 0x03 /**< Signed Write Command. */ -#define BLE_GATTS_OP_PREP_WRITE_REQ 0x04 /**< Prepare Write Request. */ -#define BLE_GATTS_OP_EXEC_WRITE_REQ_CANCEL 0x05 /**< Execute Write Request: Cancel all prepared writes. */ -#define BLE_GATTS_OP_EXEC_WRITE_REQ_NOW 0x06 /**< Execute Write Request: Immediately execute all prepared writes. */ -/** @} */ - -/** @defgroup BLE_GATTS_VLOCS GATT Value Locations - * @{ */ -#define BLE_GATTS_VLOC_INVALID 0x00 /**< Invalid Location. */ -#define BLE_GATTS_VLOC_STACK 0x01 /**< Attribute Value is located in stack memory, no user memory is required. */ -#define BLE_GATTS_VLOC_USER 0x02 /**< Attribute Value is located in user memory. This requires the user to maintain a valid buffer through the lifetime of the attribute, since the stack - will read and write directly to the memory using the pointer provided in the APIs. There are no alignment requirements for the buffer. */ -/** @} */ - -/** @defgroup BLE_GATTS_AUTHORIZE_TYPES GATT Server Authorization Types - * @{ */ -#define BLE_GATTS_AUTHORIZE_TYPE_INVALID 0x00 /**< Invalid Type. */ -#define BLE_GATTS_AUTHORIZE_TYPE_READ 0x01 /**< Authorize a Read Operation. */ -#define BLE_GATTS_AUTHORIZE_TYPE_WRITE 0x02 /**< Authorize a Write Request Operation. */ -/** @} */ - -/** @defgroup BLE_GATTS_SYS_ATTR_FLAGS System Attribute Flags - * @{ */ -#define BLE_GATTS_SYS_ATTR_FLAG_SYS_SRVCS (1 << 0) /**< Restrict system attributes to system services only. */ -#define BLE_GATTS_SYS_ATTR_FLAG_USR_SRVCS (1 << 1) /**< Restrict system attributes to user services only. */ -/** @} */ - -/** @defgroup BLE_GATTS_SERVICE_CHANGED Service Changed Inclusion Values - * @{ - */ -#define BLE_GATTS_SERVICE_CHANGED_DEFAULT (1) /**< Default is to include the Service Changed characteristic in the Attribute Table. */ -/** @} */ - -/** @defgroup BLE_GATTS_ATTR_TAB_SIZE Attribute Table size - * @{ - */ -#define BLE_GATTS_ATTR_TAB_SIZE_MIN (248) /**< Minimum Attribute Table size */ -#define BLE_GATTS_ATTR_TAB_SIZE_DEFAULT (1408) /**< Default Attribute Table size. */ -/** @} */ - -/** @defgroup BLE_GATTS_DEFAULTS GATT Server defaults - * @{ - */ -#define BLE_GATTS_HVN_TX_QUEUE_SIZE_DEFAULT 1 /**< Default number of Handle Value Notifications that can be queued for transmission. */ -/** @} */ - -/** @} */ - -/** @addtogroup BLE_GATTS_STRUCTURES Structures - * @{ */ - -/** - * @brief BLE GATTS connection configuration parameters, set with @ref sd_ble_cfg_set. - */ -typedef struct -{ - uint8_t hvn_tx_queue_size; /**< Minimum guaranteed number of Handle Value Notifications that can be queued for transmission. - The default value is @ref BLE_GATTS_HVN_TX_QUEUE_SIZE_DEFAULT */ -} ble_gatts_conn_cfg_t; - -/**@brief Attribute metadata. */ -typedef struct -{ - ble_gap_conn_sec_mode_t read_perm; /**< Read permissions. */ - ble_gap_conn_sec_mode_t write_perm; /**< Write permissions. */ - uint8_t vlen :1; /**< Variable length attribute. */ - uint8_t vloc :2; /**< Value location, see @ref BLE_GATTS_VLOCS.*/ - uint8_t rd_auth :1; /**< Read authorization and value will be requested from the application on every read operation. */ - uint8_t wr_auth :1; /**< Write authorization will be requested from the application on every Write Request operation (but not Write Command). */ -} ble_gatts_attr_md_t; - - -/**@brief GATT Attribute. */ -typedef struct -{ - ble_uuid_t const *p_uuid; /**< Pointer to the attribute UUID. */ - ble_gatts_attr_md_t const *p_attr_md; /**< Pointer to the attribute metadata structure. */ - uint16_t init_len; /**< Initial attribute value length in bytes. */ - uint16_t init_offs; /**< Initial attribute value offset in bytes. If different from zero, the first init_offs bytes of the attribute value will be left uninitialized. */ - uint16_t max_len; /**< Maximum attribute value length in bytes, see @ref BLE_GATTS_ATTR_LENS_MAX for maximum values. */ - uint8_t *p_value; /**< Pointer to the attribute data. Please note that if the @ref BLE_GATTS_VLOC_USER value location is selected in the attribute metadata, this will have to point to a buffer - that remains valid through the lifetime of the attribute. This excludes usage of automatic variables that may go out of scope or any other temporary location. - The stack may access that memory directly without the application's knowledge. For writable characteristics, this value must not be a location in flash memory.*/ -} ble_gatts_attr_t; - -/**@brief GATT Attribute Value. */ -typedef struct -{ - uint16_t len; /**< Length in bytes to be written or read. Length in bytes written or read after successful return.*/ - uint16_t offset; /**< Attribute value offset. */ - uint8_t *p_value; /**< Pointer to where value is stored or will be stored. - If value is stored in user memory, only the attribute length is updated when p_value == NULL. - Set to NULL when reading to obtain the complete length of the attribute value */ -} ble_gatts_value_t; - - -/**@brief GATT Characteristic Presentation Format. */ -typedef struct -{ - uint8_t format; /**< Format of the value, see @ref BLE_GATT_CPF_FORMATS. */ - int8_t exponent; /**< Exponent for integer data types. */ - uint16_t unit; /**< Unit from Bluetooth Assigned Numbers. */ - uint8_t name_space; /**< Namespace from Bluetooth Assigned Numbers, see @ref BLE_GATT_CPF_NAMESPACES. */ - uint16_t desc; /**< Namespace description from Bluetooth Assigned Numbers, see @ref BLE_GATT_CPF_NAMESPACES. */ -} ble_gatts_char_pf_t; - - -/**@brief GATT Characteristic metadata. */ -typedef struct -{ - ble_gatt_char_props_t char_props; /**< Characteristic Properties. */ - ble_gatt_char_ext_props_t char_ext_props; /**< Characteristic Extended Properties. */ - uint8_t const *p_char_user_desc; /**< Pointer to a UTF-8 encoded string (non-NULL terminated), NULL if the descriptor is not required. */ - uint16_t char_user_desc_max_size; /**< The maximum size in bytes of the user description descriptor. */ - uint16_t char_user_desc_size; /**< The size of the user description, must be smaller or equal to char_user_desc_max_size. */ - ble_gatts_char_pf_t const *p_char_pf; /**< Pointer to a presentation format structure or NULL if the CPF descriptor is not required. */ - ble_gatts_attr_md_t const *p_user_desc_md; /**< Attribute metadata for the User Description descriptor, or NULL for default values. */ - ble_gatts_attr_md_t const *p_cccd_md; /**< Attribute metadata for the Client Characteristic Configuration Descriptor, or NULL for default values. */ - ble_gatts_attr_md_t const *p_sccd_md; /**< Attribute metadata for the Server Characteristic Configuration Descriptor, or NULL for default values. */ -} ble_gatts_char_md_t; - - -/**@brief GATT Characteristic Definition Handles. */ -typedef struct -{ - uint16_t value_handle; /**< Handle to the characteristic value. */ - uint16_t user_desc_handle; /**< Handle to the User Description descriptor, or @ref BLE_GATT_HANDLE_INVALID if not present. */ - uint16_t cccd_handle; /**< Handle to the Client Characteristic Configuration Descriptor, or @ref BLE_GATT_HANDLE_INVALID if not present. */ - uint16_t sccd_handle; /**< Handle to the Server Characteristic Configuration Descriptor, or @ref BLE_GATT_HANDLE_INVALID if not present. */ -} ble_gatts_char_handles_t; - - -/**@brief GATT HVx parameters. */ -typedef struct -{ - uint16_t handle; /**< Characteristic Value Handle. */ - uint8_t type; /**< Indication or Notification, see @ref BLE_GATT_HVX_TYPES. */ - uint16_t offset; /**< Offset within the attribute value. */ - uint16_t *p_len; /**< Length in bytes to be written, length in bytes written after return. */ - uint8_t const *p_data; /**< Actual data content, use NULL to use the current attribute value. */ -} ble_gatts_hvx_params_t; - -/**@brief GATT Authorization parameters. */ -typedef struct -{ - uint16_t gatt_status; /**< GATT status code for the operation, see @ref BLE_GATT_STATUS_CODES. */ - uint8_t update : 1; /**< If set, data supplied in p_data will be used to update the attribute value. - Please note that for @ref BLE_GATTS_AUTHORIZE_TYPE_WRITE operations this bit must always be set, - as the data to be written needs to be stored and later provided by the application. */ - uint16_t offset; /**< Offset of the attribute value being updated. */ - uint16_t len; /**< Length in bytes of the value in p_data pointer, see @ref BLE_GATTS_ATTR_LENS_MAX. */ - uint8_t const *p_data; /**< Pointer to new value used to update the attribute value. */ -} ble_gatts_authorize_params_t; - -/**@brief GATT Read or Write Authorize Reply parameters. */ -typedef struct -{ - uint8_t type; /**< Type of authorize operation, see @ref BLE_GATTS_AUTHORIZE_TYPES. */ - union { - ble_gatts_authorize_params_t read; /**< Read authorization parameters. */ - ble_gatts_authorize_params_t write; /**< Write authorization parameters. */ - } params; /**< Reply Parameters. */ -} ble_gatts_rw_authorize_reply_params_t; - -/**@brief Service Changed Inclusion configuration parameters, set with @ref sd_ble_cfg_set. */ -typedef struct -{ - uint8_t service_changed : 1; /**< If 1, include the Service Changed characteristic in the Attribute Table. Default is @ref BLE_GATTS_SERVICE_CHANGED_DEFAULT. */ -} ble_gatts_cfg_service_changed_t; - -/**@brief Attribute table size configuration parameters, set with @ref sd_ble_cfg_set. - * - * @retval ::NRF_ERROR_INVALID_LENGTH One or more of the following is true: - * - The specified Attribute Table size is too small. - * The minimum acceptable size is defined by @ref BLE_GATTS_ATTR_TAB_SIZE_MIN. - * - The specified Attribute Table size is not a multiple of 4. - */ -typedef struct -{ - uint32_t attr_tab_size; /**< Attribute table size. Default is @ref BLE_GATTS_ATTR_TAB_SIZE_DEFAULT, minimum is @ref BLE_GATTS_ATTR_TAB_SIZE_MIN. */ -} ble_gatts_cfg_attr_tab_size_t; - -/**@brief Config structure for GATTS configurations. */ -typedef union -{ - ble_gatts_cfg_service_changed_t service_changed; /**< Include service changed characteristic, cfg_id is @ref BLE_GATTS_CFG_SERVICE_CHANGED. */ - ble_gatts_cfg_attr_tab_size_t attr_tab_size; /**< Attribute table size, cfg_id is @ref BLE_GATTS_CFG_ATTR_TAB_SIZE. */ -} ble_gatts_cfg_t; - - -/**@brief Event structure for @ref BLE_GATTS_EVT_WRITE. */ -typedef struct -{ - uint16_t handle; /**< Attribute Handle. */ - ble_uuid_t uuid; /**< Attribute UUID. */ - uint8_t op; /**< Type of write operation, see @ref BLE_GATTS_OPS. */ - uint8_t auth_required; /**< Writing operation deferred due to authorization requirement. Application may use @ref sd_ble_gatts_value_set to finalize the writing operation. */ - uint16_t offset; /**< Offset for the write operation. */ - uint16_t len; /**< Length of the received data. */ - uint8_t data[1]; /**< Received data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ -} ble_gatts_evt_write_t; - -/**@brief Event substructure for authorized read requests, see @ref ble_gatts_evt_rw_authorize_request_t. */ -typedef struct -{ - uint16_t handle; /**< Attribute Handle. */ - ble_uuid_t uuid; /**< Attribute UUID. */ - uint16_t offset; /**< Offset for the read operation. */ -} ble_gatts_evt_read_t; - -/**@brief Event structure for @ref BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST. */ -typedef struct -{ - uint8_t type; /**< Type of authorize operation, see @ref BLE_GATTS_AUTHORIZE_TYPES. */ - union { - ble_gatts_evt_read_t read; /**< Attribute Read Parameters. */ - ble_gatts_evt_write_t write; /**< Attribute Write Parameters. */ - } request; /**< Request Parameters. */ -} ble_gatts_evt_rw_authorize_request_t; - -/**@brief Event structure for @ref BLE_GATTS_EVT_SYS_ATTR_MISSING. */ -typedef struct -{ - uint8_t hint; /**< Hint (currently unused). */ -} ble_gatts_evt_sys_attr_missing_t; - - -/**@brief Event structure for @ref BLE_GATTS_EVT_HVC. */ -typedef struct -{ - uint16_t handle; /**< Attribute Handle. */ -} ble_gatts_evt_hvc_t; - -/**@brief Event structure for @ref BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST. */ -typedef struct -{ - uint16_t client_rx_mtu; /**< Client RX MTU size. */ -} ble_gatts_evt_exchange_mtu_request_t; - -/**@brief Event structure for @ref BLE_GATTS_EVT_TIMEOUT. */ -typedef struct -{ - uint8_t src; /**< Timeout source, see @ref BLE_GATT_TIMEOUT_SOURCES. */ -} ble_gatts_evt_timeout_t; - -/**@brief Event structure for @ref BLE_GATTS_EVT_HVN_TX_COMPLETE. */ -typedef struct -{ - uint8_t count; /**< Number of notification transmissions completed. */ -} ble_gatts_evt_hvn_tx_complete_t; - -/**@brief GATTS event structure. */ -typedef struct -{ - uint16_t conn_handle; /**< Connection Handle on which the event occurred. */ - union - { - ble_gatts_evt_write_t write; /**< Write Event Parameters. */ - ble_gatts_evt_rw_authorize_request_t authorize_request; /**< Read or Write Authorize Request Parameters. */ - ble_gatts_evt_sys_attr_missing_t sys_attr_missing; /**< System attributes missing. */ - ble_gatts_evt_hvc_t hvc; /**< Handle Value Confirmation Event Parameters. */ - ble_gatts_evt_exchange_mtu_request_t exchange_mtu_request; /**< Exchange MTU Request Event Parameters. */ - ble_gatts_evt_timeout_t timeout; /**< Timeout Event. */ - ble_gatts_evt_hvn_tx_complete_t hvn_tx_complete; /**< Handle Value Notification transmission complete Event Parameters. */ - } params; /**< Event Parameters. */ -} ble_gatts_evt_t; - -/** @} */ - -/** @addtogroup BLE_GATTS_FUNCTIONS Functions - * @{ */ - -/**@brief Add a service declaration to the Attribute Table. - * - * @note Secondary Services are only relevant in the context of the entity that references them, it is therefore forbidden to - * add a secondary service declaration that is not referenced by another service later in the Attribute Table. - * - * @mscs - * @mmsc{@ref BLE_GATTS_ATT_TABLE_POP_MSC} - * @endmscs - * - * @param[in] type Toggles between primary and secondary services, see @ref BLE_GATTS_SRVC_TYPES. - * @param[in] p_uuid Pointer to service UUID. - * @param[out] p_handle Pointer to a 16-bit word where the assigned handle will be stored. - * - * @retval ::NRF_SUCCESS Successfully added a service declaration. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, Vendor Specific UUIDs need to be present in the table. - * @retval ::NRF_ERROR_FORBIDDEN Forbidden value supplied, certain UUIDs are reserved for the stack. - * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation. - */ -SVCALL(SD_BLE_GATTS_SERVICE_ADD, uint32_t, sd_ble_gatts_service_add(uint8_t type, ble_uuid_t const *p_uuid, uint16_t *p_handle)); - - -/**@brief Add an include declaration to the Attribute Table. - * - * @note It is currently only possible to add an include declaration to the last added service (i.e. only sequential population is supported at this time). - * - * @note The included service must already be present in the Attribute Table prior to this call. - * - * @mscs - * @mmsc{@ref BLE_GATTS_ATT_TABLE_POP_MSC} - * @endmscs - * - * @param[in] service_handle Handle of the service where the included service is to be placed, if @ref BLE_GATT_HANDLE_INVALID is used, it will be placed sequentially. - * @param[in] inc_srvc_handle Handle of the included service. - * @param[out] p_include_handle Pointer to a 16-bit word where the assigned handle will be stored. - * - * @retval ::NRF_SUCCESS Successfully added an include declaration. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, handle values need to match previously added services. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation, a service context is required. - * @retval ::NRF_ERROR_NOT_SUPPORTED Feature is not supported, service_handle must be that of the last added service. - * @retval ::NRF_ERROR_FORBIDDEN Forbidden value supplied, self inclusions are not allowed. - * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation. - * @retval ::NRF_ERROR_NOT_FOUND Attribute not found. - */ -SVCALL(SD_BLE_GATTS_INCLUDE_ADD, uint32_t, sd_ble_gatts_include_add(uint16_t service_handle, uint16_t inc_srvc_handle, uint16_t *p_include_handle)); - - -/**@brief Add a characteristic declaration, a characteristic value declaration and optional characteristic descriptor declarations to the Attribute Table. - * - * @note It is currently only possible to add a characteristic to the last added service (i.e. only sequential population is supported at this time). - * - * @note Several restrictions apply to the parameters, such as matching permissions between the user description descriptor and the writable auxiliaries bits, - * readable (no security) and writable (selectable) CCCDs and SCCDs and valid presentation format values. - * - * @note If no metadata is provided for the optional descriptors, their permissions will be derived from the characteristic permissions. - * - * @mscs - * @mmsc{@ref BLE_GATTS_ATT_TABLE_POP_MSC} - * @endmscs - * - * @param[in] service_handle Handle of the service where the characteristic is to be placed, if @ref BLE_GATT_HANDLE_INVALID is used, it will be placed sequentially. - * @param[in] p_char_md Characteristic metadata. - * @param[in] p_attr_char_value Pointer to the attribute structure corresponding to the characteristic value. - * @param[out] p_handles Pointer to the structure where the assigned handles will be stored. - * - * @retval ::NRF_SUCCESS Successfully added a characteristic. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, service handle, Vendor Specific UUIDs, lengths, and permissions need to adhere to the constraints. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation, a service context is required. - * @retval ::NRF_ERROR_FORBIDDEN Forbidden value supplied, certain UUIDs are reserved for the stack. - * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation. - * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied, attribute lengths are restricted by @ref BLE_GATTS_ATTR_LENS_MAX. - */ -SVCALL(SD_BLE_GATTS_CHARACTERISTIC_ADD, uint32_t, sd_ble_gatts_characteristic_add(uint16_t service_handle, ble_gatts_char_md_t const *p_char_md, ble_gatts_attr_t const *p_attr_char_value, ble_gatts_char_handles_t *p_handles)); - - -/**@brief Add a descriptor to the Attribute Table. - * - * @note It is currently only possible to add a descriptor to the last added characteristic (i.e. only sequential population is supported at this time). - * - * @mscs - * @mmsc{@ref BLE_GATTS_ATT_TABLE_POP_MSC} - * @endmscs - * - * @param[in] char_handle Handle of the characteristic where the descriptor is to be placed, if @ref BLE_GATT_HANDLE_INVALID is used, it will be placed sequentially. - * @param[in] p_attr Pointer to the attribute structure. - * @param[out] p_handle Pointer to a 16-bit word where the assigned handle will be stored. - * - * @retval ::NRF_SUCCESS Successfully added a descriptor. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, characteristic handle, Vendor Specific UUIDs, lengths, and permissions need to adhere to the constraints. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation, a characteristic context is required. - * @retval ::NRF_ERROR_FORBIDDEN Forbidden value supplied, certain UUIDs are reserved for the stack. - * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation. - * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied, attribute lengths are restricted by @ref BLE_GATTS_ATTR_LENS_MAX. - */ -SVCALL(SD_BLE_GATTS_DESCRIPTOR_ADD, uint32_t, sd_ble_gatts_descriptor_add(uint16_t char_handle, ble_gatts_attr_t const *p_attr, uint16_t *p_handle)); - -/**@brief Set the value of a given attribute. - * - * @note Values other than system attributes can be set at any time, regardless of whether any active connections exist. - * - * @mscs - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_QUEUE_FULL_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_NOAUTH_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. Ignored if the value does not belong to a system attribute. - * @param[in] handle Attribute handle. - * @param[in,out] p_value Attribute value information. - * - * @retval ::NRF_SUCCESS Successfully set the value of the attribute. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_NOT_FOUND Attribute not found. - * @retval ::NRF_ERROR_FORBIDDEN Forbidden handle supplied, certain attributes are not modifiable by the application. - * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied, attribute lengths are restricted by @ref BLE_GATTS_ATTR_LENS_MAX. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied on a system attribute. - */ -SVCALL(SD_BLE_GATTS_VALUE_SET, uint32_t, sd_ble_gatts_value_set(uint16_t conn_handle, uint16_t handle, ble_gatts_value_t *p_value)); - -/**@brief Get the value of a given attribute. - * - * @note If the attribute value is longer than the size of the supplied buffer, - * @ref ble_gatts_value_t::len will return the total attribute value length (excluding offset), - * and not the number of bytes actually returned in @ref ble_gatts_value_t::p_value. - * The application may use this information to allocate a suitable buffer size. - * - * @note When retrieving system attribute values with this function, the connection handle - * may refer to an already disconnected connection. Refer to the documentation of - * @ref sd_ble_gatts_sys_attr_get for further information. - * - * @param[in] conn_handle Connection handle. Ignored if the value does not belong to a system attribute. - * @param[in] handle Attribute handle. - * @param[in,out] p_value Attribute value information. - * - * @retval ::NRF_SUCCESS Successfully retrieved the value of the attribute. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_NOT_FOUND Attribute not found. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid attribute offset supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied on a system attribute. - * @retval ::BLE_ERROR_GATTS_SYS_ATTR_MISSING System attributes missing, use @ref sd_ble_gatts_sys_attr_set to set them to a known value. - */ -SVCALL(SD_BLE_GATTS_VALUE_GET, uint32_t, sd_ble_gatts_value_get(uint16_t conn_handle, uint16_t handle, ble_gatts_value_t *p_value)); - -/**@brief Notify or Indicate an attribute value. - * - * @details This function checks for the relevant Client Characteristic Configuration descriptor value to verify that the relevant operation - * (notification or indication) has been enabled by the client. It is also able to update the attribute value before issuing the PDU, so that - * the application can atomically perform a value update and a server initiated transaction with a single API call. - * - * @note The local attribute value may be updated even if an outgoing packet is not sent to the peer due to an error during execution. - * The Attribute Table has been updated if one of the following error codes is returned: @ref NRF_ERROR_INVALID_STATE, @ref NRF_ERROR_BUSY, - * @ref NRF_ERROR_FORBIDDEN, @ref BLE_ERROR_GATTS_SYS_ATTR_MISSING and @ref NRF_ERROR_RESOURCES. - * The caller can check whether the value has been updated by looking at the contents of *(@ref ble_gatts_hvx_params_t::p_len). - * - * @note Only one indication procedure can be ongoing per connection at a time. - * If the application tries to indicate an attribute value while another indication procedure is ongoing, - * the function call will return @ref NRF_ERROR_BUSY. - * A @ref BLE_GATTS_EVT_HVC event will be issued as soon as the confirmation arrives from the peer. - * - * @note The number of Handle Value Notifications that can be queued is configured by @ref ble_gatts_conn_cfg_t::hvn_tx_queue_size - * When the queue is full, the function call will return @ref NRF_ERROR_RESOURCES. - * A @ref BLE_GATTS_EVT_HVN_TX_COMPLETE event will be issued as soon as the transmission of the notification is complete. - * - * @note The application can keep track of the available queue element count for notifications by following the procedure below: - * - Store initial queue element count in a variable. - * - Decrement the variable, which stores the currently available queue element count, by one when a call to this function returns @ref NRF_SUCCESS. - * - Increment the variable, which stores the current available queue element count, by the count variable in @ref BLE_GATTS_EVT_HVN_TX_COMPLETE event. - * - * @events - * @event{@ref BLE_GATTS_EVT_HVN_TX_COMPLETE, Notification transmission complete.} - * @event{@ref BLE_GATTS_EVT_HVC, Confirmation received from the peer.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GATTS_HVX_SYS_ATTRS_MISSING_MSC} - * @mmsc{@ref BLE_GATTS_HVN_MSC} - * @mmsc{@ref BLE_GATTS_HVI_MSC} - * @mmsc{@ref BLE_GATTS_HVX_DISABLED_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in,out] p_hvx_params Pointer to an HVx parameters structure. If @ref ble_gatts_hvx_params_t::p_data - * contains a non-NULL pointer the attribute value will be updated with the contents - * pointed by it before sending the notification or indication. If the attribute value - * is updated, @ref ble_gatts_hvx_params_t::p_len is updated by the SoftDevice to - * contain the number of actual bytes written, else it will be set to 0. - * - * @retval ::NRF_SUCCESS Successfully queued a notification or indication for transmission, and optionally updated the attribute value. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE One or more of the following is true: - * - Invalid Connection State - * - Notifications and/or indications not enabled in the CCCD - * - An ATT_MTU exchange is ongoing - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::BLE_ERROR_INVALID_ATTR_HANDLE Invalid attribute handle(s) supplied. Only attributes added directly by the application are available to notify and indicate. - * @retval ::BLE_ERROR_GATTS_INVALID_ATTR_TYPE Invalid attribute type(s) supplied, only characteristic values may be notified and indicated. - * @retval ::NRF_ERROR_NOT_FOUND Attribute not found. - * @retval ::NRF_ERROR_FORBIDDEN The connection's current security level is lower than the one required by the write permissions of the CCCD associated with this characteristic. - * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied. - * @retval ::NRF_ERROR_BUSY For @ref BLE_GATT_HVX_INDICATION Procedure already in progress. Wait for a @ref BLE_GATTS_EVT_HVC event and retry. - * @retval ::BLE_ERROR_GATTS_SYS_ATTR_MISSING System attributes missing, use @ref sd_ble_gatts_sys_attr_set to set them to a known value. - * @retval ::NRF_ERROR_RESOURCES Too many notifications queued. - * Wait for a @ref BLE_GATTS_EVT_HVN_TX_COMPLETE event and retry. - * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. - */ -SVCALL(SD_BLE_GATTS_HVX, uint32_t, sd_ble_gatts_hvx(uint16_t conn_handle, ble_gatts_hvx_params_t const *p_hvx_params)); - -/**@brief Indicate the Service Changed attribute value. - * - * @details This call will send a Handle Value Indication to one or more peers connected to inform them that the Attribute - * Table layout has changed. As soon as the peer has confirmed the indication, a @ref BLE_GATTS_EVT_SC_CONFIRM event will - * be issued. - * - * @note Some of the restrictions and limitations that apply to @ref sd_ble_gatts_hvx also apply here. - * - * @events - * @event{@ref BLE_GATTS_EVT_SC_CONFIRM, Confirmation of attribute table change received from peer.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GATTS_SC_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] start_handle Start of affected attribute handle range. - * @param[in] end_handle End of affected attribute handle range. - * - * @retval ::NRF_SUCCESS Successfully queued the Service Changed indication for transmission. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_NOT_SUPPORTED Service Changed not enabled at initialization. See @ref - * sd_ble_cfg_set and @ref ble_gatts_cfg_service_changed_t. - * @retval ::NRF_ERROR_INVALID_STATE One or more of the following is true: - * - Invalid Connection State - * - Notifications and/or indications not enabled in the CCCD - * - An ATT_MTU exchange is ongoing - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::BLE_ERROR_INVALID_ATTR_HANDLE Invalid attribute handle(s) supplied, handles must be in the range populated by the application. - * @retval ::NRF_ERROR_BUSY Procedure already in progress. - * @retval ::BLE_ERROR_GATTS_SYS_ATTR_MISSING System attributes missing, use @ref sd_ble_gatts_sys_attr_set to set them to a known value. - * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. - */ -SVCALL(SD_BLE_GATTS_SERVICE_CHANGED, uint32_t, sd_ble_gatts_service_changed(uint16_t conn_handle, uint16_t start_handle, uint16_t end_handle)); - -/**@brief Respond to a Read/Write authorization request. - * - * @note This call should only be used as a response to a @ref BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST event issued to the application. - * - * @mscs - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_AUTH_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_BUF_AUTH_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_NOAUTH_MSC} - * @mmsc{@ref BLE_GATTS_READ_REQ_AUTH_MSC} - * @mmsc{@ref BLE_GATTS_WRITE_REQ_AUTH_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_QUEUE_FULL_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_PEER_CANCEL_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] p_rw_authorize_reply_params Pointer to a structure with the attribute provided by the application. - * - * @note @ref ble_gatts_authorize_params_t::p_data is ignored when this function is used to respond - * to a @ref BLE_GATTS_AUTHORIZE_TYPE_READ event if @ref ble_gatts_authorize_params_t::update - * is set to 0. - * - * @retval ::NRF_SUCCESS Successfully queued a response to the peer, and in the case of a write operation, Attribute Table updated. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State or no authorization request pending. - * @retval ::NRF_ERROR_INVALID_PARAM Authorization op invalid, - * handle supplied does not match requested handle, - * or invalid data to be written provided by the application. - * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. - */ -SVCALL(SD_BLE_GATTS_RW_AUTHORIZE_REPLY, uint32_t, sd_ble_gatts_rw_authorize_reply(uint16_t conn_handle, ble_gatts_rw_authorize_reply_params_t const *p_rw_authorize_reply_params)); - - -/**@brief Update persistent system attribute information. - * - * @details Supply information about persistent system attributes to the stack, - * previously obtained using @ref sd_ble_gatts_sys_attr_get. - * This call is only allowed for active connections, and is usually - * made immediately after a connection is established with an known bonded device, - * often as a response to a @ref BLE_GATTS_EVT_SYS_ATTR_MISSING. - * - * p_sysattrs may point directly to the application's stored copy of the system attributes - * obtained using @ref sd_ble_gatts_sys_attr_get. - * If the pointer is NULL, the system attribute info is initialized, assuming that - * the application does not have any previously saved system attribute data for this device. - * - * @note The state of persistent system attributes is reset upon connection establishment and then remembered for its duration. - * - * @note If this call returns with an error code different from @ref NRF_SUCCESS, the storage of persistent system attributes may have been completed only partially. - * This means that the state of the attribute table is undefined, and the application should either provide a new set of attributes using this same call or - * reset the SoftDevice to return to a known state. - * - * @note When the @ref BLE_GATTS_SYS_ATTR_FLAG_SYS_SRVCS is used with this function, only the system attributes included in system services will be modified. - * @note When the @ref BLE_GATTS_SYS_ATTR_FLAG_USR_SRVCS is used with this function, only the system attributes included in user services will be modified. - * - * @mscs - * @mmsc{@ref BLE_GATTS_HVX_SYS_ATTRS_MISSING_MSC} - * @mmsc{@ref BLE_GATTS_SYS_ATTRS_UNK_PEER_MSC} - * @mmsc{@ref BLE_GATTS_SYS_ATTRS_BONDED_PEER_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] p_sys_attr_data Pointer to a saved copy of system attributes supplied to the stack, or NULL. - * @param[in] len Size of data pointed by p_sys_attr_data, in octets. - * @param[in] flags Optional additional flags, see @ref BLE_GATTS_SYS_ATTR_FLAGS - * - * @retval ::NRF_SUCCESS Successfully set the system attribute information. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid flags supplied. - * @retval ::NRF_ERROR_INVALID_DATA Invalid data supplied, the data should be exactly the same as retrieved with @ref sd_ble_gatts_sys_attr_get. - * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation. - */ -SVCALL(SD_BLE_GATTS_SYS_ATTR_SET, uint32_t, sd_ble_gatts_sys_attr_set(uint16_t conn_handle, uint8_t const *p_sys_attr_data, uint16_t len, uint32_t flags)); - - -/**@brief Retrieve persistent system attribute information from the stack. - * - * @details This call is used to retrieve information about values to be stored persistently by the application - * during the lifetime of a connection or after it has been terminated. When a new connection is established with the same bonded device, - * the system attribute information retrieved with this function should be restored using using @ref sd_ble_gatts_sys_attr_set. - * If retrieved after disconnection, the data should be read before a new connection established. The connection handle for - * the previous, now disconnected, connection will remain valid until a new one is created to allow this API call to refer to it. - * Connection handles belonging to active connections can be used as well, but care should be taken since the system attributes - * may be written to at any time by the peer during a connection's lifetime. - * - * @note When the @ref BLE_GATTS_SYS_ATTR_FLAG_SYS_SRVCS is used with this function, only the system attributes included in system services will be returned. - * @note When the @ref BLE_GATTS_SYS_ATTR_FLAG_USR_SRVCS is used with this function, only the system attributes included in user services will be returned. - * - * @mscs - * @mmsc{@ref BLE_GATTS_SYS_ATTRS_BONDED_PEER_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle of the recently terminated connection. - * @param[out] p_sys_attr_data Pointer to a buffer where updated information about system attributes will be filled in. The format of the data is described - * in @ref BLE_GATTS_SYS_ATTRS_FORMAT. NULL can be provided to obtain the length of the data. - * @param[in,out] p_len Size of application buffer if p_sys_attr_data is not NULL. Unconditionally updated to actual length of system attribute data. - * @param[in] flags Optional additional flags, see @ref BLE_GATTS_SYS_ATTR_FLAGS - * - * @retval ::NRF_SUCCESS Successfully retrieved the system attribute information. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid flags supplied. - * @retval ::NRF_ERROR_DATA_SIZE The system attribute information did not fit into the provided buffer. - * @retval ::NRF_ERROR_NOT_FOUND No system attributes found. - */ -SVCALL(SD_BLE_GATTS_SYS_ATTR_GET, uint32_t, sd_ble_gatts_sys_attr_get(uint16_t conn_handle, uint8_t *p_sys_attr_data, uint16_t *p_len, uint32_t flags)); - - -/**@brief Retrieve the first valid user attribute handle. - * - * @param[out] p_handle Pointer to an integer where the handle will be stored. - * - * @retval ::NRF_SUCCESS Successfully retrieved the handle. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - */ -SVCALL(SD_BLE_GATTS_INITIAL_USER_HANDLE_GET, uint32_t, sd_ble_gatts_initial_user_handle_get(uint16_t *p_handle)); - -/**@brief Retrieve the attribute UUID and/or metadata. - * - * @param[in] handle Attribute handle - * @param[out] p_uuid UUID of the attribute. Use NULL to omit this field. - * @param[out] p_md Metadata of the attribute. Use NULL to omit this field. - * - * @retval ::NRF_SUCCESS Successfully retrieved the attribute metadata, - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameters supplied. Returned when both @c p_uuid and @c p_md are NULL. - * @retval ::NRF_ERROR_NOT_FOUND Attribute was not found. - */ -SVCALL(SD_BLE_GATTS_ATTR_GET, uint32_t, sd_ble_gatts_attr_get(uint16_t handle, ble_uuid_t * p_uuid, ble_gatts_attr_md_t * p_md)); - -/**@brief Reply to an ATT_MTU exchange request by sending an Exchange MTU Response to the client. - * - * @details This function is only used to reply to a @ref BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST event. - * - * @details The SoftDevice sets ATT_MTU to the minimum of: - * - The Client RX MTU value from @ref BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST, and - * - The Server RX MTU value. - * - * However, the SoftDevice never sets ATT_MTU lower than @ref BLE_GATT_ATT_MTU_DEFAULT. - * - * @mscs - * @mmsc{@ref BLE_GATTS_MTU_EXCHANGE} - * @endmscs - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] server_rx_mtu Server RX MTU size. - * - The minimum value is @ref BLE_GATT_ATT_MTU_DEFAULT. - * - The maximum value is @ref ble_gatt_conn_cfg_t::att_mtu in the connection configuration - * used for this connection. - * - The value must be equal to Client RX MTU size given in @ref sd_ble_gattc_exchange_mtu_request - * if an ATT_MTU exchange has already been performed in the other direction. - * - * @retval ::NRF_SUCCESS Successfully sent response to the client. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State or no ATT_MTU exchange request pending. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid Server RX MTU size supplied. - * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. - */ -SVCALL(SD_BLE_GATTS_EXCHANGE_MTU_REPLY, uint32_t, sd_ble_gatts_exchange_mtu_reply(uint16_t conn_handle, uint16_t server_rx_mtu)); -/** @} */ - -#ifdef __cplusplus -} -#endif -#endif // BLE_GATTS_H__ - -/** - @} -*/ diff --git a/lib/nrf52/include/ble_hci.h b/lib/nrf52/include/ble_hci.h deleted file mode 100644 index f0dde9a0..00000000 --- a/lib/nrf52/include/ble_hci.h +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - @addtogroup BLE_COMMON - @{ -*/ - - -#ifndef BLE_HCI_H__ -#define BLE_HCI_H__ -#ifdef __cplusplus -extern "C" { -#endif - -/** @defgroup BLE_HCI_STATUS_CODES Bluetooth status codes - * @{ */ - -#define BLE_HCI_STATUS_CODE_SUCCESS 0x00 /**< Success. */ -#define BLE_HCI_STATUS_CODE_UNKNOWN_BTLE_COMMAND 0x01 /**< Unknown BLE Command. */ -#define BLE_HCI_STATUS_CODE_UNKNOWN_CONNECTION_IDENTIFIER 0x02 /**< Unknown Connection Identifier. */ -/*0x03 Hardware Failure -0x04 Page Timeout -*/ -#define BLE_HCI_AUTHENTICATION_FAILURE 0x05 /**< Authentication Failure. */ -#define BLE_HCI_STATUS_CODE_PIN_OR_KEY_MISSING 0x06 /**< Pin or Key missing. */ -#define BLE_HCI_MEMORY_CAPACITY_EXCEEDED 0x07 /**< Memory Capacity Exceeded. */ -#define BLE_HCI_CONNECTION_TIMEOUT 0x08 /**< Connection Timeout. */ -/*0x09 Connection Limit Exceeded -0x0A Synchronous Connection Limit To A Device Exceeded -0x0B ACL Connection Already Exists*/ -#define BLE_HCI_STATUS_CODE_COMMAND_DISALLOWED 0x0C /**< Command Disallowed. */ -/*0x0D Connection Rejected due to Limited Resources -0x0E Connection Rejected Due To Security Reasons -0x0F Connection Rejected due to Unacceptable BD_ADDR -0x10 Connection Accept Timeout Exceeded -0x11 Unsupported Feature or Parameter Value*/ -#define BLE_HCI_STATUS_CODE_INVALID_BTLE_COMMAND_PARAMETERS 0x12 /**< Invalid BLE Command Parameters. */ -#define BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION 0x13 /**< Remote User Terminated Connection. */ -#define BLE_HCI_REMOTE_DEV_TERMINATION_DUE_TO_LOW_RESOURCES 0x14 /**< Remote Device Terminated Connection due to low resources.*/ -#define BLE_HCI_REMOTE_DEV_TERMINATION_DUE_TO_POWER_OFF 0x15 /**< Remote Device Terminated Connection due to power off. */ -#define BLE_HCI_LOCAL_HOST_TERMINATED_CONNECTION 0x16 /**< Local Host Terminated Connection. */ -/* -0x17 Repeated Attempts -0x18 Pairing Not Allowed -0x19 Unknown LMP PDU -*/ -#define BLE_HCI_UNSUPPORTED_REMOTE_FEATURE 0x1A /**< Unsupported Remote Feature. */ -/* -0x1B SCO Offset Rejected -0x1C SCO Interval Rejected -0x1D SCO Air Mode Rejected*/ -#define BLE_HCI_STATUS_CODE_INVALID_LMP_PARAMETERS 0x1E /**< Invalid LMP Parameters. */ -#define BLE_HCI_STATUS_CODE_UNSPECIFIED_ERROR 0x1F /**< Unspecified Error. */ -/*0x20 Unsupported LMP Parameter Value -0x21 Role Change Not Allowed -*/ -#define BLE_HCI_STATUS_CODE_LMP_RESPONSE_TIMEOUT 0x22 /**< LMP Response Timeout. */ -#define BLE_HCI_STATUS_CODE_LMP_ERROR_TRANSACTION_COLLISION 0x23 /**< LMP Error Transaction Collision/LL Procedure Collision. */ -#define BLE_HCI_STATUS_CODE_LMP_PDU_NOT_ALLOWED 0x24 /**< LMP PDU Not Allowed. */ -/*0x25 Encryption Mode Not Acceptable -0x26 Link Key Can Not be Changed -0x27 Requested QoS Not Supported -*/ -#define BLE_HCI_INSTANT_PASSED 0x28 /**< Instant Passed. */ -#define BLE_HCI_PAIRING_WITH_UNIT_KEY_UNSUPPORTED 0x29 /**< Pairing with Unit Key Unsupported. */ -#define BLE_HCI_DIFFERENT_TRANSACTION_COLLISION 0x2A /**< Different Transaction Collision. */ -/* -0x2B Reserved -0x2C QoS Unacceptable Parameter -0x2D QoS Rejected -0x2E Channel Classification Not Supported -0x2F Insufficient Security -*/ -#define BLE_HCI_PARAMETER_OUT_OF_MANDATORY_RANGE 0x30 /**< Parameter Out Of Mandatory Range. */ -/* -0x31 Reserved -0x32 Role Switch Pending -0x33 Reserved -0x34 Reserved Slot Violation -0x35 Role Switch Failed -0x36 Extended Inquiry Response Too Large -0x37 Secure Simple Pairing Not Supported By Host. -0x38 Host Busy - Pairing -0x39 Connection Rejected due to No Suitable Channel Found*/ -#define BLE_HCI_CONTROLLER_BUSY 0x3A /**< Controller Busy. */ -#define BLE_HCI_CONN_INTERVAL_UNACCEPTABLE 0x3B /**< Connection Interval Unacceptable. */ -#define BLE_HCI_DIRECTED_ADVERTISER_TIMEOUT 0x3C /**< Directed Advertisement Timeout. */ -#define BLE_HCI_CONN_TERMINATED_DUE_TO_MIC_FAILURE 0x3D /**< Connection Terminated due to MIC Failure. */ -#define BLE_HCI_CONN_FAILED_TO_BE_ESTABLISHED 0x3E /**< Connection Failed to be Established. */ - -/** @} */ - - -#ifdef __cplusplus -} -#endif -#endif // BLE_HCI_H__ - -/** @} */ diff --git a/lib/nrf52/include/ble_l2cap.h b/lib/nrf52/include/ble_l2cap.h deleted file mode 100644 index edaf6641..00000000 --- a/lib/nrf52/include/ble_l2cap.h +++ /dev/null @@ -1,506 +0,0 @@ -/* - * Copyright (c) 2011 - 2018, Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - @addtogroup BLE_L2CAP Logical Link Control and Adaptation Protocol (L2CAP) - @{ - @brief Definitions and prototypes for the L2CAP interface. - */ - -#ifndef BLE_L2CAP_H__ -#define BLE_L2CAP_H__ - -#include -#include "nrf_svc.h" -#include "nrf_error.h" -#include "ble_ranges.h" -#include "ble_types.h" -#include "ble_err.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/**@addtogroup BLE_L2CAP_TERMINOLOGY Terminology - * @{ - * @details - * - * L2CAP SDU - * - A data unit that the application can send/receive to/from a peer. - * - * L2CAP PDU - * - A data unit that is exchanged between local and remote L2CAP entities. - * It consists of L2CAP protocol control information and payload fields. - * The payload field can contain an L2CAP SDU or a part of an L2CAP SDU. - * - * L2CAP MTU - * - The maximum length of an L2CAP SDU. - * - * L2CAP MPS - * - The maximum length of an L2CAP PDU payload field. - * - * Credits - * - A value indicating the number of L2CAP PDUs that the receiver of the credit can send to the peer. - * @} */ - -/**@addtogroup BLE_L2CAP_ENUMERATIONS Enumerations - * @{ */ - -/**@brief L2CAP API SVC numbers. */ -enum BLE_L2CAP_SVCS -{ - SD_BLE_L2CAP_CH_SETUP = BLE_L2CAP_SVC_BASE + 0, /**< Set up an L2CAP channel. */ - SD_BLE_L2CAP_CH_RELEASE = BLE_L2CAP_SVC_BASE + 1, /**< Release an L2CAP channel. */ - SD_BLE_L2CAP_CH_RX = BLE_L2CAP_SVC_BASE + 2, /**< Receive an SDU on an L2CAP channel. */ - SD_BLE_L2CAP_CH_TX = BLE_L2CAP_SVC_BASE + 3, /**< Transmit an SDU on an L2CAP channel. */ - SD_BLE_L2CAP_CH_FLOW_CONTROL = BLE_L2CAP_SVC_BASE + 4, /**< Advanced SDU reception flow control. */ -}; - -/**@brief L2CAP Event IDs. */ -enum BLE_L2CAP_EVTS -{ - BLE_L2CAP_EVT_CH_SETUP_REQUEST = BLE_L2CAP_EVT_BASE + 0, /**< L2CAP Channel Setup Request event. - \n See @ref ble_l2cap_evt_ch_setup_request_t. */ - BLE_L2CAP_EVT_CH_SETUP_REFUSED = BLE_L2CAP_EVT_BASE + 1, /**< L2CAP Channel Setup Refused event. - \n See @ref ble_l2cap_evt_ch_setup_refused_t. */ - BLE_L2CAP_EVT_CH_SETUP = BLE_L2CAP_EVT_BASE + 2, /**< L2CAP Channel Setup Completed event. - \n See @ref ble_l2cap_evt_ch_setup_t. */ - BLE_L2CAP_EVT_CH_RELEASED = BLE_L2CAP_EVT_BASE + 3, /**< L2CAP Channel Released event. - \n No additional event structure applies. */ - BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED = BLE_L2CAP_EVT_BASE + 4, /**< L2CAP Channel SDU data buffer released event. - \n See @ref ble_l2cap_evt_ch_sdu_buf_released_t. */ - BLE_L2CAP_EVT_CH_CREDIT = BLE_L2CAP_EVT_BASE + 5, /**< L2CAP Channel Credit received. - \n See @ref ble_l2cap_evt_ch_credit_t. */ - BLE_L2CAP_EVT_CH_RX = BLE_L2CAP_EVT_BASE + 6, /**< L2CAP Channel SDU received. - \n See @ref ble_l2cap_evt_ch_rx_t. */ - BLE_L2CAP_EVT_CH_TX = BLE_L2CAP_EVT_BASE + 7, /**< L2CAP Channel SDU transmitted. - \n See @ref ble_l2cap_evt_ch_tx_t. */ -}; - -/** @} */ - -/**@addtogroup BLE_L2CAP_DEFINES Defines - * @{ */ - -/**@brief Maximum number of L2CAP channels per connection. */ -#define BLE_L2CAP_CH_COUNT_MAX (64) - -/**@brief Minimum L2CAP MTU, in bytes. */ -#define BLE_L2CAP_MTU_MIN (23) - -/**@brief Minimum L2CAP MPS, in bytes. */ -#define BLE_L2CAP_MPS_MIN (23) - -/**@brief Invalid CID. */ -#define BLE_L2CAP_CID_INVALID (0x0000) - -/**@brief Default number of credits for @ref sd_ble_l2cap_ch_flow_control. */ -#define BLE_L2CAP_CREDITS_DEFAULT (1) - -/**@defgroup BLE_L2CAP_CH_SETUP_REFUSED_SRCS L2CAP channel setup refused sources - * @{ */ -#define BLE_L2CAP_CH_SETUP_REFUSED_SRC_LOCAL (0x01) /**< Local. */ -#define BLE_L2CAP_CH_SETUP_REFUSED_SRC_REMOTE (0x02) /**< Remote. */ - /** @} */ - - /** @defgroup BLE_L2CAP_CH_STATUS_CODES L2CAP channel status codes - * @{ */ -#define BLE_L2CAP_CH_STATUS_CODE_SUCCESS (0x0000) /**< Success. */ -#define BLE_L2CAP_CH_STATUS_CODE_LE_PSM_NOT_SUPPORTED (0x0002) /**< LE_PSM not supported. */ -#define BLE_L2CAP_CH_STATUS_CODE_NO_RESOURCES (0x0004) /**< No resources available. */ -#define BLE_L2CAP_CH_STATUS_CODE_INSUFF_AUTHENTICATION (0x0005) /**< Insufficient authentication. */ -#define BLE_L2CAP_CH_STATUS_CODE_INSUFF_AUTHORIZATION (0x0006) /**< Insufficient authorization. */ -#define BLE_L2CAP_CH_STATUS_CODE_INSUFF_ENC_KEY_SIZE (0x0007) /**< Insufficient encryption key size. */ -#define BLE_L2CAP_CH_STATUS_CODE_INSUFF_ENC (0x0008) /**< Insufficient encryption. */ -#define BLE_L2CAP_CH_STATUS_CODE_INVALID_SCID (0x0009) /**< Invalid Source CID. */ -#define BLE_L2CAP_CH_STATUS_CODE_SCID_ALLOCATED (0x000A) /**< Source CID already allocated. */ -#define BLE_L2CAP_CH_STATUS_CODE_UNACCEPTABLE_PARAMS (0x000B) /**< Unacceptable parameters. */ -#define BLE_L2CAP_CH_STATUS_CODE_NOT_UNDERSTOOD (0x8000) /**< Command Reject received instead of LE Credit Based Connection Response. */ -#define BLE_L2CAP_CH_STATUS_CODE_TIMEOUT (0xC000) /**< Operation timed out. */ -/** @} */ - -/** @} */ - -/**@addtogroup BLE_L2CAP_STRUCTURES Structures - * @{ */ - -/** - * @brief BLE L2CAP connection configuration parameters, set with @ref sd_ble_cfg_set. - * - * @note These parameters are set per connection, so all L2CAP channels created on this connection - * will have the same parameters. - * - * @retval ::NRF_ERROR_INVALID_PARAM One or more of the following is true: - * - rx_mps is smaller than @ref BLE_L2CAP_MPS_MIN. - * - tx_mps is smaller than @ref BLE_L2CAP_MPS_MIN. - * - ch_count is greater than @ref BLE_L2CAP_CH_COUNT_MAX. - * @retval ::NRF_ERROR_NO_MEM rx_mps or tx_mps is set too high. - */ -typedef struct -{ - uint16_t rx_mps; /**< The maximum L2CAP PDU payload size, in bytes, that L2CAP shall - be able to receive on L2CAP channels on connections with this - configuration. The minimum value is @ref BLE_L2CAP_MPS_MIN. */ - uint16_t tx_mps; /**< The maximum L2CAP PDU payload size, in bytes, that L2CAP shall - be able to transmit on L2CAP channels on connections with this - configuration. The minimum value is @ref BLE_L2CAP_MPS_MIN. */ - uint8_t rx_queue_size; /**< Number of SDU data buffers that can be queued for reception per - L2CAP channel. The minimum value is one. */ - uint8_t tx_queue_size; /**< Number of SDU data buffers that can be queued for transmission - per L2CAP channel. The minimum value is one. */ - uint8_t ch_count; /**< Number of L2CAP channels the application can create per connection - with this configuration. The default value is zero, the maximum - value is @ref BLE_L2CAP_CH_COUNT_MAX. - @note if this parameter is set to zero, all other parameters in - @ref ble_l2cap_conn_cfg_t are ignored. */ -} ble_l2cap_conn_cfg_t; - -/**@brief L2CAP channel RX parameters. */ -typedef struct -{ - uint16_t rx_mtu; /**< The maximum L2CAP SDU size, in bytes, that L2CAP shall be able to - receive on this L2CAP channel. - - Must be equal to or greater than @ref BLE_L2CAP_MTU_MIN. */ - uint16_t rx_mps; /**< The maximum L2CAP PDU payload size, in bytes, that L2CAP shall be - able to receive on this L2CAP channel. - - Must be equal to or greater than @ref BLE_L2CAP_MPS_MIN. - - Must be equal to or less than @ref ble_l2cap_conn_cfg_t::rx_mps. */ - ble_data_t sdu_buf; /**< SDU data buffer for reception. - - If @ref ble_data_t::p_data is non-NULL, initial credits are - issued to the peer. - - If @ref ble_data_t::p_data is NULL, no initial credits are - issued to the peer. */ -} ble_l2cap_ch_rx_params_t; - -/**@brief L2CAP channel setup parameters. */ -typedef struct -{ - ble_l2cap_ch_rx_params_t rx_params; /**< L2CAP channel RX parameters. */ - uint16_t le_psm; /**< LE Protocol/Service Multiplexer. Used when requesting - setup of an L2CAP channel, ignored otherwise. */ - uint16_t status; /**< Status code, see @ref BLE_L2CAP_CH_STATUS_CODES. - Used when replying to a setup request of an L2CAP - channel, ignored otherwise. */ -} ble_l2cap_ch_setup_params_t; - -/**@brief L2CAP channel TX parameters. */ -typedef struct -{ - uint16_t tx_mtu; /**< The maximum L2CAP SDU size, in bytes, that L2CAP is able to - transmit on this L2CAP channel. */ - uint16_t peer_mps; /**< The maximum L2CAP PDU payload size, in bytes, that the peer is - able to receive on this L2CAP channel. */ - uint16_t tx_mps; /**< The maximum L2CAP PDU payload size, in bytes, that L2CAP is able - to transmit on this L2CAP channel. This is effective tx_mps, - selected by the SoftDevice as - MIN( @ref ble_l2cap_ch_tx_params_t::peer_mps, @ref ble_l2cap_conn_cfg_t::tx_mps ) */ - uint16_t credits; /**< Initial credits given by the peer. */ -} ble_l2cap_ch_tx_params_t; - -/**@brief L2CAP Channel Setup Request event. */ -typedef struct -{ - ble_l2cap_ch_tx_params_t tx_params; /**< L2CAP channel TX parameters. */ - uint16_t le_psm; /**< LE Protocol/Service Multiplexer. */ -} ble_l2cap_evt_ch_setup_request_t; - -/**@brief L2CAP Channel Setup Refused event. */ -typedef struct -{ - uint8_t source; /**< Source, see @ref BLE_L2CAP_CH_SETUP_REFUSED_SRCS */ - uint16_t status; /**< Status code, see @ref BLE_L2CAP_CH_STATUS_CODES */ -} ble_l2cap_evt_ch_setup_refused_t; - -/**@brief L2CAP Channel Setup Completed event. */ -typedef struct -{ - ble_l2cap_ch_tx_params_t tx_params; /**< L2CAP channel TX parameters. */ -} ble_l2cap_evt_ch_setup_t; - -/**@brief L2CAP Channel SDU Data Buffer Released event. */ -typedef struct -{ - ble_data_t sdu_buf; /**< Returned reception or transmission SDU data buffer. The SoftDevice - returns SDU data buffers supplied by the application, which have - not yet been returned previously via a @ref BLE_L2CAP_EVT_CH_RX or - @ref BLE_L2CAP_EVT_CH_TX event. */ -} ble_l2cap_evt_ch_sdu_buf_released_t; - -/**@brief L2CAP Channel Credit received event. */ -typedef struct -{ - uint16_t credits; /**< Additional credits given by the peer. */ -} ble_l2cap_evt_ch_credit_t; - -/**@brief L2CAP Channel received SDU event. */ -typedef struct -{ - uint16_t sdu_len; /**< Total SDU length, in bytes. */ - ble_data_t sdu_buf; /**< SDU data buffer. - @note If there is not enough space in the buffer - (sdu_buf.len < sdu_len) then the rest of the SDU will be - silently discarded by the SoftDevice. */ -} ble_l2cap_evt_ch_rx_t; - -/**@brief L2CAP Channel transmitted SDU event. */ -typedef struct -{ - ble_data_t sdu_buf; /**< SDU data buffer. */ -} ble_l2cap_evt_ch_tx_t; - -/**@brief L2CAP event structure. */ -typedef struct -{ - uint16_t conn_handle; /**< Connection Handle on which the event occured. */ - uint16_t local_cid; /**< Local Channel ID of the L2CAP channel, or - @ref BLE_L2CAP_CID_INVALID if not present. */ - union - { - ble_l2cap_evt_ch_setup_request_t ch_setup_request; /**< L2CAP Channel Setup Request Event Parameters. */ - ble_l2cap_evt_ch_setup_refused_t ch_setup_refused; /**< L2CAP Channel Setup Refused Event Parameters. */ - ble_l2cap_evt_ch_setup_t ch_setup; /**< L2CAP Channel Setup Completed Event Parameters. */ - ble_l2cap_evt_ch_sdu_buf_released_t ch_sdu_buf_released;/**< L2CAP Channel SDU Data Buffer Released Event Parameters. */ - ble_l2cap_evt_ch_credit_t credit; /**< L2CAP Channel Credit Received Event Parameters. */ - ble_l2cap_evt_ch_rx_t rx; /**< L2CAP Channel SDU Received Event Parameters. */ - ble_l2cap_evt_ch_tx_t tx; /**< L2CAP Channel SDU Transmitted Event Parameters. */ - } params; /**< Event Parameters. */ -} ble_l2cap_evt_t; - -/** @} */ - -/**@addtogroup BLE_L2CAP_FUNCTIONS Functions - * @{ */ - -/**@brief Set up an L2CAP channel. - * - * @details This function is used to: - * - Request setup of an L2CAP channel: sends an LE Credit Based Connection Request packet to a peer. - * - Reply to a setup request of an L2CAP channel (if called in response to a - * @ref BLE_L2CAP_EVT_CH_SETUP_REQUEST event): sends an LE Credit Based Connection - * Response packet to a peer. - * - * @note A call to this function will require the application to keep the SDU data buffer alive - * until the SDU data buffer is returned in @ref BLE_L2CAP_EVT_CH_RX or - * @ref BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED event. - * - * @events - * @event{@ref BLE_L2CAP_EVT_CH_SETUP, Setup successful.} - * @event{@ref BLE_L2CAP_EVT_CH_SETUP_REFUSED, Setup failed.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_L2CAP_CH_SETUP_MSC} - * @endmscs - * - * @param[in] conn_handle Connection Handle. - * @param[in,out] p_local_cid Pointer to a uint16_t containing Local Channel ID of the L2CAP channel: - * - As input: @ref BLE_L2CAP_CID_INVALID when requesting setup of an L2CAP - * channel or local_cid provided in the @ref BLE_L2CAP_EVT_CH_SETUP_REQUEST - * event when replying to a setup request of an L2CAP channel. - * - As output: local_cid for this channel. - * @param[in] p_params L2CAP channel parameters. - * - * @retval ::NRF_SUCCESS Successfully queued request or response for transmission. - * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_INVALID_LENGTH Supplied higher rx_mps than has been configured on this link. - * @retval ::NRF_ERROR_INVALID_STATE Invalid State to perform operation (L2CAP channel already set up). - * @retval ::NRF_ERROR_NOT_FOUND CID not found. - * @retval ::NRF_ERROR_RESOURCES The limit has been reached for available L2CAP channels, - * see @ref ble_l2cap_conn_cfg_t::ch_count. - */ -SVCALL(SD_BLE_L2CAP_CH_SETUP, uint32_t, sd_ble_l2cap_ch_setup(uint16_t conn_handle, uint16_t *p_local_cid, ble_l2cap_ch_setup_params_t const *p_params)); - -/**@brief Release an L2CAP channel. - * - * @details This sends a Disconnection Request packet to a peer. - * - * @events - * @event{@ref BLE_L2CAP_EVT_CH_RELEASED, Release complete.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_L2CAP_CH_RELEASE_MSC} - * @endmscs - * - * @param[in] conn_handle Connection Handle. - * @param[in] local_cid Local Channel ID of the L2CAP channel. - * - * @retval ::NRF_SUCCESS Successfully queued request for transmission. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid State to perform operation (Setup or release is - * in progress for the L2CAP channel). - * @retval ::NRF_ERROR_NOT_FOUND CID not found. - */ -SVCALL(SD_BLE_L2CAP_CH_RELEASE, uint32_t, sd_ble_l2cap_ch_release(uint16_t conn_handle, uint16_t local_cid)); - -/**@brief Receive an SDU on an L2CAP channel. - * - * @details This may issue additional credits to the peer using an LE Flow Control Credit packet. - * - * @note A call to this function will require the application to keep the memory pointed by - * @ref ble_data_t::p_data alive until the SDU data buffer is returned in @ref BLE_L2CAP_EVT_CH_RX - * or @ref BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED event. - * - * @note The SoftDevice can queue up to @ref ble_l2cap_conn_cfg_t::rx_queue_size SDU data buffers - * for reception per L2CAP channel. - * - * @events - * @event{@ref BLE_L2CAP_EVT_CH_RX, The SDU is received.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_L2CAP_CH_RX_MSC} - * @endmscs - * - * @param[in] conn_handle Connection Handle. - * @param[in] local_cid Local Channel ID of the L2CAP channel. - * @param[in] p_sdu_buf Pointer to the SDU data buffer. - * - * @retval ::NRF_SUCCESS Buffer accepted. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid State to perform operation (Setup or release is - * in progress for an L2CAP channel). - * @retval ::NRF_ERROR_NOT_FOUND CID not found. - * @retval ::NRF_ERROR_RESOURCES Too many SDU data buffers supplied. Wait for a - * @ref BLE_L2CAP_EVT_CH_RX event and retry. - */ -SVCALL(SD_BLE_L2CAP_CH_RX, uint32_t, sd_ble_l2cap_ch_rx(uint16_t conn_handle, uint16_t local_cid, ble_data_t const *p_sdu_buf)); - -/**@brief Transmit an SDU on an L2CAP channel. - * - * @note A call to this function will require the application to keep the memory pointed by - * @ref ble_data_t::p_data alive until the SDU data buffer is returned in @ref BLE_L2CAP_EVT_CH_TX - * or @ref BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED event. - * - * @note The SoftDevice can queue up to @ref ble_l2cap_conn_cfg_t::tx_queue_size SDUs for - * transmission per L2CAP channel. - * - * @note The application can keep track of the available credits for transmission by following - * the procedure below: - * - Store initial credits given by the peer in a variable. - * (Initial credits are provided in a @ref BLE_L2CAP_EVT_CH_SETUP event.) - * - Decrement the variable, which stores the currently available credits, by - * ceiling((@ref ble_data_t::len + 2) / tx_mps) when a call to this function returns - * @ref NRF_SUCCESS. (tx_mps is provided in a @ref BLE_L2CAP_EVT_CH_SETUP event.) - * - Increment the variable, which stores the currently available credits, by additional - * credits given by the peer in a @ref BLE_L2CAP_EVT_CH_CREDIT event. - * - * @events - * @event{@ref BLE_L2CAP_EVT_CH_TX, The SDU is transmitted.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_L2CAP_CH_TX_MSC} - * @endmscs - * - * @param[in] conn_handle Connection Handle. - * @param[in] local_cid Local Channel ID of the L2CAP channel. - * @param[in] p_sdu_buf Pointer to the SDU data buffer. - * - * @retval ::NRF_SUCCESS Successfully queued L2CAP SDU for transmission. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid State to perform operation (Setup or release is - * in progress for the L2CAP channel). - * @retval ::NRF_ERROR_NOT_FOUND CID not found. - * @retval ::NRF_ERROR_DATA_SIZE Invalid SDU length supplied, must not be more than - * @ref ble_l2cap_ch_tx_params_t::tx_mtu provided in - * @ref BLE_L2CAP_EVT_CH_SETUP event. - * @retval ::NRF_ERROR_RESOURCES Too many SDUs queued for transmission. Wait for a - * @ref BLE_L2CAP_EVT_CH_TX event and retry. - */ -SVCALL(SD_BLE_L2CAP_CH_TX, uint32_t, sd_ble_l2cap_ch_tx(uint16_t conn_handle, uint16_t local_cid, ble_data_t const *p_sdu_buf)); - -/**@brief Advanced SDU reception flow control. - * - * @details Adjust the way the SoftDevice issues credits to the peer. - * This may issue additional credits to the peer using an LE Flow Control Credit packet. - * - * @mscs - * @mmsc{@ref BLE_L2CAP_CH_FLOW_CONTROL_MSC} - * @endmscs - * - * @param[in] conn_handle Connection Handle. - * @param[in] local_cid Local Channel ID of the L2CAP channel or @ref BLE_L2CAP_CID_INVALID to set - * the value that will be used for newly created channels. - * @param[in] credits Number of credits that the SoftDevice will make sure the peer has every - * time it starts using a new reception buffer. - * - @ref BLE_L2CAP_CREDITS_DEFAULT is the default value the SoftDevice will - * use if this function is not called. - * - If set to zero, the SoftDevice will stop issuing credits for new reception - * buffers the application provides or has provided. SDU reception that is - * currently ongoing will be allowed to complete. - * @param[out] p_credits NULL or pointer to a uint16_t. If a valid pointer is provided, it will be - * written by the SoftDevice with the number of credits that is or will be - * available to the peer. If the value written by the SoftDevice is 0 when - * credits parameter was set to 0, the peer will not be able to send more - * data until more credits are provided by calling this function again with - * credits > 0. This parameter is ignored when local_cid is set to - * @ref BLE_L2CAP_CID_INVALID. - * - * @note Application should take care when setting number of credits higher than default value. In - * this case the application must make sure that the SoftDevice always has reception buffers - * available (see @ref sd_ble_l2cap_ch_rx) for that channel. If the SoftDevice does not have - * such buffers available, packets may be NACKed on the Link Layer and all Bluetooth traffic - * on the connection handle may be stalled until the SoftDevice again has an available - * reception buffer. This applies even if the application has used this call to set the - * credits back to default, or zero. - * - * @retval ::NRF_SUCCESS Flow control parameters accepted. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid State to perform operation (Setup or release is - * in progress for an L2CAP channel). - * @retval ::NRF_ERROR_NOT_FOUND CID not found. - */ -SVCALL(SD_BLE_L2CAP_CH_FLOW_CONTROL, uint32_t, sd_ble_l2cap_ch_flow_control(uint16_t conn_handle, uint16_t local_cid, uint16_t credits, uint16_t *p_credits)); - -/** @} */ - -#ifdef __cplusplus -} -#endif -#endif // BLE_L2CAP_H__ - -/** - @} -*/ diff --git a/lib/nrf52/include/ble_ranges.h b/lib/nrf52/include/ble_ranges.h deleted file mode 100644 index 0935bca0..00000000 --- a/lib/nrf52/include/ble_ranges.h +++ /dev/null @@ -1,156 +0,0 @@ -/* - * Copyright (c) 2012 - 2018, Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - @addtogroup BLE_COMMON - @{ - @defgroup ble_ranges Module specific SVC, event and option number subranges - @{ - - @brief Definition of SVC, event and option number subranges for each API module. - - @note - SVCs, event and option numbers are split into subranges for each API module. - Each module receives its entire allocated range of SVC calls, whether implemented or not, - but return BLE_ERROR_NOT_SUPPORTED for unimplemented or undefined calls in its range. - - Note that the symbols BLE__SVC_LAST is the end of the allocated SVC range, - rather than the last SVC function call actually defined and implemented. - - Specific SVC, event and option values are defined in each module's ble_.h file, - which defines names of each individual SVC code based on the range start value. -*/ - -#ifndef BLE_RANGES_H__ -#define BLE_RANGES_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#define BLE_SVC_BASE 0x60 /**< Common BLE SVC base. */ -#define BLE_SVC_LAST 0x6B /**< Common BLE SVC last. */ - -#define BLE_GAP_SVC_BASE 0x6C /**< GAP BLE SVC base. */ -#define BLE_GAP_SVC_LAST 0x9A /**< GAP BLE SVC last. */ - -#define BLE_GATTC_SVC_BASE 0x9B /**< GATTC BLE SVC base. */ -#define BLE_GATTC_SVC_LAST 0xA7 /**< GATTC BLE SVC last. */ - -#define BLE_GATTS_SVC_BASE 0xA8 /**< GATTS BLE SVC base. */ -#define BLE_GATTS_SVC_LAST 0xB7 /**< GATTS BLE SVC last. */ - -#define BLE_L2CAP_SVC_BASE 0xB8 /**< L2CAP BLE SVC base. */ -#define BLE_L2CAP_SVC_LAST 0xBF /**< L2CAP BLE SVC last. */ - - -#define BLE_EVT_INVALID 0x00 /**< Invalid BLE Event. */ - -#define BLE_EVT_BASE 0x01 /**< Common BLE Event base. */ -#define BLE_EVT_LAST 0x0F /**< Common BLE Event last. */ - -#define BLE_GAP_EVT_BASE 0x10 /**< GAP BLE Event base. */ -#define BLE_GAP_EVT_LAST 0x2F /**< GAP BLE Event last. */ - -#define BLE_GATTC_EVT_BASE 0x30 /**< GATTC BLE Event base. */ -#define BLE_GATTC_EVT_LAST 0x4F /**< GATTC BLE Event last. */ - -#define BLE_GATTS_EVT_BASE 0x50 /**< GATTS BLE Event base. */ -#define BLE_GATTS_EVT_LAST 0x6F /**< GATTS BLE Event last. */ - -#define BLE_L2CAP_EVT_BASE 0x70 /**< L2CAP BLE Event base. */ -#define BLE_L2CAP_EVT_LAST 0x8F /**< L2CAP BLE Event last. */ - - -#define BLE_OPT_INVALID 0x00 /**< Invalid BLE Option. */ - -#define BLE_OPT_BASE 0x01 /**< Common BLE Option base. */ -#define BLE_OPT_LAST 0x1F /**< Common BLE Option last. */ - -#define BLE_GAP_OPT_BASE 0x20 /**< GAP BLE Option base. */ -#define BLE_GAP_OPT_LAST 0x3F /**< GAP BLE Option last. */ - -#define BLE_GATT_OPT_BASE 0x40 /**< GATT BLE Option base. */ -#define BLE_GATT_OPT_LAST 0x5F /**< GATT BLE Option last. */ - -#define BLE_GATTC_OPT_BASE 0x60 /**< GATTC BLE Option base. */ -#define BLE_GATTC_OPT_LAST 0x7F /**< GATTC BLE Option last. */ - -#define BLE_GATTS_OPT_BASE 0x80 /**< GATTS BLE Option base. */ -#define BLE_GATTS_OPT_LAST 0x9F /**< GATTS BLE Option last. */ - -#define BLE_L2CAP_OPT_BASE 0xA0 /**< L2CAP BLE Option base. */ -#define BLE_L2CAP_OPT_LAST 0xBF /**< L2CAP BLE Option last. */ - - -#define BLE_CFG_INVALID 0x00 /**< Invalid BLE configuration. */ - -#define BLE_CFG_BASE 0x01 /**< Common BLE configuration base. */ -#define BLE_CFG_LAST 0x1F /**< Common BLE configuration last. */ - -#define BLE_CONN_CFG_BASE 0x20 /**< BLE connection configuration base. */ -#define BLE_CONN_CFG_LAST 0x3F /**< BLE connection configuration last. */ - -#define BLE_GAP_CFG_BASE 0x40 /**< GAP BLE configuration base. */ -#define BLE_GAP_CFG_LAST 0x5F /**< GAP BLE configuration last. */ - -#define BLE_GATT_CFG_BASE 0x60 /**< GATT BLE configuration base. */ -#define BLE_GATT_CFG_LAST 0x7F /**< GATT BLE configuration last. */ - -#define BLE_GATTC_CFG_BASE 0x80 /**< GATTC BLE configuration base. */ -#define BLE_GATTC_CFG_LAST 0x9F /**< GATTC BLE configuration last. */ - -#define BLE_GATTS_CFG_BASE 0xA0 /**< GATTS BLE configuration base. */ -#define BLE_GATTS_CFG_LAST 0xBF /**< GATTS BLE configuration last. */ - -#define BLE_L2CAP_CFG_BASE 0xC0 /**< L2CAP BLE configuration base. */ -#define BLE_L2CAP_CFG_LAST 0xDF /**< L2CAP BLE configuration last. */ - - - - - -#ifdef __cplusplus -} -#endif -#endif /* BLE_RANGES_H__ */ - -/** - @} - @} -*/ diff --git a/lib/nrf52/include/ble_types.h b/lib/nrf52/include/ble_types.h deleted file mode 100644 index 88c93180..00000000 --- a/lib/nrf52/include/ble_types.h +++ /dev/null @@ -1,215 +0,0 @@ -/* - * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - @addtogroup BLE_COMMON - @{ - @defgroup ble_types Common types and macro definitions - @{ - - @brief Common types and macro definitions for the BLE SoftDevice. - */ - -#ifndef BLE_TYPES_H__ -#define BLE_TYPES_H__ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** @addtogroup BLE_TYPES_DEFINES Defines - * @{ */ - -/** @defgroup BLE_CONN_HANDLES BLE Connection Handles - * @{ */ -#define BLE_CONN_HANDLE_INVALID 0xFFFF /**< Invalid Connection Handle. */ -#define BLE_CONN_HANDLE_ALL 0xFFFE /**< Applies to all Connection Handles. */ -/** @} */ - - -/** @defgroup BLE_UUID_VALUES Assigned Values for BLE UUIDs - * @{ */ -/* Generic UUIDs, applicable to all services */ -#define BLE_UUID_UNKNOWN 0x0000 /**< Reserved UUID. */ -#define BLE_UUID_SERVICE_PRIMARY 0x2800 /**< Primary Service. */ -#define BLE_UUID_SERVICE_SECONDARY 0x2801 /**< Secondary Service. */ -#define BLE_UUID_SERVICE_INCLUDE 0x2802 /**< Include. */ -#define BLE_UUID_CHARACTERISTIC 0x2803 /**< Characteristic. */ -#define BLE_UUID_DESCRIPTOR_CHAR_EXT_PROP 0x2900 /**< Characteristic Extended Properties Descriptor. */ -#define BLE_UUID_DESCRIPTOR_CHAR_USER_DESC 0x2901 /**< Characteristic User Description Descriptor. */ -#define BLE_UUID_DESCRIPTOR_CLIENT_CHAR_CONFIG 0x2902 /**< Client Characteristic Configuration Descriptor. */ -#define BLE_UUID_DESCRIPTOR_SERVER_CHAR_CONFIG 0x2903 /**< Server Characteristic Configuration Descriptor. */ -#define BLE_UUID_DESCRIPTOR_CHAR_PRESENTATION_FORMAT 0x2904 /**< Characteristic Presentation Format Descriptor. */ -#define BLE_UUID_DESCRIPTOR_CHAR_AGGREGATE_FORMAT 0x2905 /**< Characteristic Aggregate Format Descriptor. */ -/* GATT specific UUIDs */ -#define BLE_UUID_GATT 0x1801 /**< Generic Attribute Profile. */ -#define BLE_UUID_GATT_CHARACTERISTIC_SERVICE_CHANGED 0x2A05 /**< Service Changed Characteristic. */ -/* GAP specific UUIDs */ -#define BLE_UUID_GAP 0x1800 /**< Generic Access Profile. */ -#define BLE_UUID_GAP_CHARACTERISTIC_DEVICE_NAME 0x2A00 /**< Device Name Characteristic. */ -#define BLE_UUID_GAP_CHARACTERISTIC_APPEARANCE 0x2A01 /**< Appearance Characteristic. */ -#define BLE_UUID_GAP_CHARACTERISTIC_RECONN_ADDR 0x2A03 /**< Reconnection Address Characteristic. */ -#define BLE_UUID_GAP_CHARACTERISTIC_PPCP 0x2A04 /**< Peripheral Preferred Connection Parameters Characteristic. */ -#define BLE_UUID_GAP_CHARACTERISTIC_CAR 0x2AA6 /**< Central Address Resolution Characteristic. */ -#define BLE_UUID_GAP_CHARACTERISTIC_RPA_ONLY 0x2AC9 /**< Resolvable Private Address Only Characteristic. */ -/** @} */ - - -/** @defgroup BLE_UUID_TYPES Types of UUID - * @{ */ -#define BLE_UUID_TYPE_UNKNOWN 0x00 /**< Invalid UUID type. */ -#define BLE_UUID_TYPE_BLE 0x01 /**< Bluetooth SIG UUID (16-bit). */ -#define BLE_UUID_TYPE_VENDOR_BEGIN 0x02 /**< Vendor UUID types start at this index (128-bit). */ -/** @} */ - - -/** @defgroup BLE_APPEARANCES Bluetooth Appearance values - * @note Retrieved from http://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.gap.appearance.xml - * @{ */ -#define BLE_APPEARANCE_UNKNOWN 0 /**< Unknown. */ -#define BLE_APPEARANCE_GENERIC_PHONE 64 /**< Generic Phone. */ -#define BLE_APPEARANCE_GENERIC_COMPUTER 128 /**< Generic Computer. */ -#define BLE_APPEARANCE_GENERIC_WATCH 192 /**< Generic Watch. */ -#define BLE_APPEARANCE_WATCH_SPORTS_WATCH 193 /**< Watch: Sports Watch. */ -#define BLE_APPEARANCE_GENERIC_CLOCK 256 /**< Generic Clock. */ -#define BLE_APPEARANCE_GENERIC_DISPLAY 320 /**< Generic Display. */ -#define BLE_APPEARANCE_GENERIC_REMOTE_CONTROL 384 /**< Generic Remote Control. */ -#define BLE_APPEARANCE_GENERIC_EYE_GLASSES 448 /**< Generic Eye-glasses. */ -#define BLE_APPEARANCE_GENERIC_TAG 512 /**< Generic Tag. */ -#define BLE_APPEARANCE_GENERIC_KEYRING 576 /**< Generic Keyring. */ -#define BLE_APPEARANCE_GENERIC_MEDIA_PLAYER 640 /**< Generic Media Player. */ -#define BLE_APPEARANCE_GENERIC_BARCODE_SCANNER 704 /**< Generic Barcode Scanner. */ -#define BLE_APPEARANCE_GENERIC_THERMOMETER 768 /**< Generic Thermometer. */ -#define BLE_APPEARANCE_THERMOMETER_EAR 769 /**< Thermometer: Ear. */ -#define BLE_APPEARANCE_GENERIC_HEART_RATE_SENSOR 832 /**< Generic Heart rate Sensor. */ -#define BLE_APPEARANCE_HEART_RATE_SENSOR_HEART_RATE_BELT 833 /**< Heart Rate Sensor: Heart Rate Belt. */ -#define BLE_APPEARANCE_GENERIC_BLOOD_PRESSURE 896 /**< Generic Blood Pressure. */ -#define BLE_APPEARANCE_BLOOD_PRESSURE_ARM 897 /**< Blood Pressure: Arm. */ -#define BLE_APPEARANCE_BLOOD_PRESSURE_WRIST 898 /**< Blood Pressure: Wrist. */ -#define BLE_APPEARANCE_GENERIC_HID 960 /**< Human Interface Device (HID). */ -#define BLE_APPEARANCE_HID_KEYBOARD 961 /**< Keyboard (HID Subtype). */ -#define BLE_APPEARANCE_HID_MOUSE 962 /**< Mouse (HID Subtype). */ -#define BLE_APPEARANCE_HID_JOYSTICK 963 /**< Joystick (HID Subtype). */ -#define BLE_APPEARANCE_HID_GAMEPAD 964 /**< Gamepad (HID Subtype). */ -#define BLE_APPEARANCE_HID_DIGITIZERSUBTYPE 965 /**< Digitizer Tablet (HID Subtype). */ -#define BLE_APPEARANCE_HID_CARD_READER 966 /**< Card Reader (HID Subtype). */ -#define BLE_APPEARANCE_HID_DIGITAL_PEN 967 /**< Digital Pen (HID Subtype). */ -#define BLE_APPEARANCE_HID_BARCODE 968 /**< Barcode Scanner (HID Subtype). */ -#define BLE_APPEARANCE_GENERIC_GLUCOSE_METER 1024 /**< Generic Glucose Meter. */ -#define BLE_APPEARANCE_GENERIC_RUNNING_WALKING_SENSOR 1088 /**< Generic Running Walking Sensor. */ -#define BLE_APPEARANCE_RUNNING_WALKING_SENSOR_IN_SHOE 1089 /**< Running Walking Sensor: In-Shoe. */ -#define BLE_APPEARANCE_RUNNING_WALKING_SENSOR_ON_SHOE 1090 /**< Running Walking Sensor: On-Shoe. */ -#define BLE_APPEARANCE_RUNNING_WALKING_SENSOR_ON_HIP 1091 /**< Running Walking Sensor: On-Hip. */ -#define BLE_APPEARANCE_GENERIC_CYCLING 1152 /**< Generic Cycling. */ -#define BLE_APPEARANCE_CYCLING_CYCLING_COMPUTER 1153 /**< Cycling: Cycling Computer. */ -#define BLE_APPEARANCE_CYCLING_SPEED_SENSOR 1154 /**< Cycling: Speed Sensor. */ -#define BLE_APPEARANCE_CYCLING_CADENCE_SENSOR 1155 /**< Cycling: Cadence Sensor. */ -#define BLE_APPEARANCE_CYCLING_POWER_SENSOR 1156 /**< Cycling: Power Sensor. */ -#define BLE_APPEARANCE_CYCLING_SPEED_CADENCE_SENSOR 1157 /**< Cycling: Speed and Cadence Sensor. */ -#define BLE_APPEARANCE_GENERIC_PULSE_OXIMETER 3136 /**< Generic Pulse Oximeter. */ -#define BLE_APPEARANCE_PULSE_OXIMETER_FINGERTIP 3137 /**< Fingertip (Pulse Oximeter subtype). */ -#define BLE_APPEARANCE_PULSE_OXIMETER_WRIST_WORN 3138 /**< Wrist Worn(Pulse Oximeter subtype). */ -#define BLE_APPEARANCE_GENERIC_WEIGHT_SCALE 3200 /**< Generic Weight Scale. */ -#define BLE_APPEARANCE_GENERIC_OUTDOOR_SPORTS_ACT 5184 /**< Generic Outdoor Sports Activity. */ -#define BLE_APPEARANCE_OUTDOOR_SPORTS_ACT_LOC_DISP 5185 /**< Location Display Device (Outdoor Sports Activity subtype). */ -#define BLE_APPEARANCE_OUTDOOR_SPORTS_ACT_LOC_AND_NAV_DISP 5186 /**< Location and Navigation Display Device (Outdoor Sports Activity subtype). */ -#define BLE_APPEARANCE_OUTDOOR_SPORTS_ACT_LOC_POD 5187 /**< Location Pod (Outdoor Sports Activity subtype). */ -#define BLE_APPEARANCE_OUTDOOR_SPORTS_ACT_LOC_AND_NAV_POD 5188 /**< Location and Navigation Pod (Outdoor Sports Activity subtype). */ -/** @} */ - -/** @brief Set .type and .uuid fields of ble_uuid_struct to specified UUID value. */ -#define BLE_UUID_BLE_ASSIGN(instance, value) do {\ - instance.type = BLE_UUID_TYPE_BLE; \ - instance.uuid = value;} while(0) - -/** @brief Copy type and uuid members from src to dst ble_uuid_t pointer. Both pointers must be valid/non-null. */ -#define BLE_UUID_COPY_PTR(dst, src) do {\ - (dst)->type = (src)->type; \ - (dst)->uuid = (src)->uuid;} while(0) - -/** @brief Copy type and uuid members from src to dst ble_uuid_t struct. */ -#define BLE_UUID_COPY_INST(dst, src) do {\ - (dst).type = (src).type; \ - (dst).uuid = (src).uuid;} while(0) - -/** @brief Compare for equality both type and uuid members of two (valid, non-null) ble_uuid_t pointers. */ -#define BLE_UUID_EQ(p_uuid1, p_uuid2) \ - (((p_uuid1)->type == (p_uuid2)->type) && ((p_uuid1)->uuid == (p_uuid2)->uuid)) - -/** @brief Compare for difference both type and uuid members of two (valid, non-null) ble_uuid_t pointers. */ -#define BLE_UUID_NEQ(p_uuid1, p_uuid2) \ - (((p_uuid1)->type != (p_uuid2)->type) || ((p_uuid1)->uuid != (p_uuid2)->uuid)) - -/** @} */ - -/** @addtogroup BLE_TYPES_STRUCTURES Structures - * @{ */ - -/** @brief 128 bit UUID values. */ -typedef struct -{ - uint8_t uuid128[16]; /**< Little-Endian UUID bytes. */ -} ble_uuid128_t; - -/** @brief Bluetooth Low Energy UUID type, encapsulates both 16-bit and 128-bit UUIDs. */ -typedef struct -{ - uint16_t uuid; /**< 16-bit UUID value or octets 12-13 of 128-bit UUID. */ - uint8_t type; /**< UUID type, see @ref BLE_UUID_TYPES. If type is @ref BLE_UUID_TYPE_UNKNOWN, the value of uuid is undefined. */ -} ble_uuid_t; - -/**@brief Data structure. */ -typedef struct -{ - uint8_t *p_data; /**< Pointer to the data buffer provided to/from the application. */ - uint16_t len; /**< Length of the data buffer, in bytes. */ -} ble_data_t; - -/** @} */ -#ifdef __cplusplus -} -#endif - -#endif /* BLE_TYPES_H__ */ - -/** - @} - @} -*/ diff --git a/lib/nrf52/include/nrf52/nrf_mbr.h b/lib/nrf52/include/nrf52/nrf_mbr.h deleted file mode 100644 index 389cc377..00000000 --- a/lib/nrf52/include/nrf52/nrf_mbr.h +++ /dev/null @@ -1,268 +0,0 @@ -/* - * Copyright (c) 2014 - 2017, Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - @defgroup nrf_mbr_api Master Boot Record API - @{ - - @brief APIs for updating SoftDevice and BootLoader - -*/ - -#ifndef NRF_MBR_H__ -#define NRF_MBR_H__ - -#include "nrf_svc.h" -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** @addtogroup NRF_MBR_DEFINES Defines - * @{ */ - -/**@brief MBR SVC Base number. */ -#define MBR_SVC_BASE (0x18) - -/**@brief Page size in words. */ -#define MBR_PAGE_SIZE_IN_WORDS (1024) - -/** @brief The size that must be reserved for the MBR when a SoftDevice is written to flash. -This is the offset where the first byte of the SoftDevice hex file is written. */ -#define MBR_SIZE (0x1000) - -/** @brief Location (in the flash memory) of the bootloader address. */ -#define MBR_BOOTLOADER_ADDR (0xFF8) - -/** @brief Location (in UICR) of the bootloader address. */ -#define MBR_UICR_BOOTLOADER_ADDR (&(NRF_UICR->NRFFW[0])) - -/** @brief Location (in the flash memory) of the address of the MBR parameter page. */ -#define MBR_PARAM_PAGE_ADDR (0xFFC) - -/** @brief Location (in UICR) of the address of the MBR parameter page. */ -#define MBR_UICR_PARAM_PAGE_ADDR (&(NRF_UICR->NRFFW[1])) - - -/** @} */ - -/** @addtogroup NRF_MBR_ENUMS Enumerations - * @{ */ - -/**@brief nRF Master Boot Record API SVC numbers. */ -enum NRF_MBR_SVCS -{ - SD_MBR_COMMAND = MBR_SVC_BASE, /**< ::sd_mbr_command */ -}; - -/**@brief Possible values for ::sd_mbr_command_t.command */ -enum NRF_MBR_COMMANDS -{ - SD_MBR_COMMAND_COPY_BL, /**< Copy a new BootLoader. @see ::sd_mbr_command_copy_bl_t*/ - SD_MBR_COMMAND_COPY_SD, /**< Copy a new SoftDevice. @see ::sd_mbr_command_copy_sd_t*/ - SD_MBR_COMMAND_INIT_SD, /**< Initialize forwarding interrupts to SD, and run reset function in SD. Does not require any parameters in ::sd_mbr_command_t params.*/ - SD_MBR_COMMAND_COMPARE, /**< This command works like memcmp. @see ::sd_mbr_command_compare_t*/ - SD_MBR_COMMAND_VECTOR_TABLE_BASE_SET, /**< Change the address the MBR starts after a reset. @see ::sd_mbr_command_vector_table_base_set_t*/ - SD_MBR_COMMAND_RESERVED, - SD_MBR_COMMAND_IRQ_FORWARD_ADDRESS_SET, /**< Start forwarding all interrupts to this address. @see ::sd_mbr_command_irq_forward_address_set_t*/ -}; - -/** @} */ - -/** @addtogroup NRF_MBR_TYPES Types - * @{ */ - -/**@brief This command copies part of a new SoftDevice - * - * The destination area is erased before copying. - * If dst is in the middle of a flash page, that whole flash page will be erased. - * If (dst+len) is in the middle of a flash page, that whole flash page will be erased. - * - * The user of this function is responsible for setting the BPROT registers. - * - * @retval ::NRF_SUCCESS indicates that the contents of the memory blocks where copied correctly. - * @retval ::NRF_ERROR_INTERNAL indicates that the contents of the memory blocks where not verified correctly after copying. - */ -typedef struct -{ - uint32_t *src; /**< Pointer to the source of data to be copied.*/ - uint32_t *dst; /**< Pointer to the destination where the content is to be copied.*/ - uint32_t len; /**< Number of 32 bit words to copy. Must be a multiple of @ref MBR_PAGE_SIZE_IN_WORDS words.*/ -} sd_mbr_command_copy_sd_t; - - -/**@brief This command works like memcmp, but takes the length in words. - * - * @retval ::NRF_SUCCESS indicates that the contents of both memory blocks are equal. - * @retval ::NRF_ERROR_NULL indicates that the contents of the memory blocks are not equal. - */ -typedef struct -{ - uint32_t *ptr1; /**< Pointer to block of memory. */ - uint32_t *ptr2; /**< Pointer to block of memory. */ - uint32_t len; /**< Number of 32 bit words to compare.*/ -} sd_mbr_command_compare_t; - - -/**@brief This command copies a new BootLoader. - * - * The MBR assumes that either @ref MBR_BOOTLOADER_ADDR or @ref MBR_UICR_BOOTLOADER_ADDR is set to - * the address where the bootloader will be copied. If both addresses are set, the MBR will prioritize - * @ref MBR_BOOTLOADER_ADDR. - * - * The bootloader destination is erased by this function. - * If (destination+bl_len) is in the middle of a flash page, that whole flash page will be erased. - * - * This command requires that @ref MBR_PARAM_PAGE_ADDR or @ref MBR_UICR_PARAM_PAGE_ADDR is set, - * see @ref sd_mbr_command. - * - * This command will use the flash protect peripheral (BPROT or ACL) to protect the flash that is - * not intended to be written. - * - * On success, this function will not return. It will start the new bootloader from reset-vector as normal. - * - * @retval ::NRF_ERROR_INTERNAL indicates an internal error that should not happen. - * @retval ::NRF_ERROR_FORBIDDEN if the bootloader address is not set. - * @retval ::NRF_ERROR_INVALID_LENGTH if parameters attempts to read or write outside flash area. - * @retval ::NRF_ERROR_NO_MEM No MBR parameter page is provided. See @ref sd_mbr_command. - */ -typedef struct -{ - uint32_t *bl_src; /**< Pointer to the source of the bootloader to be be copied.*/ - uint32_t bl_len; /**< Number of 32 bit words to copy for BootLoader. */ -} sd_mbr_command_copy_bl_t; - -/**@brief Change the address the MBR starts after a reset - * - * Once this function has been called, this address is where the MBR will start to forward - * interrupts to after a reset. - * - * To restore default forwarding, this function should be called with @ref address set to 0. If a - * bootloader is present, interrupts will be forwarded to the bootloader. If not, interrupts will - * be forwarded to the SoftDevice. - * - * The location of a bootloader can be specified in @ref MBR_BOOTLOADER_ADDR or - * @ref MBR_UICR_BOOTLOADER_ADDR. If both addresses are set, the MBR will prioritize - * @ref MBR_BOOTLOADER_ADDR. - * - * This command requires that @ref MBR_PARAM_PAGE_ADDR or @ref MBR_UICR_PARAM_PAGE_ADDR is set, - * see @ref sd_mbr_command. - * - * On success, this function will not return. It will reset the device. - * - * @retval ::NRF_ERROR_INTERNAL indicates an internal error that should not happen. - * @retval ::NRF_ERROR_INVALID_ADDR if parameter address is outside of the flash size. - * @retval ::NRF_ERROR_NO_MEM No MBR parameter page is provided. See @ref sd_mbr_command. - */ -typedef struct -{ - uint32_t address; /**< The base address of the interrupt vector table for forwarded interrupts.*/ -} sd_mbr_command_vector_table_base_set_t; - -/**@brief Sets the base address of the interrupt vector table for interrupts forwarded from the MBR - * - * Unlike sd_mbr_command_vector_table_base_set_t, this function does not reset, and it does not - * change where the MBR starts after reset. - * - * @retval ::NRF_SUCCESS - */ -typedef struct -{ - uint32_t address; /**< The base address of the interrupt vector table for forwarded interrupts.*/ -} sd_mbr_command_irq_forward_address_set_t; - -/**@brief Input structure containing data used when calling ::sd_mbr_command - * - * Depending on what command value that is set, the corresponding params value type must also be - * set. See @ref NRF_MBR_COMMANDS for command types and corresponding params value type. If command - * @ref SD_MBR_COMMAND_INIT_SD is set, it is not necessary to set any values under params. - */ -typedef struct -{ - uint32_t command; /**< Type of command to be issued. See @ref NRF_MBR_COMMANDS. */ - union - { - sd_mbr_command_copy_sd_t copy_sd; /**< Parameters for copy SoftDevice.*/ - sd_mbr_command_compare_t compare; /**< Parameters for verify.*/ - sd_mbr_command_copy_bl_t copy_bl; /**< Parameters for copy BootLoader. Requires parameter page. */ - sd_mbr_command_vector_table_base_set_t base_set; /**< Parameters for vector table base set. Requires parameter page.*/ - sd_mbr_command_irq_forward_address_set_t irq_forward_address_set; /**< Parameters for irq forward address set*/ - } params; /**< Command parameters. */ -} sd_mbr_command_t; - -/** @} */ - -/** @addtogroup NRF_MBR_FUNCTIONS Functions - * @{ */ - -/**@brief Issue Master Boot Record commands - * - * Commands used when updating a SoftDevice and bootloader. - * - * The @ref SD_MBR_COMMAND_COPY_BL and @ref SD_MBR_COMMAND_VECTOR_TABLE_BASE_SET requires - * parameters to be retained by the MBR when resetting the IC. This is done in a separate flash - * page. The location of the flash page should be provided by the application in either - * @ref MBR_PARAM_PAGE_ADDR or @ref MBR_UICR_PARAM_PAGE_ADDR. If both addresses are set, the MBR - * will prioritize @ref MBR_PARAM_PAGE_ADDR. This page will be cleared by the MBR and is used to - * store the command before reset. When an address is specified, the page it refers to must not be - * used by the application. If no address is provided by the application, i.e. both - * @ref MBR_PARAM_PAGE_ADDR and @ref MBR_UICR_PARAM_PAGE_ADDR is 0xFFFFFFFF, MBR commands which use - * flash will be unavailable and return @ref NRF_ERROR_NO_MEM. - * - * @param[in] param Pointer to a struct describing the command. - * - * @note For a complete set of return values, see ::sd_mbr_command_copy_sd_t, - * ::sd_mbr_command_copy_bl_t, ::sd_mbr_command_compare_t, - * ::sd_mbr_command_vector_table_base_set_t, ::sd_mbr_command_irq_forward_address_set_t - * - * @retval ::NRF_ERROR_NO_MEM No MBR parameter page provided - * @retval ::NRF_ERROR_INVALID_PARAM if an invalid command is given. -*/ -SVCALL(SD_MBR_COMMAND, uint32_t, sd_mbr_command(sd_mbr_command_t* param)); - -/** @} */ - -#ifdef __cplusplus -} -#endif -#endif // NRF_MBR_H__ - -/** - @} -*/ diff --git a/lib/nrf52/include/nrf_error.h b/lib/nrf52/include/nrf_error.h deleted file mode 100644 index 6badee98..00000000 --- a/lib/nrf52/include/nrf_error.h +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (c) 2014 - 2017, Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - - /** - @defgroup nrf_error SoftDevice Global Error Codes - @{ - - @brief Global Error definitions -*/ - -/* Header guard */ -#ifndef NRF_ERROR_H__ -#define NRF_ERROR_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/** @defgroup NRF_ERRORS_BASE Error Codes Base number definitions - * @{ */ -#define NRF_ERROR_BASE_NUM (0x0) ///< Global error base -#define NRF_ERROR_SDM_BASE_NUM (0x1000) ///< SDM error base -#define NRF_ERROR_SOC_BASE_NUM (0x2000) ///< SoC error base -#define NRF_ERROR_STK_BASE_NUM (0x3000) ///< STK error base -/** @} */ - -#define NRF_SUCCESS (NRF_ERROR_BASE_NUM + 0) ///< Successful command -#define NRF_ERROR_SVC_HANDLER_MISSING (NRF_ERROR_BASE_NUM + 1) ///< SVC handler is missing -#define NRF_ERROR_SOFTDEVICE_NOT_ENABLED (NRF_ERROR_BASE_NUM + 2) ///< SoftDevice has not been enabled -#define NRF_ERROR_INTERNAL (NRF_ERROR_BASE_NUM + 3) ///< Internal Error -#define NRF_ERROR_NO_MEM (NRF_ERROR_BASE_NUM + 4) ///< No Memory for operation -#define NRF_ERROR_NOT_FOUND (NRF_ERROR_BASE_NUM + 5) ///< Not found -#define NRF_ERROR_NOT_SUPPORTED (NRF_ERROR_BASE_NUM + 6) ///< Not supported -#define NRF_ERROR_INVALID_PARAM (NRF_ERROR_BASE_NUM + 7) ///< Invalid Parameter -#define NRF_ERROR_INVALID_STATE (NRF_ERROR_BASE_NUM + 8) ///< Invalid state, operation disallowed in this state -#define NRF_ERROR_INVALID_LENGTH (NRF_ERROR_BASE_NUM + 9) ///< Invalid Length -#define NRF_ERROR_INVALID_FLAGS (NRF_ERROR_BASE_NUM + 10) ///< Invalid Flags -#define NRF_ERROR_INVALID_DATA (NRF_ERROR_BASE_NUM + 11) ///< Invalid Data -#define NRF_ERROR_DATA_SIZE (NRF_ERROR_BASE_NUM + 12) ///< Invalid Data size -#define NRF_ERROR_TIMEOUT (NRF_ERROR_BASE_NUM + 13) ///< Operation timed out -#define NRF_ERROR_NULL (NRF_ERROR_BASE_NUM + 14) ///< Null Pointer -#define NRF_ERROR_FORBIDDEN (NRF_ERROR_BASE_NUM + 15) ///< Forbidden Operation -#define NRF_ERROR_INVALID_ADDR (NRF_ERROR_BASE_NUM + 16) ///< Bad Memory Address -#define NRF_ERROR_BUSY (NRF_ERROR_BASE_NUM + 17) ///< Busy -#define NRF_ERROR_CONN_COUNT (NRF_ERROR_BASE_NUM + 18) ///< Maximum connection count exceeded. -#define NRF_ERROR_RESOURCES (NRF_ERROR_BASE_NUM + 19) ///< Not enough resources for operation - -#ifdef __cplusplus -} -#endif -#endif // NRF_ERROR_H__ - -/** - @} -*/ diff --git a/lib/nrf52/include/nrf_error_sdm.h b/lib/nrf52/include/nrf_error_sdm.h deleted file mode 100644 index 530959b9..00000000 --- a/lib/nrf52/include/nrf_error_sdm.h +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - - /** - @addtogroup nrf_sdm_api - @{ - @defgroup nrf_sdm_error SoftDevice Manager Error Codes - @{ - - @brief Error definitions for the SDM API -*/ - -/* Header guard */ -#ifndef NRF_ERROR_SDM_H__ -#define NRF_ERROR_SDM_H__ - -#include "nrf_error.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define NRF_ERROR_SDM_LFCLK_SOURCE_UNKNOWN (NRF_ERROR_SDM_BASE_NUM + 0) ///< Unknown LFCLK source. -#define NRF_ERROR_SDM_INCORRECT_INTERRUPT_CONFIGURATION (NRF_ERROR_SDM_BASE_NUM + 1) ///< Incorrect interrupt configuration (can be caused by using illegal priority levels, or having enabled SoftDevice interrupts). -#define NRF_ERROR_SDM_INCORRECT_CLENR0 (NRF_ERROR_SDM_BASE_NUM + 2) ///< Incorrect CLENR0 (can be caused by erroneous SoftDevice flashing). - -#ifdef __cplusplus -} -#endif -#endif // NRF_ERROR_SDM_H__ - -/** - @} - @} -*/ diff --git a/lib/nrf52/include/nrf_error_soc.h b/lib/nrf52/include/nrf_error_soc.h deleted file mode 100644 index 1e784b8d..00000000 --- a/lib/nrf52/include/nrf_error_soc.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - @addtogroup nrf_soc_api - @{ - @defgroup nrf_soc_error SoC Library Error Codes - @{ - - @brief Error definitions for the SoC library - -*/ - -/* Header guard */ -#ifndef NRF_ERROR_SOC_H__ -#define NRF_ERROR_SOC_H__ - -#include "nrf_error.h" -#ifdef __cplusplus -extern "C" { -#endif - -/* Mutex Errors */ -#define NRF_ERROR_SOC_MUTEX_ALREADY_TAKEN (NRF_ERROR_SOC_BASE_NUM + 0) ///< Mutex already taken - -/* NVIC errors */ -#define NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE (NRF_ERROR_SOC_BASE_NUM + 1) ///< NVIC interrupt not available -#define NRF_ERROR_SOC_NVIC_INTERRUPT_PRIORITY_NOT_ALLOWED (NRF_ERROR_SOC_BASE_NUM + 2) ///< NVIC interrupt priority not allowed -#define NRF_ERROR_SOC_NVIC_SHOULD_NOT_RETURN (NRF_ERROR_SOC_BASE_NUM + 3) ///< NVIC should not return - -/* Power errors */ -#define NRF_ERROR_SOC_POWER_MODE_UNKNOWN (NRF_ERROR_SOC_BASE_NUM + 4) ///< Power mode unknown -#define NRF_ERROR_SOC_POWER_POF_THRESHOLD_UNKNOWN (NRF_ERROR_SOC_BASE_NUM + 5) ///< Power POF threshold unknown -#define NRF_ERROR_SOC_POWER_OFF_SHOULD_NOT_RETURN (NRF_ERROR_SOC_BASE_NUM + 6) ///< Power off should not return - -/* Rand errors */ -#define NRF_ERROR_SOC_RAND_NOT_ENOUGH_VALUES (NRF_ERROR_SOC_BASE_NUM + 7) ///< RAND not enough values - -/* PPI errors */ -#define NRF_ERROR_SOC_PPI_INVALID_CHANNEL (NRF_ERROR_SOC_BASE_NUM + 8) ///< Invalid PPI Channel -#define NRF_ERROR_SOC_PPI_INVALID_GROUP (NRF_ERROR_SOC_BASE_NUM + 9) ///< Invalid PPI Group - -#ifdef __cplusplus -} -#endif -#endif // NRF_ERROR_SOC_H__ -/** - @} - @} -*/ diff --git a/lib/nrf52/include/nrf_nvic.h b/lib/nrf52/include/nrf_nvic.h deleted file mode 100644 index 1f79cc3c..00000000 --- a/lib/nrf52/include/nrf_nvic.h +++ /dev/null @@ -1,491 +0,0 @@ -/* - * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * @defgroup nrf_nvic_api SoftDevice NVIC API - * @{ - * - * @note In order to use this module, the following code has to be added to a .c file: - * \code - * nrf_nvic_state_t nrf_nvic_state = {0}; - * \endcode - * - * @note Definitions and declarations starting with __ (double underscore) in this header file are - * not intended for direct use by the application. - * - * @brief APIs for the accessing NVIC when using a SoftDevice. - * - */ - -#ifndef NRF_NVIC_H__ -#define NRF_NVIC_H__ - -#include -#include "nrf.h" -#include "nrf_svc.h" -#include "nrf_error.h" -#include "nrf_error_soc.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/**@addtogroup NRF_NVIC_DEFINES Defines - * @{ */ - -/**@defgroup NRF_NVIC_ISER_DEFINES SoftDevice NVIC internal definitions - * @{ */ - -#define __NRF_NVIC_NVMC_IRQn (30) /**< The peripheral ID of the NVMC. IRQ numbers are used to identify peripherals, but the NVMC doesn't have an IRQ number in the MDK. */ - -#define __NRF_NVIC_ISER_COUNT (2) /**< The number of ISER/ICER registers in the NVIC that are used. */ - -/**@brief Interrupt priority levels used by the SoftDevice. */ -#define __NRF_NVIC_SD_IRQ_PRIOS ((uint8_t)( \ - (1U << 0) /**< Priority level high .*/ \ - | (1U << 1) /**< Priority level medium. */ \ - | (1U << 4) /**< Priority level low. */ \ - )) - -/**@brief Interrupt priority levels available to the application. */ -#define __NRF_NVIC_APP_IRQ_PRIOS ((uint8_t)~__NRF_NVIC_SD_IRQ_PRIOS) - -/**@brief Interrupts used by the SoftDevice, with IRQn in the range 0-31. */ -#define __NRF_NVIC_SD_IRQS_0 ((uint32_t)( \ - (1U << POWER_CLOCK_IRQn) \ - | (1U << RADIO_IRQn) \ - | (1U << RTC0_IRQn) \ - | (1U << TIMER0_IRQn) \ - | (1U << RNG_IRQn) \ - | (1U << ECB_IRQn) \ - | (1U << CCM_AAR_IRQn) \ - | (1U << TEMP_IRQn) \ - | (1U << __NRF_NVIC_NVMC_IRQn) \ - | (1U << (uint32_t)SWI5_IRQn) \ - )) - -/**@brief Interrupts used by the SoftDevice, with IRQn in the range 32-63. */ -#define __NRF_NVIC_SD_IRQS_1 ((uint32_t)0) - -/**@brief Interrupts available for to application, with IRQn in the range 0-31. */ -#define __NRF_NVIC_APP_IRQS_0 (~__NRF_NVIC_SD_IRQS_0) - -/**@brief Interrupts available for to application, with IRQn in the range 32-63. */ -#define __NRF_NVIC_APP_IRQS_1 (~__NRF_NVIC_SD_IRQS_1) - -/**@} */ - -/**@} */ - -/**@addtogroup NRF_NVIC_VARIABLES Variables - * @{ */ - -/**@brief Type representing the state struct for the SoftDevice NVIC module. */ -typedef struct -{ - uint32_t volatile __irq_masks[__NRF_NVIC_ISER_COUNT]; /**< IRQs enabled by the application in the NVIC. */ - uint32_t volatile __cr_flag; /**< Non-zero if already in a critical region */ -} nrf_nvic_state_t; - -/**@brief Variable keeping the state for the SoftDevice NVIC module. This must be declared in an - * application source file. */ -extern nrf_nvic_state_t nrf_nvic_state; - -/**@} */ - -/**@addtogroup NRF_NVIC_INTERNAL_FUNCTIONS SoftDevice NVIC internal functions - * @{ */ - -/**@brief Disables IRQ interrupts globally, including the SoftDevice's interrupts. - * - * @retval The value of PRIMASK prior to disabling the interrupts. - */ -__STATIC_INLINE int __sd_nvic_irq_disable(void); - -/**@brief Enables IRQ interrupts globally, including the SoftDevice's interrupts. - */ -__STATIC_INLINE void __sd_nvic_irq_enable(void); - -/**@brief Checks if IRQn is available to application - * @param[in] IRQn IRQ to check - * - * @retval 1 (true) if the IRQ to check is available to the application - */ -__STATIC_INLINE uint32_t __sd_nvic_app_accessible_irq(IRQn_Type IRQn); - -/**@brief Checks if priority is available to application - * @param[in] priority priority to check - * - * @retval 1 (true) if the priority to check is available to the application - */ -__STATIC_INLINE uint32_t __sd_nvic_is_app_accessible_priority(uint32_t priority); - -/**@} */ - -/**@addtogroup NRF_NVIC_FUNCTIONS SoftDevice NVIC public functions - * @{ */ - -/**@brief Enable External Interrupt. - * @note Corresponds to NVIC_EnableIRQ in CMSIS. - * - * @pre IRQn is valid and not reserved by the stack. - * - * @param[in] IRQn See the NVIC_EnableIRQ documentation in CMSIS. - * - * @retval ::NRF_SUCCESS The interrupt was enabled. - * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE The interrupt is not available for the application. - * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_PRIORITY_NOT_ALLOWED The interrupt has a priority not available for the application. - */ -__STATIC_INLINE uint32_t sd_nvic_EnableIRQ(IRQn_Type IRQn); - -/**@brief Disable External Interrupt. - * @note Corresponds to NVIC_DisableIRQ in CMSIS. - * - * @pre IRQn is valid and not reserved by the stack. - * - * @param[in] IRQn See the NVIC_DisableIRQ documentation in CMSIS. - * - * @retval ::NRF_SUCCESS The interrupt was disabled. - * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE The interrupt is not available for the application. - */ -__STATIC_INLINE uint32_t sd_nvic_DisableIRQ(IRQn_Type IRQn); - -/**@brief Get Pending Interrupt. - * @note Corresponds to NVIC_GetPendingIRQ in CMSIS. - * - * @pre IRQn is valid and not reserved by the stack. - * - * @param[in] IRQn See the NVIC_GetPendingIRQ documentation in CMSIS. - * @param[out] p_pending_irq Return value from NVIC_GetPendingIRQ. - * - * @retval ::NRF_SUCCESS The interrupt is available for the application. - * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE IRQn is not available for the application. - */ -__STATIC_INLINE uint32_t sd_nvic_GetPendingIRQ(IRQn_Type IRQn, uint32_t * p_pending_irq); - -/**@brief Set Pending Interrupt. - * @note Corresponds to NVIC_SetPendingIRQ in CMSIS. - * - * @pre IRQn is valid and not reserved by the stack. - * - * @param[in] IRQn See the NVIC_SetPendingIRQ documentation in CMSIS. - * - * @retval ::NRF_SUCCESS The interrupt is set pending. - * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE IRQn is not available for the application. - */ -__STATIC_INLINE uint32_t sd_nvic_SetPendingIRQ(IRQn_Type IRQn); - -/**@brief Clear Pending Interrupt. - * @note Corresponds to NVIC_ClearPendingIRQ in CMSIS. - * - * @pre IRQn is valid and not reserved by the stack. - * - * @param[in] IRQn See the NVIC_ClearPendingIRQ documentation in CMSIS. - * - * @retval ::NRF_SUCCESS The interrupt pending flag is cleared. - * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE IRQn is not available for the application. - */ -__STATIC_INLINE uint32_t sd_nvic_ClearPendingIRQ(IRQn_Type IRQn); - -/**@brief Set Interrupt Priority. - * @note Corresponds to NVIC_SetPriority in CMSIS. - * - * @pre IRQn is valid and not reserved by the stack. - * @pre Priority is valid and not reserved by the stack. - * - * @param[in] IRQn See the NVIC_SetPriority documentation in CMSIS. - * @param[in] priority A valid IRQ priority for use by the application. - * - * @retval ::NRF_SUCCESS The interrupt and priority level is available for the application. - * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE IRQn is not available for the application. - * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_PRIORITY_NOT_ALLOWED The interrupt priority is not available for the application. - */ -__STATIC_INLINE uint32_t sd_nvic_SetPriority(IRQn_Type IRQn, uint32_t priority); - -/**@brief Get Interrupt Priority. - * @note Corresponds to NVIC_GetPriority in CMSIS. - * - * @pre IRQn is valid and not reserved by the stack. - * - * @param[in] IRQn See the NVIC_GetPriority documentation in CMSIS. - * @param[out] p_priority Return value from NVIC_GetPriority. - * - * @retval ::NRF_SUCCESS The interrupt priority is returned in p_priority. - * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE - IRQn is not available for the application. - */ -__STATIC_INLINE uint32_t sd_nvic_GetPriority(IRQn_Type IRQn, uint32_t * p_priority); - -/**@brief System Reset. - * @note Corresponds to NVIC_SystemReset in CMSIS. - * - * @retval ::NRF_ERROR_SOC_NVIC_SHOULD_NOT_RETURN - */ -__STATIC_INLINE uint32_t sd_nvic_SystemReset(void); - -/**@brief Enter critical region. - * - * @post Application interrupts will be disabled. - * @note sd_nvic_critical_region_enter() and ::sd_nvic_critical_region_exit() must be called in matching pairs inside each - * execution context - * @sa sd_nvic_critical_region_exit - * - * @param[out] p_is_nested_critical_region If 1, the application is now in a nested critical region. - * - * @retval ::NRF_SUCCESS - */ -__STATIC_INLINE uint32_t sd_nvic_critical_region_enter(uint8_t * p_is_nested_critical_region); - -/**@brief Exit critical region. - * - * @pre Application has entered a critical region using ::sd_nvic_critical_region_enter. - * @post If not in a nested critical region, the application interrupts will restored to the state before ::sd_nvic_critical_region_enter was called. - * - * @param[in] is_nested_critical_region If this is set to 1, the critical region won't be exited. @sa sd_nvic_critical_region_enter. - * - * @retval ::NRF_SUCCESS - */ -__STATIC_INLINE uint32_t sd_nvic_critical_region_exit(uint8_t is_nested_critical_region); - -/**@} */ - -#ifndef SUPPRESS_INLINE_IMPLEMENTATION - -__STATIC_INLINE int __sd_nvic_irq_disable(void) -{ - int pm = __get_PRIMASK(); - __disable_irq(); - return pm; -} - -__STATIC_INLINE void __sd_nvic_irq_enable(void) -{ - __enable_irq(); -} - -__STATIC_INLINE uint32_t __sd_nvic_app_accessible_irq(IRQn_Type IRQn) -{ - if (IRQn < 32) - { - return ((1UL<= (1 << __NVIC_PRIO_BITS)) - || (((1 << priority) & __NRF_NVIC_APP_IRQ_PRIOS) == 0) - ) - { - return 0; - } - return 1; -} - - -__STATIC_INLINE uint32_t sd_nvic_EnableIRQ(IRQn_Type IRQn) -{ - if (!__sd_nvic_app_accessible_irq(IRQn)) - { - return NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE; - } - if (!__sd_nvic_is_app_accessible_priority(NVIC_GetPriority(IRQn))) - { - return NRF_ERROR_SOC_NVIC_INTERRUPT_PRIORITY_NOT_ALLOWED; - } - - if (nrf_nvic_state.__cr_flag) - { - nrf_nvic_state.__irq_masks[(uint32_t)((int32_t)IRQn) >> 5] |= (uint32_t)(1 << ((uint32_t)((int32_t)IRQn) & (uint32_t)0x1F)); - } - else - { - NVIC_EnableIRQ(IRQn); - } - return NRF_SUCCESS; -} - -__STATIC_INLINE uint32_t sd_nvic_DisableIRQ(IRQn_Type IRQn) -{ - if (!__sd_nvic_app_accessible_irq(IRQn)) - { - return NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE; - } - - if (nrf_nvic_state.__cr_flag) - { - nrf_nvic_state.__irq_masks[(uint32_t)((int32_t)IRQn) >> 5] &= ~(1UL << ((uint32_t)(IRQn) & 0x1F)); - } - else - { - NVIC_DisableIRQ(IRQn); - } - - return NRF_SUCCESS; -} - -__STATIC_INLINE uint32_t sd_nvic_GetPendingIRQ(IRQn_Type IRQn, uint32_t * p_pending_irq) -{ - if (__sd_nvic_app_accessible_irq(IRQn)) - { - *p_pending_irq = NVIC_GetPendingIRQ(IRQn); - return NRF_SUCCESS; - } - else - { - return NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE; - } -} - -__STATIC_INLINE uint32_t sd_nvic_SetPendingIRQ(IRQn_Type IRQn) -{ - if (__sd_nvic_app_accessible_irq(IRQn)) - { - NVIC_SetPendingIRQ(IRQn); - return NRF_SUCCESS; - } - else - { - return NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE; - } -} - -__STATIC_INLINE uint32_t sd_nvic_ClearPendingIRQ(IRQn_Type IRQn) -{ - if (__sd_nvic_app_accessible_irq(IRQn)) - { - NVIC_ClearPendingIRQ(IRQn); - return NRF_SUCCESS; - } - else - { - return NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE; - } -} - -__STATIC_INLINE uint32_t sd_nvic_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if (!__sd_nvic_app_accessible_irq(IRQn)) - { - return NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE; - } - - if (!__sd_nvic_is_app_accessible_priority(priority)) - { - return NRF_ERROR_SOC_NVIC_INTERRUPT_PRIORITY_NOT_ALLOWED; - } - - NVIC_SetPriority(IRQn, (uint32_t)priority); - return NRF_SUCCESS; -} - -__STATIC_INLINE uint32_t sd_nvic_GetPriority(IRQn_Type IRQn, uint32_t * p_priority) -{ - if (__sd_nvic_app_accessible_irq(IRQn)) - { - *p_priority = (NVIC_GetPriority(IRQn) & 0xFF); - return NRF_SUCCESS; - } - else - { - return NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE; - } -} - -__STATIC_INLINE uint32_t sd_nvic_SystemReset(void) -{ - NVIC_SystemReset(); - return NRF_ERROR_SOC_NVIC_SHOULD_NOT_RETURN; -} - -__STATIC_INLINE uint32_t sd_nvic_critical_region_enter(uint8_t * p_is_nested_critical_region) -{ - int was_masked = __sd_nvic_irq_disable(); - if (!nrf_nvic_state.__cr_flag) - { - nrf_nvic_state.__cr_flag = 1; - nrf_nvic_state.__irq_masks[0] = ( NVIC->ICER[0] & __NRF_NVIC_APP_IRQS_0 ); - NVIC->ICER[0] = __NRF_NVIC_APP_IRQS_0; - nrf_nvic_state.__irq_masks[1] = ( NVIC->ICER[1] & __NRF_NVIC_APP_IRQS_1 ); - NVIC->ICER[1] = __NRF_NVIC_APP_IRQS_1; - *p_is_nested_critical_region = 0; - } - else - { - *p_is_nested_critical_region = 1; - } - if (!was_masked) - { - __sd_nvic_irq_enable(); - } - return NRF_SUCCESS; -} - -__STATIC_INLINE uint32_t sd_nvic_critical_region_exit(uint8_t is_nested_critical_region) -{ - if (nrf_nvic_state.__cr_flag && (is_nested_critical_region == 0)) - { - int was_masked = __sd_nvic_irq_disable(); - NVIC->ISER[0] = nrf_nvic_state.__irq_masks[0]; - NVIC->ISER[1] = nrf_nvic_state.__irq_masks[1]; - nrf_nvic_state.__cr_flag = 0; - if (!was_masked) - { - __sd_nvic_irq_enable(); - } - } - - return NRF_SUCCESS; -} - -#endif /* SUPPRESS_INLINE_IMPLEMENTATION */ - -#ifdef __cplusplus -} -#endif - -#endif // NRF_NVIC_H__ - -/**@} */ diff --git a/lib/nrf52/include/nrf_sdm.h b/lib/nrf52/include/nrf_sdm.h deleted file mode 100644 index 5dfbb287..00000000 --- a/lib/nrf52/include/nrf_sdm.h +++ /dev/null @@ -1,367 +0,0 @@ -/* - * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - @defgroup nrf_sdm_api SoftDevice Manager API - @{ - - @brief APIs for SoftDevice management. - -*/ - -#ifndef NRF_SDM_H__ -#define NRF_SDM_H__ - -#include -#include "nrf.h" -#include "nrf_svc.h" -#include "nrf_error.h" -#include "nrf_error_sdm.h" -#include "nrf_soc.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** @addtogroup NRF_SDM_DEFINES Defines - * @{ */ -#ifdef NRFSOC_DOXYGEN -/// Declared in nrf_mbr.h -#define MBR_SIZE 0 -#warning test -#endif - -/** @brief The major version for the SoftDevice binary distributed with this header file. */ -#define SD_MAJOR_VERSION (6) - -/** @brief The minor version for the SoftDevice binary distributed with this header file. */ -#define SD_MINOR_VERSION (1) - -/** @brief The bugfix version for the SoftDevice binary distributed with this header file. */ -#define SD_BUGFIX_VERSION (1) - -/** @brief The SoftDevice variant of this firmware. */ -#define SD_VARIANT_ID 140 - -/** @brief The full version number for the SoftDevice binary this header file was distributed - * with, as a decimal number in the form Mmmmbbb, where: - * - M is major version (one or more digits) - * - mmm is minor version (three digits) - * - bbb is bugfix version (three digits). */ -#define SD_VERSION (SD_MAJOR_VERSION * 1000000 + SD_MINOR_VERSION * 1000 + SD_BUGFIX_VERSION) - -/** @brief SoftDevice Manager SVC Base number. */ -#define SDM_SVC_BASE 0x10 - -/** @brief SoftDevice unique string size in bytes. */ -#define SD_UNIQUE_STR_SIZE 20 - -/** @brief Invalid info field. Returned when an info field does not exist. */ -#define SDM_INFO_FIELD_INVALID (0) - -/** @brief Defines the SoftDevice Information Structure location (address) as an offset from -the start of the SoftDevice (without MBR)*/ -#define SOFTDEVICE_INFO_STRUCT_OFFSET (0x2000) - -/** @brief Defines the absolute SoftDevice Information Structure location (address) when the - * SoftDevice is installed just above the MBR (the usual case). */ -#define SOFTDEVICE_INFO_STRUCT_ADDRESS (SOFTDEVICE_INFO_STRUCT_OFFSET + MBR_SIZE) - -/** @brief Defines the offset for the SoftDevice Information Structure size value relative to the - * SoftDevice base address. The size value is of type uint8_t. */ -#define SD_INFO_STRUCT_SIZE_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET) - -/** @brief Defines the offset for the SoftDevice size value relative to the SoftDevice base address. - * The size value is of type uint32_t. */ -#define SD_SIZE_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET + 0x08) - -/** @brief Defines the offset for FWID value relative to the SoftDevice base address. The FWID value - * is of type uint16_t. */ -#define SD_FWID_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET + 0x0C) - -/** @brief Defines the offset for the SoftDevice ID relative to the SoftDevice base address. The ID - * is of type uint32_t. */ -#define SD_ID_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET + 0x10) - -/** @brief Defines the offset for the SoftDevice version relative to the SoftDevice base address in - * the same format as @ref SD_VERSION, stored as an uint32_t. */ -#define SD_VERSION_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET + 0x14) - -/** @brief Defines the offset for the SoftDevice unique string relative to the SoftDevice base address. - * The SD_UNIQUE_STR is stored as an array of uint8_t. The size of array is @ref SD_UNIQUE_STR_SIZE. - */ -#define SD_UNIQUE_STR_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET + 0x18) - -/** @brief Defines a macro for retrieving the actual SoftDevice Information Structure size value - * from a given base address. Use @ref MBR_SIZE as the argument when the SoftDevice is - * installed just above the MBR (the usual case). */ -#define SD_INFO_STRUCT_SIZE_GET(baseaddr) (*((uint8_t *) ((baseaddr) + SD_INFO_STRUCT_SIZE_OFFSET))) - -/** @brief Defines a macro for retrieving the actual SoftDevice size value from a given base - * address. Use @ref MBR_SIZE as the argument when the SoftDevice is installed just above - * the MBR (the usual case). */ -#define SD_SIZE_GET(baseaddr) (*((uint32_t *) ((baseaddr) + SD_SIZE_OFFSET))) - -/** @brief Defines the amount of flash that is used by the SoftDevice. - * Add @ref MBR_SIZE to find the first available flash address when the SoftDevice is installed - * just above the MBR (the usual case). - */ -#define SD_FLASH_SIZE 0x25000 - -/** @brief Defines a macro for retrieving the actual FWID value from a given base address. Use - * @ref MBR_SIZE as the argument when the SoftDevice is installed just above the MBR (the usual - * case). */ -#define SD_FWID_GET(baseaddr) (*((uint16_t *) ((baseaddr) + SD_FWID_OFFSET))) - -/** @brief Defines a macro for retrieving the actual SoftDevice ID from a given base address. Use - * @ref MBR_SIZE as the argument when the SoftDevice is installed just above the MBR (the - * usual case). */ -#define SD_ID_GET(baseaddr) ((SD_INFO_STRUCT_SIZE_GET(baseaddr) > (SD_ID_OFFSET - SOFTDEVICE_INFO_STRUCT_OFFSET)) \ - ? (*((uint32_t *) ((baseaddr) + SD_ID_OFFSET))) : SDM_INFO_FIELD_INVALID) - -/** @brief Defines a macro for retrieving the actual SoftDevice version from a given base address. - * Use @ref MBR_SIZE as the argument when the SoftDevice is installed just above the MBR - * (the usual case). */ -#define SD_VERSION_GET(baseaddr) ((SD_INFO_STRUCT_SIZE_GET(baseaddr) > (SD_VERSION_OFFSET - SOFTDEVICE_INFO_STRUCT_OFFSET)) \ - ? (*((uint32_t *) ((baseaddr) + SD_VERSION_OFFSET))) : SDM_INFO_FIELD_INVALID) - -/** @brief Defines a macro for retrieving the address of SoftDevice unique str based on a given base address. - * Use @ref MBR_SIZE as the argument when the SoftDevice is installed just above the MBR - * (the usual case). */ -#define SD_UNIQUE_STR_ADDR_GET(baseaddr) ((SD_INFO_STRUCT_SIZE_GET(baseaddr) > (SD_UNIQUE_STR_OFFSET - SOFTDEVICE_INFO_STRUCT_OFFSET)) \ - ? (((uint8_t *) ((baseaddr) + SD_UNIQUE_STR_OFFSET))) : SDM_INFO_FIELD_INVALID) - -/**@defgroup NRF_FAULT_ID_RANGES Fault ID ranges - * @{ */ -#define NRF_FAULT_ID_SD_RANGE_START 0x00000000 /**< SoftDevice ID range start. */ -#define NRF_FAULT_ID_APP_RANGE_START 0x00001000 /**< Application ID range start. */ -/**@} */ - -/**@defgroup NRF_FAULT_IDS Fault ID types - * @{ */ -#define NRF_FAULT_ID_SD_ASSERT (NRF_FAULT_ID_SD_RANGE_START + 1) /**< SoftDevice assertion. The info parameter is reserved for future used. */ -#define NRF_FAULT_ID_APP_MEMACC (NRF_FAULT_ID_APP_RANGE_START + 1) /**< Application invalid memory access. The info parameter will contain 0x00000000, - in case of SoftDevice RAM access violation. In case of SoftDevice peripheral - register violation the info parameter will contain the sub-region number of - PREGION[0], on whose address range the disallowed write access caused the - memory access fault. */ -/**@} */ - -/** @} */ - -/** @addtogroup NRF_SDM_ENUMS Enumerations - * @{ */ - -/**@brief nRF SoftDevice Manager API SVC numbers. */ -enum NRF_SD_SVCS -{ - SD_SOFTDEVICE_ENABLE = SDM_SVC_BASE, /**< ::sd_softdevice_enable */ - SD_SOFTDEVICE_DISABLE, /**< ::sd_softdevice_disable */ - SD_SOFTDEVICE_IS_ENABLED, /**< ::sd_softdevice_is_enabled */ - SD_SOFTDEVICE_VECTOR_TABLE_BASE_SET, /**< ::sd_softdevice_vector_table_base_set */ - SVC_SDM_LAST /**< Placeholder for last SDM SVC */ -}; - -/** @} */ - -/** @addtogroup NRF_SDM_DEFINES Defines - * @{ */ - -/**@defgroup NRF_CLOCK_LF_ACCURACY Clock accuracy - * @{ */ - -#define NRF_CLOCK_LF_ACCURACY_250_PPM (0) /**< Default: 250 ppm */ -#define NRF_CLOCK_LF_ACCURACY_500_PPM (1) /**< 500 ppm */ -#define NRF_CLOCK_LF_ACCURACY_150_PPM (2) /**< 150 ppm */ -#define NRF_CLOCK_LF_ACCURACY_100_PPM (3) /**< 100 ppm */ -#define NRF_CLOCK_LF_ACCURACY_75_PPM (4) /**< 75 ppm */ -#define NRF_CLOCK_LF_ACCURACY_50_PPM (5) /**< 50 ppm */ -#define NRF_CLOCK_LF_ACCURACY_30_PPM (6) /**< 30 ppm */ -#define NRF_CLOCK_LF_ACCURACY_20_PPM (7) /**< 20 ppm */ -#define NRF_CLOCK_LF_ACCURACY_10_PPM (8) /**< 10 ppm */ -#define NRF_CLOCK_LF_ACCURACY_5_PPM (9) /**< 5 ppm */ -#define NRF_CLOCK_LF_ACCURACY_2_PPM (10) /**< 2 ppm */ -#define NRF_CLOCK_LF_ACCURACY_1_PPM (11) /**< 1 ppm */ - -/** @} */ - -/**@defgroup NRF_CLOCK_LF_SRC Possible LFCLK oscillator sources - * @{ */ - -#define NRF_CLOCK_LF_SRC_RC (0) /**< LFCLK RC oscillator. */ -#define NRF_CLOCK_LF_SRC_XTAL (1) /**< LFCLK crystal oscillator. */ -#define NRF_CLOCK_LF_SRC_SYNTH (2) /**< LFCLK Synthesized from HFCLK. */ - -/** @} */ - -/** @} */ - -/** @addtogroup NRF_SDM_TYPES Types - * @{ */ - -/**@brief Type representing LFCLK oscillator source. */ -typedef struct -{ - uint8_t source; /**< LF oscillator clock source, see @ref NRF_CLOCK_LF_SRC. */ - uint8_t rc_ctiv; /**< Only for ::NRF_CLOCK_LF_SRC_RC: Calibration timer interval in 1/4 second - units (nRF52: 1-32). - @note To avoid excessive clock drift, 0.5 degrees Celsius is the - maximum temperature change allowed in one calibration timer - interval. The interval should be selected to ensure this. - - @note Must be 0 if source is not ::NRF_CLOCK_LF_SRC_RC. */ - uint8_t rc_temp_ctiv; /**< Only for ::NRF_CLOCK_LF_SRC_RC: How often (in number of calibration - intervals) the RC oscillator shall be calibrated if the temperature - hasn't changed. - 0: Always calibrate even if the temperature hasn't changed. - 1: Only calibrate if the temperature has changed (legacy - nRF51 only). - 2-33: Check the temperature and only calibrate if it has changed, - however calibration will take place every rc_temp_ctiv - intervals in any case. - - @note Must be 0 if source is not ::NRF_CLOCK_LF_SRC_RC. - - @note For nRF52, the application must ensure calibration at least once - every 8 seconds to ensure +/-500 ppm clock stability. The - recommended configuration for ::NRF_CLOCK_LF_SRC_RC on nRF52 is - rc_ctiv=16 and rc_temp_ctiv=2. This will ensure calibration at - least once every 8 seconds and for temperature changes of 0.5 - degrees Celsius every 4 seconds. See the Product Specification - for the nRF52 device being used for more information.*/ - uint8_t accuracy; /**< External clock accuracy used in the LL to compute timing - windows, see @ref NRF_CLOCK_LF_ACCURACY.*/ -} nrf_clock_lf_cfg_t; - -/**@brief Fault Handler type. - * - * When certain unrecoverable errors occur within the application or SoftDevice the fault handler will be called back. - * The protocol stack will be in an undefined state when this happens and the only way to recover will be to - * perform a reset, using e.g. CMSIS NVIC_SystemReset(). - * If the application returns from the fault handler the SoftDevice will call NVIC_SystemReset(). - * - * @note This callback is executed in HardFault context, thus SVC functions cannot be called from the fault callback. - * - * @param[in] id Fault identifier. See @ref NRF_FAULT_IDS. - * @param[in] pc The program counter of the instruction that triggered the fault. - * @param[in] info Optional additional information regarding the fault. Refer to each Fault identifier for details. - * - * @note When id is set to @ref NRF_FAULT_ID_APP_MEMACC, pc will contain the address of the instruction being executed at the time when - * the fault is detected by the CPU. The CPU program counter may have advanced up to 2 instructions (no branching) after the one that triggered the fault. - */ -typedef void (*nrf_fault_handler_t)(uint32_t id, uint32_t pc, uint32_t info); - -/** @} */ - -/** @addtogroup NRF_SDM_FUNCTIONS Functions - * @{ */ - -/**@brief Enables the SoftDevice and by extension the protocol stack. - * - * @note Some care must be taken if a low frequency clock source is already running when calling this function: - * If the LF clock has a different source then the one currently running, it will be stopped. Then, the new - * clock source will be started. - * - * @note This function has no effect when returning with an error. - * - * @post If return code is ::NRF_SUCCESS - * - SoC library and protocol stack APIs are made available. - * - A portion of RAM will be unavailable (see relevant SDS documentation). - * - Some peripherals will be unavailable or available only through the SoC API (see relevant SDS documentation). - * - Interrupts will not arrive from protected peripherals or interrupts. - * - nrf_nvic_ functions must be used instead of CMSIS NVIC_ functions for reliable usage of the SoftDevice. - * - Interrupt latency may be affected by the SoftDevice (see relevant SDS documentation). - * - Chosen low frequency clock source will be running. - * - * @param p_clock_lf_cfg Low frequency clock source and accuracy. - If NULL the clock will be configured as an RC source with rc_ctiv = 16 and .rc_temp_ctiv = 2 - In the case of XTAL source, the PPM accuracy of the chosen clock source must be greater than or equal to the actual characteristics of your XTAL clock. - * @param fault_handler Callback to be invoked in case of fault, cannot be NULL. - * - * @retval ::NRF_SUCCESS - * @retval ::NRF_ERROR_INVALID_ADDR Invalid or NULL pointer supplied. - * @retval ::NRF_ERROR_INVALID_STATE SoftDevice is already enabled, and the clock source and fault handler cannot be updated. - * @retval ::NRF_ERROR_SDM_INCORRECT_INTERRUPT_CONFIGURATION SoftDevice interrupt is already enabled, or an enabled interrupt has an illegal priority level. - * @retval ::NRF_ERROR_SDM_LFCLK_SOURCE_UNKNOWN Unknown low frequency clock source selected. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid clock source configuration supplied in p_clock_lf_cfg. - */ -SVCALL(SD_SOFTDEVICE_ENABLE, uint32_t, sd_softdevice_enable(nrf_clock_lf_cfg_t const * p_clock_lf_cfg, nrf_fault_handler_t fault_handler)); - - -/**@brief Disables the SoftDevice and by extension the protocol stack. - * - * Idempotent function to disable the SoftDevice. - * - * @post SoC library and protocol stack APIs are made unavailable. - * @post All interrupts that was protected by the SoftDevice will be disabled and initialized to priority 0 (highest). - * @post All peripherals used by the SoftDevice will be reset to default values. - * @post All of RAM become available. - * @post All interrupts are forwarded to the application. - * @post LFCLK source chosen in ::sd_softdevice_enable will be left running. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_SOFTDEVICE_DISABLE, uint32_t, sd_softdevice_disable(void)); - -/**@brief Check if the SoftDevice is enabled. - * - * @param[out] p_softdevice_enabled If the SoftDevice is enabled: 1 else 0. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_SOFTDEVICE_IS_ENABLED, uint32_t, sd_softdevice_is_enabled(uint8_t * p_softdevice_enabled)); - -/**@brief Sets the base address of the interrupt vector table for interrupts forwarded from the SoftDevice - * - * This function is only intended to be called when a bootloader is enabled. - * - * @param[in] address The base address of the interrupt vector table for forwarded interrupts. - - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_SOFTDEVICE_VECTOR_TABLE_BASE_SET, uint32_t, sd_softdevice_vector_table_base_set(uint32_t address)); - -/** @} */ - -#ifdef __cplusplus -} -#endif -#endif // NRF_SDM_H__ - -/** - @} -*/ diff --git a/lib/nrf52/include/nrf_soc.h b/lib/nrf52/include/nrf_soc.h deleted file mode 100644 index beb4d3a5..00000000 --- a/lib/nrf52/include/nrf_soc.h +++ /dev/null @@ -1,1079 +0,0 @@ -/* - * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * @defgroup nrf_soc_api SoC Library API - * @{ - * - * @brief APIs for the SoC library. - * - */ - -#ifndef NRF_SOC_H__ -#define NRF_SOC_H__ - -#include -#include "nrf.h" -#include "nrf_svc.h" -#include "nrf_error.h" -#include "nrf_error_soc.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/**@addtogroup NRF_SOC_DEFINES Defines - * @{ */ - -/**@brief The number of the lowest SVC number reserved for the SoC library. */ -#define SOC_SVC_BASE (0x20) /**< Base value for SVCs that are available when the SoftDevice is disabled. */ -#define SOC_SVC_BASE_NOT_AVAILABLE (0x2C) /**< Base value for SVCs that are not available when the SoftDevice is disabled. */ - -/**@brief Guaranteed time for application to process radio inactive notification. */ -#define NRF_RADIO_NOTIFICATION_INACTIVE_GUARANTEED_TIME_US (62) - -/**@brief The minimum allowed timeslot extension time. */ -#define NRF_RADIO_MINIMUM_TIMESLOT_LENGTH_EXTENSION_TIME_US (200) - -/**@brief The maximum processing time to handle a timeslot extension. */ -#define NRF_RADIO_MAX_EXTENSION_PROCESSING_TIME_US (17) - -/**@brief The latest time before the end of a timeslot the timeslot can be extended. */ -#define NRF_RADIO_MIN_EXTENSION_MARGIN_US (79) - -#define SOC_ECB_KEY_LENGTH (16) /**< ECB key length. */ -#define SOC_ECB_CLEARTEXT_LENGTH (16) /**< ECB cleartext length. */ -#define SOC_ECB_CIPHERTEXT_LENGTH (SOC_ECB_CLEARTEXT_LENGTH) /**< ECB ciphertext length. */ - -#define SD_EVT_IRQn (SWI2_IRQn) /**< SoftDevice Event IRQ number. Used for both protocol events and SoC events. */ -#define SD_EVT_IRQHandler (SWI2_IRQHandler) /**< SoftDevice Event IRQ handler. Used for both protocol events and SoC events. - The default interrupt priority for this handler is set to 6 */ -#define RADIO_NOTIFICATION_IRQn (SWI1_IRQn) /**< The radio notification IRQ number. */ -#define RADIO_NOTIFICATION_IRQHandler (SWI1_IRQHandler) /**< The radio notification IRQ handler. - The default interrupt priority for this handler is set to 6 */ -#define NRF_RADIO_LENGTH_MIN_US (100) /**< The shortest allowed radio timeslot, in microseconds. */ -#define NRF_RADIO_LENGTH_MAX_US (100000) /**< The longest allowed radio timeslot, in microseconds. */ - -#define NRF_RADIO_DISTANCE_MAX_US (128000000UL - 1UL) /**< The longest timeslot distance, in microseconds, allowed for the distance parameter (see @ref nrf_radio_request_normal_t) in the request. */ - -#define NRF_RADIO_EARLIEST_TIMEOUT_MAX_US (128000000UL - 1UL) /**< The longest timeout, in microseconds, allowed when requesting the earliest possible timeslot. */ - -#define NRF_RADIO_START_JITTER_US (2) /**< The maximum jitter in @ref NRF_RADIO_CALLBACK_SIGNAL_TYPE_START relative to the requested start time. */ - -/**@brief Mask of PPI channels reserved by the SoftDevice when the SoftDevice is disabled. */ -#define NRF_SOC_SD_PPI_CHANNELS_SD_DISABLED_MSK ((uint32_t)(0)) - -/**@brief Mask of PPI channels reserved by the SoftDevice when the SoftDevice is enabled. */ -#define NRF_SOC_SD_PPI_CHANNELS_SD_ENABLED_MSK ((uint32_t)( \ - (1U << 17) \ - | (1U << 18) \ - | (1U << 19) \ - | (1U << 20) \ - | (1U << 21) \ - | (1U << 22) \ - | (1U << 23) \ - | (1U << 24) \ - | (1U << 25) \ - | (1U << 26) \ - | (1U << 27) \ - | (1U << 28) \ - | (1U << 29) \ - | (1U << 30) \ - | (1U << 31) \ - )) - -/**@brief Mask of PPI channels available to the application when the SoftDevice is disabled. */ -#define NRF_SOC_APP_PPI_CHANNELS_SD_DISABLED_MSK (~NRF_SOC_SD_PPI_CHANNELS_SD_DISABLED_MSK) - -/**@brief Mask of PPI channels available to the application when the SoftDevice is enabled. */ -#define NRF_SOC_APP_PPI_CHANNELS_SD_ENABLED_MSK (~NRF_SOC_SD_PPI_CHANNELS_SD_ENABLED_MSK) - -/**@brief Mask of PPI groups reserved by the SoftDevice when the SoftDevice is disabled. */ -#define NRF_SOC_SD_PPI_GROUPS_SD_DISABLED_MSK ((uint32_t)(0)) - -/**@brief Mask of PPI groups reserved by the SoftDevice when the SoftDevice is enabled. */ -#define NRF_SOC_SD_PPI_GROUPS_SD_ENABLED_MSK ((uint32_t)( \ - (1U << 4) \ - | (1U << 5) \ - )) - -/**@brief Mask of PPI groups available to the application when the SoftDevice is disabled. */ -#define NRF_SOC_APP_PPI_GROUPS_SD_DISABLED_MSK (~NRF_SOC_SD_PPI_GROUPS_SD_DISABLED_MSK) - -/**@brief Mask of PPI groups available to the application when the SoftDevice is enabled. */ -#define NRF_SOC_APP_PPI_GROUPS_SD_ENABLED_MSK (~NRF_SOC_SD_PPI_GROUPS_SD_ENABLED_MSK) - -/**@} */ - -/**@addtogroup NRF_SOC_ENUMS Enumerations - * @{ */ - -/**@brief The SVC numbers used by the SVC functions in the SoC library. */ -enum NRF_SOC_SVCS -{ - SD_PPI_CHANNEL_ENABLE_GET = SOC_SVC_BASE, - SD_PPI_CHANNEL_ENABLE_SET = SOC_SVC_BASE + 1, - SD_PPI_CHANNEL_ENABLE_CLR = SOC_SVC_BASE + 2, - SD_PPI_CHANNEL_ASSIGN = SOC_SVC_BASE + 3, - SD_PPI_GROUP_TASK_ENABLE = SOC_SVC_BASE + 4, - SD_PPI_GROUP_TASK_DISABLE = SOC_SVC_BASE + 5, - SD_PPI_GROUP_ASSIGN = SOC_SVC_BASE + 6, - SD_PPI_GROUP_GET = SOC_SVC_BASE + 7, - SD_FLASH_PAGE_ERASE = SOC_SVC_BASE + 8, - SD_FLASH_WRITE = SOC_SVC_BASE + 9, - SD_PROTECTED_REGISTER_WRITE = SOC_SVC_BASE + 11, - SD_MUTEX_NEW = SOC_SVC_BASE_NOT_AVAILABLE, - SD_MUTEX_ACQUIRE = SOC_SVC_BASE_NOT_AVAILABLE + 1, - SD_MUTEX_RELEASE = SOC_SVC_BASE_NOT_AVAILABLE + 2, - SD_RAND_APPLICATION_POOL_CAPACITY_GET = SOC_SVC_BASE_NOT_AVAILABLE + 3, - SD_RAND_APPLICATION_BYTES_AVAILABLE_GET = SOC_SVC_BASE_NOT_AVAILABLE + 4, - SD_RAND_APPLICATION_VECTOR_GET = SOC_SVC_BASE_NOT_AVAILABLE + 5, - SD_POWER_MODE_SET = SOC_SVC_BASE_NOT_AVAILABLE + 6, - SD_POWER_SYSTEM_OFF = SOC_SVC_BASE_NOT_AVAILABLE + 7, - SD_POWER_RESET_REASON_GET = SOC_SVC_BASE_NOT_AVAILABLE + 8, - SD_POWER_RESET_REASON_CLR = SOC_SVC_BASE_NOT_AVAILABLE + 9, - SD_POWER_POF_ENABLE = SOC_SVC_BASE_NOT_AVAILABLE + 10, - SD_POWER_POF_THRESHOLD_SET = SOC_SVC_BASE_NOT_AVAILABLE + 11, - SD_POWER_POF_THRESHOLDVDDH_SET = SOC_SVC_BASE_NOT_AVAILABLE + 12, - SD_POWER_RAM_POWER_SET = SOC_SVC_BASE_NOT_AVAILABLE + 13, - SD_POWER_RAM_POWER_CLR = SOC_SVC_BASE_NOT_AVAILABLE + 14, - SD_POWER_RAM_POWER_GET = SOC_SVC_BASE_NOT_AVAILABLE + 15, - SD_POWER_GPREGRET_SET = SOC_SVC_BASE_NOT_AVAILABLE + 16, - SD_POWER_GPREGRET_CLR = SOC_SVC_BASE_NOT_AVAILABLE + 17, - SD_POWER_GPREGRET_GET = SOC_SVC_BASE_NOT_AVAILABLE + 18, - SD_POWER_DCDC_MODE_SET = SOC_SVC_BASE_NOT_AVAILABLE + 19, - SD_POWER_DCDC0_MODE_SET = SOC_SVC_BASE_NOT_AVAILABLE + 20, - SD_APP_EVT_WAIT = SOC_SVC_BASE_NOT_AVAILABLE + 21, - SD_CLOCK_HFCLK_REQUEST = SOC_SVC_BASE_NOT_AVAILABLE + 22, - SD_CLOCK_HFCLK_RELEASE = SOC_SVC_BASE_NOT_AVAILABLE + 23, - SD_CLOCK_HFCLK_IS_RUNNING = SOC_SVC_BASE_NOT_AVAILABLE + 24, - SD_RADIO_NOTIFICATION_CFG_SET = SOC_SVC_BASE_NOT_AVAILABLE + 25, - SD_ECB_BLOCK_ENCRYPT = SOC_SVC_BASE_NOT_AVAILABLE + 26, - SD_ECB_BLOCKS_ENCRYPT = SOC_SVC_BASE_NOT_AVAILABLE + 27, - SD_RADIO_SESSION_OPEN = SOC_SVC_BASE_NOT_AVAILABLE + 28, - SD_RADIO_SESSION_CLOSE = SOC_SVC_BASE_NOT_AVAILABLE + 29, - SD_RADIO_REQUEST = SOC_SVC_BASE_NOT_AVAILABLE + 30, - SD_EVT_GET = SOC_SVC_BASE_NOT_AVAILABLE + 31, - SD_TEMP_GET = SOC_SVC_BASE_NOT_AVAILABLE + 32, - SD_POWER_USBPWRRDY_ENABLE = SOC_SVC_BASE_NOT_AVAILABLE + 33, - SD_POWER_USBDETECTED_ENABLE = SOC_SVC_BASE_NOT_AVAILABLE + 34, - SD_POWER_USBREMOVED_ENABLE = SOC_SVC_BASE_NOT_AVAILABLE + 35, - SD_POWER_USBREGSTATUS_GET = SOC_SVC_BASE_NOT_AVAILABLE + 36, - SVC_SOC_LAST = SOC_SVC_BASE_NOT_AVAILABLE + 37 -}; - -/**@brief Possible values of a ::nrf_mutex_t. */ -enum NRF_MUTEX_VALUES -{ - NRF_MUTEX_FREE, - NRF_MUTEX_TAKEN -}; - -/**@brief Power modes. */ -enum NRF_POWER_MODES -{ - NRF_POWER_MODE_CONSTLAT, /**< Constant latency mode. See power management in the reference manual. */ - NRF_POWER_MODE_LOWPWR /**< Low power mode. See power management in the reference manual. */ -}; - - -/**@brief Power failure thresholds */ -enum NRF_POWER_THRESHOLDS -{ - NRF_POWER_THRESHOLD_V17 = 4UL, /**< 1.7 Volts power failure threshold. */ - NRF_POWER_THRESHOLD_V18, /**< 1.8 Volts power failure threshold. */ - NRF_POWER_THRESHOLD_V19, /**< 1.9 Volts power failure threshold. */ - NRF_POWER_THRESHOLD_V20, /**< 2.0 Volts power failure threshold. */ - NRF_POWER_THRESHOLD_V21, /**< 2.1 Volts power failure threshold. */ - NRF_POWER_THRESHOLD_V22, /**< 2.2 Volts power failure threshold. */ - NRF_POWER_THRESHOLD_V23, /**< 2.3 Volts power failure threshold. */ - NRF_POWER_THRESHOLD_V24, /**< 2.4 Volts power failure threshold. */ - NRF_POWER_THRESHOLD_V25, /**< 2.5 Volts power failure threshold. */ - NRF_POWER_THRESHOLD_V26, /**< 2.6 Volts power failure threshold. */ - NRF_POWER_THRESHOLD_V27, /**< 2.7 Volts power failure threshold. */ - NRF_POWER_THRESHOLD_V28 /**< 2.8 Volts power failure threshold. */ -}; - -/**@brief Power failure thresholds for high voltage */ -enum NRF_POWER_THRESHOLDVDDHS -{ - NRF_POWER_THRESHOLDVDDH_V27, /**< 2.7 Volts power failure threshold. */ - NRF_POWER_THRESHOLDVDDH_V28, /**< 2.8 Volts power failure threshold. */ - NRF_POWER_THRESHOLDVDDH_V29, /**< 2.9 Volts power failure threshold. */ - NRF_POWER_THRESHOLDVDDH_V30, /**< 3.0 Volts power failure threshold. */ - NRF_POWER_THRESHOLDVDDH_V31, /**< 3.1 Volts power failure threshold. */ - NRF_POWER_THRESHOLDVDDH_V32, /**< 3.2 Volts power failure threshold. */ - NRF_POWER_THRESHOLDVDDH_V33, /**< 3.3 Volts power failure threshold. */ - NRF_POWER_THRESHOLDVDDH_V34, /**< 3.4 Volts power failure threshold. */ - NRF_POWER_THRESHOLDVDDH_V35, /**< 3.5 Volts power failure threshold. */ - NRF_POWER_THRESHOLDVDDH_V36, /**< 3.6 Volts power failure threshold. */ - NRF_POWER_THRESHOLDVDDH_V37, /**< 3.7 Volts power failure threshold. */ - NRF_POWER_THRESHOLDVDDH_V38, /**< 3.8 Volts power failure threshold. */ - NRF_POWER_THRESHOLDVDDH_V39, /**< 3.9 Volts power failure threshold. */ - NRF_POWER_THRESHOLDVDDH_V40, /**< 4.0 Volts power failure threshold. */ - NRF_POWER_THRESHOLDVDDH_V41, /**< 4.1 Volts power failure threshold. */ - NRF_POWER_THRESHOLDVDDH_V42 /**< 4.2 Volts power failure threshold. */ -}; - - -/**@brief DC/DC converter modes. */ -enum NRF_POWER_DCDC_MODES -{ - NRF_POWER_DCDC_DISABLE, /**< The DCDC is disabled. */ - NRF_POWER_DCDC_ENABLE /**< The DCDC is enabled. */ -}; - -/**@brief Radio notification distances. */ -enum NRF_RADIO_NOTIFICATION_DISTANCES -{ - NRF_RADIO_NOTIFICATION_DISTANCE_NONE = 0, /**< The event does not have a notification. */ - NRF_RADIO_NOTIFICATION_DISTANCE_800US, /**< The distance from the active notification to start of radio activity. */ - NRF_RADIO_NOTIFICATION_DISTANCE_1740US, /**< The distance from the active notification to start of radio activity. */ - NRF_RADIO_NOTIFICATION_DISTANCE_2680US, /**< The distance from the active notification to start of radio activity. */ - NRF_RADIO_NOTIFICATION_DISTANCE_3620US, /**< The distance from the active notification to start of radio activity. */ - NRF_RADIO_NOTIFICATION_DISTANCE_4560US, /**< The distance from the active notification to start of radio activity. */ - NRF_RADIO_NOTIFICATION_DISTANCE_5500US /**< The distance from the active notification to start of radio activity. */ -}; - - -/**@brief Radio notification types. */ -enum NRF_RADIO_NOTIFICATION_TYPES -{ - NRF_RADIO_NOTIFICATION_TYPE_NONE = 0, /**< The event does not have a radio notification signal. */ - NRF_RADIO_NOTIFICATION_TYPE_INT_ON_ACTIVE, /**< Using interrupt for notification when the radio will be enabled. */ - NRF_RADIO_NOTIFICATION_TYPE_INT_ON_INACTIVE, /**< Using interrupt for notification when the radio has been disabled. */ - NRF_RADIO_NOTIFICATION_TYPE_INT_ON_BOTH, /**< Using interrupt for notification both when the radio will be enabled and disabled. */ -}; - -/**@brief The Radio signal callback types. */ -enum NRF_RADIO_CALLBACK_SIGNAL_TYPE -{ - NRF_RADIO_CALLBACK_SIGNAL_TYPE_START, /**< This signal indicates the start of the radio timeslot. */ - NRF_RADIO_CALLBACK_SIGNAL_TYPE_TIMER0, /**< This signal indicates the NRF_TIMER0 interrupt. */ - NRF_RADIO_CALLBACK_SIGNAL_TYPE_RADIO, /**< This signal indicates the NRF_RADIO interrupt. */ - NRF_RADIO_CALLBACK_SIGNAL_TYPE_EXTEND_FAILED, /**< This signal indicates extend action failed. */ - NRF_RADIO_CALLBACK_SIGNAL_TYPE_EXTEND_SUCCEEDED /**< This signal indicates extend action succeeded. */ -}; - -/**@brief The actions requested by the signal callback. - * - * This code gives the SOC instructions about what action to take when the signal callback has - * returned. - */ -enum NRF_RADIO_SIGNAL_CALLBACK_ACTION -{ - NRF_RADIO_SIGNAL_CALLBACK_ACTION_NONE, /**< Return without action. */ - NRF_RADIO_SIGNAL_CALLBACK_ACTION_EXTEND, /**< Request an extension of the current - timeslot. Maximum execution time for this action: - @ref NRF_RADIO_MAX_EXTENSION_PROCESSING_TIME_US. - This action must be started at least - @ref NRF_RADIO_MIN_EXTENSION_MARGIN_US before - the end of the timeslot. */ - NRF_RADIO_SIGNAL_CALLBACK_ACTION_END, /**< End the current radio timeslot. */ - NRF_RADIO_SIGNAL_CALLBACK_ACTION_REQUEST_AND_END /**< Request a new radio timeslot and end the current timeslot. */ -}; - -/**@brief Radio timeslot high frequency clock source configuration. */ -enum NRF_RADIO_HFCLK_CFG -{ - NRF_RADIO_HFCLK_CFG_XTAL_GUARANTEED, /**< The SoftDevice will guarantee that the high frequency clock source is the - external crystal for the whole duration of the timeslot. This should be the - preferred option for events that use the radio or require high timing accuracy. - @note The SoftDevice will automatically turn on and off the external crystal, - at the beginning and end of the timeslot, respectively. The crystal may also - intentionally be left running after the timeslot, in cases where it is needed - by the SoftDevice shortly after the end of the timeslot. */ - NRF_RADIO_HFCLK_CFG_NO_GUARANTEE /**< This configuration allows for earlier and tighter scheduling of timeslots. - The RC oscillator may be the clock source in part or for the whole duration of the timeslot. - The RC oscillator's accuracy must therefore be taken into consideration. - @note If the application will use the radio peripheral in timeslots with this configuration, - it must make sure that the crystal is running and stable before starting the radio. */ -}; - -/**@brief Radio timeslot priorities. */ -enum NRF_RADIO_PRIORITY -{ - NRF_RADIO_PRIORITY_HIGH, /**< High (equal priority as the normal connection priority of the SoftDevice stack(s)). */ - NRF_RADIO_PRIORITY_NORMAL, /**< Normal (equal priority as the priority of secondary activities of the SoftDevice stack(s)). */ -}; - -/**@brief Radio timeslot request type. */ -enum NRF_RADIO_REQUEST_TYPE -{ - NRF_RADIO_REQ_TYPE_EARLIEST, /**< Request radio timeslot as early as possible. This should always be used for the first request in a session. */ - NRF_RADIO_REQ_TYPE_NORMAL /**< Normal radio timeslot request. */ -}; - -/**@brief SoC Events. */ -enum NRF_SOC_EVTS -{ - NRF_EVT_HFCLKSTARTED, /**< Event indicating that the HFCLK has started. */ - NRF_EVT_POWER_FAILURE_WARNING, /**< Event indicating that a power failure warning has occurred. */ - NRF_EVT_FLASH_OPERATION_SUCCESS, /**< Event indicating that the ongoing flash operation has completed successfully. */ - NRF_EVT_FLASH_OPERATION_ERROR, /**< Event indicating that the ongoing flash operation has timed out with an error. */ - NRF_EVT_RADIO_BLOCKED, /**< Event indicating that a radio timeslot was blocked. */ - NRF_EVT_RADIO_CANCELED, /**< Event indicating that a radio timeslot was canceled by SoftDevice. */ - NRF_EVT_RADIO_SIGNAL_CALLBACK_INVALID_RETURN, /**< Event indicating that a radio timeslot signal callback handler return was invalid. */ - NRF_EVT_RADIO_SESSION_IDLE, /**< Event indicating that a radio timeslot session is idle. */ - NRF_EVT_RADIO_SESSION_CLOSED, /**< Event indicating that a radio timeslot session is closed. */ - NRF_EVT_POWER_USB_POWER_READY, /**< Event indicating that a USB 3.3 V supply is ready. */ - NRF_EVT_POWER_USB_DETECTED, /**< Event indicating that voltage supply is detected on VBUS. */ - NRF_EVT_POWER_USB_REMOVED, /**< Event indicating that voltage supply is removed from VBUS. */ - NRF_EVT_NUMBER_OF_EVTS -}; - -/**@} */ - - -/**@addtogroup NRF_SOC_STRUCTURES Structures - * @{ */ - -/**@brief Represents a mutex for use with the nrf_mutex functions. - * @note Accessing the value directly is not safe, use the mutex functions! - */ -typedef volatile uint8_t nrf_mutex_t; - -/**@brief Parameters for a request for a timeslot as early as possible. */ -typedef struct -{ - uint8_t hfclk; /**< High frequency clock source, see @ref NRF_RADIO_HFCLK_CFG. */ - uint8_t priority; /**< The radio timeslot priority, see @ref NRF_RADIO_PRIORITY. */ - uint32_t length_us; /**< The radio timeslot length (in the range 100 to 100,000] microseconds). */ - uint32_t timeout_us; /**< Longest acceptable delay until the start of the requested timeslot (up to @ref NRF_RADIO_EARLIEST_TIMEOUT_MAX_US microseconds). */ -} nrf_radio_request_earliest_t; - -/**@brief Parameters for a normal radio timeslot request. */ -typedef struct -{ - uint8_t hfclk; /**< High frequency clock source, see @ref NRF_RADIO_HFCLK_CFG. */ - uint8_t priority; /**< The radio timeslot priority, see @ref NRF_RADIO_PRIORITY. */ - uint32_t distance_us; /**< Distance from the start of the previous radio timeslot (up to @ref NRF_RADIO_DISTANCE_MAX_US microseconds). */ - uint32_t length_us; /**< The radio timeslot length (in the range [100..100,000] microseconds). */ -} nrf_radio_request_normal_t; - -/**@brief Radio timeslot request parameters. */ -typedef struct -{ - uint8_t request_type; /**< Type of request, see @ref NRF_RADIO_REQUEST_TYPE. */ - union - { - nrf_radio_request_earliest_t earliest; /**< Parameters for requesting a radio timeslot as early as possible. */ - nrf_radio_request_normal_t normal; /**< Parameters for requesting a normal radio timeslot. */ - } params; /**< Parameter union. */ -} nrf_radio_request_t; - -/**@brief Return parameters of the radio timeslot signal callback. */ -typedef struct -{ - uint8_t callback_action; /**< The action requested by the application when returning from the signal callback, see @ref NRF_RADIO_SIGNAL_CALLBACK_ACTION. */ - union - { - struct - { - nrf_radio_request_t * p_next; /**< The request parameters for the next radio timeslot. */ - } request; /**< Additional parameters for return_code @ref NRF_RADIO_SIGNAL_CALLBACK_ACTION_REQUEST_AND_END. */ - struct - { - uint32_t length_us; /**< Requested extension of the radio timeslot duration (microseconds) (for minimum time see @ref NRF_RADIO_MINIMUM_TIMESLOT_LENGTH_EXTENSION_TIME_US). */ - } extend; /**< Additional parameters for return_code @ref NRF_RADIO_SIGNAL_CALLBACK_ACTION_EXTEND. */ - } params; /**< Parameter union. */ -} nrf_radio_signal_callback_return_param_t; - -/**@brief The radio timeslot signal callback type. - * - * @note In case of invalid return parameters, the radio timeslot will automatically end - * immediately after returning from the signal callback and the - * @ref NRF_EVT_RADIO_SIGNAL_CALLBACK_INVALID_RETURN event will be sent. - * @note The returned struct pointer must remain valid after the signal callback - * function returns. For instance, this means that it must not point to a stack variable. - * - * @param[in] signal_type Type of signal, see @ref NRF_RADIO_CALLBACK_SIGNAL_TYPE. - * - * @return Pointer to structure containing action requested by the application. - */ -typedef nrf_radio_signal_callback_return_param_t * (*nrf_radio_signal_callback_t) (uint8_t signal_type); - -/**@brief AES ECB parameter typedefs */ -typedef uint8_t soc_ecb_key_t[SOC_ECB_KEY_LENGTH]; /**< Encryption key type. */ -typedef uint8_t soc_ecb_cleartext_t[SOC_ECB_CLEARTEXT_LENGTH]; /**< Cleartext data type. */ -typedef uint8_t soc_ecb_ciphertext_t[SOC_ECB_CIPHERTEXT_LENGTH]; /**< Ciphertext data type. */ - -/**@brief AES ECB data structure */ -typedef struct -{ - soc_ecb_key_t key; /**< Encryption key. */ - soc_ecb_cleartext_t cleartext; /**< Cleartext data. */ - soc_ecb_ciphertext_t ciphertext; /**< Ciphertext data. */ -} nrf_ecb_hal_data_t; - -/**@brief AES ECB block. Used to provide multiple blocks in a single call - to @ref sd_ecb_blocks_encrypt.*/ -typedef struct -{ - soc_ecb_key_t const * p_key; /**< Pointer to the Encryption key. */ - soc_ecb_cleartext_t const * p_cleartext; /**< Pointer to the Cleartext data. */ - soc_ecb_ciphertext_t * p_ciphertext; /**< Pointer to the Ciphertext data. */ -} nrf_ecb_hal_data_block_t; - -/**@} */ - -/**@addtogroup NRF_SOC_FUNCTIONS Functions - * @{ */ - -/**@brief Initialize a mutex. - * - * @param[in] p_mutex Pointer to the mutex to initialize. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_MUTEX_NEW, uint32_t, sd_mutex_new(nrf_mutex_t * p_mutex)); - -/**@brief Attempt to acquire a mutex. - * - * @param[in] p_mutex Pointer to the mutex to acquire. - * - * @retval ::NRF_SUCCESS The mutex was successfully acquired. - * @retval ::NRF_ERROR_SOC_MUTEX_ALREADY_TAKEN The mutex could not be acquired. - */ -SVCALL(SD_MUTEX_ACQUIRE, uint32_t, sd_mutex_acquire(nrf_mutex_t * p_mutex)); - -/**@brief Release a mutex. - * - * @param[in] p_mutex Pointer to the mutex to release. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_MUTEX_RELEASE, uint32_t, sd_mutex_release(nrf_mutex_t * p_mutex)); - -/**@brief Query the capacity of the application random pool. - * - * @param[out] p_pool_capacity The capacity of the pool. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_RAND_APPLICATION_POOL_CAPACITY_GET, uint32_t, sd_rand_application_pool_capacity_get(uint8_t * p_pool_capacity)); - -/**@brief Get number of random bytes available to the application. - * - * @param[out] p_bytes_available The number of bytes currently available in the pool. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_RAND_APPLICATION_BYTES_AVAILABLE_GET, uint32_t, sd_rand_application_bytes_available_get(uint8_t * p_bytes_available)); - -/**@brief Get random bytes from the application pool. - * - * @param[out] p_buff Pointer to unit8_t buffer for storing the bytes. - * @param[in] length Number of bytes to take from pool and place in p_buff. - * - * @retval ::NRF_SUCCESS The requested bytes were written to p_buff. - * @retval ::NRF_ERROR_SOC_RAND_NOT_ENOUGH_VALUES No bytes were written to the buffer, because there were not enough bytes available. -*/ -SVCALL(SD_RAND_APPLICATION_VECTOR_GET, uint32_t, sd_rand_application_vector_get(uint8_t * p_buff, uint8_t length)); - -/**@brief Gets the reset reason register. - * - * @param[out] p_reset_reason Contents of the NRF_POWER->RESETREAS register. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_POWER_RESET_REASON_GET, uint32_t, sd_power_reset_reason_get(uint32_t * p_reset_reason)); - -/**@brief Clears the bits of the reset reason register. - * - * @param[in] reset_reason_clr_msk Contains the bits to clear from the reset reason register. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_POWER_RESET_REASON_CLR, uint32_t, sd_power_reset_reason_clr(uint32_t reset_reason_clr_msk)); - -/**@brief Sets the power mode when in CPU sleep. - * - * @param[in] power_mode The power mode to use when in CPU sleep, see @ref NRF_POWER_MODES. @sa sd_app_evt_wait - * - * @retval ::NRF_SUCCESS The power mode was set. - * @retval ::NRF_ERROR_SOC_POWER_MODE_UNKNOWN The power mode was unknown. - */ -SVCALL(SD_POWER_MODE_SET, uint32_t, sd_power_mode_set(uint8_t power_mode)); - -/**@brief Puts the chip in System OFF mode. - * - * @retval ::NRF_ERROR_SOC_POWER_OFF_SHOULD_NOT_RETURN - */ -SVCALL(SD_POWER_SYSTEM_OFF, uint32_t, sd_power_system_off(void)); - -/**@brief Enables or disables the power-fail comparator. - * - * Enabling this will give a SoftDevice event (NRF_EVT_POWER_FAILURE_WARNING) when the power failure warning occurs. - * The event can be retrieved with sd_evt_get(); - * - * @param[in] pof_enable True if the power-fail comparator should be enabled, false if it should be disabled. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_POWER_POF_ENABLE, uint32_t, sd_power_pof_enable(uint8_t pof_enable)); - -/**@brief Enables or disables the USB power ready event. - * - * Enabling this will give a SoftDevice event (NRF_EVT_POWER_USB_POWER_READY) when a USB 3.3 V supply is ready. - * The event can be retrieved with sd_evt_get(); - * - * @param[in] usbpwrrdy_enable True if the power ready event should be enabled, false if it should be disabled. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_POWER_USBPWRRDY_ENABLE, uint32_t, sd_power_usbpwrrdy_enable(uint8_t usbpwrrdy_enable)); - -/**@brief Enables or disables the power USB-detected event. - * - * Enabling this will give a SoftDevice event (NRF_EVT_POWER_USB_DETECTED) when a voltage supply is detected on VBUS. - * The event can be retrieved with sd_evt_get(); - * - * @param[in] usbdetected_enable True if the power ready event should be enabled, false if it should be disabled. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_POWER_USBDETECTED_ENABLE, uint32_t, sd_power_usbdetected_enable(uint8_t usbdetected_enable)); - -/**@brief Enables or disables the power USB-removed event. - * - * Enabling this will give a SoftDevice event (NRF_EVT_POWER_USB_REMOVED) when a voltage supply is removed from VBUS. - * The event can be retrieved with sd_evt_get(); - * - * @param[in] usbremoved_enable True if the power ready event should be enabled, false if it should be disabled. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_POWER_USBREMOVED_ENABLE, uint32_t, sd_power_usbremoved_enable(uint8_t usbremoved_enable)); - -/**@brief Get USB supply status register content. - * - * @param[out] usbregstatus The content of USBREGSTATUS register. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_POWER_USBREGSTATUS_GET, uint32_t, sd_power_usbregstatus_get(uint32_t * usbregstatus)); - -/**@brief Sets the power failure comparator threshold value. - * - * @note: Power failure comparator threshold setting. This setting applies both for normal voltage - * mode (supply connected to both VDD and VDDH) and high voltage mode (supply connected to - * VDDH only). - * - * @param[in] threshold The power-fail threshold value to use, see @ref NRF_POWER_THRESHOLDS. - * - * @retval ::NRF_SUCCESS The power failure threshold was set. - * @retval ::NRF_ERROR_SOC_POWER_POF_THRESHOLD_UNKNOWN The power failure threshold is unknown. - */ -SVCALL(SD_POWER_POF_THRESHOLD_SET, uint32_t, sd_power_pof_threshold_set(uint8_t threshold)); - -/**@brief Sets the power failure comparator threshold value for high voltage. - * - * @note: Power failure comparator threshold setting for high voltage mode (supply connected to - * VDDH only). This setting does not apply for normal voltage mode (supply connected to both - * VDD and VDDH). - * - * @param[in] threshold The power-fail threshold value to use, see @ref NRF_POWER_THRESHOLDVDDHS. - * - * @retval ::NRF_SUCCESS The power failure threshold was set. - * @retval ::NRF_ERROR_SOC_POWER_POF_THRESHOLD_UNKNOWN The power failure threshold is unknown. - */ -SVCALL(SD_POWER_POF_THRESHOLDVDDH_SET, uint32_t, sd_power_pof_thresholdvddh_set(uint8_t threshold)); - -/**@brief Writes the NRF_POWER->RAM[index].POWERSET register. - * - * @param[in] index Contains the index in the NRF_POWER->RAM[index].POWERSET register to write to. - * @param[in] ram_powerset Contains the word to write to the NRF_POWER->RAM[index].POWERSET register. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_POWER_RAM_POWER_SET, uint32_t, sd_power_ram_power_set(uint8_t index, uint32_t ram_powerset)); - -/**@brief Writes the NRF_POWER->RAM[index].POWERCLR register. - * - * @param[in] index Contains the index in the NRF_POWER->RAM[index].POWERCLR register to write to. - * @param[in] ram_powerclr Contains the word to write to the NRF_POWER->RAM[index].POWERCLR register. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_POWER_RAM_POWER_CLR, uint32_t, sd_power_ram_power_clr(uint8_t index, uint32_t ram_powerclr)); - -/**@brief Get contents of NRF_POWER->RAM[index].POWER register, indicates power status of RAM[index] blocks. - * - * @param[in] index Contains the index in the NRF_POWER->RAM[index].POWER register to read from. - * @param[out] p_ram_power Content of NRF_POWER->RAM[index].POWER register. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_POWER_RAM_POWER_GET, uint32_t, sd_power_ram_power_get(uint8_t index, uint32_t * p_ram_power)); - -/**@brief Set bits in the general purpose retention registers (NRF_POWER->GPREGRET*). - * - * @param[in] gpregret_id 0 for GPREGRET, 1 for GPREGRET2. - * @param[in] gpregret_msk Bits to be set in the GPREGRET register. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_POWER_GPREGRET_SET, uint32_t, sd_power_gpregret_set(uint32_t gpregret_id, uint32_t gpregret_msk)); - -/**@brief Clear bits in the general purpose retention registers (NRF_POWER->GPREGRET*). - * - * @param[in] gpregret_id 0 for GPREGRET, 1 for GPREGRET2. - * @param[in] gpregret_msk Bits to be clear in the GPREGRET register. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_POWER_GPREGRET_CLR, uint32_t, sd_power_gpregret_clr(uint32_t gpregret_id, uint32_t gpregret_msk)); - -/**@brief Get contents of the general purpose retention registers (NRF_POWER->GPREGRET*). - * - * @param[in] gpregret_id 0 for GPREGRET, 1 for GPREGRET2. - * @param[out] p_gpregret Contents of the GPREGRET register. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_POWER_GPREGRET_GET, uint32_t, sd_power_gpregret_get(uint32_t gpregret_id, uint32_t *p_gpregret)); - -/**@brief Enable or disable the DC/DC regulator for the regulator stage 1 (REG1). - * - * @param[in] dcdc_mode The mode of the DCDC, see @ref NRF_POWER_DCDC_MODES. - * - * @retval ::NRF_SUCCESS - * @retval ::NRF_ERROR_INVALID_PARAM The DCDC mode is invalid. - */ -SVCALL(SD_POWER_DCDC_MODE_SET, uint32_t, sd_power_dcdc_mode_set(uint8_t dcdc_mode)); - -/**@brief Enable or disable the DC/DC regulator for the regulator stage 0 (REG0). - * - * For more details on the REG0 stage, please see product specification. - * - * @param[in] dcdc_mode The mode of the DCDC0, see @ref NRF_POWER_DCDC_MODES. - * - * @retval ::NRF_SUCCESS - * @retval ::NRF_ERROR_INVALID_PARAM The dcdc_mode is invalid. - */ -SVCALL(SD_POWER_DCDC0_MODE_SET, uint32_t, sd_power_dcdc0_mode_set(uint8_t dcdc_mode)); - -/**@brief Request the high frequency crystal oscillator. - * - * Will start the high frequency crystal oscillator, the startup time of the crystal varies - * and the ::sd_clock_hfclk_is_running function can be polled to check if it has started. - * - * @see sd_clock_hfclk_is_running - * @see sd_clock_hfclk_release - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_CLOCK_HFCLK_REQUEST, uint32_t, sd_clock_hfclk_request(void)); - -/**@brief Releases the high frequency crystal oscillator. - * - * Will stop the high frequency crystal oscillator, this happens immediately. - * - * @see sd_clock_hfclk_is_running - * @see sd_clock_hfclk_request - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_CLOCK_HFCLK_RELEASE, uint32_t, sd_clock_hfclk_release(void)); - -/**@brief Checks if the high frequency crystal oscillator is running. - * - * @see sd_clock_hfclk_request - * @see sd_clock_hfclk_release - * - * @param[out] p_is_running 1 if the external crystal oscillator is running, 0 if not. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_CLOCK_HFCLK_IS_RUNNING, uint32_t, sd_clock_hfclk_is_running(uint32_t * p_is_running)); - -/**@brief Waits for an application event. - * - * An application event is either an application interrupt or a pended interrupt when the interrupt - * is disabled. - * - * When the application waits for an application event by calling this function, an interrupt that - * is enabled will be taken immediately on pending since this function will wait in thread mode, - * then the execution will return in the application's main thread. - * - * In order to wake up from disabled interrupts, the SEVONPEND flag has to be set in the Cortex-M - * MCU's System Control Register (SCR), CMSIS_SCB. In that case, when a disabled interrupt gets - * pended, this function will return to the application's main thread. - * - * @note The application must ensure that the pended flag is cleared using ::sd_nvic_ClearPendingIRQ - * in order to sleep using this function. This is only necessary for disabled interrupts, as - * the interrupt handler will clear the pending flag automatically for enabled interrupts. - * - * @note If an application interrupt has happened since the last time sd_app_evt_wait was - * called this function will return immediately and not go to sleep. This is to avoid race - * conditions that can occur when a flag is updated in the interrupt handler and processed - * in the main loop. - * - * @post An application interrupt has happened or a interrupt pending flag is set. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_APP_EVT_WAIT, uint32_t, sd_app_evt_wait(void)); - -/**@brief Get PPI channel enable register contents. - * - * @param[out] p_channel_enable The contents of the PPI CHEN register. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_PPI_CHANNEL_ENABLE_GET, uint32_t, sd_ppi_channel_enable_get(uint32_t * p_channel_enable)); - -/**@brief Set PPI channel enable register. - * - * @param[in] channel_enable_set_msk Mask containing the bits to set in the PPI CHEN register. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_PPI_CHANNEL_ENABLE_SET, uint32_t, sd_ppi_channel_enable_set(uint32_t channel_enable_set_msk)); - -/**@brief Clear PPI channel enable register. - * - * @param[in] channel_enable_clr_msk Mask containing the bits to clear in the PPI CHEN register. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_PPI_CHANNEL_ENABLE_CLR, uint32_t, sd_ppi_channel_enable_clr(uint32_t channel_enable_clr_msk)); - -/**@brief Assign endpoints to a PPI channel. - * - * @param[in] channel_num Number of the PPI channel to assign. - * @param[in] evt_endpoint Event endpoint of the PPI channel. - * @param[in] task_endpoint Task endpoint of the PPI channel. - * - * @retval ::NRF_ERROR_SOC_PPI_INVALID_CHANNEL The channel number is invalid. - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_PPI_CHANNEL_ASSIGN, uint32_t, sd_ppi_channel_assign(uint8_t channel_num, const volatile void * evt_endpoint, const volatile void * task_endpoint)); - -/**@brief Task to enable a channel group. - * - * @param[in] group_num Number of the channel group. - * - * @retval ::NRF_ERROR_SOC_PPI_INVALID_GROUP The group number is invalid - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_PPI_GROUP_TASK_ENABLE, uint32_t, sd_ppi_group_task_enable(uint8_t group_num)); - -/**@brief Task to disable a channel group. - * - * @param[in] group_num Number of the PPI group. - * - * @retval ::NRF_ERROR_SOC_PPI_INVALID_GROUP The group number is invalid. - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_PPI_GROUP_TASK_DISABLE, uint32_t, sd_ppi_group_task_disable(uint8_t group_num)); - -/**@brief Assign PPI channels to a channel group. - * - * @param[in] group_num Number of the channel group. - * @param[in] channel_msk Mask of the channels to assign to the group. - * - * @retval ::NRF_ERROR_SOC_PPI_INVALID_GROUP The group number is invalid. - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_PPI_GROUP_ASSIGN, uint32_t, sd_ppi_group_assign(uint8_t group_num, uint32_t channel_msk)); - -/**@brief Gets the PPI channels of a channel group. - * - * @param[in] group_num Number of the channel group. - * @param[out] p_channel_msk Mask of the channels assigned to the group. - * - * @retval ::NRF_ERROR_SOC_PPI_INVALID_GROUP The group number is invalid. - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_PPI_GROUP_GET, uint32_t, sd_ppi_group_get(uint8_t group_num, uint32_t * p_channel_msk)); - -/**@brief Configures the Radio Notification signal. - * - * @note - * - The notification signal latency depends on the interrupt priority settings of SWI used - * for notification signal. - * - To ensure that the radio notification signal behaves in a consistent way, the radio - * notifications must be configured when there is no protocol stack or other SoftDevice - * activity in progress. It is recommended that the radio notification signal is - * configured directly after the SoftDevice has been enabled. - * - In the period between the ACTIVE signal and the start of the Radio Event, the SoftDevice - * will interrupt the application to do Radio Event preparation. - * - Using the Radio Notification feature may limit the bandwidth, as the SoftDevice may have - * to shorten the connection events to have time for the Radio Notification signals. - * - * @param[in] type Type of notification signal, see @ref NRF_RADIO_NOTIFICATION_TYPES. - * @ref NRF_RADIO_NOTIFICATION_TYPE_NONE shall be used to turn off radio - * notification. Using @ref NRF_RADIO_NOTIFICATION_DISTANCE_NONE is - * recommended (but not required) to be used with - * @ref NRF_RADIO_NOTIFICATION_TYPE_NONE. - * - * @param[in] distance Distance between the notification signal and start of radio activity, see @ref NRF_RADIO_NOTIFICATION_DISTANCES. - * This parameter is ignored when @ref NRF_RADIO_NOTIFICATION_TYPE_NONE or - * @ref NRF_RADIO_NOTIFICATION_TYPE_INT_ON_INACTIVE is used. - * - * @retval ::NRF_ERROR_INVALID_PARAM The group number is invalid. - * @retval ::NRF_ERROR_INVALID_STATE A protocol stack or other SoftDevice is running. Stop all - * running activities and retry. - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_RADIO_NOTIFICATION_CFG_SET, uint32_t, sd_radio_notification_cfg_set(uint8_t type, uint8_t distance)); - -/**@brief Encrypts a block according to the specified parameters. - * - * 128-bit AES encryption. - * - * @note: - * - The application may set the SEVONPEND bit in the SCR to 1 to make the SoftDevice sleep while - * the ECB is running. The SEVONPEND bit should only be cleared (set to 0) from application - * main or low interrupt level. - * - * @param[in, out] p_ecb_data Pointer to the ECB parameters' struct (two input - * parameters and one output parameter). - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_ECB_BLOCK_ENCRYPT, uint32_t, sd_ecb_block_encrypt(nrf_ecb_hal_data_t * p_ecb_data)); - -/**@brief Encrypts multiple data blocks provided as an array of data block structures. - * - * @details: Performs 128-bit AES encryption on multiple data blocks - * - * @note: - * - The application may set the SEVONPEND bit in the SCR to 1 to make the SoftDevice sleep while - * the ECB is running. The SEVONPEND bit should only be cleared (set to 0) from application - * main or low interrupt level. - * - * @param[in] block_count Count of blocks in the p_data_blocks array. - * @param[in,out] p_data_blocks Pointer to the first entry in a contiguous array of - * @ref nrf_ecb_hal_data_block_t structures. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_ECB_BLOCKS_ENCRYPT, uint32_t, sd_ecb_blocks_encrypt(uint8_t block_count, nrf_ecb_hal_data_block_t * p_data_blocks)); - -/**@brief Gets any pending events generated by the SoC API. - * - * The application should keep calling this function to get events, until ::NRF_ERROR_NOT_FOUND is returned. - * - * @param[out] p_evt_id Set to one of the values in @ref NRF_SOC_EVTS, if any events are pending. - * - * @retval ::NRF_SUCCESS An event was pending. The event id is written in the p_evt_id parameter. - * @retval ::NRF_ERROR_NOT_FOUND No pending events. - */ -SVCALL(SD_EVT_GET, uint32_t, sd_evt_get(uint32_t * p_evt_id)); - -/**@brief Get the temperature measured on the chip - * - * This function will block until the temperature measurement is done. - * It takes around 50 us from call to return. - * - * @param[out] p_temp Result of temperature measurement. Die temperature in 0.25 degrees Celsius. - * - * @retval ::NRF_SUCCESS A temperature measurement was done, and the temperature was written to temp - */ -SVCALL(SD_TEMP_GET, uint32_t, sd_temp_get(int32_t * p_temp)); - -/**@brief Flash Write -* -* Commands to write a buffer to flash -* -* If the SoftDevice is enabled: -* This call initiates the flash access command, and its completion will be communicated to the -* application with exactly one of the following events: -* - @ref NRF_EVT_FLASH_OPERATION_SUCCESS - The command was successfully completed. -* - @ref NRF_EVT_FLASH_OPERATION_ERROR - The command could not be started. -* -* If the SoftDevice is not enabled no event will be generated, and this call will return @ref NRF_SUCCESS when the - * write has been completed -* -* @note -* - This call takes control over the radio and the CPU during flash erase and write to make sure that -* they will not interfere with the flash access. This means that all interrupts will be blocked -* for a predictable time (depending on the NVMC specification in the device's Product Specification -* and the command parameters). -* - The data in the p_src buffer should not be modified before the @ref NRF_EVT_FLASH_OPERATION_SUCCESS -* or the @ref NRF_EVT_FLASH_OPERATION_ERROR have been received if the SoftDevice is enabled. -* - This call will make the SoftDevice trigger a hardfault when the page is written, if it is -* protected. -* -* -* @param[in] p_dst Pointer to start of flash location to be written. -* @param[in] p_src Pointer to buffer with data to be written. -* @param[in] size Number of 32-bit words to write. Maximum size is the number of words in one -* flash page. See the device's Product Specification for details. -* -* @retval ::NRF_ERROR_INVALID_ADDR Tried to write to a non existing flash address, or p_dst or p_src was unaligned. -* @retval ::NRF_ERROR_BUSY The previous command has not yet completed. -* @retval ::NRF_ERROR_INVALID_LENGTH Size was 0, or higher than the maximum allowed size. -* @retval ::NRF_ERROR_FORBIDDEN Tried to write to an address outside the application flash area. -* @retval ::NRF_SUCCESS The command was accepted. -*/ -SVCALL(SD_FLASH_WRITE, uint32_t, sd_flash_write(uint32_t * p_dst, uint32_t const * p_src, uint32_t size)); - - -/**@brief Flash Erase page -* -* Commands to erase a flash page -* If the SoftDevice is enabled: -* This call initiates the flash access command, and its completion will be communicated to the -* application with exactly one of the following events: -* - @ref NRF_EVT_FLASH_OPERATION_SUCCESS - The command was successfully completed. -* - @ref NRF_EVT_FLASH_OPERATION_ERROR - The command could not be started. -* -* If the SoftDevice is not enabled no event will be generated, and this call will return @ref NRF_SUCCESS when the -* erase has been completed -* -* @note -* - This call takes control over the radio and the CPU during flash erase and write to make sure that -* they will not interfere with the flash access. This means that all interrupts will be blocked -* for a predictable time (depending on the NVMC specification in the device's Product Specification -* and the command parameters). -* - This call will make the SoftDevice trigger a hardfault when the page is erased, if it is -* protected. -* -* -* @param[in] page_number Page number of the page to erase -* -* @retval ::NRF_ERROR_INTERNAL If a new session could not be opened due to an internal error. -* @retval ::NRF_ERROR_INVALID_ADDR Tried to erase to a non existing flash page. -* @retval ::NRF_ERROR_BUSY The previous command has not yet completed. -* @retval ::NRF_ERROR_FORBIDDEN Tried to erase a page outside the application flash area. -* @retval ::NRF_SUCCESS The command was accepted. -*/ -SVCALL(SD_FLASH_PAGE_ERASE, uint32_t, sd_flash_page_erase(uint32_t page_number)); - - - -/**@brief Opens a session for radio timeslot requests. - * - * @note Only one session can be open at a time. - * @note p_radio_signal_callback(@ref NRF_RADIO_CALLBACK_SIGNAL_TYPE_START) will be called when the radio timeslot - * starts. From this point the NRF_RADIO and NRF_TIMER0 peripherals can be freely accessed - * by the application. - * @note p_radio_signal_callback(@ref NRF_RADIO_CALLBACK_SIGNAL_TYPE_TIMER0) is called whenever the NRF_TIMER0 - * interrupt occurs. - * @note p_radio_signal_callback(@ref NRF_RADIO_CALLBACK_SIGNAL_TYPE_RADIO) is called whenever the NRF_RADIO - * interrupt occurs. - * @note p_radio_signal_callback() will be called at ARM interrupt priority level 0. This - * implies that none of the sd_* API calls can be used from p_radio_signal_callback(). - * - * @param[in] p_radio_signal_callback The signal callback. - * - * @retval ::NRF_ERROR_INVALID_ADDR p_radio_signal_callback is an invalid function pointer. - * @retval ::NRF_ERROR_BUSY If session cannot be opened. - * @retval ::NRF_ERROR_INTERNAL If a new session could not be opened due to an internal error. - * @retval ::NRF_SUCCESS Otherwise. - */ - SVCALL(SD_RADIO_SESSION_OPEN, uint32_t, sd_radio_session_open(nrf_radio_signal_callback_t p_radio_signal_callback)); - -/**@brief Closes a session for radio timeslot requests. - * - * @note Any current radio timeslot will be finished before the session is closed. - * @note If a radio timeslot is scheduled when the session is closed, it will be canceled. - * @note The application cannot consider the session closed until the @ref NRF_EVT_RADIO_SESSION_CLOSED - * event is received. - * - * @retval ::NRF_ERROR_FORBIDDEN If session not opened. - * @retval ::NRF_ERROR_BUSY If session is currently being closed. - * @retval ::NRF_SUCCESS Otherwise. - */ - SVCALL(SD_RADIO_SESSION_CLOSE, uint32_t, sd_radio_session_close(void)); - -/**@brief Requests a radio timeslot. - * - * @note The request type is determined by p_request->request_type, and can be one of @ref NRF_RADIO_REQ_TYPE_EARLIEST - * and @ref NRF_RADIO_REQ_TYPE_NORMAL. The first request in a session must always be of type @ref NRF_RADIO_REQ_TYPE_EARLIEST. - * @note For a normal request (@ref NRF_RADIO_REQ_TYPE_NORMAL), the start time of a radio timeslot is specified by - * p_request->distance_us and is given relative to the start of the previous timeslot. - * @note A too small p_request->distance_us will lead to a @ref NRF_EVT_RADIO_BLOCKED event. - * @note Timeslots scheduled too close will lead to a @ref NRF_EVT_RADIO_BLOCKED event. - * @note See the SoftDevice Specification for more on radio timeslot scheduling, distances and lengths. - * @note If an opportunity for the first radio timeslot is not found before 100 ms after the call to this - * function, it is not scheduled, and instead a @ref NRF_EVT_RADIO_BLOCKED event is sent. - * The application may then try to schedule the first radio timeslot again. - * @note Successful requests will result in nrf_radio_signal_callback_t(@ref NRF_RADIO_CALLBACK_SIGNAL_TYPE_START). - * Unsuccessful requests will result in a @ref NRF_EVT_RADIO_BLOCKED event, see @ref NRF_SOC_EVTS. - * @note The jitter in the start time of the radio timeslots is +/- @ref NRF_RADIO_START_JITTER_US us. - * @note The nrf_radio_signal_callback_t(@ref NRF_RADIO_CALLBACK_SIGNAL_TYPE_START) call has a latency relative to the - * specified radio timeslot start, but this does not affect the actual start time of the timeslot. - * @note NRF_TIMER0 is reset at the start of the radio timeslot, and is clocked at 1MHz from the high frequency - * (16 MHz) clock source. If p_request->hfclk_force_xtal is true, the high frequency clock is - * guaranteed to be clocked from the external crystal. - * @note The SoftDevice will neither access the NRF_RADIO peripheral nor the NRF_TIMER0 peripheral - * during the radio timeslot. - * - * @param[in] p_request Pointer to the request parameters. - * - * @retval ::NRF_ERROR_FORBIDDEN If session not opened or the session is not IDLE. - * @retval ::NRF_ERROR_INVALID_ADDR If the p_request pointer is invalid. - * @retval ::NRF_ERROR_INVALID_PARAM If the parameters of p_request are not valid. - * @retval ::NRF_SUCCESS Otherwise. - */ - SVCALL(SD_RADIO_REQUEST, uint32_t, sd_radio_request(nrf_radio_request_t const * p_request)); - -/**@brief Write register protected by the SoftDevice - * - * This function writes to a register that is write-protected by the SoftDevice. Please refer to your - * SoftDevice Specification for more details about which registers that are protected by SoftDevice. - * This function can write to the following protected peripheral: - * - ACL - * - * @note Protected registers may be read directly. - * @note Register that are write-once will return @ref NRF_SUCCESS on second set, even the value in - * the register has not changed. See the Product Specification for more details about register - * properties. - * - * @param[in] p_register Pointer to register to be written. - * @param[in] value Value to be written to the register. - * - * @retval ::NRF_ERROR_INVALID_ADDR This function can not write to the reguested register. - * @retval ::NRF_SUCCESS Value successfully written to register. - * - */ -SVCALL(SD_PROTECTED_REGISTER_WRITE, uint32_t, sd_protected_register_write(volatile uint32_t * p_register, uint32_t value)); - -/**@} */ - -#ifdef __cplusplus -} -#endif -#endif // NRF_SOC_H__ - -/**@} */ diff --git a/lib/nrf52/include/nrf_svc.h b/lib/nrf52/include/nrf_svc.h deleted file mode 100644 index 292c6929..00000000 --- a/lib/nrf52/include/nrf_svc.h +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef NRF_SVC__ -#define NRF_SVC__ - -#include "stdint.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef SVCALL_AS_NORMAL_FUNCTION -#define SVCALL(number, return_type, signature) return_type signature -#else - -#ifndef SVCALL -#if defined (__CC_ARM) -#define SVCALL(number, return_type, signature) return_type __svc(number) signature -#elif defined (__GNUC__) -#ifdef __cplusplus -#define GCC_CAST_CPP (uint16_t) -#else -#define GCC_CAST_CPP -#endif -#define SVCALL(number, return_type, signature) \ - _Pragma("GCC diagnostic push") \ - _Pragma("GCC diagnostic ignored \"-Wreturn-type\"") \ - __attribute__((naked)) \ - __attribute__((unused)) \ - static return_type signature \ - { \ - __asm( \ - "svc %0\n" \ - "bx r14" : : "I" (GCC_CAST_CPP number) : "r0" \ - ); \ - } \ - _Pragma("GCC diagnostic pop") - -#elif defined (__ICCARM__) -#define PRAGMA(x) _Pragma(#x) -#define SVCALL(number, return_type, signature) \ -PRAGMA(swi_number = (number)) \ - __swi return_type signature; -#else -#define SVCALL(number, return_type, signature) return_type signature -#endif -#endif // SVCALL - -#endif // SVCALL_AS_NORMAL_FUNCTION - -#ifdef __cplusplus -} -#endif -#endif // NRF_SVC__ diff --git a/lib/nrf52/s140_nrf52_7.3.0_API/include/ble.h b/lib/nrf52/s140_nrf52_7.3.0_API/include/ble.h deleted file mode 100755 index bc8effc4..00000000 --- a/lib/nrf52/s140_nrf52_7.3.0_API/include/ble.h +++ /dev/null @@ -1,679 +0,0 @@ -/* - * Copyright (c) Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - @addtogroup BLE_COMMON BLE SoftDevice Common - @{ - @defgroup ble_api Events, type definitions and API calls - @{ - - @brief Module independent events, type definitions and API calls for the BLE SoftDevice. - - */ - -#ifndef BLE_H__ -#define BLE_H__ - -#include -#include "nrf_svc.h" -#include "nrf_error.h" -#include "ble_err.h" -#include "ble_gap.h" -#include "ble_l2cap.h" -#include "ble_gatt.h" -#include "ble_gattc.h" -#include "ble_gatts.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** @addtogroup BLE_COMMON_ENUMERATIONS Enumerations - * @{ */ - -/** - * @brief Common API SVC numbers. - */ -enum BLE_COMMON_SVCS -{ - SD_BLE_ENABLE = BLE_SVC_BASE, /**< Enable and initialize the BLE stack */ - SD_BLE_EVT_GET, /**< Get an event from the pending events queue. */ - SD_BLE_UUID_VS_ADD, /**< Add a Vendor Specific base UUID. */ - SD_BLE_UUID_DECODE, /**< Decode UUID bytes. */ - SD_BLE_UUID_ENCODE, /**< Encode UUID bytes. */ - SD_BLE_VERSION_GET, /**< Get the local version information (company ID, Link Layer Version, Link Layer Subversion). */ - SD_BLE_USER_MEM_REPLY, /**< User Memory Reply. */ - SD_BLE_OPT_SET, /**< Set a BLE option. */ - SD_BLE_OPT_GET, /**< Get a BLE option. */ - SD_BLE_CFG_SET, /**< Add a configuration to the BLE stack. */ - SD_BLE_UUID_VS_REMOVE, /**< Remove a Vendor Specific base UUID. */ -}; - -/** - * @brief BLE Module Independent Event IDs. - */ -enum BLE_COMMON_EVTS -{ - BLE_EVT_USER_MEM_REQUEST = BLE_EVT_BASE + 0, /**< User Memory request. See @ref ble_evt_user_mem_request_t - \n Reply with @ref sd_ble_user_mem_reply. */ - BLE_EVT_USER_MEM_RELEASE = BLE_EVT_BASE + 1, /**< User Memory release. See @ref ble_evt_user_mem_release_t */ -}; - -/**@brief BLE Connection Configuration IDs. - * - * IDs that uniquely identify a connection configuration. - */ -enum BLE_CONN_CFGS -{ - BLE_CONN_CFG_GAP = BLE_CONN_CFG_BASE + 0, /**< BLE GAP specific connection configuration. */ - BLE_CONN_CFG_GATTC = BLE_CONN_CFG_BASE + 1, /**< BLE GATTC specific connection configuration. */ - BLE_CONN_CFG_GATTS = BLE_CONN_CFG_BASE + 2, /**< BLE GATTS specific connection configuration. */ - BLE_CONN_CFG_GATT = BLE_CONN_CFG_BASE + 3, /**< BLE GATT specific connection configuration. */ - BLE_CONN_CFG_L2CAP = BLE_CONN_CFG_BASE + 4, /**< BLE L2CAP specific connection configuration. */ -}; - -/**@brief BLE Common Configuration IDs. - * - * IDs that uniquely identify a common configuration. - */ -enum BLE_COMMON_CFGS -{ - BLE_COMMON_CFG_VS_UUID = BLE_CFG_BASE, /**< Vendor specific base UUID configuration */ -}; - -/**@brief Common Option IDs. - * IDs that uniquely identify a common option. - */ -enum BLE_COMMON_OPTS -{ - BLE_COMMON_OPT_PA_LNA = BLE_OPT_BASE + 0, /**< PA and LNA options */ - BLE_COMMON_OPT_CONN_EVT_EXT = BLE_OPT_BASE + 1, /**< Extended connection events option */ - BLE_COMMON_OPT_EXTENDED_RC_CAL = BLE_OPT_BASE + 2, /**< Extended RC calibration option */ -}; - -/** @} */ - -/** @addtogroup BLE_COMMON_DEFINES Defines - * @{ */ - -/** @brief Required pointer alignment for BLE Events. -*/ -#define BLE_EVT_PTR_ALIGNMENT 4 - -/** @brief Leaves the maximum of the two arguments. -*/ -#define BLE_MAX(a, b) ((a) < (b) ? (b) : (a)) - -/** @brief Maximum possible length for BLE Events. - * @note The highest value used for @ref ble_gatt_conn_cfg_t::att_mtu in any connection configuration shall be used as a parameter. - * If that value has not been configured for any connections then @ref BLE_GATT_ATT_MTU_DEFAULT must be used instead. -*/ -#define BLE_EVT_LEN_MAX(ATT_MTU) ( \ - offsetof(ble_evt_t, evt.gattc_evt.params.prim_srvc_disc_rsp.services) + ((ATT_MTU) - 1) / 4 * sizeof(ble_gattc_service_t) \ -) - -/** @defgroup BLE_USER_MEM_TYPES User Memory Types - * @{ */ -#define BLE_USER_MEM_TYPE_INVALID 0x00 /**< Invalid User Memory Types. */ -#define BLE_USER_MEM_TYPE_GATTS_QUEUED_WRITES 0x01 /**< User Memory for GATTS queued writes. */ -/** @} */ - -/** @defgroup BLE_UUID_VS_COUNTS Vendor Specific base UUID counts - * @{ - */ -#define BLE_UUID_VS_COUNT_DEFAULT 10 /**< Default VS UUID count. */ -#define BLE_UUID_VS_COUNT_MAX 254 /**< Maximum VS UUID count. */ -/** @} */ - -/** @defgroup BLE_COMMON_CFG_DEFAULTS Configuration defaults. - * @{ - */ -#define BLE_CONN_CFG_TAG_DEFAULT 0 /**< Default configuration tag, SoftDevice default connection configuration. */ - -/** @} */ - -/** @} */ - -/** @addtogroup BLE_COMMON_STRUCTURES Structures - * @{ */ - -/**@brief User Memory Block. */ -typedef struct -{ - uint8_t *p_mem; /**< Pointer to the start of the user memory block. */ - uint16_t len; /**< Length in bytes of the user memory block. */ -} ble_user_mem_block_t; - -/**@brief Event structure for @ref BLE_EVT_USER_MEM_REQUEST. */ -typedef struct -{ - uint8_t type; /**< User memory type, see @ref BLE_USER_MEM_TYPES. */ -} ble_evt_user_mem_request_t; - -/**@brief Event structure for @ref BLE_EVT_USER_MEM_RELEASE. */ -typedef struct -{ - uint8_t type; /**< User memory type, see @ref BLE_USER_MEM_TYPES. */ - ble_user_mem_block_t mem_block; /**< User memory block */ -} ble_evt_user_mem_release_t; - -/**@brief Event structure for events not associated with a specific function module. */ -typedef struct -{ - uint16_t conn_handle; /**< Connection Handle on which this event occurred. */ - union - { - ble_evt_user_mem_request_t user_mem_request; /**< User Memory Request Event Parameters. */ - ble_evt_user_mem_release_t user_mem_release; /**< User Memory Release Event Parameters. */ - } params; /**< Event parameter union. */ -} ble_common_evt_t; - -/**@brief BLE Event header. */ -typedef struct -{ - uint16_t evt_id; /**< Value from a BLE__EVT series. */ - uint16_t evt_len; /**< Length in octets including this header. */ -} ble_evt_hdr_t; - -/**@brief Common BLE Event type, wrapping the module specific event reports. */ -typedef struct -{ - ble_evt_hdr_t header; /**< Event header. */ - union - { - ble_common_evt_t common_evt; /**< Common Event, evt_id in BLE_EVT_* series. */ - ble_gap_evt_t gap_evt; /**< GAP originated event, evt_id in BLE_GAP_EVT_* series. */ - ble_gattc_evt_t gattc_evt; /**< GATT client originated event, evt_id in BLE_GATTC_EVT* series. */ - ble_gatts_evt_t gatts_evt; /**< GATT server originated event, evt_id in BLE_GATTS_EVT* series. */ - ble_l2cap_evt_t l2cap_evt; /**< L2CAP originated event, evt_id in BLE_L2CAP_EVT* series. */ - } evt; /**< Event union. */ -} ble_evt_t; - - -/** - * @brief Version Information. - */ -typedef struct -{ - uint8_t version_number; /**< Link Layer Version number. See https://www.bluetooth.org/en-us/specification/assigned-numbers/link-layer for assigned values. */ - uint16_t company_id; /**< Company ID, Nordic Semiconductor's company ID is 89 (0x0059) (https://www.bluetooth.org/apps/content/Default.aspx?doc_id=49708). */ - uint16_t subversion_number; /**< Link Layer Sub Version number, corresponds to the SoftDevice Config ID or Firmware ID (FWID). */ -} ble_version_t; - -/** - * @brief Configuration parameters for the PA and LNA. - */ -typedef struct -{ - uint8_t enable :1; /**< Enable toggling for this amplifier */ - uint8_t active_high :1; /**< Set the pin to be active high */ - uint8_t gpio_pin :6; /**< The GPIO pin to toggle for this amplifier */ -} ble_pa_lna_cfg_t; - -/** - * @brief PA & LNA GPIO toggle configuration - * - * This option configures the SoftDevice to toggle pins when the radio is active for use with a power amplifier and/or - * a low noise amplifier. - * - * Toggling the pins is achieved by using two PPI channels and a GPIOTE channel. The hardware channel IDs are provided - * by the application and should be regarded as reserved as long as any PA/LNA toggling is enabled. - * - * @note @ref sd_ble_opt_get is not supported for this option. - * @note Setting this option while the radio is in use (i.e. any of the roles are active) may have undefined consequences - * and must be avoided by the application. - */ -typedef struct -{ - ble_pa_lna_cfg_t pa_cfg; /**< Power Amplifier configuration */ - ble_pa_lna_cfg_t lna_cfg; /**< Low Noise Amplifier configuration */ - - uint8_t ppi_ch_id_set; /**< PPI channel used for radio pin setting */ - uint8_t ppi_ch_id_clr; /**< PPI channel used for radio pin clearing */ - uint8_t gpiote_ch_id; /**< GPIOTE channel used for radio pin toggling */ -} ble_common_opt_pa_lna_t; - -/** - * @brief Configuration of extended BLE connection events. - * - * When enabled the SoftDevice will dynamically extend the connection event when possible. - * - * The connection event length is controlled by the connection configuration as set by @ref ble_gap_conn_cfg_t::event_length. - * The connection event can be extended if there is time to send another packet pair before the start of the next connection interval, - * and if there are no conflicts with other BLE roles requesting radio time. - * - * @note @ref sd_ble_opt_get is not supported for this option. - */ -typedef struct -{ - uint8_t enable : 1; /**< Enable extended BLE connection events, disabled by default. */ -} ble_common_opt_conn_evt_ext_t; - -/** - * @brief Enable/disable extended RC calibration. - * - * If extended RC calibration is enabled and the internal RC oscillator (@ref NRF_CLOCK_LF_SRC_RC) is used as the SoftDevice - * LFCLK source, the SoftDevice as a peripheral will by default try to increase the receive window if two consecutive packets - * are not received. If it turns out that the packets were not received due to clock drift, the RC calibration is started. - * This calibration comes in addition to the periodic calibration that is configured by @ref sd_softdevice_enable(). When - * using only peripheral connections, the periodic calibration can therefore be configured with a much longer interval as the - * peripheral will be able to detect and adjust automatically to clock drift, and calibrate on demand. - * - * If extended RC calibration is disabled and the internal RC oscillator is used as the SoftDevice LFCLK source, the - * RC oscillator is calibrated periodically as configured by @ref sd_softdevice_enable(). - * - * @note @ref sd_ble_opt_get is not supported for this option. - */ -typedef struct -{ - uint8_t enable : 1; /**< Enable extended RC calibration, enabled by default. */ -} ble_common_opt_extended_rc_cal_t; - -/**@brief Option structure for common options. */ -typedef union -{ - ble_common_opt_pa_lna_t pa_lna; /**< Parameters for controlling PA and LNA pin toggling. */ - ble_common_opt_conn_evt_ext_t conn_evt_ext; /**< Parameters for enabling extended connection events. */ - ble_common_opt_extended_rc_cal_t extended_rc_cal; /**< Parameters for enabling extended RC calibration. */ -} ble_common_opt_t; - -/**@brief Common BLE Option type, wrapping the module specific options. */ -typedef union -{ - ble_common_opt_t common_opt; /**< COMMON options, opt_id in @ref BLE_COMMON_OPTS series. */ - ble_gap_opt_t gap_opt; /**< GAP option, opt_id in @ref BLE_GAP_OPTS series. */ - ble_gattc_opt_t gattc_opt; /**< GATTC option, opt_id in @ref BLE_GATTC_OPTS series. */ -} ble_opt_t; - -/**@brief BLE connection configuration type, wrapping the module specific configurations, set with - * @ref sd_ble_cfg_set. - * - * @note Connection configurations don't have to be set. - * In the case that no configurations has been set, or fewer connection configurations has been set than enabled connections, - * the default connection configuration will be automatically added for the remaining connections. - * When creating connections with the default configuration, @ref BLE_CONN_CFG_TAG_DEFAULT should be used in - * place of @ref ble_conn_cfg_t::conn_cfg_tag. - * - * @sa sd_ble_gap_adv_start() - * @sa sd_ble_gap_connect() - * - * @mscs - * @mmsc{@ref BLE_CONN_CFG} - * @endmscs - - */ -typedef struct -{ - uint8_t conn_cfg_tag; /**< The application chosen tag it can use with the - @ref sd_ble_gap_adv_start() and @ref sd_ble_gap_connect() calls - to select this configuration when creating a connection. - Must be different for all connection configurations added and not @ref BLE_CONN_CFG_TAG_DEFAULT. */ - union { - ble_gap_conn_cfg_t gap_conn_cfg; /**< GAP connection configuration, cfg_id is @ref BLE_CONN_CFG_GAP. */ - ble_gattc_conn_cfg_t gattc_conn_cfg; /**< GATTC connection configuration, cfg_id is @ref BLE_CONN_CFG_GATTC. */ - ble_gatts_conn_cfg_t gatts_conn_cfg; /**< GATTS connection configuration, cfg_id is @ref BLE_CONN_CFG_GATTS. */ - ble_gatt_conn_cfg_t gatt_conn_cfg; /**< GATT connection configuration, cfg_id is @ref BLE_CONN_CFG_GATT. */ - ble_l2cap_conn_cfg_t l2cap_conn_cfg; /**< L2CAP connection configuration, cfg_id is @ref BLE_CONN_CFG_L2CAP. */ - } params; /**< Connection configuration union. */ -} ble_conn_cfg_t; - -/** - * @brief Configuration of Vendor Specific base UUIDs, set with @ref sd_ble_cfg_set. - * - * @retval ::NRF_ERROR_INVALID_PARAM Too many UUIDs configured. - */ -typedef struct -{ - uint8_t vs_uuid_count; /**< Number of 128-bit Vendor Specific base UUID bases to allocate memory for. - Default value is @ref BLE_UUID_VS_COUNT_DEFAULT. Maximum value is - @ref BLE_UUID_VS_COUNT_MAX. */ -} ble_common_cfg_vs_uuid_t; - -/**@brief Common BLE Configuration type, wrapping the common configurations. */ -typedef union -{ - ble_common_cfg_vs_uuid_t vs_uuid_cfg; /**< Vendor Specific base UUID configuration, cfg_id is @ref BLE_COMMON_CFG_VS_UUID. */ -} ble_common_cfg_t; - -/**@brief BLE Configuration type, wrapping the module specific configurations. */ -typedef union -{ - ble_conn_cfg_t conn_cfg; /**< Connection specific configurations, cfg_id in @ref BLE_CONN_CFGS series. */ - ble_common_cfg_t common_cfg; /**< Global common configurations, cfg_id in @ref BLE_COMMON_CFGS series. */ - ble_gap_cfg_t gap_cfg; /**< Global GAP configurations, cfg_id in @ref BLE_GAP_CFGS series. */ - ble_gatts_cfg_t gatts_cfg; /**< Global GATTS configuration, cfg_id in @ref BLE_GATTS_CFGS series. */ -} ble_cfg_t; - -/** @} */ - -/** @addtogroup BLE_COMMON_FUNCTIONS Functions - * @{ */ - -/**@brief Enable the BLE stack - * - * @param[in, out] p_app_ram_base Pointer to a variable containing the start address of the - * application RAM region (APP_RAM_BASE). On return, this will - * contain the minimum start address of the application RAM region - * required by the SoftDevice for this configuration. - * @warning After this call, the SoftDevice may generate several events. The list of events provided - * below require the application to initiate a SoftDevice API call. The corresponding API call - * is referenced in the event documentation. - * If the application fails to do so, the BLE connection may timeout, or the SoftDevice may stop - * communicating with the peer device. - * - @ref BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST - * - @ref BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST - * - @ref BLE_GAP_EVT_PHY_UPDATE_REQUEST - * - @ref BLE_GAP_EVT_SEC_PARAMS_REQUEST - * - @ref BLE_GAP_EVT_SEC_INFO_REQUEST - * - @ref BLE_GAP_EVT_SEC_REQUEST - * - @ref BLE_GAP_EVT_AUTH_KEY_REQUEST - * - @ref BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST - * - @ref BLE_EVT_USER_MEM_REQUEST - * - @ref BLE_L2CAP_EVT_CH_SETUP_REQUEST - * - * @note The memory requirement for a specific configuration will not increase between SoftDevices - * with the same major version number. - * - * @note At runtime the IC's RAM is split into 2 regions: The SoftDevice RAM region is located - * between 0x20000000 and APP_RAM_BASE-1 and the application's RAM region is located between - * APP_RAM_BASE and the start of the call stack. - * - * @details This call initializes the BLE stack, no BLE related function other than @ref - * sd_ble_cfg_set can be called before this one. - * - * @mscs - * @mmsc{@ref BLE_COMMON_ENABLE} - * @endmscs - * - * @retval ::NRF_SUCCESS The BLE stack has been initialized successfully. - * @retval ::NRF_ERROR_INVALID_STATE The BLE stack had already been initialized and cannot be reinitialized. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid or not sufficiently aligned pointer supplied. - * @retval ::NRF_ERROR_NO_MEM One or more of the following is true: - * - The amount of memory assigned to the SoftDevice by *p_app_ram_base is not - * large enough to fit this configuration's memory requirement. Check *p_app_ram_base - * and set the start address of the application RAM region accordingly. - * - Dynamic part of the SoftDevice RAM region is larger then 64 kB which - * is currently not supported. - * @retval ::NRF_ERROR_RESOURCES The total number of L2CAP Channels configured using @ref sd_ble_cfg_set is too large. - */ -SVCALL(SD_BLE_ENABLE, uint32_t, sd_ble_enable(uint32_t * p_app_ram_base)); - -/**@brief Add configurations for the BLE stack - * - * @param[in] cfg_id Config ID, see @ref BLE_CONN_CFGS, @ref BLE_COMMON_CFGS, @ref - * BLE_GAP_CFGS or @ref BLE_GATTS_CFGS. - * @param[in] p_cfg Pointer to a ble_cfg_t structure containing the configuration value. - * @param[in] app_ram_base The start address of the application RAM region (APP_RAM_BASE). - * See @ref sd_ble_enable for details about APP_RAM_BASE. - * - * @note The memory requirement for a specific configuration will not increase between SoftDevices - * with the same major version number. - * - * @note If a configuration is set more than once, the last one set is the one that takes effect on - * @ref sd_ble_enable. - * - * @note Any part of the BLE stack that is NOT configured with @ref sd_ble_cfg_set will have default - * configuration. - * - * @note @ref sd_ble_cfg_set may be called at any time when the SoftDevice is enabled (see @ref - * sd_softdevice_enable) while the BLE part of the SoftDevice is not enabled (see @ref - * sd_ble_enable). - * - * @note Error codes for the configurations are described in the configuration structs. - * - * @mscs - * @mmsc{@ref BLE_COMMON_ENABLE} - * @endmscs - * - * @retval ::NRF_SUCCESS The configuration has been added successfully. - * @retval ::NRF_ERROR_INVALID_STATE The BLE stack had already been initialized. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid or not sufficiently aligned pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid cfg_id supplied. - * @retval ::NRF_ERROR_NO_MEM The amount of memory assigned to the SoftDevice by app_ram_base is not - * large enough to fit this configuration's memory requirement. - */ -SVCALL(SD_BLE_CFG_SET, uint32_t, sd_ble_cfg_set(uint32_t cfg_id, ble_cfg_t const * p_cfg, uint32_t app_ram_base)); - -/**@brief Get an event from the pending events queue. - * - * @param[out] p_dest Pointer to buffer to be filled in with an event, or NULL to retrieve the event length. - * This buffer must be aligned to the extend defined by @ref BLE_EVT_PTR_ALIGNMENT. - * The buffer should be interpreted as a @ref ble_evt_t struct. - * @param[in, out] p_len Pointer the length of the buffer, on return it is filled with the event length. - * - * @details This call allows the application to pull a BLE event from the BLE stack. The application is signaled that - * an event is available from the BLE stack by the triggering of the SD_EVT_IRQn interrupt. - * The application is free to choose whether to call this function from thread mode (main context) or directly from the - * Interrupt Service Routine that maps to SD_EVT_IRQn. In any case however, and because the BLE stack runs at a higher - * priority than the application, this function should be called in a loop (until @ref NRF_ERROR_NOT_FOUND is returned) - * every time SD_EVT_IRQn is raised to ensure that all available events are pulled from the BLE stack. Failure to do so - * could potentially leave events in the internal queue without the application being aware of this fact. - * - * Sizing the p_dest buffer is equally important, since the application needs to provide all the memory necessary for the event to - * be copied into application memory. If the buffer provided is not large enough to fit the entire contents of the event, - * @ref NRF_ERROR_DATA_SIZE will be returned and the application can then call again with a larger buffer size. - * The maximum possible event length is defined by @ref BLE_EVT_LEN_MAX. The application may also "peek" the event length - * by providing p_dest as a NULL pointer and inspecting the value of *p_len upon return: - * - * \code - * uint16_t len; - * errcode = sd_ble_evt_get(NULL, &len); - * \endcode - * - * @mscs - * @mmsc{@ref BLE_COMMON_IRQ_EVT_MSC} - * @mmsc{@ref BLE_COMMON_THREAD_EVT_MSC} - * @endmscs - * - * @retval ::NRF_SUCCESS Event pulled and stored into the supplied buffer. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid or not sufficiently aligned pointer supplied. - * @retval ::NRF_ERROR_NOT_FOUND No events ready to be pulled. - * @retval ::NRF_ERROR_DATA_SIZE Event ready but could not fit into the supplied buffer. - */ -SVCALL(SD_BLE_EVT_GET, uint32_t, sd_ble_evt_get(uint8_t *p_dest, uint16_t *p_len)); - - -/**@brief Add a Vendor Specific base UUID. - * - * @details This call enables the application to add a Vendor Specific base UUID to the BLE stack's table, for later - * use with all other modules and APIs. This then allows the application to use the shorter, 24-bit @ref ble_uuid_t - * format when dealing with both 16-bit and 128-bit UUIDs without having to check for lengths and having split code - * paths. This is accomplished by extending the grouping mechanism that the Bluetooth SIG standard base UUID uses - * for all other 128-bit UUIDs. The type field in the @ref ble_uuid_t structure is an index (relative to - * @ref BLE_UUID_TYPE_VENDOR_BEGIN) to the table populated by multiple calls to this function, and the UUID field - * in the same structure contains the 2 bytes at indexes 12 and 13. The number of possible 128-bit UUIDs available to - * the application is therefore the number of Vendor Specific UUIDs added with the help of this function times 65536, - * although restricted to modifying bytes 12 and 13 for each of the entries in the supplied array. - * - * @note Bytes 12 and 13 of the provided UUID will not be used internally, since those are always replaced by - * the 16-bit uuid field in @ref ble_uuid_t. - * - * @note If a UUID is already present in the BLE stack's internal table, the corresponding index will be returned in - * p_uuid_type along with an @ref NRF_SUCCESS error code. - * - * @param[in] p_vs_uuid Pointer to a 16-octet (128-bit) little endian Vendor Specific base UUID disregarding - * bytes 12 and 13. - * @param[out] p_uuid_type Pointer to a uint8_t where the type field in @ref ble_uuid_t corresponding to this UUID will be stored. - * - * @retval ::NRF_SUCCESS Successfully added the Vendor Specific base UUID. - * @retval ::NRF_ERROR_INVALID_ADDR If p_vs_uuid or p_uuid_type is NULL or invalid. - * @retval ::NRF_ERROR_NO_MEM If there are no more free slots for VS UUIDs. - */ -SVCALL(SD_BLE_UUID_VS_ADD, uint32_t, sd_ble_uuid_vs_add(ble_uuid128_t const *p_vs_uuid, uint8_t *p_uuid_type)); - - -/**@brief Remove a Vendor Specific base UUID. - * - * @details This call removes a Vendor Specific base UUID. This function allows - * the application to reuse memory allocated for Vendor Specific base UUIDs. - * - * @note Currently this function can only be called with a p_uuid_type set to @ref BLE_UUID_TYPE_UNKNOWN or the last added UUID type. - * - * @param[inout] p_uuid_type Pointer to a uint8_t where its value matches the UUID type in @ref ble_uuid_t::type to be removed. - * If the type is set to @ref BLE_UUID_TYPE_UNKNOWN, or the pointer is NULL, the last Vendor Specific - * base UUID will be removed. If the function returns successfully, the UUID type that was removed will - * be written back to @p p_uuid_type. If function returns with a failure, it contains the last type that - * is in use by the ATT Server. - * - * @retval ::NRF_SUCCESS Successfully removed the Vendor Specific base UUID. - * @retval ::NRF_ERROR_INVALID_ADDR If p_uuid_type is invalid. - * @retval ::NRF_ERROR_INVALID_PARAM If p_uuid_type points to a non-valid UUID type. - * @retval ::NRF_ERROR_FORBIDDEN If the Vendor Specific base UUID is in use by the ATT Server. - */ -SVCALL(SD_BLE_UUID_VS_REMOVE, uint32_t, sd_ble_uuid_vs_remove(uint8_t *p_uuid_type)); - - -/** @brief Decode little endian raw UUID bytes (16-bit or 128-bit) into a 24 bit @ref ble_uuid_t structure. - * - * @details The raw UUID bytes excluding bytes 12 and 13 (i.e. bytes 0-11 and 14-15) of p_uuid_le are compared - * to the corresponding ones in each entry of the table of Vendor Specific base UUIDs - * to look for a match. If there is such a match, bytes 12 and 13 are returned as p_uuid->uuid and the index - * relative to @ref BLE_UUID_TYPE_VENDOR_BEGIN as p_uuid->type. - * - * @note If the UUID length supplied is 2, then the type set by this call will always be @ref BLE_UUID_TYPE_BLE. - * - * @param[in] uuid_le_len Length in bytes of the buffer pointed to by p_uuid_le (must be 2 or 16 bytes). - * @param[in] p_uuid_le Pointer pointing to little endian raw UUID bytes. - * @param[out] p_uuid Pointer to a @ref ble_uuid_t structure to be filled in. - * - * @retval ::NRF_SUCCESS Successfully decoded into the @ref ble_uuid_t structure. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_LENGTH Invalid UUID length. - * @retval ::NRF_ERROR_NOT_FOUND For a 128-bit UUID, no match in the populated table of UUIDs. - */ -SVCALL(SD_BLE_UUID_DECODE, uint32_t, sd_ble_uuid_decode(uint8_t uuid_le_len, uint8_t const *p_uuid_le, ble_uuid_t *p_uuid)); - - -/** @brief Encode a @ref ble_uuid_t structure into little endian raw UUID bytes (16-bit or 128-bit). - * - * @note The pointer to the destination buffer p_uuid_le may be NULL, in which case only the validity and size of p_uuid is computed. - * - * @param[in] p_uuid Pointer to a @ref ble_uuid_t structure that will be encoded into bytes. - * @param[out] p_uuid_le_len Pointer to a uint8_t that will be filled with the encoded length (2 or 16 bytes). - * @param[out] p_uuid_le Pointer to a buffer where the little endian raw UUID bytes (2 or 16) will be stored. - * - * @retval ::NRF_SUCCESS Successfully encoded into the buffer. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid UUID type. - */ -SVCALL(SD_BLE_UUID_ENCODE, uint32_t, sd_ble_uuid_encode(ble_uuid_t const *p_uuid, uint8_t *p_uuid_le_len, uint8_t *p_uuid_le)); - - -/**@brief Get Version Information. - * - * @details This call allows the application to get the BLE stack version information. - * - * @param[out] p_version Pointer to a ble_version_t structure to be filled in. - * - * @retval ::NRF_SUCCESS Version information stored successfully. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_BUSY The BLE stack is busy (typically doing a locally-initiated disconnection procedure). - */ -SVCALL(SD_BLE_VERSION_GET, uint32_t, sd_ble_version_get(ble_version_t *p_version)); - - -/**@brief Provide a user memory block. - * - * @note This call can only be used as a response to a @ref BLE_EVT_USER_MEM_REQUEST event issued to the application. - * - * @param[in] conn_handle Connection handle. - * @param[in] p_block Pointer to a user memory block structure or NULL if memory is managed by the application. - * - * @mscs - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_PEER_CANCEL_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_AUTH_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_NOAUTH_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_BUF_AUTH_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_BUF_NOAUTH_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_QUEUE_FULL_MSC} - * @endmscs - * - * @retval ::NRF_SUCCESS Successfully queued a response to the peer. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_LENGTH Invalid user memory block length supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection state or no user memory request pending. - */ -SVCALL(SD_BLE_USER_MEM_REPLY, uint32_t, sd_ble_user_mem_reply(uint16_t conn_handle, ble_user_mem_block_t const *p_block)); - -/**@brief Set a BLE option. - * - * @details This call allows the application to set the value of an option. - * - * @param[in] opt_id Option ID, see @ref BLE_COMMON_OPTS, @ref BLE_GAP_OPTS, and @ref BLE_GATTC_OPTS. - * @param[in] p_opt Pointer to a @ref ble_opt_t structure containing the option value. - * - * @retval ::NRF_SUCCESS Option set successfully. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, check parameter limits and constraints. - * @retval ::NRF_ERROR_INVALID_STATE Unable to set the parameter at this time. - * @retval ::NRF_ERROR_BUSY The BLE stack is busy or the previous procedure has not completed. - */ -SVCALL(SD_BLE_OPT_SET, uint32_t, sd_ble_opt_set(uint32_t opt_id, ble_opt_t const *p_opt)); - - -/**@brief Get a BLE option. - * - * @details This call allows the application to retrieve the value of an option. - * - * @param[in] opt_id Option ID, see @ref BLE_COMMON_OPTS and @ref BLE_GAP_OPTS. - * @param[out] p_opt Pointer to a ble_opt_t structure to be filled in. - * - * @retval ::NRF_SUCCESS Option retrieved successfully. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, check parameter limits and constraints. - * @retval ::NRF_ERROR_INVALID_STATE Unable to retrieve the parameter at this time. - * @retval ::NRF_ERROR_BUSY The BLE stack is busy or the previous procedure has not completed. - * @retval ::NRF_ERROR_NOT_SUPPORTED This option is not supported. - * - */ -SVCALL(SD_BLE_OPT_GET, uint32_t, sd_ble_opt_get(uint32_t opt_id, ble_opt_t *p_opt)); - -/** @} */ -#ifdef __cplusplus -} -#endif -#endif /* BLE_H__ */ - -/** - @} - @} -*/ diff --git a/lib/nrf52/s140_nrf52_7.3.0_API/include/ble_err.h b/lib/nrf52/s140_nrf52_7.3.0_API/include/ble_err.h deleted file mode 100755 index 623ca39a..00000000 --- a/lib/nrf52/s140_nrf52_7.3.0_API/include/ble_err.h +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright (c) Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - @addtogroup BLE_COMMON - @{ - @addtogroup nrf_error - @{ - @ingroup BLE_COMMON - @} - - @defgroup ble_err General error codes - @{ - - @brief General error code definitions for the BLE API. - - @ingroup BLE_COMMON -*/ -#ifndef NRF_BLE_ERR_H__ -#define NRF_BLE_ERR_H__ - -#include "nrf_error.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* @defgroup BLE_ERRORS Error Codes - * @{ */ -#define BLE_ERROR_NOT_ENABLED (NRF_ERROR_STK_BASE_NUM+0x001) /**< @ref sd_ble_enable has not been called. */ -#define BLE_ERROR_INVALID_CONN_HANDLE (NRF_ERROR_STK_BASE_NUM+0x002) /**< Invalid connection handle. */ -#define BLE_ERROR_INVALID_ATTR_HANDLE (NRF_ERROR_STK_BASE_NUM+0x003) /**< Invalid attribute handle. */ -#define BLE_ERROR_INVALID_ADV_HANDLE (NRF_ERROR_STK_BASE_NUM+0x004) /**< Invalid advertising handle. */ -#define BLE_ERROR_INVALID_ROLE (NRF_ERROR_STK_BASE_NUM+0x005) /**< Invalid role. */ -#define BLE_ERROR_BLOCKED_BY_OTHER_LINKS (NRF_ERROR_STK_BASE_NUM+0x006) /**< The attempt to change link settings failed due to the scheduling of other links. */ -/** @} */ - - -/** @defgroup BLE_ERROR_SUBRANGES Module specific error code subranges - * @brief Assignment of subranges for module specific error codes. - * @note For specific error codes, see ble_.h or ble_error_.h. - * @{ */ -#define NRF_L2CAP_ERR_BASE (NRF_ERROR_STK_BASE_NUM+0x100) /**< L2CAP specific errors. */ -#define NRF_GAP_ERR_BASE (NRF_ERROR_STK_BASE_NUM+0x200) /**< GAP specific errors. */ -#define NRF_GATTC_ERR_BASE (NRF_ERROR_STK_BASE_NUM+0x300) /**< GATT client specific errors. */ -#define NRF_GATTS_ERR_BASE (NRF_ERROR_STK_BASE_NUM+0x400) /**< GATT server specific errors. */ -/** @} */ - -#ifdef __cplusplus -} -#endif -#endif - - -/** - @} - @} -*/ diff --git a/lib/nrf52/s140_nrf52_7.3.0_API/include/ble_gap.h b/lib/nrf52/s140_nrf52_7.3.0_API/include/ble_gap.h deleted file mode 100755 index 2a647879..00000000 --- a/lib/nrf52/s140_nrf52_7.3.0_API/include/ble_gap.h +++ /dev/null @@ -1,2867 +0,0 @@ -/* - * Copyright (c) Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - @addtogroup BLE_GAP Generic Access Profile (GAP) - @{ - @brief Definitions and prototypes for the GAP interface. - */ - -#ifndef BLE_GAP_H__ -#define BLE_GAP_H__ - -#include -#include "nrf_svc.h" -#include "nrf_error.h" -#include "ble_hci.h" -#include "ble_ranges.h" -#include "ble_types.h" -#include "ble_err.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/**@addtogroup BLE_GAP_ENUMERATIONS Enumerations - * @{ */ - -/**@brief GAP API SVC numbers. - */ -enum BLE_GAP_SVCS -{ - SD_BLE_GAP_ADDR_SET = BLE_GAP_SVC_BASE, /**< Set own Bluetooth Address. */ - SD_BLE_GAP_ADDR_GET = BLE_GAP_SVC_BASE + 1, /**< Get own Bluetooth Address. */ - SD_BLE_GAP_WHITELIST_SET = BLE_GAP_SVC_BASE + 2, /**< Set active whitelist. */ - SD_BLE_GAP_DEVICE_IDENTITIES_SET = BLE_GAP_SVC_BASE + 3, /**< Set device identity list. */ - SD_BLE_GAP_PRIVACY_SET = BLE_GAP_SVC_BASE + 4, /**< Set Privacy settings*/ - SD_BLE_GAP_PRIVACY_GET = BLE_GAP_SVC_BASE + 5, /**< Get Privacy settings*/ - SD_BLE_GAP_ADV_SET_CONFIGURE = BLE_GAP_SVC_BASE + 6, /**< Configure an advertising set. */ - SD_BLE_GAP_ADV_START = BLE_GAP_SVC_BASE + 7, /**< Start Advertising. */ - SD_BLE_GAP_ADV_STOP = BLE_GAP_SVC_BASE + 8, /**< Stop Advertising. */ - SD_BLE_GAP_CONN_PARAM_UPDATE = BLE_GAP_SVC_BASE + 9, /**< Connection Parameter Update. */ - SD_BLE_GAP_DISCONNECT = BLE_GAP_SVC_BASE + 10, /**< Disconnect. */ - SD_BLE_GAP_TX_POWER_SET = BLE_GAP_SVC_BASE + 11, /**< Set TX Power. */ - SD_BLE_GAP_APPEARANCE_SET = BLE_GAP_SVC_BASE + 12, /**< Set Appearance. */ - SD_BLE_GAP_APPEARANCE_GET = BLE_GAP_SVC_BASE + 13, /**< Get Appearance. */ - SD_BLE_GAP_PPCP_SET = BLE_GAP_SVC_BASE + 14, /**< Set PPCP. */ - SD_BLE_GAP_PPCP_GET = BLE_GAP_SVC_BASE + 15, /**< Get PPCP. */ - SD_BLE_GAP_DEVICE_NAME_SET = BLE_GAP_SVC_BASE + 16, /**< Set Device Name. */ - SD_BLE_GAP_DEVICE_NAME_GET = BLE_GAP_SVC_BASE + 17, /**< Get Device Name. */ - SD_BLE_GAP_AUTHENTICATE = BLE_GAP_SVC_BASE + 18, /**< Initiate Pairing/Bonding. */ - SD_BLE_GAP_SEC_PARAMS_REPLY = BLE_GAP_SVC_BASE + 19, /**< Reply with Security Parameters. */ - SD_BLE_GAP_AUTH_KEY_REPLY = BLE_GAP_SVC_BASE + 20, /**< Reply with an authentication key. */ - SD_BLE_GAP_LESC_DHKEY_REPLY = BLE_GAP_SVC_BASE + 21, /**< Reply with an LE Secure Connections DHKey. */ - SD_BLE_GAP_KEYPRESS_NOTIFY = BLE_GAP_SVC_BASE + 22, /**< Notify of a keypress during an authentication procedure. */ - SD_BLE_GAP_LESC_OOB_DATA_GET = BLE_GAP_SVC_BASE + 23, /**< Get the local LE Secure Connections OOB data. */ - SD_BLE_GAP_LESC_OOB_DATA_SET = BLE_GAP_SVC_BASE + 24, /**< Set the remote LE Secure Connections OOB data. */ - SD_BLE_GAP_ENCRYPT = BLE_GAP_SVC_BASE + 25, /**< Initiate encryption procedure. */ - SD_BLE_GAP_SEC_INFO_REPLY = BLE_GAP_SVC_BASE + 26, /**< Reply with Security Information. */ - SD_BLE_GAP_CONN_SEC_GET = BLE_GAP_SVC_BASE + 27, /**< Obtain connection security level. */ - SD_BLE_GAP_RSSI_START = BLE_GAP_SVC_BASE + 28, /**< Start reporting of changes in RSSI. */ - SD_BLE_GAP_RSSI_STOP = BLE_GAP_SVC_BASE + 29, /**< Stop reporting of changes in RSSI. */ - SD_BLE_GAP_SCAN_START = BLE_GAP_SVC_BASE + 30, /**< Start Scanning. */ - SD_BLE_GAP_SCAN_STOP = BLE_GAP_SVC_BASE + 31, /**< Stop Scanning. */ - SD_BLE_GAP_CONNECT = BLE_GAP_SVC_BASE + 32, /**< Connect. */ - SD_BLE_GAP_CONNECT_CANCEL = BLE_GAP_SVC_BASE + 33, /**< Cancel ongoing connection procedure. */ - SD_BLE_GAP_RSSI_GET = BLE_GAP_SVC_BASE + 34, /**< Get the last RSSI sample. */ - SD_BLE_GAP_PHY_UPDATE = BLE_GAP_SVC_BASE + 35, /**< Initiate or respond to a PHY Update Procedure. */ - SD_BLE_GAP_DATA_LENGTH_UPDATE = BLE_GAP_SVC_BASE + 36, /**< Initiate or respond to a Data Length Update Procedure. */ - SD_BLE_GAP_QOS_CHANNEL_SURVEY_START = BLE_GAP_SVC_BASE + 37, /**< Start Quality of Service (QoS) channel survey module. */ - SD_BLE_GAP_QOS_CHANNEL_SURVEY_STOP = BLE_GAP_SVC_BASE + 38, /**< Stop Quality of Service (QoS) channel survey module. */ - SD_BLE_GAP_ADV_ADDR_GET = BLE_GAP_SVC_BASE + 39, /**< Get the Address used on air while Advertising. */ - SD_BLE_GAP_NEXT_CONN_EVT_COUNTER_GET = BLE_GAP_SVC_BASE + 40, /**< Get the next connection event counter. */ - SD_BLE_GAP_CONN_EVT_TRIGGER_START = BLE_GAP_SVC_BASE + 41, /** Start triggering a given task on connection event start. */ - SD_BLE_GAP_CONN_EVT_TRIGGER_STOP = BLE_GAP_SVC_BASE + 42, /** Stop triggering the task configured using @ref sd_ble_gap_conn_evt_trigger_start. */ -}; - -/**@brief GAP Event IDs. - * IDs that uniquely identify an event coming from the stack to the application. - */ -enum BLE_GAP_EVTS -{ - BLE_GAP_EVT_CONNECTED = BLE_GAP_EVT_BASE, /**< Connected to peer. \n See @ref ble_gap_evt_connected_t */ - BLE_GAP_EVT_DISCONNECTED = BLE_GAP_EVT_BASE + 1, /**< Disconnected from peer. \n See @ref ble_gap_evt_disconnected_t. */ - BLE_GAP_EVT_CONN_PARAM_UPDATE = BLE_GAP_EVT_BASE + 2, /**< Connection Parameters updated. \n See @ref ble_gap_evt_conn_param_update_t. */ - BLE_GAP_EVT_SEC_PARAMS_REQUEST = BLE_GAP_EVT_BASE + 3, /**< Request to provide security parameters. \n Reply with @ref sd_ble_gap_sec_params_reply. \n See @ref ble_gap_evt_sec_params_request_t. */ - BLE_GAP_EVT_SEC_INFO_REQUEST = BLE_GAP_EVT_BASE + 4, /**< Request to provide security information. \n Reply with @ref sd_ble_gap_sec_info_reply. \n See @ref ble_gap_evt_sec_info_request_t. */ - BLE_GAP_EVT_PASSKEY_DISPLAY = BLE_GAP_EVT_BASE + 5, /**< Request to display a passkey to the user. \n In LESC Numeric Comparison, reply with @ref sd_ble_gap_auth_key_reply. \n See @ref ble_gap_evt_passkey_display_t. */ - BLE_GAP_EVT_KEY_PRESSED = BLE_GAP_EVT_BASE + 6, /**< Notification of a keypress on the remote device.\n See @ref ble_gap_evt_key_pressed_t */ - BLE_GAP_EVT_AUTH_KEY_REQUEST = BLE_GAP_EVT_BASE + 7, /**< Request to provide an authentication key. \n Reply with @ref sd_ble_gap_auth_key_reply. \n See @ref ble_gap_evt_auth_key_request_t. */ - BLE_GAP_EVT_LESC_DHKEY_REQUEST = BLE_GAP_EVT_BASE + 8, /**< Request to calculate an LE Secure Connections DHKey. \n Reply with @ref sd_ble_gap_lesc_dhkey_reply. \n See @ref ble_gap_evt_lesc_dhkey_request_t */ - BLE_GAP_EVT_AUTH_STATUS = BLE_GAP_EVT_BASE + 9, /**< Authentication procedure completed with status. \n See @ref ble_gap_evt_auth_status_t. */ - BLE_GAP_EVT_CONN_SEC_UPDATE = BLE_GAP_EVT_BASE + 10, /**< Connection security updated. \n See @ref ble_gap_evt_conn_sec_update_t. */ - BLE_GAP_EVT_TIMEOUT = BLE_GAP_EVT_BASE + 11, /**< Timeout expired. \n See @ref ble_gap_evt_timeout_t. */ - BLE_GAP_EVT_RSSI_CHANGED = BLE_GAP_EVT_BASE + 12, /**< RSSI report. \n See @ref ble_gap_evt_rssi_changed_t. */ - BLE_GAP_EVT_ADV_REPORT = BLE_GAP_EVT_BASE + 13, /**< Advertising report. \n See @ref ble_gap_evt_adv_report_t. */ - BLE_GAP_EVT_SEC_REQUEST = BLE_GAP_EVT_BASE + 14, /**< Security Request. \n Reply with @ref sd_ble_gap_authenticate - \n or with @ref sd_ble_gap_encrypt if required security information is available -. \n See @ref ble_gap_evt_sec_request_t. */ - BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST = BLE_GAP_EVT_BASE + 15, /**< Connection Parameter Update Request. \n Reply with @ref sd_ble_gap_conn_param_update. \n See @ref ble_gap_evt_conn_param_update_request_t. */ - BLE_GAP_EVT_SCAN_REQ_REPORT = BLE_GAP_EVT_BASE + 16, /**< Scan request report. \n See @ref ble_gap_evt_scan_req_report_t. */ - BLE_GAP_EVT_PHY_UPDATE_REQUEST = BLE_GAP_EVT_BASE + 17, /**< PHY Update Request. \n Reply with @ref sd_ble_gap_phy_update. \n See @ref ble_gap_evt_phy_update_request_t. */ - BLE_GAP_EVT_PHY_UPDATE = BLE_GAP_EVT_BASE + 18, /**< PHY Update Procedure is complete. \n See @ref ble_gap_evt_phy_update_t. */ - BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST = BLE_GAP_EVT_BASE + 19, /**< Data Length Update Request. \n Reply with @ref sd_ble_gap_data_length_update. \n See @ref ble_gap_evt_data_length_update_request_t. */ - BLE_GAP_EVT_DATA_LENGTH_UPDATE = BLE_GAP_EVT_BASE + 20, /**< LL Data Channel PDU payload length updated. \n See @ref ble_gap_evt_data_length_update_t. */ - BLE_GAP_EVT_QOS_CHANNEL_SURVEY_REPORT = BLE_GAP_EVT_BASE + 21, /**< Channel survey report. \n See @ref ble_gap_evt_qos_channel_survey_report_t. */ - BLE_GAP_EVT_ADV_SET_TERMINATED = BLE_GAP_EVT_BASE + 22, /**< Advertising set terminated. \n See @ref ble_gap_evt_adv_set_terminated_t. */ -}; - -/**@brief GAP Option IDs. - * IDs that uniquely identify a GAP option. - */ -enum BLE_GAP_OPTS -{ - BLE_GAP_OPT_CH_MAP = BLE_GAP_OPT_BASE, /**< Channel Map. @ref ble_gap_opt_ch_map_t */ - BLE_GAP_OPT_LOCAL_CONN_LATENCY = BLE_GAP_OPT_BASE + 1, /**< Local connection latency. @ref ble_gap_opt_local_conn_latency_t */ - BLE_GAP_OPT_PASSKEY = BLE_GAP_OPT_BASE + 2, /**< Set passkey. @ref ble_gap_opt_passkey_t */ - BLE_GAP_OPT_COMPAT_MODE_1 = BLE_GAP_OPT_BASE + 3, /**< Compatibility mode. @ref ble_gap_opt_compat_mode_1_t */ - BLE_GAP_OPT_AUTH_PAYLOAD_TIMEOUT = BLE_GAP_OPT_BASE + 4, /**< Set Authenticated payload timeout. @ref ble_gap_opt_auth_payload_timeout_t */ - BLE_GAP_OPT_SLAVE_LATENCY_DISABLE = BLE_GAP_OPT_BASE + 5, /**< Disable slave latency. @ref ble_gap_opt_slave_latency_disable_t */ -}; - -/**@brief GAP Configuration IDs. - * - * IDs that uniquely identify a GAP configuration. - */ -enum BLE_GAP_CFGS -{ - BLE_GAP_CFG_ROLE_COUNT = BLE_GAP_CFG_BASE, /**< Role count configuration. */ - BLE_GAP_CFG_DEVICE_NAME = BLE_GAP_CFG_BASE + 1, /**< Device name configuration. */ - BLE_GAP_CFG_PPCP_INCL_CONFIG = BLE_GAP_CFG_BASE + 2, /**< Peripheral Preferred Connection Parameters characteristic - inclusion configuration. */ - BLE_GAP_CFG_CAR_INCL_CONFIG = BLE_GAP_CFG_BASE + 3, /**< Central Address Resolution characteristic - inclusion configuration. */ -}; - -/**@brief GAP TX Power roles. - */ -enum BLE_GAP_TX_POWER_ROLES -{ - BLE_GAP_TX_POWER_ROLE_ADV = 1, /**< Advertiser role. */ - BLE_GAP_TX_POWER_ROLE_SCAN_INIT = 2, /**< Scanner and initiator role. */ - BLE_GAP_TX_POWER_ROLE_CONN = 3, /**< Connection role. */ -}; - -/** @} */ - -/**@addtogroup BLE_GAP_DEFINES Defines - * @{ */ - -/**@defgroup BLE_ERRORS_GAP SVC return values specific to GAP - * @{ */ -#define BLE_ERROR_GAP_UUID_LIST_MISMATCH (NRF_GAP_ERR_BASE + 0x000) /**< UUID list does not contain an integral number of UUIDs. */ -#define BLE_ERROR_GAP_DISCOVERABLE_WITH_WHITELIST (NRF_GAP_ERR_BASE + 0x001) /**< Use of Whitelist not permitted with discoverable advertising. */ -#define BLE_ERROR_GAP_INVALID_BLE_ADDR (NRF_GAP_ERR_BASE + 0x002) /**< The upper two bits of the address do not correspond to the specified address type. */ -#define BLE_ERROR_GAP_WHITELIST_IN_USE (NRF_GAP_ERR_BASE + 0x003) /**< Attempt to modify the whitelist while already in use by another operation. */ -#define BLE_ERROR_GAP_DEVICE_IDENTITIES_IN_USE (NRF_GAP_ERR_BASE + 0x004) /**< Attempt to modify the device identity list while already in use by another operation. */ -#define BLE_ERROR_GAP_DEVICE_IDENTITIES_DUPLICATE (NRF_GAP_ERR_BASE + 0x005) /**< The device identity list contains entries with duplicate identity addresses. */ -/**@} */ - - -/**@defgroup BLE_GAP_ROLES GAP Roles - * @{ */ -#define BLE_GAP_ROLE_INVALID 0x0 /**< Invalid Role. */ -#define BLE_GAP_ROLE_PERIPH 0x1 /**< Peripheral Role. */ -#define BLE_GAP_ROLE_CENTRAL 0x2 /**< Central Role. */ -/**@} */ - - -/**@defgroup BLE_GAP_TIMEOUT_SOURCES GAP Timeout sources - * @{ */ -#define BLE_GAP_TIMEOUT_SRC_SCAN 0x01 /**< Scanning timeout. */ -#define BLE_GAP_TIMEOUT_SRC_CONN 0x02 /**< Connection timeout. */ -#define BLE_GAP_TIMEOUT_SRC_AUTH_PAYLOAD 0x03 /**< Authenticated payload timeout. */ -/**@} */ - - -/**@defgroup BLE_GAP_ADDR_TYPES GAP Address types - * @{ */ -#define BLE_GAP_ADDR_TYPE_PUBLIC 0x00 /**< Public (identity) address.*/ -#define BLE_GAP_ADDR_TYPE_RANDOM_STATIC 0x01 /**< Random static (identity) address. */ -#define BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE 0x02 /**< Random private resolvable address. */ -#define BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_NON_RESOLVABLE 0x03 /**< Random private non-resolvable address. */ -#define BLE_GAP_ADDR_TYPE_ANONYMOUS 0x7F /**< An advertiser may advertise without its address. - This type of advertising is called anonymous. */ -/**@} */ - - -/**@brief The default interval in seconds at which a private address is refreshed. */ -#define BLE_GAP_DEFAULT_PRIVATE_ADDR_CYCLE_INTERVAL_S (900) /* 15 minutes. */ -/**@brief The maximum interval in seconds at which a private address can be refreshed. */ -#define BLE_GAP_MAX_PRIVATE_ADDR_CYCLE_INTERVAL_S (41400) /* 11 hours 30 minutes. */ - - -/** @brief BLE address length. */ -#define BLE_GAP_ADDR_LEN (6) - -/**@defgroup BLE_GAP_PRIVACY_MODES Privacy modes - * @{ */ -#define BLE_GAP_PRIVACY_MODE_OFF 0x00 /**< Device will send and accept its identity address for its own address. */ -#define BLE_GAP_PRIVACY_MODE_DEVICE_PRIVACY 0x01 /**< Device will send and accept only private addresses for its own address. */ -#define BLE_GAP_PRIVACY_MODE_NETWORK_PRIVACY 0x02 /**< Device will send and accept only private addresses for its own address, - and will not accept a peer using identity address as sender address when - the peer IRK is exchanged, non-zero and added to the identity list. */ -/**@} */ - -/** @brief Invalid power level. */ -#define BLE_GAP_POWER_LEVEL_INVALID 127 - -/** @brief Advertising set handle not set. */ -#define BLE_GAP_ADV_SET_HANDLE_NOT_SET (0xFF) - -/** @brief The default number of advertising sets. */ -#define BLE_GAP_ADV_SET_COUNT_DEFAULT (1) - -/** @brief The maximum number of advertising sets supported by this SoftDevice. */ -#define BLE_GAP_ADV_SET_COUNT_MAX (1) - -/**@defgroup BLE_GAP_ADV_SET_DATA_SIZES Advertising data sizes. - * @{ */ -#define BLE_GAP_ADV_SET_DATA_SIZE_MAX (31) /**< Maximum data length for an advertising set. - If more advertising data is required, use extended advertising instead. */ -#define BLE_GAP_ADV_SET_DATA_SIZE_EXTENDED_MAX_SUPPORTED (255) /**< Maximum supported data length for an extended advertising set. */ - -#define BLE_GAP_ADV_SET_DATA_SIZE_EXTENDED_CONNECTABLE_MAX_SUPPORTED (238) /**< Maximum supported data length for an extended connectable advertising set. */ -/**@}. */ - -/** @brief Set ID not available in advertising report. */ -#define BLE_GAP_ADV_REPORT_SET_ID_NOT_AVAILABLE 0xFF - -/**@defgroup BLE_GAP_EVT_ADV_SET_TERMINATED_REASON GAP Advertising Set Terminated reasons - * @{ */ -#define BLE_GAP_EVT_ADV_SET_TERMINATED_REASON_TIMEOUT 0x01 /**< Timeout value reached. */ -#define BLE_GAP_EVT_ADV_SET_TERMINATED_REASON_LIMIT_REACHED 0x02 /**< @ref ble_gap_adv_params_t::max_adv_evts was reached. */ -/**@} */ - -/**@defgroup BLE_GAP_AD_TYPE_DEFINITIONS GAP Advertising and Scan Response Data format - * @note Found at https://www.bluetooth.org/Technical/AssignedNumbers/generic_access_profile.htm - * @{ */ -#define BLE_GAP_AD_TYPE_FLAGS 0x01 /**< Flags for discoverability. */ -#define BLE_GAP_AD_TYPE_16BIT_SERVICE_UUID_MORE_AVAILABLE 0x02 /**< Partial list of 16 bit service UUIDs. */ -#define BLE_GAP_AD_TYPE_16BIT_SERVICE_UUID_COMPLETE 0x03 /**< Complete list of 16 bit service UUIDs. */ -#define BLE_GAP_AD_TYPE_32BIT_SERVICE_UUID_MORE_AVAILABLE 0x04 /**< Partial list of 32 bit service UUIDs. */ -#define BLE_GAP_AD_TYPE_32BIT_SERVICE_UUID_COMPLETE 0x05 /**< Complete list of 32 bit service UUIDs. */ -#define BLE_GAP_AD_TYPE_128BIT_SERVICE_UUID_MORE_AVAILABLE 0x06 /**< Partial list of 128 bit service UUIDs. */ -#define BLE_GAP_AD_TYPE_128BIT_SERVICE_UUID_COMPLETE 0x07 /**< Complete list of 128 bit service UUIDs. */ -#define BLE_GAP_AD_TYPE_SHORT_LOCAL_NAME 0x08 /**< Short local device name. */ -#define BLE_GAP_AD_TYPE_COMPLETE_LOCAL_NAME 0x09 /**< Complete local device name. */ -#define BLE_GAP_AD_TYPE_TX_POWER_LEVEL 0x0A /**< Transmit power level. */ -#define BLE_GAP_AD_TYPE_CLASS_OF_DEVICE 0x0D /**< Class of device. */ -#define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_HASH_C 0x0E /**< Simple Pairing Hash C. */ -#define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_RANDOMIZER_R 0x0F /**< Simple Pairing Randomizer R. */ -#define BLE_GAP_AD_TYPE_SECURITY_MANAGER_TK_VALUE 0x10 /**< Security Manager TK Value. */ -#define BLE_GAP_AD_TYPE_SECURITY_MANAGER_OOB_FLAGS 0x11 /**< Security Manager Out Of Band Flags. */ -#define BLE_GAP_AD_TYPE_SLAVE_CONNECTION_INTERVAL_RANGE 0x12 /**< Slave Connection Interval Range. */ -#define BLE_GAP_AD_TYPE_SOLICITED_SERVICE_UUIDS_16BIT 0x14 /**< List of 16-bit Service Solicitation UUIDs. */ -#define BLE_GAP_AD_TYPE_SOLICITED_SERVICE_UUIDS_128BIT 0x15 /**< List of 128-bit Service Solicitation UUIDs. */ -#define BLE_GAP_AD_TYPE_SERVICE_DATA 0x16 /**< Service Data - 16-bit UUID. */ -#define BLE_GAP_AD_TYPE_PUBLIC_TARGET_ADDRESS 0x17 /**< Public Target Address. */ -#define BLE_GAP_AD_TYPE_RANDOM_TARGET_ADDRESS 0x18 /**< Random Target Address. */ -#define BLE_GAP_AD_TYPE_APPEARANCE 0x19 /**< Appearance. */ -#define BLE_GAP_AD_TYPE_ADVERTISING_INTERVAL 0x1A /**< Advertising Interval. */ -#define BLE_GAP_AD_TYPE_LE_BLUETOOTH_DEVICE_ADDRESS 0x1B /**< LE Bluetooth Device Address. */ -#define BLE_GAP_AD_TYPE_LE_ROLE 0x1C /**< LE Role. */ -#define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_HASH_C256 0x1D /**< Simple Pairing Hash C-256. */ -#define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_RANDOMIZER_R256 0x1E /**< Simple Pairing Randomizer R-256. */ -#define BLE_GAP_AD_TYPE_SERVICE_DATA_32BIT_UUID 0x20 /**< Service Data - 32-bit UUID. */ -#define BLE_GAP_AD_TYPE_SERVICE_DATA_128BIT_UUID 0x21 /**< Service Data - 128-bit UUID. */ -#define BLE_GAP_AD_TYPE_LESC_CONFIRMATION_VALUE 0x22 /**< LE Secure Connections Confirmation Value */ -#define BLE_GAP_AD_TYPE_LESC_RANDOM_VALUE 0x23 /**< LE Secure Connections Random Value */ -#define BLE_GAP_AD_TYPE_URI 0x24 /**< URI */ -#define BLE_GAP_AD_TYPE_3D_INFORMATION_DATA 0x3D /**< 3D Information Data. */ -#define BLE_GAP_AD_TYPE_MANUFACTURER_SPECIFIC_DATA 0xFF /**< Manufacturer Specific Data. */ -/**@} */ - - -/**@defgroup BLE_GAP_ADV_FLAGS GAP Advertisement Flags - * @{ */ -#define BLE_GAP_ADV_FLAG_LE_LIMITED_DISC_MODE (0x01) /**< LE Limited Discoverable Mode. */ -#define BLE_GAP_ADV_FLAG_LE_GENERAL_DISC_MODE (0x02) /**< LE General Discoverable Mode. */ -#define BLE_GAP_ADV_FLAG_BR_EDR_NOT_SUPPORTED (0x04) /**< BR/EDR not supported. */ -#define BLE_GAP_ADV_FLAG_LE_BR_EDR_CONTROLLER (0x08) /**< Simultaneous LE and BR/EDR, Controller. */ -#define BLE_GAP_ADV_FLAG_LE_BR_EDR_HOST (0x10) /**< Simultaneous LE and BR/EDR, Host. */ -#define BLE_GAP_ADV_FLAGS_LE_ONLY_LIMITED_DISC_MODE (BLE_GAP_ADV_FLAG_LE_LIMITED_DISC_MODE | BLE_GAP_ADV_FLAG_BR_EDR_NOT_SUPPORTED) /**< LE Limited Discoverable Mode, BR/EDR not supported. */ -#define BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE (BLE_GAP_ADV_FLAG_LE_GENERAL_DISC_MODE | BLE_GAP_ADV_FLAG_BR_EDR_NOT_SUPPORTED) /**< LE General Discoverable Mode, BR/EDR not supported. */ -/**@} */ - - -/**@defgroup BLE_GAP_ADV_INTERVALS GAP Advertising interval max and min - * @{ */ -#define BLE_GAP_ADV_INTERVAL_MIN 0x000020 /**< Minimum Advertising interval in 625 us units, i.e. 20 ms. */ -#define BLE_GAP_ADV_INTERVAL_MAX 0x004000 /**< Maximum Advertising interval in 625 us units, i.e. 10.24 s. */ - /**@} */ - - -/**@defgroup BLE_GAP_SCAN_INTERVALS GAP Scan interval max and min - * @{ */ -#define BLE_GAP_SCAN_INTERVAL_MIN 0x0004 /**< Minimum Scan interval in 625 us units, i.e. 2.5 ms. */ -#define BLE_GAP_SCAN_INTERVAL_MAX 0xFFFF /**< Maximum Scan interval in 625 us units, i.e. 40,959.375 s. */ - /** @} */ - - -/**@defgroup BLE_GAP_SCAN_WINDOW GAP Scan window max and min - * @{ */ -#define BLE_GAP_SCAN_WINDOW_MIN 0x0004 /**< Minimum Scan window in 625 us units, i.e. 2.5 ms. */ -#define BLE_GAP_SCAN_WINDOW_MAX 0xFFFF /**< Maximum Scan window in 625 us units, i.e. 40,959.375 s. */ - /** @} */ - - -/**@defgroup BLE_GAP_SCAN_TIMEOUT GAP Scan timeout max and min - * @{ */ -#define BLE_GAP_SCAN_TIMEOUT_MIN 0x0001 /**< Minimum Scan timeout in 10 ms units, i.e 10 ms. */ -#define BLE_GAP_SCAN_TIMEOUT_UNLIMITED 0x0000 /**< Continue to scan forever. */ - /** @} */ - -/**@defgroup BLE_GAP_SCAN_BUFFER_SIZE GAP Minimum scanner buffer size - * - * Scan buffers are used for storing advertising data received from an advertiser. - * If ble_gap_scan_params_t::extended is set to 0, @ref BLE_GAP_SCAN_BUFFER_MIN is the minimum scan buffer length. - * else the minimum scan buffer size is @ref BLE_GAP_SCAN_BUFFER_EXTENDED_MIN. - * @{ */ -#define BLE_GAP_SCAN_BUFFER_MIN (31) /**< Minimum data length for an - advertising set. */ -#define BLE_GAP_SCAN_BUFFER_MAX (31) /**< Maximum data length for an - advertising set. */ -#define BLE_GAP_SCAN_BUFFER_EXTENDED_MIN (255) /**< Minimum data length for an - extended advertising set. */ -#define BLE_GAP_SCAN_BUFFER_EXTENDED_MAX (1650) /**< Maximum data length for an - extended advertising set. */ -#define BLE_GAP_SCAN_BUFFER_EXTENDED_MAX_SUPPORTED (255) /**< Maximum supported data length for - an extended advertising set. */ -/** @} */ - -/**@defgroup BLE_GAP_ADV_TYPES GAP Advertising types - * - * Advertising types defined in Bluetooth Core Specification v5.0, Vol 6, Part B, Section 4.4.2. - * - * The maximum advertising data length is defined by @ref BLE_GAP_ADV_SET_DATA_SIZE_MAX. - * The maximum supported data length for an extended advertiser is defined by - * @ref BLE_GAP_ADV_SET_DATA_SIZE_EXTENDED_MAX_SUPPORTED - * Note that some of the advertising types do not support advertising data. Non-scannable types do not support - * scan response data. - * - * @{ */ -#define BLE_GAP_ADV_TYPE_CONNECTABLE_SCANNABLE_UNDIRECTED 0x01 /**< Connectable and scannable undirected - advertising events. */ -#define BLE_GAP_ADV_TYPE_CONNECTABLE_NONSCANNABLE_DIRECTED_HIGH_DUTY_CYCLE 0x02 /**< Connectable non-scannable directed advertising - events. Advertising interval is less that 3.75 ms. - Use this type for fast reconnections. - @note Advertising data is not supported. */ -#define BLE_GAP_ADV_TYPE_CONNECTABLE_NONSCANNABLE_DIRECTED 0x03 /**< Connectable non-scannable directed advertising - events. - @note Advertising data is not supported. */ -#define BLE_GAP_ADV_TYPE_NONCONNECTABLE_SCANNABLE_UNDIRECTED 0x04 /**< Non-connectable scannable undirected - advertising events. */ -#define BLE_GAP_ADV_TYPE_NONCONNECTABLE_NONSCANNABLE_UNDIRECTED 0x05 /**< Non-connectable non-scannable undirected - advertising events. */ -#define BLE_GAP_ADV_TYPE_EXTENDED_CONNECTABLE_NONSCANNABLE_UNDIRECTED 0x06 /**< Connectable non-scannable undirected advertising - events using extended advertising PDUs. */ -#define BLE_GAP_ADV_TYPE_EXTENDED_CONNECTABLE_NONSCANNABLE_DIRECTED 0x07 /**< Connectable non-scannable directed advertising - events using extended advertising PDUs. */ -#define BLE_GAP_ADV_TYPE_EXTENDED_NONCONNECTABLE_SCANNABLE_UNDIRECTED 0x08 /**< Non-connectable scannable undirected advertising - events using extended advertising PDUs. - @note Only scan response data is supported. */ -#define BLE_GAP_ADV_TYPE_EXTENDED_NONCONNECTABLE_SCANNABLE_DIRECTED 0x09 /**< Non-connectable scannable directed advertising - events using extended advertising PDUs. - @note Only scan response data is supported. */ -#define BLE_GAP_ADV_TYPE_EXTENDED_NONCONNECTABLE_NONSCANNABLE_UNDIRECTED 0x0A /**< Non-connectable non-scannable undirected advertising - events using extended advertising PDUs. */ -#define BLE_GAP_ADV_TYPE_EXTENDED_NONCONNECTABLE_NONSCANNABLE_DIRECTED 0x0B /**< Non-connectable non-scannable directed advertising - events using extended advertising PDUs. */ -/**@} */ - -/**@defgroup BLE_GAP_ADV_FILTER_POLICIES GAP Advertising filter policies - * @{ */ -#define BLE_GAP_ADV_FP_ANY 0x00 /**< Allow scan requests and connect requests from any device. */ -#define BLE_GAP_ADV_FP_FILTER_SCANREQ 0x01 /**< Filter scan requests with whitelist. */ -#define BLE_GAP_ADV_FP_FILTER_CONNREQ 0x02 /**< Filter connect requests with whitelist. */ -#define BLE_GAP_ADV_FP_FILTER_BOTH 0x03 /**< Filter both scan and connect requests with whitelist. */ -/**@} */ - -/**@defgroup BLE_GAP_ADV_DATA_STATUS GAP Advertising data status - * @{ */ -#define BLE_GAP_ADV_DATA_STATUS_COMPLETE 0x00 /**< All data in the advertising event have been received. */ -#define BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA 0x01 /**< More data to be received. - @note This value will only be used if - @ref ble_gap_scan_params_t::report_incomplete_evts and - @ref ble_gap_adv_report_type_t::extended_pdu are set to true. */ -#define BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_TRUNCATED 0x02 /**< Incomplete data. Buffer size insufficient to receive more. - @note This value will only be used if - @ref ble_gap_adv_report_type_t::extended_pdu is set to true. */ -#define BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MISSED 0x03 /**< Failed to receive the remaining data. - @note This value will only be used if - @ref ble_gap_adv_report_type_t::extended_pdu is set to true. */ -/**@} */ - -/**@defgroup BLE_GAP_SCAN_FILTER_POLICIES GAP Scanner filter policies - * @{ */ -#define BLE_GAP_SCAN_FP_ACCEPT_ALL 0x00 /**< Accept all advertising packets except directed advertising packets - not addressed to this device. */ -#define BLE_GAP_SCAN_FP_WHITELIST 0x01 /**< Accept advertising packets from devices in the whitelist except directed - packets not addressed to this device. */ -#define BLE_GAP_SCAN_FP_ALL_NOT_RESOLVED_DIRECTED 0x02 /**< Accept all advertising packets specified in @ref BLE_GAP_SCAN_FP_ACCEPT_ALL. - In addition, accept directed advertising packets, where the advertiser's - address is a resolvable private address that cannot be resolved. */ -#define BLE_GAP_SCAN_FP_WHITELIST_NOT_RESOLVED_DIRECTED 0x03 /**< Accept all advertising packets specified in @ref BLE_GAP_SCAN_FP_WHITELIST. - In addition, accept directed advertising packets, where the advertiser's - address is a resolvable private address that cannot be resolved. */ -/**@} */ - -/**@defgroup BLE_GAP_ADV_TIMEOUT_VALUES GAP Advertising timeout values in 10 ms units - * @{ */ -#define BLE_GAP_ADV_TIMEOUT_HIGH_DUTY_MAX (128) /**< Maximum high duty advertising time in 10 ms units. Corresponds to 1.28 s. */ -#define BLE_GAP_ADV_TIMEOUT_LIMITED_MAX (18000) /**< Maximum advertising time in 10 ms units corresponding to TGAP(lim_adv_timeout) = 180 s in limited discoverable mode. */ -#define BLE_GAP_ADV_TIMEOUT_GENERAL_UNLIMITED (0) /**< Unlimited advertising in general discoverable mode. - For high duty cycle advertising, this corresponds to @ref BLE_GAP_ADV_TIMEOUT_HIGH_DUTY_MAX. */ -/**@} */ - - -/**@defgroup BLE_GAP_DISC_MODES GAP Discovery modes - * @{ */ -#define BLE_GAP_DISC_MODE_NOT_DISCOVERABLE 0x00 /**< Not discoverable discovery Mode. */ -#define BLE_GAP_DISC_MODE_LIMITED 0x01 /**< Limited Discovery Mode. */ -#define BLE_GAP_DISC_MODE_GENERAL 0x02 /**< General Discovery Mode. */ -/**@} */ - - -/**@defgroup BLE_GAP_IO_CAPS GAP IO Capabilities - * @{ */ -#define BLE_GAP_IO_CAPS_DISPLAY_ONLY 0x00 /**< Display Only. */ -#define BLE_GAP_IO_CAPS_DISPLAY_YESNO 0x01 /**< Display and Yes/No entry. */ -#define BLE_GAP_IO_CAPS_KEYBOARD_ONLY 0x02 /**< Keyboard Only. */ -#define BLE_GAP_IO_CAPS_NONE 0x03 /**< No I/O capabilities. */ -#define BLE_GAP_IO_CAPS_KEYBOARD_DISPLAY 0x04 /**< Keyboard and Display. */ -/**@} */ - - -/**@defgroup BLE_GAP_AUTH_KEY_TYPES GAP Authentication Key Types - * @{ */ -#define BLE_GAP_AUTH_KEY_TYPE_NONE 0x00 /**< No key (may be used to reject). */ -#define BLE_GAP_AUTH_KEY_TYPE_PASSKEY 0x01 /**< 6-digit Passkey. */ -#define BLE_GAP_AUTH_KEY_TYPE_OOB 0x02 /**< Out Of Band data. */ -/**@} */ - - -/**@defgroup BLE_GAP_KP_NOT_TYPES GAP Keypress Notification Types - * @{ */ -#define BLE_GAP_KP_NOT_TYPE_PASSKEY_START 0x00 /**< Passkey entry started. */ -#define BLE_GAP_KP_NOT_TYPE_PASSKEY_DIGIT_IN 0x01 /**< Passkey digit entered. */ -#define BLE_GAP_KP_NOT_TYPE_PASSKEY_DIGIT_OUT 0x02 /**< Passkey digit erased. */ -#define BLE_GAP_KP_NOT_TYPE_PASSKEY_CLEAR 0x03 /**< Passkey cleared. */ -#define BLE_GAP_KP_NOT_TYPE_PASSKEY_END 0x04 /**< Passkey entry completed. */ -/**@} */ - - -/**@defgroup BLE_GAP_SEC_STATUS GAP Security status - * @{ */ -#define BLE_GAP_SEC_STATUS_SUCCESS 0x00 /**< Procedure completed with success. */ -#define BLE_GAP_SEC_STATUS_TIMEOUT 0x01 /**< Procedure timed out. */ -#define BLE_GAP_SEC_STATUS_PDU_INVALID 0x02 /**< Invalid PDU received. */ -#define BLE_GAP_SEC_STATUS_RFU_RANGE1_BEGIN 0x03 /**< Reserved for Future Use range #1 begin. */ -#define BLE_GAP_SEC_STATUS_RFU_RANGE1_END 0x80 /**< Reserved for Future Use range #1 end. */ -#define BLE_GAP_SEC_STATUS_PASSKEY_ENTRY_FAILED 0x81 /**< Passkey entry failed (user canceled or other). */ -#define BLE_GAP_SEC_STATUS_OOB_NOT_AVAILABLE 0x82 /**< Out of Band Key not available. */ -#define BLE_GAP_SEC_STATUS_AUTH_REQ 0x83 /**< Authentication requirements not met. */ -#define BLE_GAP_SEC_STATUS_CONFIRM_VALUE 0x84 /**< Confirm value failed. */ -#define BLE_GAP_SEC_STATUS_PAIRING_NOT_SUPP 0x85 /**< Pairing not supported. */ -#define BLE_GAP_SEC_STATUS_ENC_KEY_SIZE 0x86 /**< Encryption key size. */ -#define BLE_GAP_SEC_STATUS_SMP_CMD_UNSUPPORTED 0x87 /**< Unsupported SMP command. */ -#define BLE_GAP_SEC_STATUS_UNSPECIFIED 0x88 /**< Unspecified reason. */ -#define BLE_GAP_SEC_STATUS_REPEATED_ATTEMPTS 0x89 /**< Too little time elapsed since last attempt. */ -#define BLE_GAP_SEC_STATUS_INVALID_PARAMS 0x8A /**< Invalid parameters. */ -#define BLE_GAP_SEC_STATUS_DHKEY_FAILURE 0x8B /**< DHKey check failure. */ -#define BLE_GAP_SEC_STATUS_NUM_COMP_FAILURE 0x8C /**< Numeric Comparison failure. */ -#define BLE_GAP_SEC_STATUS_BR_EDR_IN_PROG 0x8D /**< BR/EDR pairing in progress. */ -#define BLE_GAP_SEC_STATUS_X_TRANS_KEY_DISALLOWED 0x8E /**< BR/EDR Link Key cannot be used for LE keys. */ -#define BLE_GAP_SEC_STATUS_RFU_RANGE2_BEGIN 0x8F /**< Reserved for Future Use range #2 begin. */ -#define BLE_GAP_SEC_STATUS_RFU_RANGE2_END 0xFF /**< Reserved for Future Use range #2 end. */ -/**@} */ - - -/**@defgroup BLE_GAP_SEC_STATUS_SOURCES GAP Security status sources - * @{ */ -#define BLE_GAP_SEC_STATUS_SOURCE_LOCAL 0x00 /**< Local failure. */ -#define BLE_GAP_SEC_STATUS_SOURCE_REMOTE 0x01 /**< Remote failure. */ -/**@} */ - - -/**@defgroup BLE_GAP_CP_LIMITS GAP Connection Parameters Limits - * @{ */ -#define BLE_GAP_CP_MIN_CONN_INTVL_NONE 0xFFFF /**< No new minimum connection interval specified in connect parameters. */ -#define BLE_GAP_CP_MIN_CONN_INTVL_MIN 0x0006 /**< Lowest minimum connection interval permitted, in units of 1.25 ms, i.e. 7.5 ms. */ -#define BLE_GAP_CP_MIN_CONN_INTVL_MAX 0x0C80 /**< Highest minimum connection interval permitted, in units of 1.25 ms, i.e. 4 s. */ -#define BLE_GAP_CP_MAX_CONN_INTVL_NONE 0xFFFF /**< No new maximum connection interval specified in connect parameters. */ -#define BLE_GAP_CP_MAX_CONN_INTVL_MIN 0x0006 /**< Lowest maximum connection interval permitted, in units of 1.25 ms, i.e. 7.5 ms. */ -#define BLE_GAP_CP_MAX_CONN_INTVL_MAX 0x0C80 /**< Highest maximum connection interval permitted, in units of 1.25 ms, i.e. 4 s. */ -#define BLE_GAP_CP_SLAVE_LATENCY_MAX 0x01F3 /**< Highest slave latency permitted, in connection events. */ -#define BLE_GAP_CP_CONN_SUP_TIMEOUT_NONE 0xFFFF /**< No new supervision timeout specified in connect parameters. */ -#define BLE_GAP_CP_CONN_SUP_TIMEOUT_MIN 0x000A /**< Lowest supervision timeout permitted, in units of 10 ms, i.e. 100 ms. */ -#define BLE_GAP_CP_CONN_SUP_TIMEOUT_MAX 0x0C80 /**< Highest supervision timeout permitted, in units of 10 ms, i.e. 32 s. */ -/**@} */ - - -/**@defgroup BLE_GAP_DEVNAME GAP device name defines. - * @{ */ -#define BLE_GAP_DEVNAME_DEFAULT "nRF5x" /**< Default device name value. */ -#define BLE_GAP_DEVNAME_DEFAULT_LEN 31 /**< Default number of octets in device name. */ -#define BLE_GAP_DEVNAME_MAX_LEN 248 /**< Maximum number of octets in device name. */ -/**@} */ - - -/**@brief Disable RSSI events for connections */ -#define BLE_GAP_RSSI_THRESHOLD_INVALID 0xFF - -/**@defgroup BLE_GAP_PHYS GAP PHYs - * @{ */ -#define BLE_GAP_PHY_AUTO 0x00 /**< Automatic PHY selection. Refer @ref sd_ble_gap_phy_update for more information.*/ -#define BLE_GAP_PHY_1MBPS 0x01 /**< 1 Mbps PHY. */ -#define BLE_GAP_PHY_2MBPS 0x02 /**< 2 Mbps PHY. */ -#define BLE_GAP_PHY_CODED 0x04 /**< Coded PHY. */ -#define BLE_GAP_PHY_NOT_SET 0xFF /**< PHY is not configured. */ - -/**@brief Supported PHYs in connections, for scanning, and for advertising. */ -#define BLE_GAP_PHYS_SUPPORTED (BLE_GAP_PHY_1MBPS | BLE_GAP_PHY_2MBPS | BLE_GAP_PHY_CODED) /**< All PHYs are supported. */ - -/**@} */ - -/**@defgroup BLE_GAP_CONN_SEC_MODE_SET_MACROS GAP attribute security requirement setters - * - * See @ref ble_gap_conn_sec_mode_t. - * @{ */ -/**@brief Set sec_mode pointed to by ptr to have no access rights.*/ -#define BLE_GAP_CONN_SEC_MODE_SET_NO_ACCESS(ptr) do {(ptr)->sm = 0; (ptr)->lv = 0;} while(0) -/**@brief Set sec_mode pointed to by ptr to require no protection, open link.*/ -#define BLE_GAP_CONN_SEC_MODE_SET_OPEN(ptr) do {(ptr)->sm = 1; (ptr)->lv = 1;} while(0) -/**@brief Set sec_mode pointed to by ptr to require encryption, but no MITM protection.*/ -#define BLE_GAP_CONN_SEC_MODE_SET_ENC_NO_MITM(ptr) do {(ptr)->sm = 1; (ptr)->lv = 2;} while(0) -/**@brief Set sec_mode pointed to by ptr to require encryption and MITM protection.*/ -#define BLE_GAP_CONN_SEC_MODE_SET_ENC_WITH_MITM(ptr) do {(ptr)->sm = 1; (ptr)->lv = 3;} while(0) -/**@brief Set sec_mode pointed to by ptr to require LESC encryption and MITM protection.*/ -#define BLE_GAP_CONN_SEC_MODE_SET_LESC_ENC_WITH_MITM(ptr) do {(ptr)->sm = 1; (ptr)->lv = 4;} while(0) -/**@brief Set sec_mode pointed to by ptr to require signing or encryption, no MITM protection needed.*/ -#define BLE_GAP_CONN_SEC_MODE_SET_SIGNED_NO_MITM(ptr) do {(ptr)->sm = 2; (ptr)->lv = 1;} while(0) -/**@brief Set sec_mode pointed to by ptr to require signing or encryption with MITM protection.*/ -#define BLE_GAP_CONN_SEC_MODE_SET_SIGNED_WITH_MITM(ptr) do {(ptr)->sm = 2; (ptr)->lv = 2;} while(0) -/**@} */ - - -/**@brief GAP Security Random Number Length. */ -#define BLE_GAP_SEC_RAND_LEN 8 - - -/**@brief GAP Security Key Length. */ -#define BLE_GAP_SEC_KEY_LEN 16 - - -/**@brief GAP LE Secure Connections Elliptic Curve Diffie-Hellman P-256 Public Key Length. */ -#define BLE_GAP_LESC_P256_PK_LEN 64 - - -/**@brief GAP LE Secure Connections Elliptic Curve Diffie-Hellman DHKey Length. */ -#define BLE_GAP_LESC_DHKEY_LEN 32 - - -/**@brief GAP Passkey Length. */ -#define BLE_GAP_PASSKEY_LEN 6 - - -/**@brief Maximum amount of addresses in the whitelist. */ -#define BLE_GAP_WHITELIST_ADDR_MAX_COUNT (8) - - -/**@brief Maximum amount of identities in the device identities list. */ -#define BLE_GAP_DEVICE_IDENTITIES_MAX_COUNT (8) - - -/**@brief Default connection count for a configuration. */ -#define BLE_GAP_CONN_COUNT_DEFAULT (1) - - -/**@defgroup BLE_GAP_EVENT_LENGTH GAP event length defines. - * @{ */ -#define BLE_GAP_EVENT_LENGTH_MIN (2) /**< Minimum event length, in 1.25 ms units. */ -#define BLE_GAP_EVENT_LENGTH_CODED_PHY_MIN (6) /**< The shortest event length in 1.25 ms units supporting LE Coded PHY. */ -#define BLE_GAP_EVENT_LENGTH_DEFAULT (3) /**< Default event length, in 1.25 ms units. */ -/**@} */ - - -/**@defgroup BLE_GAP_ROLE_COUNT GAP concurrent connection count defines. - * @{ */ -#define BLE_GAP_ROLE_COUNT_PERIPH_DEFAULT (1) /**< Default maximum number of connections concurrently acting as peripherals. */ -#define BLE_GAP_ROLE_COUNT_CENTRAL_DEFAULT (3) /**< Default maximum number of connections concurrently acting as centrals. */ -#define BLE_GAP_ROLE_COUNT_CENTRAL_SEC_DEFAULT (1) /**< Default number of SMP instances shared between all connections acting as centrals. */ -#define BLE_GAP_ROLE_COUNT_COMBINED_MAX (20) /**< Maximum supported number of concurrent connections in the peripheral and central roles combined. */ - -/**@} */ - -/**@brief Automatic data length parameter. */ -#define BLE_GAP_DATA_LENGTH_AUTO 0 - -/**@defgroup BLE_GAP_AUTH_PAYLOAD_TIMEOUT Authenticated payload timeout defines. - * @{ */ -#define BLE_GAP_AUTH_PAYLOAD_TIMEOUT_MAX (48000) /**< Maximum authenticated payload timeout in 10 ms units, i.e. 8 minutes. */ -#define BLE_GAP_AUTH_PAYLOAD_TIMEOUT_MIN (1) /**< Minimum authenticated payload timeout in 10 ms units, i.e. 10 ms. */ -/**@} */ - -/**@defgroup GAP_SEC_MODES GAP Security Modes - * @{ */ -#define BLE_GAP_SEC_MODE 0x00 /**< No key (may be used to reject). */ -/**@} */ - -/**@brief The total number of channels in Bluetooth Low Energy. */ -#define BLE_GAP_CHANNEL_COUNT (40) - -/**@defgroup BLE_GAP_QOS_CHANNEL_SURVEY_INTERVALS Quality of Service (QoS) Channel survey interval defines - * @{ */ -#define BLE_GAP_QOS_CHANNEL_SURVEY_INTERVAL_CONTINUOUS (0) /**< Continuous channel survey. */ -#define BLE_GAP_QOS_CHANNEL_SURVEY_INTERVAL_MIN_US (7500) /**< Minimum channel survey interval in microseconds (7.5 ms). */ -#define BLE_GAP_QOS_CHANNEL_SURVEY_INTERVAL_MAX_US (4000000) /**< Maximum channel survey interval in microseconds (4 s). */ - /**@} */ - -/** @} */ - -/** @defgroup BLE_GAP_CHAR_INCL_CONFIG GAP Characteristic inclusion configurations - * @{ - */ -#define BLE_GAP_CHAR_INCL_CONFIG_INCLUDE (0) /**< Include the characteristic in the Attribute Table */ -#define BLE_GAP_CHAR_INCL_CONFIG_EXCLUDE_WITH_SPACE (1) /**< Do not include the characteristic in the Attribute table. - The SoftDevice will reserve the attribute handles - which are otherwise used for this characteristic. - By reserving the attribute handles it will be possible - to upgrade the SoftDevice without changing handle of the - Service Changed characteristic. */ -#define BLE_GAP_CHAR_INCL_CONFIG_EXCLUDE_WITHOUT_SPACE (2) /**< Do not include the characteristic in the Attribute table. - The SoftDevice will not reserve the attribute handles - which are otherwise used for this characteristic. */ -/**@} */ - - -/** @defgroup BLE_GAP_CHAR_INCL_CONFIG_DEFAULTS Characteristic inclusion default values - * @{ */ -#define BLE_GAP_PPCP_INCL_CONFIG_DEFAULT (BLE_GAP_CHAR_INCL_CONFIG_INCLUDE) /**< Included by default. */ -#define BLE_GAP_CAR_INCL_CONFIG_DEFAULT (BLE_GAP_CHAR_INCL_CONFIG_INCLUDE) /**< Included by default. */ -/**@} */ - -/** @defgroup BLE_GAP_SLAVE_LATENCY Slave latency configuration options - * @{ */ -#define BLE_GAP_SLAVE_LATENCY_ENABLE (0) /**< Slave latency is enabled. When slave latency is enabled, - the slave will wake up every time it has data to send, - and/or every slave latency number of connection events. */ -#define BLE_GAP_SLAVE_LATENCY_DISABLE (1) /**< Disable slave latency. The slave will wake up every connection event - regardless of the requested slave latency. - This option consumes the most power. */ -#define BLE_GAP_SLAVE_LATENCY_WAIT_FOR_ACK (2) /**< The slave will wake up every connection event if it has not received - an ACK from the master for at least slave latency events. This - configuration may increase the power consumption in environments - with a lot of radio activity. */ -/**@} */ - -/**@addtogroup BLE_GAP_STRUCTURES Structures - * @{ */ - -/**@brief Advertising event properties. */ -typedef struct -{ - uint8_t type; /**< Advertising type. See @ref BLE_GAP_ADV_TYPES. */ - uint8_t anonymous : 1; /**< Omit advertiser's address from all PDUs. - @note Anonymous advertising is only available for - @ref BLE_GAP_ADV_TYPE_EXTENDED_NONCONNECTABLE_NONSCANNABLE_UNDIRECTED and - @ref BLE_GAP_ADV_TYPE_EXTENDED_NONCONNECTABLE_NONSCANNABLE_DIRECTED. */ - uint8_t include_tx_power : 1; /**< This feature is not supported on this SoftDevice. */ -} ble_gap_adv_properties_t; - - -/**@brief Advertising report type. */ -typedef struct -{ - uint16_t connectable : 1; /**< Connectable advertising event type. */ - uint16_t scannable : 1; /**< Scannable advertising event type. */ - uint16_t directed : 1; /**< Directed advertising event type. */ - uint16_t scan_response : 1; /**< Received a scan response. */ - uint16_t extended_pdu : 1; /**< Received an extended advertising set. */ - uint16_t status : 2; /**< Data status. See @ref BLE_GAP_ADV_DATA_STATUS. */ - uint16_t reserved : 9; /**< Reserved for future use. */ -} ble_gap_adv_report_type_t; - -/**@brief Advertising Auxiliary Pointer. */ -typedef struct -{ - uint16_t aux_offset; /**< Time offset from the beginning of advertising packet to the auxiliary packet in 100 us units. */ - uint8_t aux_phy; /**< Indicates the PHY on which the auxiliary advertising packet is sent. See @ref BLE_GAP_PHYS. */ -} ble_gap_aux_pointer_t; - -/**@brief Bluetooth Low Energy address. */ -typedef struct -{ - uint8_t addr_id_peer : 1; /**< Only valid for peer addresses. - This bit is set by the SoftDevice to indicate whether the address has been resolved from - a Resolvable Private Address (when the peer is using privacy). - If set to 1, @ref addr and @ref addr_type refer to the identity address of the resolved address. - - This bit is ignored when a variable of type @ref ble_gap_addr_t is used as input to API functions. */ - uint8_t addr_type : 7; /**< See @ref BLE_GAP_ADDR_TYPES. */ - uint8_t addr[BLE_GAP_ADDR_LEN]; /**< 48-bit address, LSB format. - @ref addr is not used if @ref addr_type is @ref BLE_GAP_ADDR_TYPE_ANONYMOUS. */ -} ble_gap_addr_t; - - -/**@brief GAP connection parameters. - * - * @note When ble_conn_params_t is received in an event, both min_conn_interval and - * max_conn_interval will be equal to the connection interval set by the central. - * - * @note If both conn_sup_timeout and max_conn_interval are specified, then the following constraint applies: - * conn_sup_timeout * 4 > (1 + slave_latency) * max_conn_interval - * that corresponds to the following Bluetooth Spec requirement: - * The Supervision_Timeout in milliseconds shall be larger than - * (1 + Conn_Latency) * Conn_Interval_Max * 2, where Conn_Interval_Max is given in milliseconds. - */ -typedef struct -{ - uint16_t min_conn_interval; /**< Minimum Connection Interval in 1.25 ms units, see @ref BLE_GAP_CP_LIMITS.*/ - uint16_t max_conn_interval; /**< Maximum Connection Interval in 1.25 ms units, see @ref BLE_GAP_CP_LIMITS.*/ - uint16_t slave_latency; /**< Slave Latency in number of connection events, see @ref BLE_GAP_CP_LIMITS.*/ - uint16_t conn_sup_timeout; /**< Connection Supervision Timeout in 10 ms units, see @ref BLE_GAP_CP_LIMITS.*/ -} ble_gap_conn_params_t; - - -/**@brief GAP connection security modes. - * - * Security Mode 0 Level 0: No access permissions at all (this level is not defined by the Bluetooth Core specification).\n - * Security Mode 1 Level 1: No security is needed (aka open link).\n - * Security Mode 1 Level 2: Encrypted link required, MITM protection not necessary.\n - * Security Mode 1 Level 3: MITM protected encrypted link required.\n - * Security Mode 1 Level 4: LESC MITM protected encrypted link using a 128-bit strength encryption key required.\n - * Security Mode 2 Level 1: Signing or encryption required, MITM protection not necessary.\n - * Security Mode 2 Level 2: MITM protected signing required, unless link is MITM protected encrypted.\n - */ -typedef struct -{ - uint8_t sm : 4; /**< Security Mode (1 or 2), 0 for no permissions at all. */ - uint8_t lv : 4; /**< Level (1, 2, 3 or 4), 0 for no permissions at all. */ - -} ble_gap_conn_sec_mode_t; - - -/**@brief GAP connection security status.*/ -typedef struct -{ - ble_gap_conn_sec_mode_t sec_mode; /**< Currently active security mode for this connection.*/ - uint8_t encr_key_size; /**< Length of currently active encryption key, 7 to 16 octets (only applicable for bonding procedures). */ -} ble_gap_conn_sec_t; - -/**@brief Identity Resolving Key. */ -typedef struct -{ - uint8_t irk[BLE_GAP_SEC_KEY_LEN]; /**< Array containing IRK. */ -} ble_gap_irk_t; - - -/**@brief Channel mask (40 bits). - * Every channel is represented with a bit positioned as per channel index defined in Bluetooth Core Specification v5.0, - * Vol 6, Part B, Section 1.4.1. The LSB contained in array element 0 represents channel index 0, and bit 39 represents - * channel index 39. If a bit is set to 1, the channel is not used. - */ -typedef uint8_t ble_gap_ch_mask_t[5]; - - -/**@brief GAP advertising parameters. */ -typedef struct -{ - ble_gap_adv_properties_t properties; /**< The properties of the advertising events. */ - ble_gap_addr_t const *p_peer_addr; /**< Address of a known peer. - @note ble_gap_addr_t::addr_type cannot be - @ref BLE_GAP_ADDR_TYPE_ANONYMOUS. - - When privacy is enabled and the local device uses - @ref BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE addresses, - the device identity list is searched for a matching entry. If - the local IRK for that device identity is set, the local IRK - for that device will be used to generate the advertiser address - field in the advertising packet. - - If @ref ble_gap_adv_properties_t::type is directed, this must be - set to the targeted scanner or initiator. If the peer address is - in the device identity list, the peer IRK for that device will be - used to generate @ref BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE - target addresses used in the advertising event PDUs. */ - uint32_t interval; /**< Advertising interval in 625 us units. @sa BLE_GAP_ADV_INTERVALS. - @note If @ref ble_gap_adv_properties_t::type is set to - @ref BLE_GAP_ADV_TYPE_CONNECTABLE_NONSCANNABLE_DIRECTED_HIGH_DUTY_CYCLE - advertising, this parameter is ignored. */ - uint16_t duration; /**< Advertising duration in 10 ms units. When timeout is reached, - an event of type @ref BLE_GAP_EVT_ADV_SET_TERMINATED is raised. - @sa BLE_GAP_ADV_TIMEOUT_VALUES. - @note The SoftDevice will always complete at least one advertising - event even if the duration is set too low. */ - uint8_t max_adv_evts; /**< Maximum advertising events that shall be sent prior to disabling - advertising. Setting the value to 0 disables the limitation. When - the count of advertising events specified by this parameter - (if not 0) is reached, advertising will be automatically stopped - and an event of type @ref BLE_GAP_EVT_ADV_SET_TERMINATED is raised - @note If @ref ble_gap_adv_properties_t::type is set to - @ref BLE_GAP_ADV_TYPE_CONNECTABLE_NONSCANNABLE_DIRECTED_HIGH_DUTY_CYCLE, - this parameter is ignored. */ - ble_gap_ch_mask_t channel_mask; /**< Channel mask for primary and secondary advertising channels. - At least one of the primary channels, that is channel index 37-39, must be used. - Masking away secondary advertising channels is not supported. */ - uint8_t filter_policy; /**< Filter Policy. @sa BLE_GAP_ADV_FILTER_POLICIES. */ - uint8_t primary_phy; /**< Indicates the PHY on which the primary advertising channel packets - are transmitted. If set to @ref BLE_GAP_PHY_AUTO, @ref BLE_GAP_PHY_1MBPS - will be used. - Valid values are @ref BLE_GAP_PHY_1MBPS and @ref BLE_GAP_PHY_CODED. - @note The primary_phy shall indicate @ref BLE_GAP_PHY_1MBPS if - @ref ble_gap_adv_properties_t::type is not an extended advertising type. */ - uint8_t secondary_phy; /**< Indicates the PHY on which the secondary advertising channel packets - are transmitted. - If set to @ref BLE_GAP_PHY_AUTO, @ref BLE_GAP_PHY_1MBPS will be used. - Valid values are - @ref BLE_GAP_PHY_1MBPS, @ref BLE_GAP_PHY_2MBPS, and @ref BLE_GAP_PHY_CODED. - If @ref ble_gap_adv_properties_t::type is an extended advertising type - and connectable, this is the PHY that will be used to establish a - connection and send AUX_ADV_IND packets on. - @note This parameter will be ignored when - @ref ble_gap_adv_properties_t::type is not an extended advertising type. */ - uint8_t set_id:4; /**< The advertising set identifier distinguishes this advertising set from other - advertising sets transmitted by this and other devices. - @note This parameter will be ignored when - @ref ble_gap_adv_properties_t::type is not an extended advertising type. */ - uint8_t scan_req_notification:1; /**< Enable scan request notifications for this advertising set. When a - scan request is received and the scanner address is allowed - by the filter policy, @ref BLE_GAP_EVT_SCAN_REQ_REPORT is raised. - @note This parameter will be ignored when - @ref ble_gap_adv_properties_t::type is a non-scannable - advertising type. */ -} ble_gap_adv_params_t; - - -/**@brief GAP advertising data buffers. - * - * The application must provide the buffers for advertisement. The memory shall reside in application RAM, and - * shall never be modified while advertising. The data shall be kept alive until either: - * - @ref BLE_GAP_EVT_ADV_SET_TERMINATED is raised. - * - @ref BLE_GAP_EVT_CONNECTED is raised with @ref ble_gap_evt_connected_t::adv_handle set to the corresponding - * advertising handle. - * - Advertising is stopped. - * - Advertising data is changed. - * To update advertising data while advertising, provide new buffers to @ref sd_ble_gap_adv_set_configure. */ -typedef struct -{ - ble_data_t adv_data; /**< Advertising data. - @note - Advertising data can only be specified for a @ref ble_gap_adv_properties_t::type - that is allowed to contain advertising data. */ - ble_data_t scan_rsp_data; /**< Scan response data. - @note - Scan response data can only be specified for a @ref ble_gap_adv_properties_t::type - that is scannable. */ -} ble_gap_adv_data_t; - - -/**@brief GAP scanning parameters. */ -typedef struct -{ - uint8_t extended : 1; /**< If 1, the scanner will accept extended advertising packets. - If set to 0, the scanner will not receive advertising packets - on secondary advertising channels, and will not be able - to receive long advertising PDUs. */ - uint8_t report_incomplete_evts : 1; /**< If 1, events of type @ref ble_gap_evt_adv_report_t may have - @ref ble_gap_adv_report_type_t::status set to - @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA. - This parameter is ignored when used with @ref sd_ble_gap_connect - @note This may be used to abort receiving more packets from an extended - advertising event, and is only available for extended - scanning, see @ref sd_ble_gap_scan_start. - @note This feature is not supported by this SoftDevice. */ - uint8_t active : 1; /**< If 1, perform active scanning by sending scan requests. - This parameter is ignored when used with @ref sd_ble_gap_connect. */ - uint8_t filter_policy : 2; /**< Scanning filter policy. @sa BLE_GAP_SCAN_FILTER_POLICIES. - @note Only @ref BLE_GAP_SCAN_FP_ACCEPT_ALL and - @ref BLE_GAP_SCAN_FP_WHITELIST are valid when used with - @ref sd_ble_gap_connect */ - uint8_t scan_phys; /**< Bitfield of PHYs to scan on. If set to @ref BLE_GAP_PHY_AUTO, - scan_phys will default to @ref BLE_GAP_PHY_1MBPS. - - If @ref ble_gap_scan_params_t::extended is set to 0, the only - supported PHY is @ref BLE_GAP_PHY_1MBPS. - - When used with @ref sd_ble_gap_scan_start, - the bitfield indicates the PHYs the scanner will use for scanning - on primary advertising channels. The scanner will accept - @ref BLE_GAP_PHYS_SUPPORTED as secondary advertising channel PHYs. - - When used with @ref sd_ble_gap_connect, the bitfield indicates - the PHYs the initiator will use for scanning on primary advertising - channels. The initiator will accept connections initiated on either - of the @ref BLE_GAP_PHYS_SUPPORTED PHYs. - If scan_phys contains @ref BLE_GAP_PHY_1MBPS and/or @ref BLE_GAP_PHY_2MBPS, - the primary scan PHY is @ref BLE_GAP_PHY_1MBPS. - If scan_phys also contains @ref BLE_GAP_PHY_CODED, the primary scan - PHY will also contain @ref BLE_GAP_PHY_CODED. If the only scan PHY is - @ref BLE_GAP_PHY_CODED, the primary scan PHY is - @ref BLE_GAP_PHY_CODED only. */ - uint16_t interval; /**< Scan interval in 625 us units. @sa BLE_GAP_SCAN_INTERVALS. */ - uint16_t window; /**< Scan window in 625 us units. @sa BLE_GAP_SCAN_WINDOW. - If scan_phys contains both @ref BLE_GAP_PHY_1MBPS and - @ref BLE_GAP_PHY_CODED interval shall be larger than or - equal to twice the scan window. */ - uint16_t timeout; /**< Scan timeout in 10 ms units. @sa BLE_GAP_SCAN_TIMEOUT. */ - ble_gap_ch_mask_t channel_mask; /**< Channel mask for primary and secondary advertising channels. - At least one of the primary channels, that is channel index 37-39, must be - set to 0. - Masking away secondary channels is not supported. */ -} ble_gap_scan_params_t; - - -/**@brief Privacy. - * - * The privacy feature provides a way for the device to avoid being tracked over a period of time. - * The privacy feature, when enabled, hides the local device identity and replaces it with a private address - * that is automatically refreshed at a specified interval. - * - * If a device still wants to be recognized by other peers, it needs to share it's Identity Resolving Key (IRK). - * With this key, a device can generate a random private address that can only be recognized by peers in possession of that key, - * and devices can establish connections without revealing their real identities. - * - * Both network privacy (@ref BLE_GAP_PRIVACY_MODE_NETWORK_PRIVACY) and device privacy (@ref BLE_GAP_PRIVACY_MODE_DEVICE_PRIVACY) - * are supported. - * - * @note If the device IRK is updated, the new IRK becomes the one to be distributed in all - * bonding procedures performed after @ref sd_ble_gap_privacy_set returns. - * The IRK distributed during bonding procedure is the device IRK that is active when @ref sd_ble_gap_sec_params_reply is called. - */ -typedef struct -{ - uint8_t privacy_mode; /**< Privacy mode, see @ref BLE_GAP_PRIVACY_MODES. Default is @ref BLE_GAP_PRIVACY_MODE_OFF. */ - uint8_t private_addr_type; /**< The private address type must be either @ref BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE or @ref BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_NON_RESOLVABLE. */ - uint16_t private_addr_cycle_s; /**< Private address cycle interval in seconds. Providing an address cycle value of 0 will use the default value defined by @ref BLE_GAP_DEFAULT_PRIVATE_ADDR_CYCLE_INTERVAL_S. */ - ble_gap_irk_t *p_device_irk; /**< When used as input, pointer to IRK structure that will be used as the default IRK. If NULL, the device default IRK will be used. - When used as output, pointer to IRK structure where the current default IRK will be written to. If NULL, this argument is ignored. - By default, the default IRK is used to generate random private resolvable addresses for the local device unless instructed otherwise. */ -} ble_gap_privacy_params_t; - - -/**@brief PHY preferences for TX and RX - * @note tx_phys and rx_phys are bit fields. Multiple bits can be set in them to indicate multiple preferred PHYs for each direction. - * @code - * p_gap_phys->tx_phys = BLE_GAP_PHY_1MBPS | BLE_GAP_PHY_2MBPS; - * p_gap_phys->rx_phys = BLE_GAP_PHY_1MBPS | BLE_GAP_PHY_2MBPS; - * @endcode - * - */ -typedef struct -{ - uint8_t tx_phys; /**< Preferred transmit PHYs, see @ref BLE_GAP_PHYS. */ - uint8_t rx_phys; /**< Preferred receive PHYs, see @ref BLE_GAP_PHYS. */ -} ble_gap_phys_t; - -/** @brief Keys that can be exchanged during a bonding procedure. */ -typedef struct -{ - uint8_t enc : 1; /**< Long Term Key and Master Identification. */ - uint8_t id : 1; /**< Identity Resolving Key and Identity Address Information. */ - uint8_t sign : 1; /**< Connection Signature Resolving Key. */ - uint8_t link : 1; /**< Derive the Link Key from the LTK. */ -} ble_gap_sec_kdist_t; - - -/**@brief GAP security parameters. */ -typedef struct -{ - uint8_t bond : 1; /**< Perform bonding. */ - uint8_t mitm : 1; /**< Enable Man In The Middle protection. */ - uint8_t lesc : 1; /**< Enable LE Secure Connection pairing. */ - uint8_t keypress : 1; /**< Enable generation of keypress notifications. */ - uint8_t io_caps : 3; /**< IO capabilities, see @ref BLE_GAP_IO_CAPS. */ - uint8_t oob : 1; /**< The OOB data flag. - - In LE legacy pairing, this flag is set if a device has out of band authentication data. - The OOB method is used if both of the devices have out of band authentication data. - - In LE Secure Connections pairing, this flag is set if a device has the peer device's out of band authentication data. - The OOB method is used if at least one device has the peer device's OOB data available. */ - uint8_t min_key_size; /**< Minimum encryption key size in octets between 7 and 16. If 0 then not applicable in this instance. */ - uint8_t max_key_size; /**< Maximum encryption key size in octets between min_key_size and 16. */ - ble_gap_sec_kdist_t kdist_own; /**< Key distribution bitmap: keys that the local device will distribute. */ - ble_gap_sec_kdist_t kdist_peer; /**< Key distribution bitmap: keys that the remote device will distribute. */ -} ble_gap_sec_params_t; - - -/**@brief GAP Encryption Information. */ -typedef struct -{ - uint8_t ltk[BLE_GAP_SEC_KEY_LEN]; /**< Long Term Key. */ - uint8_t lesc : 1; /**< Key generated using LE Secure Connections. */ - uint8_t auth : 1; /**< Authenticated Key. */ - uint8_t ltk_len : 6; /**< LTK length in octets. */ -} ble_gap_enc_info_t; - - -/**@brief GAP Master Identification. */ -typedef struct -{ - uint16_t ediv; /**< Encrypted Diversifier. */ - uint8_t rand[BLE_GAP_SEC_RAND_LEN]; /**< Random Number. */ -} ble_gap_master_id_t; - - -/**@brief GAP Signing Information. */ -typedef struct -{ - uint8_t csrk[BLE_GAP_SEC_KEY_LEN]; /**< Connection Signature Resolving Key. */ -} ble_gap_sign_info_t; - - -/**@brief GAP LE Secure Connections P-256 Public Key. */ -typedef struct -{ - uint8_t pk[BLE_GAP_LESC_P256_PK_LEN]; /**< LE Secure Connections Elliptic Curve Diffie-Hellman P-256 Public Key. Stored in the standard SMP protocol format: {X,Y} both in little-endian. */ -} ble_gap_lesc_p256_pk_t; - - -/**@brief GAP LE Secure Connections DHKey. */ -typedef struct -{ - uint8_t key[BLE_GAP_LESC_DHKEY_LEN]; /**< LE Secure Connections Elliptic Curve Diffie-Hellman Key. Stored in little-endian. */ -} ble_gap_lesc_dhkey_t; - - -/**@brief GAP LE Secure Connections OOB data. */ -typedef struct -{ - ble_gap_addr_t addr; /**< Bluetooth address of the device. */ - uint8_t r[BLE_GAP_SEC_KEY_LEN]; /**< Random Number. */ - uint8_t c[BLE_GAP_SEC_KEY_LEN]; /**< Confirm Value. */ -} ble_gap_lesc_oob_data_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_CONNECTED. */ -typedef struct -{ - ble_gap_addr_t peer_addr; /**< Bluetooth address of the peer device. If the peer_addr resolved: @ref ble_gap_addr_t::addr_id_peer is set to 1 - and the address is the device's identity address. */ - uint8_t role; /**< BLE role for this connection, see @ref BLE_GAP_ROLES */ - ble_gap_conn_params_t conn_params; /**< GAP Connection Parameters. */ - uint8_t adv_handle; /**< Advertising handle in which advertising has ended. - This variable is only set if role is set to @ref BLE_GAP_ROLE_PERIPH. */ - ble_gap_adv_data_t adv_data; /**< Advertising buffers corresponding to the terminated - advertising set. The advertising buffers provided in - @ref sd_ble_gap_adv_set_configure are now released. - This variable is only set if role is set to @ref BLE_GAP_ROLE_PERIPH. */ -} ble_gap_evt_connected_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_DISCONNECTED. */ -typedef struct -{ - uint8_t reason; /**< HCI error code, see @ref BLE_HCI_STATUS_CODES. */ -} ble_gap_evt_disconnected_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_CONN_PARAM_UPDATE. */ -typedef struct -{ - ble_gap_conn_params_t conn_params; /**< GAP Connection Parameters. */ -} ble_gap_evt_conn_param_update_t; - -/**@brief Event structure for @ref BLE_GAP_EVT_PHY_UPDATE_REQUEST. */ -typedef struct -{ - ble_gap_phys_t peer_preferred_phys; /**< The PHYs the peer prefers to use. */ -} ble_gap_evt_phy_update_request_t; - -/**@brief Event Structure for @ref BLE_GAP_EVT_PHY_UPDATE. */ -typedef struct -{ - uint8_t status; /**< Status of the procedure, see @ref BLE_HCI_STATUS_CODES.*/ - uint8_t tx_phy; /**< TX PHY for this connection, see @ref BLE_GAP_PHYS. */ - uint8_t rx_phy; /**< RX PHY for this connection, see @ref BLE_GAP_PHYS. */ -} ble_gap_evt_phy_update_t; - -/**@brief Event structure for @ref BLE_GAP_EVT_SEC_PARAMS_REQUEST. */ -typedef struct -{ - ble_gap_sec_params_t peer_params; /**< Initiator Security Parameters. */ -} ble_gap_evt_sec_params_request_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_SEC_INFO_REQUEST. */ -typedef struct -{ - ble_gap_addr_t peer_addr; /**< Bluetooth address of the peer device. */ - ble_gap_master_id_t master_id; /**< Master Identification for LTK lookup. */ - uint8_t enc_info : 1; /**< If 1, Encryption Information required. */ - uint8_t id_info : 1; /**< If 1, Identity Information required. */ - uint8_t sign_info : 1; /**< If 1, Signing Information required. */ -} ble_gap_evt_sec_info_request_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_PASSKEY_DISPLAY. */ -typedef struct -{ - uint8_t passkey[BLE_GAP_PASSKEY_LEN]; /**< 6-digit passkey in ASCII ('0'-'9' digits only). */ - uint8_t match_request : 1; /**< If 1 requires the application to report the match using @ref sd_ble_gap_auth_key_reply - with either @ref BLE_GAP_AUTH_KEY_TYPE_NONE if there is no match or - @ref BLE_GAP_AUTH_KEY_TYPE_PASSKEY if there is a match. */ -} ble_gap_evt_passkey_display_t; - -/**@brief Event structure for @ref BLE_GAP_EVT_KEY_PRESSED. */ -typedef struct -{ - uint8_t kp_not; /**< Keypress notification type, see @ref BLE_GAP_KP_NOT_TYPES. */ -} ble_gap_evt_key_pressed_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_AUTH_KEY_REQUEST. */ -typedef struct -{ - uint8_t key_type; /**< See @ref BLE_GAP_AUTH_KEY_TYPES. */ -} ble_gap_evt_auth_key_request_t; - -/**@brief Event structure for @ref BLE_GAP_EVT_LESC_DHKEY_REQUEST. */ -typedef struct -{ - ble_gap_lesc_p256_pk_t *p_pk_peer; /**< LE Secure Connections remote P-256 Public Key. This will point to the application-supplied memory - inside the keyset during the call to @ref sd_ble_gap_sec_params_reply. */ - uint8_t oobd_req :1; /**< LESC OOB data required. A call to @ref sd_ble_gap_lesc_oob_data_set is required to complete the procedure. */ -} ble_gap_evt_lesc_dhkey_request_t; - - -/**@brief Security levels supported. - * @note See Bluetooth Specification Version 4.2 Volume 3, Part C, Chapter 10, Section 10.2.1. -*/ -typedef struct -{ - uint8_t lv1 : 1; /**< If 1: Level 1 is supported. */ - uint8_t lv2 : 1; /**< If 1: Level 2 is supported. */ - uint8_t lv3 : 1; /**< If 1: Level 3 is supported. */ - uint8_t lv4 : 1; /**< If 1: Level 4 is supported. */ -} ble_gap_sec_levels_t; - - -/**@brief Encryption Key. */ -typedef struct -{ - ble_gap_enc_info_t enc_info; /**< Encryption Information. */ - ble_gap_master_id_t master_id; /**< Master Identification. */ -} ble_gap_enc_key_t; - - -/**@brief Identity Key. */ -typedef struct -{ - ble_gap_irk_t id_info; /**< Identity Resolving Key. */ - ble_gap_addr_t id_addr_info; /**< Identity Address. */ -} ble_gap_id_key_t; - - -/**@brief Security Keys. */ -typedef struct -{ - ble_gap_enc_key_t *p_enc_key; /**< Encryption Key, or NULL. */ - ble_gap_id_key_t *p_id_key; /**< Identity Key, or NULL. */ - ble_gap_sign_info_t *p_sign_key; /**< Signing Key, or NULL. */ - ble_gap_lesc_p256_pk_t *p_pk; /**< LE Secure Connections P-256 Public Key. When in debug mode the application must use the value defined - in the Core Bluetooth Specification v4.2 Vol.3, Part H, Section 2.3.5.6.1 */ -} ble_gap_sec_keys_t; - - -/**@brief Security key set for both local and peer keys. */ -typedef struct -{ - ble_gap_sec_keys_t keys_own; /**< Keys distributed by the local device. For LE Secure Connections the encryption key will be generated locally and will always be stored if bonding. */ - ble_gap_sec_keys_t keys_peer; /**< Keys distributed by the remote device. For LE Secure Connections, p_enc_key must always be NULL. */ -} ble_gap_sec_keyset_t; - - -/**@brief Data Length Update Procedure parameters. */ -typedef struct -{ - uint16_t max_tx_octets; /**< Maximum number of payload octets that a Controller supports for transmission of a single Link Layer Data Channel PDU. */ - uint16_t max_rx_octets; /**< Maximum number of payload octets that a Controller supports for reception of a single Link Layer Data Channel PDU. */ - uint16_t max_tx_time_us; /**< Maximum time, in microseconds, that a Controller supports for transmission of a single Link Layer Data Channel PDU. */ - uint16_t max_rx_time_us; /**< Maximum time, in microseconds, that a Controller supports for reception of a single Link Layer Data Channel PDU. */ -} ble_gap_data_length_params_t; - - -/**@brief Data Length Update Procedure local limitation. */ -typedef struct -{ - uint16_t tx_payload_limited_octets; /**< If > 0, the requested TX packet length is too long by this many octets. */ - uint16_t rx_payload_limited_octets; /**< If > 0, the requested RX packet length is too long by this many octets. */ - uint16_t tx_rx_time_limited_us; /**< If > 0, the requested combination of TX and RX packet lengths is too long by this many microseconds. */ -} ble_gap_data_length_limitation_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_AUTH_STATUS. */ -typedef struct -{ - uint8_t auth_status; /**< Authentication status, see @ref BLE_GAP_SEC_STATUS. */ - uint8_t error_src : 2; /**< On error, source that caused the failure, see @ref BLE_GAP_SEC_STATUS_SOURCES. */ - uint8_t bonded : 1; /**< Procedure resulted in a bond. */ - uint8_t lesc : 1; /**< Procedure resulted in a LE Secure Connection. */ - ble_gap_sec_levels_t sm1_levels; /**< Levels supported in Security Mode 1. */ - ble_gap_sec_levels_t sm2_levels; /**< Levels supported in Security Mode 2. */ - ble_gap_sec_kdist_t kdist_own; /**< Bitmap stating which keys were exchanged (distributed) by the local device. If bonding with LE Secure Connections, the enc bit will be always set. */ - ble_gap_sec_kdist_t kdist_peer; /**< Bitmap stating which keys were exchanged (distributed) by the remote device. If bonding with LE Secure Connections, the enc bit will never be set. */ -} ble_gap_evt_auth_status_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_CONN_SEC_UPDATE. */ -typedef struct -{ - ble_gap_conn_sec_t conn_sec; /**< Connection security level. */ -} ble_gap_evt_conn_sec_update_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_TIMEOUT. */ -typedef struct -{ - uint8_t src; /**< Source of timeout event, see @ref BLE_GAP_TIMEOUT_SOURCES. */ - union - { - ble_data_t adv_report_buffer; /**< If source is set to @ref BLE_GAP_TIMEOUT_SRC_SCAN, the released - scan buffer is contained in this field. */ - } params; /**< Event Parameters. */ -} ble_gap_evt_timeout_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_RSSI_CHANGED. */ -typedef struct -{ - int8_t rssi; /**< Received Signal Strength Indication in dBm. - @note ERRATA-153 and ERRATA-225 require the rssi sample to be compensated based on a temperature measurement. */ - uint8_t ch_index; /**< Data Channel Index on which the Signal Strength is measured (0-36). */ -} ble_gap_evt_rssi_changed_t; - -/**@brief Event structure for @ref BLE_GAP_EVT_ADV_SET_TERMINATED */ -typedef struct -{ - uint8_t reason; /**< Reason for why the advertising set terminated. See - @ref BLE_GAP_EVT_ADV_SET_TERMINATED_REASON. */ - uint8_t adv_handle; /**< Advertising handle in which advertising has ended. */ - uint8_t num_completed_adv_events; /**< If @ref ble_gap_adv_params_t::max_adv_evts was not set to 0, - this field indicates the number of completed advertising events. */ - ble_gap_adv_data_t adv_data; /**< Advertising buffers corresponding to the terminated - advertising set. The advertising buffers provided in - @ref sd_ble_gap_adv_set_configure are now released. */ -} ble_gap_evt_adv_set_terminated_t; - -/**@brief Event structure for @ref BLE_GAP_EVT_ADV_REPORT. - * - * @note If @ref ble_gap_adv_report_type_t::status is set to @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA, - * not all fields in the advertising report may be available. - * - * @note When ble_gap_adv_report_type_t::status is not set to @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA, - * scanning will be paused. To continue scanning, call @ref sd_ble_gap_scan_start. - */ -typedef struct -{ - ble_gap_adv_report_type_t type; /**< Advertising report type. See @ref ble_gap_adv_report_type_t. */ - ble_gap_addr_t peer_addr; /**< Bluetooth address of the peer device. If the peer_addr is resolved: - @ref ble_gap_addr_t::addr_id_peer is set to 1 and the address is the - peer's identity address. */ - ble_gap_addr_t direct_addr; /**< Contains the target address of the advertising event if - @ref ble_gap_adv_report_type_t::directed is set to 1. If the - SoftDevice was able to resolve the address, - @ref ble_gap_addr_t::addr_id_peer is set to 1 and the direct_addr - contains the local identity address. If the target address of the - advertising event is @ref BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE, - and the SoftDevice was unable to resolve it, the application may try - to resolve this address to find out if the advertising event was - directed to us. */ - uint8_t primary_phy; /**< Indicates the PHY on which the primary advertising packet was received. - See @ref BLE_GAP_PHYS. */ - uint8_t secondary_phy; /**< Indicates the PHY on which the secondary advertising packet was received. - See @ref BLE_GAP_PHYS. This field is set to @ref BLE_GAP_PHY_NOT_SET if no packets - were received on a secondary advertising channel. */ - int8_t tx_power; /**< TX Power reported by the advertiser in the last packet header received. - This field is set to @ref BLE_GAP_POWER_LEVEL_INVALID if the - last received packet did not contain the Tx Power field. - @note TX Power is only included in extended advertising packets. */ - int8_t rssi; /**< Received Signal Strength Indication in dBm of the last packet received. - @note ERRATA-153 and ERRATA-225 require the rssi sample to be compensated based on a temperature measurement. */ - uint8_t ch_index; /**< Channel Index on which the last advertising packet is received (0-39). */ - uint8_t set_id; /**< Set ID of the received advertising data. Set ID is not present - if set to @ref BLE_GAP_ADV_REPORT_SET_ID_NOT_AVAILABLE. */ - uint16_t data_id:12; /**< The advertising data ID of the received advertising data. Data ID - is not present if @ref ble_gap_evt_adv_report_t::set_id is set to - @ref BLE_GAP_ADV_REPORT_SET_ID_NOT_AVAILABLE. */ - ble_data_t data; /**< Received advertising or scan response data. If - @ref ble_gap_adv_report_type_t::status is not set to - @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA, the data buffer provided - in @ref sd_ble_gap_scan_start is now released. */ - ble_gap_aux_pointer_t aux_pointer; /**< The offset and PHY of the next advertising packet in this extended advertising - event. @note This field is only set if @ref ble_gap_adv_report_type_t::status - is set to @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA. */ -} ble_gap_evt_adv_report_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_SEC_REQUEST. */ -typedef struct -{ - uint8_t bond : 1; /**< Perform bonding. */ - uint8_t mitm : 1; /**< Man In The Middle protection requested. */ - uint8_t lesc : 1; /**< LE Secure Connections requested. */ - uint8_t keypress : 1; /**< Generation of keypress notifications requested. */ -} ble_gap_evt_sec_request_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST. */ -typedef struct -{ - ble_gap_conn_params_t conn_params; /**< GAP Connection Parameters. */ -} ble_gap_evt_conn_param_update_request_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_SCAN_REQ_REPORT. */ -typedef struct -{ - uint8_t adv_handle; /**< Advertising handle for the advertising set which received the Scan Request */ - int8_t rssi; /**< Received Signal Strength Indication in dBm. - @note ERRATA-153 and ERRATA-225 require the rssi sample to be compensated based on a temperature measurement. */ - ble_gap_addr_t peer_addr; /**< Bluetooth address of the peer device. If the peer_addr resolved: @ref ble_gap_addr_t::addr_id_peer is set to 1 - and the address is the device's identity address. */ -} ble_gap_evt_scan_req_report_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST. */ -typedef struct -{ - ble_gap_data_length_params_t peer_params; /**< Peer data length parameters. */ -} ble_gap_evt_data_length_update_request_t; - -/**@brief Event structure for @ref BLE_GAP_EVT_DATA_LENGTH_UPDATE. - * - * @note This event may also be raised after a PHY Update procedure. - */ -typedef struct -{ - ble_gap_data_length_params_t effective_params; /**< The effective data length parameters. */ -} ble_gap_evt_data_length_update_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_QOS_CHANNEL_SURVEY_REPORT. */ -typedef struct -{ - int8_t channel_energy[BLE_GAP_CHANNEL_COUNT]; /**< The measured energy on the Bluetooth Low Energy - channels, in dBm, indexed by Channel Index. - If no measurement is available for the given channel, channel_energy is set to - @ref BLE_GAP_POWER_LEVEL_INVALID. */ -} ble_gap_evt_qos_channel_survey_report_t; - -/**@brief GAP event structure. */ -typedef struct -{ - uint16_t conn_handle; /**< Connection Handle on which event occurred. */ - union /**< union alternative identified by evt_id in enclosing struct. */ - { - ble_gap_evt_connected_t connected; /**< Connected Event Parameters. */ - ble_gap_evt_disconnected_t disconnected; /**< Disconnected Event Parameters. */ - ble_gap_evt_conn_param_update_t conn_param_update; /**< Connection Parameter Update Parameters. */ - ble_gap_evt_sec_params_request_t sec_params_request; /**< Security Parameters Request Event Parameters. */ - ble_gap_evt_sec_info_request_t sec_info_request; /**< Security Information Request Event Parameters. */ - ble_gap_evt_passkey_display_t passkey_display; /**< Passkey Display Event Parameters. */ - ble_gap_evt_key_pressed_t key_pressed; /**< Key Pressed Event Parameters. */ - ble_gap_evt_auth_key_request_t auth_key_request; /**< Authentication Key Request Event Parameters. */ - ble_gap_evt_lesc_dhkey_request_t lesc_dhkey_request; /**< LE Secure Connections DHKey calculation request. */ - ble_gap_evt_auth_status_t auth_status; /**< Authentication Status Event Parameters. */ - ble_gap_evt_conn_sec_update_t conn_sec_update; /**< Connection Security Update Event Parameters. */ - ble_gap_evt_timeout_t timeout; /**< Timeout Event Parameters. */ - ble_gap_evt_rssi_changed_t rssi_changed; /**< RSSI Event Parameters. */ - ble_gap_evt_adv_report_t adv_report; /**< Advertising Report Event Parameters. */ - ble_gap_evt_adv_set_terminated_t adv_set_terminated; /**< Advertising Set Terminated Event Parameters. */ - ble_gap_evt_sec_request_t sec_request; /**< Security Request Event Parameters. */ - ble_gap_evt_conn_param_update_request_t conn_param_update_request; /**< Connection Parameter Update Parameters. */ - ble_gap_evt_scan_req_report_t scan_req_report; /**< Scan Request Report Parameters. */ - ble_gap_evt_phy_update_request_t phy_update_request; /**< PHY Update Request Event Parameters. */ - ble_gap_evt_phy_update_t phy_update; /**< PHY Update Parameters. */ - ble_gap_evt_data_length_update_request_t data_length_update_request; /**< Data Length Update Request Event Parameters. */ - ble_gap_evt_data_length_update_t data_length_update; /**< Data Length Update Event Parameters. */ - ble_gap_evt_qos_channel_survey_report_t qos_channel_survey_report; /**< Quality of Service (QoS) Channel Survey Report Parameters. */ - } params; /**< Event Parameters. */ -} ble_gap_evt_t; - - -/** - * @brief BLE GAP connection configuration parameters, set with @ref sd_ble_cfg_set. - * - * @retval ::NRF_ERROR_CONN_COUNT The connection count for the connection configurations is zero. - * @retval ::NRF_ERROR_INVALID_PARAM One or more of the following is true: - * - The sum of conn_count for all connection configurations combined exceeds UINT8_MAX. - * - The event length is smaller than @ref BLE_GAP_EVENT_LENGTH_MIN. - */ -typedef struct -{ - uint8_t conn_count; /**< The number of concurrent connections the application can create with this configuration. - The default and minimum value is @ref BLE_GAP_CONN_COUNT_DEFAULT. */ - uint16_t event_length; /**< The time set aside for this connection on every connection interval in 1.25 ms units. - The default value is @ref BLE_GAP_EVENT_LENGTH_DEFAULT, the minimum value is @ref BLE_GAP_EVENT_LENGTH_MIN. - The event length and the connection interval are the primary parameters - for setting the throughput of a connection. - See the SoftDevice Specification for details on throughput. */ -} ble_gap_conn_cfg_t; - - -/** - * @brief Configuration of maximum concurrent connections in the different connected roles, set with - * @ref sd_ble_cfg_set. - * - * @retval ::NRF_ERROR_CONN_COUNT The sum of periph_role_count and central_role_count is too - * large. The maximum supported sum of concurrent connections is - * @ref BLE_GAP_ROLE_COUNT_COMBINED_MAX. - * @retval ::NRF_ERROR_INVALID_PARAM central_sec_count is larger than central_role_count. - * @retval ::NRF_ERROR_RESOURCES The adv_set_count is too large. The maximum - * supported advertising handles is - * @ref BLE_GAP_ADV_SET_COUNT_MAX. - */ -typedef struct -{ - uint8_t adv_set_count; /**< Maximum number of advertising sets. Default value is @ref BLE_GAP_ADV_SET_COUNT_DEFAULT. */ - uint8_t periph_role_count; /**< Maximum number of connections concurrently acting as a peripheral. Default value is @ref BLE_GAP_ROLE_COUNT_PERIPH_DEFAULT. */ - uint8_t central_role_count; /**< Maximum number of connections concurrently acting as a central. Default value is @ref BLE_GAP_ROLE_COUNT_CENTRAL_DEFAULT. */ - uint8_t central_sec_count; /**< Number of SMP instances shared between all connections acting as a central. Default value is @ref BLE_GAP_ROLE_COUNT_CENTRAL_SEC_DEFAULT. */ - uint8_t qos_channel_survey_role_available:1; /**< If set, the Quality of Service (QoS) channel survey module is available to the - application using @ref sd_ble_gap_qos_channel_survey_start. */ -} ble_gap_cfg_role_count_t; - - -/** - * @brief Device name and its properties, set with @ref sd_ble_cfg_set. - * - * @note If the device name is not configured, the default device name will be - * @ref BLE_GAP_DEVNAME_DEFAULT, the maximum device name length will be - * @ref BLE_GAP_DEVNAME_DEFAULT_LEN, vloc will be set to @ref BLE_GATTS_VLOC_STACK and the device name - * will have no write access. - * - * @note If @ref max_len is more than @ref BLE_GAP_DEVNAME_DEFAULT_LEN and vloc is set to @ref BLE_GATTS_VLOC_STACK, - * the attribute table size must be increased to have room for the longer device name (see - * @ref sd_ble_cfg_set and @ref ble_gatts_cfg_attr_tab_size_t). - * - * @note If vloc is @ref BLE_GATTS_VLOC_STACK : - * - p_value must point to non-volatile memory (flash) or be NULL. - * - If p_value is NULL, the device name will initially be empty. - * - * @note If vloc is @ref BLE_GATTS_VLOC_USER : - * - p_value cannot be NULL. - * - If the device name is writable, p_value must point to volatile memory (RAM). - * - * @retval ::NRF_ERROR_INVALID_PARAM One or more of the following is true: - * - Invalid device name location (vloc). - * - Invalid device name security mode. - * @retval ::NRF_ERROR_INVALID_LENGTH One or more of the following is true: - * - The device name length is invalid (must be between 0 and @ref BLE_GAP_DEVNAME_MAX_LEN). - * - The device name length is too long for the given Attribute Table. - * @retval ::NRF_ERROR_NOT_SUPPORTED Device name security mode is not supported. - */ -typedef struct -{ - ble_gap_conn_sec_mode_t write_perm; /**< Write permissions. */ - uint8_t vloc:2; /**< Value location, see @ref BLE_GATTS_VLOCS.*/ - uint8_t *p_value; /**< Pointer to where the value (device name) is stored or will be stored. */ - uint16_t current_len; /**< Current length in bytes of the memory pointed to by p_value.*/ - uint16_t max_len; /**< Maximum length in bytes of the memory pointed to by p_value.*/ -} ble_gap_cfg_device_name_t; - - -/**@brief Peripheral Preferred Connection Parameters include configuration parameters, set with @ref sd_ble_cfg_set. */ -typedef struct -{ - uint8_t include_cfg; /**< Inclusion configuration of the Peripheral Preferred Connection Parameters characteristic. - See @ref BLE_GAP_CHAR_INCL_CONFIG. Default is @ref BLE_GAP_PPCP_INCL_CONFIG_DEFAULT. */ -} ble_gap_cfg_ppcp_incl_cfg_t; - - -/**@brief Central Address Resolution include configuration parameters, set with @ref sd_ble_cfg_set. */ -typedef struct -{ - uint8_t include_cfg; /**< Inclusion configuration of the Central Address Resolution characteristic. - See @ref BLE_GAP_CHAR_INCL_CONFIG. Default is @ref BLE_GAP_CAR_INCL_CONFIG_DEFAULT. */ -} ble_gap_cfg_car_incl_cfg_t; - - -/**@brief Configuration structure for GAP configurations. */ -typedef union -{ - ble_gap_cfg_role_count_t role_count_cfg; /**< Role count configuration, cfg_id is @ref BLE_GAP_CFG_ROLE_COUNT. */ - ble_gap_cfg_device_name_t device_name_cfg; /**< Device name configuration, cfg_id is @ref BLE_GAP_CFG_DEVICE_NAME. */ - ble_gap_cfg_ppcp_incl_cfg_t ppcp_include_cfg; /**< Peripheral Preferred Connection Parameters characteristic include - configuration, cfg_id is @ref BLE_GAP_CFG_PPCP_INCL_CONFIG. */ - ble_gap_cfg_car_incl_cfg_t car_include_cfg; /**< Central Address Resolution characteristic include configuration, - cfg_id is @ref BLE_GAP_CFG_CAR_INCL_CONFIG. */ -} ble_gap_cfg_t; - - -/**@brief Channel Map option. - * - * @details Used with @ref sd_ble_opt_get to get the current channel map - * or @ref sd_ble_opt_set to set a new channel map. When setting the - * channel map, it applies to all current and future connections. When getting the - * current channel map, it applies to a single connection and the connection handle - * must be supplied. - * - * @note Setting the channel map may take some time, depending on connection parameters. - * The time taken may be different for each connection and the get operation will - * return the previous channel map until the new one has taken effect. - * - * @note After setting the channel map, by spec it can not be set again until at least 1 s has passed. - * See Bluetooth Specification Version 4.1 Volume 2, Part E, Section 7.3.46. - * - * @retval ::NRF_SUCCESS Get or set successful. - * @retval ::NRF_ERROR_INVALID_PARAM One or more of the following is true: - * - Less then two bits in @ref ch_map are set. - * - Bits for primary advertising channels (37-39) are set. - * @retval ::NRF_ERROR_BUSY Channel map was set again before enough time had passed. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied for get. - * - */ -typedef struct -{ - uint16_t conn_handle; /**< Connection Handle (only applicable for get) */ - uint8_t ch_map[5]; /**< Channel Map (37-bit). */ -} ble_gap_opt_ch_map_t; - - -/**@brief Local connection latency option. - * - * @details Local connection latency is a feature which enables the slave to improve - * current consumption by ignoring the slave latency set by the peer. The - * local connection latency can only be set to a multiple of the slave latency, - * and cannot be longer than half of the supervision timeout. - * - * @details Used with @ref sd_ble_opt_set to set the local connection latency. The - * @ref sd_ble_opt_get is not supported for this option, but the actual - * local connection latency (unless set to NULL) is set as a return parameter - * when setting the option. - * - * @note The latency set will be truncated down to the closest slave latency event - * multiple, or the nearest multiple before half of the supervision timeout. - * - * @note The local connection latency is disabled by default, and needs to be enabled for new - * connections and whenever the connection is updated. - * - * @retval ::NRF_SUCCESS Set successfully. - * @retval ::NRF_ERROR_NOT_SUPPORTED Get is not supported. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle parameter. - */ -typedef struct -{ - uint16_t conn_handle; /**< Connection Handle */ - uint16_t requested_latency; /**< Requested local connection latency. */ - uint16_t * p_actual_latency; /**< Pointer to storage for the actual local connection latency (can be set to NULL to skip return value). */ -} ble_gap_opt_local_conn_latency_t; - -/**@brief Disable slave latency - * - * @details Used with @ref sd_ble_opt_set to temporarily disable slave latency of a peripheral connection - * (see @ref ble_gap_conn_params_t::slave_latency). And to re-enable it again. When disabled, the - * peripheral will ignore the slave_latency set by the central. - * - * @note Shall only be called on peripheral links. - * - * @retval ::NRF_SUCCESS Set successfully. - * @retval ::NRF_ERROR_NOT_SUPPORTED Get is not supported. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle parameter. - */ -typedef struct -{ - uint16_t conn_handle; /**< Connection Handle */ - uint8_t disable; /**< For allowed values see @ref BLE_GAP_SLAVE_LATENCY */ -} ble_gap_opt_slave_latency_disable_t; - -/**@brief Passkey Option. - * - * @mscs - * @mmsc{@ref BLE_GAP_PERIPH_BONDING_STATIC_PK_MSC} - * @endmscs - * - * @details Structure containing the passkey to be used during pairing. This can be used with @ref - * sd_ble_opt_set to make the SoftDevice use a preprogrammed passkey for authentication - * instead of generating a random one. - * - * @note Repeated pairing attempts using the same preprogrammed passkey makes pairing vulnerable to MITM attacks. - * - * @note @ref sd_ble_opt_get is not supported for this option. - * - */ -typedef struct -{ - uint8_t const * p_passkey; /**< Pointer to 6-digit ASCII string (digit 0..9 only, no NULL termination) passkey to be used during pairing. If this is NULL, the SoftDevice will generate a random passkey if required.*/ -} ble_gap_opt_passkey_t; - - -/**@brief Compatibility mode 1 option. - * - * @details This can be used with @ref sd_ble_opt_set to enable and disable - * compatibility mode 1. Compatibility mode 1 is disabled by default. - * - * @note Compatibility mode 1 enables interoperability with devices that do not support a value of - * 0 for the WinOffset parameter in the Link Layer CONNECT_IND packet. This applies to a - * limited set of legacy peripheral devices from another vendor. Enabling this compatibility - * mode will only have an effect if the local device will act as a central device and - * initiate a connection to a peripheral device. In that case it may lead to the connection - * creation taking up to one connection interval longer to complete for all connections. - * - * @retval ::NRF_SUCCESS Set successfully. - * @retval ::NRF_ERROR_INVALID_STATE When connection creation is ongoing while mode 1 is set. - */ -typedef struct -{ - uint8_t enable : 1; /**< Enable compatibility mode 1.*/ -} ble_gap_opt_compat_mode_1_t; - - -/**@brief Authenticated payload timeout option. - * - * @details This can be used with @ref sd_ble_opt_set to change the Authenticated payload timeout to a value other - * than the default of @ref BLE_GAP_AUTH_PAYLOAD_TIMEOUT_MAX. - * - * @note The authenticated payload timeout event ::BLE_GAP_TIMEOUT_SRC_AUTH_PAYLOAD will be generated - * if auth_payload_timeout time has elapsed without receiving a packet with a valid MIC on an encrypted - * link. - * - * @note The LE ping procedure will be initiated before the timer expires to give the peer a chance - * to reset the timer. In addition the stack will try to prioritize running of LE ping over other - * activities to increase chances of finishing LE ping before timer expires. To avoid side-effects - * on other activities, it is recommended to use high timeout values. - * Recommended timeout > 2*(connInterval * (6 + connSlaveLatency)). - * - * @retval ::NRF_SUCCESS Set successfully. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. auth_payload_timeout was outside of allowed range. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle parameter. - */ -typedef struct -{ - uint16_t conn_handle; /**< Connection Handle */ - uint16_t auth_payload_timeout; /**< Requested timeout in 10 ms unit, see @ref BLE_GAP_AUTH_PAYLOAD_TIMEOUT. */ -} ble_gap_opt_auth_payload_timeout_t; - -/**@brief Option structure for GAP options. */ -typedef union -{ - ble_gap_opt_ch_map_t ch_map; /**< Parameters for the Channel Map option. */ - ble_gap_opt_local_conn_latency_t local_conn_latency; /**< Parameters for the Local connection latency option */ - ble_gap_opt_passkey_t passkey; /**< Parameters for the Passkey option.*/ - ble_gap_opt_compat_mode_1_t compat_mode_1; /**< Parameters for the compatibility mode 1 option.*/ - ble_gap_opt_auth_payload_timeout_t auth_payload_timeout; /**< Parameters for the authenticated payload timeout option.*/ - ble_gap_opt_slave_latency_disable_t slave_latency_disable; /**< Parameters for the Disable slave latency option */ -} ble_gap_opt_t; - -/**@brief Connection event triggering parameters. */ -typedef struct -{ - uint8_t ppi_ch_id; /**< PPI channel to use. This channel should be regarded as reserved until - connection event PPI task triggering is stopped. - The PPI channel ID can not be one of the PPI channels reserved by - the SoftDevice. See @ref NRF_SOC_SD_PPI_CHANNELS_SD_ENABLED_MSK. */ - uint32_t task_endpoint; /**< Task Endpoint to trigger. */ - uint16_t conn_evt_counter_start; /**< The connection event on which the task triggering should start. */ - uint16_t period_in_events; /**< Trigger period. Valid range is [1, 32767]. - If the device is in slave role and slave latency is enabled, - this parameter should be set to a multiple of (slave latency + 1) - to ensure low power operation. */ -} ble_gap_conn_event_trigger_t; -/**@} */ - -/**@addtogroup BLE_GAP_FUNCTIONS Functions - * @{ */ - -/**@brief Set the local Bluetooth identity address. - * - * The local Bluetooth identity address is the address that identifies this device to other peers. - * The address type must be either @ref BLE_GAP_ADDR_TYPE_PUBLIC or @ref BLE_GAP_ADDR_TYPE_RANDOM_STATIC. - * - * @note The identity address cannot be changed while advertising, scanning or creating a connection. - * - * @note This address will be distributed to the peer during bonding. - * If the address changes, the address stored in the peer device will not be valid and the ability to - * reconnect using the old address will be lost. - * - * @note By default the SoftDevice will set an address of type @ref BLE_GAP_ADDR_TYPE_RANDOM_STATIC upon being - * enabled. The address is a random number populated during the IC manufacturing process and remains unchanged - * for the lifetime of each IC. - * - * @mscs - * @mmsc{@ref BLE_GAP_ADV_MSC} - * @endmscs - * - * @param[in] p_addr Pointer to address structure. - * - * @retval ::NRF_SUCCESS Address successfully set. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR Invalid address. - * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. - * @retval ::NRF_ERROR_INVALID_STATE The identity address cannot be changed while advertising, - * scanning or creating a connection. - */ -SVCALL(SD_BLE_GAP_ADDR_SET, uint32_t, sd_ble_gap_addr_set(ble_gap_addr_t const *p_addr)); - - -/**@brief Get local Bluetooth identity address. - * - * @note This will always return the identity address irrespective of the privacy settings, - * i.e. the address type will always be either @ref BLE_GAP_ADDR_TYPE_PUBLIC or @ref BLE_GAP_ADDR_TYPE_RANDOM_STATIC. - * - * @param[out] p_addr Pointer to address structure to be filled in. - * - * @retval ::NRF_SUCCESS Address successfully retrieved. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid or NULL pointer supplied. - */ -SVCALL(SD_BLE_GAP_ADDR_GET, uint32_t, sd_ble_gap_addr_get(ble_gap_addr_t *p_addr)); - - -/**@brief Get the Bluetooth device address used by the advertiser. - * - * @note This function will return the local Bluetooth address used in advertising PDUs. When - * using privacy, the SoftDevice will generate a new private address every - * @ref ble_gap_privacy_params_t::private_addr_cycle_s configured using - * @ref sd_ble_gap_privacy_set. Hence depending on when the application calls this API, the - * address returned may not be the latest address that is used in the advertising PDUs. - * - * @param[in] adv_handle The advertising handle to get the address from. - * @param[out] p_addr Pointer to address structure to be filled in. - * - * @retval ::NRF_SUCCESS Address successfully retrieved. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid or NULL pointer supplied. - * @retval ::BLE_ERROR_INVALID_ADV_HANDLE The provided advertising handle was not found. - * @retval ::NRF_ERROR_INVALID_STATE The advertising set is currently not advertising. - */ -SVCALL(SD_BLE_GAP_ADV_ADDR_GET, uint32_t, sd_ble_gap_adv_addr_get(uint8_t adv_handle, ble_gap_addr_t *p_addr)); - - -/**@brief Set the active whitelist in the SoftDevice. - * - * @note Only one whitelist can be used at a time and the whitelist is shared between the BLE roles. - * The whitelist cannot be set if a BLE role is using the whitelist. - * - * @note If an address is resolved using the information in the device identity list, then the whitelist - * filter policy applies to the peer identity address and not the resolvable address sent on air. - * - * @mscs - * @mmsc{@ref BLE_GAP_WL_SHARE_MSC} - * @mmsc{@ref BLE_GAP_PRIVACY_SCAN_PRIVATE_SCAN_MSC} - * @endmscs - * - * @param[in] pp_wl_addrs Pointer to a whitelist of peer addresses, if NULL the whitelist will be cleared. - * @param[in] len Length of the whitelist, maximum @ref BLE_GAP_WHITELIST_ADDR_MAX_COUNT. - * - * @retval ::NRF_SUCCESS The whitelist is successfully set/cleared. - * @retval ::NRF_ERROR_INVALID_ADDR The whitelist (or one of its entries) provided is invalid. - * @retval ::BLE_ERROR_GAP_WHITELIST_IN_USE The whitelist is in use by a BLE role and cannot be set or cleared. - * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR Invalid address type is supplied. - * @retval ::NRF_ERROR_DATA_SIZE The given whitelist size is invalid (zero or too large); this can only return when - * pp_wl_addrs is not NULL. - */ -SVCALL(SD_BLE_GAP_WHITELIST_SET, uint32_t, sd_ble_gap_whitelist_set(ble_gap_addr_t const * const * pp_wl_addrs, uint8_t len)); - - -/**@brief Set device identity list. - * - * @note Only one device identity list can be used at a time and the list is shared between the BLE roles. - * The device identity list cannot be set if a BLE role is using the list. - * - * @param[in] pp_id_keys Pointer to an array of peer identity addresses and peer IRKs, if NULL the device identity list will be cleared. - * @param[in] pp_local_irks Pointer to an array of local IRKs. Each entry in the array maps to the entry in pp_id_keys at the same index. - * To fill in the list with the currently set device IRK for all peers, set to NULL. - * @param[in] len Length of the device identity list, maximum @ref BLE_GAP_DEVICE_IDENTITIES_MAX_COUNT. - * - * @mscs - * @mmsc{@ref BLE_GAP_PRIVACY_ADV_MSC} - * @mmsc{@ref BLE_GAP_PRIVACY_SCAN_MSC} - * @mmsc{@ref BLE_GAP_PRIVACY_SCAN_PRIVATE_SCAN_MSC} - * @mmsc{@ref BLE_GAP_PRIVACY_ADV_DIR_PRIV_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_CONN_PRIV_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_CONN_PRIV_MSC} - * @endmscs - * - * @retval ::NRF_SUCCESS The device identity list successfully set/cleared. - * @retval ::NRF_ERROR_INVALID_ADDR The device identity list (or one of its entries) provided is invalid. - * This code may be returned if the local IRK list also has an invalid entry. - * @retval ::BLE_ERROR_GAP_DEVICE_IDENTITIES_IN_USE The device identity list is in use and cannot be set or cleared. - * @retval ::BLE_ERROR_GAP_DEVICE_IDENTITIES_DUPLICATE The device identity list contains multiple entries with the same identity address. - * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR Invalid address type is supplied. - * @retval ::NRF_ERROR_DATA_SIZE The given device identity list size invalid (zero or too large); this can - * only return when pp_id_keys is not NULL. - */ -SVCALL(SD_BLE_GAP_DEVICE_IDENTITIES_SET, uint32_t, sd_ble_gap_device_identities_set(ble_gap_id_key_t const * const * pp_id_keys, ble_gap_irk_t const * const * pp_local_irks, uint8_t len)); - - -/**@brief Set privacy settings. - * - * @note Privacy settings cannot be changed while advertising, scanning or creating a connection. - * - * @param[in] p_privacy_params Privacy settings. - * - * @mscs - * @mmsc{@ref BLE_GAP_PRIVACY_ADV_MSC} - * @mmsc{@ref BLE_GAP_PRIVACY_SCAN_MSC} - * @mmsc{@ref BLE_GAP_PRIVACY_ADV_DIR_PRIV_MSC} - * @endmscs - * - * @retval ::NRF_SUCCESS Set successfully. - * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. - * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR Invalid address type is supplied. - * @retval ::NRF_ERROR_INVALID_ADDR The pointer to privacy settings is NULL or invalid. - * Otherwise, the p_device_irk pointer in privacy parameter is an invalid pointer. - * @retval ::NRF_ERROR_INVALID_PARAM Out of range parameters are provided. - * @retval ::NRF_ERROR_NOT_SUPPORTED The SoftDevice does not support privacy if the Central Address Resolution - characteristic is not configured to be included and the SoftDevice is configured - to support central roles. - See @ref ble_gap_cfg_car_incl_cfg_t and @ref ble_gap_cfg_role_count_t. - * @retval ::NRF_ERROR_INVALID_STATE Privacy settings cannot be changed while advertising, scanning - * or creating a connection. - */ -SVCALL(SD_BLE_GAP_PRIVACY_SET, uint32_t, sd_ble_gap_privacy_set(ble_gap_privacy_params_t const *p_privacy_params)); - - -/**@brief Get privacy settings. - * - * @note ::ble_gap_privacy_params_t::p_device_irk must be initialized to NULL or a valid address before this function is called. - * If it is initialized to a valid address, the address pointed to will contain the current device IRK on return. - * - * @param[in,out] p_privacy_params Privacy settings. - * - * @retval ::NRF_SUCCESS Privacy settings read. - * @retval ::NRF_ERROR_INVALID_ADDR The pointer given for returning the privacy settings may be NULL or invalid. - * Otherwise, the p_device_irk pointer in privacy parameter is an invalid pointer. - */ -SVCALL(SD_BLE_GAP_PRIVACY_GET, uint32_t, sd_ble_gap_privacy_get(ble_gap_privacy_params_t *p_privacy_params)); - - -/**@brief Configure an advertising set. Set, clear or update advertising and scan response data. - * - * @note The format of the advertising data will be checked by this call to ensure interoperability. - * Limitations imposed by this API call to the data provided include having a flags data type in the scan response data and - * duplicating the local name in the advertising data and scan response data. - * - * @note In order to update advertising data while advertising, new advertising buffers must be provided. - * - * @mscs - * @mmsc{@ref BLE_GAP_ADV_MSC} - * @mmsc{@ref BLE_GAP_WL_SHARE_MSC} - * @endmscs - * - * @param[in,out] p_adv_handle Provide a pointer to a handle containing @ref BLE_GAP_ADV_SET_HANDLE_NOT_SET to configure - * a new advertising set. On success, a new handle is then returned through the pointer. - * Provide a pointer to an existing advertising handle to configure an existing advertising set. - * @param[in] p_adv_data Advertising data. If set to NULL, no advertising data will be used. See @ref ble_gap_adv_data_t. - * @param[in] p_adv_params Advertising parameters. When this function is used to update advertising data while advertising, - * this parameter must be NULL. See @ref ble_gap_adv_params_t. - * - * @retval ::NRF_SUCCESS Advertising set successfully configured. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied: - * - Invalid advertising data configuration specified. See @ref ble_gap_adv_data_t. - * - Invalid configuration of p_adv_params. See @ref ble_gap_adv_params_t. - * - Use of whitelist requested but whitelist has not been set, - * see @ref sd_ble_gap_whitelist_set. - * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR ble_gap_adv_params_t::p_peer_addr is invalid. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. Either: - * - It is invalid to provide non-NULL advertising set parameters while advertising. - * - It is invalid to provide the same data buffers while advertising. To update - * advertising data, provide new advertising buffers. - * @retval ::BLE_ERROR_GAP_DISCOVERABLE_WITH_WHITELIST Discoverable mode and whitelist incompatible. - * @retval ::BLE_ERROR_INVALID_ADV_HANDLE The provided advertising handle was not found. Use @ref BLE_GAP_ADV_SET_HANDLE_NOT_SET to - * configure a new advertising handle. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_FLAGS Invalid combination of advertising flags supplied. - * @retval ::NRF_ERROR_INVALID_DATA Invalid data type(s) supplied. Check the advertising data format specification - * given in Bluetooth Specification Version 5.0, Volume 3, Part C, Chapter 11. - * @retval ::NRF_ERROR_INVALID_LENGTH Invalid data length(s) supplied. - * @retval ::NRF_ERROR_NOT_SUPPORTED Unsupported data length or advertising parameter configuration. - * @retval ::NRF_ERROR_NO_MEM Not enough memory to configure a new advertising handle. Update an - * existing advertising handle instead. - * @retval ::BLE_ERROR_GAP_UUID_LIST_MISMATCH Invalid UUID list supplied. - */ -SVCALL(SD_BLE_GAP_ADV_SET_CONFIGURE, uint32_t, sd_ble_gap_adv_set_configure(uint8_t *p_adv_handle, ble_gap_adv_data_t const *p_adv_data, ble_gap_adv_params_t const *p_adv_params)); - - -/**@brief Start advertising (GAP Discoverable, Connectable modes, Broadcast Procedure). - * - * @note Only one advertiser may be active at any time. - * - * @note If privacy is enabled, the advertiser's private address will be refreshed when this function is called. - * See @ref sd_ble_gap_privacy_set(). - * - * @events - * @event{@ref BLE_GAP_EVT_CONNECTED, Generated after connection has been established through connectable advertising.} - * @event{@ref BLE_GAP_EVT_ADV_SET_TERMINATED, Advertising set has terminated.} - * @event{@ref BLE_GAP_EVT_SCAN_REQ_REPORT, A scan request was received.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GAP_ADV_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_CONN_PRIV_MSC} - * @mmsc{@ref BLE_GAP_PRIVACY_ADV_DIR_PRIV_MSC} - * @mmsc{@ref BLE_GAP_WL_SHARE_MSC} - * @endmscs - * - * @param[in] adv_handle Advertising handle to advertise on, received from @ref sd_ble_gap_adv_set_configure. - * @param[in] conn_cfg_tag Tag identifying a configuration set by @ref sd_ble_cfg_set or - * @ref BLE_CONN_CFG_TAG_DEFAULT to use the default connection configuration. For non-connectable - * advertising, this is ignored. - * - * @retval ::NRF_SUCCESS The BLE stack has started advertising. - * @retval ::NRF_ERROR_INVALID_STATE adv_handle is not configured or already advertising. - * @retval ::NRF_ERROR_CONN_COUNT The limit of available connections for this connection configuration - * tag has been reached; connectable advertiser cannot be started. - * To increase the number of available connections, - * use @ref sd_ble_cfg_set with @ref BLE_GAP_CFG_ROLE_COUNT or @ref BLE_CONN_CFG_GAP. - * @retval ::BLE_ERROR_INVALID_ADV_HANDLE Advertising handle not found. Configure a new adveriting handle with @ref sd_ble_gap_adv_set_configure. - * @retval ::NRF_ERROR_NOT_FOUND conn_cfg_tag not found. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied: - * - Invalid configuration of p_adv_params. See @ref ble_gap_adv_params_t. - * - Use of whitelist requested but whitelist has not been set, see @ref sd_ble_gap_whitelist_set. - * @retval ::NRF_ERROR_RESOURCES Either: - * - adv_handle is configured with connectable advertising, but the event_length parameter - * associated with conn_cfg_tag is too small to be able to establish a connection on - * the selected advertising phys. Use @ref sd_ble_cfg_set to increase the event length. - * - Not enough BLE role slots available. - Stop one or more currently active roles (Central, Peripheral, Broadcaster or Observer) and try again. - * - p_adv_params is configured with connectable advertising, but the event_length parameter - * associated with conn_cfg_tag is too small to be able to establish a connection on - * the selected advertising phys. Use @ref sd_ble_cfg_set to increase the event length. - */ -SVCALL(SD_BLE_GAP_ADV_START, uint32_t, sd_ble_gap_adv_start(uint8_t adv_handle, uint8_t conn_cfg_tag)); - - -/**@brief Stop advertising (GAP Discoverable, Connectable modes, Broadcast Procedure). - * - * @mscs - * @mmsc{@ref BLE_GAP_ADV_MSC} - * @mmsc{@ref BLE_GAP_WL_SHARE_MSC} - * @endmscs - * - * @param[in] adv_handle The advertising handle that should stop advertising. - * - * @retval ::NRF_SUCCESS The BLE stack has stopped advertising. - * @retval ::BLE_ERROR_INVALID_ADV_HANDLE Invalid advertising handle. - * @retval ::NRF_ERROR_INVALID_STATE The advertising handle is not advertising. - */ -SVCALL(SD_BLE_GAP_ADV_STOP, uint32_t, sd_ble_gap_adv_stop(uint8_t adv_handle)); - - - -/**@brief Update connection parameters. - * - * @details In the central role this will initiate a Link Layer connection parameter update procedure, - * otherwise in the peripheral role, this will send the corresponding L2CAP request and wait for - * the central to perform the procedure. In both cases, and regardless of success or failure, the application - * will be informed of the result with a @ref BLE_GAP_EVT_CONN_PARAM_UPDATE event. - * - * @details This function can be used as a central both to reply to a @ref BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST or to start the procedure unrequested. - * - * @events - * @event{@ref BLE_GAP_EVT_CONN_PARAM_UPDATE, Result of the connection parameter update procedure.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GAP_CPU_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_ENC_AUTH_MUTEX_MSC} - * @mmsc{@ref BLE_GAP_MULTILINK_CPU_MSC} - * @mmsc{@ref BLE_GAP_MULTILINK_CTRL_PROC_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_CPU_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] p_conn_params Pointer to desired connection parameters. If NULL is provided on a peripheral role, - * the parameters in the PPCP characteristic of the GAP service will be used instead. - * If NULL is provided on a central role and in response to a @ref BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST, the peripheral request will be rejected - * - * @retval ::NRF_SUCCESS The Connection Update procedure has been started successfully. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, check parameter limits and constraints. - * @retval ::NRF_ERROR_INVALID_STATE Disconnection in progress or link has not been established. - * @retval ::NRF_ERROR_BUSY Procedure already in progress, wait for pending procedures to complete and retry. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation. - */ -SVCALL(SD_BLE_GAP_CONN_PARAM_UPDATE, uint32_t, sd_ble_gap_conn_param_update(uint16_t conn_handle, ble_gap_conn_params_t const *p_conn_params)); - - -/**@brief Disconnect (GAP Link Termination). - * - * @details This call initiates the disconnection procedure, and its completion will be communicated to the application - * with a @ref BLE_GAP_EVT_DISCONNECTED event. - * - * @events - * @event{@ref BLE_GAP_EVT_DISCONNECTED, Generated when disconnection procedure is complete.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GAP_CONN_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] hci_status_code HCI status code, see @ref BLE_HCI_STATUS_CODES (accepted values are @ref BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION and @ref BLE_HCI_CONN_INTERVAL_UNACCEPTABLE). - * - * @retval ::NRF_SUCCESS The disconnection procedure has been started successfully. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - * @retval ::NRF_ERROR_INVALID_STATE Disconnection in progress or link has not been established. - */ -SVCALL(SD_BLE_GAP_DISCONNECT, uint32_t, sd_ble_gap_disconnect(uint16_t conn_handle, uint8_t hci_status_code)); - - -/**@brief Set the radio's transmit power. - * - * @param[in] role The role to set the transmit power for, see @ref BLE_GAP_TX_POWER_ROLES for - * possible roles. - * @param[in] handle The handle parameter is interpreted depending on role: - * - If role is @ref BLE_GAP_TX_POWER_ROLE_CONN, this value is the specific connection handle. - * - If role is @ref BLE_GAP_TX_POWER_ROLE_ADV, the advertising set identified with the advertising handle, - * will use the specified transmit power, and include it in the advertising packet headers if - * @ref ble_gap_adv_properties_t::include_tx_power set. - * - For all other roles handle is ignored. - * @param[in] tx_power Radio transmit power in dBm (see note for accepted values). - * - * @note Supported tx_power values: -40dBm, -20dBm, -16dBm, -12dBm, -8dBm, -4dBm, 0dBm, +3dBm and +4dBm. - * In addition, on some chips following values are supported: +2dBm, +5dBm, +6dBm, +7dBm and +8dBm. - * Setting these values on a chip that does not support them will result in undefined behaviour. - * @note The initiator will have the same transmit power as the scanner. - * @note When a connection is created it will inherit the transmit power from the initiator or - * advertiser leading to the connection. - * - * @retval ::NRF_SUCCESS Successfully changed the transmit power. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::BLE_ERROR_INVALID_ADV_HANDLE Advertising handle not found. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - */ -SVCALL(SD_BLE_GAP_TX_POWER_SET, uint32_t, sd_ble_gap_tx_power_set(uint8_t role, uint16_t handle, int8_t tx_power)); - - -/**@brief Set GAP Appearance value. - * - * @param[in] appearance Appearance (16-bit), see @ref BLE_APPEARANCES. - * - * @retval ::NRF_SUCCESS Appearance value set successfully. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - */ -SVCALL(SD_BLE_GAP_APPEARANCE_SET, uint32_t, sd_ble_gap_appearance_set(uint16_t appearance)); - - -/**@brief Get GAP Appearance value. - * - * @param[out] p_appearance Pointer to appearance (16-bit) to be filled in, see @ref BLE_APPEARANCES. - * - * @retval ::NRF_SUCCESS Appearance value retrieved successfully. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - */ -SVCALL(SD_BLE_GAP_APPEARANCE_GET, uint32_t, sd_ble_gap_appearance_get(uint16_t *p_appearance)); - - -/**@brief Set GAP Peripheral Preferred Connection Parameters. - * - * @param[in] p_conn_params Pointer to a @ref ble_gap_conn_params_t structure with the desired parameters. - * - * @retval ::NRF_SUCCESS Peripheral Preferred Connection Parameters set successfully. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_NOT_SUPPORTED The characteristic is not included in the Attribute Table, - see @ref ble_gap_cfg_ppcp_incl_cfg_t. - */ -SVCALL(SD_BLE_GAP_PPCP_SET, uint32_t, sd_ble_gap_ppcp_set(ble_gap_conn_params_t const *p_conn_params)); - - -/**@brief Get GAP Peripheral Preferred Connection Parameters. - * - * @param[out] p_conn_params Pointer to a @ref ble_gap_conn_params_t structure where the parameters will be stored. - * - * @retval ::NRF_SUCCESS Peripheral Preferred Connection Parameters retrieved successfully. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_NOT_SUPPORTED The characteristic is not included in the Attribute Table, - see @ref ble_gap_cfg_ppcp_incl_cfg_t. - */ -SVCALL(SD_BLE_GAP_PPCP_GET, uint32_t, sd_ble_gap_ppcp_get(ble_gap_conn_params_t *p_conn_params)); - - -/**@brief Set GAP device name. - * - * @note If the device name is located in application flash memory (see @ref ble_gap_cfg_device_name_t), - * it cannot be changed. Then @ref NRF_ERROR_FORBIDDEN will be returned. - * - * @param[in] p_write_perm Write permissions for the Device Name characteristic, see @ref ble_gap_conn_sec_mode_t. - * @param[in] p_dev_name Pointer to a UTF-8 encoded, non NULL-terminated string. - * @param[in] len Length of the UTF-8, non NULL-terminated string pointed to by p_dev_name in octets (must be smaller or equal than @ref BLE_GAP_DEVNAME_MAX_LEN). - * - * @retval ::NRF_SUCCESS GAP device name and permissions set successfully. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied. - * @retval ::NRF_ERROR_FORBIDDEN Device name is not writable. - */ -SVCALL(SD_BLE_GAP_DEVICE_NAME_SET, uint32_t, sd_ble_gap_device_name_set(ble_gap_conn_sec_mode_t const *p_write_perm, uint8_t const *p_dev_name, uint16_t len)); - - -/**@brief Get GAP device name. - * - * @note If the device name is longer than the size of the supplied buffer, - * p_len will return the complete device name length, - * and not the number of bytes actually returned in p_dev_name. - * The application may use this information to allocate a suitable buffer size. - * - * @param[out] p_dev_name Pointer to an empty buffer where the UTF-8 non NULL-terminated string will be placed. Set to NULL to obtain the complete device name length. - * @param[in,out] p_len Length of the buffer pointed by p_dev_name, complete device name length on output. - * - * @retval ::NRF_SUCCESS GAP device name retrieved successfully. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied. - */ -SVCALL(SD_BLE_GAP_DEVICE_NAME_GET, uint32_t, sd_ble_gap_device_name_get(uint8_t *p_dev_name, uint16_t *p_len)); - - -/**@brief Initiate the GAP Authentication procedure. - * - * @details In the central role, this function will send an SMP Pairing Request (or an SMP Pairing Failed if rejected), - * otherwise in the peripheral role, an SMP Security Request will be sent. - * - * @events - * @event{Depending on the security parameters set and the packet exchanges with the peer\, the following events may be generated:} - * @event{@ref BLE_GAP_EVT_SEC_PARAMS_REQUEST} - * @event{@ref BLE_GAP_EVT_SEC_INFO_REQUEST} - * @event{@ref BLE_GAP_EVT_PASSKEY_DISPLAY} - * @event{@ref BLE_GAP_EVT_KEY_PRESSED} - * @event{@ref BLE_GAP_EVT_AUTH_KEY_REQUEST} - * @event{@ref BLE_GAP_EVT_LESC_DHKEY_REQUEST} - * @event{@ref BLE_GAP_EVT_CONN_SEC_UPDATE} - * @event{@ref BLE_GAP_EVT_AUTH_STATUS} - * @event{@ref BLE_GAP_EVT_TIMEOUT} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GAP_PERIPH_SEC_REQ_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_SEC_REQ_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_ENC_AUTH_MUTEX_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_PAIRING_JW_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_BONDING_JW_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_BONDING_PK_PERIPH_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_BONDING_PK_PERIPH_OOB_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_PAIRING_JW_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_NC_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_PKE_PD_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_PKE_CD_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_OOB_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] p_sec_params Pointer to the @ref ble_gap_sec_params_t structure with the security parameters to be used during the pairing or bonding procedure. - * In the peripheral role, only the bond, mitm, lesc and keypress fields of this structure are used. - * In the central role, this pointer may be NULL to reject a Security Request. - * - * @retval ::NRF_SUCCESS Successfully initiated authentication procedure. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. Either: - * - No link has been established. - * - An encryption is already executing or queued. - * @retval ::NRF_ERROR_NO_MEM The maximum number of authentication procedures that can run in parallel for the given role is reached. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - * @retval ::NRF_ERROR_NOT_SUPPORTED Setting of sign or link fields in @ref ble_gap_sec_kdist_t not supported. - * Distribution of own Identity Information is only supported if the Central - * Address Resolution characteristic is configured to be included or - * the Softdevice is configured to support peripheral roles only. - * See @ref ble_gap_cfg_car_incl_cfg_t and @ref ble_gap_cfg_role_count_t. - * @retval ::NRF_ERROR_TIMEOUT A SMP timeout has occurred, and further SMP operations on this link is prohibited. - */ -SVCALL(SD_BLE_GAP_AUTHENTICATE, uint32_t, sd_ble_gap_authenticate(uint16_t conn_handle, ble_gap_sec_params_t const *p_sec_params)); - - -/**@brief Reply with GAP security parameters. - * - * @details This function is only used to reply to a @ref BLE_GAP_EVT_SEC_PARAMS_REQUEST, calling it at other times will result in an @ref NRF_ERROR_INVALID_STATE. - * @note If the call returns an error code, the request is still pending, and the reply call may be repeated with corrected parameters. - * - * @events - * @event{This function is used during authentication procedures, see the list of events in the documentation of @ref sd_ble_gap_authenticate.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GAP_PERIPH_PAIRING_JW_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_BONDING_JW_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_BONDING_PK_PERIPH_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_BONDING_PK_CENTRAL_OOB_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_BONDING_STATIC_PK_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_PAIRING_CONFIRM_FAIL_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_LESC_PAIRING_JW_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_NC_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_PKE_PD_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_PKE_CD_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_OOB_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_PAIRING_KS_TOO_SMALL_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_PAIRING_APP_ERROR_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_PAIRING_REMOTE_PAIRING_FAIL_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_PAIRING_TIMEOUT_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_PAIRING_JW_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_BONDING_JW_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_BONDING_PK_PERIPH_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_BONDING_PK_PERIPH_OOB_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_PAIRING_JW_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_NC_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_PKE_PD_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_PKE_CD_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_OOB_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] sec_status Security status, see @ref BLE_GAP_SEC_STATUS. - * @param[in] p_sec_params Pointer to a @ref ble_gap_sec_params_t security parameters structure. In the central role this must be set to NULL, as the parameters have - * already been provided during a previous call to @ref sd_ble_gap_authenticate. - * @param[in,out] p_sec_keyset Pointer to a @ref ble_gap_sec_keyset_t security keyset structure. Any keys generated and/or distributed as a result of the ongoing security procedure - * will be stored into the memory referenced by the pointers inside this structure. The keys will be stored and available to the application - * upon reception of a @ref BLE_GAP_EVT_AUTH_STATUS event. - * Note that the SoftDevice expects the application to provide memory for storing the - * peer's keys. So it must be ensured that the relevant pointers inside this structure are not NULL. The pointers to the local key - * can, however, be NULL, in which case, the local key data will not be available to the application upon reception of the - * @ref BLE_GAP_EVT_AUTH_STATUS event. - * - * @retval ::NRF_SUCCESS Successfully accepted security parameter from the application. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_INVALID_STATE Security parameters has not been requested. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - * @retval ::NRF_ERROR_NOT_SUPPORTED Setting of sign or link fields in @ref ble_gap_sec_kdist_t not supported. - * Distribution of own Identity Information is only supported if the Central - * Address Resolution characteristic is configured to be included or - * the Softdevice is configured to support peripheral roles only. - * See @ref ble_gap_cfg_car_incl_cfg_t and @ref ble_gap_cfg_role_count_t. - */ -SVCALL(SD_BLE_GAP_SEC_PARAMS_REPLY, uint32_t, sd_ble_gap_sec_params_reply(uint16_t conn_handle, uint8_t sec_status, ble_gap_sec_params_t const *p_sec_params, ble_gap_sec_keyset_t const *p_sec_keyset)); - - -/**@brief Reply with an authentication key. - * - * @details This function is only used to reply to a @ref BLE_GAP_EVT_AUTH_KEY_REQUEST or a @ref BLE_GAP_EVT_PASSKEY_DISPLAY, calling it at other times will result in an @ref NRF_ERROR_INVALID_STATE. - * @note If the call returns an error code, the request is still pending, and the reply call may be repeated with corrected parameters. - * - * @events - * @event{This function is used during authentication procedures\, see the list of events in the documentation of @ref sd_ble_gap_authenticate.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GAP_PERIPH_BONDING_PK_CENTRAL_OOB_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_NC_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_PKE_CD_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_BONDING_PK_PERIPH_OOB_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_NC_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_PKE_CD_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] key_type See @ref BLE_GAP_AUTH_KEY_TYPES. - * @param[in] p_key If key type is @ref BLE_GAP_AUTH_KEY_TYPE_NONE, then NULL. - * If key type is @ref BLE_GAP_AUTH_KEY_TYPE_PASSKEY, then a 6-byte ASCII string (digit 0..9 only, no NULL termination) - * or NULL when confirming LE Secure Connections Numeric Comparison. - * If key type is @ref BLE_GAP_AUTH_KEY_TYPE_OOB, then a 16-byte OOB key value in little-endian format. - * - * @retval ::NRF_SUCCESS Authentication key successfully set. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_INVALID_STATE Authentication key has not been requested. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - */ -SVCALL(SD_BLE_GAP_AUTH_KEY_REPLY, uint32_t, sd_ble_gap_auth_key_reply(uint16_t conn_handle, uint8_t key_type, uint8_t const *p_key)); - - -/**@brief Reply with an LE Secure connections DHKey. - * - * @details This function is only used to reply to a @ref BLE_GAP_EVT_LESC_DHKEY_REQUEST, calling it at other times will result in an @ref NRF_ERROR_INVALID_STATE. - * @note If the call returns an error code, the request is still pending, and the reply call may be repeated with corrected parameters. - * - * @events - * @event{This function is used during authentication procedures\, see the list of events in the documentation of @ref sd_ble_gap_authenticate.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GAP_PERIPH_LESC_PAIRING_JW_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_NC_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_PKE_PD_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_PKE_CD_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_OOB_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_PAIRING_JW_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_NC_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_PKE_PD_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_PKE_CD_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_OOB_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] p_dhkey LE Secure Connections DHKey. - * - * @retval ::NRF_SUCCESS DHKey successfully set. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. Either: - * - The peer is not authenticated. - * - The application has not pulled a @ref BLE_GAP_EVT_LESC_DHKEY_REQUEST event. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - */ -SVCALL(SD_BLE_GAP_LESC_DHKEY_REPLY, uint32_t, sd_ble_gap_lesc_dhkey_reply(uint16_t conn_handle, ble_gap_lesc_dhkey_t const *p_dhkey)); - - -/**@brief Notify the peer of a local keypress. - * - * @mscs - * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_PKE_CD_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_PKE_CD_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] kp_not See @ref BLE_GAP_KP_NOT_TYPES. - * - * @retval ::NRF_SUCCESS Keypress notification successfully queued for transmission. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. Either: - * - Authentication key not requested. - * - Passkey has not been entered. - * - Keypresses have not been enabled by both peers. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - * @retval ::NRF_ERROR_BUSY The BLE stack is busy. Retry at later time. - */ -SVCALL(SD_BLE_GAP_KEYPRESS_NOTIFY, uint32_t, sd_ble_gap_keypress_notify(uint16_t conn_handle, uint8_t kp_not)); - - -/**@brief Generate a set of OOB data to send to a peer out of band. - * - * @note The @ref ble_gap_addr_t included in the OOB data returned will be the currently active one (or, if a connection has already been established, - * the one used during connection setup). The application may manually overwrite it with an updated value. - * - * @mscs - * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_OOB_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_OOB_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. Can be @ref BLE_CONN_HANDLE_INVALID if a BLE connection has not been established yet. - * @param[in] p_pk_own LE Secure Connections local P-256 Public Key. - * @param[out] p_oobd_own The OOB data to be sent out of band to a peer. - * - * @retval ::NRF_SUCCESS OOB data successfully generated. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - */ -SVCALL(SD_BLE_GAP_LESC_OOB_DATA_GET, uint32_t, sd_ble_gap_lesc_oob_data_get(uint16_t conn_handle, ble_gap_lesc_p256_pk_t const *p_pk_own, ble_gap_lesc_oob_data_t *p_oobd_own)); - -/**@brief Provide the OOB data sent/received out of band. - * - * @note An authentication procedure with OOB selected as an algorithm must be in progress when calling this function. - * @note A @ref BLE_GAP_EVT_LESC_DHKEY_REQUEST event with the oobd_req set to 1 must have been received prior to calling this function. - * - * @events - * @event{This function is used during authentication procedures\, see the list of events in the documentation of @ref sd_ble_gap_authenticate.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_OOB_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_OOB_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] p_oobd_own The OOB data sent out of band to a peer or NULL if the peer has not received OOB data. - * Must correspond to @ref ble_gap_sec_params_t::oob flag in @ref BLE_GAP_EVT_SEC_PARAMS_REQUEST. - * @param[in] p_oobd_peer The OOB data received out of band from a peer or NULL if none received. - * Must correspond to @ref ble_gap_sec_params_t::oob flag - * in @ref sd_ble_gap_authenticate in the central role or - * in @ref sd_ble_gap_sec_params_reply in the peripheral role. - * - * @retval ::NRF_SUCCESS OOB data accepted. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. Either: - * - Authentication key not requested - * - Not expecting LESC OOB data - * - Have not actually exchanged passkeys. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - */ -SVCALL(SD_BLE_GAP_LESC_OOB_DATA_SET, uint32_t, sd_ble_gap_lesc_oob_data_set(uint16_t conn_handle, ble_gap_lesc_oob_data_t const *p_oobd_own, ble_gap_lesc_oob_data_t const *p_oobd_peer)); - - -/**@brief Initiate GAP Encryption procedure. - * - * @details In the central role, this function will initiate the encryption procedure using the encryption information provided. - * - * @events - * @event{@ref BLE_GAP_EVT_CONN_SEC_UPDATE, The connection security has been updated.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GAP_CENTRAL_ENC_AUTH_MUTEX_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_ENC_MSC} - * @mmsc{@ref BLE_GAP_MULTILINK_CTRL_PROC_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_SEC_REQ_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] p_master_id Pointer to a @ref ble_gap_master_id_t master identification structure. - * @param[in] p_enc_info Pointer to a @ref ble_gap_enc_info_t encryption information structure. - * - * @retval ::NRF_SUCCESS Successfully initiated authentication procedure. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_STATE No link has been established. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - * @retval ::BLE_ERROR_INVALID_ROLE Operation is not supported in the Peripheral role. - * @retval ::NRF_ERROR_BUSY Procedure already in progress or not allowed at this time, wait for pending procedures to complete and retry. - */ -SVCALL(SD_BLE_GAP_ENCRYPT, uint32_t, sd_ble_gap_encrypt(uint16_t conn_handle, ble_gap_master_id_t const *p_master_id, ble_gap_enc_info_t const *p_enc_info)); - - -/**@brief Reply with GAP security information. - * - * @details This function is only used to reply to a @ref BLE_GAP_EVT_SEC_INFO_REQUEST, calling it at other times will result in @ref NRF_ERROR_INVALID_STATE. - * @note If the call returns an error code, the request is still pending, and the reply call may be repeated with corrected parameters. - * @note Data signing is not yet supported, and p_sign_info must therefore be NULL. - * - * @mscs - * @mmsc{@ref BLE_GAP_PERIPH_ENC_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] p_enc_info Pointer to a @ref ble_gap_enc_info_t encryption information structure. May be NULL to signal none is available. - * @param[in] p_id_info Pointer to a @ref ble_gap_irk_t identity information structure. May be NULL to signal none is available. - * @param[in] p_sign_info Pointer to a @ref ble_gap_sign_info_t signing information structure. May be NULL to signal none is available. - * - * @retval ::NRF_SUCCESS Successfully accepted security information. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. Either: - * - No link has been established. - * - No @ref BLE_GAP_EVT_SEC_INFO_REQUEST pending. - * - Encryption information provided by the app without being requested. See @ref ble_gap_evt_sec_info_request_t::enc_info. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - */ -SVCALL(SD_BLE_GAP_SEC_INFO_REPLY, uint32_t, sd_ble_gap_sec_info_reply(uint16_t conn_handle, ble_gap_enc_info_t const *p_enc_info, ble_gap_irk_t const *p_id_info, ble_gap_sign_info_t const *p_sign_info)); - - -/**@brief Get the current connection security. - * - * @param[in] conn_handle Connection handle. - * @param[out] p_conn_sec Pointer to a @ref ble_gap_conn_sec_t structure to be filled in. - * - * @retval ::NRF_SUCCESS Current connection security successfully retrieved. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - */ -SVCALL(SD_BLE_GAP_CONN_SEC_GET, uint32_t, sd_ble_gap_conn_sec_get(uint16_t conn_handle, ble_gap_conn_sec_t *p_conn_sec)); - - -/**@brief Start reporting the received signal strength to the application. - * - * A new event is reported whenever the RSSI value changes, until @ref sd_ble_gap_rssi_stop is called. - * - * @events - * @event{@ref BLE_GAP_EVT_RSSI_CHANGED, New RSSI data available. How often the event is generated is - * dependent on the settings of the threshold_dbm - * and skip_count input parameters.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GAP_CENTRAL_RSSI_READ_MSC} - * @mmsc{@ref BLE_GAP_RSSI_FILT_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] threshold_dbm Minimum change in dBm before triggering the @ref BLE_GAP_EVT_RSSI_CHANGED event. Events are disabled if threshold_dbm equals @ref BLE_GAP_RSSI_THRESHOLD_INVALID. - * @param[in] skip_count Number of RSSI samples with a change of threshold_dbm or more before sending a new @ref BLE_GAP_EVT_RSSI_CHANGED event. - * - * @retval ::NRF_SUCCESS Successfully activated RSSI reporting. - * @retval ::NRF_ERROR_INVALID_STATE RSSI reporting is already ongoing. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - */ -SVCALL(SD_BLE_GAP_RSSI_START, uint32_t, sd_ble_gap_rssi_start(uint16_t conn_handle, uint8_t threshold_dbm, uint8_t skip_count)); - - -/**@brief Stop reporting the received signal strength. - * - * @note An RSSI change detected before the call but not yet received by the application - * may be reported after @ref sd_ble_gap_rssi_stop has been called. - * - * @mscs - * @mmsc{@ref BLE_GAP_CENTRAL_RSSI_READ_MSC} - * @mmsc{@ref BLE_GAP_RSSI_FILT_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * - * @retval ::NRF_SUCCESS Successfully deactivated RSSI reporting. - * @retval ::NRF_ERROR_INVALID_STATE RSSI reporting is not ongoing. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - */ -SVCALL(SD_BLE_GAP_RSSI_STOP, uint32_t, sd_ble_gap_rssi_stop(uint16_t conn_handle)); - - -/**@brief Get the received signal strength for the last connection event. - * - * @ref sd_ble_gap_rssi_start must be called to start reporting RSSI before using this function. @ref NRF_ERROR_NOT_FOUND - * will be returned until RSSI was sampled for the first time after calling @ref sd_ble_gap_rssi_start. - * @note ERRATA-153 and ERRATA-225 require the rssi sample to be compensated based on a temperature measurement. - * @mscs - * @mmsc{@ref BLE_GAP_CENTRAL_RSSI_READ_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[out] p_rssi Pointer to the location where the RSSI measurement shall be stored. - * @param[out] p_ch_index Pointer to the location where Channel Index for the RSSI measurement shall be stored. - * - * @retval ::NRF_SUCCESS Successfully read the RSSI. - * @retval ::NRF_ERROR_NOT_FOUND No sample is available. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - * @retval ::NRF_ERROR_INVALID_STATE RSSI reporting is not ongoing. - */ -SVCALL(SD_BLE_GAP_RSSI_GET, uint32_t, sd_ble_gap_rssi_get(uint16_t conn_handle, int8_t *p_rssi, uint8_t *p_ch_index)); - - -/**@brief Start or continue scanning (GAP Discovery procedure, Observer Procedure). - * - * @note A call to this function will require the application to keep the memory pointed by - * p_adv_report_buffer alive until the buffer is released. The buffer is released when the scanner is stopped - * or when this function is called with another buffer. - * - * @note The scanner will automatically stop in the following cases: - * - @ref sd_ble_gap_scan_stop is called. - * - @ref sd_ble_gap_connect is called. - * - A @ref BLE_GAP_EVT_TIMEOUT with source set to @ref BLE_GAP_TIMEOUT_SRC_SCAN is received. - * - When a @ref BLE_GAP_EVT_ADV_REPORT event is received and @ref ble_gap_adv_report_type_t::status is not set to - * @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA. In this case scanning is only paused to let the application - * access received data. The application must call this function to continue scanning, or call @ref sd_ble_gap_scan_stop - * to stop scanning. - * - * @note If a @ref BLE_GAP_EVT_ADV_REPORT event is received with @ref ble_gap_adv_report_type_t::status set to - * @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA, the scanner will continue scanning, and the application will - * receive more reports from this advertising event. The following reports will include the old and new received data. - * - * @events - * @event{@ref BLE_GAP_EVT_ADV_REPORT, An advertising or scan response packet has been received.} - * @event{@ref BLE_GAP_EVT_TIMEOUT, Scanner has timed out.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GAP_SCAN_MSC} - * @mmsc{@ref BLE_GAP_WL_SHARE_MSC} - * @endmscs - * - * @param[in] p_scan_params Pointer to scan parameters structure. When this function is used to continue - * scanning, this parameter must be NULL. - * @param[in] p_adv_report_buffer Pointer to buffer used to store incoming advertising data. - * The memory pointed to should be kept alive until the scanning is stopped. - * See @ref BLE_GAP_SCAN_BUFFER_SIZE for minimum and maximum buffer size. - * If the scanner receives advertising data larger than can be stored in the buffer, - * a @ref BLE_GAP_EVT_ADV_REPORT will be raised with @ref ble_gap_adv_report_type_t::status - * set to @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_TRUNCATED. - * - * @retval ::NRF_SUCCESS Successfully initiated scanning procedure. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. Either: - * - Scanning is already ongoing and p_scan_params was not NULL - * - Scanning is not running and p_scan_params was NULL. - * - The scanner has timed out when this function is called to continue scanning. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. See @ref ble_gap_scan_params_t. - * @retval ::NRF_ERROR_NOT_SUPPORTED Unsupported parameters supplied. See @ref ble_gap_scan_params_t. - * @retval ::NRF_ERROR_INVALID_LENGTH The provided buffer length is invalid. See @ref BLE_GAP_SCAN_BUFFER_MIN. - * @retval ::NRF_ERROR_RESOURCES Not enough BLE role slots available. - * Stop one or more currently active roles (Central, Peripheral or Broadcaster) and try again - */ -SVCALL(SD_BLE_GAP_SCAN_START, uint32_t, sd_ble_gap_scan_start(ble_gap_scan_params_t const *p_scan_params, ble_data_t const * p_adv_report_buffer)); - - -/**@brief Stop scanning (GAP Discovery procedure, Observer Procedure). - * - * @note The buffer provided in @ref sd_ble_gap_scan_start is released. - * - * @mscs - * @mmsc{@ref BLE_GAP_SCAN_MSC} - * @mmsc{@ref BLE_GAP_WL_SHARE_MSC} - * @endmscs - * - * @retval ::NRF_SUCCESS Successfully stopped scanning procedure. - * @retval ::NRF_ERROR_INVALID_STATE Not in the scanning state. - */ -SVCALL(SD_BLE_GAP_SCAN_STOP, uint32_t, sd_ble_gap_scan_stop(void)); - - -/**@brief Create a connection (GAP Link Establishment). - * - * @note If a scanning procedure is currently in progress it will be automatically stopped when calling this function. - * The scanning procedure will be stopped even if the function returns an error. - * - * @events - * @event{@ref BLE_GAP_EVT_CONNECTED, A connection was established.} - * @event{@ref BLE_GAP_EVT_TIMEOUT, Failed to establish a connection.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GAP_WL_SHARE_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_CONN_PRIV_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_CONN_MSC} - * @endmscs - * - * @param[in] p_peer_addr Pointer to peer identity address. If @ref ble_gap_scan_params_t::filter_policy is set to use - * whitelist, then p_peer_addr is ignored. - * @param[in] p_scan_params Pointer to scan parameters structure. - * @param[in] p_conn_params Pointer to desired connection parameters. - * @param[in] conn_cfg_tag Tag identifying a configuration set by @ref sd_ble_cfg_set or - * @ref BLE_CONN_CFG_TAG_DEFAULT to use the default connection configuration. - * - * @retval ::NRF_SUCCESS Successfully initiated connection procedure. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid parameter(s) pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * - Invalid parameter(s) in p_scan_params or p_conn_params. - * - Use of whitelist requested but whitelist has not been set, see @ref sd_ble_gap_whitelist_set. - * - Peer address was not present in the device identity list, see @ref sd_ble_gap_device_identities_set. - * @retval ::NRF_ERROR_NOT_FOUND conn_cfg_tag not found. - * @retval ::NRF_ERROR_INVALID_STATE The SoftDevice is in an invalid state to perform this operation. This may be due to an - * existing locally initiated connect procedure, which must complete before initiating again. - * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR Invalid Peer address. - * @retval ::NRF_ERROR_CONN_COUNT The limit of available connections for this connection configuration tag has been reached. - * To increase the number of available connections, - * use @ref sd_ble_cfg_set with @ref BLE_GAP_CFG_ROLE_COUNT or @ref BLE_CONN_CFG_GAP. - * @retval ::NRF_ERROR_RESOURCES Either: - * - Not enough BLE role slots available. - * Stop one or more currently active roles (Central, Peripheral or Observer) and try again. - * - The event_length parameter associated with conn_cfg_tag is too small to be able to - * establish a connection on the selected @ref ble_gap_scan_params_t::scan_phys. - * Use @ref sd_ble_cfg_set to increase the event length. - */ -SVCALL(SD_BLE_GAP_CONNECT, uint32_t, sd_ble_gap_connect(ble_gap_addr_t const *p_peer_addr, ble_gap_scan_params_t const *p_scan_params, ble_gap_conn_params_t const *p_conn_params, uint8_t conn_cfg_tag)); - - -/**@brief Cancel a connection establishment. - * - * @mscs - * @mmsc{@ref BLE_GAP_CENTRAL_CONN_MSC} - * @endmscs - * - * @retval ::NRF_SUCCESS Successfully canceled an ongoing connection procedure. - * @retval ::NRF_ERROR_INVALID_STATE No locally initiated connect procedure started or connection - * completed occurred. - */ -SVCALL(SD_BLE_GAP_CONNECT_CANCEL, uint32_t, sd_ble_gap_connect_cancel(void)); - - -/**@brief Initiate or respond to a PHY Update Procedure - * - * @details This function is used to initiate or respond to a PHY Update Procedure. It will always - * generate a @ref BLE_GAP_EVT_PHY_UPDATE event if successfully executed. - * If this function is used to initiate a PHY Update procedure and the only option - * provided in @ref ble_gap_phys_t::tx_phys and @ref ble_gap_phys_t::rx_phys is the - * currently active PHYs in the respective directions, the SoftDevice will generate a - * @ref BLE_GAP_EVT_PHY_UPDATE with the current PHYs set and will not initiate the - * procedure in the Link Layer. - * - * If @ref ble_gap_phys_t::tx_phys or @ref ble_gap_phys_t::rx_phys is @ref BLE_GAP_PHY_AUTO, - * then the stack will select PHYs based on the peer's PHY preferences and the local link - * configuration. The PHY Update procedure will for this case result in a PHY combination - * that respects the time constraints configured with @ref sd_ble_cfg_set and the current - * link layer data length. - * - * When acting as a central, the SoftDevice will select the fastest common PHY in each direction. - * - * If the peer does not support the PHY Update Procedure, then the resulting - * @ref BLE_GAP_EVT_PHY_UPDATE event will have a status set to - * @ref BLE_HCI_UNSUPPORTED_REMOTE_FEATURE. - * - * If the PHY Update procedure was rejected by the peer due to a procedure collision, the status - * will be @ref BLE_HCI_STATUS_CODE_LMP_ERROR_TRANSACTION_COLLISION or - * @ref BLE_HCI_DIFFERENT_TRANSACTION_COLLISION. - * If the peer responds to the PHY Update procedure with invalid parameters, the status - * will be @ref BLE_HCI_STATUS_CODE_INVALID_LMP_PARAMETERS. - * If the PHY Update procedure was rejected by the peer for a different reason, the status will - * contain the reason as specified by the peer. - * - * @events - * @event{@ref BLE_GAP_EVT_PHY_UPDATE, Result of the PHY Update Procedure.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GAP_CENTRAL_PHY_UPDATE} - * @mmsc{@ref BLE_GAP_PERIPHERAL_PHY_UPDATE} - * @endmscs - * - * @param[in] conn_handle Connection handle to indicate the connection for which the PHY Update is requested. - * @param[in] p_gap_phys Pointer to PHY structure. - * - * @retval ::NRF_SUCCESS Successfully requested a PHY Update. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_INVALID_STATE No link has been established. - * @retval ::NRF_ERROR_RESOURCES The connection event length configured for this link is not sufficient for the combination of - * @ref ble_gap_phys_t::tx_phys, @ref ble_gap_phys_t::rx_phys, and @ref ble_gap_data_length_params_t. - * The connection event length is configured with @ref BLE_CONN_CFG_GAP using @ref sd_ble_cfg_set. - * @retval ::NRF_ERROR_BUSY Procedure is already in progress or not allowed at this time. Process pending events and wait for the pending procedure to complete and retry. - * - */ -SVCALL(SD_BLE_GAP_PHY_UPDATE, uint32_t, sd_ble_gap_phy_update(uint16_t conn_handle, ble_gap_phys_t const *p_gap_phys)); - - -/**@brief Initiate or respond to a Data Length Update Procedure. - * - * @note If the application uses @ref BLE_GAP_DATA_LENGTH_AUTO for one or more members of - * p_dl_params, the SoftDevice will choose the highest value supported in current - * configuration and connection parameters. - * @note If the link PHY is Coded, the SoftDevice will ensure that the MaxTxTime and/or MaxRxTime - * used in the Data Length Update procedure is at least 2704 us. Otherwise, MaxTxTime and - * MaxRxTime will be limited to maximum 2120 us. - * - * @param[in] conn_handle Connection handle. - * @param[in] p_dl_params Pointer to local parameters to be used in Data Length Update - * Procedure. Set any member to @ref BLE_GAP_DATA_LENGTH_AUTO to let - * the SoftDevice automatically decide the value for that member. - * Set to NULL to use automatic values for all members. - * @param[out] p_dl_limitation Pointer to limitation to be written when local device does not - * have enough resources or does not support the requested Data Length - * Update parameters. Ignored if NULL. - * - * @mscs - * @mmsc{@ref BLE_GAP_DATA_LENGTH_UPDATE_PROCEDURE_MSC} - * @endmscs - * - * @retval ::NRF_SUCCESS Successfully set Data Length Extension initiation/response parameters. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle parameter supplied. - * @retval ::NRF_ERROR_INVALID_STATE No link has been established. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameters supplied. - * @retval ::NRF_ERROR_NOT_SUPPORTED The requested parameters are not supported by the SoftDevice. Inspect - * p_dl_limitation to see which parameter is not supported. - * @retval ::NRF_ERROR_RESOURCES The connection event length configured for this link is not sufficient for the requested parameters. - * Use @ref sd_ble_cfg_set with @ref BLE_CONN_CFG_GAP to increase the connection event length. - * Inspect p_dl_limitation to see where the limitation is. - * @retval ::NRF_ERROR_BUSY Peer has already initiated a Data Length Update Procedure. Process the - * pending @ref BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST event to respond. - */ -SVCALL(SD_BLE_GAP_DATA_LENGTH_UPDATE, uint32_t, sd_ble_gap_data_length_update(uint16_t conn_handle, ble_gap_data_length_params_t const *p_dl_params, ble_gap_data_length_limitation_t *p_dl_limitation)); - -/**@brief Start the Quality of Service (QoS) channel survey module. - * - * @details The channel survey module provides measurements of the energy levels on - * the Bluetooth Low Energy channels. When the module is enabled, @ref BLE_GAP_EVT_QOS_CHANNEL_SURVEY_REPORT - * events will periodically report the measured energy levels for each channel. - * - * @note The measurements are scheduled with lower priority than other Bluetooth Low Energy roles, - * Radio Timeslot API events and Flash API events. - * - * @note The channel survey module will attempt to do measurements so that the average interval - * between measurements will be interval_us. However due to the channel survey module - * having the lowest priority of all roles and modules, this may not be possible. In that - * case fewer than expected channel survey reports may be given. - * - * @note In order to use the channel survey module, @ref ble_gap_cfg_role_count_t::qos_channel_survey_role_available - * must be set. This is done using @ref sd_ble_cfg_set. - * - * @param[in] interval_us Requested average interval for the measurements and reports. See - * @ref BLE_GAP_QOS_CHANNEL_SURVEY_INTERVALS for valid ranges. If set - * to @ref BLE_GAP_QOS_CHANNEL_SURVEY_INTERVAL_CONTINUOUS, the channel - * survey role will be scheduled at every available opportunity. - * - * @retval ::NRF_SUCCESS The module is successfully started. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter supplied. interval_us is out of the - * allowed range. - * @retval ::NRF_ERROR_INVALID_STATE Trying to start the module when already running. - * @retval ::NRF_ERROR_RESOURCES The channel survey module is not available to the application. - * Set @ref ble_gap_cfg_role_count_t::qos_channel_survey_role_available using - * @ref sd_ble_cfg_set. - */ -SVCALL(SD_BLE_GAP_QOS_CHANNEL_SURVEY_START, uint32_t, sd_ble_gap_qos_channel_survey_start(uint32_t interval_us)); - -/**@brief Stop the Quality of Service (QoS) channel survey module. - * - * @note The SoftDevice may generate one @ref BLE_GAP_EVT_QOS_CHANNEL_SURVEY_REPORT event after this - * function is called. - * - * @retval ::NRF_SUCCESS The module is successfully stopped. - * @retval ::NRF_ERROR_INVALID_STATE Trying to stop the module when it is not running. - */ -SVCALL(SD_BLE_GAP_QOS_CHANNEL_SURVEY_STOP, uint32_t, sd_ble_gap_qos_channel_survey_stop(void)); - - -/**@brief Obtain the next connection event counter value. - * - * @details The connection event counter is initialized to zero on the first connection event. The value is incremented - * by one for each connection event. For more information see Bluetooth Core Specification v5.0, Vol 6, Part B, - * Section 4.5.1. - * - * @note The connection event counter obtained through this API will be outdated if this API is called - * at the same time as the connection event counter is incremented. - * - * @note This API will always return the last connection event counter + 1. - * The actual connection event may be multiple connection events later if: - * - Slave latency is enabled and there is no data to transmit or receive. - * - Another role is scheduled with a higher priority at the same time as the next connection event. - * - * @param[in] conn_handle Connection handle. - * @param[out] p_counter Pointer to the variable where the next connection event counter will be written. - * - * @retval ::NRF_SUCCESS The connection event counter was successfully retrieved. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle parameter supplied. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - */ -SVCALL(SD_BLE_GAP_NEXT_CONN_EVT_COUNTER_GET, uint32_t, sd_ble_gap_next_conn_evt_counter_get(uint16_t conn_handle, uint16_t * p_counter)); - - -/**@brief Start triggering a given task on connection event start. - * - * @details When enabled, this feature will trigger a PPI task at the start of connection events. - * The application can configure the SoftDevice to trigger every N connection events starting from - * a given connection event counter. See also @ref ble_gap_conn_event_trigger_t. - * - * @param[in] conn_handle Connection handle. - * @param[in] p_params Connection event trigger parameters. - * - * @retval ::NRF_SUCCESS Success. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter supplied. See @ref ble_gap_conn_event_trigger_t. - * @retval ::NRF_ERROR_INVALID_STATE Either: - * - Trying to start connection event triggering when it is already ongoing. - * - @ref ble_gap_conn_event_trigger_t::conn_evt_counter_start is in the past. - * Use @ref sd_ble_gap_next_conn_evt_counter_get to find a new value - to be used as ble_gap_conn_event_trigger_t::conn_evt_counter_start. - */ -SVCALL(SD_BLE_GAP_CONN_EVT_TRIGGER_START, uint32_t, sd_ble_gap_conn_evt_trigger_start(uint16_t conn_handle, ble_gap_conn_event_trigger_t const * p_params)); - - -/**@brief Stop triggering the task configured using @ref sd_ble_gap_conn_evt_trigger_start. - * - * @param[in] conn_handle Connection handle. - * - * @retval ::NRF_SUCCESS Success. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - * @retval ::NRF_ERROR_INVALID_STATE Trying to stop connection event triggering when it is not enabled. - */ -SVCALL(SD_BLE_GAP_CONN_EVT_TRIGGER_STOP, uint32_t, sd_ble_gap_conn_evt_trigger_stop(uint16_t conn_handle)); - - -/** @} */ - -#ifdef __cplusplus -} -#endif -#endif // BLE_GAP_H__ - -/** - @} -*/ diff --git a/lib/nrf52/s140_nrf52_7.3.0_API/include/ble_gatt.h b/lib/nrf52/s140_nrf52_7.3.0_API/include/ble_gatt.h deleted file mode 100755 index 14d1f59c..00000000 --- a/lib/nrf52/s140_nrf52_7.3.0_API/include/ble_gatt.h +++ /dev/null @@ -1,229 +0,0 @@ -/* - * Copyright (c) Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - @addtogroup BLE_GATT Generic Attribute Profile (GATT) Common - @{ - @brief Common definitions and prototypes for the GATT interfaces. - */ - -#ifndef BLE_GATT_H__ -#define BLE_GATT_H__ - -#include -#include "nrf_svc.h" -#include "nrf_error.h" -#include "ble_hci.h" -#include "ble_ranges.h" -#include "ble_types.h" -#include "ble_err.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** @addtogroup BLE_GATT_DEFINES Defines - * @{ */ - -/** @brief Default ATT MTU, in bytes. */ -#define BLE_GATT_ATT_MTU_DEFAULT 23 - -/**@brief Invalid Attribute Handle. */ -#define BLE_GATT_HANDLE_INVALID 0x0000 - -/**@brief First Attribute Handle. */ -#define BLE_GATT_HANDLE_START 0x0001 - -/**@brief Last Attribute Handle. */ -#define BLE_GATT_HANDLE_END 0xFFFF - -/** @defgroup BLE_GATT_TIMEOUT_SOURCES GATT Timeout sources - * @{ */ -#define BLE_GATT_TIMEOUT_SRC_PROTOCOL 0x00 /**< ATT Protocol timeout. */ -/** @} */ - -/** @defgroup BLE_GATT_WRITE_OPS GATT Write operations - * @{ */ -#define BLE_GATT_OP_INVALID 0x00 /**< Invalid Operation. */ -#define BLE_GATT_OP_WRITE_REQ 0x01 /**< Write Request. */ -#define BLE_GATT_OP_WRITE_CMD 0x02 /**< Write Command. */ -#define BLE_GATT_OP_SIGN_WRITE_CMD 0x03 /**< Signed Write Command. */ -#define BLE_GATT_OP_PREP_WRITE_REQ 0x04 /**< Prepare Write Request. */ -#define BLE_GATT_OP_EXEC_WRITE_REQ 0x05 /**< Execute Write Request. */ -/** @} */ - -/** @defgroup BLE_GATT_EXEC_WRITE_FLAGS GATT Execute Write flags - * @{ */ -#define BLE_GATT_EXEC_WRITE_FLAG_PREPARED_CANCEL 0x00 /**< Cancel prepared write. */ -#define BLE_GATT_EXEC_WRITE_FLAG_PREPARED_WRITE 0x01 /**< Execute prepared write. */ -/** @} */ - -/** @defgroup BLE_GATT_HVX_TYPES GATT Handle Value operations - * @{ */ -#define BLE_GATT_HVX_INVALID 0x00 /**< Invalid Operation. */ -#define BLE_GATT_HVX_NOTIFICATION 0x01 /**< Handle Value Notification. */ -#define BLE_GATT_HVX_INDICATION 0x02 /**< Handle Value Indication. */ -/** @} */ - -/** @defgroup BLE_GATT_STATUS_CODES GATT Status Codes - * @{ */ -#define BLE_GATT_STATUS_SUCCESS 0x0000 /**< Success. */ -#define BLE_GATT_STATUS_UNKNOWN 0x0001 /**< Unknown or not applicable status. */ -#define BLE_GATT_STATUS_ATTERR_INVALID 0x0100 /**< ATT Error: Invalid Error Code. */ -#define BLE_GATT_STATUS_ATTERR_INVALID_HANDLE 0x0101 /**< ATT Error: Invalid Attribute Handle. */ -#define BLE_GATT_STATUS_ATTERR_READ_NOT_PERMITTED 0x0102 /**< ATT Error: Read not permitted. */ -#define BLE_GATT_STATUS_ATTERR_WRITE_NOT_PERMITTED 0x0103 /**< ATT Error: Write not permitted. */ -#define BLE_GATT_STATUS_ATTERR_INVALID_PDU 0x0104 /**< ATT Error: Used in ATT as Invalid PDU. */ -#define BLE_GATT_STATUS_ATTERR_INSUF_AUTHENTICATION 0x0105 /**< ATT Error: Authenticated link required. */ -#define BLE_GATT_STATUS_ATTERR_REQUEST_NOT_SUPPORTED 0x0106 /**< ATT Error: Used in ATT as Request Not Supported. */ -#define BLE_GATT_STATUS_ATTERR_INVALID_OFFSET 0x0107 /**< ATT Error: Offset specified was past the end of the attribute. */ -#define BLE_GATT_STATUS_ATTERR_INSUF_AUTHORIZATION 0x0108 /**< ATT Error: Used in ATT as Insufficient Authorization. */ -#define BLE_GATT_STATUS_ATTERR_PREPARE_QUEUE_FULL 0x0109 /**< ATT Error: Used in ATT as Prepare Queue Full. */ -#define BLE_GATT_STATUS_ATTERR_ATTRIBUTE_NOT_FOUND 0x010A /**< ATT Error: Used in ATT as Attribute not found. */ -#define BLE_GATT_STATUS_ATTERR_ATTRIBUTE_NOT_LONG 0x010B /**< ATT Error: Attribute cannot be read or written using read/write blob requests. */ -#define BLE_GATT_STATUS_ATTERR_INSUF_ENC_KEY_SIZE 0x010C /**< ATT Error: Encryption key size used is insufficient. */ -#define BLE_GATT_STATUS_ATTERR_INVALID_ATT_VAL_LENGTH 0x010D /**< ATT Error: Invalid value size. */ -#define BLE_GATT_STATUS_ATTERR_UNLIKELY_ERROR 0x010E /**< ATT Error: Very unlikely error. */ -#define BLE_GATT_STATUS_ATTERR_INSUF_ENCRYPTION 0x010F /**< ATT Error: Encrypted link required. */ -#define BLE_GATT_STATUS_ATTERR_UNSUPPORTED_GROUP_TYPE 0x0110 /**< ATT Error: Attribute type is not a supported grouping attribute. */ -#define BLE_GATT_STATUS_ATTERR_INSUF_RESOURCES 0x0111 /**< ATT Error: Insufficient resources. */ -#define BLE_GATT_STATUS_ATTERR_RFU_RANGE1_BEGIN 0x0112 /**< ATT Error: Reserved for Future Use range #1 begin. */ -#define BLE_GATT_STATUS_ATTERR_RFU_RANGE1_END 0x017F /**< ATT Error: Reserved for Future Use range #1 end. */ -#define BLE_GATT_STATUS_ATTERR_APP_BEGIN 0x0180 /**< ATT Error: Application range begin. */ -#define BLE_GATT_STATUS_ATTERR_APP_END 0x019F /**< ATT Error: Application range end. */ -#define BLE_GATT_STATUS_ATTERR_RFU_RANGE2_BEGIN 0x01A0 /**< ATT Error: Reserved for Future Use range #2 begin. */ -#define BLE_GATT_STATUS_ATTERR_RFU_RANGE2_END 0x01DF /**< ATT Error: Reserved for Future Use range #2 end. */ -#define BLE_GATT_STATUS_ATTERR_RFU_RANGE3_BEGIN 0x01E0 /**< ATT Error: Reserved for Future Use range #3 begin. */ -#define BLE_GATT_STATUS_ATTERR_RFU_RANGE3_END 0x01FC /**< ATT Error: Reserved for Future Use range #3 end. */ -#define BLE_GATT_STATUS_ATTERR_CPS_WRITE_REQ_REJECTED 0x01FC /**< ATT Common Profile and Service Error: Write request rejected. */ -#define BLE_GATT_STATUS_ATTERR_CPS_CCCD_CONFIG_ERROR 0x01FD /**< ATT Common Profile and Service Error: Client Characteristic Configuration Descriptor improperly configured. */ -#define BLE_GATT_STATUS_ATTERR_CPS_PROC_ALR_IN_PROG 0x01FE /**< ATT Common Profile and Service Error: Procedure Already in Progress. */ -#define BLE_GATT_STATUS_ATTERR_CPS_OUT_OF_RANGE 0x01FF /**< ATT Common Profile and Service Error: Out Of Range. */ -/** @} */ - - -/** @defgroup BLE_GATT_CPF_FORMATS Characteristic Presentation Formats - * @note Found at http://developer.bluetooth.org/gatt/descriptors/Pages/DescriptorViewer.aspx?u=org.bluetooth.descriptor.gatt.characteristic_presentation_format.xml - * @{ */ -#define BLE_GATT_CPF_FORMAT_RFU 0x00 /**< Reserved For Future Use. */ -#define BLE_GATT_CPF_FORMAT_BOOLEAN 0x01 /**< Boolean. */ -#define BLE_GATT_CPF_FORMAT_2BIT 0x02 /**< Unsigned 2-bit integer. */ -#define BLE_GATT_CPF_FORMAT_NIBBLE 0x03 /**< Unsigned 4-bit integer. */ -#define BLE_GATT_CPF_FORMAT_UINT8 0x04 /**< Unsigned 8-bit integer. */ -#define BLE_GATT_CPF_FORMAT_UINT12 0x05 /**< Unsigned 12-bit integer. */ -#define BLE_GATT_CPF_FORMAT_UINT16 0x06 /**< Unsigned 16-bit integer. */ -#define BLE_GATT_CPF_FORMAT_UINT24 0x07 /**< Unsigned 24-bit integer. */ -#define BLE_GATT_CPF_FORMAT_UINT32 0x08 /**< Unsigned 32-bit integer. */ -#define BLE_GATT_CPF_FORMAT_UINT48 0x09 /**< Unsigned 48-bit integer. */ -#define BLE_GATT_CPF_FORMAT_UINT64 0x0A /**< Unsigned 64-bit integer. */ -#define BLE_GATT_CPF_FORMAT_UINT128 0x0B /**< Unsigned 128-bit integer. */ -#define BLE_GATT_CPF_FORMAT_SINT8 0x0C /**< Signed 2-bit integer. */ -#define BLE_GATT_CPF_FORMAT_SINT12 0x0D /**< Signed 12-bit integer. */ -#define BLE_GATT_CPF_FORMAT_SINT16 0x0E /**< Signed 16-bit integer. */ -#define BLE_GATT_CPF_FORMAT_SINT24 0x0F /**< Signed 24-bit integer. */ -#define BLE_GATT_CPF_FORMAT_SINT32 0x10 /**< Signed 32-bit integer. */ -#define BLE_GATT_CPF_FORMAT_SINT48 0x11 /**< Signed 48-bit integer. */ -#define BLE_GATT_CPF_FORMAT_SINT64 0x12 /**< Signed 64-bit integer. */ -#define BLE_GATT_CPF_FORMAT_SINT128 0x13 /**< Signed 128-bit integer. */ -#define BLE_GATT_CPF_FORMAT_FLOAT32 0x14 /**< IEEE-754 32-bit floating point. */ -#define BLE_GATT_CPF_FORMAT_FLOAT64 0x15 /**< IEEE-754 64-bit floating point. */ -#define BLE_GATT_CPF_FORMAT_SFLOAT 0x16 /**< IEEE-11073 16-bit SFLOAT. */ -#define BLE_GATT_CPF_FORMAT_FLOAT 0x17 /**< IEEE-11073 32-bit FLOAT. */ -#define BLE_GATT_CPF_FORMAT_DUINT16 0x18 /**< IEEE-20601 format. */ -#define BLE_GATT_CPF_FORMAT_UTF8S 0x19 /**< UTF-8 string. */ -#define BLE_GATT_CPF_FORMAT_UTF16S 0x1A /**< UTF-16 string. */ -#define BLE_GATT_CPF_FORMAT_STRUCT 0x1B /**< Opaque Structure. */ -/** @} */ - -/** @defgroup BLE_GATT_CPF_NAMESPACES GATT Bluetooth Namespaces - * @{ - */ -#define BLE_GATT_CPF_NAMESPACE_BTSIG 0x01 /**< Bluetooth SIG defined Namespace. */ -#define BLE_GATT_CPF_NAMESPACE_DESCRIPTION_UNKNOWN 0x0000 /**< Namespace Description Unknown. */ -/** @} */ - -/** @} */ - -/** @addtogroup BLE_GATT_STRUCTURES Structures - * @{ */ - -/** - * @brief BLE GATT connection configuration parameters, set with @ref sd_ble_cfg_set. - * - * @retval ::NRF_ERROR_INVALID_PARAM att_mtu is smaller than @ref BLE_GATT_ATT_MTU_DEFAULT. - */ -typedef struct -{ - uint16_t att_mtu; /**< Maximum size of ATT packet the SoftDevice can send or receive. - The default and minimum value is @ref BLE_GATT_ATT_MTU_DEFAULT. - @mscs - @mmsc{@ref BLE_GATTC_MTU_EXCHANGE} - @mmsc{@ref BLE_GATTS_MTU_EXCHANGE} - @endmscs - */ -} ble_gatt_conn_cfg_t; - -/**@brief GATT Characteristic Properties. */ -typedef struct -{ - /* Standard properties */ - uint8_t broadcast :1; /**< Broadcasting of the value permitted. */ - uint8_t read :1; /**< Reading the value permitted. */ - uint8_t write_wo_resp :1; /**< Writing the value with Write Command permitted. */ - uint8_t write :1; /**< Writing the value with Write Request permitted. */ - uint8_t notify :1; /**< Notification of the value permitted. */ - uint8_t indicate :1; /**< Indications of the value permitted. */ - uint8_t auth_signed_wr :1; /**< Writing the value with Signed Write Command permitted. */ -} ble_gatt_char_props_t; - -/**@brief GATT Characteristic Extended Properties. */ -typedef struct -{ - /* Extended properties */ - uint8_t reliable_wr :1; /**< Writing the value with Queued Write operations permitted. */ - uint8_t wr_aux :1; /**< Writing the Characteristic User Description descriptor permitted. */ -} ble_gatt_char_ext_props_t; - -/** @} */ - -#ifdef __cplusplus -} -#endif -#endif // BLE_GATT_H__ - -/** @} */ diff --git a/lib/nrf52/s140_nrf52_7.3.0_API/include/ble_gattc.h b/lib/nrf52/s140_nrf52_7.3.0_API/include/ble_gattc.h deleted file mode 100755 index e0c0405a..00000000 --- a/lib/nrf52/s140_nrf52_7.3.0_API/include/ble_gattc.h +++ /dev/null @@ -1,755 +0,0 @@ -/* - * Copyright (c) Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - @addtogroup BLE_GATTC Generic Attribute Profile (GATT) Client - @{ - @brief Definitions and prototypes for the GATT Client interface. - */ - -#ifndef BLE_GATTC_H__ -#define BLE_GATTC_H__ - -#include -#include "nrf.h" -#include "nrf_svc.h" -#include "nrf_error.h" -#include "ble_ranges.h" -#include "ble_types.h" -#include "ble_err.h" -#include "ble_gatt.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** @addtogroup BLE_GATTC_ENUMERATIONS Enumerations - * @{ */ - -/**@brief GATTC API SVC numbers. */ -enum BLE_GATTC_SVCS -{ - SD_BLE_GATTC_PRIMARY_SERVICES_DISCOVER = BLE_GATTC_SVC_BASE, /**< Primary Service Discovery. */ - SD_BLE_GATTC_RELATIONSHIPS_DISCOVER, /**< Relationship Discovery. */ - SD_BLE_GATTC_CHARACTERISTICS_DISCOVER, /**< Characteristic Discovery. */ - SD_BLE_GATTC_DESCRIPTORS_DISCOVER, /**< Characteristic Descriptor Discovery. */ - SD_BLE_GATTC_ATTR_INFO_DISCOVER, /**< Attribute Information Discovery. */ - SD_BLE_GATTC_CHAR_VALUE_BY_UUID_READ, /**< Read Characteristic Value by UUID. */ - SD_BLE_GATTC_READ, /**< Generic read. */ - SD_BLE_GATTC_CHAR_VALUES_READ, /**< Read multiple Characteristic Values. */ - SD_BLE_GATTC_WRITE, /**< Generic write. */ - SD_BLE_GATTC_HV_CONFIRM, /**< Handle Value Confirmation. */ - SD_BLE_GATTC_EXCHANGE_MTU_REQUEST, /**< Exchange MTU Request. */ -}; - -/** - * @brief GATT Client Event IDs. - */ -enum BLE_GATTC_EVTS -{ - BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP = BLE_GATTC_EVT_BASE, /**< Primary Service Discovery Response event. \n See @ref ble_gattc_evt_prim_srvc_disc_rsp_t. */ - BLE_GATTC_EVT_REL_DISC_RSP, /**< Relationship Discovery Response event. \n See @ref ble_gattc_evt_rel_disc_rsp_t. */ - BLE_GATTC_EVT_CHAR_DISC_RSP, /**< Characteristic Discovery Response event. \n See @ref ble_gattc_evt_char_disc_rsp_t. */ - BLE_GATTC_EVT_DESC_DISC_RSP, /**< Descriptor Discovery Response event. \n See @ref ble_gattc_evt_desc_disc_rsp_t. */ - BLE_GATTC_EVT_ATTR_INFO_DISC_RSP, /**< Attribute Information Response event. \n See @ref ble_gattc_evt_attr_info_disc_rsp_t. */ - BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP, /**< Read By UUID Response event. \n See @ref ble_gattc_evt_char_val_by_uuid_read_rsp_t. */ - BLE_GATTC_EVT_READ_RSP, /**< Read Response event. \n See @ref ble_gattc_evt_read_rsp_t. */ - BLE_GATTC_EVT_CHAR_VALS_READ_RSP, /**< Read multiple Response event. \n See @ref ble_gattc_evt_char_vals_read_rsp_t. */ - BLE_GATTC_EVT_WRITE_RSP, /**< Write Response event. \n See @ref ble_gattc_evt_write_rsp_t. */ - BLE_GATTC_EVT_HVX, /**< Handle Value Notification or Indication event. \n Confirm indication with @ref sd_ble_gattc_hv_confirm. \n See @ref ble_gattc_evt_hvx_t. */ - BLE_GATTC_EVT_EXCHANGE_MTU_RSP, /**< Exchange MTU Response event. \n See @ref ble_gattc_evt_exchange_mtu_rsp_t. */ - BLE_GATTC_EVT_TIMEOUT, /**< Timeout event. \n See @ref ble_gattc_evt_timeout_t. */ - BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE /**< Write without Response transmission complete. \n See @ref ble_gattc_evt_write_cmd_tx_complete_t. */ -}; - -/**@brief GATTC Option IDs. - * IDs that uniquely identify a GATTC option. - */ -enum BLE_GATTC_OPTS -{ - BLE_GATTC_OPT_UUID_DISC = BLE_GATTC_OPT_BASE, /**< UUID discovery. @ref ble_gattc_opt_uuid_disc_t */ -}; - -/** @} */ - -/** @addtogroup BLE_GATTC_DEFINES Defines - * @{ */ - -/** @defgroup BLE_ERRORS_GATTC SVC return values specific to GATTC - * @{ */ -#define BLE_ERROR_GATTC_PROC_NOT_PERMITTED (NRF_GATTC_ERR_BASE + 0x000) /**< Procedure not Permitted. */ -/** @} */ - -/** @defgroup BLE_GATTC_ATTR_INFO_FORMAT Attribute Information Formats - * @{ */ -#define BLE_GATTC_ATTR_INFO_FORMAT_16BIT 1 /**< 16-bit Attribute Information Format. */ -#define BLE_GATTC_ATTR_INFO_FORMAT_128BIT 2 /**< 128-bit Attribute Information Format. */ -/** @} */ - -/** @defgroup BLE_GATTC_DEFAULTS GATT Client defaults - * @{ */ -#define BLE_GATTC_WRITE_CMD_TX_QUEUE_SIZE_DEFAULT 1 /**< Default number of Write without Response that can be queued for transmission. */ -/** @} */ - -/** @} */ - -/** @addtogroup BLE_GATTC_STRUCTURES Structures - * @{ */ - -/** - * @brief BLE GATTC connection configuration parameters, set with @ref sd_ble_cfg_set. - */ -typedef struct -{ - uint8_t write_cmd_tx_queue_size; /**< The guaranteed minimum number of Write without Response that can be queued for transmission. - The default value is @ref BLE_GATTC_WRITE_CMD_TX_QUEUE_SIZE_DEFAULT */ -} ble_gattc_conn_cfg_t; - -/**@brief Operation Handle Range. */ -typedef struct -{ - uint16_t start_handle; /**< Start Handle. */ - uint16_t end_handle; /**< End Handle. */ -} ble_gattc_handle_range_t; - - -/**@brief GATT service. */ -typedef struct -{ - ble_uuid_t uuid; /**< Service UUID. */ - ble_gattc_handle_range_t handle_range; /**< Service Handle Range. */ -} ble_gattc_service_t; - - -/**@brief GATT include. */ -typedef struct -{ - uint16_t handle; /**< Include Handle. */ - ble_gattc_service_t included_srvc; /**< Handle of the included service. */ -} ble_gattc_include_t; - - -/**@brief GATT characteristic. */ -typedef struct -{ - ble_uuid_t uuid; /**< Characteristic UUID. */ - ble_gatt_char_props_t char_props; /**< Characteristic Properties. */ - uint8_t char_ext_props : 1; /**< Extended properties present. */ - uint16_t handle_decl; /**< Handle of the Characteristic Declaration. */ - uint16_t handle_value; /**< Handle of the Characteristic Value. */ -} ble_gattc_char_t; - - -/**@brief GATT descriptor. */ -typedef struct -{ - uint16_t handle; /**< Descriptor Handle. */ - ble_uuid_t uuid; /**< Descriptor UUID. */ -} ble_gattc_desc_t; - - -/**@brief Write Parameters. */ -typedef struct -{ - uint8_t write_op; /**< Write Operation to be performed, see @ref BLE_GATT_WRITE_OPS. */ - uint8_t flags; /**< Flags, see @ref BLE_GATT_EXEC_WRITE_FLAGS. */ - uint16_t handle; /**< Handle to the attribute to be written. */ - uint16_t offset; /**< Offset in bytes. @note For WRITE_CMD and WRITE_REQ, offset must be 0. */ - uint16_t len; /**< Length of data in bytes. */ - uint8_t const *p_value; /**< Pointer to the value data. */ -} ble_gattc_write_params_t; - -/**@brief Attribute Information for 16-bit Attribute UUID. */ -typedef struct -{ - uint16_t handle; /**< Attribute handle. */ - ble_uuid_t uuid; /**< 16-bit Attribute UUID. */ -} ble_gattc_attr_info16_t; - -/**@brief Attribute Information for 128-bit Attribute UUID. */ -typedef struct -{ - uint16_t handle; /**< Attribute handle. */ - ble_uuid128_t uuid; /**< 128-bit Attribute UUID. */ -} ble_gattc_attr_info128_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP. */ -typedef struct -{ - uint16_t count; /**< Service count. */ - ble_gattc_service_t services[1]; /**< Service data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ -} ble_gattc_evt_prim_srvc_disc_rsp_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_REL_DISC_RSP. */ -typedef struct -{ - uint16_t count; /**< Include count. */ - ble_gattc_include_t includes[1]; /**< Include data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ -} ble_gattc_evt_rel_disc_rsp_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_CHAR_DISC_RSP. */ -typedef struct -{ - uint16_t count; /**< Characteristic count. */ - ble_gattc_char_t chars[1]; /**< Characteristic data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ -} ble_gattc_evt_char_disc_rsp_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_DESC_DISC_RSP. */ -typedef struct -{ - uint16_t count; /**< Descriptor count. */ - ble_gattc_desc_t descs[1]; /**< Descriptor data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ -} ble_gattc_evt_desc_disc_rsp_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_ATTR_INFO_DISC_RSP. */ -typedef struct -{ - uint16_t count; /**< Attribute count. */ - uint8_t format; /**< Attribute information format, see @ref BLE_GATTC_ATTR_INFO_FORMAT. */ - union { - ble_gattc_attr_info16_t attr_info16[1]; /**< Attribute information for 16-bit Attribute UUID. - @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ - ble_gattc_attr_info128_t attr_info128[1]; /**< Attribute information for 128-bit Attribute UUID. - @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ - } info; /**< Attribute information union. */ -} ble_gattc_evt_attr_info_disc_rsp_t; - -/**@brief GATT read by UUID handle value pair. */ -typedef struct -{ - uint16_t handle; /**< Attribute Handle. */ - uint8_t *p_value; /**< Pointer to the Attribute Value, length is available in @ref ble_gattc_evt_char_val_by_uuid_read_rsp_t::value_len. */ -} ble_gattc_handle_value_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP. */ -typedef struct -{ - uint16_t count; /**< Handle-Value Pair Count. */ - uint16_t value_len; /**< Length of the value in Handle-Value(s) list. */ - uint8_t handle_value[1]; /**< Handle-Value(s) list. To iterate through the list use @ref sd_ble_gattc_evt_char_val_by_uuid_read_rsp_iter. - @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ -} ble_gattc_evt_char_val_by_uuid_read_rsp_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_READ_RSP. */ -typedef struct -{ - uint16_t handle; /**< Attribute Handle. */ - uint16_t offset; /**< Offset of the attribute data. */ - uint16_t len; /**< Attribute data length. */ - uint8_t data[1]; /**< Attribute data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ -} ble_gattc_evt_read_rsp_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_CHAR_VALS_READ_RSP. */ -typedef struct -{ - uint16_t len; /**< Concatenated Attribute values length. */ - uint8_t values[1]; /**< Attribute values. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ -} ble_gattc_evt_char_vals_read_rsp_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_WRITE_RSP. */ -typedef struct -{ - uint16_t handle; /**< Attribute Handle. */ - uint8_t write_op; /**< Type of write operation, see @ref BLE_GATT_WRITE_OPS. */ - uint16_t offset; /**< Data offset. */ - uint16_t len; /**< Data length. */ - uint8_t data[1]; /**< Data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ -} ble_gattc_evt_write_rsp_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_HVX. */ -typedef struct -{ - uint16_t handle; /**< Handle to which the HVx operation applies. */ - uint8_t type; /**< Indication or Notification, see @ref BLE_GATT_HVX_TYPES. */ - uint16_t len; /**< Attribute data length. */ - uint8_t data[1]; /**< Attribute data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ -} ble_gattc_evt_hvx_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_EXCHANGE_MTU_RSP. */ -typedef struct -{ - uint16_t server_rx_mtu; /**< Server RX MTU size. */ -} ble_gattc_evt_exchange_mtu_rsp_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_TIMEOUT. */ -typedef struct -{ - uint8_t src; /**< Timeout source, see @ref BLE_GATT_TIMEOUT_SOURCES. */ -} ble_gattc_evt_timeout_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE. */ -typedef struct -{ - uint8_t count; /**< Number of write without response transmissions completed. */ -} ble_gattc_evt_write_cmd_tx_complete_t; - -/**@brief GATTC event structure. */ -typedef struct -{ - uint16_t conn_handle; /**< Connection Handle on which event occurred. */ - uint16_t gatt_status; /**< GATT status code for the operation, see @ref BLE_GATT_STATUS_CODES. */ - uint16_t error_handle; /**< In case of error: The handle causing the error. In all other cases @ref BLE_GATT_HANDLE_INVALID. */ - union - { - ble_gattc_evt_prim_srvc_disc_rsp_t prim_srvc_disc_rsp; /**< Primary Service Discovery Response Event Parameters. */ - ble_gattc_evt_rel_disc_rsp_t rel_disc_rsp; /**< Relationship Discovery Response Event Parameters. */ - ble_gattc_evt_char_disc_rsp_t char_disc_rsp; /**< Characteristic Discovery Response Event Parameters. */ - ble_gattc_evt_desc_disc_rsp_t desc_disc_rsp; /**< Descriptor Discovery Response Event Parameters. */ - ble_gattc_evt_char_val_by_uuid_read_rsp_t char_val_by_uuid_read_rsp; /**< Characteristic Value Read by UUID Response Event Parameters. */ - ble_gattc_evt_read_rsp_t read_rsp; /**< Read Response Event Parameters. */ - ble_gattc_evt_char_vals_read_rsp_t char_vals_read_rsp; /**< Characteristic Values Read Response Event Parameters. */ - ble_gattc_evt_write_rsp_t write_rsp; /**< Write Response Event Parameters. */ - ble_gattc_evt_hvx_t hvx; /**< Handle Value Notification/Indication Event Parameters. */ - ble_gattc_evt_exchange_mtu_rsp_t exchange_mtu_rsp; /**< Exchange MTU Response Event Parameters. */ - ble_gattc_evt_timeout_t timeout; /**< Timeout Event Parameters. */ - ble_gattc_evt_attr_info_disc_rsp_t attr_info_disc_rsp; /**< Attribute Information Discovery Event Parameters. */ - ble_gattc_evt_write_cmd_tx_complete_t write_cmd_tx_complete; /**< Write without Response transmission complete Event Parameters. */ - } params; /**< Event Parameters. @note Only valid if @ref gatt_status == @ref BLE_GATT_STATUS_SUCCESS. */ -} ble_gattc_evt_t; - -/**@brief UUID discovery option. - * - * @details Used with @ref sd_ble_opt_set to enable and disable automatic insertion of discovered 128-bit UUIDs to the - * Vendor Specific UUID table. Disabled by default. - * - When disabled, if a procedure initiated by - * @ref sd_ble_gattc_primary_services_discover, - * @ref sd_ble_gattc_relationships_discover, - * @ref sd_ble_gattc_characteristics_discover, - * @ref sd_ble_gattc_descriptors_discover - * finds a 128-bit UUID which was not added by @ref sd_ble_uuid_vs_add, @ref ble_uuid_t::type will be set - * to @ref BLE_UUID_TYPE_UNKNOWN in the corresponding event. - * - When enabled, all found 128-bit UUIDs will be automatically added. The application can use - * @ref sd_ble_uuid_encode to retrieve the 128-bit UUID from @ref ble_uuid_t received in the corresponding - * event. If the total number of Vendor Specific UUIDs exceeds the table capacity, @ref ble_uuid_t::type will - * be set to @ref BLE_UUID_TYPE_UNKNOWN in the corresponding event. - * See also @ref ble_common_cfg_vs_uuid_t, @ref sd_ble_uuid_vs_remove. - * - * @note @ref sd_ble_opt_get is not supported for this option. - * - * @retval ::NRF_SUCCESS Set successfully. - * - */ -typedef struct -{ - uint8_t auto_add_vs_enable : 1; /**< Set to 1 to enable (or 0 to disable) automatic insertion of discovered 128-bit UUIDs. */ -} ble_gattc_opt_uuid_disc_t; - -/**@brief Option structure for GATTC options. */ -typedef union -{ - ble_gattc_opt_uuid_disc_t uuid_disc; /**< Parameters for the UUID discovery option. */ -} ble_gattc_opt_t; - -/** @} */ - -/** @addtogroup BLE_GATTC_FUNCTIONS Functions - * @{ */ - -/**@brief Initiate or continue a GATT Primary Service Discovery procedure. - * - * @details This function initiates or resumes a Primary Service discovery procedure, starting from the supplied handle. - * If the last service has not been reached, this function must be called again with an updated start handle value to continue the search. - * See also @ref ble_gattc_opt_uuid_disc_t. - * - * @events - * @event{@ref BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GATTC_PRIM_SRVC_DISC_MSC} - * @endmscs - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] start_handle Handle to start searching from. - * @param[in] p_srvc_uuid Pointer to the service UUID to be found. If it is NULL, all primary services will be returned. - * - * @retval ::NRF_SUCCESS Successfully started or resumed the Primary Service Discovery procedure. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_BUSY Client procedure already in progress. - * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. - */ -SVCALL(SD_BLE_GATTC_PRIMARY_SERVICES_DISCOVER, uint32_t, sd_ble_gattc_primary_services_discover(uint16_t conn_handle, uint16_t start_handle, ble_uuid_t const *p_srvc_uuid)); - - -/**@brief Initiate or continue a GATT Relationship Discovery procedure. - * - * @details This function initiates or resumes the Find Included Services sub-procedure. If the last included service has not been reached, - * this must be called again with an updated handle range to continue the search. - * See also @ref ble_gattc_opt_uuid_disc_t. - * - * @events - * @event{@ref BLE_GATTC_EVT_REL_DISC_RSP} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GATTC_REL_DISC_MSC} - * @endmscs - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] p_handle_range A pointer to the range of handles of the Service to perform this procedure on. - * - * @retval ::NRF_SUCCESS Successfully started or resumed the Relationship Discovery procedure. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_BUSY Client procedure already in progress. - * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. - */ -SVCALL(SD_BLE_GATTC_RELATIONSHIPS_DISCOVER, uint32_t, sd_ble_gattc_relationships_discover(uint16_t conn_handle, ble_gattc_handle_range_t const *p_handle_range)); - - -/**@brief Initiate or continue a GATT Characteristic Discovery procedure. - * - * @details This function initiates or resumes a Characteristic discovery procedure. If the last Characteristic has not been reached, - * this must be called again with an updated handle range to continue the discovery. - * See also @ref ble_gattc_opt_uuid_disc_t. - * - * @events - * @event{@ref BLE_GATTC_EVT_CHAR_DISC_RSP} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GATTC_CHAR_DISC_MSC} - * @endmscs - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] p_handle_range A pointer to the range of handles of the Service to perform this procedure on. - * - * @retval ::NRF_SUCCESS Successfully started or resumed the Characteristic Discovery procedure. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_BUSY Client procedure already in progress. - * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. - */ -SVCALL(SD_BLE_GATTC_CHARACTERISTICS_DISCOVER, uint32_t, sd_ble_gattc_characteristics_discover(uint16_t conn_handle, ble_gattc_handle_range_t const *p_handle_range)); - - -/**@brief Initiate or continue a GATT Characteristic Descriptor Discovery procedure. - * - * @details This function initiates or resumes a Characteristic Descriptor discovery procedure. If the last Descriptor has not been reached, - * this must be called again with an updated handle range to continue the discovery. - * See also @ref ble_gattc_opt_uuid_disc_t. - * - * @events - * @event{@ref BLE_GATTC_EVT_DESC_DISC_RSP} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GATTC_DESC_DISC_MSC} - * @endmscs - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] p_handle_range A pointer to the range of handles of the Characteristic to perform this procedure on. - * - * @retval ::NRF_SUCCESS Successfully started or resumed the Descriptor Discovery procedure. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_BUSY Client procedure already in progress. - * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. - */ -SVCALL(SD_BLE_GATTC_DESCRIPTORS_DISCOVER, uint32_t, sd_ble_gattc_descriptors_discover(uint16_t conn_handle, ble_gattc_handle_range_t const *p_handle_range)); - - -/**@brief Initiate or continue a GATT Read using Characteristic UUID procedure. - * - * @details This function initiates or resumes a Read using Characteristic UUID procedure. If the last Characteristic has not been reached, - * this must be called again with an updated handle range to continue the discovery. - * - * @events - * @event{@ref BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GATTC_READ_UUID_MSC} - * @endmscs - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] p_uuid Pointer to a Characteristic value UUID to read. - * @param[in] p_handle_range A pointer to the range of handles to perform this procedure on. - * - * @retval ::NRF_SUCCESS Successfully started or resumed the Read using Characteristic UUID procedure. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_BUSY Client procedure already in progress. - * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. - */ -SVCALL(SD_BLE_GATTC_CHAR_VALUE_BY_UUID_READ, uint32_t, sd_ble_gattc_char_value_by_uuid_read(uint16_t conn_handle, ble_uuid_t const *p_uuid, ble_gattc_handle_range_t const *p_handle_range)); - - -/**@brief Initiate or continue a GATT Read (Long) Characteristic or Descriptor procedure. - * - * @details This function initiates or resumes a GATT Read (Long) Characteristic or Descriptor procedure. If the Characteristic or Descriptor - * to be read is longer than ATT_MTU - 1, this function must be called multiple times with appropriate offset to read the - * complete value. - * - * @events - * @event{@ref BLE_GATTC_EVT_READ_RSP} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GATTC_VALUE_READ_MSC} - * @endmscs - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] handle The handle of the attribute to be read. - * @param[in] offset Offset into the attribute value to be read. - * - * @retval ::NRF_SUCCESS Successfully started or resumed the Read (Long) procedure. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. - * @retval ::NRF_ERROR_BUSY Client procedure already in progress. - * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. - */ -SVCALL(SD_BLE_GATTC_READ, uint32_t, sd_ble_gattc_read(uint16_t conn_handle, uint16_t handle, uint16_t offset)); - - -/**@brief Initiate a GATT Read Multiple Characteristic Values procedure. - * - * @details This function initiates a GATT Read Multiple Characteristic Values procedure. - * - * @events - * @event{@ref BLE_GATTC_EVT_CHAR_VALS_READ_RSP} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GATTC_READ_MULT_MSC} - * @endmscs - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] p_handles A pointer to the handle(s) of the attribute(s) to be read. - * @param[in] handle_count The number of handles in p_handles. - * - * @retval ::NRF_SUCCESS Successfully started the Read Multiple Characteristic Values procedure. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_BUSY Client procedure already in progress. - * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. - */ -SVCALL(SD_BLE_GATTC_CHAR_VALUES_READ, uint32_t, sd_ble_gattc_char_values_read(uint16_t conn_handle, uint16_t const *p_handles, uint16_t handle_count)); - - -/**@brief Perform a Write (Characteristic Value or Descriptor, with or without response, signed or not, long or reliable) procedure. - * - * @details This function can perform all write procedures described in GATT. - * - * @note Only one write with response procedure can be ongoing per connection at a time. - * If the application tries to write with response while another write with response procedure is ongoing, - * the function call will return @ref NRF_ERROR_BUSY. - * A @ref BLE_GATTC_EVT_WRITE_RSP event will be issued as soon as the write response arrives from the peer. - * - * @note The number of Write without Response that can be queued is configured by @ref ble_gattc_conn_cfg_t::write_cmd_tx_queue_size - * When the queue is full, the function call will return @ref NRF_ERROR_RESOURCES. - * A @ref BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE event will be issued as soon as the transmission of the write without response is complete. - * - * @note The application can keep track of the available queue element count for writes without responses by following the procedure below: - * - Store initial queue element count in a variable. - * - Decrement the variable, which stores the currently available queue element count, by one when a call to this function returns @ref NRF_SUCCESS. - * - Increment the variable, which stores the current available queue element count, by the count variable in @ref BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE event. - * - * @events - * @event{@ref BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE, Write without response transmission complete.} - * @event{@ref BLE_GATTC_EVT_WRITE_RSP, Write response received from the peer.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GATTC_VALUE_WRITE_WITHOUT_RESP_MSC} - * @mmsc{@ref BLE_GATTC_VALUE_WRITE_MSC} - * @mmsc{@ref BLE_GATTC_VALUE_LONG_WRITE_MSC} - * @mmsc{@ref BLE_GATTC_VALUE_RELIABLE_WRITE_MSC} - * @endmscs - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] p_write_params A pointer to a write parameters structure. - * - * @retval ::NRF_SUCCESS Successfully started the Write procedure. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied. - * @retval ::NRF_ERROR_BUSY For write with response, procedure already in progress. Wait for a @ref BLE_GATTC_EVT_WRITE_RSP event and retry. - * @retval ::NRF_ERROR_RESOURCES Too many writes without responses queued. - * Wait for a @ref BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE event and retry. - * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. - */ -SVCALL(SD_BLE_GATTC_WRITE, uint32_t, sd_ble_gattc_write(uint16_t conn_handle, ble_gattc_write_params_t const *p_write_params)); - - -/**@brief Send a Handle Value Confirmation to the GATT Server. - * - * @mscs - * @mmsc{@ref BLE_GATTC_HVI_MSC} - * @endmscs - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] handle The handle of the attribute in the indication. - * - * @retval ::NRF_SUCCESS Successfully queued the Handle Value Confirmation for transmission. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State or no Indication pending to be confirmed. - * @retval ::BLE_ERROR_INVALID_ATTR_HANDLE Invalid attribute handle. - * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. - */ -SVCALL(SD_BLE_GATTC_HV_CONFIRM, uint32_t, sd_ble_gattc_hv_confirm(uint16_t conn_handle, uint16_t handle)); - -/**@brief Discovers information about a range of attributes on a GATT server. - * - * @events - * @event{@ref BLE_GATTC_EVT_ATTR_INFO_DISC_RSP, Generated when information about a range of attributes has been received.} - * @endevents - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] p_handle_range The range of handles to request information about. - * - * @retval ::NRF_SUCCESS Successfully started an attribute information discovery procedure. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid connection state - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_BUSY Client procedure already in progress. - * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. - */ -SVCALL(SD_BLE_GATTC_ATTR_INFO_DISCOVER, uint32_t, sd_ble_gattc_attr_info_discover(uint16_t conn_handle, ble_gattc_handle_range_t const * p_handle_range)); - -/**@brief Start an ATT_MTU exchange by sending an Exchange MTU Request to the server. - * - * @details The SoftDevice sets ATT_MTU to the minimum of: - * - The Client RX MTU value, and - * - The Server RX MTU value from @ref BLE_GATTC_EVT_EXCHANGE_MTU_RSP. - * - * However, the SoftDevice never sets ATT_MTU lower than @ref BLE_GATT_ATT_MTU_DEFAULT. - * - * @events - * @event{@ref BLE_GATTC_EVT_EXCHANGE_MTU_RSP} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GATTC_MTU_EXCHANGE} - * @endmscs - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] client_rx_mtu Client RX MTU size. - * - The minimum value is @ref BLE_GATT_ATT_MTU_DEFAULT. - * - The maximum value is @ref ble_gatt_conn_cfg_t::att_mtu in the connection configuration - used for this connection. - * - The value must be equal to Server RX MTU size given in @ref sd_ble_gatts_exchange_mtu_reply - * if an ATT_MTU exchange has already been performed in the other direction. - * - * @retval ::NRF_SUCCESS Successfully sent request to the server. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid connection state or an ATT_MTU exchange was already requested once. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid Client RX MTU size supplied. - * @retval ::NRF_ERROR_BUSY Client procedure already in progress. - * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. - */ -SVCALL(SD_BLE_GATTC_EXCHANGE_MTU_REQUEST, uint32_t, sd_ble_gattc_exchange_mtu_request(uint16_t conn_handle, uint16_t client_rx_mtu)); - -/**@brief Iterate through Handle-Value(s) list in @ref BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP event. - * - * @param[in] p_gattc_evt Pointer to event buffer containing @ref BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP event. - * @note If the buffer contains different event, behavior is undefined. - * @param[in,out] p_iter Iterator, points to @ref ble_gattc_handle_value_t structure that will be filled in with - * the next Handle-Value pair in each iteration. If the function returns other than - * @ref NRF_SUCCESS, it will not be changed. - * - To start iteration, initialize the structure to zero. - * - To continue, pass the value from previous iteration. - * - * \code - * ble_gattc_handle_value_t iter; - * memset(&iter, 0, sizeof(ble_gattc_handle_value_t)); - * while (sd_ble_gattc_evt_char_val_by_uuid_read_rsp_iter(&ble_evt.evt.gattc_evt, &iter) == NRF_SUCCESS) - * { - * app_handle = iter.handle; - * memcpy(app_value, iter.p_value, ble_evt.evt.gattc_evt.params.char_val_by_uuid_read_rsp.value_len); - * } - * \endcode - * - * @retval ::NRF_SUCCESS Successfully retrieved the next Handle-Value pair. - * @retval ::NRF_ERROR_NOT_FOUND No more Handle-Value pairs available in the list. - */ -__STATIC_INLINE uint32_t sd_ble_gattc_evt_char_val_by_uuid_read_rsp_iter(ble_gattc_evt_t *p_gattc_evt, ble_gattc_handle_value_t *p_iter); - -/** @} */ - -#ifndef SUPPRESS_INLINE_IMPLEMENTATION - -__STATIC_INLINE uint32_t sd_ble_gattc_evt_char_val_by_uuid_read_rsp_iter(ble_gattc_evt_t *p_gattc_evt, ble_gattc_handle_value_t *p_iter) -{ - uint32_t value_len = p_gattc_evt->params.char_val_by_uuid_read_rsp.value_len; - uint8_t *p_first = p_gattc_evt->params.char_val_by_uuid_read_rsp.handle_value; - uint8_t *p_next = p_iter->p_value ? p_iter->p_value + value_len : p_first; - - if ((p_next - p_first) / (sizeof(uint16_t) + value_len) < p_gattc_evt->params.char_val_by_uuid_read_rsp.count) - { - p_iter->handle = (uint16_t)p_next[1] << 8 | p_next[0]; - p_iter->p_value = p_next + sizeof(uint16_t); - return NRF_SUCCESS; - } - else - { - return NRF_ERROR_NOT_FOUND; - } -} - -#endif /* SUPPRESS_INLINE_IMPLEMENTATION */ - -#ifdef __cplusplus -} -#endif -#endif /* BLE_GATTC_H__ */ - -/** - @} -*/ diff --git a/lib/nrf52/s140_nrf52_7.3.0_API/include/ble_gatts.h b/lib/nrf52/s140_nrf52_7.3.0_API/include/ble_gatts.h deleted file mode 100755 index 06754f59..00000000 --- a/lib/nrf52/s140_nrf52_7.3.0_API/include/ble_gatts.h +++ /dev/null @@ -1,863 +0,0 @@ -/* - * Copyright (c) Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - @addtogroup BLE_GATTS Generic Attribute Profile (GATT) Server - @{ - @brief Definitions and prototypes for the GATTS interface. - */ - -#ifndef BLE_GATTS_H__ -#define BLE_GATTS_H__ - -#include -#include "nrf_svc.h" -#include "nrf_error.h" -#include "ble_hci.h" -#include "ble_ranges.h" -#include "ble_types.h" -#include "ble_err.h" -#include "ble_gatt.h" -#include "ble_gap.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** @addtogroup BLE_GATTS_ENUMERATIONS Enumerations - * @{ */ - -/** - * @brief GATTS API SVC numbers. - */ -enum BLE_GATTS_SVCS -{ - SD_BLE_GATTS_SERVICE_ADD = BLE_GATTS_SVC_BASE, /**< Add a service. */ - SD_BLE_GATTS_INCLUDE_ADD, /**< Add an included service. */ - SD_BLE_GATTS_CHARACTERISTIC_ADD, /**< Add a characteristic. */ - SD_BLE_GATTS_DESCRIPTOR_ADD, /**< Add a generic attribute. */ - SD_BLE_GATTS_VALUE_SET, /**< Set an attribute value. */ - SD_BLE_GATTS_VALUE_GET, /**< Get an attribute value. */ - SD_BLE_GATTS_HVX, /**< Handle Value Notification or Indication. */ - SD_BLE_GATTS_SERVICE_CHANGED, /**< Perform a Service Changed Indication to one or more peers. */ - SD_BLE_GATTS_RW_AUTHORIZE_REPLY, /**< Reply to an authorization request for a read or write operation on one or more attributes. */ - SD_BLE_GATTS_SYS_ATTR_SET, /**< Set the persistent system attributes for a connection. */ - SD_BLE_GATTS_SYS_ATTR_GET, /**< Retrieve the persistent system attributes. */ - SD_BLE_GATTS_INITIAL_USER_HANDLE_GET, /**< Retrieve the first valid user handle. */ - SD_BLE_GATTS_ATTR_GET, /**< Retrieve the UUID and/or metadata of an attribute. */ - SD_BLE_GATTS_EXCHANGE_MTU_REPLY /**< Reply to Exchange MTU Request. */ -}; - -/** - * @brief GATT Server Event IDs. - */ -enum BLE_GATTS_EVTS -{ - BLE_GATTS_EVT_WRITE = BLE_GATTS_EVT_BASE, /**< Write operation performed. \n See @ref ble_gatts_evt_write_t. */ - BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST, /**< Read/Write Authorization request. \n Reply with @ref sd_ble_gatts_rw_authorize_reply. \n See @ref ble_gatts_evt_rw_authorize_request_t. */ - BLE_GATTS_EVT_SYS_ATTR_MISSING, /**< A persistent system attribute access is pending. \n Respond with @ref sd_ble_gatts_sys_attr_set. \n See @ref ble_gatts_evt_sys_attr_missing_t. */ - BLE_GATTS_EVT_HVC, /**< Handle Value Confirmation. \n See @ref ble_gatts_evt_hvc_t. */ - BLE_GATTS_EVT_SC_CONFIRM, /**< Service Changed Confirmation. \n No additional event structure applies. */ - BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST, /**< Exchange MTU Request. \n Reply with @ref sd_ble_gatts_exchange_mtu_reply. \n See @ref ble_gatts_evt_exchange_mtu_request_t. */ - BLE_GATTS_EVT_TIMEOUT, /**< Peer failed to respond to an ATT request in time. \n See @ref ble_gatts_evt_timeout_t. */ - BLE_GATTS_EVT_HVN_TX_COMPLETE /**< Handle Value Notification transmission complete. \n See @ref ble_gatts_evt_hvn_tx_complete_t. */ -}; - -/**@brief GATTS Configuration IDs. - * - * IDs that uniquely identify a GATTS configuration. - */ -enum BLE_GATTS_CFGS -{ - BLE_GATTS_CFG_SERVICE_CHANGED = BLE_GATTS_CFG_BASE, /**< Service changed configuration. */ - BLE_GATTS_CFG_ATTR_TAB_SIZE, /**< Attribute table size configuration. */ - BLE_GATTS_CFG_SERVICE_CHANGED_CCCD_PERM, /**< Service changed CCCD permission configuration. */ -}; - -/** @} */ - -/** @addtogroup BLE_GATTS_DEFINES Defines - * @{ */ - -/** @defgroup BLE_ERRORS_GATTS SVC return values specific to GATTS - * @{ */ -#define BLE_ERROR_GATTS_INVALID_ATTR_TYPE (NRF_GATTS_ERR_BASE + 0x000) /**< Invalid attribute type. */ -#define BLE_ERROR_GATTS_SYS_ATTR_MISSING (NRF_GATTS_ERR_BASE + 0x001) /**< System Attributes missing. */ -/** @} */ - -/** @defgroup BLE_GATTS_ATTR_LENS_MAX Maximum attribute lengths - * @{ */ -#define BLE_GATTS_FIX_ATTR_LEN_MAX (510) /**< Maximum length for fixed length Attribute Values. */ -#define BLE_GATTS_VAR_ATTR_LEN_MAX (512) /**< Maximum length for variable length Attribute Values. */ -/** @} */ - -/** @defgroup BLE_GATTS_SRVC_TYPES GATT Server Service Types - * @{ */ -#define BLE_GATTS_SRVC_TYPE_INVALID 0x00 /**< Invalid Service Type. */ -#define BLE_GATTS_SRVC_TYPE_PRIMARY 0x01 /**< Primary Service. */ -#define BLE_GATTS_SRVC_TYPE_SECONDARY 0x02 /**< Secondary Type. */ -/** @} */ - - -/** @defgroup BLE_GATTS_ATTR_TYPES GATT Server Attribute Types - * @{ */ -#define BLE_GATTS_ATTR_TYPE_INVALID 0x00 /**< Invalid Attribute Type. */ -#define BLE_GATTS_ATTR_TYPE_PRIM_SRVC_DECL 0x01 /**< Primary Service Declaration. */ -#define BLE_GATTS_ATTR_TYPE_SEC_SRVC_DECL 0x02 /**< Secondary Service Declaration. */ -#define BLE_GATTS_ATTR_TYPE_INC_DECL 0x03 /**< Include Declaration. */ -#define BLE_GATTS_ATTR_TYPE_CHAR_DECL 0x04 /**< Characteristic Declaration. */ -#define BLE_GATTS_ATTR_TYPE_CHAR_VAL 0x05 /**< Characteristic Value. */ -#define BLE_GATTS_ATTR_TYPE_DESC 0x06 /**< Descriptor. */ -#define BLE_GATTS_ATTR_TYPE_OTHER 0x07 /**< Other, non-GATT specific type. */ -/** @} */ - - -/** @defgroup BLE_GATTS_OPS GATT Server Operations - * @{ */ -#define BLE_GATTS_OP_INVALID 0x00 /**< Invalid Operation. */ -#define BLE_GATTS_OP_WRITE_REQ 0x01 /**< Write Request. */ -#define BLE_GATTS_OP_WRITE_CMD 0x02 /**< Write Command. */ -#define BLE_GATTS_OP_SIGN_WRITE_CMD 0x03 /**< Signed Write Command. */ -#define BLE_GATTS_OP_PREP_WRITE_REQ 0x04 /**< Prepare Write Request. */ -#define BLE_GATTS_OP_EXEC_WRITE_REQ_CANCEL 0x05 /**< Execute Write Request: Cancel all prepared writes. */ -#define BLE_GATTS_OP_EXEC_WRITE_REQ_NOW 0x06 /**< Execute Write Request: Immediately execute all prepared writes. */ -/** @} */ - -/** @defgroup BLE_GATTS_VLOCS GATT Value Locations - * @{ */ -#define BLE_GATTS_VLOC_INVALID 0x00 /**< Invalid Location. */ -#define BLE_GATTS_VLOC_STACK 0x01 /**< Attribute Value is located in stack memory, no user memory is required. */ -#define BLE_GATTS_VLOC_USER 0x02 /**< Attribute Value is located in user memory. This requires the user to maintain a valid buffer through the lifetime of the attribute, since the stack - will read and write directly to the memory using the pointer provided in the APIs. There are no alignment requirements for the buffer. */ -/** @} */ - -/** @defgroup BLE_GATTS_AUTHORIZE_TYPES GATT Server Authorization Types - * @{ */ -#define BLE_GATTS_AUTHORIZE_TYPE_INVALID 0x00 /**< Invalid Type. */ -#define BLE_GATTS_AUTHORIZE_TYPE_READ 0x01 /**< Authorize a Read Operation. */ -#define BLE_GATTS_AUTHORIZE_TYPE_WRITE 0x02 /**< Authorize a Write Request Operation. */ -/** @} */ - -/** @defgroup BLE_GATTS_SYS_ATTR_FLAGS System Attribute Flags - * @{ */ -#define BLE_GATTS_SYS_ATTR_FLAG_SYS_SRVCS (1 << 0) /**< Restrict system attributes to system services only. */ -#define BLE_GATTS_SYS_ATTR_FLAG_USR_SRVCS (1 << 1) /**< Restrict system attributes to user services only. */ -/** @} */ - -/** @defgroup BLE_GATTS_SERVICE_CHANGED Service Changed Inclusion Values - * @{ - */ -#define BLE_GATTS_SERVICE_CHANGED_DEFAULT (1) /**< Default is to include the Service Changed characteristic in the Attribute Table. */ -/** @} */ - -/** @defgroup BLE_GATTS_ATTR_TAB_SIZE Attribute Table size - * @{ - */ -#define BLE_GATTS_ATTR_TAB_SIZE_MIN (248) /**< Minimum Attribute Table size */ -#define BLE_GATTS_ATTR_TAB_SIZE_DEFAULT (1408) /**< Default Attribute Table size. */ -/** @} */ - -/** @defgroup BLE_GATTS_DEFAULTS GATT Server defaults - * @{ - */ -#define BLE_GATTS_HVN_TX_QUEUE_SIZE_DEFAULT 1 /**< Default number of Handle Value Notifications that can be queued for transmission. */ -/** @} */ - -/** @} */ - -/** @addtogroup BLE_GATTS_STRUCTURES Structures - * @{ */ - -/** - * @brief BLE GATTS connection configuration parameters, set with @ref sd_ble_cfg_set. - */ -typedef struct -{ - uint8_t hvn_tx_queue_size; /**< Minimum guaranteed number of Handle Value Notifications that can be queued for transmission. - The default value is @ref BLE_GATTS_HVN_TX_QUEUE_SIZE_DEFAULT */ -} ble_gatts_conn_cfg_t; - -/**@brief Attribute metadata. */ -typedef struct -{ - ble_gap_conn_sec_mode_t read_perm; /**< Read permissions. */ - ble_gap_conn_sec_mode_t write_perm; /**< Write permissions. */ - uint8_t vlen :1; /**< Variable length attribute. */ - uint8_t vloc :2; /**< Value location, see @ref BLE_GATTS_VLOCS.*/ - uint8_t rd_auth :1; /**< Read authorization and value will be requested from the application on every read operation. */ - uint8_t wr_auth :1; /**< Write authorization will be requested from the application on every Write Request operation (but not Write Command). */ -} ble_gatts_attr_md_t; - - -/**@brief GATT Attribute. */ -typedef struct -{ - ble_uuid_t const *p_uuid; /**< Pointer to the attribute UUID. */ - ble_gatts_attr_md_t const *p_attr_md; /**< Pointer to the attribute metadata structure. */ - uint16_t init_len; /**< Initial attribute value length in bytes. */ - uint16_t init_offs; /**< Initial attribute value offset in bytes. If different from zero, the first init_offs bytes of the attribute value will be left uninitialized. */ - uint16_t max_len; /**< Maximum attribute value length in bytes, see @ref BLE_GATTS_ATTR_LENS_MAX for maximum values. */ - uint8_t *p_value; /**< Pointer to the attribute data. Please note that if the @ref BLE_GATTS_VLOC_USER value location is selected in the attribute metadata, this will have to point to a buffer - that remains valid through the lifetime of the attribute. This excludes usage of automatic variables that may go out of scope or any other temporary location. - The stack may access that memory directly without the application's knowledge. For writable characteristics, this value must not be a location in flash memory.*/ -} ble_gatts_attr_t; - -/**@brief GATT Attribute Value. */ -typedef struct -{ - uint16_t len; /**< Length in bytes to be written or read. Length in bytes written or read after successful return.*/ - uint16_t offset; /**< Attribute value offset. */ - uint8_t *p_value; /**< Pointer to where value is stored or will be stored. - If value is stored in user memory, only the attribute length is updated when p_value == NULL. - Set to NULL when reading to obtain the complete length of the attribute value */ -} ble_gatts_value_t; - - -/**@brief GATT Characteristic Presentation Format. */ -typedef struct -{ - uint8_t format; /**< Format of the value, see @ref BLE_GATT_CPF_FORMATS. */ - int8_t exponent; /**< Exponent for integer data types. */ - uint16_t unit; /**< Unit from Bluetooth Assigned Numbers. */ - uint8_t name_space; /**< Namespace from Bluetooth Assigned Numbers, see @ref BLE_GATT_CPF_NAMESPACES. */ - uint16_t desc; /**< Namespace description from Bluetooth Assigned Numbers, see @ref BLE_GATT_CPF_NAMESPACES. */ -} ble_gatts_char_pf_t; - - -/**@brief GATT Characteristic metadata. */ -typedef struct -{ - ble_gatt_char_props_t char_props; /**< Characteristic Properties. */ - ble_gatt_char_ext_props_t char_ext_props; /**< Characteristic Extended Properties. */ - uint8_t const *p_char_user_desc; /**< Pointer to a UTF-8 encoded string (non-NULL terminated), NULL if the descriptor is not required. */ - uint16_t char_user_desc_max_size; /**< The maximum size in bytes of the user description descriptor. */ - uint16_t char_user_desc_size; /**< The size of the user description, must be smaller or equal to char_user_desc_max_size. */ - ble_gatts_char_pf_t const *p_char_pf; /**< Pointer to a presentation format structure or NULL if the CPF descriptor is not required. */ - ble_gatts_attr_md_t const *p_user_desc_md; /**< Attribute metadata for the User Description descriptor, or NULL for default values. */ - ble_gatts_attr_md_t const *p_cccd_md; /**< Attribute metadata for the Client Characteristic Configuration Descriptor, or NULL for default values. */ - ble_gatts_attr_md_t const *p_sccd_md; /**< Attribute metadata for the Server Characteristic Configuration Descriptor, or NULL for default values. */ -} ble_gatts_char_md_t; - - -/**@brief GATT Characteristic Definition Handles. */ -typedef struct -{ - uint16_t value_handle; /**< Handle to the characteristic value. */ - uint16_t user_desc_handle; /**< Handle to the User Description descriptor, or @ref BLE_GATT_HANDLE_INVALID if not present. */ - uint16_t cccd_handle; /**< Handle to the Client Characteristic Configuration Descriptor, or @ref BLE_GATT_HANDLE_INVALID if not present. */ - uint16_t sccd_handle; /**< Handle to the Server Characteristic Configuration Descriptor, or @ref BLE_GATT_HANDLE_INVALID if not present. */ -} ble_gatts_char_handles_t; - - -/**@brief GATT HVx parameters. */ -typedef struct -{ - uint16_t handle; /**< Characteristic Value Handle. */ - uint8_t type; /**< Indication or Notification, see @ref BLE_GATT_HVX_TYPES. */ - uint16_t offset; /**< Offset within the attribute value. */ - uint16_t *p_len; /**< Length in bytes to be written, length in bytes written after return. */ - uint8_t const *p_data; /**< Actual data content, use NULL to use the current attribute value. */ -} ble_gatts_hvx_params_t; - -/**@brief GATT Authorization parameters. */ -typedef struct -{ - uint16_t gatt_status; /**< GATT status code for the operation, see @ref BLE_GATT_STATUS_CODES. */ - uint8_t update : 1; /**< If set, data supplied in p_data will be used to update the attribute value. - Please note that for @ref BLE_GATTS_AUTHORIZE_TYPE_WRITE operations this bit must always be set, - as the data to be written needs to be stored and later provided by the application. */ - uint16_t offset; /**< Offset of the attribute value being updated. */ - uint16_t len; /**< Length in bytes of the value in p_data pointer, see @ref BLE_GATTS_ATTR_LENS_MAX. */ - uint8_t const *p_data; /**< Pointer to new value used to update the attribute value. */ -} ble_gatts_authorize_params_t; - -/**@brief GATT Read or Write Authorize Reply parameters. */ -typedef struct -{ - uint8_t type; /**< Type of authorize operation, see @ref BLE_GATTS_AUTHORIZE_TYPES. */ - union { - ble_gatts_authorize_params_t read; /**< Read authorization parameters. */ - ble_gatts_authorize_params_t write; /**< Write authorization parameters. */ - } params; /**< Reply Parameters. */ -} ble_gatts_rw_authorize_reply_params_t; - -/**@brief Service Changed Inclusion configuration parameters, set with @ref sd_ble_cfg_set. */ -typedef struct -{ - uint8_t service_changed : 1; /**< If 1, include the Service Changed characteristic in the Attribute Table. Default is @ref BLE_GATTS_SERVICE_CHANGED_DEFAULT. */ -} ble_gatts_cfg_service_changed_t; - -/**@brief Service Changed CCCD permission configuration parameters, set with @ref sd_ble_cfg_set. - * - * @note @ref ble_gatts_attr_md_t::vlen is ignored and should be set to 0. - * - * @retval ::NRF_ERROR_INVALID_PARAM One or more of the following is true: - * - @ref ble_gatts_attr_md_t::write_perm is out of range. - * - @ref ble_gatts_attr_md_t::write_perm is @ref BLE_GAP_CONN_SEC_MODE_SET_NO_ACCESS, that is not allowed by the Bluetooth Specification. - * - wrong @ref ble_gatts_attr_md_t::read_perm, only @ref BLE_GAP_CONN_SEC_MODE_SET_OPEN is allowed by the Bluetooth Specification. - * - wrong @ref ble_gatts_attr_md_t::vloc, only @ref BLE_GATTS_VLOC_STACK is allowed. - * @retval ::NRF_ERROR_NOT_SUPPORTED Security Mode 2 not supported - */ -typedef struct -{ - ble_gatts_attr_md_t perm; /**< Permission for Service Changed CCCD. Default is @ref BLE_GAP_CONN_SEC_MODE_SET_OPEN, no authorization. */ -} ble_gatts_cfg_service_changed_cccd_perm_t; - -/**@brief Attribute table size configuration parameters, set with @ref sd_ble_cfg_set. - * - * @retval ::NRF_ERROR_INVALID_LENGTH One or more of the following is true: - * - The specified Attribute Table size is too small. - * The minimum acceptable size is defined by @ref BLE_GATTS_ATTR_TAB_SIZE_MIN. - * - The specified Attribute Table size is not a multiple of 4. - */ -typedef struct -{ - uint32_t attr_tab_size; /**< Attribute table size. Default is @ref BLE_GATTS_ATTR_TAB_SIZE_DEFAULT, minimum is @ref BLE_GATTS_ATTR_TAB_SIZE_MIN. */ -} ble_gatts_cfg_attr_tab_size_t; - -/**@brief Config structure for GATTS configurations. */ -typedef union -{ - ble_gatts_cfg_service_changed_t service_changed; /**< Include service changed characteristic, cfg_id is @ref BLE_GATTS_CFG_SERVICE_CHANGED. */ - ble_gatts_cfg_service_changed_cccd_perm_t service_changed_cccd_perm; /**< Service changed CCCD permission, cfg_id is @ref BLE_GATTS_CFG_SERVICE_CHANGED_CCCD_PERM. */ - ble_gatts_cfg_attr_tab_size_t attr_tab_size; /**< Attribute table size, cfg_id is @ref BLE_GATTS_CFG_ATTR_TAB_SIZE. */ -} ble_gatts_cfg_t; - - -/**@brief Event structure for @ref BLE_GATTS_EVT_WRITE. */ -typedef struct -{ - uint16_t handle; /**< Attribute Handle. */ - ble_uuid_t uuid; /**< Attribute UUID. */ - uint8_t op; /**< Type of write operation, see @ref BLE_GATTS_OPS. */ - uint8_t auth_required; /**< Writing operation deferred due to authorization requirement. Application may use @ref sd_ble_gatts_value_set to finalize the writing operation. */ - uint16_t offset; /**< Offset for the write operation. */ - uint16_t len; /**< Length of the received data. */ - uint8_t data[1]; /**< Received data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ -} ble_gatts_evt_write_t; - -/**@brief Event substructure for authorized read requests, see @ref ble_gatts_evt_rw_authorize_request_t. */ -typedef struct -{ - uint16_t handle; /**< Attribute Handle. */ - ble_uuid_t uuid; /**< Attribute UUID. */ - uint16_t offset; /**< Offset for the read operation. */ -} ble_gatts_evt_read_t; - -/**@brief Event structure for @ref BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST. */ -typedef struct -{ - uint8_t type; /**< Type of authorize operation, see @ref BLE_GATTS_AUTHORIZE_TYPES. */ - union { - ble_gatts_evt_read_t read; /**< Attribute Read Parameters. */ - ble_gatts_evt_write_t write; /**< Attribute Write Parameters. */ - } request; /**< Request Parameters. */ -} ble_gatts_evt_rw_authorize_request_t; - -/**@brief Event structure for @ref BLE_GATTS_EVT_SYS_ATTR_MISSING. */ -typedef struct -{ - uint8_t hint; /**< Hint (currently unused). */ -} ble_gatts_evt_sys_attr_missing_t; - - -/**@brief Event structure for @ref BLE_GATTS_EVT_HVC. */ -typedef struct -{ - uint16_t handle; /**< Attribute Handle. */ -} ble_gatts_evt_hvc_t; - -/**@brief Event structure for @ref BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST. */ -typedef struct -{ - uint16_t client_rx_mtu; /**< Client RX MTU size. */ -} ble_gatts_evt_exchange_mtu_request_t; - -/**@brief Event structure for @ref BLE_GATTS_EVT_TIMEOUT. */ -typedef struct -{ - uint8_t src; /**< Timeout source, see @ref BLE_GATT_TIMEOUT_SOURCES. */ -} ble_gatts_evt_timeout_t; - -/**@brief Event structure for @ref BLE_GATTS_EVT_HVN_TX_COMPLETE. */ -typedef struct -{ - uint8_t count; /**< Number of notification transmissions completed. */ -} ble_gatts_evt_hvn_tx_complete_t; - -/**@brief GATTS event structure. */ -typedef struct -{ - uint16_t conn_handle; /**< Connection Handle on which the event occurred. */ - union - { - ble_gatts_evt_write_t write; /**< Write Event Parameters. */ - ble_gatts_evt_rw_authorize_request_t authorize_request; /**< Read or Write Authorize Request Parameters. */ - ble_gatts_evt_sys_attr_missing_t sys_attr_missing; /**< System attributes missing. */ - ble_gatts_evt_hvc_t hvc; /**< Handle Value Confirmation Event Parameters. */ - ble_gatts_evt_exchange_mtu_request_t exchange_mtu_request; /**< Exchange MTU Request Event Parameters. */ - ble_gatts_evt_timeout_t timeout; /**< Timeout Event. */ - ble_gatts_evt_hvn_tx_complete_t hvn_tx_complete; /**< Handle Value Notification transmission complete Event Parameters. */ - } params; /**< Event Parameters. */ -} ble_gatts_evt_t; - -/** @} */ - -/** @addtogroup BLE_GATTS_FUNCTIONS Functions - * @{ */ - -/**@brief Add a service declaration to the Attribute Table. - * - * @note Secondary Services are only relevant in the context of the entity that references them, it is therefore forbidden to - * add a secondary service declaration that is not referenced by another service later in the Attribute Table. - * - * @mscs - * @mmsc{@ref BLE_GATTS_ATT_TABLE_POP_MSC} - * @endmscs - * - * @param[in] type Toggles between primary and secondary services, see @ref BLE_GATTS_SRVC_TYPES. - * @param[in] p_uuid Pointer to service UUID. - * @param[out] p_handle Pointer to a 16-bit word where the assigned handle will be stored. - * - * @retval ::NRF_SUCCESS Successfully added a service declaration. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, Vendor Specific UUIDs need to be present in the table. - * @retval ::NRF_ERROR_FORBIDDEN Forbidden value supplied, certain UUIDs are reserved for the stack. - * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation. - */ -SVCALL(SD_BLE_GATTS_SERVICE_ADD, uint32_t, sd_ble_gatts_service_add(uint8_t type, ble_uuid_t const *p_uuid, uint16_t *p_handle)); - - -/**@brief Add an include declaration to the Attribute Table. - * - * @note It is currently only possible to add an include declaration to the last added service (i.e. only sequential population is supported at this time). - * - * @note The included service must already be present in the Attribute Table prior to this call. - * - * @mscs - * @mmsc{@ref BLE_GATTS_ATT_TABLE_POP_MSC} - * @endmscs - * - * @param[in] service_handle Handle of the service where the included service is to be placed, if @ref BLE_GATT_HANDLE_INVALID is used, it will be placed sequentially. - * @param[in] inc_srvc_handle Handle of the included service. - * @param[out] p_include_handle Pointer to a 16-bit word where the assigned handle will be stored. - * - * @retval ::NRF_SUCCESS Successfully added an include declaration. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, handle values need to match previously added services. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation, a service context is required. - * @retval ::NRF_ERROR_NOT_SUPPORTED Feature is not supported, service_handle must be that of the last added service. - * @retval ::NRF_ERROR_FORBIDDEN Forbidden value supplied, self inclusions are not allowed. - * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation. - * @retval ::NRF_ERROR_NOT_FOUND Attribute not found. - */ -SVCALL(SD_BLE_GATTS_INCLUDE_ADD, uint32_t, sd_ble_gatts_include_add(uint16_t service_handle, uint16_t inc_srvc_handle, uint16_t *p_include_handle)); - - -/**@brief Add a characteristic declaration, a characteristic value declaration and optional characteristic descriptor declarations to the Attribute Table. - * - * @note It is currently only possible to add a characteristic to the last added service (i.e. only sequential population is supported at this time). - * - * @note Several restrictions apply to the parameters, such as matching permissions between the user description descriptor and the writable auxiliaries bits, - * readable (no security) and writable (selectable) CCCDs and SCCDs and valid presentation format values. - * - * @note If no metadata is provided for the optional descriptors, their permissions will be derived from the characteristic permissions. - * - * @mscs - * @mmsc{@ref BLE_GATTS_ATT_TABLE_POP_MSC} - * @endmscs - * - * @param[in] service_handle Handle of the service where the characteristic is to be placed, if @ref BLE_GATT_HANDLE_INVALID is used, it will be placed sequentially. - * @param[in] p_char_md Characteristic metadata. - * @param[in] p_attr_char_value Pointer to the attribute structure corresponding to the characteristic value. - * @param[out] p_handles Pointer to the structure where the assigned handles will be stored. - * - * @retval ::NRF_SUCCESS Successfully added a characteristic. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, service handle, Vendor Specific UUIDs, lengths, and permissions need to adhere to the constraints. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation, a service context is required. - * @retval ::NRF_ERROR_FORBIDDEN Forbidden value supplied, certain UUIDs are reserved for the stack. - * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation. - * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied, attribute lengths are restricted by @ref BLE_GATTS_ATTR_LENS_MAX. - */ -SVCALL(SD_BLE_GATTS_CHARACTERISTIC_ADD, uint32_t, sd_ble_gatts_characteristic_add(uint16_t service_handle, ble_gatts_char_md_t const *p_char_md, ble_gatts_attr_t const *p_attr_char_value, ble_gatts_char_handles_t *p_handles)); - - -/**@brief Add a descriptor to the Attribute Table. - * - * @note It is currently only possible to add a descriptor to the last added characteristic (i.e. only sequential population is supported at this time). - * - * @mscs - * @mmsc{@ref BLE_GATTS_ATT_TABLE_POP_MSC} - * @endmscs - * - * @param[in] char_handle Handle of the characteristic where the descriptor is to be placed, if @ref BLE_GATT_HANDLE_INVALID is used, it will be placed sequentially. - * @param[in] p_attr Pointer to the attribute structure. - * @param[out] p_handle Pointer to a 16-bit word where the assigned handle will be stored. - * - * @retval ::NRF_SUCCESS Successfully added a descriptor. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, characteristic handle, Vendor Specific UUIDs, lengths, and permissions need to adhere to the constraints. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation, a characteristic context is required. - * @retval ::NRF_ERROR_FORBIDDEN Forbidden value supplied, certain UUIDs are reserved for the stack. - * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation. - * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied, attribute lengths are restricted by @ref BLE_GATTS_ATTR_LENS_MAX. - */ -SVCALL(SD_BLE_GATTS_DESCRIPTOR_ADD, uint32_t, sd_ble_gatts_descriptor_add(uint16_t char_handle, ble_gatts_attr_t const *p_attr, uint16_t *p_handle)); - -/**@brief Set the value of a given attribute. - * - * @note Values other than system attributes can be set at any time, regardless of whether any active connections exist. - * - * @mscs - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_QUEUE_FULL_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_NOAUTH_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. Ignored if the value does not belong to a system attribute. - * @param[in] handle Attribute handle. - * @param[in,out] p_value Attribute value information. - * - * @retval ::NRF_SUCCESS Successfully set the value of the attribute. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_NOT_FOUND Attribute not found. - * @retval ::NRF_ERROR_FORBIDDEN Forbidden handle supplied, certain attributes are not modifiable by the application. - * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied, attribute lengths are restricted by @ref BLE_GATTS_ATTR_LENS_MAX. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied on a system attribute. - */ -SVCALL(SD_BLE_GATTS_VALUE_SET, uint32_t, sd_ble_gatts_value_set(uint16_t conn_handle, uint16_t handle, ble_gatts_value_t *p_value)); - -/**@brief Get the value of a given attribute. - * - * @note If the attribute value is longer than the size of the supplied buffer, - * @ref ble_gatts_value_t::len will return the total attribute value length (excluding offset), - * and not the number of bytes actually returned in @ref ble_gatts_value_t::p_value. - * The application may use this information to allocate a suitable buffer size. - * - * @note When retrieving system attribute values with this function, the connection handle - * may refer to an already disconnected connection. Refer to the documentation of - * @ref sd_ble_gatts_sys_attr_get for further information. - * - * @param[in] conn_handle Connection handle. Ignored if the value does not belong to a system attribute. - * @param[in] handle Attribute handle. - * @param[in,out] p_value Attribute value information. - * - * @retval ::NRF_SUCCESS Successfully retrieved the value of the attribute. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_NOT_FOUND Attribute not found. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid attribute offset supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied on a system attribute. - * @retval ::BLE_ERROR_GATTS_SYS_ATTR_MISSING System attributes missing, use @ref sd_ble_gatts_sys_attr_set to set them to a known value. - */ -SVCALL(SD_BLE_GATTS_VALUE_GET, uint32_t, sd_ble_gatts_value_get(uint16_t conn_handle, uint16_t handle, ble_gatts_value_t *p_value)); - -/**@brief Notify or Indicate an attribute value. - * - * @details This function checks for the relevant Client Characteristic Configuration descriptor value to verify that the relevant operation - * (notification or indication) has been enabled by the client. It is also able to update the attribute value before issuing the PDU, so that - * the application can atomically perform a value update and a server initiated transaction with a single API call. - * - * @note The local attribute value may be updated even if an outgoing packet is not sent to the peer due to an error during execution. - * The Attribute Table has been updated if one of the following error codes is returned: @ref NRF_ERROR_INVALID_STATE, @ref NRF_ERROR_BUSY, - * @ref NRF_ERROR_FORBIDDEN, @ref BLE_ERROR_GATTS_SYS_ATTR_MISSING and @ref NRF_ERROR_RESOURCES. - * The caller can check whether the value has been updated by looking at the contents of *(@ref ble_gatts_hvx_params_t::p_len). - * - * @note Only one indication procedure can be ongoing per connection at a time. - * If the application tries to indicate an attribute value while another indication procedure is ongoing, - * the function call will return @ref NRF_ERROR_BUSY. - * A @ref BLE_GATTS_EVT_HVC event will be issued as soon as the confirmation arrives from the peer. - * - * @note The number of Handle Value Notifications that can be queued is configured by @ref ble_gatts_conn_cfg_t::hvn_tx_queue_size - * When the queue is full, the function call will return @ref NRF_ERROR_RESOURCES. - * A @ref BLE_GATTS_EVT_HVN_TX_COMPLETE event will be issued as soon as the transmission of the notification is complete. - * - * @note The application can keep track of the available queue element count for notifications by following the procedure below: - * - Store initial queue element count in a variable. - * - Decrement the variable, which stores the currently available queue element count, by one when a call to this function returns @ref NRF_SUCCESS. - * - Increment the variable, which stores the current available queue element count, by the count variable in @ref BLE_GATTS_EVT_HVN_TX_COMPLETE event. - * - * @events - * @event{@ref BLE_GATTS_EVT_HVN_TX_COMPLETE, Notification transmission complete.} - * @event{@ref BLE_GATTS_EVT_HVC, Confirmation received from the peer.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GATTS_HVX_SYS_ATTRS_MISSING_MSC} - * @mmsc{@ref BLE_GATTS_HVN_MSC} - * @mmsc{@ref BLE_GATTS_HVI_MSC} - * @mmsc{@ref BLE_GATTS_HVX_DISABLED_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in,out] p_hvx_params Pointer to an HVx parameters structure. If @ref ble_gatts_hvx_params_t::p_data - * contains a non-NULL pointer the attribute value will be updated with the contents - * pointed by it before sending the notification or indication. If the attribute value - * is updated, @ref ble_gatts_hvx_params_t::p_len is updated by the SoftDevice to - * contain the number of actual bytes written, else it will be set to 0. - * - * @retval ::NRF_SUCCESS Successfully queued a notification or indication for transmission, and optionally updated the attribute value. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE One or more of the following is true: - * - Invalid Connection State - * - Notifications and/or indications not enabled in the CCCD - * - An ATT_MTU exchange is ongoing - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::BLE_ERROR_INVALID_ATTR_HANDLE Invalid attribute handle(s) supplied. Only attributes added directly by the application are available to notify and indicate. - * @retval ::BLE_ERROR_GATTS_INVALID_ATTR_TYPE Invalid attribute type(s) supplied, only characteristic values may be notified and indicated. - * @retval ::NRF_ERROR_NOT_FOUND Attribute not found. - * @retval ::NRF_ERROR_FORBIDDEN The connection's current security level is lower than the one required by the write permissions of the CCCD associated with this characteristic. - * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied. - * @retval ::NRF_ERROR_BUSY For @ref BLE_GATT_HVX_INDICATION Procedure already in progress. Wait for a @ref BLE_GATTS_EVT_HVC event and retry. - * @retval ::BLE_ERROR_GATTS_SYS_ATTR_MISSING System attributes missing, use @ref sd_ble_gatts_sys_attr_set to set them to a known value. - * @retval ::NRF_ERROR_RESOURCES Too many notifications queued. - * Wait for a @ref BLE_GATTS_EVT_HVN_TX_COMPLETE event and retry. - * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. - */ -SVCALL(SD_BLE_GATTS_HVX, uint32_t, sd_ble_gatts_hvx(uint16_t conn_handle, ble_gatts_hvx_params_t const *p_hvx_params)); - -/**@brief Indicate the Service Changed attribute value. - * - * @details This call will send a Handle Value Indication to one or more peers connected to inform them that the Attribute - * Table layout has changed. As soon as the peer has confirmed the indication, a @ref BLE_GATTS_EVT_SC_CONFIRM event will - * be issued. - * - * @note Some of the restrictions and limitations that apply to @ref sd_ble_gatts_hvx also apply here. - * - * @events - * @event{@ref BLE_GATTS_EVT_SC_CONFIRM, Confirmation of attribute table change received from peer.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GATTS_SC_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] start_handle Start of affected attribute handle range. - * @param[in] end_handle End of affected attribute handle range. - * - * @retval ::NRF_SUCCESS Successfully queued the Service Changed indication for transmission. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_NOT_SUPPORTED Service Changed not enabled at initialization. See @ref - * sd_ble_cfg_set and @ref ble_gatts_cfg_service_changed_t. - * @retval ::NRF_ERROR_INVALID_STATE One or more of the following is true: - * - Invalid Connection State - * - Notifications and/or indications not enabled in the CCCD - * - An ATT_MTU exchange is ongoing - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::BLE_ERROR_INVALID_ATTR_HANDLE Invalid attribute handle(s) supplied, handles must be in the range populated by the application. - * @retval ::NRF_ERROR_BUSY Procedure already in progress. - * @retval ::BLE_ERROR_GATTS_SYS_ATTR_MISSING System attributes missing, use @ref sd_ble_gatts_sys_attr_set to set them to a known value. - * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. - */ -SVCALL(SD_BLE_GATTS_SERVICE_CHANGED, uint32_t, sd_ble_gatts_service_changed(uint16_t conn_handle, uint16_t start_handle, uint16_t end_handle)); - -/**@brief Respond to a Read/Write authorization request. - * - * @note This call should only be used as a response to a @ref BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST event issued to the application. - * - * @mscs - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_AUTH_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_BUF_AUTH_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_NOAUTH_MSC} - * @mmsc{@ref BLE_GATTS_READ_REQ_AUTH_MSC} - * @mmsc{@ref BLE_GATTS_WRITE_REQ_AUTH_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_QUEUE_FULL_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_PEER_CANCEL_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] p_rw_authorize_reply_params Pointer to a structure with the attribute provided by the application. - * - * @note @ref ble_gatts_authorize_params_t::p_data is ignored when this function is used to respond - * to a @ref BLE_GATTS_AUTHORIZE_TYPE_READ event if @ref ble_gatts_authorize_params_t::update - * is set to 0. - * - * @retval ::NRF_SUCCESS Successfully queued a response to the peer, and in the case of a write operation, Attribute Table updated. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State or no authorization request pending. - * @retval ::NRF_ERROR_INVALID_PARAM Authorization op invalid, - * handle supplied does not match requested handle, - * or invalid data to be written provided by the application. - * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. - */ -SVCALL(SD_BLE_GATTS_RW_AUTHORIZE_REPLY, uint32_t, sd_ble_gatts_rw_authorize_reply(uint16_t conn_handle, ble_gatts_rw_authorize_reply_params_t const *p_rw_authorize_reply_params)); - - -/**@brief Update persistent system attribute information. - * - * @details Supply information about persistent system attributes to the stack, - * previously obtained using @ref sd_ble_gatts_sys_attr_get. - * This call is only allowed for active connections, and is usually - * made immediately after a connection is established with an known bonded device, - * often as a response to a @ref BLE_GATTS_EVT_SYS_ATTR_MISSING. - * - * p_sysattrs may point directly to the application's stored copy of the system attributes - * obtained using @ref sd_ble_gatts_sys_attr_get. - * If the pointer is NULL, the system attribute info is initialized, assuming that - * the application does not have any previously saved system attribute data for this device. - * - * @note The state of persistent system attributes is reset upon connection establishment and then remembered for its duration. - * - * @note If this call returns with an error code different from @ref NRF_SUCCESS, the storage of persistent system attributes may have been completed only partially. - * This means that the state of the attribute table is undefined, and the application should either provide a new set of attributes using this same call or - * reset the SoftDevice to return to a known state. - * - * @note When the @ref BLE_GATTS_SYS_ATTR_FLAG_SYS_SRVCS is used with this function, only the system attributes included in system services will be modified. - * @note When the @ref BLE_GATTS_SYS_ATTR_FLAG_USR_SRVCS is used with this function, only the system attributes included in user services will be modified. - * - * @mscs - * @mmsc{@ref BLE_GATTS_HVX_SYS_ATTRS_MISSING_MSC} - * @mmsc{@ref BLE_GATTS_SYS_ATTRS_UNK_PEER_MSC} - * @mmsc{@ref BLE_GATTS_SYS_ATTRS_BONDED_PEER_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] p_sys_attr_data Pointer to a saved copy of system attributes supplied to the stack, or NULL. - * @param[in] len Size of data pointed by p_sys_attr_data, in octets. - * @param[in] flags Optional additional flags, see @ref BLE_GATTS_SYS_ATTR_FLAGS - * - * @retval ::NRF_SUCCESS Successfully set the system attribute information. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid flags supplied. - * @retval ::NRF_ERROR_INVALID_DATA Invalid data supplied, the data should be exactly the same as retrieved with @ref sd_ble_gatts_sys_attr_get. - * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation. - */ -SVCALL(SD_BLE_GATTS_SYS_ATTR_SET, uint32_t, sd_ble_gatts_sys_attr_set(uint16_t conn_handle, uint8_t const *p_sys_attr_data, uint16_t len, uint32_t flags)); - - -/**@brief Retrieve persistent system attribute information from the stack. - * - * @details This call is used to retrieve information about values to be stored persistently by the application - * during the lifetime of a connection or after it has been terminated. When a new connection is established with the same bonded device, - * the system attribute information retrieved with this function should be restored using using @ref sd_ble_gatts_sys_attr_set. - * If retrieved after disconnection, the data should be read before a new connection established. The connection handle for - * the previous, now disconnected, connection will remain valid until a new one is created to allow this API call to refer to it. - * Connection handles belonging to active connections can be used as well, but care should be taken since the system attributes - * may be written to at any time by the peer during a connection's lifetime. - * - * @note When the @ref BLE_GATTS_SYS_ATTR_FLAG_SYS_SRVCS is used with this function, only the system attributes included in system services will be returned. - * @note When the @ref BLE_GATTS_SYS_ATTR_FLAG_USR_SRVCS is used with this function, only the system attributes included in user services will be returned. - * - * @mscs - * @mmsc{@ref BLE_GATTS_SYS_ATTRS_BONDED_PEER_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle of the recently terminated connection. - * @param[out] p_sys_attr_data Pointer to a buffer where updated information about system attributes will be filled in. The format of the data is described - * in @ref BLE_GATTS_SYS_ATTRS_FORMAT. NULL can be provided to obtain the length of the data. - * @param[in,out] p_len Size of application buffer if p_sys_attr_data is not NULL. Unconditionally updated to actual length of system attribute data. - * @param[in] flags Optional additional flags, see @ref BLE_GATTS_SYS_ATTR_FLAGS - * - * @retval ::NRF_SUCCESS Successfully retrieved the system attribute information. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid flags supplied. - * @retval ::NRF_ERROR_DATA_SIZE The system attribute information did not fit into the provided buffer. - * @retval ::NRF_ERROR_NOT_FOUND No system attributes found. - */ -SVCALL(SD_BLE_GATTS_SYS_ATTR_GET, uint32_t, sd_ble_gatts_sys_attr_get(uint16_t conn_handle, uint8_t *p_sys_attr_data, uint16_t *p_len, uint32_t flags)); - - -/**@brief Retrieve the first valid user attribute handle. - * - * @param[out] p_handle Pointer to an integer where the handle will be stored. - * - * @retval ::NRF_SUCCESS Successfully retrieved the handle. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - */ -SVCALL(SD_BLE_GATTS_INITIAL_USER_HANDLE_GET, uint32_t, sd_ble_gatts_initial_user_handle_get(uint16_t *p_handle)); - -/**@brief Retrieve the attribute UUID and/or metadata. - * - * @param[in] handle Attribute handle - * @param[out] p_uuid UUID of the attribute. Use NULL to omit this field. - * @param[out] p_md Metadata of the attribute. Use NULL to omit this field. - * - * @retval ::NRF_SUCCESS Successfully retrieved the attribute metadata, - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameters supplied. Returned when both @c p_uuid and @c p_md are NULL. - * @retval ::NRF_ERROR_NOT_FOUND Attribute was not found. - */ -SVCALL(SD_BLE_GATTS_ATTR_GET, uint32_t, sd_ble_gatts_attr_get(uint16_t handle, ble_uuid_t * p_uuid, ble_gatts_attr_md_t * p_md)); - -/**@brief Reply to an ATT_MTU exchange request by sending an Exchange MTU Response to the client. - * - * @details This function is only used to reply to a @ref BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST event. - * - * @details The SoftDevice sets ATT_MTU to the minimum of: - * - The Client RX MTU value from @ref BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST, and - * - The Server RX MTU value. - * - * However, the SoftDevice never sets ATT_MTU lower than @ref BLE_GATT_ATT_MTU_DEFAULT. - * - * @mscs - * @mmsc{@ref BLE_GATTS_MTU_EXCHANGE} - * @endmscs - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] server_rx_mtu Server RX MTU size. - * - The minimum value is @ref BLE_GATT_ATT_MTU_DEFAULT. - * - The maximum value is @ref ble_gatt_conn_cfg_t::att_mtu in the connection configuration - * used for this connection. - * - The value must be equal to Client RX MTU size given in @ref sd_ble_gattc_exchange_mtu_request - * if an ATT_MTU exchange has already been performed in the other direction. - * - * @retval ::NRF_SUCCESS Successfully sent response to the client. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State or no ATT_MTU exchange request pending. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid Server RX MTU size supplied. - * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. - */ -SVCALL(SD_BLE_GATTS_EXCHANGE_MTU_REPLY, uint32_t, sd_ble_gatts_exchange_mtu_reply(uint16_t conn_handle, uint16_t server_rx_mtu)); -/** @} */ - -#ifdef __cplusplus -} -#endif -#endif // BLE_GATTS_H__ - -/** - @} -*/ diff --git a/lib/nrf52/s140_nrf52_7.3.0_API/include/ble_hci.h b/lib/nrf52/s140_nrf52_7.3.0_API/include/ble_hci.h deleted file mode 100755 index ef3cbd14..00000000 --- a/lib/nrf52/s140_nrf52_7.3.0_API/include/ble_hci.h +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright (c) Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - @addtogroup BLE_COMMON - @{ -*/ - - -#ifndef BLE_HCI_H__ -#define BLE_HCI_H__ -#ifdef __cplusplus -extern "C" { -#endif - -/** @defgroup BLE_HCI_STATUS_CODES Bluetooth status codes - * @{ */ - -#define BLE_HCI_STATUS_CODE_SUCCESS 0x00 /**< Success. */ -#define BLE_HCI_STATUS_CODE_UNKNOWN_BTLE_COMMAND 0x01 /**< Unknown BLE Command. */ -#define BLE_HCI_STATUS_CODE_UNKNOWN_CONNECTION_IDENTIFIER 0x02 /**< Unknown Connection Identifier. */ -/*0x03 Hardware Failure -0x04 Page Timeout -*/ -#define BLE_HCI_AUTHENTICATION_FAILURE 0x05 /**< Authentication Failure. */ -#define BLE_HCI_STATUS_CODE_PIN_OR_KEY_MISSING 0x06 /**< Pin or Key missing. */ -#define BLE_HCI_MEMORY_CAPACITY_EXCEEDED 0x07 /**< Memory Capacity Exceeded. */ -#define BLE_HCI_CONNECTION_TIMEOUT 0x08 /**< Connection Timeout. */ -/*0x09 Connection Limit Exceeded -0x0A Synchronous Connection Limit To A Device Exceeded -0x0B ACL Connection Already Exists*/ -#define BLE_HCI_STATUS_CODE_COMMAND_DISALLOWED 0x0C /**< Command Disallowed. */ -/*0x0D Connection Rejected due to Limited Resources -0x0E Connection Rejected Due To Security Reasons -0x0F Connection Rejected due to Unacceptable BD_ADDR -0x10 Connection Accept Timeout Exceeded -0x11 Unsupported Feature or Parameter Value*/ -#define BLE_HCI_STATUS_CODE_INVALID_BTLE_COMMAND_PARAMETERS 0x12 /**< Invalid BLE Command Parameters. */ -#define BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION 0x13 /**< Remote User Terminated Connection. */ -#define BLE_HCI_REMOTE_DEV_TERMINATION_DUE_TO_LOW_RESOURCES 0x14 /**< Remote Device Terminated Connection due to low resources.*/ -#define BLE_HCI_REMOTE_DEV_TERMINATION_DUE_TO_POWER_OFF 0x15 /**< Remote Device Terminated Connection due to power off. */ -#define BLE_HCI_LOCAL_HOST_TERMINATED_CONNECTION 0x16 /**< Local Host Terminated Connection. */ -/* -0x17 Repeated Attempts -0x18 Pairing Not Allowed -0x19 Unknown LMP PDU -*/ -#define BLE_HCI_UNSUPPORTED_REMOTE_FEATURE 0x1A /**< Unsupported Remote Feature. */ -/* -0x1B SCO Offset Rejected -0x1C SCO Interval Rejected -0x1D SCO Air Mode Rejected*/ -#define BLE_HCI_STATUS_CODE_INVALID_LMP_PARAMETERS 0x1E /**< Invalid LMP Parameters. */ -#define BLE_HCI_STATUS_CODE_UNSPECIFIED_ERROR 0x1F /**< Unspecified Error. */ -/*0x20 Unsupported LMP Parameter Value -0x21 Role Change Not Allowed -*/ -#define BLE_HCI_STATUS_CODE_LMP_RESPONSE_TIMEOUT 0x22 /**< LMP Response Timeout. */ -#define BLE_HCI_STATUS_CODE_LMP_ERROR_TRANSACTION_COLLISION 0x23 /**< LMP Error Transaction Collision/LL Procedure Collision. */ -#define BLE_HCI_STATUS_CODE_LMP_PDU_NOT_ALLOWED 0x24 /**< LMP PDU Not Allowed. */ -/*0x25 Encryption Mode Not Acceptable -0x26 Link Key Can Not be Changed -0x27 Requested QoS Not Supported -*/ -#define BLE_HCI_INSTANT_PASSED 0x28 /**< Instant Passed. */ -#define BLE_HCI_PAIRING_WITH_UNIT_KEY_UNSUPPORTED 0x29 /**< Pairing with Unit Key Unsupported. */ -#define BLE_HCI_DIFFERENT_TRANSACTION_COLLISION 0x2A /**< Different Transaction Collision. */ -/* -0x2B Reserved -0x2C QoS Unacceptable Parameter -0x2D QoS Rejected -0x2E Channel Classification Not Supported -0x2F Insufficient Security -*/ -#define BLE_HCI_PARAMETER_OUT_OF_MANDATORY_RANGE 0x30 /**< Parameter Out Of Mandatory Range. */ -/* -0x31 Reserved -0x32 Role Switch Pending -0x33 Reserved -0x34 Reserved Slot Violation -0x35 Role Switch Failed -0x36 Extended Inquiry Response Too Large -0x37 Secure Simple Pairing Not Supported By Host. -0x38 Host Busy - Pairing -0x39 Connection Rejected due to No Suitable Channel Found*/ -#define BLE_HCI_CONTROLLER_BUSY 0x3A /**< Controller Busy. */ -#define BLE_HCI_CONN_INTERVAL_UNACCEPTABLE 0x3B /**< Connection Interval Unacceptable. */ -#define BLE_HCI_DIRECTED_ADVERTISER_TIMEOUT 0x3C /**< Directed Advertisement Timeout. */ -#define BLE_HCI_CONN_TERMINATED_DUE_TO_MIC_FAILURE 0x3D /**< Connection Terminated due to MIC Failure. */ -#define BLE_HCI_CONN_FAILED_TO_BE_ESTABLISHED 0x3E /**< Connection Failed to be Established. */ - -/** @} */ - - -#ifdef __cplusplus -} -#endif -#endif // BLE_HCI_H__ - -/** @} */ diff --git a/lib/nrf52/s140_nrf52_7.3.0_API/include/ble_l2cap.h b/lib/nrf52/s140_nrf52_7.3.0_API/include/ble_l2cap.h deleted file mode 100755 index e3e049de..00000000 --- a/lib/nrf52/s140_nrf52_7.3.0_API/include/ble_l2cap.h +++ /dev/null @@ -1,507 +0,0 @@ -/* - * Copyright (c) Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - @addtogroup BLE_L2CAP Logical Link Control and Adaptation Protocol (L2CAP) - @{ - @brief Definitions and prototypes for the L2CAP interface. - */ - -#ifndef BLE_L2CAP_H__ -#define BLE_L2CAP_H__ - -#include -#include "nrf_svc.h" -#include "nrf_error.h" -#include "ble_ranges.h" -#include "ble_types.h" -#include "ble_err.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/**@addtogroup BLE_L2CAP_TERMINOLOGY Terminology - * @{ - * @details - * - * L2CAP SDU - * - A data unit that the application can send/receive to/from a peer. - * - * L2CAP PDU - * - A data unit that is exchanged between local and remote L2CAP entities. - * It consists of L2CAP protocol control information and payload fields. - * The payload field can contain an L2CAP SDU or a part of an L2CAP SDU. - * - * L2CAP MTU - * - The maximum length of an L2CAP SDU. - * - * L2CAP MPS - * - The maximum length of an L2CAP PDU payload field. - * - * Credits - * - A value indicating the number of L2CAP PDUs that the receiver of the credit can send to the peer. - * @} */ - -/**@addtogroup BLE_L2CAP_ENUMERATIONS Enumerations - * @{ */ - -/**@brief L2CAP API SVC numbers. */ -enum BLE_L2CAP_SVCS -{ - SD_BLE_L2CAP_CH_SETUP = BLE_L2CAP_SVC_BASE + 0, /**< Set up an L2CAP channel. */ - SD_BLE_L2CAP_CH_RELEASE = BLE_L2CAP_SVC_BASE + 1, /**< Release an L2CAP channel. */ - SD_BLE_L2CAP_CH_RX = BLE_L2CAP_SVC_BASE + 2, /**< Receive an SDU on an L2CAP channel. */ - SD_BLE_L2CAP_CH_TX = BLE_L2CAP_SVC_BASE + 3, /**< Transmit an SDU on an L2CAP channel. */ - SD_BLE_L2CAP_CH_FLOW_CONTROL = BLE_L2CAP_SVC_BASE + 4, /**< Advanced SDU reception flow control. */ -}; - -/**@brief L2CAP Event IDs. */ -enum BLE_L2CAP_EVTS -{ - BLE_L2CAP_EVT_CH_SETUP_REQUEST = BLE_L2CAP_EVT_BASE + 0, /**< L2CAP Channel Setup Request event. - \n Reply with @ref sd_ble_l2cap_ch_setup. - \n See @ref ble_l2cap_evt_ch_setup_request_t. */ - BLE_L2CAP_EVT_CH_SETUP_REFUSED = BLE_L2CAP_EVT_BASE + 1, /**< L2CAP Channel Setup Refused event. - \n See @ref ble_l2cap_evt_ch_setup_refused_t. */ - BLE_L2CAP_EVT_CH_SETUP = BLE_L2CAP_EVT_BASE + 2, /**< L2CAP Channel Setup Completed event. - \n See @ref ble_l2cap_evt_ch_setup_t. */ - BLE_L2CAP_EVT_CH_RELEASED = BLE_L2CAP_EVT_BASE + 3, /**< L2CAP Channel Released event. - \n No additional event structure applies. */ - BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED = BLE_L2CAP_EVT_BASE + 4, /**< L2CAP Channel SDU data buffer released event. - \n See @ref ble_l2cap_evt_ch_sdu_buf_released_t. */ - BLE_L2CAP_EVT_CH_CREDIT = BLE_L2CAP_EVT_BASE + 5, /**< L2CAP Channel Credit received. - \n See @ref ble_l2cap_evt_ch_credit_t. */ - BLE_L2CAP_EVT_CH_RX = BLE_L2CAP_EVT_BASE + 6, /**< L2CAP Channel SDU received. - \n See @ref ble_l2cap_evt_ch_rx_t. */ - BLE_L2CAP_EVT_CH_TX = BLE_L2CAP_EVT_BASE + 7, /**< L2CAP Channel SDU transmitted. - \n See @ref ble_l2cap_evt_ch_tx_t. */ -}; - -/** @} */ - -/**@addtogroup BLE_L2CAP_DEFINES Defines - * @{ */ - -/**@brief Maximum number of L2CAP channels per connection. */ -#define BLE_L2CAP_CH_COUNT_MAX (64) - -/**@brief Minimum L2CAP MTU, in bytes. */ -#define BLE_L2CAP_MTU_MIN (23) - -/**@brief Minimum L2CAP MPS, in bytes. */ -#define BLE_L2CAP_MPS_MIN (23) - -/**@brief Invalid CID. */ -#define BLE_L2CAP_CID_INVALID (0x0000) - -/**@brief Default number of credits for @ref sd_ble_l2cap_ch_flow_control. */ -#define BLE_L2CAP_CREDITS_DEFAULT (1) - -/**@defgroup BLE_L2CAP_CH_SETUP_REFUSED_SRCS L2CAP channel setup refused sources - * @{ */ -#define BLE_L2CAP_CH_SETUP_REFUSED_SRC_LOCAL (0x01) /**< Local. */ -#define BLE_L2CAP_CH_SETUP_REFUSED_SRC_REMOTE (0x02) /**< Remote. */ - /** @} */ - - /** @defgroup BLE_L2CAP_CH_STATUS_CODES L2CAP channel status codes - * @{ */ -#define BLE_L2CAP_CH_STATUS_CODE_SUCCESS (0x0000) /**< Success. */ -#define BLE_L2CAP_CH_STATUS_CODE_LE_PSM_NOT_SUPPORTED (0x0002) /**< LE_PSM not supported. */ -#define BLE_L2CAP_CH_STATUS_CODE_NO_RESOURCES (0x0004) /**< No resources available. */ -#define BLE_L2CAP_CH_STATUS_CODE_INSUFF_AUTHENTICATION (0x0005) /**< Insufficient authentication. */ -#define BLE_L2CAP_CH_STATUS_CODE_INSUFF_AUTHORIZATION (0x0006) /**< Insufficient authorization. */ -#define BLE_L2CAP_CH_STATUS_CODE_INSUFF_ENC_KEY_SIZE (0x0007) /**< Insufficient encryption key size. */ -#define BLE_L2CAP_CH_STATUS_CODE_INSUFF_ENC (0x0008) /**< Insufficient encryption. */ -#define BLE_L2CAP_CH_STATUS_CODE_INVALID_SCID (0x0009) /**< Invalid Source CID. */ -#define BLE_L2CAP_CH_STATUS_CODE_SCID_ALLOCATED (0x000A) /**< Source CID already allocated. */ -#define BLE_L2CAP_CH_STATUS_CODE_UNACCEPTABLE_PARAMS (0x000B) /**< Unacceptable parameters. */ -#define BLE_L2CAP_CH_STATUS_CODE_NOT_UNDERSTOOD (0x8000) /**< Command Reject received instead of LE Credit Based Connection Response. */ -#define BLE_L2CAP_CH_STATUS_CODE_TIMEOUT (0xC000) /**< Operation timed out. */ -/** @} */ - -/** @} */ - -/**@addtogroup BLE_L2CAP_STRUCTURES Structures - * @{ */ - -/** - * @brief BLE L2CAP connection configuration parameters, set with @ref sd_ble_cfg_set. - * - * @note These parameters are set per connection, so all L2CAP channels created on this connection - * will have the same parameters. - * - * @retval ::NRF_ERROR_INVALID_PARAM One or more of the following is true: - * - rx_mps is smaller than @ref BLE_L2CAP_MPS_MIN. - * - tx_mps is smaller than @ref BLE_L2CAP_MPS_MIN. - * - ch_count is greater than @ref BLE_L2CAP_CH_COUNT_MAX. - * @retval ::NRF_ERROR_NO_MEM rx_mps or tx_mps is set too high. - */ -typedef struct -{ - uint16_t rx_mps; /**< The maximum L2CAP PDU payload size, in bytes, that L2CAP shall - be able to receive on L2CAP channels on connections with this - configuration. The minimum value is @ref BLE_L2CAP_MPS_MIN. */ - uint16_t tx_mps; /**< The maximum L2CAP PDU payload size, in bytes, that L2CAP shall - be able to transmit on L2CAP channels on connections with this - configuration. The minimum value is @ref BLE_L2CAP_MPS_MIN. */ - uint8_t rx_queue_size; /**< Number of SDU data buffers that can be queued for reception per - L2CAP channel. The minimum value is one. */ - uint8_t tx_queue_size; /**< Number of SDU data buffers that can be queued for transmission - per L2CAP channel. The minimum value is one. */ - uint8_t ch_count; /**< Number of L2CAP channels the application can create per connection - with this configuration. The default value is zero, the maximum - value is @ref BLE_L2CAP_CH_COUNT_MAX. - @note if this parameter is set to zero, all other parameters in - @ref ble_l2cap_conn_cfg_t are ignored. */ -} ble_l2cap_conn_cfg_t; - -/**@brief L2CAP channel RX parameters. */ -typedef struct -{ - uint16_t rx_mtu; /**< The maximum L2CAP SDU size, in bytes, that L2CAP shall be able to - receive on this L2CAP channel. - - Must be equal to or greater than @ref BLE_L2CAP_MTU_MIN. */ - uint16_t rx_mps; /**< The maximum L2CAP PDU payload size, in bytes, that L2CAP shall be - able to receive on this L2CAP channel. - - Must be equal to or greater than @ref BLE_L2CAP_MPS_MIN. - - Must be equal to or less than @ref ble_l2cap_conn_cfg_t::rx_mps. */ - ble_data_t sdu_buf; /**< SDU data buffer for reception. - - If @ref ble_data_t::p_data is non-NULL, initial credits are - issued to the peer. - - If @ref ble_data_t::p_data is NULL, no initial credits are - issued to the peer. */ -} ble_l2cap_ch_rx_params_t; - -/**@brief L2CAP channel setup parameters. */ -typedef struct -{ - ble_l2cap_ch_rx_params_t rx_params; /**< L2CAP channel RX parameters. */ - uint16_t le_psm; /**< LE Protocol/Service Multiplexer. Used when requesting - setup of an L2CAP channel, ignored otherwise. */ - uint16_t status; /**< Status code, see @ref BLE_L2CAP_CH_STATUS_CODES. - Used when replying to a setup request of an L2CAP - channel, ignored otherwise. */ -} ble_l2cap_ch_setup_params_t; - -/**@brief L2CAP channel TX parameters. */ -typedef struct -{ - uint16_t tx_mtu; /**< The maximum L2CAP SDU size, in bytes, that L2CAP is able to - transmit on this L2CAP channel. */ - uint16_t peer_mps; /**< The maximum L2CAP PDU payload size, in bytes, that the peer is - able to receive on this L2CAP channel. */ - uint16_t tx_mps; /**< The maximum L2CAP PDU payload size, in bytes, that L2CAP is able - to transmit on this L2CAP channel. This is effective tx_mps, - selected by the SoftDevice as - MIN( @ref ble_l2cap_ch_tx_params_t::peer_mps, @ref ble_l2cap_conn_cfg_t::tx_mps ) */ - uint16_t credits; /**< Initial credits given by the peer. */ -} ble_l2cap_ch_tx_params_t; - -/**@brief L2CAP Channel Setup Request event. */ -typedef struct -{ - ble_l2cap_ch_tx_params_t tx_params; /**< L2CAP channel TX parameters. */ - uint16_t le_psm; /**< LE Protocol/Service Multiplexer. */ -} ble_l2cap_evt_ch_setup_request_t; - -/**@brief L2CAP Channel Setup Refused event. */ -typedef struct -{ - uint8_t source; /**< Source, see @ref BLE_L2CAP_CH_SETUP_REFUSED_SRCS */ - uint16_t status; /**< Status code, see @ref BLE_L2CAP_CH_STATUS_CODES */ -} ble_l2cap_evt_ch_setup_refused_t; - -/**@brief L2CAP Channel Setup Completed event. */ -typedef struct -{ - ble_l2cap_ch_tx_params_t tx_params; /**< L2CAP channel TX parameters. */ -} ble_l2cap_evt_ch_setup_t; - -/**@brief L2CAP Channel SDU Data Buffer Released event. */ -typedef struct -{ - ble_data_t sdu_buf; /**< Returned reception or transmission SDU data buffer. The SoftDevice - returns SDU data buffers supplied by the application, which have - not yet been returned previously via a @ref BLE_L2CAP_EVT_CH_RX or - @ref BLE_L2CAP_EVT_CH_TX event. */ -} ble_l2cap_evt_ch_sdu_buf_released_t; - -/**@brief L2CAP Channel Credit received event. */ -typedef struct -{ - uint16_t credits; /**< Additional credits given by the peer. */ -} ble_l2cap_evt_ch_credit_t; - -/**@brief L2CAP Channel received SDU event. */ -typedef struct -{ - uint16_t sdu_len; /**< Total SDU length, in bytes. */ - ble_data_t sdu_buf; /**< SDU data buffer. - @note If there is not enough space in the buffer - (sdu_buf.len < sdu_len) then the rest of the SDU will be - silently discarded by the SoftDevice. */ -} ble_l2cap_evt_ch_rx_t; - -/**@brief L2CAP Channel transmitted SDU event. */ -typedef struct -{ - ble_data_t sdu_buf; /**< SDU data buffer. */ -} ble_l2cap_evt_ch_tx_t; - -/**@brief L2CAP event structure. */ -typedef struct -{ - uint16_t conn_handle; /**< Connection Handle on which the event occured. */ - uint16_t local_cid; /**< Local Channel ID of the L2CAP channel, or - @ref BLE_L2CAP_CID_INVALID if not present. */ - union - { - ble_l2cap_evt_ch_setup_request_t ch_setup_request; /**< L2CAP Channel Setup Request Event Parameters. */ - ble_l2cap_evt_ch_setup_refused_t ch_setup_refused; /**< L2CAP Channel Setup Refused Event Parameters. */ - ble_l2cap_evt_ch_setup_t ch_setup; /**< L2CAP Channel Setup Completed Event Parameters. */ - ble_l2cap_evt_ch_sdu_buf_released_t ch_sdu_buf_released;/**< L2CAP Channel SDU Data Buffer Released Event Parameters. */ - ble_l2cap_evt_ch_credit_t credit; /**< L2CAP Channel Credit Received Event Parameters. */ - ble_l2cap_evt_ch_rx_t rx; /**< L2CAP Channel SDU Received Event Parameters. */ - ble_l2cap_evt_ch_tx_t tx; /**< L2CAP Channel SDU Transmitted Event Parameters. */ - } params; /**< Event Parameters. */ -} ble_l2cap_evt_t; - -/** @} */ - -/**@addtogroup BLE_L2CAP_FUNCTIONS Functions - * @{ */ - -/**@brief Set up an L2CAP channel. - * - * @details This function is used to: - * - Request setup of an L2CAP channel: sends an LE Credit Based Connection Request packet to a peer. - * - Reply to a setup request of an L2CAP channel (if called in response to a - * @ref BLE_L2CAP_EVT_CH_SETUP_REQUEST event): sends an LE Credit Based Connection - * Response packet to a peer. - * - * @note A call to this function will require the application to keep the SDU data buffer alive - * until the SDU data buffer is returned in @ref BLE_L2CAP_EVT_CH_RX or - * @ref BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED event. - * - * @events - * @event{@ref BLE_L2CAP_EVT_CH_SETUP, Setup successful.} - * @event{@ref BLE_L2CAP_EVT_CH_SETUP_REFUSED, Setup failed.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_L2CAP_CH_SETUP_MSC} - * @endmscs - * - * @param[in] conn_handle Connection Handle. - * @param[in,out] p_local_cid Pointer to a uint16_t containing Local Channel ID of the L2CAP channel: - * - As input: @ref BLE_L2CAP_CID_INVALID when requesting setup of an L2CAP - * channel or local_cid provided in the @ref BLE_L2CAP_EVT_CH_SETUP_REQUEST - * event when replying to a setup request of an L2CAP channel. - * - As output: local_cid for this channel. - * @param[in] p_params L2CAP channel parameters. - * - * @retval ::NRF_SUCCESS Successfully queued request or response for transmission. - * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_INVALID_LENGTH Supplied higher rx_mps than has been configured on this link. - * @retval ::NRF_ERROR_INVALID_STATE Invalid State to perform operation (L2CAP channel already set up). - * @retval ::NRF_ERROR_NOT_FOUND CID not found. - * @retval ::NRF_ERROR_RESOURCES The limit has been reached for available L2CAP channels, - * see @ref ble_l2cap_conn_cfg_t::ch_count. - */ -SVCALL(SD_BLE_L2CAP_CH_SETUP, uint32_t, sd_ble_l2cap_ch_setup(uint16_t conn_handle, uint16_t *p_local_cid, ble_l2cap_ch_setup_params_t const *p_params)); - -/**@brief Release an L2CAP channel. - * - * @details This sends a Disconnection Request packet to a peer. - * - * @events - * @event{@ref BLE_L2CAP_EVT_CH_RELEASED, Release complete.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_L2CAP_CH_RELEASE_MSC} - * @endmscs - * - * @param[in] conn_handle Connection Handle. - * @param[in] local_cid Local Channel ID of the L2CAP channel. - * - * @retval ::NRF_SUCCESS Successfully queued request for transmission. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid State to perform operation (Setup or release is - * in progress for the L2CAP channel). - * @retval ::NRF_ERROR_NOT_FOUND CID not found. - */ -SVCALL(SD_BLE_L2CAP_CH_RELEASE, uint32_t, sd_ble_l2cap_ch_release(uint16_t conn_handle, uint16_t local_cid)); - -/**@brief Receive an SDU on an L2CAP channel. - * - * @details This may issue additional credits to the peer using an LE Flow Control Credit packet. - * - * @note A call to this function will require the application to keep the memory pointed by - * @ref ble_data_t::p_data alive until the SDU data buffer is returned in @ref BLE_L2CAP_EVT_CH_RX - * or @ref BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED event. - * - * @note The SoftDevice can queue up to @ref ble_l2cap_conn_cfg_t::rx_queue_size SDU data buffers - * for reception per L2CAP channel. - * - * @events - * @event{@ref BLE_L2CAP_EVT_CH_RX, The SDU is received.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_L2CAP_CH_RX_MSC} - * @endmscs - * - * @param[in] conn_handle Connection Handle. - * @param[in] local_cid Local Channel ID of the L2CAP channel. - * @param[in] p_sdu_buf Pointer to the SDU data buffer. - * - * @retval ::NRF_SUCCESS Buffer accepted. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid State to perform operation (Setup or release is - * in progress for an L2CAP channel). - * @retval ::NRF_ERROR_NOT_FOUND CID not found. - * @retval ::NRF_ERROR_RESOURCES Too many SDU data buffers supplied. Wait for a - * @ref BLE_L2CAP_EVT_CH_RX event and retry. - */ -SVCALL(SD_BLE_L2CAP_CH_RX, uint32_t, sd_ble_l2cap_ch_rx(uint16_t conn_handle, uint16_t local_cid, ble_data_t const *p_sdu_buf)); - -/**@brief Transmit an SDU on an L2CAP channel. - * - * @note A call to this function will require the application to keep the memory pointed by - * @ref ble_data_t::p_data alive until the SDU data buffer is returned in @ref BLE_L2CAP_EVT_CH_TX - * or @ref BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED event. - * - * @note The SoftDevice can queue up to @ref ble_l2cap_conn_cfg_t::tx_queue_size SDUs for - * transmission per L2CAP channel. - * - * @note The application can keep track of the available credits for transmission by following - * the procedure below: - * - Store initial credits given by the peer in a variable. - * (Initial credits are provided in a @ref BLE_L2CAP_EVT_CH_SETUP event.) - * - Decrement the variable, which stores the currently available credits, by - * ceiling((@ref ble_data_t::len + 2) / tx_mps) when a call to this function returns - * @ref NRF_SUCCESS. (tx_mps is provided in a @ref BLE_L2CAP_EVT_CH_SETUP event.) - * - Increment the variable, which stores the currently available credits, by additional - * credits given by the peer in a @ref BLE_L2CAP_EVT_CH_CREDIT event. - * - * @events - * @event{@ref BLE_L2CAP_EVT_CH_TX, The SDU is transmitted.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_L2CAP_CH_TX_MSC} - * @endmscs - * - * @param[in] conn_handle Connection Handle. - * @param[in] local_cid Local Channel ID of the L2CAP channel. - * @param[in] p_sdu_buf Pointer to the SDU data buffer. - * - * @retval ::NRF_SUCCESS Successfully queued L2CAP SDU for transmission. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid State to perform operation (Setup or release is - * in progress for the L2CAP channel). - * @retval ::NRF_ERROR_NOT_FOUND CID not found. - * @retval ::NRF_ERROR_DATA_SIZE Invalid SDU length supplied, must not be more than - * @ref ble_l2cap_ch_tx_params_t::tx_mtu provided in - * @ref BLE_L2CAP_EVT_CH_SETUP event. - * @retval ::NRF_ERROR_RESOURCES Too many SDUs queued for transmission. Wait for a - * @ref BLE_L2CAP_EVT_CH_TX event and retry. - */ -SVCALL(SD_BLE_L2CAP_CH_TX, uint32_t, sd_ble_l2cap_ch_tx(uint16_t conn_handle, uint16_t local_cid, ble_data_t const *p_sdu_buf)); - -/**@brief Advanced SDU reception flow control. - * - * @details Adjust the way the SoftDevice issues credits to the peer. - * This may issue additional credits to the peer using an LE Flow Control Credit packet. - * - * @mscs - * @mmsc{@ref BLE_L2CAP_CH_FLOW_CONTROL_MSC} - * @endmscs - * - * @param[in] conn_handle Connection Handle. - * @param[in] local_cid Local Channel ID of the L2CAP channel or @ref BLE_L2CAP_CID_INVALID to set - * the value that will be used for newly created channels. - * @param[in] credits Number of credits that the SoftDevice will make sure the peer has every - * time it starts using a new reception buffer. - * - @ref BLE_L2CAP_CREDITS_DEFAULT is the default value the SoftDevice will - * use if this function is not called. - * - If set to zero, the SoftDevice will stop issuing credits for new reception - * buffers the application provides or has provided. SDU reception that is - * currently ongoing will be allowed to complete. - * @param[out] p_credits NULL or pointer to a uint16_t. If a valid pointer is provided, it will be - * written by the SoftDevice with the number of credits that is or will be - * available to the peer. If the value written by the SoftDevice is 0 when - * credits parameter was set to 0, the peer will not be able to send more - * data until more credits are provided by calling this function again with - * credits > 0. This parameter is ignored when local_cid is set to - * @ref BLE_L2CAP_CID_INVALID. - * - * @note Application should take care when setting number of credits higher than default value. In - * this case the application must make sure that the SoftDevice always has reception buffers - * available (see @ref sd_ble_l2cap_ch_rx) for that channel. If the SoftDevice does not have - * such buffers available, packets may be NACKed on the Link Layer and all Bluetooth traffic - * on the connection handle may be stalled until the SoftDevice again has an available - * reception buffer. This applies even if the application has used this call to set the - * credits back to default, or zero. - * - * @retval ::NRF_SUCCESS Flow control parameters accepted. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid State to perform operation (Setup or release is - * in progress for an L2CAP channel). - * @retval ::NRF_ERROR_NOT_FOUND CID not found. - */ -SVCALL(SD_BLE_L2CAP_CH_FLOW_CONTROL, uint32_t, sd_ble_l2cap_ch_flow_control(uint16_t conn_handle, uint16_t local_cid, uint16_t credits, uint16_t *p_credits)); - -/** @} */ - -#ifdef __cplusplus -} -#endif -#endif // BLE_L2CAP_H__ - -/** - @} -*/ diff --git a/lib/nrf52/s140_nrf52_7.3.0_API/include/ble_ranges.h b/lib/nrf52/s140_nrf52_7.3.0_API/include/ble_ranges.h deleted file mode 100755 index 522a7570..00000000 --- a/lib/nrf52/s140_nrf52_7.3.0_API/include/ble_ranges.h +++ /dev/null @@ -1,156 +0,0 @@ -/* - * Copyright (c) Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - @addtogroup BLE_COMMON - @{ - @defgroup ble_ranges Module specific SVC, event and option number subranges - @{ - - @brief Definition of SVC, event and option number subranges for each API module. - - @note - SVCs, event and option numbers are split into subranges for each API module. - Each module receives its entire allocated range of SVC calls, whether implemented or not, - but return BLE_ERROR_NOT_SUPPORTED for unimplemented or undefined calls in its range. - - Note that the symbols BLE__SVC_LAST is the end of the allocated SVC range, - rather than the last SVC function call actually defined and implemented. - - Specific SVC, event and option values are defined in each module's ble_.h file, - which defines names of each individual SVC code based on the range start value. -*/ - -#ifndef BLE_RANGES_H__ -#define BLE_RANGES_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#define BLE_SVC_BASE 0x60 /**< Common BLE SVC base. */ -#define BLE_SVC_LAST 0x6B /**< Common BLE SVC last. */ - -#define BLE_GAP_SVC_BASE 0x6C /**< GAP BLE SVC base. */ -#define BLE_GAP_SVC_LAST 0x9A /**< GAP BLE SVC last. */ - -#define BLE_GATTC_SVC_BASE 0x9B /**< GATTC BLE SVC base. */ -#define BLE_GATTC_SVC_LAST 0xA7 /**< GATTC BLE SVC last. */ - -#define BLE_GATTS_SVC_BASE 0xA8 /**< GATTS BLE SVC base. */ -#define BLE_GATTS_SVC_LAST 0xB7 /**< GATTS BLE SVC last. */ - -#define BLE_L2CAP_SVC_BASE 0xB8 /**< L2CAP BLE SVC base. */ -#define BLE_L2CAP_SVC_LAST 0xBF /**< L2CAP BLE SVC last. */ - - -#define BLE_EVT_INVALID 0x00 /**< Invalid BLE Event. */ - -#define BLE_EVT_BASE 0x01 /**< Common BLE Event base. */ -#define BLE_EVT_LAST 0x0F /**< Common BLE Event last. */ - -#define BLE_GAP_EVT_BASE 0x10 /**< GAP BLE Event base. */ -#define BLE_GAP_EVT_LAST 0x2F /**< GAP BLE Event last. */ - -#define BLE_GATTC_EVT_BASE 0x30 /**< GATTC BLE Event base. */ -#define BLE_GATTC_EVT_LAST 0x4F /**< GATTC BLE Event last. */ - -#define BLE_GATTS_EVT_BASE 0x50 /**< GATTS BLE Event base. */ -#define BLE_GATTS_EVT_LAST 0x6F /**< GATTS BLE Event last. */ - -#define BLE_L2CAP_EVT_BASE 0x70 /**< L2CAP BLE Event base. */ -#define BLE_L2CAP_EVT_LAST 0x8F /**< L2CAP BLE Event last. */ - - -#define BLE_OPT_INVALID 0x00 /**< Invalid BLE Option. */ - -#define BLE_OPT_BASE 0x01 /**< Common BLE Option base. */ -#define BLE_OPT_LAST 0x1F /**< Common BLE Option last. */ - -#define BLE_GAP_OPT_BASE 0x20 /**< GAP BLE Option base. */ -#define BLE_GAP_OPT_LAST 0x3F /**< GAP BLE Option last. */ - -#define BLE_GATT_OPT_BASE 0x40 /**< GATT BLE Option base. */ -#define BLE_GATT_OPT_LAST 0x5F /**< GATT BLE Option last. */ - -#define BLE_GATTC_OPT_BASE 0x60 /**< GATTC BLE Option base. */ -#define BLE_GATTC_OPT_LAST 0x7F /**< GATTC BLE Option last. */ - -#define BLE_GATTS_OPT_BASE 0x80 /**< GATTS BLE Option base. */ -#define BLE_GATTS_OPT_LAST 0x9F /**< GATTS BLE Option last. */ - -#define BLE_L2CAP_OPT_BASE 0xA0 /**< L2CAP BLE Option base. */ -#define BLE_L2CAP_OPT_LAST 0xBF /**< L2CAP BLE Option last. */ - - -#define BLE_CFG_INVALID 0x00 /**< Invalid BLE configuration. */ - -#define BLE_CFG_BASE 0x01 /**< Common BLE configuration base. */ -#define BLE_CFG_LAST 0x1F /**< Common BLE configuration last. */ - -#define BLE_CONN_CFG_BASE 0x20 /**< BLE connection configuration base. */ -#define BLE_CONN_CFG_LAST 0x3F /**< BLE connection configuration last. */ - -#define BLE_GAP_CFG_BASE 0x40 /**< GAP BLE configuration base. */ -#define BLE_GAP_CFG_LAST 0x5F /**< GAP BLE configuration last. */ - -#define BLE_GATT_CFG_BASE 0x60 /**< GATT BLE configuration base. */ -#define BLE_GATT_CFG_LAST 0x7F /**< GATT BLE configuration last. */ - -#define BLE_GATTC_CFG_BASE 0x80 /**< GATTC BLE configuration base. */ -#define BLE_GATTC_CFG_LAST 0x9F /**< GATTC BLE configuration last. */ - -#define BLE_GATTS_CFG_BASE 0xA0 /**< GATTS BLE configuration base. */ -#define BLE_GATTS_CFG_LAST 0xBF /**< GATTS BLE configuration last. */ - -#define BLE_L2CAP_CFG_BASE 0xC0 /**< L2CAP BLE configuration base. */ -#define BLE_L2CAP_CFG_LAST 0xDF /**< L2CAP BLE configuration last. */ - - - - - -#ifdef __cplusplus -} -#endif -#endif /* BLE_RANGES_H__ */ - -/** - @} - @} -*/ diff --git a/lib/nrf52/s140_nrf52_7.3.0_API/include/ble_types.h b/lib/nrf52/s140_nrf52_7.3.0_API/include/ble_types.h deleted file mode 100755 index bf7925e2..00000000 --- a/lib/nrf52/s140_nrf52_7.3.0_API/include/ble_types.h +++ /dev/null @@ -1,215 +0,0 @@ -/* - * Copyright (c) Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - @addtogroup BLE_COMMON - @{ - @defgroup ble_types Common types and macro definitions - @{ - - @brief Common types and macro definitions for the BLE SoftDevice. - */ - -#ifndef BLE_TYPES_H__ -#define BLE_TYPES_H__ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** @addtogroup BLE_TYPES_DEFINES Defines - * @{ */ - -/** @defgroup BLE_CONN_HANDLES BLE Connection Handles - * @{ */ -#define BLE_CONN_HANDLE_INVALID 0xFFFF /**< Invalid Connection Handle. */ -#define BLE_CONN_HANDLE_ALL 0xFFFE /**< Applies to all Connection Handles. */ -/** @} */ - - -/** @defgroup BLE_UUID_VALUES Assigned Values for BLE UUIDs - * @{ */ -/* Generic UUIDs, applicable to all services */ -#define BLE_UUID_UNKNOWN 0x0000 /**< Reserved UUID. */ -#define BLE_UUID_SERVICE_PRIMARY 0x2800 /**< Primary Service. */ -#define BLE_UUID_SERVICE_SECONDARY 0x2801 /**< Secondary Service. */ -#define BLE_UUID_SERVICE_INCLUDE 0x2802 /**< Include. */ -#define BLE_UUID_CHARACTERISTIC 0x2803 /**< Characteristic. */ -#define BLE_UUID_DESCRIPTOR_CHAR_EXT_PROP 0x2900 /**< Characteristic Extended Properties Descriptor. */ -#define BLE_UUID_DESCRIPTOR_CHAR_USER_DESC 0x2901 /**< Characteristic User Description Descriptor. */ -#define BLE_UUID_DESCRIPTOR_CLIENT_CHAR_CONFIG 0x2902 /**< Client Characteristic Configuration Descriptor. */ -#define BLE_UUID_DESCRIPTOR_SERVER_CHAR_CONFIG 0x2903 /**< Server Characteristic Configuration Descriptor. */ -#define BLE_UUID_DESCRIPTOR_CHAR_PRESENTATION_FORMAT 0x2904 /**< Characteristic Presentation Format Descriptor. */ -#define BLE_UUID_DESCRIPTOR_CHAR_AGGREGATE_FORMAT 0x2905 /**< Characteristic Aggregate Format Descriptor. */ -/* GATT specific UUIDs */ -#define BLE_UUID_GATT 0x1801 /**< Generic Attribute Profile. */ -#define BLE_UUID_GATT_CHARACTERISTIC_SERVICE_CHANGED 0x2A05 /**< Service Changed Characteristic. */ -/* GAP specific UUIDs */ -#define BLE_UUID_GAP 0x1800 /**< Generic Access Profile. */ -#define BLE_UUID_GAP_CHARACTERISTIC_DEVICE_NAME 0x2A00 /**< Device Name Characteristic. */ -#define BLE_UUID_GAP_CHARACTERISTIC_APPEARANCE 0x2A01 /**< Appearance Characteristic. */ -#define BLE_UUID_GAP_CHARACTERISTIC_RECONN_ADDR 0x2A03 /**< Reconnection Address Characteristic. */ -#define BLE_UUID_GAP_CHARACTERISTIC_PPCP 0x2A04 /**< Peripheral Preferred Connection Parameters Characteristic. */ -#define BLE_UUID_GAP_CHARACTERISTIC_CAR 0x2AA6 /**< Central Address Resolution Characteristic. */ -#define BLE_UUID_GAP_CHARACTERISTIC_RPA_ONLY 0x2AC9 /**< Resolvable Private Address Only Characteristic. */ -/** @} */ - - -/** @defgroup BLE_UUID_TYPES Types of UUID - * @{ */ -#define BLE_UUID_TYPE_UNKNOWN 0x00 /**< Invalid UUID type. */ -#define BLE_UUID_TYPE_BLE 0x01 /**< Bluetooth SIG UUID (16-bit). */ -#define BLE_UUID_TYPE_VENDOR_BEGIN 0x02 /**< Vendor UUID types start at this index (128-bit). */ -/** @} */ - - -/** @defgroup BLE_APPEARANCES Bluetooth Appearance values - * @note Retrieved from http://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.gap.appearance.xml - * @{ */ -#define BLE_APPEARANCE_UNKNOWN 0 /**< Unknown. */ -#define BLE_APPEARANCE_GENERIC_PHONE 64 /**< Generic Phone. */ -#define BLE_APPEARANCE_GENERIC_COMPUTER 128 /**< Generic Computer. */ -#define BLE_APPEARANCE_GENERIC_WATCH 192 /**< Generic Watch. */ -#define BLE_APPEARANCE_WATCH_SPORTS_WATCH 193 /**< Watch: Sports Watch. */ -#define BLE_APPEARANCE_GENERIC_CLOCK 256 /**< Generic Clock. */ -#define BLE_APPEARANCE_GENERIC_DISPLAY 320 /**< Generic Display. */ -#define BLE_APPEARANCE_GENERIC_REMOTE_CONTROL 384 /**< Generic Remote Control. */ -#define BLE_APPEARANCE_GENERIC_EYE_GLASSES 448 /**< Generic Eye-glasses. */ -#define BLE_APPEARANCE_GENERIC_TAG 512 /**< Generic Tag. */ -#define BLE_APPEARANCE_GENERIC_KEYRING 576 /**< Generic Keyring. */ -#define BLE_APPEARANCE_GENERIC_MEDIA_PLAYER 640 /**< Generic Media Player. */ -#define BLE_APPEARANCE_GENERIC_BARCODE_SCANNER 704 /**< Generic Barcode Scanner. */ -#define BLE_APPEARANCE_GENERIC_THERMOMETER 768 /**< Generic Thermometer. */ -#define BLE_APPEARANCE_THERMOMETER_EAR 769 /**< Thermometer: Ear. */ -#define BLE_APPEARANCE_GENERIC_HEART_RATE_SENSOR 832 /**< Generic Heart rate Sensor. */ -#define BLE_APPEARANCE_HEART_RATE_SENSOR_HEART_RATE_BELT 833 /**< Heart Rate Sensor: Heart Rate Belt. */ -#define BLE_APPEARANCE_GENERIC_BLOOD_PRESSURE 896 /**< Generic Blood Pressure. */ -#define BLE_APPEARANCE_BLOOD_PRESSURE_ARM 897 /**< Blood Pressure: Arm. */ -#define BLE_APPEARANCE_BLOOD_PRESSURE_WRIST 898 /**< Blood Pressure: Wrist. */ -#define BLE_APPEARANCE_GENERIC_HID 960 /**< Human Interface Device (HID). */ -#define BLE_APPEARANCE_HID_KEYBOARD 961 /**< Keyboard (HID Subtype). */ -#define BLE_APPEARANCE_HID_MOUSE 962 /**< Mouse (HID Subtype). */ -#define BLE_APPEARANCE_HID_JOYSTICK 963 /**< Joystick (HID Subtype). */ -#define BLE_APPEARANCE_HID_GAMEPAD 964 /**< Gamepad (HID Subtype). */ -#define BLE_APPEARANCE_HID_DIGITIZERSUBTYPE 965 /**< Digitizer Tablet (HID Subtype). */ -#define BLE_APPEARANCE_HID_CARD_READER 966 /**< Card Reader (HID Subtype). */ -#define BLE_APPEARANCE_HID_DIGITAL_PEN 967 /**< Digital Pen (HID Subtype). */ -#define BLE_APPEARANCE_HID_BARCODE 968 /**< Barcode Scanner (HID Subtype). */ -#define BLE_APPEARANCE_GENERIC_GLUCOSE_METER 1024 /**< Generic Glucose Meter. */ -#define BLE_APPEARANCE_GENERIC_RUNNING_WALKING_SENSOR 1088 /**< Generic Running Walking Sensor. */ -#define BLE_APPEARANCE_RUNNING_WALKING_SENSOR_IN_SHOE 1089 /**< Running Walking Sensor: In-Shoe. */ -#define BLE_APPEARANCE_RUNNING_WALKING_SENSOR_ON_SHOE 1090 /**< Running Walking Sensor: On-Shoe. */ -#define BLE_APPEARANCE_RUNNING_WALKING_SENSOR_ON_HIP 1091 /**< Running Walking Sensor: On-Hip. */ -#define BLE_APPEARANCE_GENERIC_CYCLING 1152 /**< Generic Cycling. */ -#define BLE_APPEARANCE_CYCLING_CYCLING_COMPUTER 1153 /**< Cycling: Cycling Computer. */ -#define BLE_APPEARANCE_CYCLING_SPEED_SENSOR 1154 /**< Cycling: Speed Sensor. */ -#define BLE_APPEARANCE_CYCLING_CADENCE_SENSOR 1155 /**< Cycling: Cadence Sensor. */ -#define BLE_APPEARANCE_CYCLING_POWER_SENSOR 1156 /**< Cycling: Power Sensor. */ -#define BLE_APPEARANCE_CYCLING_SPEED_CADENCE_SENSOR 1157 /**< Cycling: Speed and Cadence Sensor. */ -#define BLE_APPEARANCE_GENERIC_PULSE_OXIMETER 3136 /**< Generic Pulse Oximeter. */ -#define BLE_APPEARANCE_PULSE_OXIMETER_FINGERTIP 3137 /**< Fingertip (Pulse Oximeter subtype). */ -#define BLE_APPEARANCE_PULSE_OXIMETER_WRIST_WORN 3138 /**< Wrist Worn(Pulse Oximeter subtype). */ -#define BLE_APPEARANCE_GENERIC_WEIGHT_SCALE 3200 /**< Generic Weight Scale. */ -#define BLE_APPEARANCE_GENERIC_OUTDOOR_SPORTS_ACT 5184 /**< Generic Outdoor Sports Activity. */ -#define BLE_APPEARANCE_OUTDOOR_SPORTS_ACT_LOC_DISP 5185 /**< Location Display Device (Outdoor Sports Activity subtype). */ -#define BLE_APPEARANCE_OUTDOOR_SPORTS_ACT_LOC_AND_NAV_DISP 5186 /**< Location and Navigation Display Device (Outdoor Sports Activity subtype). */ -#define BLE_APPEARANCE_OUTDOOR_SPORTS_ACT_LOC_POD 5187 /**< Location Pod (Outdoor Sports Activity subtype). */ -#define BLE_APPEARANCE_OUTDOOR_SPORTS_ACT_LOC_AND_NAV_POD 5188 /**< Location and Navigation Pod (Outdoor Sports Activity subtype). */ -/** @} */ - -/** @brief Set .type and .uuid fields of ble_uuid_struct to specified UUID value. */ -#define BLE_UUID_BLE_ASSIGN(instance, value) do {\ - instance.type = BLE_UUID_TYPE_BLE; \ - instance.uuid = value;} while(0) - -/** @brief Copy type and uuid members from src to dst ble_uuid_t pointer. Both pointers must be valid/non-null. */ -#define BLE_UUID_COPY_PTR(dst, src) do {\ - (dst)->type = (src)->type; \ - (dst)->uuid = (src)->uuid;} while(0) - -/** @brief Copy type and uuid members from src to dst ble_uuid_t struct. */ -#define BLE_UUID_COPY_INST(dst, src) do {\ - (dst).type = (src).type; \ - (dst).uuid = (src).uuid;} while(0) - -/** @brief Compare for equality both type and uuid members of two (valid, non-null) ble_uuid_t pointers. */ -#define BLE_UUID_EQ(p_uuid1, p_uuid2) \ - (((p_uuid1)->type == (p_uuid2)->type) && ((p_uuid1)->uuid == (p_uuid2)->uuid)) - -/** @brief Compare for difference both type and uuid members of two (valid, non-null) ble_uuid_t pointers. */ -#define BLE_UUID_NEQ(p_uuid1, p_uuid2) \ - (((p_uuid1)->type != (p_uuid2)->type) || ((p_uuid1)->uuid != (p_uuid2)->uuid)) - -/** @} */ - -/** @addtogroup BLE_TYPES_STRUCTURES Structures - * @{ */ - -/** @brief 128 bit UUID values. */ -typedef struct -{ - uint8_t uuid128[16]; /**< Little-Endian UUID bytes. */ -} ble_uuid128_t; - -/** @brief Bluetooth Low Energy UUID type, encapsulates both 16-bit and 128-bit UUIDs. */ -typedef struct -{ - uint16_t uuid; /**< 16-bit UUID value or octets 12-13 of 128-bit UUID. */ - uint8_t type; /**< UUID type, see @ref BLE_UUID_TYPES. If type is @ref BLE_UUID_TYPE_UNKNOWN, the value of uuid is undefined. */ -} ble_uuid_t; - -/**@brief Data structure. */ -typedef struct -{ - uint8_t *p_data; /**< Pointer to the data buffer provided to/from the application. */ - uint16_t len; /**< Length of the data buffer, in bytes. */ -} ble_data_t; - -/** @} */ -#ifdef __cplusplus -} -#endif - -#endif /* BLE_TYPES_H__ */ - -/** - @} - @} -*/ diff --git a/lib/nrf52/s140_nrf52_7.3.0_API/include/nrf52/nrf_mbr.h b/lib/nrf52/s140_nrf52_7.3.0_API/include/nrf52/nrf_mbr.h deleted file mode 100755 index 42e09fc8..00000000 --- a/lib/nrf52/s140_nrf52_7.3.0_API/include/nrf52/nrf_mbr.h +++ /dev/null @@ -1,268 +0,0 @@ -/* - * Copyright (c) 2014 - 2017, Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - @defgroup nrf_mbr_api Master Boot Record API - @{ - - @brief APIs for updating SoftDevice and BootLoader - -*/ - -#ifndef NRF_MBR_H__ -#define NRF_MBR_H__ - -#include "nrf_svc.h" -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** @addtogroup NRF_MBR_DEFINES Defines - * @{ */ - -/**@brief MBR SVC Base number. */ -#define MBR_SVC_BASE (0x18) - -/**@brief Page size in words. */ -#define MBR_PAGE_SIZE_IN_WORDS (1024) - -/** @brief The size that must be reserved for the MBR when a SoftDevice is written to flash. -This is the offset where the first byte of the SoftDevice hex file is written. */ -#define MBR_SIZE (0x1000) - -/** @brief Location (in the flash memory) of the bootloader address. */ -#define MBR_BOOTLOADER_ADDR (0xFF8) - -/** @brief Location (in UICR) of the bootloader address. */ -#define MBR_UICR_BOOTLOADER_ADDR (&(NRF_UICR->NRFFW[0])) - -/** @brief Location (in the flash memory) of the address of the MBR parameter page. */ -#define MBR_PARAM_PAGE_ADDR (0xFFC) - -/** @brief Location (in UICR) of the address of the MBR parameter page. */ -#define MBR_UICR_PARAM_PAGE_ADDR (&(NRF_UICR->NRFFW[1])) - - -/** @} */ - -/** @addtogroup NRF_MBR_ENUMS Enumerations - * @{ */ - -/**@brief nRF Master Boot Record API SVC numbers. */ -enum NRF_MBR_SVCS -{ - SD_MBR_COMMAND = MBR_SVC_BASE, /**< ::sd_mbr_command */ -}; - -/**@brief Possible values for ::sd_mbr_command_t.command */ -enum NRF_MBR_COMMANDS -{ - SD_MBR_COMMAND_COPY_BL, /**< Copy a new BootLoader. @see ::sd_mbr_command_copy_bl_t*/ - SD_MBR_COMMAND_COPY_SD, /**< Copy a new SoftDevice. @see ::sd_mbr_command_copy_sd_t*/ - SD_MBR_COMMAND_INIT_SD, /**< Initialize forwarding interrupts to SD, and run reset function in SD. Does not require any parameters in ::sd_mbr_command_t params.*/ - SD_MBR_COMMAND_COMPARE, /**< This command works like memcmp. @see ::sd_mbr_command_compare_t*/ - SD_MBR_COMMAND_VECTOR_TABLE_BASE_SET, /**< Change the address the MBR starts after a reset. @see ::sd_mbr_command_vector_table_base_set_t*/ - SD_MBR_COMMAND_RESERVED, - SD_MBR_COMMAND_IRQ_FORWARD_ADDRESS_SET, /**< Start forwarding all interrupts to this address. @see ::sd_mbr_command_irq_forward_address_set_t*/ -}; - -/** @} */ - -/** @addtogroup NRF_MBR_TYPES Types - * @{ */ - -/**@brief This command copies part of a new SoftDevice - * - * The destination area is erased before copying. - * If dst is in the middle of a flash page, that whole flash page will be erased. - * If (dst+len) is in the middle of a flash page, that whole flash page will be erased. - * - * The user of this function is responsible for setting the BPROT registers. - * - * @retval ::NRF_SUCCESS indicates that the contents of the memory blocks where copied correctly. - * @retval ::NRF_ERROR_INTERNAL indicates that the contents of the memory blocks where not verified correctly after copying. - */ -typedef struct -{ - uint32_t *src; /**< Pointer to the source of data to be copied.*/ - uint32_t *dst; /**< Pointer to the destination where the content is to be copied.*/ - uint32_t len; /**< Number of 32 bit words to copy. Must be a multiple of @ref MBR_PAGE_SIZE_IN_WORDS words.*/ -} sd_mbr_command_copy_sd_t; - - -/**@brief This command works like memcmp, but takes the length in words. - * - * @retval ::NRF_SUCCESS indicates that the contents of both memory blocks are equal. - * @retval ::NRF_ERROR_NULL indicates that the contents of the memory blocks are not equal. - */ -typedef struct -{ - uint32_t *ptr1; /**< Pointer to block of memory. */ - uint32_t *ptr2; /**< Pointer to block of memory. */ - uint32_t len; /**< Number of 32 bit words to compare.*/ -} sd_mbr_command_compare_t; - - -/**@brief This command copies a new BootLoader. - * - * The MBR assumes that either @ref MBR_BOOTLOADER_ADDR or @ref MBR_UICR_BOOTLOADER_ADDR is set to - * the address where the bootloader will be copied. If both addresses are set, the MBR will prioritize - * @ref MBR_BOOTLOADER_ADDR. - * - * The bootloader destination is erased by this function. - * If (destination+bl_len) is in the middle of a flash page, that whole flash page will be erased. - * - * This command requires that @ref MBR_PARAM_PAGE_ADDR or @ref MBR_UICR_PARAM_PAGE_ADDR is set, - * see @ref sd_mbr_command. - * - * This command will use the flash protect peripheral (BPROT or ACL) to protect the flash that is - * not intended to be written. - * - * On success, this function will not return. It will start the new bootloader from reset-vector as normal. - * - * @retval ::NRF_ERROR_INTERNAL indicates an internal error that should not happen. - * @retval ::NRF_ERROR_FORBIDDEN if the bootloader address is not set. - * @retval ::NRF_ERROR_INVALID_LENGTH if parameters attempts to read or write outside flash area. - * @retval ::NRF_ERROR_NO_MEM No MBR parameter page is provided. See @ref sd_mbr_command. - */ -typedef struct -{ - uint32_t *bl_src; /**< Pointer to the source of the bootloader to be be copied.*/ - uint32_t bl_len; /**< Number of 32 bit words to copy for BootLoader. */ -} sd_mbr_command_copy_bl_t; - -/**@brief Change the address the MBR starts after a reset - * - * Once this function has been called, this address is where the MBR will start to forward - * interrupts to after a reset. - * - * To restore default forwarding, this function should be called with @ref address set to 0. If a - * bootloader is present, interrupts will be forwarded to the bootloader. If not, interrupts will - * be forwarded to the SoftDevice. - * - * The location of a bootloader can be specified in @ref MBR_BOOTLOADER_ADDR or - * @ref MBR_UICR_BOOTLOADER_ADDR. If both addresses are set, the MBR will prioritize - * @ref MBR_BOOTLOADER_ADDR. - * - * This command requires that @ref MBR_PARAM_PAGE_ADDR or @ref MBR_UICR_PARAM_PAGE_ADDR is set, - * see @ref sd_mbr_command. - * - * On success, this function will not return. It will reset the device. - * - * @retval ::NRF_ERROR_INTERNAL indicates an internal error that should not happen. - * @retval ::NRF_ERROR_INVALID_ADDR if parameter address is outside of the flash size. - * @retval ::NRF_ERROR_NO_MEM No MBR parameter page is provided. See @ref sd_mbr_command. - */ -typedef struct -{ - uint32_t address; /**< The base address of the interrupt vector table for forwarded interrupts.*/ -} sd_mbr_command_vector_table_base_set_t; - -/**@brief Sets the base address of the interrupt vector table for interrupts forwarded from the MBR - * - * Unlike sd_mbr_command_vector_table_base_set_t, this function does not reset, and it does not - * change where the MBR starts after reset. - * - * @retval ::NRF_SUCCESS - */ -typedef struct -{ - uint32_t address; /**< The base address of the interrupt vector table for forwarded interrupts.*/ -} sd_mbr_command_irq_forward_address_set_t; - -/**@brief Input structure containing data used when calling ::sd_mbr_command - * - * Depending on what command value that is set, the corresponding params value type must also be - * set. See @ref NRF_MBR_COMMANDS for command types and corresponding params value type. If command - * @ref SD_MBR_COMMAND_INIT_SD is set, it is not necessary to set any values under params. - */ -typedef struct -{ - uint32_t command; /**< Type of command to be issued. See @ref NRF_MBR_COMMANDS. */ - union - { - sd_mbr_command_copy_sd_t copy_sd; /**< Parameters for copy SoftDevice.*/ - sd_mbr_command_compare_t compare; /**< Parameters for verify.*/ - sd_mbr_command_copy_bl_t copy_bl; /**< Parameters for copy BootLoader. Requires parameter page. */ - sd_mbr_command_vector_table_base_set_t base_set; /**< Parameters for vector table base set. Requires parameter page.*/ - sd_mbr_command_irq_forward_address_set_t irq_forward_address_set; /**< Parameters for irq forward address set*/ - } params; /**< Command parameters. */ -} sd_mbr_command_t; - -/** @} */ - -/** @addtogroup NRF_MBR_FUNCTIONS Functions - * @{ */ - -/**@brief Issue Master Boot Record commands - * - * Commands used when updating a SoftDevice and bootloader. - * - * The @ref SD_MBR_COMMAND_COPY_BL and @ref SD_MBR_COMMAND_VECTOR_TABLE_BASE_SET requires - * parameters to be retained by the MBR when resetting the IC. This is done in a separate flash - * page. The location of the flash page should be provided by the application in either - * @ref MBR_PARAM_PAGE_ADDR or @ref MBR_UICR_PARAM_PAGE_ADDR. If both addresses are set, the MBR - * will prioritize @ref MBR_PARAM_PAGE_ADDR. This page will be cleared by the MBR and is used to - * store the command before reset. When an address is specified, the page it refers to must not be - * used by the application. If no address is provided by the application, i.e. both - * @ref MBR_PARAM_PAGE_ADDR and @ref MBR_UICR_PARAM_PAGE_ADDR is 0xFFFFFFFF, MBR commands which use - * flash will be unavailable and return @ref NRF_ERROR_NO_MEM. - * - * @param[in] param Pointer to a struct describing the command. - * - * @note For a complete set of return values, see ::sd_mbr_command_copy_sd_t, - * ::sd_mbr_command_copy_bl_t, ::sd_mbr_command_compare_t, - * ::sd_mbr_command_vector_table_base_set_t, ::sd_mbr_command_irq_forward_address_set_t - * - * @retval ::NRF_ERROR_NO_MEM No MBR parameter page provided - * @retval ::NRF_ERROR_INVALID_PARAM if an invalid command is given. -*/ -SVCALL(SD_MBR_COMMAND, uint32_t, sd_mbr_command(sd_mbr_command_t* param)); - -/** @} */ - -#ifdef __cplusplus -} -#endif -#endif // NRF_MBR_H__ - -/** - @} -*/ diff --git a/lib/nrf52/s140_nrf52_7.3.0_API/include/nrf_error.h b/lib/nrf52/s140_nrf52_7.3.0_API/include/nrf_error.h deleted file mode 100755 index ba2c1714..00000000 --- a/lib/nrf52/s140_nrf52_7.3.0_API/include/nrf_error.h +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (c) Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - - /** - @defgroup nrf_error SoftDevice Global Error Codes - @{ - - @brief Global Error definitions -*/ - -/* Header guard */ -#ifndef NRF_ERROR_H__ -#define NRF_ERROR_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/** @defgroup NRF_ERRORS_BASE Error Codes Base number definitions - * @{ */ -#define NRF_ERROR_BASE_NUM (0x0) ///< Global error base -#define NRF_ERROR_SDM_BASE_NUM (0x1000) ///< SDM error base -#define NRF_ERROR_SOC_BASE_NUM (0x2000) ///< SoC error base -#define NRF_ERROR_STK_BASE_NUM (0x3000) ///< STK error base -/** @} */ - -#define NRF_SUCCESS (NRF_ERROR_BASE_NUM + 0) ///< Successful command -#define NRF_ERROR_SVC_HANDLER_MISSING (NRF_ERROR_BASE_NUM + 1) ///< SVC handler is missing -#define NRF_ERROR_SOFTDEVICE_NOT_ENABLED (NRF_ERROR_BASE_NUM + 2) ///< SoftDevice has not been enabled -#define NRF_ERROR_INTERNAL (NRF_ERROR_BASE_NUM + 3) ///< Internal Error -#define NRF_ERROR_NO_MEM (NRF_ERROR_BASE_NUM + 4) ///< No Memory for operation -#define NRF_ERROR_NOT_FOUND (NRF_ERROR_BASE_NUM + 5) ///< Not found -#define NRF_ERROR_NOT_SUPPORTED (NRF_ERROR_BASE_NUM + 6) ///< Not supported -#define NRF_ERROR_INVALID_PARAM (NRF_ERROR_BASE_NUM + 7) ///< Invalid Parameter -#define NRF_ERROR_INVALID_STATE (NRF_ERROR_BASE_NUM + 8) ///< Invalid state, operation disallowed in this state -#define NRF_ERROR_INVALID_LENGTH (NRF_ERROR_BASE_NUM + 9) ///< Invalid Length -#define NRF_ERROR_INVALID_FLAGS (NRF_ERROR_BASE_NUM + 10) ///< Invalid Flags -#define NRF_ERROR_INVALID_DATA (NRF_ERROR_BASE_NUM + 11) ///< Invalid Data -#define NRF_ERROR_DATA_SIZE (NRF_ERROR_BASE_NUM + 12) ///< Invalid Data size -#define NRF_ERROR_TIMEOUT (NRF_ERROR_BASE_NUM + 13) ///< Operation timed out -#define NRF_ERROR_NULL (NRF_ERROR_BASE_NUM + 14) ///< Null Pointer -#define NRF_ERROR_FORBIDDEN (NRF_ERROR_BASE_NUM + 15) ///< Forbidden Operation -#define NRF_ERROR_INVALID_ADDR (NRF_ERROR_BASE_NUM + 16) ///< Bad Memory Address -#define NRF_ERROR_BUSY (NRF_ERROR_BASE_NUM + 17) ///< Busy -#define NRF_ERROR_CONN_COUNT (NRF_ERROR_BASE_NUM + 18) ///< Maximum connection count exceeded. -#define NRF_ERROR_RESOURCES (NRF_ERROR_BASE_NUM + 19) ///< Not enough resources for operation - -#ifdef __cplusplus -} -#endif -#endif // NRF_ERROR_H__ - -/** - @} -*/ diff --git a/lib/nrf52/s140_nrf52_7.3.0_API/include/nrf_error_sdm.h b/lib/nrf52/s140_nrf52_7.3.0_API/include/nrf_error_sdm.h deleted file mode 100755 index 964c117b..00000000 --- a/lib/nrf52/s140_nrf52_7.3.0_API/include/nrf_error_sdm.h +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (c) Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - - /** - @addtogroup nrf_sdm_api - @{ - @defgroup nrf_sdm_error SoftDevice Manager Error Codes - @{ - - @brief Error definitions for the SDM API -*/ - -/* Header guard */ -#ifndef NRF_ERROR_SDM_H__ -#define NRF_ERROR_SDM_H__ - -#include "nrf_error.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define NRF_ERROR_SDM_LFCLK_SOURCE_UNKNOWN (NRF_ERROR_SDM_BASE_NUM + 0) ///< Unknown LFCLK source. -#define NRF_ERROR_SDM_INCORRECT_INTERRUPT_CONFIGURATION (NRF_ERROR_SDM_BASE_NUM + 1) ///< Incorrect interrupt configuration (can be caused by using illegal priority levels, or having enabled SoftDevice interrupts). -#define NRF_ERROR_SDM_INCORRECT_CLENR0 (NRF_ERROR_SDM_BASE_NUM + 2) ///< Incorrect CLENR0 (can be caused by erroneous SoftDevice flashing). - -#ifdef __cplusplus -} -#endif -#endif // NRF_ERROR_SDM_H__ - -/** - @} - @} -*/ diff --git a/lib/nrf52/s140_nrf52_7.3.0_API/include/nrf_error_soc.h b/lib/nrf52/s140_nrf52_7.3.0_API/include/nrf_error_soc.h deleted file mode 100755 index a9b80ab6..00000000 --- a/lib/nrf52/s140_nrf52_7.3.0_API/include/nrf_error_soc.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright (c) Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - @addtogroup nrf_soc_api - @{ - @defgroup nrf_soc_error SoC Library Error Codes - @{ - - @brief Error definitions for the SoC library - -*/ - -/* Header guard */ -#ifndef NRF_ERROR_SOC_H__ -#define NRF_ERROR_SOC_H__ - -#include "nrf_error.h" -#ifdef __cplusplus -extern "C" { -#endif - -/* Mutex Errors */ -#define NRF_ERROR_SOC_MUTEX_ALREADY_TAKEN (NRF_ERROR_SOC_BASE_NUM + 0) ///< Mutex already taken - -/* NVIC errors */ -#define NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE (NRF_ERROR_SOC_BASE_NUM + 1) ///< NVIC interrupt not available -#define NRF_ERROR_SOC_NVIC_INTERRUPT_PRIORITY_NOT_ALLOWED (NRF_ERROR_SOC_BASE_NUM + 2) ///< NVIC interrupt priority not allowed -#define NRF_ERROR_SOC_NVIC_SHOULD_NOT_RETURN (NRF_ERROR_SOC_BASE_NUM + 3) ///< NVIC should not return - -/* Power errors */ -#define NRF_ERROR_SOC_POWER_MODE_UNKNOWN (NRF_ERROR_SOC_BASE_NUM + 4) ///< Power mode unknown -#define NRF_ERROR_SOC_POWER_POF_THRESHOLD_UNKNOWN (NRF_ERROR_SOC_BASE_NUM + 5) ///< Power POF threshold unknown -#define NRF_ERROR_SOC_POWER_OFF_SHOULD_NOT_RETURN (NRF_ERROR_SOC_BASE_NUM + 6) ///< Power off should not return - -/* Rand errors */ -#define NRF_ERROR_SOC_RAND_NOT_ENOUGH_VALUES (NRF_ERROR_SOC_BASE_NUM + 7) ///< RAND not enough values - -/* PPI errors */ -#define NRF_ERROR_SOC_PPI_INVALID_CHANNEL (NRF_ERROR_SOC_BASE_NUM + 8) ///< Invalid PPI Channel -#define NRF_ERROR_SOC_PPI_INVALID_GROUP (NRF_ERROR_SOC_BASE_NUM + 9) ///< Invalid PPI Group - -#ifdef __cplusplus -} -#endif -#endif // NRF_ERROR_SOC_H__ -/** - @} - @} -*/ diff --git a/lib/nrf52/s140_nrf52_7.3.0_API/include/nrf_nvic.h b/lib/nrf52/s140_nrf52_7.3.0_API/include/nrf_nvic.h deleted file mode 100755 index 7119634a..00000000 --- a/lib/nrf52/s140_nrf52_7.3.0_API/include/nrf_nvic.h +++ /dev/null @@ -1,491 +0,0 @@ -/* - * Copyright (c) Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * @defgroup nrf_nvic_api SoftDevice NVIC API - * @{ - * - * @note In order to use this module, the following code has to be added to a .c file: - * \code - * nrf_nvic_state_t nrf_nvic_state = {0}; - * \endcode - * - * @note Definitions and declarations starting with __ (double underscore) in this header file are - * not intended for direct use by the application. - * - * @brief APIs for the accessing NVIC when using a SoftDevice. - * - */ - -#ifndef NRF_NVIC_H__ -#define NRF_NVIC_H__ - -#include -#include "nrf.h" -#include "nrf_svc.h" -#include "nrf_error.h" -#include "nrf_error_soc.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/**@addtogroup NRF_NVIC_DEFINES Defines - * @{ */ - -/**@defgroup NRF_NVIC_ISER_DEFINES SoftDevice NVIC internal definitions - * @{ */ - -#define __NRF_NVIC_NVMC_IRQn (30) /**< The peripheral ID of the NVMC. IRQ numbers are used to identify peripherals, but the NVMC doesn't have an IRQ number in the MDK. */ - -#define __NRF_NVIC_ISER_COUNT (2) /**< The number of ISER/ICER registers in the NVIC that are used. */ - -/**@brief Interrupt priority levels used by the SoftDevice. */ -#define __NRF_NVIC_SD_IRQ_PRIOS ((uint8_t)( \ - (1U << 0) /**< Priority level high .*/ \ - | (1U << 1) /**< Priority level medium. */ \ - | (1U << 4) /**< Priority level low. */ \ - )) - -/**@brief Interrupt priority levels available to the application. */ -#define __NRF_NVIC_APP_IRQ_PRIOS ((uint8_t)~__NRF_NVIC_SD_IRQ_PRIOS) - -/**@brief Interrupts used by the SoftDevice, with IRQn in the range 0-31. */ -#define __NRF_NVIC_SD_IRQS_0 ((uint32_t)( \ - (1U << POWER_CLOCK_IRQn) \ - | (1U << RADIO_IRQn) \ - | (1U << RTC0_IRQn) \ - | (1U << TIMER0_IRQn) \ - | (1U << RNG_IRQn) \ - | (1U << ECB_IRQn) \ - | (1U << CCM_AAR_IRQn) \ - | (1U << TEMP_IRQn) \ - | (1U << __NRF_NVIC_NVMC_IRQn) \ - | (1U << (uint32_t)SWI5_IRQn) \ - )) - -/**@brief Interrupts used by the SoftDevice, with IRQn in the range 32-63. */ -#define __NRF_NVIC_SD_IRQS_1 ((uint32_t)0) - -/**@brief Interrupts available for to application, with IRQn in the range 0-31. */ -#define __NRF_NVIC_APP_IRQS_0 (~__NRF_NVIC_SD_IRQS_0) - -/**@brief Interrupts available for to application, with IRQn in the range 32-63. */ -#define __NRF_NVIC_APP_IRQS_1 (~__NRF_NVIC_SD_IRQS_1) - -/**@} */ - -/**@} */ - -/**@addtogroup NRF_NVIC_VARIABLES Variables - * @{ */ - -/**@brief Type representing the state struct for the SoftDevice NVIC module. */ -typedef struct -{ - uint32_t volatile __irq_masks[__NRF_NVIC_ISER_COUNT]; /**< IRQs enabled by the application in the NVIC. */ - uint32_t volatile __cr_flag; /**< Non-zero if already in a critical region */ -} nrf_nvic_state_t; - -/**@brief Variable keeping the state for the SoftDevice NVIC module. This must be declared in an - * application source file. */ -extern nrf_nvic_state_t nrf_nvic_state; - -/**@} */ - -/**@addtogroup NRF_NVIC_INTERNAL_FUNCTIONS SoftDevice NVIC internal functions - * @{ */ - -/**@brief Disables IRQ interrupts globally, including the SoftDevice's interrupts. - * - * @retval The value of PRIMASK prior to disabling the interrupts. - */ -__STATIC_INLINE int __sd_nvic_irq_disable(void); - -/**@brief Enables IRQ interrupts globally, including the SoftDevice's interrupts. - */ -__STATIC_INLINE void __sd_nvic_irq_enable(void); - -/**@brief Checks if IRQn is available to application - * @param[in] IRQn IRQ to check - * - * @retval 1 (true) if the IRQ to check is available to the application - */ -__STATIC_INLINE uint32_t __sd_nvic_app_accessible_irq(IRQn_Type IRQn); - -/**@brief Checks if priority is available to application - * @param[in] priority priority to check - * - * @retval 1 (true) if the priority to check is available to the application - */ -__STATIC_INLINE uint32_t __sd_nvic_is_app_accessible_priority(uint32_t priority); - -/**@} */ - -/**@addtogroup NRF_NVIC_FUNCTIONS SoftDevice NVIC public functions - * @{ */ - -/**@brief Enable External Interrupt. - * @note Corresponds to NVIC_EnableIRQ in CMSIS. - * - * @pre IRQn is valid and not reserved by the stack. - * - * @param[in] IRQn See the NVIC_EnableIRQ documentation in CMSIS. - * - * @retval ::NRF_SUCCESS The interrupt was enabled. - * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE The interrupt is not available for the application. - * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_PRIORITY_NOT_ALLOWED The interrupt has a priority not available for the application. - */ -__STATIC_INLINE uint32_t sd_nvic_EnableIRQ(IRQn_Type IRQn); - -/**@brief Disable External Interrupt. - * @note Corresponds to NVIC_DisableIRQ in CMSIS. - * - * @pre IRQn is valid and not reserved by the stack. - * - * @param[in] IRQn See the NVIC_DisableIRQ documentation in CMSIS. - * - * @retval ::NRF_SUCCESS The interrupt was disabled. - * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE The interrupt is not available for the application. - */ -__STATIC_INLINE uint32_t sd_nvic_DisableIRQ(IRQn_Type IRQn); - -/**@brief Get Pending Interrupt. - * @note Corresponds to NVIC_GetPendingIRQ in CMSIS. - * - * @pre IRQn is valid and not reserved by the stack. - * - * @param[in] IRQn See the NVIC_GetPendingIRQ documentation in CMSIS. - * @param[out] p_pending_irq Return value from NVIC_GetPendingIRQ. - * - * @retval ::NRF_SUCCESS The interrupt is available for the application. - * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE IRQn is not available for the application. - */ -__STATIC_INLINE uint32_t sd_nvic_GetPendingIRQ(IRQn_Type IRQn, uint32_t * p_pending_irq); - -/**@brief Set Pending Interrupt. - * @note Corresponds to NVIC_SetPendingIRQ in CMSIS. - * - * @pre IRQn is valid and not reserved by the stack. - * - * @param[in] IRQn See the NVIC_SetPendingIRQ documentation in CMSIS. - * - * @retval ::NRF_SUCCESS The interrupt is set pending. - * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE IRQn is not available for the application. - */ -__STATIC_INLINE uint32_t sd_nvic_SetPendingIRQ(IRQn_Type IRQn); - -/**@brief Clear Pending Interrupt. - * @note Corresponds to NVIC_ClearPendingIRQ in CMSIS. - * - * @pre IRQn is valid and not reserved by the stack. - * - * @param[in] IRQn See the NVIC_ClearPendingIRQ documentation in CMSIS. - * - * @retval ::NRF_SUCCESS The interrupt pending flag is cleared. - * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE IRQn is not available for the application. - */ -__STATIC_INLINE uint32_t sd_nvic_ClearPendingIRQ(IRQn_Type IRQn); - -/**@brief Set Interrupt Priority. - * @note Corresponds to NVIC_SetPriority in CMSIS. - * - * @pre IRQn is valid and not reserved by the stack. - * @pre Priority is valid and not reserved by the stack. - * - * @param[in] IRQn See the NVIC_SetPriority documentation in CMSIS. - * @param[in] priority A valid IRQ priority for use by the application. - * - * @retval ::NRF_SUCCESS The interrupt and priority level is available for the application. - * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE IRQn is not available for the application. - * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_PRIORITY_NOT_ALLOWED The interrupt priority is not available for the application. - */ -__STATIC_INLINE uint32_t sd_nvic_SetPriority(IRQn_Type IRQn, uint32_t priority); - -/**@brief Get Interrupt Priority. - * @note Corresponds to NVIC_GetPriority in CMSIS. - * - * @pre IRQn is valid and not reserved by the stack. - * - * @param[in] IRQn See the NVIC_GetPriority documentation in CMSIS. - * @param[out] p_priority Return value from NVIC_GetPriority. - * - * @retval ::NRF_SUCCESS The interrupt priority is returned in p_priority. - * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE - IRQn is not available for the application. - */ -__STATIC_INLINE uint32_t sd_nvic_GetPriority(IRQn_Type IRQn, uint32_t * p_priority); - -/**@brief System Reset. - * @note Corresponds to NVIC_SystemReset in CMSIS. - * - * @retval ::NRF_ERROR_SOC_NVIC_SHOULD_NOT_RETURN - */ -__STATIC_INLINE uint32_t sd_nvic_SystemReset(void); - -/**@brief Enter critical region. - * - * @post Application interrupts will be disabled. - * @note sd_nvic_critical_region_enter() and ::sd_nvic_critical_region_exit() must be called in matching pairs inside each - * execution context - * @sa sd_nvic_critical_region_exit - * - * @param[out] p_is_nested_critical_region If 1, the application is now in a nested critical region. - * - * @retval ::NRF_SUCCESS - */ -__STATIC_INLINE uint32_t sd_nvic_critical_region_enter(uint8_t * p_is_nested_critical_region); - -/**@brief Exit critical region. - * - * @pre Application has entered a critical region using ::sd_nvic_critical_region_enter. - * @post If not in a nested critical region, the application interrupts will restored to the state before ::sd_nvic_critical_region_enter was called. - * - * @param[in] is_nested_critical_region If this is set to 1, the critical region won't be exited. @sa sd_nvic_critical_region_enter. - * - * @retval ::NRF_SUCCESS - */ -__STATIC_INLINE uint32_t sd_nvic_critical_region_exit(uint8_t is_nested_critical_region); - -/**@} */ - -#ifndef SUPPRESS_INLINE_IMPLEMENTATION - -__STATIC_INLINE int __sd_nvic_irq_disable(void) -{ - int pm = __get_PRIMASK(); - __disable_irq(); - return pm; -} - -__STATIC_INLINE void __sd_nvic_irq_enable(void) -{ - __enable_irq(); -} - -__STATIC_INLINE uint32_t __sd_nvic_app_accessible_irq(IRQn_Type IRQn) -{ - if (IRQn < 32) - { - return ((1UL<= (1 << __NVIC_PRIO_BITS)) - || (((1 << priority) & __NRF_NVIC_APP_IRQ_PRIOS) == 0) - ) - { - return 0; - } - return 1; -} - - -__STATIC_INLINE uint32_t sd_nvic_EnableIRQ(IRQn_Type IRQn) -{ - if (!__sd_nvic_app_accessible_irq(IRQn)) - { - return NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE; - } - if (!__sd_nvic_is_app_accessible_priority(NVIC_GetPriority(IRQn))) - { - return NRF_ERROR_SOC_NVIC_INTERRUPT_PRIORITY_NOT_ALLOWED; - } - - if (nrf_nvic_state.__cr_flag) - { - nrf_nvic_state.__irq_masks[(uint32_t)((int32_t)IRQn) >> 5] |= (uint32_t)(1 << ((uint32_t)((int32_t)IRQn) & (uint32_t)0x1F)); - } - else - { - NVIC_EnableIRQ(IRQn); - } - return NRF_SUCCESS; -} - -__STATIC_INLINE uint32_t sd_nvic_DisableIRQ(IRQn_Type IRQn) -{ - if (!__sd_nvic_app_accessible_irq(IRQn)) - { - return NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE; - } - - if (nrf_nvic_state.__cr_flag) - { - nrf_nvic_state.__irq_masks[(uint32_t)((int32_t)IRQn) >> 5] &= ~(1UL << ((uint32_t)(IRQn) & 0x1F)); - } - else - { - NVIC_DisableIRQ(IRQn); - } - - return NRF_SUCCESS; -} - -__STATIC_INLINE uint32_t sd_nvic_GetPendingIRQ(IRQn_Type IRQn, uint32_t * p_pending_irq) -{ - if (__sd_nvic_app_accessible_irq(IRQn)) - { - *p_pending_irq = NVIC_GetPendingIRQ(IRQn); - return NRF_SUCCESS; - } - else - { - return NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE; - } -} - -__STATIC_INLINE uint32_t sd_nvic_SetPendingIRQ(IRQn_Type IRQn) -{ - if (__sd_nvic_app_accessible_irq(IRQn)) - { - NVIC_SetPendingIRQ(IRQn); - return NRF_SUCCESS; - } - else - { - return NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE; - } -} - -__STATIC_INLINE uint32_t sd_nvic_ClearPendingIRQ(IRQn_Type IRQn) -{ - if (__sd_nvic_app_accessible_irq(IRQn)) - { - NVIC_ClearPendingIRQ(IRQn); - return NRF_SUCCESS; - } - else - { - return NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE; - } -} - -__STATIC_INLINE uint32_t sd_nvic_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if (!__sd_nvic_app_accessible_irq(IRQn)) - { - return NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE; - } - - if (!__sd_nvic_is_app_accessible_priority(priority)) - { - return NRF_ERROR_SOC_NVIC_INTERRUPT_PRIORITY_NOT_ALLOWED; - } - - NVIC_SetPriority(IRQn, (uint32_t)priority); - return NRF_SUCCESS; -} - -__STATIC_INLINE uint32_t sd_nvic_GetPriority(IRQn_Type IRQn, uint32_t * p_priority) -{ - if (__sd_nvic_app_accessible_irq(IRQn)) - { - *p_priority = (NVIC_GetPriority(IRQn) & 0xFF); - return NRF_SUCCESS; - } - else - { - return NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE; - } -} - -__STATIC_INLINE uint32_t sd_nvic_SystemReset(void) -{ - NVIC_SystemReset(); - return NRF_ERROR_SOC_NVIC_SHOULD_NOT_RETURN; -} - -__STATIC_INLINE uint32_t sd_nvic_critical_region_enter(uint8_t * p_is_nested_critical_region) -{ - int was_masked = __sd_nvic_irq_disable(); - if (!nrf_nvic_state.__cr_flag) - { - nrf_nvic_state.__cr_flag = 1; - nrf_nvic_state.__irq_masks[0] = ( NVIC->ICER[0] & __NRF_NVIC_APP_IRQS_0 ); - NVIC->ICER[0] = __NRF_NVIC_APP_IRQS_0; - nrf_nvic_state.__irq_masks[1] = ( NVIC->ICER[1] & __NRF_NVIC_APP_IRQS_1 ); - NVIC->ICER[1] = __NRF_NVIC_APP_IRQS_1; - *p_is_nested_critical_region = 0; - } - else - { - *p_is_nested_critical_region = 1; - } - if (!was_masked) - { - __sd_nvic_irq_enable(); - } - return NRF_SUCCESS; -} - -__STATIC_INLINE uint32_t sd_nvic_critical_region_exit(uint8_t is_nested_critical_region) -{ - if (nrf_nvic_state.__cr_flag && (is_nested_critical_region == 0)) - { - int was_masked = __sd_nvic_irq_disable(); - NVIC->ISER[0] = nrf_nvic_state.__irq_masks[0]; - NVIC->ISER[1] = nrf_nvic_state.__irq_masks[1]; - nrf_nvic_state.__cr_flag = 0; - if (!was_masked) - { - __sd_nvic_irq_enable(); - } - } - - return NRF_SUCCESS; -} - -#endif /* SUPPRESS_INLINE_IMPLEMENTATION */ - -#ifdef __cplusplus -} -#endif - -#endif // NRF_NVIC_H__ - -/**@} */ diff --git a/lib/nrf52/s140_nrf52_7.3.0_API/include/nrf_sdm.h b/lib/nrf52/s140_nrf52_7.3.0_API/include/nrf_sdm.h deleted file mode 100755 index ff6af6fe..00000000 --- a/lib/nrf52/s140_nrf52_7.3.0_API/include/nrf_sdm.h +++ /dev/null @@ -1,371 +0,0 @@ -/* - * Copyright (c) Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - @defgroup nrf_sdm_api SoftDevice Manager API - @{ - - @brief APIs for SoftDevice management. - -*/ - -#ifndef NRF_SDM_H__ -#define NRF_SDM_H__ - -#include -#include "nrf.h" -#include "nrf_svc.h" -#include "nrf_error.h" -#include "nrf_error_sdm.h" -#include "nrf_soc.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** @addtogroup NRF_SDM_DEFINES Defines - * @{ */ -#ifdef NRFSOC_DOXYGEN -/// Declared in nrf_mbr.h -#define MBR_SIZE 0 -#warning test -#endif - -/** @brief The major version for the SoftDevice binary distributed with this header file. */ -#define SD_MAJOR_VERSION (7) - -/** @brief The minor version for the SoftDevice binary distributed with this header file. */ -#define SD_MINOR_VERSION (3) - -/** @brief The bugfix version for the SoftDevice binary distributed with this header file. */ -#define SD_BUGFIX_VERSION (0) - -/** @brief The SoftDevice variant of this firmware. */ -#define SD_VARIANT_ID 140 - -/** @brief The full version number for the SoftDevice binary this header file was distributed - * with, as a decimal number in the form Mmmmbbb, where: - * - M is major version (one or more digits) - * - mmm is minor version (three digits) - * - bbb is bugfix version (three digits). */ -#define SD_VERSION (SD_MAJOR_VERSION * 1000000 + SD_MINOR_VERSION * 1000 + SD_BUGFIX_VERSION) - -/** @brief SoftDevice Manager SVC Base number. */ -#define SDM_SVC_BASE 0x10 - -/** @brief SoftDevice unique string size in bytes. */ -#define SD_UNIQUE_STR_SIZE 20 - -/** @brief Invalid info field. Returned when an info field does not exist. */ -#define SDM_INFO_FIELD_INVALID (0) - -/** @brief Defines the SoftDevice Information Structure location (address) as an offset from -the start of the SoftDevice (without MBR)*/ -#define SOFTDEVICE_INFO_STRUCT_OFFSET (0x2000) - -/** @brief Defines the absolute SoftDevice Information Structure location (address) when the - * SoftDevice is installed just above the MBR (the usual case). */ -#define SOFTDEVICE_INFO_STRUCT_ADDRESS (SOFTDEVICE_INFO_STRUCT_OFFSET + MBR_SIZE) - -/** @brief Defines the offset for the SoftDevice Information Structure size value relative to the - * SoftDevice base address. The size value is of type uint8_t. */ -#define SD_INFO_STRUCT_SIZE_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET) - -/** @brief Defines the offset for the SoftDevice size value relative to the SoftDevice base address. - * The size value is of type uint32_t. */ -#define SD_SIZE_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET + 0x08) - -/** @brief Defines the offset for FWID value relative to the SoftDevice base address. The FWID value - * is of type uint16_t. */ -#define SD_FWID_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET + 0x0C) - -/** @brief Defines the offset for the SoftDevice ID relative to the SoftDevice base address. The ID - * is of type uint32_t. */ -#define SD_ID_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET + 0x10) - -/** @brief Defines the offset for the SoftDevice version relative to the SoftDevice base address in - * the same format as @ref SD_VERSION, stored as an uint32_t. */ -#define SD_VERSION_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET + 0x14) - -/** @brief Defines the offset for the SoftDevice unique string relative to the SoftDevice base address. - * The SD_UNIQUE_STR is stored as an array of uint8_t. The size of array is @ref SD_UNIQUE_STR_SIZE. - */ -#define SD_UNIQUE_STR_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET + 0x18) - -/** @brief Defines a macro for retrieving the actual SoftDevice Information Structure size value - * from a given base address. Use @ref MBR_SIZE as the argument when the SoftDevice is - * installed just above the MBR (the usual case). */ -#define SD_INFO_STRUCT_SIZE_GET(baseaddr) (*((uint8_t *) ((baseaddr) + SD_INFO_STRUCT_SIZE_OFFSET))) - -/** @brief Defines a macro for retrieving the actual SoftDevice size value from a given base - * address. Use @ref MBR_SIZE as the argument when the SoftDevice is installed just above - * the MBR (the usual case). */ -#define SD_SIZE_GET(baseaddr) (*((uint32_t *) ((baseaddr) + SD_SIZE_OFFSET))) - -/** @brief Defines the amount of flash that is used by the SoftDevice. - * Add @ref MBR_SIZE to find the first available flash address when the SoftDevice is installed - * just above the MBR (the usual case). - */ -#define SD_FLASH_SIZE 0x26000 - -/** @brief Defines a macro for retrieving the actual FWID value from a given base address. Use - * @ref MBR_SIZE as the argument when the SoftDevice is installed just above the MBR (the usual - * case). */ -#define SD_FWID_GET(baseaddr) (*((uint16_t *) ((baseaddr) + SD_FWID_OFFSET))) - -/** @brief Defines a macro for retrieving the actual SoftDevice ID from a given base address. Use - * @ref MBR_SIZE as the argument when the SoftDevice is installed just above the MBR (the - * usual case). */ -#define SD_ID_GET(baseaddr) ((SD_INFO_STRUCT_SIZE_GET(baseaddr) > (SD_ID_OFFSET - SOFTDEVICE_INFO_STRUCT_OFFSET)) \ - ? (*((uint32_t *) ((baseaddr) + SD_ID_OFFSET))) : SDM_INFO_FIELD_INVALID) - -/** @brief Defines a macro for retrieving the actual SoftDevice version from a given base address. - * Use @ref MBR_SIZE as the argument when the SoftDevice is installed just above the MBR - * (the usual case). */ -#define SD_VERSION_GET(baseaddr) ((SD_INFO_STRUCT_SIZE_GET(baseaddr) > (SD_VERSION_OFFSET - SOFTDEVICE_INFO_STRUCT_OFFSET)) \ - ? (*((uint32_t *) ((baseaddr) + SD_VERSION_OFFSET))) : SDM_INFO_FIELD_INVALID) - -/** @brief Defines a macro for retrieving the address of SoftDevice unique str based on a given base address. - * Use @ref MBR_SIZE as the argument when the SoftDevice is installed just above the MBR - * (the usual case). */ -#define SD_UNIQUE_STR_ADDR_GET(baseaddr) ((SD_INFO_STRUCT_SIZE_GET(baseaddr) > (SD_UNIQUE_STR_OFFSET - SOFTDEVICE_INFO_STRUCT_OFFSET)) \ - ? (((uint8_t *) ((baseaddr) + SD_UNIQUE_STR_OFFSET))) : SDM_INFO_FIELD_INVALID) - -/**@defgroup NRF_FAULT_ID_RANGES Fault ID ranges - * @{ */ -#define NRF_FAULT_ID_SD_RANGE_START 0x00000000 /**< SoftDevice ID range start. */ -#define NRF_FAULT_ID_APP_RANGE_START 0x00001000 /**< Application ID range start. */ -/**@} */ - -/**@defgroup NRF_FAULT_IDS Fault ID types - * @{ */ -#define NRF_FAULT_ID_SD_ASSERT (NRF_FAULT_ID_SD_RANGE_START + 1) /**< SoftDevice assertion. The info parameter is reserved for future used. */ -#define NRF_FAULT_ID_APP_MEMACC (NRF_FAULT_ID_APP_RANGE_START + 1) /**< Application invalid memory access. The info parameter will contain 0x00000000, - in case of SoftDevice RAM access violation. In case of SoftDevice peripheral - register violation the info parameter will contain the sub-region number of - PREGION[0], on whose address range the disallowed write access caused the - memory access fault. */ -/**@} */ - -/** @} */ - -/** @addtogroup NRF_SDM_ENUMS Enumerations - * @{ */ - -/**@brief nRF SoftDevice Manager API SVC numbers. */ -enum NRF_SD_SVCS -{ - SD_SOFTDEVICE_ENABLE = SDM_SVC_BASE, /**< ::sd_softdevice_enable */ - SD_SOFTDEVICE_DISABLE, /**< ::sd_softdevice_disable */ - SD_SOFTDEVICE_IS_ENABLED, /**< ::sd_softdevice_is_enabled */ - SD_SOFTDEVICE_VECTOR_TABLE_BASE_SET, /**< ::sd_softdevice_vector_table_base_set */ - SVC_SDM_LAST /**< Placeholder for last SDM SVC */ -}; - -/** @} */ - -/** @addtogroup NRF_SDM_DEFINES Defines - * @{ */ - -/**@defgroup NRF_CLOCK_LF_ACCURACY Clock accuracy - * @{ */ - -#define NRF_CLOCK_LF_ACCURACY_250_PPM (0) /**< Default: 250 ppm */ -#define NRF_CLOCK_LF_ACCURACY_500_PPM (1) /**< 500 ppm */ -#define NRF_CLOCK_LF_ACCURACY_150_PPM (2) /**< 150 ppm */ -#define NRF_CLOCK_LF_ACCURACY_100_PPM (3) /**< 100 ppm */ -#define NRF_CLOCK_LF_ACCURACY_75_PPM (4) /**< 75 ppm */ -#define NRF_CLOCK_LF_ACCURACY_50_PPM (5) /**< 50 ppm */ -#define NRF_CLOCK_LF_ACCURACY_30_PPM (6) /**< 30 ppm */ -#define NRF_CLOCK_LF_ACCURACY_20_PPM (7) /**< 20 ppm */ -#define NRF_CLOCK_LF_ACCURACY_10_PPM (8) /**< 10 ppm */ -#define NRF_CLOCK_LF_ACCURACY_5_PPM (9) /**< 5 ppm */ -#define NRF_CLOCK_LF_ACCURACY_2_PPM (10) /**< 2 ppm */ -#define NRF_CLOCK_LF_ACCURACY_1_PPM (11) /**< 1 ppm */ - -/** @} */ - -/**@defgroup NRF_CLOCK_LF_SRC Possible LFCLK oscillator sources - * @{ */ - -#define NRF_CLOCK_LF_SRC_RC (0) /**< LFCLK RC oscillator. */ -#define NRF_CLOCK_LF_SRC_XTAL (1) /**< LFCLK crystal oscillator. */ -#define NRF_CLOCK_LF_SRC_SYNTH (2) /**< LFCLK Synthesized from HFCLK. */ - -/** @} */ - -/** @} */ - -/** @addtogroup NRF_SDM_TYPES Types - * @{ */ - -/**@brief Type representing LFCLK oscillator source. */ -typedef struct -{ - uint8_t source; /**< LF oscillator clock source, see @ref NRF_CLOCK_LF_SRC. */ - uint8_t rc_ctiv; /**< Only for ::NRF_CLOCK_LF_SRC_RC: Calibration timer interval in 1/4 second - units (nRF52: 1-32). - @note To avoid excessive clock drift, 0.5 degrees Celsius is the - maximum temperature change allowed in one calibration timer - interval. The interval should be selected to ensure this. - - @note Must be 0 if source is not ::NRF_CLOCK_LF_SRC_RC. */ - uint8_t rc_temp_ctiv; /**< Only for ::NRF_CLOCK_LF_SRC_RC: How often (in number of calibration - intervals) the RC oscillator shall be calibrated if the temperature - hasn't changed. - 0: Always calibrate even if the temperature hasn't changed. - 1: Only calibrate if the temperature has changed (legacy - nRF51 only). - 2-33: Check the temperature and only calibrate if it has changed, - however calibration will take place every rc_temp_ctiv - intervals in any case. - - @note Must be 0 if source is not ::NRF_CLOCK_LF_SRC_RC. - - @note For nRF52, the application must ensure calibration at least once - every 8 seconds to ensure +/-500 ppm clock stability. The - recommended configuration for ::NRF_CLOCK_LF_SRC_RC on nRF52 is - rc_ctiv=16 and rc_temp_ctiv=2. This will ensure calibration at - least once every 8 seconds and for temperature changes of 0.5 - degrees Celsius every 4 seconds. See the Product Specification - for the nRF52 device being used for more information.*/ - uint8_t accuracy; /**< External clock accuracy used in the LL to compute timing - windows, see @ref NRF_CLOCK_LF_ACCURACY.*/ -} nrf_clock_lf_cfg_t; - -/**@brief Fault Handler type. - * - * When certain unrecoverable errors occur within the application or SoftDevice the fault handler will be called back. - * The protocol stack will be in an undefined state when this happens and the only way to recover will be to - * perform a reset, using e.g. CMSIS NVIC_SystemReset(). - * If the application returns from the fault handler the SoftDevice will call NVIC_SystemReset(). - * - * @note It is recommended to either perform a reset in the fault handler or to let the SoftDevice reset the device. - * Otherwise SoC peripherals may behave in an undefined way. For example, the RADIO peripherial may - * continously transmit packets. - * - * @note This callback is executed in HardFault context, thus SVC functions cannot be called from the fault callback. - * - * @param[in] id Fault identifier. See @ref NRF_FAULT_IDS. - * @param[in] pc The program counter of the instruction that triggered the fault. - * @param[in] info Optional additional information regarding the fault. Refer to each Fault identifier for details. - * - * @note When id is set to @ref NRF_FAULT_ID_APP_MEMACC, pc will contain the address of the instruction being executed at the time when - * the fault is detected by the CPU. The CPU program counter may have advanced up to 2 instructions (no branching) after the one that triggered the fault. - */ -typedef void (*nrf_fault_handler_t)(uint32_t id, uint32_t pc, uint32_t info); - -/** @} */ - -/** @addtogroup NRF_SDM_FUNCTIONS Functions - * @{ */ - -/**@brief Enables the SoftDevice and by extension the protocol stack. - * - * @note Some care must be taken if a low frequency clock source is already running when calling this function: - * If the LF clock has a different source then the one currently running, it will be stopped. Then, the new - * clock source will be started. - * - * @note This function has no effect when returning with an error. - * - * @post If return code is ::NRF_SUCCESS - * - SoC library and protocol stack APIs are made available. - * - A portion of RAM will be unavailable (see relevant SDS documentation). - * - Some peripherals will be unavailable or available only through the SoC API (see relevant SDS documentation). - * - Interrupts will not arrive from protected peripherals or interrupts. - * - nrf_nvic_ functions must be used instead of CMSIS NVIC_ functions for reliable usage of the SoftDevice. - * - Interrupt latency may be affected by the SoftDevice (see relevant SDS documentation). - * - Chosen low frequency clock source will be running. - * - * @param p_clock_lf_cfg Low frequency clock source and accuracy. - If NULL the clock will be configured as an RC source with rc_ctiv = 16 and .rc_temp_ctiv = 2 - In the case of XTAL source, the PPM accuracy of the chosen clock source must be greater than or equal to the actual characteristics of your XTAL clock. - * @param fault_handler Callback to be invoked in case of fault, cannot be NULL. - * - * @retval ::NRF_SUCCESS - * @retval ::NRF_ERROR_INVALID_ADDR Invalid or NULL pointer supplied. - * @retval ::NRF_ERROR_INVALID_STATE SoftDevice is already enabled, and the clock source and fault handler cannot be updated. - * @retval ::NRF_ERROR_SDM_INCORRECT_INTERRUPT_CONFIGURATION SoftDevice interrupt is already enabled, or an enabled interrupt has an illegal priority level. - * @retval ::NRF_ERROR_SDM_LFCLK_SOURCE_UNKNOWN Unknown low frequency clock source selected. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid clock source configuration supplied in p_clock_lf_cfg. - */ -SVCALL(SD_SOFTDEVICE_ENABLE, uint32_t, sd_softdevice_enable(nrf_clock_lf_cfg_t const * p_clock_lf_cfg, nrf_fault_handler_t fault_handler)); - - -/**@brief Disables the SoftDevice and by extension the protocol stack. - * - * Idempotent function to disable the SoftDevice. - * - * @post SoC library and protocol stack APIs are made unavailable. - * @post All interrupts that was protected by the SoftDevice will be disabled and initialized to priority 0 (highest). - * @post All peripherals used by the SoftDevice will be reset to default values. - * @post All of RAM become available. - * @post All interrupts are forwarded to the application. - * @post LFCLK source chosen in ::sd_softdevice_enable will be left running. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_SOFTDEVICE_DISABLE, uint32_t, sd_softdevice_disable(void)); - -/**@brief Check if the SoftDevice is enabled. - * - * @param[out] p_softdevice_enabled If the SoftDevice is enabled: 1 else 0. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_SOFTDEVICE_IS_ENABLED, uint32_t, sd_softdevice_is_enabled(uint8_t * p_softdevice_enabled)); - -/**@brief Sets the base address of the interrupt vector table for interrupts forwarded from the SoftDevice - * - * This function is only intended to be called when a bootloader is enabled. - * - * @param[in] address The base address of the interrupt vector table for forwarded interrupts. - - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_SOFTDEVICE_VECTOR_TABLE_BASE_SET, uint32_t, sd_softdevice_vector_table_base_set(uint32_t address)); - -/** @} */ - -#ifdef __cplusplus -} -#endif -#endif // NRF_SDM_H__ - -/** - @} -*/ diff --git a/lib/nrf52/s140_nrf52_7.3.0_API/include/nrf_soc.h b/lib/nrf52/s140_nrf52_7.3.0_API/include/nrf_soc.h deleted file mode 100755 index e1d11b5b..00000000 --- a/lib/nrf52/s140_nrf52_7.3.0_API/include/nrf_soc.h +++ /dev/null @@ -1,1080 +0,0 @@ -/* - * Copyright (c) Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * @defgroup nrf_soc_api SoC Library API - * @{ - * - * @brief APIs for the SoC library. - * - */ - -#ifndef NRF_SOC_H__ -#define NRF_SOC_H__ - -#include -#include "nrf.h" -#include "nrf_svc.h" -#include "nrf_error.h" -#include "nrf_error_soc.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/**@addtogroup NRF_SOC_DEFINES Defines - * @{ */ - -/**@brief The number of the lowest SVC number reserved for the SoC library. */ -#define SOC_SVC_BASE (0x20) /**< Base value for SVCs that are available when the SoftDevice is disabled. */ -#define SOC_SVC_BASE_NOT_AVAILABLE (0x2C) /**< Base value for SVCs that are not available when the SoftDevice is disabled. */ - -/**@brief Guaranteed time for application to process radio inactive notification. */ -#define NRF_RADIO_NOTIFICATION_INACTIVE_GUARANTEED_TIME_US (62) - -/**@brief The minimum allowed timeslot extension time. */ -#define NRF_RADIO_MINIMUM_TIMESLOT_LENGTH_EXTENSION_TIME_US (200) - -/**@brief The maximum processing time to handle a timeslot extension. */ -#define NRF_RADIO_MAX_EXTENSION_PROCESSING_TIME_US (20) - -/**@brief The latest time before the end of a timeslot the timeslot can be extended. */ -#define NRF_RADIO_MIN_EXTENSION_MARGIN_US (82) - -#define SOC_ECB_KEY_LENGTH (16) /**< ECB key length. */ -#define SOC_ECB_CLEARTEXT_LENGTH (16) /**< ECB cleartext length. */ -#define SOC_ECB_CIPHERTEXT_LENGTH (SOC_ECB_CLEARTEXT_LENGTH) /**< ECB ciphertext length. */ - -#define SD_EVT_IRQn (SWI2_IRQn) /**< SoftDevice Event IRQ number. Used for both protocol events and SoC events. */ -#define SD_EVT_IRQHandler (SWI2_IRQHandler) /**< SoftDevice Event IRQ handler. Used for both protocol events and SoC events. - The default interrupt priority for this handler is set to 6 */ -#define RADIO_NOTIFICATION_IRQn (SWI1_IRQn) /**< The radio notification IRQ number. */ -#define RADIO_NOTIFICATION_IRQHandler (SWI1_IRQHandler) /**< The radio notification IRQ handler. - The default interrupt priority for this handler is set to 6 */ -#define NRF_RADIO_LENGTH_MIN_US (100) /**< The shortest allowed radio timeslot, in microseconds. */ -#define NRF_RADIO_LENGTH_MAX_US (100000) /**< The longest allowed radio timeslot, in microseconds. */ - -#define NRF_RADIO_DISTANCE_MAX_US (128000000UL - 1UL) /**< The longest timeslot distance, in microseconds, allowed for the distance parameter (see @ref nrf_radio_request_normal_t) in the request. */ - -#define NRF_RADIO_EARLIEST_TIMEOUT_MAX_US (128000000UL - 1UL) /**< The longest timeout, in microseconds, allowed when requesting the earliest possible timeslot. */ - -#define NRF_RADIO_START_JITTER_US (2) /**< The maximum jitter in @ref NRF_RADIO_CALLBACK_SIGNAL_TYPE_START relative to the requested start time. */ - -/**@brief Mask of PPI channels reserved by the SoftDevice when the SoftDevice is disabled. */ -#define NRF_SOC_SD_PPI_CHANNELS_SD_DISABLED_MSK ((uint32_t)(0)) - -/**@brief Mask of PPI channels reserved by the SoftDevice when the SoftDevice is enabled. */ -#define NRF_SOC_SD_PPI_CHANNELS_SD_ENABLED_MSK ((uint32_t)( \ - (1U << 17) \ - | (1U << 18) \ - | (1U << 19) \ - | (1U << 20) \ - | (1U << 21) \ - | (1U << 22) \ - | (1U << 23) \ - | (1U << 24) \ - | (1U << 25) \ - | (1U << 26) \ - | (1U << 27) \ - | (1U << 28) \ - | (1U << 29) \ - | (1U << 30) \ - | (1U << 31) \ - )) - -/**@brief Mask of PPI groups reserved by the SoftDevice when the SoftDevice is disabled. */ -#define NRF_SOC_SD_PPI_GROUPS_SD_DISABLED_MSK ((uint32_t)(0)) - -/**@brief Mask of PPI groups reserved by the SoftDevice when the SoftDevice is enabled. */ -#define NRF_SOC_SD_PPI_GROUPS_SD_ENABLED_MSK ((uint32_t)( \ - (1U << 4) \ - | (1U << 5) \ - )) - -/**@} */ - -/**@addtogroup NRF_SOC_ENUMS Enumerations - * @{ */ - -/**@brief The SVC numbers used by the SVC functions in the SoC library. */ -enum NRF_SOC_SVCS -{ - SD_PPI_CHANNEL_ENABLE_GET = SOC_SVC_BASE, - SD_PPI_CHANNEL_ENABLE_SET = SOC_SVC_BASE + 1, - SD_PPI_CHANNEL_ENABLE_CLR = SOC_SVC_BASE + 2, - SD_PPI_CHANNEL_ASSIGN = SOC_SVC_BASE + 3, - SD_PPI_GROUP_TASK_ENABLE = SOC_SVC_BASE + 4, - SD_PPI_GROUP_TASK_DISABLE = SOC_SVC_BASE + 5, - SD_PPI_GROUP_ASSIGN = SOC_SVC_BASE + 6, - SD_PPI_GROUP_GET = SOC_SVC_BASE + 7, - SD_FLASH_PAGE_ERASE = SOC_SVC_BASE + 8, - SD_FLASH_WRITE = SOC_SVC_BASE + 9, - SD_PROTECTED_REGISTER_WRITE = SOC_SVC_BASE + 11, - SD_MUTEX_NEW = SOC_SVC_BASE_NOT_AVAILABLE, - SD_MUTEX_ACQUIRE = SOC_SVC_BASE_NOT_AVAILABLE + 1, - SD_MUTEX_RELEASE = SOC_SVC_BASE_NOT_AVAILABLE + 2, - SD_RAND_APPLICATION_POOL_CAPACITY_GET = SOC_SVC_BASE_NOT_AVAILABLE + 3, - SD_RAND_APPLICATION_BYTES_AVAILABLE_GET = SOC_SVC_BASE_NOT_AVAILABLE + 4, - SD_RAND_APPLICATION_VECTOR_GET = SOC_SVC_BASE_NOT_AVAILABLE + 5, - SD_POWER_MODE_SET = SOC_SVC_BASE_NOT_AVAILABLE + 6, - SD_POWER_SYSTEM_OFF = SOC_SVC_BASE_NOT_AVAILABLE + 7, - SD_POWER_RESET_REASON_GET = SOC_SVC_BASE_NOT_AVAILABLE + 8, - SD_POWER_RESET_REASON_CLR = SOC_SVC_BASE_NOT_AVAILABLE + 9, - SD_POWER_POF_ENABLE = SOC_SVC_BASE_NOT_AVAILABLE + 10, - SD_POWER_POF_THRESHOLD_SET = SOC_SVC_BASE_NOT_AVAILABLE + 11, - SD_POWER_POF_THRESHOLDVDDH_SET = SOC_SVC_BASE_NOT_AVAILABLE + 12, - SD_POWER_RAM_POWER_SET = SOC_SVC_BASE_NOT_AVAILABLE + 13, - SD_POWER_RAM_POWER_CLR = SOC_SVC_BASE_NOT_AVAILABLE + 14, - SD_POWER_RAM_POWER_GET = SOC_SVC_BASE_NOT_AVAILABLE + 15, - SD_POWER_GPREGRET_SET = SOC_SVC_BASE_NOT_AVAILABLE + 16, - SD_POWER_GPREGRET_CLR = SOC_SVC_BASE_NOT_AVAILABLE + 17, - SD_POWER_GPREGRET_GET = SOC_SVC_BASE_NOT_AVAILABLE + 18, - SD_POWER_DCDC_MODE_SET = SOC_SVC_BASE_NOT_AVAILABLE + 19, - SD_POWER_DCDC0_MODE_SET = SOC_SVC_BASE_NOT_AVAILABLE + 20, - SD_APP_EVT_WAIT = SOC_SVC_BASE_NOT_AVAILABLE + 21, - SD_CLOCK_HFCLK_REQUEST = SOC_SVC_BASE_NOT_AVAILABLE + 22, - SD_CLOCK_HFCLK_RELEASE = SOC_SVC_BASE_NOT_AVAILABLE + 23, - SD_CLOCK_HFCLK_IS_RUNNING = SOC_SVC_BASE_NOT_AVAILABLE + 24, - SD_RADIO_NOTIFICATION_CFG_SET = SOC_SVC_BASE_NOT_AVAILABLE + 25, - SD_ECB_BLOCK_ENCRYPT = SOC_SVC_BASE_NOT_AVAILABLE + 26, - SD_ECB_BLOCKS_ENCRYPT = SOC_SVC_BASE_NOT_AVAILABLE + 27, - SD_RADIO_SESSION_OPEN = SOC_SVC_BASE_NOT_AVAILABLE + 28, - SD_RADIO_SESSION_CLOSE = SOC_SVC_BASE_NOT_AVAILABLE + 29, - SD_RADIO_REQUEST = SOC_SVC_BASE_NOT_AVAILABLE + 30, - SD_EVT_GET = SOC_SVC_BASE_NOT_AVAILABLE + 31, - SD_TEMP_GET = SOC_SVC_BASE_NOT_AVAILABLE + 32, - SD_POWER_USBPWRRDY_ENABLE = SOC_SVC_BASE_NOT_AVAILABLE + 33, - SD_POWER_USBDETECTED_ENABLE = SOC_SVC_BASE_NOT_AVAILABLE + 34, - SD_POWER_USBREMOVED_ENABLE = SOC_SVC_BASE_NOT_AVAILABLE + 35, - SD_POWER_USBREGSTATUS_GET = SOC_SVC_BASE_NOT_AVAILABLE + 36, - SVC_SOC_LAST = SOC_SVC_BASE_NOT_AVAILABLE + 37 -}; - -/**@brief Possible values of a ::nrf_mutex_t. */ -enum NRF_MUTEX_VALUES -{ - NRF_MUTEX_FREE, - NRF_MUTEX_TAKEN -}; - -/**@brief Power modes. */ -enum NRF_POWER_MODES -{ - NRF_POWER_MODE_CONSTLAT, /**< Constant latency mode. See power management in the reference manual. */ - NRF_POWER_MODE_LOWPWR /**< Low power mode. See power management in the reference manual. */ -}; - - -/**@brief Power failure thresholds */ -enum NRF_POWER_THRESHOLDS -{ - NRF_POWER_THRESHOLD_V17 = 4UL, /**< 1.7 Volts power failure threshold. */ - NRF_POWER_THRESHOLD_V18, /**< 1.8 Volts power failure threshold. */ - NRF_POWER_THRESHOLD_V19, /**< 1.9 Volts power failure threshold. */ - NRF_POWER_THRESHOLD_V20, /**< 2.0 Volts power failure threshold. */ - NRF_POWER_THRESHOLD_V21, /**< 2.1 Volts power failure threshold. */ - NRF_POWER_THRESHOLD_V22, /**< 2.2 Volts power failure threshold. */ - NRF_POWER_THRESHOLD_V23, /**< 2.3 Volts power failure threshold. */ - NRF_POWER_THRESHOLD_V24, /**< 2.4 Volts power failure threshold. */ - NRF_POWER_THRESHOLD_V25, /**< 2.5 Volts power failure threshold. */ - NRF_POWER_THRESHOLD_V26, /**< 2.6 Volts power failure threshold. */ - NRF_POWER_THRESHOLD_V27, /**< 2.7 Volts power failure threshold. */ - NRF_POWER_THRESHOLD_V28 /**< 2.8 Volts power failure threshold. */ -}; - -/**@brief Power failure thresholds for high voltage */ -enum NRF_POWER_THRESHOLDVDDHS -{ - NRF_POWER_THRESHOLDVDDH_V27, /**< 2.7 Volts power failure threshold. */ - NRF_POWER_THRESHOLDVDDH_V28, /**< 2.8 Volts power failure threshold. */ - NRF_POWER_THRESHOLDVDDH_V29, /**< 2.9 Volts power failure threshold. */ - NRF_POWER_THRESHOLDVDDH_V30, /**< 3.0 Volts power failure threshold. */ - NRF_POWER_THRESHOLDVDDH_V31, /**< 3.1 Volts power failure threshold. */ - NRF_POWER_THRESHOLDVDDH_V32, /**< 3.2 Volts power failure threshold. */ - NRF_POWER_THRESHOLDVDDH_V33, /**< 3.3 Volts power failure threshold. */ - NRF_POWER_THRESHOLDVDDH_V34, /**< 3.4 Volts power failure threshold. */ - NRF_POWER_THRESHOLDVDDH_V35, /**< 3.5 Volts power failure threshold. */ - NRF_POWER_THRESHOLDVDDH_V36, /**< 3.6 Volts power failure threshold. */ - NRF_POWER_THRESHOLDVDDH_V37, /**< 3.7 Volts power failure threshold. */ - NRF_POWER_THRESHOLDVDDH_V38, /**< 3.8 Volts power failure threshold. */ - NRF_POWER_THRESHOLDVDDH_V39, /**< 3.9 Volts power failure threshold. */ - NRF_POWER_THRESHOLDVDDH_V40, /**< 4.0 Volts power failure threshold. */ - NRF_POWER_THRESHOLDVDDH_V41, /**< 4.1 Volts power failure threshold. */ - NRF_POWER_THRESHOLDVDDH_V42 /**< 4.2 Volts power failure threshold. */ -}; - - -/**@brief DC/DC converter modes. */ -enum NRF_POWER_DCDC_MODES -{ - NRF_POWER_DCDC_DISABLE, /**< The DCDC is disabled. */ - NRF_POWER_DCDC_ENABLE /**< The DCDC is enabled. */ -}; - -/**@brief Radio notification distances. */ -enum NRF_RADIO_NOTIFICATION_DISTANCES -{ - NRF_RADIO_NOTIFICATION_DISTANCE_NONE = 0, /**< The event does not have a notification. */ - NRF_RADIO_NOTIFICATION_DISTANCE_800US, /**< The distance from the active notification to start of radio activity. */ - NRF_RADIO_NOTIFICATION_DISTANCE_1740US, /**< The distance from the active notification to start of radio activity. */ - NRF_RADIO_NOTIFICATION_DISTANCE_2680US, /**< The distance from the active notification to start of radio activity. */ - NRF_RADIO_NOTIFICATION_DISTANCE_3620US, /**< The distance from the active notification to start of radio activity. */ - NRF_RADIO_NOTIFICATION_DISTANCE_4560US, /**< The distance from the active notification to start of radio activity. */ - NRF_RADIO_NOTIFICATION_DISTANCE_5500US /**< The distance from the active notification to start of radio activity. */ -}; - - -/**@brief Radio notification types. */ -enum NRF_RADIO_NOTIFICATION_TYPES -{ - NRF_RADIO_NOTIFICATION_TYPE_NONE = 0, /**< The event does not have a radio notification signal. */ - NRF_RADIO_NOTIFICATION_TYPE_INT_ON_ACTIVE, /**< Using interrupt for notification when the radio will be enabled. */ - NRF_RADIO_NOTIFICATION_TYPE_INT_ON_INACTIVE, /**< Using interrupt for notification when the radio has been disabled. */ - NRF_RADIO_NOTIFICATION_TYPE_INT_ON_BOTH, /**< Using interrupt for notification both when the radio will be enabled and disabled. */ -}; - -/**@brief The Radio signal callback types. */ -enum NRF_RADIO_CALLBACK_SIGNAL_TYPE -{ - NRF_RADIO_CALLBACK_SIGNAL_TYPE_START, /**< This signal indicates the start of the radio timeslot. */ - NRF_RADIO_CALLBACK_SIGNAL_TYPE_TIMER0, /**< This signal indicates the NRF_TIMER0 interrupt. */ - NRF_RADIO_CALLBACK_SIGNAL_TYPE_RADIO, /**< This signal indicates the NRF_RADIO interrupt. */ - NRF_RADIO_CALLBACK_SIGNAL_TYPE_EXTEND_FAILED, /**< This signal indicates extend action failed. */ - NRF_RADIO_CALLBACK_SIGNAL_TYPE_EXTEND_SUCCEEDED /**< This signal indicates extend action succeeded. */ -}; - -/**@brief The actions requested by the signal callback. - * - * This code gives the SOC instructions about what action to take when the signal callback has - * returned. - */ -enum NRF_RADIO_SIGNAL_CALLBACK_ACTION -{ - NRF_RADIO_SIGNAL_CALLBACK_ACTION_NONE, /**< Return without action. */ - NRF_RADIO_SIGNAL_CALLBACK_ACTION_EXTEND, /**< Request an extension of the current - timeslot. Maximum execution time for this action: - @ref NRF_RADIO_MAX_EXTENSION_PROCESSING_TIME_US. - This action must be started at least - @ref NRF_RADIO_MIN_EXTENSION_MARGIN_US before - the end of the timeslot. */ - NRF_RADIO_SIGNAL_CALLBACK_ACTION_END, /**< End the current radio timeslot. */ - NRF_RADIO_SIGNAL_CALLBACK_ACTION_REQUEST_AND_END /**< Request a new radio timeslot and end the current timeslot. */ -}; - -/**@brief Radio timeslot high frequency clock source configuration. */ -enum NRF_RADIO_HFCLK_CFG -{ - NRF_RADIO_HFCLK_CFG_XTAL_GUARANTEED, /**< The SoftDevice will guarantee that the high frequency clock source is the - external crystal for the whole duration of the timeslot. This should be the - preferred option for events that use the radio or require high timing accuracy. - @note The SoftDevice will automatically turn on and off the external crystal, - at the beginning and end of the timeslot, respectively. The crystal may also - intentionally be left running after the timeslot, in cases where it is needed - by the SoftDevice shortly after the end of the timeslot. */ - NRF_RADIO_HFCLK_CFG_NO_GUARANTEE /**< This configuration allows for earlier and tighter scheduling of timeslots. - The RC oscillator may be the clock source in part or for the whole duration of the timeslot. - The RC oscillator's accuracy must therefore be taken into consideration. - @note If the application will use the radio peripheral in timeslots with this configuration, - it must make sure that the crystal is running and stable before starting the radio. */ -}; - -/**@brief Radio timeslot priorities. */ -enum NRF_RADIO_PRIORITY -{ - NRF_RADIO_PRIORITY_HIGH, /**< High (equal priority as the normal connection priority of the SoftDevice stack(s)). */ - NRF_RADIO_PRIORITY_NORMAL, /**< Normal (equal priority as the priority of secondary activities of the SoftDevice stack(s)). */ -}; - -/**@brief Radio timeslot request type. */ -enum NRF_RADIO_REQUEST_TYPE -{ - NRF_RADIO_REQ_TYPE_EARLIEST, /**< Request radio timeslot as early as possible. This should always be used for the first request in a session. */ - NRF_RADIO_REQ_TYPE_NORMAL /**< Normal radio timeslot request. */ -}; - -/**@brief SoC Events. */ -enum NRF_SOC_EVTS -{ - NRF_EVT_HFCLKSTARTED, /**< Event indicating that the HFCLK has started. */ - NRF_EVT_POWER_FAILURE_WARNING, /**< Event indicating that a power failure warning has occurred. */ - NRF_EVT_FLASH_OPERATION_SUCCESS, /**< Event indicating that the ongoing flash operation has completed successfully. */ - NRF_EVT_FLASH_OPERATION_ERROR, /**< Event indicating that the ongoing flash operation has timed out with an error. */ - NRF_EVT_RADIO_BLOCKED, /**< Event indicating that a radio timeslot was blocked. */ - NRF_EVT_RADIO_CANCELED, /**< Event indicating that a radio timeslot was canceled by SoftDevice. */ - NRF_EVT_RADIO_SIGNAL_CALLBACK_INVALID_RETURN, /**< Event indicating that a radio timeslot signal callback handler return was invalid. */ - NRF_EVT_RADIO_SESSION_IDLE, /**< Event indicating that a radio timeslot session is idle. */ - NRF_EVT_RADIO_SESSION_CLOSED, /**< Event indicating that a radio timeslot session is closed. */ - NRF_EVT_POWER_USB_POWER_READY, /**< Event indicating that a USB 3.3 V supply is ready. */ - NRF_EVT_POWER_USB_DETECTED, /**< Event indicating that voltage supply is detected on VBUS. */ - NRF_EVT_POWER_USB_REMOVED, /**< Event indicating that voltage supply is removed from VBUS. */ - NRF_EVT_NUMBER_OF_EVTS -}; - -/**@} */ - - -/**@addtogroup NRF_SOC_STRUCTURES Structures - * @{ */ - -/**@brief Represents a mutex for use with the nrf_mutex functions. - * @note Accessing the value directly is not safe, use the mutex functions! - */ -typedef volatile uint8_t nrf_mutex_t; - -/**@brief Parameters for a request for a timeslot as early as possible. */ -typedef struct -{ - uint8_t hfclk; /**< High frequency clock source, see @ref NRF_RADIO_HFCLK_CFG. */ - uint8_t priority; /**< The radio timeslot priority, see @ref NRF_RADIO_PRIORITY. */ - uint32_t length_us; /**< The radio timeslot length (in the range 100 to 100,000] microseconds). */ - uint32_t timeout_us; /**< Longest acceptable delay until the start of the requested timeslot (up to @ref NRF_RADIO_EARLIEST_TIMEOUT_MAX_US microseconds). */ -} nrf_radio_request_earliest_t; - -/**@brief Parameters for a normal radio timeslot request. */ -typedef struct -{ - uint8_t hfclk; /**< High frequency clock source, see @ref NRF_RADIO_HFCLK_CFG. */ - uint8_t priority; /**< The radio timeslot priority, see @ref NRF_RADIO_PRIORITY. */ - uint32_t distance_us; /**< Distance from the start of the previous radio timeslot (up to @ref NRF_RADIO_DISTANCE_MAX_US microseconds). */ - uint32_t length_us; /**< The radio timeslot length (in the range [100..100,000] microseconds). */ -} nrf_radio_request_normal_t; - -/**@brief Radio timeslot request parameters. */ -typedef struct -{ - uint8_t request_type; /**< Type of request, see @ref NRF_RADIO_REQUEST_TYPE. */ - union - { - nrf_radio_request_earliest_t earliest; /**< Parameters for requesting a radio timeslot as early as possible. */ - nrf_radio_request_normal_t normal; /**< Parameters for requesting a normal radio timeslot. */ - } params; /**< Parameter union. */ -} nrf_radio_request_t; - -/**@brief Return parameters of the radio timeslot signal callback. */ -typedef struct -{ - uint8_t callback_action; /**< The action requested by the application when returning from the signal callback, see @ref NRF_RADIO_SIGNAL_CALLBACK_ACTION. */ - union - { - struct - { - nrf_radio_request_t * p_next; /**< The request parameters for the next radio timeslot. */ - } request; /**< Additional parameters for return_code @ref NRF_RADIO_SIGNAL_CALLBACK_ACTION_REQUEST_AND_END. */ - struct - { - uint32_t length_us; /**< Requested extension of the radio timeslot duration (microseconds) (for minimum time see @ref NRF_RADIO_MINIMUM_TIMESLOT_LENGTH_EXTENSION_TIME_US). */ - } extend; /**< Additional parameters for return_code @ref NRF_RADIO_SIGNAL_CALLBACK_ACTION_EXTEND. */ - } params; /**< Parameter union. */ -} nrf_radio_signal_callback_return_param_t; - -/**@brief The radio timeslot signal callback type. - * - * @note In case of invalid return parameters, the radio timeslot will automatically end - * immediately after returning from the signal callback and the - * @ref NRF_EVT_RADIO_SIGNAL_CALLBACK_INVALID_RETURN event will be sent. - * @note The returned struct pointer must remain valid after the signal callback - * function returns. For instance, this means that it must not point to a stack variable. - * - * @param[in] signal_type Type of signal, see @ref NRF_RADIO_CALLBACK_SIGNAL_TYPE. - * - * @return Pointer to structure containing action requested by the application. - */ -typedef nrf_radio_signal_callback_return_param_t * (*nrf_radio_signal_callback_t) (uint8_t signal_type); - -/**@brief AES ECB parameter typedefs */ -typedef uint8_t soc_ecb_key_t[SOC_ECB_KEY_LENGTH]; /**< Encryption key type. */ -typedef uint8_t soc_ecb_cleartext_t[SOC_ECB_CLEARTEXT_LENGTH]; /**< Cleartext data type. */ -typedef uint8_t soc_ecb_ciphertext_t[SOC_ECB_CIPHERTEXT_LENGTH]; /**< Ciphertext data type. */ - -/**@brief AES ECB data structure */ -typedef struct -{ - soc_ecb_key_t key; /**< Encryption key. */ - soc_ecb_cleartext_t cleartext; /**< Cleartext data. */ - soc_ecb_ciphertext_t ciphertext; /**< Ciphertext data. */ -} nrf_ecb_hal_data_t; - -/**@brief AES ECB block. Used to provide multiple blocks in a single call - to @ref sd_ecb_blocks_encrypt.*/ -typedef struct -{ - soc_ecb_key_t const * p_key; /**< Pointer to the Encryption key. */ - soc_ecb_cleartext_t const * p_cleartext; /**< Pointer to the Cleartext data. */ - soc_ecb_ciphertext_t * p_ciphertext; /**< Pointer to the Ciphertext data. */ -} nrf_ecb_hal_data_block_t; - -/**@} */ - -/**@addtogroup NRF_SOC_FUNCTIONS Functions - * @{ */ - -/**@brief Initialize a mutex. - * - * @param[in] p_mutex Pointer to the mutex to initialize. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_MUTEX_NEW, uint32_t, sd_mutex_new(nrf_mutex_t * p_mutex)); - -/**@brief Attempt to acquire a mutex. - * - * @param[in] p_mutex Pointer to the mutex to acquire. - * - * @retval ::NRF_SUCCESS The mutex was successfully acquired. - * @retval ::NRF_ERROR_SOC_MUTEX_ALREADY_TAKEN The mutex could not be acquired. - */ -SVCALL(SD_MUTEX_ACQUIRE, uint32_t, sd_mutex_acquire(nrf_mutex_t * p_mutex)); - -/**@brief Release a mutex. - * - * @param[in] p_mutex Pointer to the mutex to release. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_MUTEX_RELEASE, uint32_t, sd_mutex_release(nrf_mutex_t * p_mutex)); - -/**@brief Query the capacity of the application random pool. - * - * @param[out] p_pool_capacity The capacity of the pool. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_RAND_APPLICATION_POOL_CAPACITY_GET, uint32_t, sd_rand_application_pool_capacity_get(uint8_t * p_pool_capacity)); - -/**@brief Get number of random bytes available to the application. - * - * @param[out] p_bytes_available The number of bytes currently available in the pool. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_RAND_APPLICATION_BYTES_AVAILABLE_GET, uint32_t, sd_rand_application_bytes_available_get(uint8_t * p_bytes_available)); - -/**@brief Get random bytes from the application pool. - * - * @param[out] p_buff Pointer to unit8_t buffer for storing the bytes. - * @param[in] length Number of bytes to take from pool and place in p_buff. - * - * @retval ::NRF_SUCCESS The requested bytes were written to p_buff. - * @retval ::NRF_ERROR_SOC_RAND_NOT_ENOUGH_VALUES No bytes were written to the buffer, because there were not enough bytes available. -*/ -SVCALL(SD_RAND_APPLICATION_VECTOR_GET, uint32_t, sd_rand_application_vector_get(uint8_t * p_buff, uint8_t length)); - -/**@brief Gets the reset reason register. - * - * @param[out] p_reset_reason Contents of the NRF_POWER->RESETREAS register. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_POWER_RESET_REASON_GET, uint32_t, sd_power_reset_reason_get(uint32_t * p_reset_reason)); - -/**@brief Clears the bits of the reset reason register. - * - * @param[in] reset_reason_clr_msk Contains the bits to clear from the reset reason register. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_POWER_RESET_REASON_CLR, uint32_t, sd_power_reset_reason_clr(uint32_t reset_reason_clr_msk)); - -/**@brief Sets the power mode when in CPU sleep. - * - * @param[in] power_mode The power mode to use when in CPU sleep, see @ref NRF_POWER_MODES. @sa sd_app_evt_wait - * - * @retval ::NRF_SUCCESS The power mode was set. - * @retval ::NRF_ERROR_SOC_POWER_MODE_UNKNOWN The power mode was unknown. - */ -SVCALL(SD_POWER_MODE_SET, uint32_t, sd_power_mode_set(uint8_t power_mode)); - -/**@brief Puts the chip in System OFF mode. - * - * @retval ::NRF_ERROR_SOC_POWER_OFF_SHOULD_NOT_RETURN - */ -SVCALL(SD_POWER_SYSTEM_OFF, uint32_t, sd_power_system_off(void)); - -/**@brief Enables or disables the power-fail comparator. - * - * Enabling this will give a SoftDevice event (NRF_EVT_POWER_FAILURE_WARNING) when the power failure warning occurs. - * The event can be retrieved with sd_evt_get(); - * - * @param[in] pof_enable True if the power-fail comparator should be enabled, false if it should be disabled. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_POWER_POF_ENABLE, uint32_t, sd_power_pof_enable(uint8_t pof_enable)); - -/**@brief Enables or disables the USB power ready event. - * - * Enabling this will give a SoftDevice event (NRF_EVT_POWER_USB_POWER_READY) when a USB 3.3 V supply is ready. - * The event can be retrieved with sd_evt_get(); - * - * @param[in] usbpwrrdy_enable True if the power ready event should be enabled, false if it should be disabled. - * - * @note Calling this function on a chip without USBD peripheral will result in undefined behaviour. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_POWER_USBPWRRDY_ENABLE, uint32_t, sd_power_usbpwrrdy_enable(uint8_t usbpwrrdy_enable)); - -/**@brief Enables or disables the power USB-detected event. - * - * Enabling this will give a SoftDevice event (NRF_EVT_POWER_USB_DETECTED) when a voltage supply is detected on VBUS. - * The event can be retrieved with sd_evt_get(); - * - * @param[in] usbdetected_enable True if the power ready event should be enabled, false if it should be disabled. - * - * @note Calling this function on a chip without USBD peripheral will result in undefined behaviour. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_POWER_USBDETECTED_ENABLE, uint32_t, sd_power_usbdetected_enable(uint8_t usbdetected_enable)); - -/**@brief Enables or disables the power USB-removed event. - * - * Enabling this will give a SoftDevice event (NRF_EVT_POWER_USB_REMOVED) when a voltage supply is removed from VBUS. - * The event can be retrieved with sd_evt_get(); - * - * @param[in] usbremoved_enable True if the power ready event should be enabled, false if it should be disabled. - * - * @note Calling this function on a chip without USBD peripheral will result in undefined behaviour. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_POWER_USBREMOVED_ENABLE, uint32_t, sd_power_usbremoved_enable(uint8_t usbremoved_enable)); - -/**@brief Get USB supply status register content. - * - * @param[out] usbregstatus The content of USBREGSTATUS register. - * - * @note Calling this function on a chip without USBD peripheral will result in undefined behaviour. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_POWER_USBREGSTATUS_GET, uint32_t, sd_power_usbregstatus_get(uint32_t * usbregstatus)); - -/**@brief Sets the power failure comparator threshold value. - * - * @note: Power failure comparator threshold setting. This setting applies both for normal voltage - * mode (supply connected to both VDD and VDDH) and high voltage mode (supply connected to - * VDDH only). - * - * @param[in] threshold The power-fail threshold value to use, see @ref NRF_POWER_THRESHOLDS. - * - * @retval ::NRF_SUCCESS The power failure threshold was set. - * @retval ::NRF_ERROR_SOC_POWER_POF_THRESHOLD_UNKNOWN The power failure threshold is unknown. - */ -SVCALL(SD_POWER_POF_THRESHOLD_SET, uint32_t, sd_power_pof_threshold_set(uint8_t threshold)); - -/**@brief Sets the power failure comparator threshold value for high voltage. - * - * @note: Power failure comparator threshold setting for high voltage mode (supply connected to - * VDDH only). This setting does not apply for normal voltage mode (supply connected to both - * VDD and VDDH). - * - * @param[in] threshold The power-fail threshold value to use, see @ref NRF_POWER_THRESHOLDVDDHS. - * - * @retval ::NRF_SUCCESS The power failure threshold was set. - * @retval ::NRF_ERROR_SOC_POWER_POF_THRESHOLD_UNKNOWN The power failure threshold is unknown. - */ -SVCALL(SD_POWER_POF_THRESHOLDVDDH_SET, uint32_t, sd_power_pof_thresholdvddh_set(uint8_t threshold)); - -/**@brief Writes the NRF_POWER->RAM[index].POWERSET register. - * - * @param[in] index Contains the index in the NRF_POWER->RAM[index].POWERSET register to write to. - * @param[in] ram_powerset Contains the word to write to the NRF_POWER->RAM[index].POWERSET register. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_POWER_RAM_POWER_SET, uint32_t, sd_power_ram_power_set(uint8_t index, uint32_t ram_powerset)); - -/**@brief Writes the NRF_POWER->RAM[index].POWERCLR register. - * - * @param[in] index Contains the index in the NRF_POWER->RAM[index].POWERCLR register to write to. - * @param[in] ram_powerclr Contains the word to write to the NRF_POWER->RAM[index].POWERCLR register. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_POWER_RAM_POWER_CLR, uint32_t, sd_power_ram_power_clr(uint8_t index, uint32_t ram_powerclr)); - -/**@brief Get contents of NRF_POWER->RAM[index].POWER register, indicates power status of RAM[index] blocks. - * - * @param[in] index Contains the index in the NRF_POWER->RAM[index].POWER register to read from. - * @param[out] p_ram_power Content of NRF_POWER->RAM[index].POWER register. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_POWER_RAM_POWER_GET, uint32_t, sd_power_ram_power_get(uint8_t index, uint32_t * p_ram_power)); - -/**@brief Set bits in the general purpose retention registers (NRF_POWER->GPREGRET*). - * - * @param[in] gpregret_id 0 for GPREGRET, 1 for GPREGRET2. - * @param[in] gpregret_msk Bits to be set in the GPREGRET register. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_POWER_GPREGRET_SET, uint32_t, sd_power_gpregret_set(uint32_t gpregret_id, uint32_t gpregret_msk)); - -/**@brief Clear bits in the general purpose retention registers (NRF_POWER->GPREGRET*). - * - * @param[in] gpregret_id 0 for GPREGRET, 1 for GPREGRET2. - * @param[in] gpregret_msk Bits to be clear in the GPREGRET register. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_POWER_GPREGRET_CLR, uint32_t, sd_power_gpregret_clr(uint32_t gpregret_id, uint32_t gpregret_msk)); - -/**@brief Get contents of the general purpose retention registers (NRF_POWER->GPREGRET*). - * - * @param[in] gpregret_id 0 for GPREGRET, 1 for GPREGRET2. - * @param[out] p_gpregret Contents of the GPREGRET register. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_POWER_GPREGRET_GET, uint32_t, sd_power_gpregret_get(uint32_t gpregret_id, uint32_t *p_gpregret)); - -/**@brief Enable or disable the DC/DC regulator for the regulator stage 1 (REG1). - * - * @param[in] dcdc_mode The mode of the DCDC, see @ref NRF_POWER_DCDC_MODES. - * - * @retval ::NRF_SUCCESS - * @retval ::NRF_ERROR_INVALID_PARAM The DCDC mode is invalid. - */ -SVCALL(SD_POWER_DCDC_MODE_SET, uint32_t, sd_power_dcdc_mode_set(uint8_t dcdc_mode)); - -/**@brief Enable or disable the DC/DC regulator for the regulator stage 0 (REG0). - * - * For more details on the REG0 stage, please see product specification. - * - * @param[in] dcdc_mode The mode of the DCDC0, see @ref NRF_POWER_DCDC_MODES. - * - * @retval ::NRF_SUCCESS - * @retval ::NRF_ERROR_INVALID_PARAM The dcdc_mode is invalid. - */ -SVCALL(SD_POWER_DCDC0_MODE_SET, uint32_t, sd_power_dcdc0_mode_set(uint8_t dcdc_mode)); - -/**@brief Request the high frequency crystal oscillator. - * - * Will start the high frequency crystal oscillator, the startup time of the crystal varies - * and the ::sd_clock_hfclk_is_running function can be polled to check if it has started. - * - * @see sd_clock_hfclk_is_running - * @see sd_clock_hfclk_release - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_CLOCK_HFCLK_REQUEST, uint32_t, sd_clock_hfclk_request(void)); - -/**@brief Releases the high frequency crystal oscillator. - * - * Will stop the high frequency crystal oscillator, this happens immediately. - * - * @see sd_clock_hfclk_is_running - * @see sd_clock_hfclk_request - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_CLOCK_HFCLK_RELEASE, uint32_t, sd_clock_hfclk_release(void)); - -/**@brief Checks if the high frequency crystal oscillator is running. - * - * @see sd_clock_hfclk_request - * @see sd_clock_hfclk_release - * - * @param[out] p_is_running 1 if the external crystal oscillator is running, 0 if not. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_CLOCK_HFCLK_IS_RUNNING, uint32_t, sd_clock_hfclk_is_running(uint32_t * p_is_running)); - -/**@brief Waits for an application event. - * - * An application event is either an application interrupt or a pended interrupt when the interrupt - * is disabled. - * - * When the application waits for an application event by calling this function, an interrupt that - * is enabled will be taken immediately on pending since this function will wait in thread mode, - * then the execution will return in the application's main thread. - * - * In order to wake up from disabled interrupts, the SEVONPEND flag has to be set in the Cortex-M - * MCU's System Control Register (SCR), CMSIS_SCB. In that case, when a disabled interrupt gets - * pended, this function will return to the application's main thread. - * - * @note The application must ensure that the pended flag is cleared using ::sd_nvic_ClearPendingIRQ - * in order to sleep using this function. This is only necessary for disabled interrupts, as - * the interrupt handler will clear the pending flag automatically for enabled interrupts. - * - * @note If an application interrupt has happened since the last time sd_app_evt_wait was - * called this function will return immediately and not go to sleep. This is to avoid race - * conditions that can occur when a flag is updated in the interrupt handler and processed - * in the main loop. - * - * @post An application interrupt has happened or a interrupt pending flag is set. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_APP_EVT_WAIT, uint32_t, sd_app_evt_wait(void)); - -/**@brief Get PPI channel enable register contents. - * - * @param[out] p_channel_enable The contents of the PPI CHEN register. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_PPI_CHANNEL_ENABLE_GET, uint32_t, sd_ppi_channel_enable_get(uint32_t * p_channel_enable)); - -/**@brief Set PPI channel enable register. - * - * @param[in] channel_enable_set_msk Mask containing the bits to set in the PPI CHEN register. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_PPI_CHANNEL_ENABLE_SET, uint32_t, sd_ppi_channel_enable_set(uint32_t channel_enable_set_msk)); - -/**@brief Clear PPI channel enable register. - * - * @param[in] channel_enable_clr_msk Mask containing the bits to clear in the PPI CHEN register. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_PPI_CHANNEL_ENABLE_CLR, uint32_t, sd_ppi_channel_enable_clr(uint32_t channel_enable_clr_msk)); - -/**@brief Assign endpoints to a PPI channel. - * - * @param[in] channel_num Number of the PPI channel to assign. - * @param[in] evt_endpoint Event endpoint of the PPI channel. - * @param[in] task_endpoint Task endpoint of the PPI channel. - * - * @retval ::NRF_ERROR_SOC_PPI_INVALID_CHANNEL The channel number is invalid. - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_PPI_CHANNEL_ASSIGN, uint32_t, sd_ppi_channel_assign(uint8_t channel_num, const volatile void * evt_endpoint, const volatile void * task_endpoint)); - -/**@brief Task to enable a channel group. - * - * @param[in] group_num Number of the channel group. - * - * @retval ::NRF_ERROR_SOC_PPI_INVALID_GROUP The group number is invalid - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_PPI_GROUP_TASK_ENABLE, uint32_t, sd_ppi_group_task_enable(uint8_t group_num)); - -/**@brief Task to disable a channel group. - * - * @param[in] group_num Number of the PPI group. - * - * @retval ::NRF_ERROR_SOC_PPI_INVALID_GROUP The group number is invalid. - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_PPI_GROUP_TASK_DISABLE, uint32_t, sd_ppi_group_task_disable(uint8_t group_num)); - -/**@brief Assign PPI channels to a channel group. - * - * @param[in] group_num Number of the channel group. - * @param[in] channel_msk Mask of the channels to assign to the group. - * - * @retval ::NRF_ERROR_SOC_PPI_INVALID_GROUP The group number is invalid. - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_PPI_GROUP_ASSIGN, uint32_t, sd_ppi_group_assign(uint8_t group_num, uint32_t channel_msk)); - -/**@brief Gets the PPI channels of a channel group. - * - * @param[in] group_num Number of the channel group. - * @param[out] p_channel_msk Mask of the channels assigned to the group. - * - * @retval ::NRF_ERROR_SOC_PPI_INVALID_GROUP The group number is invalid. - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_PPI_GROUP_GET, uint32_t, sd_ppi_group_get(uint8_t group_num, uint32_t * p_channel_msk)); - -/**@brief Configures the Radio Notification signal. - * - * @note - * - The notification signal latency depends on the interrupt priority settings of SWI used - * for notification signal. - * - To ensure that the radio notification signal behaves in a consistent way, the radio - * notifications must be configured when there is no protocol stack or other SoftDevice - * activity in progress. It is recommended that the radio notification signal is - * configured directly after the SoftDevice has been enabled. - * - In the period between the ACTIVE signal and the start of the Radio Event, the SoftDevice - * will interrupt the application to do Radio Event preparation. - * - Using the Radio Notification feature may limit the bandwidth, as the SoftDevice may have - * to shorten the connection events to have time for the Radio Notification signals. - * - * @param[in] type Type of notification signal, see @ref NRF_RADIO_NOTIFICATION_TYPES. - * @ref NRF_RADIO_NOTIFICATION_TYPE_NONE shall be used to turn off radio - * notification. Using @ref NRF_RADIO_NOTIFICATION_DISTANCE_NONE is - * recommended (but not required) to be used with - * @ref NRF_RADIO_NOTIFICATION_TYPE_NONE. - * - * @param[in] distance Distance between the notification signal and start of radio activity, see @ref NRF_RADIO_NOTIFICATION_DISTANCES. - * This parameter is ignored when @ref NRF_RADIO_NOTIFICATION_TYPE_NONE or - * @ref NRF_RADIO_NOTIFICATION_TYPE_INT_ON_INACTIVE is used. - * - * @retval ::NRF_ERROR_INVALID_PARAM The group number is invalid. - * @retval ::NRF_ERROR_INVALID_STATE A protocol stack or other SoftDevice is running. Stop all - * running activities and retry. - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_RADIO_NOTIFICATION_CFG_SET, uint32_t, sd_radio_notification_cfg_set(uint8_t type, uint8_t distance)); - -/**@brief Encrypts a block according to the specified parameters. - * - * 128-bit AES encryption. - * - * @note: - * - The application may set the SEVONPEND bit in the SCR to 1 to make the SoftDevice sleep while - * the ECB is running. The SEVONPEND bit should only be cleared (set to 0) from application - * main or low interrupt level. - * - * @param[in, out] p_ecb_data Pointer to the ECB parameters' struct (two input - * parameters and one output parameter). - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_ECB_BLOCK_ENCRYPT, uint32_t, sd_ecb_block_encrypt(nrf_ecb_hal_data_t * p_ecb_data)); - -/**@brief Encrypts multiple data blocks provided as an array of data block structures. - * - * @details: Performs 128-bit AES encryption on multiple data blocks - * - * @note: - * - The application may set the SEVONPEND bit in the SCR to 1 to make the SoftDevice sleep while - * the ECB is running. The SEVONPEND bit should only be cleared (set to 0) from application - * main or low interrupt level. - * - * @param[in] block_count Count of blocks in the p_data_blocks array. - * @param[in,out] p_data_blocks Pointer to the first entry in a contiguous array of - * @ref nrf_ecb_hal_data_block_t structures. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_ECB_BLOCKS_ENCRYPT, uint32_t, sd_ecb_blocks_encrypt(uint8_t block_count, nrf_ecb_hal_data_block_t * p_data_blocks)); - -/**@brief Gets any pending events generated by the SoC API. - * - * The application should keep calling this function to get events, until ::NRF_ERROR_NOT_FOUND is returned. - * - * @param[out] p_evt_id Set to one of the values in @ref NRF_SOC_EVTS, if any events are pending. - * - * @retval ::NRF_SUCCESS An event was pending. The event id is written in the p_evt_id parameter. - * @retval ::NRF_ERROR_NOT_FOUND No pending events. - */ -SVCALL(SD_EVT_GET, uint32_t, sd_evt_get(uint32_t * p_evt_id)); - -/**@brief Get the temperature measured on the chip - * - * This function will block until the temperature measurement is done. - * It takes around 50 us from call to return. - * - * @param[out] p_temp Result of temperature measurement. Die temperature in 0.25 degrees Celsius. - * - * @retval ::NRF_SUCCESS A temperature measurement was done, and the temperature was written to temp - */ -SVCALL(SD_TEMP_GET, uint32_t, sd_temp_get(int32_t * p_temp)); - -/**@brief Flash Write -* -* Commands to write a buffer to flash -* -* If the SoftDevice is enabled: -* This call initiates the flash access command, and its completion will be communicated to the -* application with exactly one of the following events: -* - @ref NRF_EVT_FLASH_OPERATION_SUCCESS - The command was successfully completed. -* - @ref NRF_EVT_FLASH_OPERATION_ERROR - The command could not be started. -* -* If the SoftDevice is not enabled no event will be generated, and this call will return @ref NRF_SUCCESS when the - * write has been completed -* -* @note -* - This call takes control over the radio and the CPU during flash erase and write to make sure that -* they will not interfere with the flash access. This means that all interrupts will be blocked -* for a predictable time (depending on the NVMC specification in the device's Product Specification -* and the command parameters). -* - The data in the p_src buffer should not be modified before the @ref NRF_EVT_FLASH_OPERATION_SUCCESS -* or the @ref NRF_EVT_FLASH_OPERATION_ERROR have been received if the SoftDevice is enabled. -* - This call will make the SoftDevice trigger a hardfault when the page is written, if it is -* protected. -* -* -* @param[in] p_dst Pointer to start of flash location to be written. -* @param[in] p_src Pointer to buffer with data to be written. -* @param[in] size Number of 32-bit words to write. Maximum size is the number of words in one -* flash page. See the device's Product Specification for details. -* -* @retval ::NRF_ERROR_INVALID_ADDR Tried to write to a non existing flash address, or p_dst or p_src was unaligned. -* @retval ::NRF_ERROR_BUSY The previous command has not yet completed. -* @retval ::NRF_ERROR_INVALID_LENGTH Size was 0, or higher than the maximum allowed size. -* @retval ::NRF_ERROR_FORBIDDEN Tried to write to an address outside the application flash area. -* @retval ::NRF_SUCCESS The command was accepted. -*/ -SVCALL(SD_FLASH_WRITE, uint32_t, sd_flash_write(uint32_t * p_dst, uint32_t const * p_src, uint32_t size)); - - -/**@brief Flash Erase page -* -* Commands to erase a flash page -* If the SoftDevice is enabled: -* This call initiates the flash access command, and its completion will be communicated to the -* application with exactly one of the following events: -* - @ref NRF_EVT_FLASH_OPERATION_SUCCESS - The command was successfully completed. -* - @ref NRF_EVT_FLASH_OPERATION_ERROR - The command could not be started. -* -* If the SoftDevice is not enabled no event will be generated, and this call will return @ref NRF_SUCCESS when the -* erase has been completed -* -* @note -* - This call takes control over the radio and the CPU during flash erase and write to make sure that -* they will not interfere with the flash access. This means that all interrupts will be blocked -* for a predictable time (depending on the NVMC specification in the device's Product Specification -* and the command parameters). -* - This call will make the SoftDevice trigger a hardfault when the page is erased, if it is -* protected. -* -* -* @param[in] page_number Page number of the page to erase -* -* @retval ::NRF_ERROR_INTERNAL If a new session could not be opened due to an internal error. -* @retval ::NRF_ERROR_INVALID_ADDR Tried to erase to a non existing flash page. -* @retval ::NRF_ERROR_BUSY The previous command has not yet completed. -* @retval ::NRF_ERROR_FORBIDDEN Tried to erase a page outside the application flash area. -* @retval ::NRF_SUCCESS The command was accepted. -*/ -SVCALL(SD_FLASH_PAGE_ERASE, uint32_t, sd_flash_page_erase(uint32_t page_number)); - - - -/**@brief Opens a session for radio timeslot requests. - * - * @note Only one session can be open at a time. - * @note p_radio_signal_callback(@ref NRF_RADIO_CALLBACK_SIGNAL_TYPE_START) will be called when the radio timeslot - * starts. From this point the NRF_RADIO and NRF_TIMER0 peripherals can be freely accessed - * by the application. - * @note p_radio_signal_callback(@ref NRF_RADIO_CALLBACK_SIGNAL_TYPE_TIMER0) is called whenever the NRF_TIMER0 - * interrupt occurs. - * @note p_radio_signal_callback(@ref NRF_RADIO_CALLBACK_SIGNAL_TYPE_RADIO) is called whenever the NRF_RADIO - * interrupt occurs. - * @note p_radio_signal_callback() will be called at ARM interrupt priority level 0. This - * implies that none of the sd_* API calls can be used from p_radio_signal_callback(). - * - * @param[in] p_radio_signal_callback The signal callback. - * - * @retval ::NRF_ERROR_INVALID_ADDR p_radio_signal_callback is an invalid function pointer. - * @retval ::NRF_ERROR_BUSY If session cannot be opened. - * @retval ::NRF_ERROR_INTERNAL If a new session could not be opened due to an internal error. - * @retval ::NRF_SUCCESS Otherwise. - */ - SVCALL(SD_RADIO_SESSION_OPEN, uint32_t, sd_radio_session_open(nrf_radio_signal_callback_t p_radio_signal_callback)); - -/**@brief Closes a session for radio timeslot requests. - * - * @note Any current radio timeslot will be finished before the session is closed. - * @note If a radio timeslot is scheduled when the session is closed, it will be canceled. - * @note The application cannot consider the session closed until the @ref NRF_EVT_RADIO_SESSION_CLOSED - * event is received. - * - * @retval ::NRF_ERROR_FORBIDDEN If session not opened. - * @retval ::NRF_ERROR_BUSY If session is currently being closed. - * @retval ::NRF_SUCCESS Otherwise. - */ - SVCALL(SD_RADIO_SESSION_CLOSE, uint32_t, sd_radio_session_close(void)); - -/**@brief Requests a radio timeslot. - * - * @note The request type is determined by p_request->request_type, and can be one of @ref NRF_RADIO_REQ_TYPE_EARLIEST - * and @ref NRF_RADIO_REQ_TYPE_NORMAL. The first request in a session must always be of type @ref NRF_RADIO_REQ_TYPE_EARLIEST. - * @note For a normal request (@ref NRF_RADIO_REQ_TYPE_NORMAL), the start time of a radio timeslot is specified by - * p_request->distance_us and is given relative to the start of the previous timeslot. - * @note A too small p_request->distance_us will lead to a @ref NRF_EVT_RADIO_BLOCKED event. - * @note Timeslots scheduled too close will lead to a @ref NRF_EVT_RADIO_BLOCKED event. - * @note See the SoftDevice Specification for more on radio timeslot scheduling, distances and lengths. - * @note If an opportunity for the first radio timeslot is not found before 100 ms after the call to this - * function, it is not scheduled, and instead a @ref NRF_EVT_RADIO_BLOCKED event is sent. - * The application may then try to schedule the first radio timeslot again. - * @note Successful requests will result in nrf_radio_signal_callback_t(@ref NRF_RADIO_CALLBACK_SIGNAL_TYPE_START). - * Unsuccessful requests will result in a @ref NRF_EVT_RADIO_BLOCKED event, see @ref NRF_SOC_EVTS. - * @note The jitter in the start time of the radio timeslots is +/- @ref NRF_RADIO_START_JITTER_US us. - * @note The nrf_radio_signal_callback_t(@ref NRF_RADIO_CALLBACK_SIGNAL_TYPE_START) call has a latency relative to the - * specified radio timeslot start, but this does not affect the actual start time of the timeslot. - * @note NRF_TIMER0 is reset at the start of the radio timeslot, and is clocked at 1MHz from the high frequency - * (16 MHz) clock source. If p_request->hfclk_force_xtal is true, the high frequency clock is - * guaranteed to be clocked from the external crystal. - * @note The SoftDevice will neither access the NRF_RADIO peripheral nor the NRF_TIMER0 peripheral - * during the radio timeslot. - * - * @param[in] p_request Pointer to the request parameters. - * - * @retval ::NRF_ERROR_FORBIDDEN Either: - * - The session is not open. - * - The session is not IDLE. - * - This is the first request and its type is not @ref NRF_RADIO_REQ_TYPE_EARLIEST. - * - The request type was set to @ref NRF_RADIO_REQ_TYPE_NORMAL after a - * @ref NRF_RADIO_REQ_TYPE_EARLIEST request was blocked. - * @retval ::NRF_ERROR_INVALID_ADDR If the p_request pointer is invalid. - * @retval ::NRF_ERROR_INVALID_PARAM If the parameters of p_request are not valid. - * @retval ::NRF_SUCCESS Otherwise. - */ - SVCALL(SD_RADIO_REQUEST, uint32_t, sd_radio_request(nrf_radio_request_t const * p_request)); - -/**@brief Write register protected by the SoftDevice - * - * This function writes to a register that is write-protected by the SoftDevice. Please refer to your - * SoftDevice Specification for more details about which registers that are protected by SoftDevice. - * This function can write to the following protected peripheral: - * - ACL - * - * @note Protected registers may be read directly. - * @note Register that are write-once will return @ref NRF_SUCCESS on second set, even the value in - * the register has not changed. See the Product Specification for more details about register - * properties. - * - * @param[in] p_register Pointer to register to be written. - * @param[in] value Value to be written to the register. - * - * @retval ::NRF_ERROR_INVALID_ADDR This function can not write to the reguested register. - * @retval ::NRF_SUCCESS Value successfully written to register. - * - */ -SVCALL(SD_PROTECTED_REGISTER_WRITE, uint32_t, sd_protected_register_write(volatile uint32_t * p_register, uint32_t value)); - -/**@} */ - -#ifdef __cplusplus -} -#endif -#endif // NRF_SOC_H__ - -/**@} */ diff --git a/lib/nrf52/s140_nrf52_7.3.0_API/include/nrf_svc.h b/lib/nrf52/s140_nrf52_7.3.0_API/include/nrf_svc.h deleted file mode 100755 index d9705614..00000000 --- a/lib/nrf52/s140_nrf52_7.3.0_API/include/nrf_svc.h +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (c) Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef NRF_SVC__ -#define NRF_SVC__ - -#include "stdint.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** @brief Supervisor call declaration. - * - * A call to a function marked with @ref SVCALL, will trigger a Supervisor Call (SVC) Exception. - * The SVCs with SVC numbers 0x00-0x0F are forwared to the application. All other SVCs are handled by the SoftDevice. - * - * @param[in] number The SVC number to be used. - * @param[in] return_type The return type of the SVC function. - * @param[in] signature Function signature. The function can have at most four arguments. - */ - -#ifdef SVCALL_AS_NORMAL_FUNCTION -#define SVCALL(number, return_type, signature) return_type signature -#else - -#ifndef SVCALL -#if defined (__CC_ARM) -#define SVCALL(number, return_type, signature) return_type __svc(number) signature -#elif defined (__GNUC__) -#ifdef __cplusplus -#define GCC_CAST_CPP (uint16_t) -#else -#define GCC_CAST_CPP -#endif -#define SVCALL(number, return_type, signature) \ - _Pragma("GCC diagnostic push") \ - _Pragma("GCC diagnostic ignored \"-Wreturn-type\"") \ - __attribute__((naked)) \ - __attribute__((unused)) \ - static return_type signature \ - { \ - __asm( \ - "svc %0\n" \ - "bx r14" : : "I" (GCC_CAST_CPP number) : "r0" \ - ); \ - } \ - _Pragma("GCC diagnostic pop") - -#elif defined (__ICCARM__) -#define PRAGMA(x) _Pragma(#x) -#define SVCALL(number, return_type, signature) \ -PRAGMA(swi_number = (number)) \ - __swi return_type signature; -#else -#define SVCALL(number, return_type, signature) return_type signature -#endif -#endif // SVCALL - -#endif // SVCALL_AS_NORMAL_FUNCTION - -#ifdef __cplusplus -} -#endif -#endif // NRF_SVC__ diff --git a/patch_nrf52_bsp.py b/patch_nrf52_bsp.py deleted file mode 100644 index 8d2f3d8e..00000000 --- a/patch_nrf52_bsp.py +++ /dev/null @@ -1,66 +0,0 @@ -""" -patch_nrf52_bsp.py — Pre-build BSP patches for nRF52 Meck builds - -Patches the Adafruit nRF52 BSP's LittleFS File class to add a default -constructor. BSP 1.7.0 removed the default File() constructor, but the -Meck screen headers (NotesScreen, TextReaderScreen, EpubZipReader) have -File member variables that need default construction. - -Runs automatically before each build via extra_scripts in platformio.ini. -Idempotent — safe to run repeatedly. -""" -Import("env") -import os - -framework_dir = env.PioPlatform().get_package_dir("framework-arduinoadafruitnrf52") -lfs_src = os.path.join(framework_dir, "libraries", "Adafruit_LittleFS", "src") - -# ------------------------------------------------------------------------- -# 1. Patch header: add File() default constructor declaration -# ------------------------------------------------------------------------- -header_path = os.path.join(lfs_src, "Adafruit_LittleFS_File.h") - -with open(header_path, "r") as f: - h = f.read() - -if "File ();" not in h and "File();" not in h: - h = h.replace( - "File (Adafruit_LittleFS &fs);", - "File (Adafruit_LittleFS &fs);\n File (); // Meck nRF52 compat" - ) - with open(header_path, "w") as f: - f.write(h) - print("LittleFS File patch: Added default constructor declaration") -else: - print("LittleFS File patch: OK - header already patched") - -# ------------------------------------------------------------------------- -# 2. Patch source: add File() default constructor implementation -# Uses C++11 delegating constructor → File(InternalFS) -# ------------------------------------------------------------------------- -source_path = os.path.join(lfs_src, "Adafruit_LittleFS_File.cpp") - -with open(source_path, "r") as f: - s = f.read() - -if "File::File()" not in s: - # Locate InternalFileSystem header (Adafruit BSP has a known typo: "Sytem") - ifs_include = None - for dirname in ["InternalFileSytem", "InternalFileSystem"]: - candidate = os.path.join(framework_dir, "libraries", dirname, "src") - if os.path.isdir(candidate): - rel = os.path.relpath(candidate, lfs_src).replace("\\", "/") - ifs_include = rel + "/InternalFileSystem.h" - break - - if ifs_include: - s += "\n// Meck nRF52 compat: default File() constructor\n" - s += '#include "' + ifs_include + '"\n' - s += "File::File() : File(InternalFS) {}\n" - with open(source_path, "w") as f: - f.write(s) - print("LittleFS File patch: Added default constructor implementation") - else: - print("LittleFS File patch: WARNING - could not find InternalFileSystem") -else: - print("LittleFS File patch: OK - source already patched") diff --git a/platformio.ini b/platformio.ini index 4e3954ca..ccd06b51 100644 --- a/platformio.ini +++ b/platformio.ini @@ -74,23 +74,6 @@ lib_deps = extends = esp32_base platform = https://github.com/pioarduino/platform-espressif32/releases/download/53.03.13-1/platform-espressif32.zip -; ----------------- NRF52 --------------------- - -[nrf52_base] -extends = arduino_base -platform = nordicnrf52 -platform_packages = - framework-arduinoadafruitnrf52 @ 1.10700.0 -extra_scripts = - create-uf2.py - arch/nrf52/extra_scripts/patch_bluefruit.py -build_flags = ${arduino_base.build_flags} - -D NRF52_PLATFORM - -D LFS_NO_ASSERT=1 - -D EXTRAFS=1 -lib_deps = - ${arduino_base.lib_deps} - https://github.com/oltaco/CustomLFS @ 0.2.1 ; ----------------- RP2040 --------------------- [rp2040_base] diff --git a/src/helpers/ArduinoSerialInterface.h b/src/helpers/ArduinoSerialInterface.h index c4086353..86239f68 100644 --- a/src/helpers/ArduinoSerialInterface.h +++ b/src/helpers/ArduinoSerialInterface.h @@ -16,9 +16,6 @@ public: void begin(Stream& serial) { _serial = &serial; - #ifdef RAK_4631 - pinMode(WB_IO2, OUTPUT); - #endif } // BaseSerialInterface methods diff --git a/src/helpers/ClientACL.cpp b/src/helpers/ClientACL.cpp index 061111a0..a1d91fe1 100644 --- a/src/helpers/ClientACL.cpp +++ b/src/helpers/ClientACL.cpp @@ -1,7 +1,7 @@ #include "ClientACL.h" static File openWrite(FILESYSTEM* _fs, const char* filename) { - #if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM) + #if defined(STM32_PLATFORM) _fs->remove(filename); return _fs->open(filename, FILE_O_WRITE); #elif defined(RP2040_PLATFORM) diff --git a/src/helpers/CommonCLI.cpp b/src/helpers/CommonCLI.cpp index 56b0e080..5b716c03 100644 --- a/src/helpers/CommonCLI.cpp +++ b/src/helpers/CommonCLI.cpp @@ -120,7 +120,7 @@ void CommonCLI::loadPrefsInt(FILESYSTEM* fs, const char* filename) { } void CommonCLI::savePrefs(FILESYSTEM* fs) { -#if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM) +#if defined(STM32_PLATFORM) fs->remove("/com_prefs"); File file = fs->open("/com_prefs", FILE_O_WRITE); #elif defined(RP2040_PLATFORM) @@ -378,31 +378,13 @@ void CommonCLI::handleCommand(uint32_t sender_timestamp, const char* command, ch } // Power management commands } else if (memcmp(config, "pwrmgt.support", 14) == 0) { -#ifdef NRF52_POWER_MANAGEMENT - strcpy(reply, "> supported"); -#else strcpy(reply, "> unsupported"); -#endif } else if (memcmp(config, "pwrmgt.source", 13) == 0) { -#ifdef NRF52_POWER_MANAGEMENT - strcpy(reply, _board->isExternalPowered() ? "> external" : "> battery"); -#else strcpy(reply, "ERROR: Power management not supported"); -#endif } else if (memcmp(config, "pwrmgt.bootreason", 17) == 0) { -#ifdef NRF52_POWER_MANAGEMENT - sprintf(reply, "> Reset: %s; Shutdown: %s", - _board->getResetReasonString(_board->getResetReason()), - _board->getShutdownReasonString(_board->getShutdownReason())); -#else strcpy(reply, "ERROR: Power management not supported"); -#endif } else if (memcmp(config, "pwrmgt.bootmv", 13) == 0) { -#ifdef NRF52_POWER_MANAGEMENT - sprintf(reply, "> %u mV", _board->getBootVoltage()); -#else strcpy(reply, "ERROR: Power management not supported"); -#endif } else { sprintf(reply, "??: %s", config); } diff --git a/src/helpers/ESP32Board.h b/src/helpers/ESP32Board.h index e99487f4..e2ee26aa 100644 --- a/src/helpers/ESP32Board.h +++ b/src/helpers/ESP32Board.h @@ -63,13 +63,6 @@ public: esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON); esp_sleep_enable_ext1_wakeup((1ULL << P_LORA_DIO_1), ESP_EXT1_WAKEUP_ANY_HIGH); // Wake on LoRa packet - // T5S3: Also wake on boot button press (GPIO0, active LOW). - // gpio_wakeup uses level trigger — works for light sleep only. -#if defined(LilyGo_T5S3_EPaper_Pro) && defined(PIN_USER_BTN) - gpio_wakeup_enable((gpio_num_t)PIN_USER_BTN, GPIO_INTR_LOW_LEVEL); - esp_sleep_enable_gpio_wakeup(); -#endif - if (secs > 0) { esp_sleep_enable_timer_wakeup(secs * 1000000ULL); // Timer wake (microseconds) } diff --git a/src/helpers/IdentityStore.cpp b/src/helpers/IdentityStore.cpp index dc85d69c..83d1e0f1 100644 --- a/src/helpers/IdentityStore.cpp +++ b/src/helpers/IdentityStore.cpp @@ -46,7 +46,7 @@ bool IdentityStore::save(const char *name, const mesh::LocalIdentity& id) { char filename[40]; sprintf(filename, "%s/%s.id", _dir, name); -#if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM) +#if defined(STM32_PLATFORM) _fs->remove(filename); File file = _fs->open(filename, FILE_O_WRITE); #elif defined(RP2040_PLATFORM) @@ -68,7 +68,7 @@ bool IdentityStore::save(const char *name, const mesh::LocalIdentity& id, const char filename[40]; sprintf(filename, "%s/%s.id", _dir, name); -#if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM) +#if defined(STM32_PLATFORM) _fs->remove(filename); File file = _fs->open(filename, FILE_O_WRITE); #elif defined(RP2040_PLATFORM) diff --git a/src/helpers/IdentityStore.h b/src/helpers/IdentityStore.h index d0d7ee45..ea93176c 100644 --- a/src/helpers/IdentityStore.h +++ b/src/helpers/IdentityStore.h @@ -3,7 +3,7 @@ #if defined(ESP32) || defined(RP2040_PLATFORM) #include #define FILESYSTEM fs::FS -#elif defined(NRF52_PLATFORM) || defined(STM32_PLATFORM) +#elif defined(STM32_PLATFORM) #include #define FILESYSTEM Adafruit_LittleFS diff --git a/src/helpers/NRF52Board.cpp b/src/helpers/NRF52Board.cpp deleted file mode 100644 index 1303d5be..00000000 --- a/src/helpers/NRF52Board.cpp +++ /dev/null @@ -1,321 +0,0 @@ -#if defined(NRF52_PLATFORM) -#include "NRF52Board.h" - -#include -#include - -static BLEDfu bledfu; - -static void connect_callback(uint16_t conn_handle) { - (void)conn_handle; - MESH_DEBUG_PRINTLN("BLE client connected"); -} - -static void disconnect_callback(uint16_t conn_handle, uint8_t reason) { - (void)conn_handle; - (void)reason; - - MESH_DEBUG_PRINTLN("BLE client disconnected"); -} - -void NRF52Board::begin() { - startup_reason = BD_STARTUP_NORMAL; -} - -#ifdef NRF52_POWER_MANAGEMENT -#include "nrf.h" - -// Power Management global variables -uint32_t g_nrf52_reset_reason = 0; // Reset/Startup reason -uint8_t g_nrf52_shutdown_reason = 0; // Shutdown reason - -// Early constructor - runs before SystemInit() clears the registers -// Priority 101 ensures this runs before SystemInit (102) and before -// any C++ static constructors (default 65535) -static void __attribute__((constructor(101))) nrf52_early_reset_capture() { - g_nrf52_reset_reason = NRF_POWER->RESETREAS; - g_nrf52_shutdown_reason = NRF_POWER->GPREGRET2; -} - -void NRF52Board::initPowerMgr() { - // Copy early-captured register values - reset_reason = g_nrf52_reset_reason; - shutdown_reason = g_nrf52_shutdown_reason; - boot_voltage_mv = 0; // Will be set by checkBootVoltage() - - // Clear registers for next boot - // Note: At this point SoftDevice may or may not be enabled - uint8_t sd_enabled = 0; - sd_softdevice_is_enabled(&sd_enabled); - if (sd_enabled) { - sd_power_reset_reason_clr(0xFFFFFFFF); - sd_power_gpregret_clr(1, 0xFF); - } else { - NRF_POWER->RESETREAS = 0xFFFFFFFF; // Write 1s to clear - NRF_POWER->GPREGRET2 = 0; - } - - // Log reset/shutdown info - if (shutdown_reason != SHUTDOWN_REASON_NONE) { - MESH_DEBUG_PRINTLN("PWRMGT: Reset = %s (0x%lX); Shutdown = %s (0x%02X)", - getResetReasonString(reset_reason), (unsigned long)reset_reason, - getShutdownReasonString(shutdown_reason), shutdown_reason); - } else { - MESH_DEBUG_PRINTLN("PWRMGT: Reset = %s (0x%lX)", - getResetReasonString(reset_reason), (unsigned long)reset_reason); - } -} - -bool NRF52Board::isExternalPowered() { - // Check if SoftDevice is enabled before using its API - uint8_t sd_enabled = 0; - sd_softdevice_is_enabled(&sd_enabled); - - if (sd_enabled) { - uint32_t usb_status; - sd_power_usbregstatus_get(&usb_status); - return (usb_status & POWER_USBREGSTATUS_VBUSDETECT_Msk) != 0; - } else { - return (NRF_POWER->USBREGSTATUS & POWER_USBREGSTATUS_VBUSDETECT_Msk) != 0; - } -} - -const char* NRF52Board::getResetReasonString(uint32_t reason) { - if (reason & POWER_RESETREAS_RESETPIN_Msk) return "Reset Pin"; - if (reason & POWER_RESETREAS_DOG_Msk) return "Watchdog"; - if (reason & POWER_RESETREAS_SREQ_Msk) return "Soft Reset"; - if (reason & POWER_RESETREAS_LOCKUP_Msk) return "CPU Lockup"; - #ifdef POWER_RESETREAS_LPCOMP_Msk - if (reason & POWER_RESETREAS_LPCOMP_Msk) return "Wake from LPCOMP"; - #endif - #ifdef POWER_RESETREAS_VBUS_Msk - if (reason & POWER_RESETREAS_VBUS_Msk) return "Wake from VBUS"; - #endif - #ifdef POWER_RESETREAS_OFF_Msk - if (reason & POWER_RESETREAS_OFF_Msk) return "Wake from GPIO"; - #endif - #ifdef POWER_RESETREAS_DIF_Msk - if (reason & POWER_RESETREAS_DIF_Msk) return "Debug Interface"; - #endif - return "Cold Boot"; -} - -const char* NRF52Board::getShutdownReasonString(uint8_t reason) { - switch (reason) { - case SHUTDOWN_REASON_LOW_VOLTAGE: return "Low Voltage"; - case SHUTDOWN_REASON_USER: return "User Request"; - case SHUTDOWN_REASON_BOOT_PROTECT: return "Boot Protection"; - } - return "Unknown"; -} - -bool NRF52Board::checkBootVoltage(const PowerMgtConfig* config) { - initPowerMgr(); - - // Read boot voltage - boot_voltage_mv = getBattMilliVolts(); - - if (config->voltage_bootlock == 0) return true; // Protection disabled - - // Skip check if externally powered - if (isExternalPowered()) { - MESH_DEBUG_PRINTLN("PWRMGT: Boot check skipped (external power)"); - boot_voltage_mv = getBattMilliVolts(); - return true; - } - - MESH_DEBUG_PRINTLN("PWRMGT: Boot voltage = %u mV (threshold = %u mV)", - boot_voltage_mv, config->voltage_bootlock); - - // Only trigger shutdown if reading is valid (>1000mV) AND below threshold - // This prevents spurious shutdowns on ADC glitches or uninitialized reads - if (boot_voltage_mv > 1000 && boot_voltage_mv < config->voltage_bootlock) { - MESH_DEBUG_PRINTLN("PWRMGT: Boot voltage too low - entering protective shutdown"); - - initiateShutdown(SHUTDOWN_REASON_BOOT_PROTECT); - return false; // Should never reach this - } - - return true; -} - -void NRF52Board::initiateShutdown(uint8_t reason) { - enterSystemOff(reason); -} - -void NRF52Board::enterSystemOff(uint8_t reason) { - MESH_DEBUG_PRINTLN("PWRMGT: Entering SYSTEMOFF (%s)", getShutdownReasonString(reason)); - - // Record shutdown reason in GPREGRET2 - uint8_t sd_enabled = 0; - sd_softdevice_is_enabled(&sd_enabled); - if (sd_enabled) { - sd_power_gpregret_clr(1, 0xFF); - sd_power_gpregret_set(1, reason); - } else { - NRF_POWER->GPREGRET2 = reason; - } - - // Flush serial buffers - Serial.flush(); - delay(100); - - // Enter SYSTEMOFF - if (sd_enabled) { - uint32_t err = sd_power_system_off(); - if (err == NRF_ERROR_SOFTDEVICE_NOT_ENABLED) { //SoftDevice not enabled - sd_enabled = 0; - } - } - - if (!sd_enabled) { - // SoftDevice not available; write directly to POWER->SYSTEMOFF - NRF_POWER->SYSTEMOFF = POWER_SYSTEMOFF_SYSTEMOFF_Enter; - } - - // If we get here, something went wrong. Reset to recover. - NVIC_SystemReset(); -} - -void NRF52Board::configureVoltageWake(uint8_t ain_channel, uint8_t refsel) { - // LPCOMP is not managed by SoftDevice - direct register access required - // Halt and disable before reconfiguration - NRF_LPCOMP->TASKS_STOP = 1; - NRF_LPCOMP->ENABLE = LPCOMP_ENABLE_ENABLE_Disabled; - - // Select analog input (AIN0-7 maps to PSEL 0-7) - NRF_LPCOMP->PSEL = ((uint32_t)ain_channel << LPCOMP_PSEL_PSEL_Pos) & LPCOMP_PSEL_PSEL_Msk; - - // Reference: REFSEL (0-6=1/8..7/8, 7=ARef, 8-15=1/16..15/16) - NRF_LPCOMP->REFSEL = ((uint32_t)refsel << LPCOMP_REFSEL_REFSEL_Pos) & LPCOMP_REFSEL_REFSEL_Msk; - - // Detect UP events (voltage rises above threshold for battery recovery) - NRF_LPCOMP->ANADETECT = LPCOMP_ANADETECT_ANADETECT_Up; - - // Enable 50mV hysteresis for noise immunity - NRF_LPCOMP->HYST = LPCOMP_HYST_HYST_Hyst50mV; - - // Clear stale events/interrupts before enabling wake - NRF_LPCOMP->EVENTS_READY = 0; - NRF_LPCOMP->EVENTS_DOWN = 0; - NRF_LPCOMP->EVENTS_UP = 0; - NRF_LPCOMP->EVENTS_CROSS = 0; - - NRF_LPCOMP->INTENCLR = 0xFFFFFFFF; - NRF_LPCOMP->INTENSET = LPCOMP_INTENSET_UP_Msk; - - // Enable LPCOMP - NRF_LPCOMP->ENABLE = LPCOMP_ENABLE_ENABLE_Enabled; - NRF_LPCOMP->TASKS_START = 1; - - // Wait for comparator to settle before entering SYSTEMOFF - for (uint8_t i = 0; i < 20 && !NRF_LPCOMP->EVENTS_READY; i++) { - delayMicroseconds(50); - } - - if (refsel == 7) { - MESH_DEBUG_PRINTLN("PWRMGT: LPCOMP wake configured (AIN%d, ref=ARef)", ain_channel); - } else if (refsel <= 6) { - MESH_DEBUG_PRINTLN("PWRMGT: LPCOMP wake configured (AIN%d, ref=%d/8 VDD)", - ain_channel, refsel + 1); - } else { - uint8_t ref_num = (uint8_t)((refsel - 8) * 2 + 1); - MESH_DEBUG_PRINTLN("PWRMGT: LPCOMP wake configured (AIN%d, ref=%d/16 VDD)", - ain_channel, ref_num); - } - - // Configure VBUS (USB power) wake alongside LPCOMP - uint8_t sd_enabled = 0; - sd_softdevice_is_enabled(&sd_enabled); - if (sd_enabled) { - sd_power_usbdetected_enable(1); - } else { - NRF_POWER->EVENTS_USBDETECTED = 0; - NRF_POWER->INTENSET = POWER_INTENSET_USBDETECTED_Msk; - } - - MESH_DEBUG_PRINTLN("PWRMGT: VBUS wake configured"); -} -#endif - -void NRF52BoardDCDC::begin() { - NRF52Board::begin(); - - // Enable DC/DC converter for improved power efficiency - uint8_t sd_enabled = 0; - sd_softdevice_is_enabled(&sd_enabled); - if (sd_enabled) { - sd_power_dcdc_mode_set(NRF_POWER_DCDC_ENABLE); - } else { - NRF_POWER->DCDCEN = 1; - } -} - -// Temperature from NRF52 MCU -float NRF52Board::getMCUTemperature() { - NRF_TEMP->TASKS_START = 1; // Start temperature measurement - - long startTime = millis(); - while (NRF_TEMP->EVENTS_DATARDY == 0) { // Wait for completion. Should complete in 50us - if(millis() - startTime > 5) { // To wait 5ms just in case - NRF_TEMP->TASKS_STOP = 1; - return NAN; - } - } - - NRF_TEMP->EVENTS_DATARDY = 0; // Clear event flag - - int32_t temp = NRF_TEMP->TEMP; // In 0.25 *C units - NRF_TEMP->TASKS_STOP = 1; - - return temp * 0.25f; // Convert to *C -} - -bool NRF52BoardOTA::startOTAUpdate(const char *id, char reply[]) { - // Config the peripheral connection with maximum bandwidth - // more SRAM required by SoftDevice - // Note: All config***() function must be called before begin() - Bluefruit.configPrphBandwidth(BANDWIDTH_MAX); - Bluefruit.configPrphConn(92, BLE_GAP_EVENT_LENGTH_MIN, 16, 16); - - Bluefruit.begin(1, 0); - // Set max power. Accepted values are: -40, -30, -20, -16, -12, -8, -4, 0, 4 - Bluefruit.setTxPower(4); - // Set the BLE device name - Bluefruit.setName(ota_name); - - Bluefruit.Periph.setConnectCallback(connect_callback); - Bluefruit.Periph.setDisconnectCallback(disconnect_callback); - - // To be consistent OTA DFU should be added first if it exists - bledfu.begin(); - - // Set up and start advertising - // Advertising packet - Bluefruit.Advertising.addFlags(BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE); - Bluefruit.Advertising.addTxPower(); - Bluefruit.Advertising.addName(); - - /* Start Advertising - - Enable auto advertising if disconnected - - Interval: fast mode = 20 ms, slow mode = 152.5 ms - - Timeout for fast mode is 30 seconds - - Start(timeout) with timeout = 0 will advertise forever (until connected) - - For recommended advertising interval - https://developer.apple.com/library/content/qa/qa1931/_index.html - */ - Bluefruit.Advertising.restartOnDisconnect(true); - Bluefruit.Advertising.setInterval(32, 244); // in unit of 0.625 ms - Bluefruit.Advertising.setFastTimeout(30); // number of seconds in fast mode - Bluefruit.Advertising.start(0); // 0 = Don't stop advertising after n seconds - - uint8_t mac_addr[6]; - memset(mac_addr, 0, sizeof(mac_addr)); - Bluefruit.getAddr(mac_addr); - sprintf(reply, "OK - mac: %02X:%02X:%02X:%02X:%02X:%02X", mac_addr[5], mac_addr[4], mac_addr[3], - mac_addr[2], mac_addr[1], mac_addr[0]); - - return true; -} -#endif diff --git a/src/helpers/NRF52Board.h b/src/helpers/NRF52Board.h deleted file mode 100644 index 1f02bace..00000000 --- a/src/helpers/NRF52Board.h +++ /dev/null @@ -1,82 +0,0 @@ -#pragma once - -#include -#include - -#if defined(NRF52_PLATFORM) - -#ifdef NRF52_POWER_MANAGEMENT -// Shutdown Reason Codes (stored in GPREGRET before SYSTEMOFF) -#define SHUTDOWN_REASON_NONE 0x00 -#define SHUTDOWN_REASON_LOW_VOLTAGE 0x4C // 'L' - Runtime low voltage threshold -#define SHUTDOWN_REASON_USER 0x55 // 'U' - User requested powerOff() -#define SHUTDOWN_REASON_BOOT_PROTECT 0x42 // 'B' - Boot voltage protection - -// Boards provide this struct with their hardware-specific settings and callbacks. -struct PowerMgtConfig { - // LPCOMP wake configuration (for voltage recovery from SYSTEMOFF) - uint8_t lpcomp_ain_channel; // AIN0-7 for voltage sensing pin - uint8_t lpcomp_refsel; // REFSEL value: 0-6=1/8..7/8, 7=ARef, 8-15=1/16..15/16 - - // Boot protection voltage threshold (millivolts) - // Set to 0 to disable boot protection - uint16_t voltage_bootlock; -}; -#endif - -class NRF52Board : public mesh::MainBoard { -#ifdef NRF52_POWER_MANAGEMENT - void initPowerMgr(); -#endif - -protected: - uint8_t startup_reason; - -#ifdef NRF52_POWER_MANAGEMENT - uint32_t reset_reason; // RESETREAS register value - uint8_t shutdown_reason; // GPREGRET value (why we entered last SYSTEMOFF) - uint16_t boot_voltage_mv; // Battery voltage at boot (millivolts) - - bool checkBootVoltage(const PowerMgtConfig* config); - void enterSystemOff(uint8_t reason); - void configureVoltageWake(uint8_t ain_channel, uint8_t refsel); - virtual void initiateShutdown(uint8_t reason); -#endif - -public: - virtual void begin(); - virtual uint8_t getStartupReason() const override { return startup_reason; } - virtual float getMCUTemperature() override; - virtual void reboot() override { NVIC_SystemReset(); } - -#ifdef NRF52_POWER_MANAGEMENT - bool isExternalPowered() override; - uint16_t getBootVoltage() override { return boot_voltage_mv; } - virtual uint32_t getResetReason() const override { return reset_reason; } - uint8_t getShutdownReason() const override { return shutdown_reason; } - const char* getResetReasonString(uint32_t reason) override; - const char* getShutdownReasonString(uint8_t reason) override; -#endif -}; - -/* - * The NRF52 has an internal DC/DC regulator that allows increased efficiency - * compared to the LDO regulator. For being able to use it, the module/board - * needs to have the required inductors and and capacitors populated. If the - * hardware requirements are met, this subclass can be used to enable the DC/DC - * regulator. - */ -class NRF52BoardDCDC : virtual public NRF52Board { -public: - virtual void begin() override; -}; - -class NRF52BoardOTA : virtual public NRF52Board { -private: - char *ota_name; - -public: - NRF52BoardOTA(char *name) : ota_name(name) {} - virtual bool startOTAUpdate(const char *id, char reply[]) override; -}; -#endif \ No newline at end of file diff --git a/src/helpers/RegionMap.cpp b/src/helpers/RegionMap.cpp index 0c6d43c1..fb16b3a3 100644 --- a/src/helpers/RegionMap.cpp +++ b/src/helpers/RegionMap.cpp @@ -59,7 +59,7 @@ static const char* skip_hash(const char* name) { } static File openWrite(FILESYSTEM* _fs, const char* filename) { - #if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM) + #if defined(STM32_PLATFORM) _fs->remove(filename); return _fs->open(filename, FILE_O_WRITE); #elif defined(RP2040_PLATFORM) diff --git a/src/helpers/bridges/RS232Bridge.cpp b/src/helpers/bridges/RS232Bridge.cpp index 0024f6f2..38be3555 100644 --- a/src/helpers/bridges/RS232Bridge.cpp +++ b/src/helpers/bridges/RS232Bridge.cpp @@ -15,9 +15,6 @@ void RS232Bridge::begin() { #if defined(ESP32) ((HardwareSerial *)_serial)->setPins(WITH_RS232_BRIDGE_RX, WITH_RS232_BRIDGE_TX); -#elif defined(NRF52_PLATFORM) - // Tested with RAK_4631 and T114 - ((Uart *)_serial)->setPins(WITH_RS232_BRIDGE_RX, WITH_RS232_BRIDGE_TX); #elif defined(RP2040_PLATFORM) ((SerialUART *)_serial)->setRX(WITH_RS232_BRIDGE_RX); ((SerialUART *)_serial)->setTX(WITH_RS232_BRIDGE_TX); diff --git a/src/helpers/bridges/RS232Bridge.h b/src/helpers/bridges/RS232Bridge.h index 8fc1c22c..87f73d59 100644 --- a/src/helpers/bridges/RS232Bridge.h +++ b/src/helpers/bridges/RS232Bridge.h @@ -40,7 +40,6 @@ * Platform Support: * Different platforms require different pin configuration methods: * - ESP32: Uses HardwareSerial::setPins(rx, tx) - * - NRF52: Uses Uart::setPins(rx, tx) * - RP2040: Uses SerialUART::setRX(rx) and SerialUART::setTX(tx) * - STM32: Uses HardwareSerial::setRx(rx) and HardwareSerial::setTx(tx) */ diff --git a/src/helpers/esp32/SerialBLEInterface.cpp b/src/helpers/esp32/SerialBLEInterface.cpp index 89c284c3..7d46c8ab 100644 --- a/src/helpers/esp32/SerialBLEInterface.cpp +++ b/src/helpers/esp32/SerialBLEInterface.cpp @@ -15,7 +15,7 @@ // Slice tags for small-MTU peers. No real frame can start with one of these: // command codes are below 0x80 and push codes stop at 0x90. When slicing is in // effect, every frame to or from the peer travels as [tag][len][payload] -// slices; the length byte lets stream-style transports (nRF52 BLEUart) +// slices; the length byte lets stream-style transports // recover slice boundaries as well. #define SLICE_TAG_FIRST 0xF0 // first slice of a multi-slice frame #define SLICE_TAG_MIDDLE 0xF1 diff --git a/src/helpers/nrf52/SerialBLEInterface.cpp b/src/helpers/nrf52/SerialBLEInterface.cpp deleted file mode 100644 index ac7d5d9c..00000000 --- a/src/helpers/nrf52/SerialBLEInterface.cpp +++ /dev/null @@ -1,397 +0,0 @@ -#include "SerialBLEInterface.h" -#include -#include -#include "ble_gap.h" -#include "ble_hci.h" - -// Magic numbers came from actual testing -#define BLE_HEALTH_CHECK_INTERVAL 10000 // Advertising watchdog check every 10 seconds -#define BLE_RETRY_THROTTLE_MS 250 // Throttle retries to 250ms when queue buildup detected - -// Connection parameters (units: interval=1.25ms, timeout=10ms) -#define BLE_MIN_CONN_INTERVAL 12 // 15ms -#define BLE_MAX_CONN_INTERVAL 24 // 30ms -#define BLE_SLAVE_LATENCY 4 -#define BLE_CONN_SUP_TIMEOUT 200 // 2000ms - -// Advertising parameters -#define BLE_ADV_INTERVAL_MIN 32 // 20ms (units: 0.625ms) -#define BLE_ADV_INTERVAL_MAX 244 // 152.5ms (units: 0.625ms) -#define BLE_ADV_FAST_TIMEOUT 30 // seconds - -// RX drain buffer size for overflow protection -#define BLE_RX_DRAIN_BUF_SIZE 32 - -static SerialBLEInterface* instance = nullptr; - -void SerialBLEInterface::onConnect(uint16_t connection_handle) { - BLE_DEBUG_PRINTLN("SerialBLEInterface: connected handle=0x%04X", connection_handle); - if (instance) { - instance->_conn_handle = connection_handle; - instance->_isDeviceConnected = false; - instance->clearBuffers(); - } -} - -void SerialBLEInterface::onDisconnect(uint16_t connection_handle, uint8_t reason) { - BLE_DEBUG_PRINTLN("SerialBLEInterface: disconnected handle=0x%04X reason=%u", connection_handle, reason); - if (instance) { - if (instance->_conn_handle == connection_handle) { - instance->_conn_handle = BLE_CONN_HANDLE_INVALID; - instance->_isDeviceConnected = false; - instance->clearBuffers(); - } - } -} - -void SerialBLEInterface::onSecured(uint16_t connection_handle) { - BLE_DEBUG_PRINTLN("SerialBLEInterface: onSecured handle=0x%04X", connection_handle); - if (instance) { - if (instance->isValidConnection(connection_handle, true)) { - instance->_isDeviceConnected = true; - - // Connection interval units: 1.25ms, supervision timeout units: 10ms - // Apple: "The product will not read or use the parameters in the Peripheral Preferred Connection Parameters characteristic." - // So we explicitly set it here to make Android & Apple match - ble_gap_conn_params_t conn_params; - conn_params.min_conn_interval = BLE_MIN_CONN_INTERVAL; - conn_params.max_conn_interval = BLE_MAX_CONN_INTERVAL; - conn_params.slave_latency = BLE_SLAVE_LATENCY; - conn_params.conn_sup_timeout = BLE_CONN_SUP_TIMEOUT; - - uint32_t err_code = sd_ble_gap_conn_param_update(connection_handle, &conn_params); - if (err_code == NRF_SUCCESS) { - BLE_DEBUG_PRINTLN("Connection parameter update requested: %u-%ums interval, latency=%u, %ums timeout", - conn_params.min_conn_interval * 5 / 4, // convert to ms (1.25ms units) - conn_params.max_conn_interval * 5 / 4, - conn_params.slave_latency, - conn_params.conn_sup_timeout * 10); // convert to ms (10ms units) - } else { - BLE_DEBUG_PRINTLN("Failed to request connection parameter update: %lu", err_code); - } - } else { - BLE_DEBUG_PRINTLN("onSecured: ignoring stale/duplicate callback"); - } - } -} - -bool SerialBLEInterface::onPairingPasskey(uint16_t connection_handle, uint8_t const passkey[6], bool match_request) { - (void)connection_handle; - (void)passkey; - BLE_DEBUG_PRINTLN("SerialBLEInterface: pairing passkey request match=%d", match_request); - return true; -} - -void SerialBLEInterface::onPairingComplete(uint16_t connection_handle, uint8_t auth_status) { - BLE_DEBUG_PRINTLN("SerialBLEInterface: pairing complete handle=0x%04X status=%u", connection_handle, auth_status); - if (instance) { - if (instance->isValidConnection(connection_handle)) { - if (auth_status == BLE_GAP_SEC_STATUS_SUCCESS) { - BLE_DEBUG_PRINTLN("SerialBLEInterface: pairing successful"); - } else { - BLE_DEBUG_PRINTLN("SerialBLEInterface: pairing failed, disconnecting"); - instance->disconnect(); - } - } else { - BLE_DEBUG_PRINTLN("onPairingComplete: ignoring stale callback"); - } - } -} - -void SerialBLEInterface::onBLEEvent(ble_evt_t* evt) { - if (!instance) return; - - if (evt->header.evt_id == BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST) { - uint16_t conn_handle = evt->evt.gap_evt.conn_handle; - if (instance->isValidConnection(conn_handle)) { - BLE_DEBUG_PRINTLN("CONN_PARAM_UPDATE_REQUEST: handle=0x%04X, min_interval=%u, max_interval=%u, latency=%u, timeout=%u", - conn_handle, - evt->evt.gap_evt.params.conn_param_update_request.conn_params.min_conn_interval, - evt->evt.gap_evt.params.conn_param_update_request.conn_params.max_conn_interval, - evt->evt.gap_evt.params.conn_param_update_request.conn_params.slave_latency, - evt->evt.gap_evt.params.conn_param_update_request.conn_params.conn_sup_timeout); - - uint32_t err_code = sd_ble_gap_conn_param_update(conn_handle, NULL); - if (err_code == NRF_SUCCESS) { - BLE_DEBUG_PRINTLN("Accepted CONN_PARAM_UPDATE_REQUEST (using PPCP)"); - } else { - BLE_DEBUG_PRINTLN("ERROR: Failed to accept CONN_PARAM_UPDATE_REQUEST: 0x%08X", err_code); - } - } else { - BLE_DEBUG_PRINTLN("CONN_PARAM_UPDATE_REQUEST: ignoring stale callback for handle=0x%04X", conn_handle); - } - } -} - -void SerialBLEInterface::begin(const char* prefix, char* name, uint32_t pin_code) { - instance = this; - - char charpin[20]; - snprintf(charpin, sizeof(charpin), "%lu", (unsigned long)pin_code); - - // If we want to control BLE LED ourselves, uncomment this: - Bluefruit.autoConnLed(false); - Bluefruit.configPrphBandwidth(BANDWIDTH_MAX); - Bluefruit.begin(); - - char dev_name[32+16]; - if (strcmp(name, "@@MAC") == 0) { - ble_gap_addr_t addr; - if (sd_ble_gap_addr_get(&addr) == NRF_SUCCESS) { - sprintf(name, "%02X%02X%02X%02X%02X%02X", // modify (IN-OUT param) - addr.addr[5], addr.addr[4], addr.addr[3], addr.addr[2], addr.addr[1], addr.addr[0]); - } - } - sprintf(dev_name, "%s%s", prefix, name); - - // Connection interval units: 1.25ms, supervision timeout units: 10ms - ble_gap_conn_params_t ppcp_params; - ppcp_params.min_conn_interval = BLE_MIN_CONN_INTERVAL; - ppcp_params.max_conn_interval = BLE_MAX_CONN_INTERVAL; - ppcp_params.slave_latency = BLE_SLAVE_LATENCY; - ppcp_params.conn_sup_timeout = BLE_CONN_SUP_TIMEOUT; - - uint32_t err_code = sd_ble_gap_ppcp_set(&ppcp_params); - if (err_code == NRF_SUCCESS) { - BLE_DEBUG_PRINTLN("PPCP set: %u-%ums interval, latency=%u, %ums timeout", - ppcp_params.min_conn_interval * 5 / 4, // convert to ms (1.25ms units) - ppcp_params.max_conn_interval * 5 / 4, - ppcp_params.slave_latency, - ppcp_params.conn_sup_timeout * 10); // convert to ms (10ms units) - } else { - BLE_DEBUG_PRINTLN("Failed to set PPCP: %lu", err_code); - } - - Bluefruit.setTxPower(BLE_TX_POWER); - Bluefruit.setName(dev_name); - - Bluefruit.Security.setMITM(true); - Bluefruit.Security.setPIN(charpin); - Bluefruit.Security.setIOCaps(true, false, false); - Bluefruit.Security.setPairPasskeyCallback(onPairingPasskey); - Bluefruit.Security.setPairCompleteCallback(onPairingComplete); - - Bluefruit.Periph.setConnectCallback(onConnect); - Bluefruit.Periph.setDisconnectCallback(onDisconnect); - Bluefruit.Security.setSecuredCallback(onSecured); - - Bluefruit.setEventCallback(onBLEEvent); - - bleuart.setPermission(SECMODE_ENC_WITH_MITM, SECMODE_ENC_WITH_MITM); - bleuart.begin(); - bleuart.setRxCallback(onBleUartRX); - - Bluefruit.Advertising.addFlags(BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE); - Bluefruit.Advertising.addTxPower(); - Bluefruit.Advertising.addService(bleuart); - - Bluefruit.ScanResponse.addName(); - - Bluefruit.Advertising.setInterval(BLE_ADV_INTERVAL_MIN, BLE_ADV_INTERVAL_MAX); - Bluefruit.Advertising.setFastTimeout(BLE_ADV_FAST_TIMEOUT); - - Bluefruit.Advertising.restartOnDisconnect(true); - -} - -void SerialBLEInterface::clearBuffers() { - send_queue_len = 0; - recv_queue_len = 0; - _last_retry_attempt = 0; - bleuart.flush(); -} - -void SerialBLEInterface::shiftSendQueueLeft() { - if (send_queue_len > 0) { - send_queue_len--; - for (uint8_t i = 0; i < send_queue_len; i++) { - send_queue[i] = send_queue[i + 1]; - } - } -} - -void SerialBLEInterface::shiftRecvQueueLeft() { - if (recv_queue_len > 0) { - recv_queue_len--; - for (uint8_t i = 0; i < recv_queue_len; i++) { - recv_queue[i] = recv_queue[i + 1]; - } - } -} - -bool SerialBLEInterface::isValidConnection(uint16_t handle, bool requireWaitingForSecurity) const { - if (_conn_handle != handle) { - return false; - } - BLEConnection* conn = Bluefruit.Connection(handle); - if (conn == nullptr || !conn->connected()) { - return false; - } - if (requireWaitingForSecurity && _isDeviceConnected) { - return false; - } - return true; -} - -bool SerialBLEInterface::isAdvertising() const { - ble_gap_addr_t adv_addr; - uint32_t err_code = sd_ble_gap_adv_addr_get(0, &adv_addr); - return (err_code == NRF_SUCCESS); -} - -void SerialBLEInterface::enable() { - if (_isEnabled) return; - - _isEnabled = true; - clearBuffers(); - _last_health_check = millis(); - - Bluefruit.Advertising.start(0); -} - -void SerialBLEInterface::disconnect() { - if (_conn_handle != BLE_CONN_HANDLE_INVALID) { - sd_ble_gap_disconnect(_conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION); - } -} - -void SerialBLEInterface::disable() { - _isEnabled = false; - BLE_DEBUG_PRINTLN("SerialBLEInterface: disable"); - - disconnect(); - Bluefruit.Advertising.stop(); - _last_health_check = 0; -} - -size_t SerialBLEInterface::writeFrame(const uint8_t src[], size_t len) { - if (len > MAX_FRAME_SIZE) { - BLE_DEBUG_PRINTLN("writeFrame(), frame too big, len=%u", (unsigned)len); - return 0; - } - - bool connected = isConnected(); - if (connected && len > 0) { - if (send_queue_len >= FRAME_QUEUE_SIZE) { - BLE_DEBUG_PRINTLN("writeFrame(), send_queue is full!"); - return 0; - } - - send_queue[send_queue_len].len = len; - memcpy(send_queue[send_queue_len].buf, src, len); - send_queue_len++; - - return len; - } - return 0; -} - -size_t SerialBLEInterface::checkRecvFrame(uint8_t dest[]) { - if (send_queue_len > 0) { - if (!isConnected()) { - BLE_DEBUG_PRINTLN("writeBytes: connection invalid, clearing send queue"); - send_queue_len = 0; - } else { - unsigned long now = millis(); - bool throttle_active = (_last_retry_attempt > 0 && (now - _last_retry_attempt) < BLE_RETRY_THROTTLE_MS); - - if (!throttle_active) { - Frame frame_to_send = send_queue[0]; - - size_t written = bleuart.write(frame_to_send.buf, frame_to_send.len); - if (written == frame_to_send.len) { - BLE_DEBUG_PRINTLN("writeBytes: sz=%u, hdr=%u", (unsigned)frame_to_send.len, (unsigned)frame_to_send.buf[0]); - _last_retry_attempt = 0; - shiftSendQueueLeft(); - } else if (written > 0) { - BLE_DEBUG_PRINTLN("writeBytes: partial write, sent=%u of %u, dropping corrupted frame", (unsigned)written, (unsigned)frame_to_send.len); - _last_retry_attempt = 0; - shiftSendQueueLeft(); - } else { - if (!isConnected()) { - BLE_DEBUG_PRINTLN("writeBytes failed: connection lost, dropping frame"); - _last_retry_attempt = 0; - shiftSendQueueLeft(); - } else { - BLE_DEBUG_PRINTLN("writeBytes failed (buffer full), keeping frame for retry"); - _last_retry_attempt = now; - } - } - } - } - } - - if (recv_queue_len > 0) { - size_t len = recv_queue[0].len; - memcpy(dest, recv_queue[0].buf, len); - - BLE_DEBUG_PRINTLN("readBytes: sz=%u, hdr=%u", (unsigned)len, (unsigned)dest[0]); - - shiftRecvQueueLeft(); - return len; - } - - // Advertising watchdog: periodically check if advertising is running, restart if not - // Only run when truly disconnected (no connection handle), not during connection establishment - unsigned long now = millis(); - if (_isEnabled && !isConnected() && _conn_handle == BLE_CONN_HANDLE_INVALID) { - if (now - _last_health_check >= BLE_HEALTH_CHECK_INTERVAL) { - _last_health_check = now; - - if (!isAdvertising()) { - BLE_DEBUG_PRINTLN("SerialBLEInterface: advertising watchdog - advertising stopped, restarting"); - Bluefruit.Advertising.start(0); - } - } - } - - return 0; -} - -void SerialBLEInterface::onBleUartRX(uint16_t conn_handle) { - if (!instance) { - return; - } - - if (instance->_conn_handle != conn_handle || !instance->isConnected()) { - while (instance->bleuart.available() > 0) { - instance->bleuart.read(); - } - return; - } - - while (instance->bleuart.available() > 0) { - if (instance->recv_queue_len >= FRAME_QUEUE_SIZE) { - while (instance->bleuart.available() > 0) { - instance->bleuart.read(); - } - BLE_DEBUG_PRINTLN("onBleUartRX: recv queue full, dropping data"); - break; - } - - int avail = instance->bleuart.available(); - - if (avail > MAX_FRAME_SIZE) { - BLE_DEBUG_PRINTLN("onBleUartRX: WARN: BLE RX overflow, avail=%d, draining all", avail); - uint8_t drain_buf[BLE_RX_DRAIN_BUF_SIZE]; - while (instance->bleuart.available() > 0) { - int chunk = instance->bleuart.available() > BLE_RX_DRAIN_BUF_SIZE ? BLE_RX_DRAIN_BUF_SIZE : instance->bleuart.available(); - instance->bleuart.readBytes(drain_buf, chunk); - } - continue; - } - - int read_len = avail; - instance->recv_queue[instance->recv_queue_len].len = read_len; - instance->bleuart.readBytes(instance->recv_queue[instance->recv_queue_len].buf, read_len); - instance->recv_queue_len++; - } -} - -bool SerialBLEInterface::isConnected() const { - return _isDeviceConnected && Bluefruit.connected() > 0; -} - -bool SerialBLEInterface::isWriteBusy() const { - return send_queue_len >= (FRAME_QUEUE_SIZE * 2 / 3); -} diff --git a/src/helpers/nrf52/SerialBLEInterface.h b/src/helpers/nrf52/SerialBLEInterface.h deleted file mode 100644 index e2fc6cb9..00000000 --- a/src/helpers/nrf52/SerialBLEInterface.h +++ /dev/null @@ -1,80 +0,0 @@ -#pragma once - -#include "../BaseSerialInterface.h" -#include - -#ifndef BLE_TX_POWER -#define BLE_TX_POWER 4 -#endif - -class SerialBLEInterface : public BaseSerialInterface { - BLEUart bleuart; - bool _isEnabled; - bool _isDeviceConnected; - uint16_t _conn_handle; - unsigned long _last_health_check; - unsigned long _last_retry_attempt; - - struct Frame { - uint8_t len; - uint8_t buf[MAX_FRAME_SIZE]; - }; - - #define FRAME_QUEUE_SIZE 12 - - uint8_t send_queue_len; - Frame send_queue[FRAME_QUEUE_SIZE]; - - uint8_t recv_queue_len; - Frame recv_queue[FRAME_QUEUE_SIZE]; - - void clearBuffers(); - void shiftSendQueueLeft(); - void shiftRecvQueueLeft(); - bool isValidConnection(uint16_t handle, bool requireWaitingForSecurity = false) const; - bool isAdvertising() const; - static void onConnect(uint16_t connection_handle); - static void onDisconnect(uint16_t connection_handle, uint8_t reason); - static void onSecured(uint16_t connection_handle); - static bool onPairingPasskey(uint16_t connection_handle, uint8_t const passkey[6], bool match_request); - static void onPairingComplete(uint16_t connection_handle, uint8_t auth_status); - static void onBLEEvent(ble_evt_t* evt); - static void onBleUartRX(uint16_t conn_handle); - -public: - SerialBLEInterface() { - _isEnabled = false; - _isDeviceConnected = false; - _conn_handle = BLE_CONN_HANDLE_INVALID; - _last_health_check = 0; - _last_retry_attempt = 0; - send_queue_len = 0; - recv_queue_len = 0; - } - - /** - * init the BLE interface. - * @param prefix a prefix for the device name - * @param name IN/OUT - a name for the device (combined with prefix). If "@@MAC", is modified and returned - * @param pin_code the BLE security pin - */ - void begin(const char* prefix, char* name, uint32_t pin_code); - - void disconnect(); - void enable() override; - void disable() override; - bool isEnabled() const override { return _isEnabled; } - bool isConnected() const override; - bool isWriteBusy() const override; - size_t writeFrame(const uint8_t src[], size_t len) override; - size_t checkRecvFrame(uint8_t dest[]) override; -}; - -#if BLE_DEBUG_LOGGING && ARDUINO - #include - #define BLE_DEBUG_PRINT(F, ...) Serial.printf("BLE: " F, ##__VA_ARGS__) - #define BLE_DEBUG_PRINTLN(F, ...) Serial.printf("BLE: " F "\n", ##__VA_ARGS__) -#else - #define BLE_DEBUG_PRINT(...) {} - #define BLE_DEBUG_PRINTLN(...) {} -#endif diff --git a/src/helpers/radiolib/CustomLLCC68.h b/src/helpers/radiolib/CustomLLCC68.h index c239cc41..b431eccd 100644 --- a/src/helpers/radiolib/CustomLLCC68.h +++ b/src/helpers/radiolib/CustomLLCC68.h @@ -28,9 +28,7 @@ class CustomLLCC68 : public LLCC68 { #endif #if defined(P_LORA_SCLK) - #ifdef NRF52_PLATFORM - if (spi) { spi->setPins(P_LORA_MISO, P_LORA_SCLK, P_LORA_MOSI); spi->begin(); } - #elif defined(RP2040_PLATFORM) + #if defined(RP2040_PLATFORM) if (spi) { spi->setMISO(P_LORA_MISO); //spi->setCS(P_LORA_NSS); // Setting CS results in freeze diff --git a/src/helpers/radiolib/CustomSX1262.h b/src/helpers/radiolib/CustomSX1262.h index bfaea7c7..28313878 100644 --- a/src/helpers/radiolib/CustomSX1262.h +++ b/src/helpers/radiolib/CustomSX1262.h @@ -28,9 +28,7 @@ class CustomSX1262 : public SX1262 { #endif #if defined(P_LORA_SCLK) - #ifdef NRF52_PLATFORM - if (spi) { spi->setPins(P_LORA_MISO, P_LORA_SCLK, P_LORA_MOSI); spi->begin(); } - #elif defined(RP2040_PLATFORM) + #if defined(RP2040_PLATFORM) if (spi) { spi->setMISO(P_LORA_MISO); //spi->setCS(P_LORA_NSS); // Setting CS results in freeze diff --git a/src/helpers/radiolib/CustomSX1268.h b/src/helpers/radiolib/CustomSX1268.h index 1e2e2620..00614b61 100644 --- a/src/helpers/radiolib/CustomSX1268.h +++ b/src/helpers/radiolib/CustomSX1268.h @@ -28,9 +28,7 @@ class CustomSX1268 : public SX1268 { #endif #if defined(P_LORA_SCLK) - #ifdef NRF52_PLATFORM - if (spi) { spi->setPins(P_LORA_MISO, P_LORA_SCLK, P_LORA_MOSI); spi->begin(); } - #elif defined(RP2040_PLATFORM) + #if defined(RP2040_PLATFORM) if (spi) { spi->setMISO(P_LORA_MISO); //spi->setCS(P_LORA_NSS); // Setting CS results in freeze diff --git a/src/helpers/radiolib/CustomSX1276.h b/src/helpers/radiolib/CustomSX1276.h index bee25274..d37771f8 100644 --- a/src/helpers/radiolib/CustomSX1276.h +++ b/src/helpers/radiolib/CustomSX1276.h @@ -25,9 +25,7 @@ class CustomSX1276 : public SX1276 { #endif #if defined(P_LORA_SCLK) - #ifdef NRF52_PLATFORM - if (spi) { spi->setPins(P_LORA_MISO, P_LORA_SCLK, P_LORA_MOSI); spi->begin(); } - #elif defined(RP2040_PLATFORM) + #if defined(RP2040_PLATFORM) if (spi) { spi->setMISO(P_LORA_MISO); //spi->setCS(P_LORA_NSS); // Setting CS results in freeze diff --git a/src/helpers/sensors/EnvironmentSensorManager.cpp b/src/helpers/sensors/EnvironmentSensorManager.cpp index 8471d80d..c5484bba 100644 --- a/src/helpers/sensors/EnvironmentSensorManager.cpp +++ b/src/helpers/sensors/EnvironmentSensorManager.cpp @@ -159,13 +159,7 @@ bool EnvironmentSensorManager::begin() { #endif #if ENV_PIN_SDA && ENV_PIN_SCL - #ifdef NRF52_PLATFORM - Wire1.setPins(ENV_PIN_SDA, ENV_PIN_SCL); - Wire1.setClock(100000); - Wire1.begin(); - #else Wire1.begin(ENV_PIN_SDA, ENV_PIN_SCL, 100000); - #endif MESH_DEBUG_PRINTLN("Second I2C initialized on pins SDA: %d SCL: %d", ENV_PIN_SDA, ENV_PIN_SCL); #endif diff --git a/src/helpers/ui/FastEPDDisplay.cpp b/src/helpers/ui/FastEPDDisplay.cpp deleted file mode 100644 index 0f8d3f87..00000000 --- a/src/helpers/ui/FastEPDDisplay.cpp +++ /dev/null @@ -1,598 +0,0 @@ -#include "FastEPDDisplay.h" -#include "FastEPD.h" -#include - -// Fallback if FastEPD doesn't define these constants -#ifndef BBEP_SUCCESS -#define BBEP_SUCCESS 0 -#endif -#ifndef CLEAR_FAST -#define CLEAR_FAST 0 -#endif -#ifndef CLEAR_SLOW -#define CLEAR_SLOW 1 -#endif -#ifndef BB_MODE_1BPP -#define BB_MODE_1BPP 0 -#endif - -// FastEPD constants (defined in FastEPD.h) -// BB_PANEL_LILYGO_T5PRO_V2 — board ID for V2 hardware -// BB_MODE_1BPP — 1-bit per pixel mode -// CLEAR_FAST, CLEAR_SLOW — full refresh modes - -// Periodic slow (deep) refresh to clear ghosting -#define FULL_SLOW_PERIOD 1 // every frame -- eliminates ghosting (increase to 2+ for less flashing) - -// --------------------------------------------------------------------------- -// UTF-8 helpers for diacritic / extended Latin rendering -// --------------------------------------------------------------------------- - -static uint32_t utf8Decode(const uint8_t* s, int len, int* consumed) { - if (len <= 0) { *consumed = 0; return 0; } - uint8_t b = s[0]; - if (b < 0x80) { *consumed = 1; return b; } - if ((b & 0xE0) == 0xC0 && len >= 2 && (s[1] & 0xC0) == 0x80) { - *consumed = 2; - return ((uint32_t)(b & 0x1F) << 6) | (s[1] & 0x3F); - } - if ((b & 0xF0) == 0xE0 && len >= 3 && (s[1] & 0xC0) == 0x80 && (s[2] & 0xC0) == 0x80) { - *consumed = 3; - return ((uint32_t)(b & 0x0F) << 12) | ((uint32_t)(s[1] & 0x3F) << 6) | (s[2] & 0x3F); - } - if ((b & 0xF8) == 0xF0 && len >= 4 && (s[1] & 0xC0) == 0x80 && (s[2] & 0xC0) == 0x80 && (s[3] & 0xC0) == 0x80) { - *consumed = 4; - return ((uint32_t)(b & 0x07) << 18) | ((uint32_t)(s[1] & 0x3F) << 12) | ((uint32_t)(s[2] & 0x3F) << 6) | (s[3] & 0x3F); - } - *consumed = 1; - return 0xFFFD; -} - -static char foldToAscii(uint32_t cp) { - if (cp < 0x80) return (char)cp; - if (cp >= 0xC0 && cp <= 0xFF) { - static const char f[64] = { - 'A','A','A','A','A','A','A','C','E','E','E','E','I','I','I','I', - 'D','N','O','O','O','O','O', 0 ,'O','U','U','U','U','Y', 0 ,'s', - 'a','a','a','a','a','a','a','c','e','e','e','e','i','i','i','i', - 'd','n','o','o','o','o','o', 0 ,'o','u','u','u','u','y', 0 ,'y' - }; - return f[cp - 0xC0]; - } - if (cp >= 0x100 && cp <= 0x17F) { - switch (cp) { - case 0x100: case 0x102: case 0x104: return 'A'; - case 0x101: case 0x103: case 0x105: return 'a'; - case 0x106: case 0x108: case 0x10A: case 0x10C: return 'C'; - case 0x107: case 0x109: case 0x10B: case 0x10D: return 'c'; - case 0x10E: case 0x110: return 'D'; - case 0x10F: case 0x111: return 'd'; - case 0x112: case 0x114: case 0x116: case 0x118: case 0x11A: return 'E'; - case 0x113: case 0x115: case 0x117: case 0x119: case 0x11B: return 'e'; - case 0x11C: case 0x11E: case 0x120: case 0x122: return 'G'; - case 0x11D: case 0x11F: case 0x121: case 0x123: return 'g'; - case 0x124: case 0x126: return 'H'; case 0x125: case 0x127: return 'h'; - case 0x128: case 0x12A: case 0x12C: case 0x12E: case 0x130: return 'I'; - case 0x129: case 0x12B: case 0x12D: case 0x12F: case 0x131: return 'i'; - case 0x134: return 'J'; case 0x135: return 'j'; - case 0x136: return 'K'; case 0x137: case 0x138: return 'k'; - case 0x139: case 0x13B: case 0x13D: case 0x13F: case 0x141: return 'L'; - case 0x13A: case 0x13C: case 0x13E: case 0x140: case 0x142: return 'l'; - case 0x143: case 0x145: case 0x147: return 'N'; - case 0x144: case 0x146: case 0x148: case 0x149: return 'n'; - case 0x14C: case 0x14E: case 0x150: return 'O'; - case 0x14D: case 0x14F: case 0x151: return 'o'; - case 0x152: return 'O'; case 0x153: return 'o'; - case 0x154: case 0x156: case 0x158: return 'R'; - case 0x155: case 0x157: case 0x159: return 'r'; - case 0x15A: case 0x15C: case 0x15E: case 0x160: return 'S'; - case 0x15B: case 0x15D: case 0x15F: case 0x161: return 's'; - case 0x162: case 0x164: case 0x166: return 'T'; - case 0x163: case 0x165: case 0x167: return 't'; - case 0x168: case 0x16A: case 0x16C: case 0x16E: case 0x170: case 0x172: return 'U'; - case 0x169: case 0x16B: case 0x16D: case 0x16F: case 0x171: case 0x173: return 'u'; - case 0x174: return 'W'; case 0x175: return 'w'; - case 0x176: case 0x178: return 'Y'; case 0x177: return 'y'; - case 0x179: case 0x17B: case 0x17D: return 'Z'; - case 0x17A: case 0x17C: case 0x17E: return 'z'; - } - } - return 0; -} - -static bool hasNonAscii(const char* str) { - for (int i = 0; str[i]; i++) { - if ((uint8_t)str[i] >= 0x80) return true; - } - return false; -} - -FastEPDDisplay::~FastEPDDisplay() { - delete _canvas; - delete _epd; -} - -bool FastEPDDisplay::begin() { - if (_init) return true; - - Serial.println("[FastEPD] Initializing T5S3 E-Paper Pro V2..."); - - // Create FastEPD instance and init hardware - _epd = new FASTEPD; - // Meshtastic-proven init for V2 hardware (pinned FastEPD fork commit) - Serial.println("[FastEPD] Using BB_PANEL_LILYGO_T5PRO_V2"); - int rc = _epd->initPanel(BB_PANEL_LILYGO_T5PRO_V2, 28000000); - if (rc != BBEP_SUCCESS) { - Serial.printf("[FastEPD] initPanel FAILED: %d\n", rc); - delete _epd; - _epd = nullptr; - return false; - } - Serial.printf("[FastEPD] Panel initialized (rc=%d)\n", rc); - - // Enable display via PCA9535 GPIO (required for V2 hardware) - // Pin 0 on PCA9535 = EP_OE (output enable for source driver) - _epd->ioPinMode(0, OUTPUT); - _epd->ioWrite(0, HIGH); - Serial.println("[FastEPD] PCA9535 EP_OE set HIGH"); - - // Set 1-bit per pixel mode - _epd->setMode(BB_MODE_1BPP); - Serial.println("[FastEPD] Mode set to 1BPP"); - - // Create Adafruit_GFX canvas for drawing (960×540, 1-bit) - // ~64KB, should auto-allocate in PSRAM on ESP32-S3 with PSRAM enabled - _canvas = new GFXcanvas1(EPD_WIDTH, EPD_HEIGHT); - if (!_canvas || !_canvas->getBuffer()) { - Serial.println("[FastEPD] Canvas allocation FAILED!"); - return false; - } - Serial.printf("[FastEPD] Canvas allocated: %dx%d (%d bytes)\n", - EPD_WIDTH, EPD_HEIGHT, (EPD_WIDTH * EPD_HEIGHT) / 8); - - // Initial clear — white screen - Serial.println("[FastEPD] Calling clearWhite()..."); - _epd->clearWhite(); - Serial.println("[FastEPD] Calling fullUpdate(true) for initial clear..."); - _epd->fullUpdate(true); // blocking initial clear - _epd->backupPlane(); // Save clean state for subsequent diffs - Serial.println("[FastEPD] Initial clear complete"); - - // Set canvas defaults - _canvas->fillScreen(1); // White background (bit=1 → white in FastEPD) - _canvas->setTextColor(0); // Black text (bit=0 → black in FastEPD) -#ifdef MECK_SERIF_FONT - _canvas->setFont(&FreeSerif12pt7b); -#else - _canvas->setFont(&FreeSans12pt7b); -#endif - _canvas->setTextWrap(false); - - _curr_color = GxEPD_BLACK; - _init = true; - _isOn = true; - - Serial.println("[FastEPD] Display ready (960x540, 1BPP)"); - return true; -} - -void FastEPDDisplay::turnOn() { - if (!_init) begin(); - _isOn = true; -} - -void FastEPDDisplay::turnOff() { - _isOn = false; -} - -void FastEPDDisplay::clear() { - if (!_canvas) return; - _canvas->fillScreen(1); // White - _canvas->setTextColor(0); - _frameCRC.reset(); -} - -void FastEPDDisplay::startFrame(Color bkg) { - if (!_canvas) return; - _canvas->fillScreen(1); // White background - _canvas->setTextColor(0); // Black text - _curr_color = GxEPD_BLACK; - _frameCRC.reset(); - _frameCRC.update(_darkMode); - _frameCRC.update(_portraitMode); - _frameCRC.update(_fontStyle); -} - -void FastEPDDisplay::setTextSize(int sz) { - if (!_canvas) return; - _frameCRC.update(sz); - - // Check for custom font style first (Noto Sans, Montserrat) - const GFXfont* customFont = meckGetFont(_fontStyle, sz); - if (customFont) { - _canvas->setFont(customFont); - _currentFont = customFont; - // textSize 5 (clock face) uses x5 scaling even with custom fonts - _currentTextScale = (sz == 5) ? 5 : 1; - _canvas->setTextSize(_currentTextScale); - return; - } - - // Classic style (or fallback) -- original FreeSans/FreeSerif fonts - // Toggle between font families via -D MECK_SERIF_FONT build flag - _currentTextScale = 1; - switch(sz) { - case 0: // Body text -- reader content, settings rows, messages, footers -#ifdef MECK_SERIF_FONT - _canvas->setFont(&FreeSerif12pt7b); - _currentFont = &FreeSerif12pt7b; -#else - _canvas->setFont(&FreeSans12pt7b); - _currentFont = &FreeSans12pt7b; -#endif - _canvas->setTextSize(1); - break; - case 1: // Headings -- screen titles, channel names (bold, same height as body) - _canvas->setFont(&FreeSansBold12pt7b); - _currentFont = &FreeSansBold12pt7b; - _canvas->setTextSize(1); - break; - case 2: // Large bold -- MSG count, tile letters - _canvas->setFont(&FreeSansBold18pt7b); - _currentFont = &FreeSansBold18pt7b; - _canvas->setTextSize(1); - break; - case 3: // Extra large -- splash screen title - _canvas->setFont(&FreeSansBold24pt7b); - _currentFont = &FreeSansBold24pt7b; - _canvas->setTextSize(1); - break; - case 5: // Clock face -- lock screen (FreeSansBold24pt scaled 5x) - _canvas->setFont(&FreeSansBold24pt7b); - _currentFont = &FreeSansBold24pt7b; - _currentTextScale = 5; - _canvas->setTextSize(5); - break; - default: -#ifdef MECK_SERIF_FONT - _canvas->setFont(&FreeSerif12pt7b); - _currentFont = &FreeSerif12pt7b; -#else - _canvas->setFont(&FreeSans12pt7b); - _currentFont = &FreeSans12pt7b; -#endif - _canvas->setTextSize(1); - break; - } -} - -void FastEPDDisplay::setColor(Color c) { - if (!_canvas) return; - _frameCRC.update(c); - - // Colours are inverted for e-paper: - // DARK = background colour = WHITE on e-paper - // LIGHT = foreground colour = BLACK on e-paper - if (c == DARK) { - _canvas->setTextColor(1); // White (background) - _curr_color = GxEPD_WHITE; - } else { - _canvas->setTextColor(0); // Black (foreground) - _curr_color = GxEPD_BLACK; - } -} - -void FastEPDDisplay::setCursor(int x, int y) { - if (!_canvas) return; - _frameCRC.update(x); - _frameCRC.update(y); - - // Scale virtual coordinates to physical, with baseline offset. - // The +5 pushes text baseline down so ascenders at y=0 are visible. - _canvas->setCursor( - (int)((x + offset_x) * scale_x), - (int)((y + offset_y + 5) * scale_y) - ); -} - -void FastEPDDisplay::print(const char* str) { - if (!_canvas || !str) return; - _frameCRC.update(str, strlen(str)); - - if (!hasNonAscii(str)) { - // Pure ASCII fast path - _canvas->print(str); - return; - } - - const uint8_t* s = (const uint8_t*)str; - int len = strlen(str); - int pos = 0; - bool has8bFont = _currentFont && _currentFont->last > 0xFF; - - while (pos < len) { - uint8_t b = s[pos]; - if (b < 0x80) { - _canvas->write(b); - pos++; - } else { - int consumed; - uint32_t cp = utf8Decode(s + pos, len - pos, &consumed); - if (has8bFont && cp >= _currentFont->first && cp <= _currentFont->last) { - drawGlyphAtCursor((uint16_t)cp); - } else if (!has8bFont) { - char folded = foldToAscii(cp); - if (folded) _canvas->write((uint8_t)folded); - } - pos += consumed; - } - } -} - -void FastEPDDisplay::drawGlyphAtCursor(uint16_t cp) { - if (!_canvas || !_currentFont || cp < _currentFont->first || cp > _currentFont->last) return; - - uint16_t idx = cp - _currentFont->first; - GFXglyph* glyph = &_currentFont->glyph[idx]; - - uint8_t gw = glyph->width; - uint8_t gh = glyph->height; - int8_t xo = glyph->xOffset; - int8_t yo = glyph->yOffset; - uint16_t bo = glyph->bitmapOffset; - uint8_t xa = glyph->xAdvance; - - int16_t cx = _canvas->getCursorX(); - int16_t cy = _canvas->getCursorY(); - - // Canvas color: 0 = black, 1 = white - uint16_t canvasColor = (_curr_color == GxEPD_BLACK) ? 0 : 1; - - if (gw > 0 && gh > 0) { - const uint8_t* bitmap = _currentFont->bitmap; - uint8_t bit = 0, bits = 0; - - for (uint8_t yy = 0; yy < gh; yy++) { - for (uint8_t xx = 0; xx < gw; xx++) { - if (!(bit++ & 7)) bits = bitmap[bo++]; - if (bits & 0x80) { - if (_currentTextScale == 1) { - _canvas->drawPixel(cx + xo + xx, cy + yo + yy, canvasColor); - } else { - _canvas->fillRect( - cx + (xo + xx) * _currentTextScale, - cy + (yo + yy) * _currentTextScale, - _currentTextScale, _currentTextScale, canvasColor); - } - } - bits <<= 1; - } - } - } - - _canvas->setCursor(cx + xa * _currentTextScale, cy); -} - -void FastEPDDisplay::fillRect(int x, int y, int w, int h) { - if (!_canvas) return; - _frameCRC.update(x); - _frameCRC.update(y); - _frameCRC.update(w); - _frameCRC.update(h); - - // Canvas uses 1-bit color: convert GxEPD color - uint16_t canvasColor = (_curr_color == GxEPD_BLACK) ? 0 : 1; - _canvas->fillRect( - (int)((x + offset_x) * scale_x), - (int)((y + offset_y) * scale_y), - (int)(w * scale_x), - (int)(h * scale_y), - canvasColor - ); -} - -void FastEPDDisplay::drawRect(int x, int y, int w, int h) { - if (!_canvas) return; - _frameCRC.update(x); - _frameCRC.update(y); - _frameCRC.update(w); - _frameCRC.update(h); - - uint16_t canvasColor = (_curr_color == GxEPD_BLACK) ? 0 : 1; - _canvas->drawRect( - (int)((x + offset_x) * scale_x), - (int)((y + offset_y) * scale_y), - (int)(w * scale_x), - (int)(h * scale_y), - canvasColor - ); -} - -void FastEPDDisplay::drawXbm(int x, int y, const uint8_t* bits, int w, int h) { - if (!_canvas || !bits) return; - _frameCRC.update(x); - _frameCRC.update(y); - _frameCRC.update(w); - _frameCRC.update(h); - _frameCRC.update(bits, (w * h + 7) / 8); - - uint16_t canvasColor = (_curr_color == GxEPD_BLACK) ? 0 : 1; - uint16_t startX = (int)((x + offset_x) * scale_x); - uint16_t startY = (int)((y + offset_y) * scale_y); - uint16_t widthInBytes = (w + 7) / 8; - - for (uint16_t by = 0; by < h; by++) { - int y1 = startY + (int)(by * scale_y); - int y2 = startY + (int)((by + 1) * scale_y); - int block_h = y2 - y1; - - for (uint16_t bx = 0; bx < w; bx++) { - int x1 = startX + (int)(bx * scale_x); - int x2 = startX + (int)((bx + 1) * scale_x); - int block_w = x2 - x1; - - uint16_t byteOffset = (by * widthInBytes) + (bx / 8); - uint8_t bitMask = 0x80 >> (bx & 7); - bool bitSet = pgm_read_byte(bits + byteOffset) & bitMask; - - if (bitSet) { - _canvas->fillRect(x1, y1, block_w, block_h, canvasColor); - } - } - } -} - -uint16_t FastEPDDisplay::getTextWidth(const char* str) { - if (!_canvas || !str) return 0; - - if (!hasNonAscii(str)) { - int16_t x1, y1; - uint16_t w, h; - _canvas->getTextBounds(str, 0, 0, &x1, &y1, &w, &h); - return (uint16_t)ceil((w + 1) / scale_x); - } - - bool has8bFont = _currentFont && _currentFont->last > 0xFF; - - if (has8bFont) { - const uint8_t* s = (const uint8_t*)str; - int len = strlen(str); - int pos = 0; - int totalAdv = 0; - while (pos < len) { - int consumed; - uint32_t cp = utf8Decode(s + pos, len - pos, &consumed); - if (cp >= _currentFont->first && cp <= _currentFont->last) { - totalAdv += _currentFont->glyph[cp - _currentFont->first].xAdvance * _currentTextScale; - } - pos += consumed; - } - return (uint16_t)ceil((totalAdv + 1) / scale_x); - } - - // Classic/7b: fold to ASCII, then measure - char folded[256]; - const uint8_t* s = (const uint8_t*)str; - int len = strlen(str); - int pos = 0, fi = 0; - while (pos < len && fi < 254) { - uint8_t b = s[pos]; - if (b < 0x80) { - folded[fi++] = (char)b; - pos++; - } else { - int consumed; - uint32_t cp = utf8Decode(s + pos, len - pos, &consumed); - char fc = foldToAscii(cp); - if (fc) folded[fi++] = fc; - pos += consumed; - } - } - folded[fi] = 0; - int16_t x1, y1; - uint16_t w, h; - _canvas->getTextBounds(folded, 0, 0, &x1, &y1, &w, &h); - return (uint16_t)ceil((w + 1) / scale_x); -} - -void FastEPDDisplay::endFrame() { - if (!_epd || !_canvas) return; - - uint32_t crc = _frameCRC.finalize(); - if (crc == _lastCRC) { - return; // Frame unchanged, skip display update - } - _lastCRC = crc; - - // Copy GFXcanvas1 buffer to FastEPD's current buffer — direct copy. - // Both use same polarity: bit 1 = white, bit 0 = black. - uint8_t* src = _canvas->getBuffer(); - uint8_t* dst = _epd->currentBuffer(); - size_t bufSize = ((uint32_t)EPD_WIDTH * EPD_HEIGHT) / 8; - - if (!src || !dst) return; - - memcpy(dst, src, bufSize); - - // Dark mode: invert every byte in the buffer (white↔black) - if (_darkMode) { - for (size_t i = 0; i < bufSize; i++) dst[i] = ~dst[i]; - } - - // Refresh strategy: - // partialUpdate(true) — no flash, differential, keeps previous buffer - // fullUpdate(false) — brief flash, clears ghosting (CLEAR_FAST) - // fullUpdate(true) — full white flash, cleanest (boot only) - // - // Use partial for most frames. Periodic full refresh every N frames - // to clear accumulated ghosting artifacts. - _fullRefreshCount++; - if (_forcePartial) { - // VKB typing mode — no flash, fast differential update - _epd->partialUpdate(true); - _fullRefreshCount = 0; // Reset so next non-partial frame does full refresh - } else if (_fullRefreshCount >= FULL_SLOW_PERIOD) { - _fullRefreshCount = 0; - _epd->fullUpdate(true); // Full clean refresh — clears all ghosting - } else { - _epd->partialUpdate(true); // No flash — differential - } - _epd->backupPlane(); -} - -void FastEPDDisplay::translateUTF8ToBlocks(char* dest, const char* src, size_t dest_size) { - if (_currentFont && _currentFont->last > 0xFF) { - strncpy(dest, src, dest_size - 1); - dest[dest_size - 1] = '\0'; - return; - } - // Classic/7b: fold accented chars to ASCII - size_t j = 0; - const uint8_t* s = (const uint8_t*)src; - int len = strlen(src); - int pos = 0; - while (pos < len && j < dest_size - 1) { - uint8_t b = s[pos]; - if (b >= 32 && b <= 126) { - dest[j++] = (char)b; - pos++; - } else if (b >= 0x80) { - int consumed; - uint32_t cp = utf8Decode(s + pos, len - pos, &consumed); - char folded = foldToAscii(cp); - if (folded) dest[j++] = folded; - pos += consumed; - } else { - pos++; - } - } - dest[j] = 0; -} - -void FastEPDDisplay::setDarkMode(bool dark) { - _darkMode = dark; - _lastCRC = 0; // Force redraw - Serial.printf("[FastEPD] Dark mode: %s\n", dark ? "ON" : "OFF"); -} - -void FastEPDDisplay::setPortraitMode(bool portrait) { - if (_portraitMode == portrait) return; - _portraitMode = portrait; - - if (!_canvas) return; - - if (portrait) { - _canvas->setRotation(3); // 270° CW — USB-C on right when held portrait - scale_x = (float)EPD_HEIGHT / 128.0f; // 540 / 128 = 4.21875 - scale_y = (float)EPD_WIDTH / 128.0f; // 960 / 128 = 7.5 - Serial.printf("[FastEPD] Portrait mode: ON (logical %dx%d, scale %.2f x %.2f)\n", - EPD_HEIGHT, EPD_WIDTH, scale_x, scale_y); - } else { - _canvas->setRotation(0); // Normal landscape - scale_x = (float)EPD_WIDTH / 128.0f; // 960 / 128 = 7.5 - scale_y = (float)EPD_HEIGHT / 128.0f; // 540 / 128 = 4.21875 - Serial.printf("[FastEPD] Portrait mode: OFF (logical %dx%d, scale %.2f x %.2f)\n", - EPD_WIDTH, EPD_HEIGHT, scale_x, scale_y); - } - _lastCRC = 0; // Force redraw -} \ No newline at end of file diff --git a/src/helpers/ui/FastEPDDisplay.h b/src/helpers/ui/FastEPDDisplay.h deleted file mode 100644 index 792a60dd..00000000 --- a/src/helpers/ui/FastEPDDisplay.h +++ /dev/null @@ -1,145 +0,0 @@ -#pragma once - -// ============================================================================= -// FastEPDDisplay — Parallel e-ink display driver for T5 S3 E-Paper Pro -// -// Architecture: -// - FastEPD handles hardware init, power management, and display refresh -// - Adafruit_GFX GFXcanvas1 handles all drawing/text rendering -// - On endFrame(), canvas buffer is copied to FastEPD and display is updated -// -// This avoids depending on FastEPD's drawing API — only uses its well-tested -// hardware interface (initPanel, fullUpdate, partialUpdate, currentBuffer). -// ============================================================================= - -#include -#include "variant.h" // EPD_WIDTH, EPD_HEIGHT (only compiled for T5S3 builds) -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// Meck custom font styles (Noto Sans, Montserrat) -#include "MeckFonts.h" - -#include "DisplayDriver.h" - -// GxEPD2 color constant compatibility — MapScreen uses these directly -#ifndef GxEPD_BLACK -#define GxEPD_BLACK 0x0000 -#endif -#ifndef GxEPD_WHITE -#define GxEPD_WHITE 0xFFFF -#endif - -// Forward declare FastEPD class (actual include in .cpp) -class FASTEPD; - -// Inline CRC32 for frame change detection -// (Copied from GxEPDDisplay.h — avoids CRC32/PNGdec name collision) -class FrameCRC32 { - uint32_t _crc = 0xFFFFFFFF; -public: - void reset() { _crc = 0xFFFFFFFF; } - template void update(T val) { - const uint8_t* p = (const uint8_t*)&val; - for (size_t i = 0; i < sizeof(T); i++) { - _crc ^= p[i]; - for (int b = 0; b < 8; b++) - _crc = (_crc >> 1) ^ (0xEDB88320 & -(int32_t)(_crc & 1)); - } - } - template void update(const T* data, size_t len) { - const uint8_t* p = (const uint8_t*)data; - for (size_t i = 0; i < len * sizeof(T); i++) { - _crc ^= p[i]; - for (int b = 0; b < 8; b++) - _crc = (_crc >> 1) ^ (0xEDB88320 & -(int32_t)(_crc & 1)); - } - } - uint32_t finalize() { return _crc ^ 0xFFFFFFFF; } -}; - - -class FastEPDDisplay : public DisplayDriver { - FASTEPD* _epd; - GFXcanvas1* _canvas; // Adafruit_GFX 1-bit drawing surface (960×540) - bool _init = false; - bool _isOn = false; - uint16_t _curr_color; // GxEPD_BLACK or GxEPD_WHITE for canvas drawing - FrameCRC32 _frameCRC; - uint32_t _lastCRC = 0; - int _fullRefreshCount = 0; // Track for periodic slow refresh - uint32_t _lastUpdateMs = 0; // Rate limiting — minimum interval between refreshes - bool _forcePartial = false; // When true, use partial updates (VKB typing) - bool _darkMode = false; // Invert all pixels (black bg, white text) - bool _portraitMode = false; // Rotated 90 (540x960 logical) - const GFXfont* _currentFont = nullptr; // Track for UTF-8 rendering - uint8_t _currentTextScale = 1; // Track glyph scale factor - - // Render one glyph from the current 8b font at the canvas cursor position - void drawGlyphAtCursor(uint16_t cp); - - // Virtual 128×128 → physical canvas mapping (runtime, changes with portrait) - float scale_x = 7.5f; // 960 / 128 (landscape default) - float scale_y = 4.21875f; // 540 / 128 (landscape default) - static constexpr float offset_x = 0.0f; - static constexpr float offset_y = 0.0f; - -public: - FastEPDDisplay() : DisplayDriver(128, 128), _epd(nullptr), _canvas(nullptr) {} - ~FastEPDDisplay(); - - bool begin(); - - bool isOn() override { return _isOn; } - void turnOn() override; - void turnOff() override; - void clear() override; - void startFrame(Color bkg = DARK) override; - void setTextSize(int sz) override; - void setColor(Color c) override; - void setCursor(int x, int y) override; - void print(const char* str) override; - void fillRect(int x, int y, int w, int h) override; - void drawRect(int x, int y, int w, int h) override; - void drawXbm(int x, int y, const uint8_t* bits, int w, int h) override; - uint16_t getTextWidth(const char* str) override; - void endFrame() override; - void translateUTF8ToBlocks(char* dest, const char* src, size_t dest_size) override; - - // --- Raw pixel access for MapScreen (bypasses scaling) --- - void drawPixelRaw(int16_t x, int16_t y, uint16_t color) { - if (_canvas) _canvas->drawPixel(x, y, color ? 1 : 0); - } - int16_t rawWidth() { return EPD_WIDTH; } - int16_t rawHeight() { return EPD_HEIGHT; } - - void drawTextRaw(int16_t x, int16_t y, const char* text, uint16_t color) { - if (!_canvas) return; - _canvas->setFont(NULL); - _canvas->setTextSize(3); // 3× built-in 5×7 = 15×21, readable on 960×540 - _canvas->setTextColor(color ? 1 : 0); - _canvas->setCursor(x, y); - _canvas->print(text); - } - - void invalidateFrameCRC() { _lastCRC = 0; } - - // Temporarily force partial (no-flash) updates — use during VKB typing - void setForcePartial(bool partial) { _forcePartial = partial; } - bool isForcePartial() const { return _forcePartial; } - - // Dark mode — invert all pixels in endFrame (black bg, white text) - void setDarkMode(bool dark); - bool isDarkMode() const { return _darkMode; } - - // Portrait mode — rotate canvas 90° (540×960 logical), swap scale factors - void setPortraitMode(bool portrait); - bool isPortraitMode() const { return _portraitMode; } -}; \ No newline at end of file diff --git a/src/helpers/ui/GxEPDDisplay.cpp b/src/helpers/ui/GxEPDDisplay.cpp index 20897ae3..bccfdbeb 100644 --- a/src/helpers/ui/GxEPDDisplay.cpp +++ b/src/helpers/ui/GxEPDDisplay.cpp @@ -120,10 +120,6 @@ bool GxEPDDisplay::begin() { // Tell GxEPD2 to use our SPI instance // Using slower speed (4MHz) for reliable e-ink communication display.epd2.selectSPI(displaySpi, SPISettings(4000000, MSBFIRST, SPI_MODE0)); -#elif defined(LILYGO_TECHO) - // T-Echo Lite: display on SPI1 (pins 19/20), LoRa on SPI (pins 13/15/17) - SPI1.begin(); - display.epd2.selectSPI(SPI1, SPISettings(4000000, MSBFIRST, SPI_MODE0)); #endif // Initialize with: diff --git a/src/helpers/ui/GxEPDDisplay.h b/src/helpers/ui/GxEPDDisplay.h index d35ead19..db62ba30 100644 --- a/src/helpers/ui/GxEPDDisplay.h +++ b/src/helpers/ui/GxEPDDisplay.h @@ -1,11 +1,5 @@ #pragma once -// T5S3 E-Paper Pro uses parallel e-ink (FastEPD), not SPI (GxEPD2) -#if defined(LilyGo_T5S3_EPaper_Pro) - #include "FastEPDDisplay.h" - using GxEPDDisplay = FastEPDDisplay; -#else - #include #include @@ -224,4 +218,3 @@ public: } }; -#endif // !LilyGo_T5S3_EPaper_Pro \ No newline at end of file diff --git a/variants/heltec_v4/README.md b/variants/heltec_v4/README.md index 09d6f6df..4fdd22eb 100644 --- a/variants/heltec_v4/README.md +++ b/variants/heltec_v4/README.md @@ -58,4 +58,4 @@ pio run -e meck_wifi_repeater_heltec_v4 -t upload - OTA firmware updates work over WiFi via the Mycelium dashboard - Config changes require re-uploading SPIFFS (`-t uploadfs`) - The same `main.cpp`, `WiFiMQTT.h/cpp`, and `MyMesh.cpp` are shared - with T-Deck Pro and T5S3 builds — no Heltec-specific source changes + with T-Deck Pro builds -- no Heltec-specific source changes diff --git a/variants/lilygo_t5s3_epaper_pro/CPUPowerManager.h b/variants/lilygo_t5s3_epaper_pro/CPUPowerManager.h deleted file mode 100644 index 444a90bd..00000000 --- a/variants/lilygo_t5s3_epaper_pro/CPUPowerManager.h +++ /dev/null @@ -1,113 +0,0 @@ -#pragma once - -#include - -// CPU Frequency Scaling for ESP32-S3 -// -// Typical current draw (CPU only, rough): -// 240 MHz ~70-80 mA -// 160 MHz ~50-60 mA -// 80 MHz ~30-40 mA -// 40 MHz ~15-20 mA (low-power / lock screen mode) -// -// SPI peripherals and UART use their own clock dividers from the APB clock, -// so LoRa, e-ink, and GPS serial all work fine at 80MHz and 40MHz. - -#ifdef ESP32 - -#ifndef CPU_FREQ_IDLE -#define CPU_FREQ_IDLE 80 // MHz — normal mesh listening -#endif - -#ifndef CPU_FREQ_BOOST -#define CPU_FREQ_BOOST 240 // MHz — heavy processing -#endif - -#ifndef CPU_FREQ_LOW_POWER -#define CPU_FREQ_LOW_POWER 80 // MHz — lock screen / idle standby (40 MHz breaks I2C) -#endif - -#ifndef CPU_BOOST_TIMEOUT_MS -#define CPU_BOOST_TIMEOUT_MS 10000 // 10 seconds -#endif - -class CPUPowerManager { -public: - CPUPowerManager() : _boosted(false), _lowPower(false), _boost_started(0) {} - - void begin() { - setCpuFrequencyMhz(CPU_FREQ_IDLE); - _boosted = false; - _lowPower = false; - MESH_DEBUG_PRINTLN("CPU power: idle at %d MHz", CPU_FREQ_IDLE); - } - - void loop() { - if (_boosted && (millis() - _boost_started >= CPU_BOOST_TIMEOUT_MS)) { - // Return to low-power if locked, otherwise normal idle - if (_lowPower) { - setCpuFrequencyMhz(CPU_FREQ_LOW_POWER); - MESH_DEBUG_PRINTLN("CPU power: boost expired, returning to low-power %d MHz", CPU_FREQ_LOW_POWER); - } else { - setCpuFrequencyMhz(CPU_FREQ_IDLE); - MESH_DEBUG_PRINTLN("CPU power: idle at %d MHz", CPU_FREQ_IDLE); - } - _boosted = false; - } - } - - void setBoost() { - if (!_boosted) { - setCpuFrequencyMhz(CPU_FREQ_BOOST); - _boosted = true; - MESH_DEBUG_PRINTLN("CPU power: boosted to %d MHz", CPU_FREQ_BOOST); - } - _boost_started = millis(); - } - - void setIdle() { - if (_boosted) { - setCpuFrequencyMhz(CPU_FREQ_IDLE); - _boosted = false; - MESH_DEBUG_PRINTLN("CPU power: idle at %d MHz", CPU_FREQ_IDLE); - } - if (_lowPower) { - _lowPower = false; - } - } - - // Low-power mode — drops CPU to 40 MHz for lock screen standby. - // If currently boosted, the boost timeout will return to 40 MHz - // instead of 80 MHz. - void setLowPower() { - _lowPower = true; - if (!_boosted) { - setCpuFrequencyMhz(CPU_FREQ_LOW_POWER); - MESH_DEBUG_PRINTLN("CPU power: low-power at %d MHz", CPU_FREQ_LOW_POWER); - } - // If boosted, the loop() timeout will drop to low-power instead of idle - } - - // Exit low-power mode — returns to normal idle (80 MHz). - // If currently boosted, the boost timeout will return to idle - // instead of low-power. - void clearLowPower() { - _lowPower = false; - if (!_boosted) { - setCpuFrequencyMhz(CPU_FREQ_IDLE); - MESH_DEBUG_PRINTLN("CPU power: idle at %d MHz (low-power cleared)", CPU_FREQ_IDLE); - } - // If boosted, the loop() timeout will drop to idle as normal - } - - bool isBoosted() const { return _boosted; } - bool isLowPower() const { return _lowPower; } - uint32_t getFrequencyMHz() const { return getCpuFrequencyMhz(); } - -private: - bool _boosted; - bool _lowPower; - unsigned long _boost_started; -}; - -#endif // ESP32 \ No newline at end of file diff --git a/variants/lilygo_t5s3_epaper_pro/PCF85063Clock.h b/variants/lilygo_t5s3_epaper_pro/PCF85063Clock.h deleted file mode 100644 index 52ab319b..00000000 --- a/variants/lilygo_t5s3_epaper_pro/PCF85063Clock.h +++ /dev/null @@ -1,209 +0,0 @@ -#pragma once -// ============================================================================= -// PCF85063Clock — PCF8563/BM8563 RTC driver for T5S3 E-Paper Pro -// -// Time registers at 0x02–0x08 (PCF8563 layout): -// 0x02 Seconds, 0x03 Minutes, 0x04 Hours, -// 0x05 Days, 0x06 Weekdays, 0x07 Months, 0x08 Years -// ============================================================================= - -#include -#include -#include - -#define PCF8563_ADDR 0x51 -#define PCF8563_REG_SECONDS 0x02 - -// Reject timestamps outside 2024–2036 (blocks MeshCore contacts garbage) -#define EPOCH_MIN_SANE 1704067200UL -#define EPOCH_MAX_SANE 2082758400UL - -class PCF85063Clock : public mesh::RTCClock { -public: - PCF85063Clock() : _wire(nullptr), _millis_offset(0), - _has_hw_time(false), _time_set_this_session(false) {} - - bool begin(TwoWire& wire) { - _wire = &wire; - - _wire->beginTransmission(PCF8563_ADDR); - if (_wire->endTransmission() != 0) { - Serial.println("[RTC] PCF8563 not found"); - return false; - } - - // Repair any corrupted registers from prior wrong-offset writes - repairRegisters(); - - uint32_t t = readHardwareTime(); - if (t > EPOCH_MIN_SANE && t < EPOCH_MAX_SANE) { - _has_hw_time = true; - _millis_offset = t - (millis() / 1000); - Serial.printf("[RTC] PCF8563 OK, time=%lu\n", t); - } else { - _has_hw_time = false; - Serial.printf("[RTC] PCF8563 no valid time (%lu), awaiting BLE sync\n", t); - } - return true; - } - - uint32_t getCurrentTime() override { - if (_time_set_this_session) { - return _millis_offset + (millis() / 1000); - } - if (_has_hw_time && _wire) { - uint32_t t = readHardwareTime(); - if (t > EPOCH_MIN_SANE && t < EPOCH_MAX_SANE) { - _millis_offset = t - (millis() / 1000); - return t; - } - _has_hw_time = false; - } - return _millis_offset + (millis() / 1000); - } - - void setCurrentTime(uint32_t time) override { - if (time < EPOCH_MIN_SANE || time > EPOCH_MAX_SANE) { - Serial.printf("[RTC] setCurrentTime(%lu) REJECTED\n", time); - return; - } - _millis_offset = time - (millis() / 1000); - _time_set_this_session = true; - Serial.printf("[RTC] setCurrentTime(%lu) OK\n", time); - if (_wire) writeHardwareTime(time); - } - -private: - TwoWire* _wire; - uint32_t _millis_offset; - bool _has_hw_time; - bool _time_set_this_session; - - // ---- Register helpers ---- - void writeReg(uint8_t reg, uint8_t val) { - _wire->beginTransmission(PCF8563_ADDR); - _wire->write(reg); - _wire->write(val); - _wire->endTransmission(); - } - - uint8_t readReg(uint8_t reg) { - _wire->beginTransmission(PCF8563_ADDR); - _wire->write(reg); - if (_wire->endTransmission(false) != 0) return 0xFF; - if (_wire->requestFrom((uint8_t)PCF8563_ADDR, (uint8_t)1) != 1) return 0xFF; - return _wire->read(); - } - - // ---- Fix registers corrupted by prior PCF85063A-mode writes ---- - void repairRegisters() { - uint8_t hours = readReg(0x04) & 0x3F; - if (bcd2dec(hours) > 23) { - Serial.printf("[RTC] Repairing hours (0x%02X→0x00)\n", hours); - writeReg(0x04, 0x00); - } - uint8_t days = readReg(0x05) & 0x3F; - if (bcd2dec(days) == 0 || bcd2dec(days) > 31) { - Serial.printf("[RTC] Repairing days (0x%02X→0x01)\n", days); - writeReg(0x05, 0x01); - } - uint8_t month = readReg(0x07) & 0x1F; - if (bcd2dec(month) == 0 || bcd2dec(month) > 12) { - Serial.printf("[RTC] Repairing month (0x%02X→0x01)\n", month); - writeReg(0x07, 0x01); - } - } - - // ---- BCD ---- - static uint8_t bcd2dec(uint8_t bcd) { return ((bcd >> 4) * 10) + (bcd & 0x0F); } - static uint8_t dec2bcd(uint8_t dec) { return ((dec / 10) << 4) | (dec % 10); } - - // ---- Date helpers ---- - static bool isLeap(int y) { return (y%4==0 && y%100!=0) || y%400==0; } - static int daysInMonth(int m, int y) { - static const uint8_t d[] = {31,28,31,30,31,30,31,31,30,31,30,31}; - return (m==2 && isLeap(y)) ? 29 : d[m-1]; - } - - static uint32_t toEpoch(int yr, int mo, int dy, int h, int mi, int s) { - uint32_t days = 0; - for (int y = 1970; y < yr; y++) days += isLeap(y) ? 366 : 365; - for (int m = 1; m < mo; m++) days += daysInMonth(m, yr); - days += (dy - 1); - return days * 86400UL + h * 3600UL + mi * 60UL + s; - } - - static void fromEpoch(uint32_t ep, int& yr, int& mo, int& dy, int& h, int& mi, int& s) { - s = ep % 60; ep /= 60; - mi = ep % 60; ep /= 60; - h = ep % 24; ep /= 24; - yr = 1970; - while (true) { int d = isLeap(yr)?366:365; if (ep<(uint32_t)d) break; ep-=d; yr++; } - mo = 1; - while (true) { int d = daysInMonth(mo,yr); if (ep<(uint32_t)d) break; ep-=d; mo++; } - dy = ep + 1; - } - - // ---- Read time (burst from 0x02) ---- - uint32_t readHardwareTime() { - _wire->beginTransmission(PCF8563_ADDR); - _wire->write(PCF8563_REG_SECONDS); - if (_wire->endTransmission(false) != 0) return 0; - if (_wire->requestFrom((uint8_t)PCF8563_ADDR, (uint8_t)7) != 7) return 0; - - uint8_t raw[7]; - for (int i = 0; i < 7; i++) raw[i] = _wire->read(); - - if (raw[0] & 0x80) { - Serial.println("[RTC] OS flag set — clearing"); - writeReg(PCF8563_REG_SECONDS, raw[0] & 0x7F); - return 0; - } - - int second = bcd2dec(raw[0] & 0x7F); - int minute = bcd2dec(raw[1] & 0x7F); - int hour = bcd2dec(raw[2] & 0x3F); - int day = bcd2dec(raw[3] & 0x3F); - int month = bcd2dec(raw[5] & 0x1F); - int year = 2000 + bcd2dec(raw[6]); - - if (month<1 || month>12 || day<1 || day>31 || hour>23 || minute>59 || second>59) - return 0; - - return toEpoch(year, month, day, hour, minute, second); - } - - // ---- Write time (burst to 0x02) ---- - void writeHardwareTime(uint32_t epoch) { - int year, month, day, hour, minute, second; - fromEpoch(epoch, year, month, day, hour, minute, second); - - static const int dow[] = {0,3,2,5,0,3,5,1,4,6,2,4}; - int y = year; if (month < 3) y--; - int wday = (y + y/4 - y/100 + y/400 + dow[month-1] + day) % 7; - int yr = year - 2000; - - // Stop clock - writeReg(0x00, 0x20); - delay(5); - - // Burst write - _wire->beginTransmission(PCF8563_ADDR); - _wire->write(PCF8563_REG_SECONDS); - _wire->write(dec2bcd(second) & 0x7F); - _wire->write(dec2bcd(minute)); - _wire->write(dec2bcd(hour)); - _wire->write(dec2bcd(day)); - _wire->write(dec2bcd(wday)); - _wire->write(dec2bcd(month)); - _wire->write(dec2bcd(yr)); - _wire->endTransmission(); - delay(5); - - // Restart clock - writeReg(0x00, 0x00); - - Serial.printf("[RTC] Wrote %04d-%02d-%02d %02d:%02d:%02d\n", - year, month, day, hour, minute, second); - } -}; \ No newline at end of file diff --git a/variants/lilygo_t5s3_epaper_pro/T5S3Board.cpp b/variants/lilygo_t5s3_epaper_pro/T5S3Board.cpp deleted file mode 100644 index 7704d8e0..00000000 --- a/variants/lilygo_t5s3_epaper_pro/T5S3Board.cpp +++ /dev/null @@ -1,461 +0,0 @@ -#include -#include "variant.h" -#include "T5S3Board.h" -#include // For MESH_DEBUG_PRINTLN - -void T5S3Board::begin() { - MESH_DEBUG_PRINTLN("T5S3Board::begin() - starting"); - - // Initialize I2C with T5S3 V2 pins - // Note: No explicit peripheral power enable needed on T5S3 - // (unlike T-Deck Pro's PIN_PERF_POWERON) - Wire.begin(I2C_SDA, I2C_SCL); - Wire.setClock(100000); // 100kHz for reliable fuel gauge communication - MESH_DEBUG_PRINTLN("T5S3Board::begin() - I2C initialized (SDA=%d, SCL=%d)", I2C_SDA, I2C_SCL); - - // Call parent class begin (handles CPU freq, etc.) - // Note: ESP32Board::begin() also calls Wire.begin() but with our - // PIN_BOARD_SDA/SCL defines it will use the same pins — harmless. - ESP32Board::begin(); - - // Configure backlight (off by default — save power) - #ifdef BOARD_BL_EN - pinMode(BOARD_BL_EN, OUTPUT); - digitalWrite(BOARD_BL_EN, LOW); - MESH_DEBUG_PRINTLN("T5S3Board::begin() - backlight pin configured (GPIO%d)", BOARD_BL_EN); - #endif - - // Configure user button - pinMode(PIN_USER_BTN, INPUT); - - // Configure LoRa SPI MISO pullup - pinMode(P_LORA_MISO, INPUT_PULLUP); - - // Handle wake from deep sleep - esp_reset_reason_t reason = esp_reset_reason(); - if (reason == ESP_RST_DEEPSLEEP) { - uint64_t wakeup_source = esp_sleep_get_ext1_wakeup_status(); - if (wakeup_source & (1ULL << P_LORA_DIO_1)) { - startup_reason = BD_STARTUP_RX_PACKET; - } - rtc_gpio_hold_dis((gpio_num_t)P_LORA_NSS); - rtc_gpio_deinit((gpio_num_t)P_LORA_DIO_1); - } - - // Test BQ27220 communication and configure design capacity - #if HAS_BQ27220 - uint16_t voltage = getBattMilliVolts(); - MESH_DEBUG_PRINTLN("T5S3Board::begin() - Battery voltage: %d mV", voltage); - configureFuelGauge(); - #endif - - // Early low-voltage protection - #if HAS_BQ27220 && defined(AUTO_SHUTDOWN_MILLIVOLTS) - { - uint16_t bootMv = getBattMilliVolts(); - if (bootMv > 0 && bootMv < AUTO_SHUTDOWN_MILLIVOLTS) { - Serial.printf("CRITICAL: Boot voltage %dmV < %dmV — sleeping immediately\n", - bootMv, AUTO_SHUTDOWN_MILLIVOLTS); - esp_sleep_disable_wakeup_source(ESP_SLEEP_WAKEUP_ALL); - esp_sleep_enable_ext1_wakeup(1ULL << PIN_USER_BTN, ESP_EXT1_WAKEUP_ANY_HIGH); - esp_deep_sleep_start(); - } - } - #endif - - MESH_DEBUG_PRINTLN("T5S3Board::begin() - complete"); -} - -// ---- BQ27220 register helpers (static, file-local) ---- - -#if HAS_BQ27220 -static uint16_t bq27220_read16(uint8_t reg) { - Wire.beginTransmission(BQ27220_I2C_ADDR); - Wire.write(reg); - if (Wire.endTransmission(false) != 0) return 0; - if (Wire.requestFrom((uint8_t)BQ27220_I2C_ADDR, (uint8_t)2) != 2) return 0; - uint16_t val = Wire.read(); - val |= (Wire.read() << 8); - return val; -} - -static uint8_t bq27220_read8(uint8_t reg) { - Wire.beginTransmission(BQ27220_I2C_ADDR); - Wire.write(reg); - if (Wire.endTransmission(false) != 0) return 0; - if (Wire.requestFrom((uint8_t)BQ27220_I2C_ADDR, (uint8_t)1) != 1) return 0; - return Wire.read(); -} - -static bool bq27220_writeControl(uint16_t subcmd) { - Wire.beginTransmission(BQ27220_I2C_ADDR); - Wire.write(0x00); - Wire.write(subcmd & 0xFF); - Wire.write((subcmd >> 8) & 0xFF); - return Wire.endTransmission() == 0; -} -#endif - -// ---- BQ27220 public interface ---- - -uint16_t T5S3Board::getBattMilliVolts() { - #if HAS_BQ27220 - Wire.beginTransmission(BQ27220_I2C_ADDR); - Wire.write(BQ27220_REG_VOLTAGE); - if (Wire.endTransmission(false) != 0) return 0; - uint8_t count = Wire.requestFrom((uint8_t)BQ27220_I2C_ADDR, (uint8_t)2); - if (count != 2) return 0; - uint16_t voltage = Wire.read(); - voltage |= (Wire.read() << 8); - return voltage; - #else - return 0; - #endif -} - -uint8_t T5S3Board::getBatteryPercent() { - #if HAS_BQ27220 - Wire.beginTransmission(BQ27220_I2C_ADDR); - Wire.write(BQ27220_REG_SOC); - if (Wire.endTransmission(false) != 0) return 0; - uint8_t count = Wire.requestFrom((uint8_t)BQ27220_I2C_ADDR, (uint8_t)2); - if (count != 2) return 0; - uint16_t soc = Wire.read(); - soc |= (Wire.read() << 8); - return (uint8_t)min(soc, (uint16_t)100); - #else - return 0; - #endif -} - -int16_t T5S3Board::getAvgCurrent() { - #if HAS_BQ27220 - return (int16_t)bq27220_read16(BQ27220_REG_AVG_CURRENT); - #else - return 0; - #endif -} - -int16_t T5S3Board::getAvgPower() { - #if HAS_BQ27220 - return (int16_t)bq27220_read16(BQ27220_REG_AVG_POWER); - #else - return 0; - #endif -} - -uint16_t T5S3Board::getTimeToEmpty() { - #if HAS_BQ27220 - return bq27220_read16(BQ27220_REG_TIME_TO_EMPTY); - #else - return 0xFFFF; - #endif -} - -uint16_t T5S3Board::getRemainingCapacity() { - #if HAS_BQ27220 - return bq27220_read16(BQ27220_REG_REMAIN_CAP); - #else - return 0; - #endif -} - -uint16_t T5S3Board::getFullChargeCapacity() { - #if HAS_BQ27220 - uint16_t fcc = bq27220_read16(BQ27220_REG_FULL_CAP); - if (fcc > BQ27220_DESIGN_CAPACITY_MAH) fcc = BQ27220_DESIGN_CAPACITY_MAH; - return fcc; - #else - return 0; - #endif -} - -uint16_t T5S3Board::getDesignCapacity() { - #if HAS_BQ27220 - return bq27220_read16(BQ27220_REG_DESIGN_CAP); - #else - return 0; - #endif -} - -int16_t T5S3Board::getBattTemperature() { - #if HAS_BQ27220 - uint16_t raw = bq27220_read16(BQ27220_REG_TEMPERATURE); - return (int16_t)(raw - 2731); // 0.1°K to 0.1°C - #else - return 0; - #endif -} - -// ---- BQ27220 Design Capacity configuration ---- -// The BQ27220 ships with a 3000 mAh default. T5S3 uses a 1500 mAh cell. -// This function checks on boot and writes the correct value via the -// MAC Data Memory interface if needed. The value persists in battery-backed -// RAM, so this typically only writes once (or after a full battery disconnect). -// -// When DC and DE are already correct but FCC is stuck (common after initial -// flash), the root cause is Qmax Cell 0 (0x9106) and stored FCC (0x929D) -// retaining factory 3000 mAh defaults. This function detects and fixes all -// three layers: DC/DE, Qmax, and stored FCC. - -bool T5S3Board::configureFuelGauge(uint16_t designCapacity_mAh) { -#if HAS_BQ27220 - uint16_t currentDC = bq27220_read16(BQ27220_REG_DESIGN_CAP); - Serial.printf("BQ27220: Design Capacity = %d mAh (target %d)\n", currentDC, designCapacity_mAh); - - if (currentDC == designCapacity_mAh) { - // Design Capacity correct, but check if Full Charge Capacity is sane. - uint16_t fcc = bq27220_read16(BQ27220_REG_FULL_CAP); - Serial.printf("BQ27220: Design Capacity already correct, FCC=%d mAh\n", fcc); - if (fcc >= designCapacity_mAh * 3 / 2) { - // FCC is >=150% of design — stale from factory defaults (typically 3000 mAh). - uint16_t designEnergy = (uint16_t)((uint32_t)designCapacity_mAh * 37 / 10); - Serial.printf("BQ27220: FCC %d >> DC %d, checking Design Energy (target %d mWh)\n", - fcc, designCapacity_mAh, designEnergy); - - // Unseal to read data memory and issue RESET - bq27220_writeControl(0x0414); delay(2); - bq27220_writeControl(0x3672); delay(2); - // Full Access - bq27220_writeControl(0xFFFF); delay(2); - bq27220_writeControl(0xFFFF); delay(2); - - // Enter CFG_UPDATE to access data memory - bq27220_writeControl(0x0090); - bool ready = false; - for (int i = 0; i < 50; i++) { - delay(20); - uint16_t opSt = bq27220_read16(BQ27220_REG_OP_STATUS); - if (opSt & 0x0400) { ready = true; break; } - } - if (ready) { - // Read Design Energy at data memory address 0x92A1 - Wire.beginTransmission(BQ27220_I2C_ADDR); - Wire.write(0x3E); Wire.write(0xA1); Wire.write(0x92); - Wire.endTransmission(); - delay(10); - uint8_t oldMSB = bq27220_read8(0x40); - uint8_t oldLSB = bq27220_read8(0x41); - uint16_t currentDE = (oldMSB << 8) | oldLSB; - - if (currentDE != designEnergy) { - // Design Energy actually needs updating — write it - uint8_t oldChk = bq27220_read8(0x60); - uint8_t dLen = bq27220_read8(0x61); - uint8_t newMSB = (designEnergy >> 8) & 0xFF; - uint8_t newLSB = designEnergy & 0xFF; - uint8_t temp = (255 - oldChk - oldMSB - oldLSB); - uint8_t newChk = 255 - ((temp + newMSB + newLSB) & 0xFF); - - Serial.printf("BQ27220: DE old=%d new=%d mWh, writing\n", currentDE, designEnergy); - - Wire.beginTransmission(BQ27220_I2C_ADDR); - Wire.write(0x3E); Wire.write(0xA1); Wire.write(0x92); - Wire.write(newMSB); Wire.write(newLSB); - Wire.endTransmission(); - delay(5); - Wire.beginTransmission(BQ27220_I2C_ADDR); - Wire.write(0x60); Wire.write(newChk); Wire.write(dLen); - Wire.endTransmission(); - delay(10); - - // Exit with reinit since we actually changed data - bq27220_writeControl(0x0091); // EXIT_CFG_UPDATE_REINIT - delay(200); - Serial.println("BQ27220: Design Energy written, exited CFG_UPDATE"); - } else { - // DC and DE are both correct, but FCC is stuck. - // Root cause: Qmax Cell 0 (0x9106) and stored FCC (0x929D) retain - // factory 3000 mAh defaults. Overwrite both with designCapacity_mAh. - Serial.printf("BQ27220: DE correct (%d mWh) — fixing Qmax + stored FCC\n", currentDE); - - // --- Helper lambda for MAC data memory 2-byte write --- - // Reads old value + checksum, computes differential checksum, writes new value. - auto writeDM16 = [](uint16_t addr, uint16_t newVal) -> bool { - // Select address - Wire.beginTransmission(BQ27220_I2C_ADDR); - Wire.write(0x3E); - Wire.write(addr & 0xFF); - Wire.write((addr >> 8) & 0xFF); - Wire.endTransmission(); - delay(10); - - uint8_t oldMSB = bq27220_read8(0x40); - uint8_t oldLSB = bq27220_read8(0x41); - uint8_t oldChk = bq27220_read8(0x60); - uint8_t dLen = bq27220_read8(0x61); - uint16_t oldVal = (oldMSB << 8) | oldLSB; - - if (oldVal == newVal) { - Serial.printf("BQ27220: [0x%04X] already %d, skip\n", addr, newVal); - return true; // already correct - } - - uint8_t newMSB = (newVal >> 8) & 0xFF; - uint8_t newLSB = newVal & 0xFF; - uint8_t temp = (255 - oldChk - oldMSB - oldLSB); - uint8_t newChk = 255 - ((temp + newMSB + newLSB) & 0xFF); - - Serial.printf("BQ27220: [0x%04X] %d -> %d\n", addr, oldVal, newVal); - - // Write new value - Wire.beginTransmission(BQ27220_I2C_ADDR); - Wire.write(0x3E); - Wire.write(addr & 0xFF); - Wire.write((addr >> 8) & 0xFF); - Wire.write(newMSB); - Wire.write(newLSB); - Wire.endTransmission(); - delay(5); - - // Write checksum - Wire.beginTransmission(BQ27220_I2C_ADDR); - Wire.write(0x60); - Wire.write(newChk); - Wire.write(dLen); - Wire.endTransmission(); - delay(10); - return true; - }; - - // Overwrite Qmax Cell 0 (IT Cfg) — this is what FCC is derived from - writeDM16(0x9106, designCapacity_mAh); - - // Overwrite stored FCC reference (Gas Gauging, 2 bytes before DC) - writeDM16(0x929D, designCapacity_mAh); - - // Exit with reinit to apply the new values - bq27220_writeControl(0x0091); // EXIT_CFG_UPDATE_REINIT - delay(200); - Serial.println("BQ27220: Qmax + stored FCC updated, exited CFG_UPDATE"); - } - } else { - Serial.println("BQ27220: Failed to enter CFG_UPDATE for DE check"); - } - - // Seal first, then issue RESET. - // RESET forces the gauge to fully reinitialize its Impedance Track - // algorithm and recalculate FCC from the current DC/DE values. - bq27220_writeControl(0x0030); // SEAL - delay(5); - Serial.println("BQ27220: Issuing RESET to force FCC recalculation..."); - bq27220_writeControl(0x0041); // RESET - delay(2000); // Full reset needs generous settle time - - fcc = bq27220_read16(BQ27220_REG_FULL_CAP); - Serial.printf("BQ27220: FCC after RESET: %d mAh (target <= %d)\n", fcc, designCapacity_mAh); - - if (fcc > designCapacity_mAh * 3 / 2) { - // RESET didn't fix FCC — the gauge IT algorithm is stubbornly - // retaining its learned value. This typically resolves after one - // full charge/discharge cycle. Software clamp in - // getFullChargeCapacity() ensures correct display regardless. - Serial.printf("BQ27220: FCC still stale at %d — software clamp active\n", fcc); - } - } - return true; - } - - Serial.printf("BQ27220: Updating Design Capacity from %d to %d mAh\n", currentDC, designCapacity_mAh); - - // Step 1: Unseal (default unseal keys) - bq27220_writeControl(0x0414); delay(2); - bq27220_writeControl(0x3672); delay(2); - - // Step 2: Full Access - bq27220_writeControl(0xFFFF); delay(2); - bq27220_writeControl(0xFFFF); delay(2); - - // Step 3: Enter CFG_UPDATE - bq27220_writeControl(0x0090); - bool cfgReady = false; - for (int i = 0; i < 50; i++) { - delay(20); - uint16_t opStatus = bq27220_read16(BQ27220_REG_OP_STATUS); - if (opStatus & 0x0400) { cfgReady = true; break; } - } - if (!cfgReady) { - Serial.println("BQ27220: Timeout waiting for CFGUPDATE"); - bq27220_writeControl(0x0092); - bq27220_writeControl(0x0030); - return false; - } - - // Step 4: Write Design Capacity at 0x929F - Wire.beginTransmission(BQ27220_I2C_ADDR); - Wire.write(0x3E); Wire.write(0x9F); Wire.write(0x92); - Wire.endTransmission(); - delay(10); - - uint8_t oldMSB = bq27220_read8(0x40); - uint8_t oldLSB = bq27220_read8(0x41); - uint8_t oldChk = bq27220_read8(0x60); - uint8_t dataLen = bq27220_read8(0x61); - - uint8_t newMSB = (designCapacity_mAh >> 8) & 0xFF; - uint8_t newLSB = designCapacity_mAh & 0xFF; - uint8_t temp = (255 - oldChk - oldMSB - oldLSB); - uint8_t newChk = 255 - ((temp + newMSB + newLSB) & 0xFF); - - Wire.beginTransmission(BQ27220_I2C_ADDR); - Wire.write(0x3E); Wire.write(0x9F); Wire.write(0x92); - Wire.write(newMSB); Wire.write(newLSB); - Wire.endTransmission(); - delay(5); - Wire.beginTransmission(BQ27220_I2C_ADDR); - Wire.write(0x60); Wire.write(newChk); Wire.write(dataLen); - Wire.endTransmission(); - delay(10); - - // Step 4a: Write Design Energy at 0x92A1 - { - uint16_t designEnergy = (uint16_t)((uint32_t)designCapacity_mAh * 37 / 10); - Wire.beginTransmission(BQ27220_I2C_ADDR); - Wire.write(0x3E); Wire.write(0xA1); Wire.write(0x92); - Wire.endTransmission(); - delay(10); - uint8_t deOldMSB = bq27220_read8(0x40); - uint8_t deOldLSB = bq27220_read8(0x41); - uint8_t deOldChk = bq27220_read8(0x60); - uint8_t deLen = bq27220_read8(0x61); - uint8_t deNewMSB = (designEnergy >> 8) & 0xFF; - uint8_t deNewLSB = designEnergy & 0xFF; - uint8_t deTemp = (255 - deOldChk - deOldMSB - deOldLSB); - uint8_t deNewChk = 255 - ((deTemp + deNewMSB + deNewLSB) & 0xFF); - - Serial.printf("BQ27220: Design Energy: old=%d new=%d mWh\n", - (deOldMSB << 8) | deOldLSB, designEnergy); - - Wire.beginTransmission(BQ27220_I2C_ADDR); - Wire.write(0x3E); Wire.write(0xA1); Wire.write(0x92); - Wire.write(deNewMSB); Wire.write(deNewLSB); - Wire.endTransmission(); - delay(5); - Wire.beginTransmission(BQ27220_I2C_ADDR); - Wire.write(0x60); Wire.write(deNewChk); Wire.write(deLen); - Wire.endTransmission(); - delay(10); - } - - // Step 5: Exit CFG_UPDATE with reinit - bq27220_writeControl(0x0091); - Serial.println("BQ27220: Sent EXIT_CFG_UPDATE_REINIT, waiting..."); - delay(200); - - // Step 6: Seal - bq27220_writeControl(0x0030); - delay(5); - - // Step 7: Force RESET to reinitialize FCC from new DC/DE - bq27220_writeControl(0x0041); // RESET - delay(1000); - - uint16_t verifyDC = bq27220_read16(BQ27220_REG_DESIGN_CAP); - uint16_t newFCC = bq27220_read16(BQ27220_REG_FULL_CAP); - Serial.printf("BQ27220: Post-config DC=%d FCC=%d mAh\n", verifyDC, newFCC); - - return verifyDC == designCapacity_mAh; -#else - return false; -#endif -} \ No newline at end of file diff --git a/variants/lilygo_t5s3_epaper_pro/T5S3Board.h b/variants/lilygo_t5s3_epaper_pro/T5S3Board.h deleted file mode 100644 index 7b4887f6..00000000 --- a/variants/lilygo_t5s3_epaper_pro/T5S3Board.h +++ /dev/null @@ -1,97 +0,0 @@ -#pragma once - -#include "variant.h" -#include -#include -#include "helpers/ESP32Board.h" -#include - -// BQ27220 Fuel Gauge Registers (shared with TDeckBoard) -#define BQ27220_REG_TEMPERATURE 0x06 -#define BQ27220_REG_VOLTAGE 0x08 -#define BQ27220_REG_CURRENT 0x0C -#define BQ27220_REG_SOC 0x2C -#define BQ27220_REG_REMAIN_CAP 0x10 -#define BQ27220_REG_FULL_CAP 0x12 -#define BQ27220_REG_AVG_CURRENT 0x14 -#define BQ27220_REG_TIME_TO_EMPTY 0x16 -#define BQ27220_REG_AVG_POWER 0x24 -#define BQ27220_REG_DESIGN_CAP 0x3C -#define BQ27220_REG_OP_STATUS 0x3A - -class T5S3Board : public ESP32Board { -public: - void begin(); - - void powerOff() override { - btStop(); - // Turn off backlight before sleeping - #ifdef BOARD_BL_EN - digitalWrite(BOARD_BL_EN, LOW); - #endif - } - - void enterDeepSleep(uint32_t secs, int pin_wake_btn) { - esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON); - - // Hold LoRa DIO1 and NSS during deep sleep - rtc_gpio_set_direction((gpio_num_t)P_LORA_DIO_1, RTC_GPIO_MODE_INPUT_ONLY); - rtc_gpio_pulldown_en((gpio_num_t)P_LORA_DIO_1); - rtc_gpio_hold_en((gpio_num_t)P_LORA_NSS); - - if (pin_wake_btn < 0) { - esp_sleep_enable_ext1_wakeup((1ULL << P_LORA_DIO_1), ESP_EXT1_WAKEUP_ANY_HIGH); - } else { - esp_sleep_enable_ext1_wakeup((1ULL << P_LORA_DIO_1) | (1ULL << pin_wake_btn), ESP_EXT1_WAKEUP_ANY_HIGH); - } - - if (secs > 0) { - esp_sleep_enable_timer_wakeup(secs * 1000000ULL); - } - - esp_deep_sleep_start(); - } - - // BQ27220 fuel gauge interface (identical register protocol to TDeckBoard) - uint16_t getBattMilliVolts() override; - uint8_t getBatteryPercent(); - int16_t getAvgCurrent(); - int16_t getAvgPower(); - uint16_t getTimeToEmpty(); - uint16_t getRemainingCapacity(); - uint16_t getFullChargeCapacity(); - uint16_t getDesignCapacity(); - int16_t getBattTemperature(); - bool configureFuelGauge(uint16_t designCapacity_mAh = BQ27220_DESIGN_CAPACITY_MAH); - - // Backlight control (GPIO11 — functional warm-tone front-light, PWM capable) - // Brightness 0-255 (0=off, 153=comfortable reading, 255=max) - bool _backlightOn = false; - uint8_t _backlightBrightness = 153; // Same default as Meshtastic - - void setBacklight(bool on) { - #ifdef BOARD_BL_EN - _backlightOn = on; - analogWrite(BOARD_BL_EN, on ? _backlightBrightness : 0); - #endif - } - - void setBacklightBrightness(uint8_t brightness) { - #ifdef BOARD_BL_EN - _backlightBrightness = brightness; - if (_backlightOn) { - analogWrite(BOARD_BL_EN, brightness); - } - #endif - } - - bool isBacklightOn() const { return _backlightOn; } - - void toggleBacklight() { - setBacklight(!_backlightOn); - } - - const char* getManufacturerName() const { - return "LilyGo T5S3 E-Paper Pro"; - } -}; \ No newline at end of file diff --git a/variants/lilygo_t5s3_epaper_pro/pins_arduino.h b/variants/lilygo_t5s3_epaper_pro/pins_arduino.h deleted file mode 100644 index 02d37c84..00000000 --- a/variants/lilygo_t5s3_epaper_pro/pins_arduino.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef Pins_Arduino_h -#define Pins_Arduino_h - -#include - -#define USB_VID 0x303a -#define USB_PID 0x1001 - -// Default Wire will be mapped to RTC, Touch, PCA9535, BQ25896, BQ27220, TPS65185 -static const uint8_t SDA = 39; -static const uint8_t SCL = 40; - -// Default SPI will be mapped to LoRa + SD card -static const uint8_t SS = 46; // LoRa CS -static const uint8_t MOSI = 13; -static const uint8_t MISO = 21; -static const uint8_t SCK = 14; - -#endif /* Pins_Arduino_h */ diff --git a/variants/lilygo_t5s3_epaper_pro/platformio.ini b/variants/lilygo_t5s3_epaper_pro/platformio.ini deleted file mode 100644 index fafcc81e..00000000 --- a/variants/lilygo_t5s3_epaper_pro/platformio.ini +++ /dev/null @@ -1,236 +0,0 @@ -; =========================================================================== -; LilyGo T5 S3 E-Paper Pro (H752-B / V2 hardware) -; 4.7" parallel e-ink (960x540), GT911 touch, SX1262 LoRa, no keyboard -; =========================================================================== -; -; Place t5s3-epaper-pro.json in boards/ directory. -; Place variant files in variants/LilyGo_T5S3_EPaper_Pro/ -; Place FastEPDDisplay.h/.cpp in src/helpers/ui/ -; - -[LilyGo_T5S3_EPaper_Pro] -extends = esp32_base -extra_scripts = post:merge_firmware.py -board = t5s3-epaper-pro -board_build.flash_mode = qio -board_build.f_flash = 80000000L -board_build.arduino.memory_type = qio_opi -board_upload.flash_size = 16MB -build_flags = - ${esp32_base.build_flags} - -I variants/lilygo_t5s3_epaper_pro - -D LilyGo_T5S3_EPaper_Pro - -D T5_S3_EPAPER_PRO_V2 - -D BOARD_HAS_PSRAM=1 - -D CORE_DEBUG_LEVEL=1 - -D FORMAT_SPIFFS_IF_FAILED=1 - -D FORMAT_LITTLEFS_IF_FAILED=1 - -D ARDUINO_USB_CDC_ON_BOOT=1 - -D RADIO_CLASS=CustomSX1262 - -D WRAPPER_CLASS=CustomSX1262Wrapper - -D LORA_TX_POWER=22 - -D SX126X_DIO2_AS_RF_SWITCH - -D SX126X_CURRENT_LIMIT=140 - -D SX126X_RX_BOOSTED_GAIN=1 - -D SX126X_DIO3_TCXO_VOLTAGE=2.4f - -D P_LORA_DIO_1=10 - -D P_LORA_NSS=46 - -D P_LORA_RESET=1 - -D P_LORA_BUSY=47 - -D P_LORA_SCLK=14 - -D P_LORA_MISO=21 - -D P_LORA_MOSI=13 - -D ENV_INCLUDE_AHTX0=0 - -D ENV_INCLUDE_BME280=0 - -D ENV_INCLUDE_BMP280=0 - -D ENV_INCLUDE_SHTC3=0 - -D ENV_INCLUDE_SHT4X=0 - -D ENV_INCLUDE_LPS22HB=0 - -D ENV_INCLUDE_INA3221=0 - -D ENV_INCLUDE_INA219=0 - -D ENV_INCLUDE_INA226=0 - -D ENV_INCLUDE_INA260=0 - -D ENV_INCLUDE_MLX90614=0 - -D ENV_INCLUDE_VL53L0X=0 - -D ENV_INCLUDE_BME680=0 - -D ENV_INCLUDE_BMP085=0 - -D HAS_BQ27220=1 - -D AUTO_SHUTDOWN_MILLIVOLTS=2800 - -D PIN_USER_BTN=0 - -D SDCARD_USE_SPI1 - -D ARDUINO_LOOP_STACK_SIZE=32768 - -D HAS_MECK_FONTS -build_src_filter = ${esp32_base.build_src_filter} - +<../variants/lilygo_t5s3_epaper_pro> -lib_deps = - ${esp32_base.lib_deps} - WebServer - DNSServer - Update - -; --------------------------------------------------------------------------- -; T5S3 standalone — touch UI (stub), verify display rendering -; Uses FastEPD for parallel e-ink, Adafruit GFX for drawing -; OTA enabled: WiFi AP activates only during user-initiated firmware updates. -; --------------------------------------------------------------------------- -[env:meck_t5s3_standalone] -extends = LilyGo_T5S3_EPaper_Pro -build_flags = - ${LilyGo_T5S3_EPaper_Pro.build_flags} - -I examples/companion_radio/ui-new - -D MAX_CONTACTS=2000 - -D MAX_GROUP_CHANNELS=20 - -D OFFLINE_QUEUE_SIZE=1 - -D CHANNEL_MSG_HISTORY_SIZE=800 - -D DISPLAY_CLASS=FastEPDDisplay - -D USE_EINK - -D MECK_CARDKB - -D MECK_OTA_UPDATE=1 - ; -D MECK_SERIF_FONT ; FreeSerif (Times New Roman-like) - ; ; Default (no flag): FreeSans (Arial-like) -build_src_filter = ${LilyGo_T5S3_EPaper_Pro.build_src_filter} - + - + - + - +<../examples/companion_radio/*.cpp> - +<../examples/companion_radio/ui-new/*.cpp> -lib_deps = - ${LilyGo_T5S3_EPaper_Pro.lib_deps} - densaugeo/base64 @ ~1.4.0 - adafruit/Adafruit GFX Library@^1.11.0 - https://github.com/mverch67/FastEPD/archive/0df1bff329b6fc782e062f611758880762340647.zip - https://github.com/lewisxhe/SensorLib/archive/refs/tags/v0.3.4.zip - -; --------------------------------------------------------------------------- -; T5S3 BLE companion — touch UI, BLE phone bridging -; Connect via MeshCore iOS/Android app over Bluetooth -; OTA enabled: WiFi AP activates only during user-initiated firmware updates. -; Flash: pio run -e meck_t5s3_ble -t upload -; --------------------------------------------------------------------------- -[env:meck_t5s3_ble] -extends = LilyGo_T5S3_EPaper_Pro -build_flags = - ${LilyGo_T5S3_EPaper_Pro.build_flags} - -I examples/companion_radio/ui-new - -D MAX_CONTACTS=2000 - -D MAX_GROUP_CHANNELS=20 - -D BLE_PIN_CODE=123456 - -D OFFLINE_QUEUE_SIZE=256 - -D DISPLAY_CLASS=FastEPDDisplay - -D USE_EINK - -D MECK_CARDKB - -D MECK_OTA_UPDATE=1 - ; -D MECK_SERIF_FONT -build_src_filter = ${LilyGo_T5S3_EPaper_Pro.build_src_filter} - + - + - + - +<../examples/companion_radio/*.cpp> - +<../examples/companion_radio/ui-new/*.cpp> -lib_deps = - ${LilyGo_T5S3_EPaper_Pro.lib_deps} - densaugeo/base64 @ ~1.4.0 - adafruit/Adafruit GFX Library@^1.11.0 - https://github.com/mverch67/FastEPD/archive/0df1bff329b6fc782e062f611758880762340647.zip - https://github.com/lewisxhe/SensorLib/archive/refs/tags/v0.3.4.zip - -; --------------------------------------------------------------------------- -; T5S3 WiFi companion — touch UI, WiFi phone bridging, web browser -; Connect via MeshCore web app or meshcore.js over local network (TCP:5000) -; MECK_WEB_READER: shares WiFi companion connection — no extra setup needed -; Flash: pio run -e meck_t5s3_wifi -t upload -; --------------------------------------------------------------------------- -[env:meck_t5s3_wifi] -extends = LilyGo_T5S3_EPaper_Pro -build_flags = - ${LilyGo_T5S3_EPaper_Pro.build_flags} - -I examples/companion_radio/ui-new - -D MAX_CONTACTS=2000 - -D MAX_GROUP_CHANNELS=20 - -D MECK_WIFI_COMPANION=1 - -D MECK_WEB_READER=1 - -D MECK_OTA_UPDATE=1 - -D TCP_PORT=5000 - -D OFFLINE_QUEUE_SIZE=256 - -D DISPLAY_CLASS=FastEPDDisplay - -D USE_EINK - -D MECK_CARDKB - ; -D MECK_SERIF_FONT -build_src_filter = ${LilyGo_T5S3_EPaper_Pro.build_src_filter} - + - + - + - +<../examples/companion_radio/*.cpp> - +<../examples/companion_radio/ui-new/*.cpp> -lib_deps = - ${LilyGo_T5S3_EPaper_Pro.lib_deps} - densaugeo/base64 @ ~1.4.0 - adafruit/Adafruit GFX Library@^1.11.0 - https://github.com/mverch67/FastEPD/archive/0df1bff329b6fc782e062f611758880762340647.zip - https://github.com/lewisxhe/SensorLib/archive/refs/tags/v0.3.4.zip - - ; --------------------------------------------------------------------------- -; T5S3 WiFi Remote Repeater — WiFi MQTT backhaul, remote management -; Same MQTT protocol as T-Deck Pro remote repeater builds. -; Uses FastEPD for parallel e-ink display. -; Flash: pio run -e meck_wifi_repeater_t5s3 -t upload -; --------------------------------------------------------------------------- -[env:meck_wifi_repeater_t5s3] -extends = LilyGo_T5S3_EPaper_Pro -build_src_filter = ${LilyGo_T5S3_EPaper_Pro.build_src_filter} - + - - - + - + - +<../examples/simple_repeater/*.cpp> -build_flags = - ${LilyGo_T5S3_EPaper_Pro.build_flags} - -I examples/companion_radio/ui-new - -D FIRMWARE_VERSION='"Meck T5S3 WiFi Rptr v0.1"' - -D FIRMWARE_BUILD_DATE='"5 Apr 2026"' - -D DISPLAY_CLASS=FastEPDDisplay - -D USE_EINK - -D MECK_WIFI_REMOTE - -D MECK_REMOTE_REPEATER=1 - -D DISABLE_WIFI_OTA=1 - -D MAX_NEIGHBOURS=50 - -D HAS_SDCARD=1 - -D RADIOLIB_EXCLUDE_CC1101=1 - -D RADIOLIB_EXCLUDE_NRF24=1 - -D RADIOLIB_EXCLUDE_RF69=1 - -D RADIOLIB_EXCLUDE_SX1231=1 - -D RADIOLIB_EXCLUDE_SX1233=1 - -D RADIOLIB_EXCLUDE_SI443X=1 - -D RADIOLIB_EXCLUDE_RFM2X=1 - -D RADIOLIB_EXCLUDE_SX127X=1 - -D RADIOLIB_EXCLUDE_SX1272=1 - -D RADIOLIB_EXCLUDE_SX1278=1 - -D RADIOLIB_EXCLUDE_STM32WLX=1 - -D RADIOLIB_EXCLUDE_LR11X0=1 - -D RADIOLIB_EXCLUDE_LLCC68=1 - -D RADIOLIB_EXCLUDE_SX128X=1 - -D RADIOLIB_EXCLUDE_AFSK=1 - -D RADIOLIB_EXCLUDE_AX25=1 - -D RADIOLIB_EXCLUDE_HELLSCHREIBER=1 - -D RADIOLIB_EXCLUDE_MORSE=1 - -D RADIOLIB_EXCLUDE_RTTY=1 - -D RADIOLIB_EXCLUDE_SSTV=1 - -D RADIOLIB_EXCLUDE_APRS=1 - -D RADIOLIB_EXCLUDE_LORAWAN=1 - -D RADIOLIB_EXCLUDE_PAGER=1 - -D RADIOLIB_EXCLUDE_FSK4=1 - -D RADIOLIB_EXCLUDE_BELL=1 -lib_deps = - ${LilyGo_T5S3_EPaper_Pro.lib_deps} - knolleary/PubSubClient@^2.8 - adafruit/Adafruit GFX Library@^1.11.0 - https://github.com/mverch67/FastEPD/archive/0df1bff329b6fc782e062f611758880762340647.zip - https://github.com/lewisxhe/SensorLib/archive/refs/tags/v0.3.4.zip -lib_ignore = - ESP32 BLE Arduino - AsyncTCP - RPAsyncTCP - ESPAsyncWebServer - AsyncElegantOTA - ESP32-audioI2S - esp32_codec2_arduino \ No newline at end of file diff --git a/variants/lilygo_t5s3_epaper_pro/target.cpp b/variants/lilygo_t5s3_epaper_pro/target.cpp deleted file mode 100644 index 10f4f6b2..00000000 --- a/variants/lilygo_t5s3_epaper_pro/target.cpp +++ /dev/null @@ -1,91 +0,0 @@ -#include -#include "variant.h" -#include "target.h" - -T5S3Board board; - -// LoRa radio on separate SPI bus -// T5S3 V2 SPI pins: SCLK=14, MISO=21, MOSI=13 (shared with SD card) -#if defined(P_LORA_SCLK) - static SPIClass loraSpi(HSPI); - RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BUSY, loraSpi); -#else - RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BUSY); -#endif - -WRAPPER_CLASS radio_driver(radio, board); - -PCF85063Clock rtc_clock; - -// No GPS on H752-B -#if HAS_GPS - GPSStreamCounter gpsStream(Serial2); - MicroNMEALocationProvider gps(gpsStream, &rtc_clock); - EnvironmentSensorManager sensors(gps); -#else - SensorManager sensors; -#endif - -// Phase 2: Display -#ifdef DISPLAY_CLASS - DISPLAY_CLASS display; - MomentaryButton user_btn(PIN_USER_BTN, 1000, true); -#endif - -bool radio_init() { - MESH_DEBUG_PRINTLN("radio_init() - starting"); - - // NOTE: board.begin() is called by main.cpp setup() before radio_init() - // I2C is already initialized there with correct pins - - // PCF85063 hardware RTC — reads correct registers (0x04–0x0A) - // Unlike AutoDiscoverRTCClock which uses RTClib's PCF8563 driver (wrong registers) - rtc_clock.begin(Wire); - MESH_DEBUG_PRINTLN("radio_init() - PCF85063 RTC started"); - -#if defined(P_LORA_SCLK) - MESH_DEBUG_PRINTLN("radio_init() - initializing LoRa SPI (SCLK=%d, MISO=%d, MOSI=%d, NSS=%d)...", - P_LORA_SCLK, P_LORA_MISO, P_LORA_MOSI, P_LORA_NSS); - loraSpi.begin(P_LORA_SCLK, P_LORA_MISO, P_LORA_MOSI, P_LORA_NSS); - MESH_DEBUG_PRINTLN("radio_init() - SPI initialized, calling radio.std_init()..."); - bool result = radio.std_init(&loraSpi); - if (result) { - radio.setPreambleLength(32); - MESH_DEBUG_PRINTLN("radio_init() - preamble set to 32 symbols"); - } - MESH_DEBUG_PRINTLN("radio_init() - radio.std_init() returned: %s", result ? "SUCCESS" : "FAILED"); - return result; -#else - MESH_DEBUG_PRINTLN("radio_init() - calling radio.std_init() without custom SPI..."); - bool result = radio.std_init(); - if (result) { - radio.setPreambleLength(32); - MESH_DEBUG_PRINTLN("radio_init() - preamble set to 32 symbols"); - } - return result; -#endif -} - -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); -} - -void radio_set_tx_power(uint8_t dbm) { - radio.setOutputPower(dbm); -} - -mesh::LocalIdentity radio_new_identity() { - RadioNoiseListener rng(radio); - return mesh::LocalIdentity(&rng); -} - -void radio_reset_agc() { - radio.setRxBoostedGainMode(true); -} \ No newline at end of file diff --git a/variants/lilygo_t5s3_epaper_pro/target.h b/variants/lilygo_t5s3_epaper_pro/target.h deleted file mode 100644 index a6b1f8ba..00000000 --- a/variants/lilygo_t5s3_epaper_pro/target.h +++ /dev/null @@ -1,50 +0,0 @@ -#pragma once - -// Include variant.h first to ensure all board-specific defines are available -#include "variant.h" - -#define RADIOLIB_STATIC_ONLY 1 -#include -#include -#include -#include -#include "PCF85063Clock.h" - -// Display support — FastEPDDisplay for parallel e-ink (not GxEPD2) -#ifdef DISPLAY_CLASS - #include - #include -#endif - -// No GPS on H752-B (non-GPS variant) -// If porting to H752-01/H752-02 with GPS, enable this: -#if HAS_GPS - #include "helpers/sensors/EnvironmentSensorManager.h" - #include "helpers/sensors/MicroNMEALocationProvider.h" - #include "GPSStreamCounter.h" -#else - #include -#endif - -extern T5S3Board board; -extern WRAPPER_CLASS radio_driver; -extern PCF85063Clock rtc_clock; - -#if HAS_GPS - extern GPSStreamCounter gpsStream; - extern EnvironmentSensorManager sensors; -#else - extern SensorManager sensors; -#endif - -#ifdef DISPLAY_CLASS - extern DISPLAY_CLASS display; - extern MomentaryButton user_btn; -#endif - -bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(uint8_t dbm); -mesh::LocalIdentity radio_new_identity(); -void radio_reset_agc(); \ No newline at end of file diff --git a/variants/lilygo_t5s3_epaper_pro/variant.h b/variants/lilygo_t5s3_epaper_pro/variant.h deleted file mode 100644 index 68743686..00000000 --- a/variants/lilygo_t5s3_epaper_pro/variant.h +++ /dev/null @@ -1,189 +0,0 @@ -#pragma once - -// ============================================================================= -// LilyGo T5 S3 E-Paper Pro V2 (H752-01/H752-B) - Pin Definitions for Meck -// -// 4.7" parallel e-ink (ED047TC1, 960x540, 16-grey) — NO SPI display -// GT911 capacitive touch (no physical keyboard) -// SX1262 LoRa, BQ27220+BQ25896 battery, PCF85063 RTC, PCA9535 IO expander -// ============================================================================= - -// Board identifier -#define LilyGo_T5S3_EPaper_Pro 1 -#define T5_S3_EPAPER_PRO_V2 1 - -// ----------------------------------------------------------------------------- -// I2C Bus — shared by GT911, PCF85063, PCA9535, BQ25896, BQ27220, TPS65185 -// ----------------------------------------------------------------------------- -#define I2C_SDA 39 -#define I2C_SCL 40 - -// Aliases for ESP32Board base class compatibility -#define PIN_BOARD_SDA I2C_SDA -#define PIN_BOARD_SCL I2C_SCL - -// I2C Device Addresses -#define I2C_ADDR_GT911 0x5D // Touch controller -#define I2C_ADDR_PCF85063 0x51 // RTC -#define I2C_ADDR_PCA9535 0x20 // IO expander (e-ink power control) -#define I2C_ADDR_BQ27220 0x55 // Fuel gauge -#define I2C_ADDR_BQ25896 0x6B // Battery charger -#define I2C_ADDR_TPS65185 0x68 // E-ink power driver -#define CARDKB_I2C_ADDR 0x5F // M5Stack CardKB (external, via QWIIC) - -// ----------------------------------------------------------------------------- -// SPI Bus — shared by LoRa and SD card -// Different from T-Deck Pro! (T-Deck: 33/47/36, T5S3: 13/21/14) -// ----------------------------------------------------------------------------- -#define BOARD_SPI_SCLK 14 -#define BOARD_SPI_MISO 21 -#define BOARD_SPI_MOSI 13 - -// ----------------------------------------------------------------------------- -// LoRa Radio (SX1262) -// SPI bus shared with SD card, different chip selects -// ----------------------------------------------------------------------------- -#define P_LORA_NSS 46 -#define P_LORA_DIO_1 10 // IRQ -#define P_LORA_RESET 1 -#define P_LORA_BUSY 47 -#define P_LORA_SCLK BOARD_SPI_SCLK -#define P_LORA_MISO BOARD_SPI_MISO -#define P_LORA_MOSI BOARD_SPI_MOSI -// Note: No P_LORA_EN on T5S3 — LoRa is always powered - -// ----------------------------------------------------------------------------- -// E-Ink Display (ED047TC1 — 8-bit parallel, NOT SPI) -// Driven by epdiy/FastEPD library via TPS65185 + PCA9535 -// GxEPD2 is NOT used on this board. -// ----------------------------------------------------------------------------- -// Parallel data bus (directly wired to ESP32-S3 GPIOs) -#define EP_D0 5 -#define EP_D1 6 -#define EP_D2 7 -#define EP_D3 15 -#define EP_D4 16 -#define EP_D5 17 -#define EP_D6 18 -#define EP_D7 8 - -// Control signals -#define EP_CKV 48 // Clock vertical -#define EP_STH 41 // Start horizontal -#define EP_LEH 42 // Latch enable horizontal -#define EP_STV 45 // Start vertical -#define EP_CKH 4 // Clock horizontal (edge) - -// E-ink power is managed by TPS65185 through PCA9535 IO expander: -// PCA9535 IO10 -> EP_OE (output enable, source driver) -// PCA9535 IO11 -> EP_MODE (output mode, gate driver) -// PCA9535 IO13 -> TPS_PWRUP -// PCA9535 IO14 -> VCOM_CTRL -// PCA9535 IO15 -> TPS_WAKEUP -// PCA9535 IO16 -> TPS_PWR_GOOD (input) -// PCA9535 IO17 -> TPS_INT (input) - -// Display dimensions — native resolution of ED047TC1 -#define EPD_WIDTH 960 -#define EPD_HEIGHT 540 - -// Backlight (warm-tone front-light — functional on V2!) -#define BOARD_BL_EN 11 - -// We do NOT define DISPLAY_CLASS or EINK_DISPLAY_MODEL here. -// The parallel display uses FastEPD, not GxEPD2. -// DISPLAY_CLASS will be defined in platformio.ini as FastEPDDisplay -// for builds that include display support. - -// ----------------------------------------------------------------------------- -// Touch Controller (GT911) -// No physical keyboard on this board — touch-only input -// ----------------------------------------------------------------------------- -#define HAS_TOUCHSCREEN 1 -#define GT911_PIN_INT 3 -#define GT911_PIN_RST 9 -#define GT911_PIN_SDA I2C_SDA -#define GT911_PIN_SCL I2C_SCL - -// No keyboard -// #define HAS_PHYSICAL_KEYBOARD 0 - -// Compatibility: main.cpp references CST328 touch (T-Deck Pro). -// Map to GT911 equivalents so shared code compiles. -// The actual touch init for T5S3 will use GT911 in Phase 2. -#define CST328_PIN_INT GT911_PIN_INT -#define CST328_PIN_RST GT911_PIN_RST - -// ----------------------------------------------------------------------------- -// SD Card — shares SPI bus with LoRa -// ----------------------------------------------------------------------------- -#define HAS_SDCARD -#define SDCARD_USE_SPI1 -#define SDCARD_CS 12 -#define SPI_CS SDCARD_CS - -// ----------------------------------------------------------------------------- -// GPS — Not present on H752-B (non-GPS variant) -// If a GPS model is used (H752-01/H752-02), define HAS_GPS=1 -// and uncomment the GPS pins below. -// ----------------------------------------------------------------------------- -// #define HAS_GPS 1 -// #define GPS_BAUDRATE 38400 -// #define GPS_RX_PIN 44 -// #define GPS_TX_PIN 43 - -// Fallback for code that references GPS_BAUDRATE without HAS_GPS guard -// (e.g. MyMesh.cpp CLI rescue command) -#ifndef GPS_BAUDRATE -#define GPS_BAUDRATE 9600 -#endif - -// ----------------------------------------------------------------------------- -// RTC — PCF85063 (proper hardware RTC, battery-backed!) -// This is a significant upgrade over T-Deck Pro which has no RTC. -// ----------------------------------------------------------------------------- -#define HAS_PCF85063_RTC 1 -#define PCF85063_I2C_ADDR 0x51 -#define PCF85063_INT_PIN 2 - -// ----------------------------------------------------------------------------- -// PCA9535 IO Expander -// Controls e-ink power sequencing and has a user button -// ----------------------------------------------------------------------------- -#define HAS_PCA9535 1 -#define PCA9535_I2C_ADDR 0x20 -#define PCA9535_INT_PIN 38 - -// PCA9535 pin assignments (directly from LilyGo schematic): -// Port 0 (IO0x): IO00-IO07 — mostly unused/reserved -// Port 1 (IO1x): -#define PCA9535_EP_OE 0 // IO10 — EP output enable (source driver) -#define PCA9535_EP_MODE 1 // IO11 — EP mode (gate driver) -#define PCA9535_BUTTON 2 // IO12 — User button via IO expander -#define PCA9535_TPS_PWRUP 3 // IO13 — TPS65185 power up -#define PCA9535_VCOM_CTRL 4 // IO14 — VCOM control -#define PCA9535_TPS_WAKEUP 5 // IO15 — TPS65185 wakeup -#define PCA9535_TPS_PWRGOOD 6 // IO16 — TPS65185 power good (input) -#define PCA9535_TPS_INT 7 // IO17 — TPS65185 interrupt (input) - -// ----------------------------------------------------------------------------- -// Buttons & Controls -// ----------------------------------------------------------------------------- -#define BUTTON_PIN 0 // Boot button (GPIO0) -#define PIN_USER_BTN 0 - -// ----------------------------------------------------------------------------- -// Power Management -// ----------------------------------------------------------------------------- -#define HAS_BQ27220 1 -#define BQ27220_I2C_ADDR 0x55 - -// T5S3 E-Paper Pro battery (1500 mAh — larger than T-Deck Pro's 1400 mAh) -#ifndef BQ27220_DESIGN_CAPACITY_MAH -#define BQ27220_DESIGN_CAPACITY_MAH 1500 -#endif - -#define AUTO_SHUTDOWN_MILLIVOLTS 2800 - -// No explicit peripheral power pin on T5S3 (unlike T-Deck Pro's PIN_PERF_POWERON) -// Peripherals are always powered when the board is on. \ No newline at end of file diff --git a/variants/lilygo_tdeck_max/platformio.ini b/variants/lilygo_tdeck_max/platformio.ini index b7b2a44c..2fe88f16 100644 --- a/variants/lilygo_tdeck_max/platformio.ini +++ b/variants/lilygo_tdeck_max/platformio.ini @@ -337,7 +337,7 @@ lib_deps = ; serial clock sync command. ; ; Known risk -- the same 80 -> 40 transition broke I2C on the T-Deck Pro -; and T5S3 in commit f78824cd (reverted in 06a06453): APB halves when the +; in commit f78824cd (reverted in 06a06453): APB halves when the ; CPU runs from the crystal, peripheral timing configured at boot goes ; stale, and a wedged slave can hold SDA low through a soft reset. The ; watch runs this shape at 40 (and 20) MHz without trouble, so it is an